上一篇文章,我主要是从全局的一个角度,架构了战斗系统,这里我将详细分析具体的实现细节。
这场战斗中,我们需要关注的点:战斗前期准备,单次战斗结算, 技能释放,战斗结算。
战斗前期
在航海类游戏中,参战的首要条件是,你必须是出海状态,然后检测你的参战资格,例如你的生命值不能低于25HP,然后初始化玩家对象,玩家的舰队,玩家的船长等。
具体的流程图如下:
这里需要注意的的有如下几点:
1 验证formHash,同时要把对方的ID加密,这样做都是为了恶意攻击。如果加密和验证,我记住了你的ID,我就不断的可以攻击你。最简单的外挂就是这样做的。
2 初始化舰队的时候,船只的实力是装备过装备的实力。
3 初始化战斗类型的时候,可以使用工厂模式。
战斗技能
技能发动是有某个装配了船长的船发动的,而且是有概率的。当船发动攻击的时候,我们会做出一个判断技能是否发动成功:
// 如果攻船正处于“封印”状态,则不能发动技能
if (Model_Battle_InSkill::isSealed($attackerShip)) {
$skillId = 0;
}
// 否则可以触发攻船的战斗内技能
else {
// 返回0表示触发失败,触发成功则返回技能Id
$skillId = Model_Battle_InSkill::triggerSkill($attacker, $attackerShip);
}
如果技能触发成功了后,我就会实例化这个技能:
// 创建本次技能实例
$skill = Model_Battle_InSkill::factory($skillId);
创建了技能之后,我们就要明白技能到底是如何工作的。
作用对象:我的的舰队,或者敌方的舰队。
效果:
该buff持续回合数
该buff是良性or恶性
影响比例(小于100%表示减少,大于表示增加)
该buff是良性or恶性
影响比例(小于100%表示减少,大于表示增加)
可能有这样的一个技能:
火爆出击: 把对方的任意三艘船的战斗力减少为50%,持续2回合。
技能的数据库设计:
需要的动作:
初始化双方的舰队,便于寻找作用对象