将开发系统的思路、优化和感悟系统地整理下来,方便以后查阅
一、背包系统
1.功能概述
1) 玩家背包物品为无堆叠(就一堆),在查找玩家指定物品的数量时,直接用联合主键{PlayerId, ItemId}进行read,所以player_item表的主键为{PlayerId, ItemId}
2)玩家装备为堆叠,一个装备一堆,如果用玩家id和物品id做主键,会出现重复冲突,所以需要一个自增长id序号,作为装备的唯一标识,所以player_equipment表的主键为{id}
3)需要一个item表,记录所有物品如装备、背包物品、虚拟资源等,还需要一个同类型id索引到其他表,如装备物品需要一个id索引到equipment表的id,宝箱奖励box需要索引到awards的id
4)需要一个item_type记录物品的类型,item表的item_type字段索引到itemtype表的id
- 需要一个item_change_type记录所有物品变动(经验除外)变动太频繁
- 总的表有:
- item表
- item_type表
- item_change_type表
- player_item表
- player_equipment表
- player_data表
- equipment表
- box_awards表
- drop_awards表
- player_item_log表
- player_silver_log表
- player_gold_log表
- player_prestige_log表
- player_contribution_log表
- player_potential_log表
4) give_item_logic资源整合,参数只需[{item_id1, num1}, {item_id2, num2}]
- give_item_logic资源整合,只针对给玩家物品,包括装备、背包物品、虚拟资源
- give_item_logic资源整合,非使用物品如固定宝箱、
- give_item_logic内根据物品类型,然后走如下接口,只需要如下几种类型判断(增加装备、虚拟资源、背包物品)
- increase_equipment
- increase_silver
- increase_gold
- increase_prestige
- increase_contribution
- increase_potential
- increase_exp
- increase_item
5)增加的方面,另外需要使用固定宝箱和奖池的接口 ,不在give_item_logic内
- use_box_awards
- use_drop_awards
6) increase编写逻辑需要如下三点
- 记录日志
- 通知客户端物品变动
- 返回值
- increase_equipment,返回最新值{player_equipment_id, item_id,num}
- increase_sliver等资源,返回最新值{0, item_id,num}
- increase_item,返回最新值{0,item_id,num}
- use_box_awards,返回宝箱内物品{0,item_id,num}…],方便使用固定宝箱时打开的效果
- use_drop_awards,返回奖池内物品[{0,item_id,num}…],方便使用奖池宝箱打开的效果
7) reduce_item_logic资源整合,参数需[0, {item_id1, num1}, {0, item_id2, num2}]
- reduce_item_logic资源整合,针对给玩家物品,包括装备、背包物品、虚拟资源,所有
- reduce_item_logic资源整合,扣除物品,宝箱也是物品,走decrease_item
- reduce_item_logic内根据物品类型,然后走如下接口,只需要如下几种类型判断(增加装备、虚拟资源、背包物品)
- decrease_equipment
- decrease_silver
- decrease_gold
- decrease_prestige
- decrease_contribution
- decrease_potential
- decrease_exp
- decrease_item
8)decrease编写逻辑需要如下三点
- 记录日志
- 通知客户端物品变动
- 返回值
- decrease_equipment,返回最新值{player_equipment_id, item_id,num}
- decrease_sliver等资源,返回最新值{0, item_id,num}
- decrease_item,返回最新值{0,item_id,num}
9)宝箱使用逻辑:开宝箱里面还有宝箱,是increase_item宝箱这个物品,玩家需再次使用
2.获得玩家所有物品(背包、装备)
1) 协议参数
class item
{
id : int //物品是装备的话-player_equipment表id,不是装备类-0
item_id : int //物品id
num : ushort //数量
}
get_item
{
in
{
}
out
{
code : ushort //返回码
item_list : list<item> //物品列表
}
}
2)数据结构
DROP TABLE IF EXISTS `player_item`;
CREATE TABLE `player_item` (
`player_id` BIGINT NOT NULL DEFAULT 0 COMMENT '玩家id',
`item_id` INTEGER NOT NULL DEFAULT 0 COMMENT '物品id',
`number` INTEGER NOT NULL DEFAULT 0 COMMENT '数量',
`end_time` INTEGER NOT NULL DEFAULT 0 COMMENT '结束时间',
PRIMARY KEY(`player_id`, `item_id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '玩家物品表';
3)业务逻辑
- 遍历player_item所有player_id的记录{item_id,Num}
- 遍历player_equipment所有{id,item_id,Num}
- 二者列表相加
3.获得玩家所有资源(金币等)
1) 协议参数
class resource
{
item_id : int //物品id
num : ushort //最新数量
}
get_resource
{
in
{
}
out
{
code : ushort //返回码
resource_list : list<resource> //资源列表
}
}
2)数据结构
DROP TABLE IF EXISTS `player_data`;
CREATE TABLE `player_data` (
`player_id` BIGINT NOT NULL DEFAULT 0 COMMENT '玩家id',
`level` INTEGER NOT NULL DEFAULT 0 COMMENT '玩家当前等级',
`exp` INTEGER NOT NULL DEFAULT 0 COMMENT '当前经验值',
`silver` INTEGER NOT NULL DEFAULT 0 COMMENT '银两',
`gold` INTEGER NOT NULL DEFAULT 0 COMMENT '黄金',
`prestige` INTEGER NOT NULL DEFAULT 0 COMMENT '声望',
`contribution` INTEGER NOT NULL DEFAULT 0 COMMENT '贡献',
`potential` INTEGER NOT NULL DEFAULT 0 COMMENT '潜能',
PRIMARY KEY (`player_id`)
)ENGINE = InnoDB DEFAULT CHARSET=utf8 COMMENT '玩家数据表';
3)业务逻辑
- read获得player_data表的指定玩家记录
- 返回相关虚拟资源数据
4.使用物品(背包物品)
1)协议参数
class item
{
id : int //物品是装备的话-player_equipment表id,不是装备类-0
item_id : int //物品id
num : ushort //数量
}
use_item
{
in
{
use_item_id : int //物品id
num : int //数量
choose_item_id : int //选择的物品id(当使用的物品为可选宝箱时,所选择的物品id),其他情况为0
}
out
{
code : ushort //返回码
item_list : list<item> //使用的物品返回的物品列表
}
}
2)数据结构
3)业务逻辑
- 可选宝箱,使用可选宝箱,选择宝箱中其中一个物品进行增加
- 传入参数应有个可选id,不为0,标志为可选宝箱所选择的要增加的物品id
- 判断类型,可使用的物品有经验丹药等丹药、固定宝箱、奖池宝箱、武功秘籍等
- 丹药
- decrease扣除丹药物品
- give_item_logic给玩家增加相关物品如经验等
- 返回丹药后获得的物品/经验{0, item_id, num} - 固定宝箱
- decrease扣除宝箱这个物品
- use_box_awards使用宝箱,增加给玩家宝箱内的物品
- 返回宝箱内的所有物品 - 奖池宝箱
- decrease扣除宝箱这个物品
- use_box_awards使用宝箱,增加给玩家宝箱内的物品
- 返回宝箱内的所有物品 - 可选宝箱
- 所选择的的物品是否在该宝箱规则中
- decrease扣除宝箱这个物品
- give_item_logic给玩家增加所选择的的物品 - 秘籍
- decrease扣除秘籍这个物品
- 激活该技能player_skill表
- 返回{0, skillid, Num}这个具体的跟前端沟通 - use_box_awards逻辑
- 获得固定宝箱内的物品列表(item_id非0的)
- give_item_logic给物品
- 返回宝箱内的物品,是啥就返回啥就可以了,因为开出来是什么就是什么,是经验丹或者宝箱都以物品的方式进入背包 - use_drop_awards逻辑
- 获取奖池宝箱内的物品列表
- 获取奖池的抽取次数
- 随机奖池:奖池内的奖励随机一个,必有一个,数量最大跟最小中间随机一个
- 概率奖池:奖池内的奖励每个都取一次可能性,可能都有也可能全都没有,数量最大跟最小中间随机一个