随记(12)背包系统、技能系统

本文详细介绍了游戏中的背包系统和技能系统的功能设计与实现。背包系统涵盖了物品获取、资源管理、装备操作等多个方面,而技能系统则涉及技能获取、修炼与装备。文中对每个功能进行了详细的业务逻辑解释,并提到了注意事项,如数据结构设计和接口验证,以防止外挂和优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背包系统

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逻辑
    - 获取奖池宝箱内的物品列表
    - 获取奖池的抽取次数
    - 随机奖池:奖池内的奖励随机一个,必有一个,数量最大跟最小中间随机一个
    在这里插入图片描述
    - 概率奖池:奖池内的奖励每个都取一次可能性,可能都有也可能全都没有,数量最大跟最小中间随机一个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值