回合制战⽃服务器系统架构,【系统设计】第⼀次的RPG战⽃
系统设计思路总结
最近有机会开发⼀项回合制的战⽃体系,记录⼀下⾃⼰在制作过程中的感悟与理解,⽅便后续进⾏回顾和反思,同时也整理⼀下现有战⽃思路
1.对于回合制的理解
传统的回合制游戏如仙剑、梦幻西游、⼋⽅旅⼈等。这些游戏有⼀些特定的特点:
1.确定的⾓⾊⾏动顺序与回合时序
2.每个⾓⾊每个回合只有⼀次⾏动机会,但可能有多次技能释放机会
3.技能或者事件可以触发其他的技能或事件
4.⽆法确定的事件触发时机
2.功能制作的⽅向与⽬标
巩俐的个人资料
我们对战⽃的期望⽐较偏向⼋⽅旅⼈,但是因为我从⼩是玩仙剑和梦幻西游的,同时之前受炉⽯和杀戮尖塔影响较深,所以我在功能制作⽅向上会更多参考到梦幻西游、炉⽯传说和杀戮尖塔的相关功能。
3.战⽃逻辑框架
为了保证整个战⽃系统的灵活性和配置各种效果相关的功能复⽤性,我们决定参考Dota2中的战⽃技能模块进⾏设计与制作。也就是采⽤Ability-Modifier-Action的模式进⾏战⽃的设计。
清明节表达对已故亲人的思念Ability:
包含固定的执⾏类节点:如Ability的添加节点与移除节点、释放技能(Ability触发节点)等陈好刘海峰结婚照
节点内包含⼀些Action
维护⼀张Modifier列表,也就是Ability中会包含所有这个Ability中⽤到的Modifier
Modifier:
具有⼀些触发性质的节点:如OnAttacked,OnAbilityExcuted
节点内包含⼀些Action
Action:
具体的执⾏事件,如播放特效⾳效,添加⼀个Modifier等
对于这套系统我的理解是:Ability其实就是⼀个⼤的技能容器,其中这个技能内有很多的触发器(Modifier),也有很多⾃⼰的⾏为(固定的执⾏节点逻辑与其中的Action)
⼀个具体的例⼦
但这种设计思路是针对于即时性的moba游戏,回合制可以对这套系统进⾏⼀定程度上的简化来降低策划的理解成本,毕竟这种技能如果要策划⾃⼰配⼀个技能出来,学习成本还是偏⾼的⽽且程序也⽐较难debug。
按照我的理解进⾏的⼀套技能系统的设计:
1.Skill
1.包含⼏种类型的节点:如技能被附加到⾓⾊时,技能释放时,技能移除时等
郭蔼明资料
2.技能在对应节点所要执⾏的事件(Action)列表河智苑主演的电视剧
3.功能类似于Ability,主要作⽤是作为效果的容器以及⾃⾝存在⼀些固定的执⾏节点
1.有很多触发节点可以配置:如OnBuffAdded,OnBuffRemoved之类的⾃⾝⾏为节点,也可以使⽤OnRoundStart,OnAttacked等全局或⾓⾊对应的节点
2.触发前的条件判断(Condition)、触发后执⾏的具体事件(Action)、触发后执⾏⼀个新的技能(Skill)
3.Buff存在时导致的属性值改变、玩家状态的改变(如眩晕,睡眠等)
4.对象的存储:Buff的释放者、拥有者等
5.Buff的⽣效机制:回合⽣效(⼀定回合后移除Buff)、次数⽣效(Buff被触发⼀定次数后移除Buff)等。
6.Buff之间的关系:互斥关系、叠加关系(Buff层数叠加)、替换或延长Buff持续时间等
2.5.Condition
当Buff在对应的触发节点触发后,还可以通过⼀个Condition对Buff进⾏再⼀次校验,借此决定这个Buff到底是不是会被触发
3.Action
荷塘月赏析具体的事件执⾏者,包含很多种可以执⾏的事件类型,如给某个⾓⾊添加或移除⼀个Buff,执⾏⼀次伤害,播放⼀个特效⾳效等等
可以看出来这套其实基本就是上⾯的那套逻辑改了改名,然后根据我的理解进⾏了⼀些修改,⽐如删减了很多跟时间延迟相关的功能(我觉得回合制需要对时间进⾏限制,更多的是限制回合数等),新增了⼀些对Buff的判断逻辑。这样的设计我认为Skill像是⼀个外壳,Buff像是⼀个中转站,Action是具体⾏为的执⾏。
也就是说,其实Skill是⼀段逻辑的⼊⼝,执⾏⾥⾯的Action时,Action会添加⼀些Buff,⽽Buff作为中转站⼜可以触发新的Action和Skill。
从此就可以实现⼀个套娃的逻辑:Skill A执⾏Action A添加了Buff A触发了Skill B执⾏Action B 添加Buff B触发Skill A(死循环了!!)
4.战⽃流程设计
1.对整个战⽃过程进⾏插⼊逻辑点
把整场战⽃拆分成很多个可以执⾏Buff或者做具体逻辑的节点。如对于⼀个简单的回合制游戏来说就可以拆分为:
战⽃开始的节点(梦幻西游⼿游内狮驼岭开场会变⾝)
回合开始前结算Buff剩余回合数的结算节点
每个回合开始前的节点
⾓⾊⾏动前节点
⾓⾊⾏动节点
⾓⾊⾏动后节点
回合结束节点
这⾥只是举⼀个例⼦,这中间还可以细化出更多可以使⽤的逻辑节点。
2.整体的事件流程管理:
使⽤事件队列+临时事件压栈进⾏事件的管理
1.在⼀个回合开始前已经计算好了本回合的⾏动顺序,任何本回合内的Buff导致属性变更都不会影响到本回合的⾏动顺序,影响都是从下回合产⽣的。那么在回合开始前本回合内所有⾓⾊⾏动的节点与顺序就都是确定的。
2.很多临时触发的事件需要等待当前事件执⾏结束后才能开始执⾏
3.事件的触发是有顺序的,因为临时事件也可能触发新的临时事件(当两个拥有100%反击的⾓⾊互相攻击时,就会产⽣⼀个决⽃⾄⼀⽅死亡的情况)
总结下来整体的逻辑思路⼤概就是这样,当然其中有很多细节并没有详细的写⼀些实现⽅式(觉得⾃⼰的代码写的太渣了实在是没脸拿出来)。其中还有很多设计其实现在还没有想出⼀套有逻辑的实现⽅案(都是写死的,⽐如对⽬标的选择和切换与拓展等),这些如果后⾯我有⼀些明确有条理的思路的时候也许会回来对这些想法进⾏补全(⼤概率不会,因为我发现我写完什么东西之后连回来看看都很难,别说补新内容了哈哈哈哈哈)。
同时因为我做了很久的UI仔,其实这是我第⼀次真正意义上⾃⼰设计(⾃⼰设计个屁啊,还不是抄的Dota2的设计)了⼀个完整的游戏内⽐较⼤的系统,通过这次系统的开发我学到了很多,但是毕竟是第⼀次做这么⼤的系统。所以肯定有很多的不⾜,希望各位路过的⼤佬可以略加指点⼀⼆。