道具系統是游戲的核心系統之一,常見的業務功能包括 “角色背包”, “道具商店”, “怪物掉落” 等,都依賴道具系統。
在實現這些功能之前,首先要解決的問題就是要定義我們的游戲世界中,到底會有哪些道具, 以及這些道具是如何分類的?
這就是我們這期要做的“道具字典“。首先必須要有一個“字典”來說明這個道具是什么,接下來才能有“背包”系統,來表示角色的背包里有些什么道具,數量有多少。
一、道具分類
1.概念設計
我們先參照魔獸世界的道具分類,整理出分類大致如下(見腦圖)。
圖1.道具分類圖
圖2.裝備分類圖
從圖中可以看出,整個分類是一個樹形結構。
“道具“大類下,目前是一個二層的樹形結構,里面包括“雕文”,“坐騎”,“食物”等,這些分類和現有系統聯系不緊密,需要額外開發使用這些道具的玩法系統,可以暫時先不過多考慮。
“裝備”大類下,是一個三層的樹形結構。裝備系統和戰斗結算,人物戰斗屬性關系緊密,我們接下來將前主要設計裝備字典。
2.數據庫設計
前幾章,實現了系統的數據字典,但那個字典主要適用於枚舉選項,是一個平面型的數據結構,對裝備類型就不適用了。
比如,在分類選擇時,想要選擇 “武器” -> “單手武器” -> "單手劍",這樣一級一級往下選擇,就難以實現了。
因此,需要額外設計一張能夠處理樹形結構的“道具類型表”。在數據字典表的基礎上,加兩個字段 level(當前層級), rootCode(根節點編碼)即可。
建表語句如下:

CREATE TABLE `item_type` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵id', `code` varchar(20) NOT NULL DEFAULT '' COMMENT '編碼', `parent_code` varchar(20) NOT NULL DEFAULT '' COMMENT '父編碼', `root_code` varchar(20) NOT NULL DEFAULT '' COMMENT '根節點編碼', `level` int NOT NULL DEFAULT '0' COMMENT '層級', `value` varchar(20) NOT NULL DEFAULT '' COMMENT '值', `remark` varchar(100) NOT NULL DEFAULT '' COMMENT '備注', `create_user` varchar(20) NOT NULL DEFAULT '' COMMENT '創建人', `update_user` varchar(20) NOT NULL DEFAULT '' COMMENT '修改人', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間', `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否刪除 0-否 1-是', `version` int NOT NULL DEFAULT '0' COMMENT '版本號', PRIMARY KEY (`id`), UNIQUE KEY `uidx_code` (`code`), KEY `idx_parent_code` (`parent_code`) ) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='道具類型字典表';
3.內容管理
表結構有了,參照前面的章節,只要建好對應的實體類,在RMS系統中,添加對應的菜單,實現相應的邏輯即可。
注意啟動時,把道具分類也加載到緩存中(在StartUpListener類中)。
(可參照源碼,就不展開了。具體類型編碼在源代碼里的策划文檔中,也可自行定義)
二、道具字典
有了分類,接下來就可以定義道具字典了(即定義游戲中所有可能出現的道具)。
1.道具編碼
為了區分道具的類型,我們有必要制定一套編碼規范,來唯一標識一個道具。格式如下:
道具類型標識 = 類型編碼(5位) + 序列號(5位),比如:單手劍 = 61101, 鈍劍是此類型中的第一個道具,編碼為6110100001。
背包道具ID = 道具類型標識(10位)+ 時間戳(12位)+ 序列號(4位),比如:打怪掉落的鈍劍,在玩家背包里的道具ID為 61101000012103151200360001。
即,系統中同類型的裝備,最多可以定義10萬種。同一種裝備,1秒鍾最多可以產生1萬個。
這里類型編碼是在策划文檔中定義好,序列號是在Redis中做incr操作獲取,具體可參見源碼。
2.數據表結構設計
在設計數據表的時候,考慮到不管是普通道具,還是裝備道具,都有一些通用的屬性,比如:名稱、描述、品質、是否可交易、是否唯一、是否可丟棄等等。
對此,可以設計一張道具基礎表,item_common,來記錄所有道具的基本信息。
而裝備表特有的屬性,比如:傷害值,護甲值,生命值,力量,敏捷,等等,則存到裝備表里 item_equipmen。
等后面設計普通道具表時,比如烹飪,卷軸,坐騎等,則可以擴展到 item_normal 等表中。
這樣設計,可以防止單表的字段過多。

CREATE TABLE `item_common` ( `id` varchar(20) NOT NULL COMMENT '唯一編碼(類型編碼+序號編碼)', `type_code` varchar(10) NOT NULL DEFAULT '' COMMENT '類型編碼', `name` varchar(20) NOT NULL DEFAULT '' COMMENT '物品名稱', `description` varchar(500) NOT NULL DEFAULT '' COMMENT '物品描述', `quality` varchar(10) NOT NULL DEFAULT '' COMMENT '物品品質', `item_level` int NOT NULL DEFAULT '1' COMMENT '物品等級', `required_level` int NOT NULL DEFAULT '1' COMMENT '等級要求', `required_job` varchar(10) NOT NULL DEFAULT '' COMMENT '職業要求', `stack_size` int NOT NULL DEFAULT '1' COMMENT '堆疊數量', `price_buy` int NOT NULL DEFAULT '0' COMMENT '購買價格', `price_sell` int NOT NULL DEFAULT '0' COMMENT '出售價格', `can_trade` tinyint NOT NULL DEFAULT '1' COMMENT '是否可交易 0:否 1:是', `can_drop` tinyint NOT NULL DEFAULT '1' COMMENT '是否可丟棄 0:否 1:是', `is_unique` tinyint NOT NULL DEFAULT '0' COMMENT '是否唯一 0:否 1:是', `extend_prop` varchar(8000) NOT NULL DEFAULT '' COMMENT '擴展屬性', `create_user` varchar(20) NOT NULL DEFAULT '' COMMENT '創建人', `update_user` varchar(20) NOT NULL DEFAULT '' COMMENT '修改人', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間', `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否刪除 0-否 1-是', `version` int NOT NULL DEFAULT '0' COMMENT '版本號', PRIMARY KEY (`id`), KEY `idx_item_type_code` (`type_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='道具字典表';

