和战斗相关的模块有mod_battle.erl
当玩家进程和怪物进程被创建的时候都会通过mod_battle:start_link()创建一个战斗进程。
该战斗进程的state,用于保存玩家上次出手或者使用技能的时机,用于cd的判断
-record(state, {
last_attack_time=0, % 上次出手时间
last_skill_time = [] % [{技能id,上次时间}]
}).
开始战斗的时候,生成攻击方和防守方的#battle_status记录实例,战斗中的伤害通过这两个记录实例来计算
战斗存在三种情况:玩家打怪,怪打玩家,玩家打玩家
战斗的大致流程:
攻击方指定防守方Id,指定使用的技能Id,向服务器发送攻击请求(20001,20003)
进入攻击方的战斗进程内,通过ETS获取防守方信息,进行攻击距离,cd,技能配置等检查
检查通过,计算双方持续效果buff,计算技能buff,计算伤害
更新持续buff列表,给防守方玩家(怪物)进程发送消息(Hp,Mp,坐标变换),更新双方状态,回写ETS,给客户端广播战斗结果
代码流程:
mod_battle:battle(Pid, Data) -> 发到战斗进程处理
start([Aer,Der,SkillId,State]) -> 初始化双方#battle_stat