CREATE TABLE `item_equipment` ( `id` varchar(20) NOT NULL COMMENT '唯一編碼(類型編碼+序號編碼)', `type_code` varchar(10) NOT NULL DEFAULT '' COMMENT '類型編碼', `name` varchar(20) NOT NULL DEFAULT '' COMMENT '裝備名稱', `damage_min` int NOT NULL DEFAULT '0' COMMENT '最小傷害', `damage_max` int NOT NULL DEFAULT '0' COMMENT '最大傷害', `armour` int NOT NULL DEFAULT '0' COMMENT '護甲值', `hp` int NOT NULL DEFAULT '0' COMMENT '生命值', `strength` int NOT NULL DEFAULT '0' COMMENT '力量', `agility` int NOT NULL DEFAULT '0' COMMENT '敏捷', `intellect` int NOT NULL DEFAULT '0' COMMENT '智力', `stamina` int NOT NULL DEFAULT '0' COMMENT '耐力', `extend_attr` varchar(8000) NOT NULL DEFAULT '' COMMENT '擴展屬性', `create_user` varchar(20) NOT NULL DEFAULT '' COMMENT '創建人', `update_user` varchar(20) NOT NULL DEFAULT '' COMMENT '修改人', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間', `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否刪除 0-否 1-是', `version` int NOT NULL DEFAULT '0' COMMENT '版本號', PRIMARY KEY (`id`), KEY `idx_equipment_type_code` (`type_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='裝備字典表';
具體到代碼中建模的類圖,大致如下:
三、效果演示
四、小結
本章主要實現的道具分類和道具字典的基本配置。
道具種類繁多,需要策划一個個配,這里我只配了十幾個單手劍的屬性,用作演示。
預計下一章會在游戲模塊簡單實現下角色背包