/// <summary> /// 技能防御 /// </summary> public virtual void DefenseSkill(HeroMono attacker, HeroMono defender) { long hurt = 0; //完全物理攻击,没有任何添加 hurt = attacker.CurrentAttack + this.Attack - defender.CurrentDefense; defender.CurrentLife -= hurt; //播放动画 defender.PlayTriggerAnimation(HeroAnimation.MagicDefense1); if (!defender.HasLife()) { defender.ExcuteBuff(Global.BuffActiveState.IsDead); defender.ExcuteSkill(Global.BuffActiveState.IsDead); } else { //如果是物理攻击防御技能则发动 defender.ExcuteBuff(Global.BuffActiveState.Attacked); defender.ExcuteSkill(Global.BuffActiveState.Attacked); } //显示HeroHub if (hurt > 0) { defender.ShowHeroHub(HubType.DecreseLife, new ValueUnit(hurt, Global.UnitType.Value)); } else if (hurt == 0) { defender.ShowHeroHub(HubType.Miss); } //进行buff判断 AddSkillBuff(attacker, defender); Debug.Log((attacker.IsPlayerHero ? "玩家的" : "敌人的") + attacker.Name + "使用技能" + this.Name + "对" + defender.Name + "造成" + hurt + "点伤害"); }
/// <summary> /// 每个回合行动前调用 /// </summary> void BeforeAction() { //对行动列表进行处理(这里会处理多回合和跳过回合的情况) CaculateActiveHeroList(); //接着从行动列表中选出速度最快的英雄作为当前回合的行动者 GetMaxSpeedHero(); //增加一个回合数 _TurnNumber += 1; //显示当前回合英雄高亮 CurrentBattleUI.SelectHero(_CurTurnHero); //接着判断一下当前回合的英雄buff或者debuff有没有起作用的,需要再次处理 _CurTurnHero.ExcuteBuff(Global.BuffActiveState.BeforeAction); //如果执行完buff操作之后,英雄血量变空,则进入下一个准备开始阶段 if (!_CurTurnHero.HasLife()) { //这里先让buff执行,之后再让其他逻辑执行,让每次使用技能都有时间差 StartCoroutine(WaitForNext(SystemSetting.BattlePerTurnEndGapTime, () => { if (_CurTurnHero.IsDead()) { //TODO 被debuff杀死时候需要重新下一个回合,还有是否有恢复技能未使用 AbortAction(Global.CombatSystemType.AfterAction); } else { //这里是血量为空,但是又技能可以复活的时候执行 _CurTurnHero.ExcuteBuff(Global.BuffActiveState.IsDead); _CurTurnHero.ExcuteSkill(Global.BuffActiveState.IsDead); //这里做个延迟 StartCoroutine(WaitForNext(SystemSetting.BattlePerTurnEndGapTime, () => { //接着判断一下当前回合的英雄有没有回合开始前发动的技能,然后处理一下 if (!_CurTurnHero.ExcuteSkill(Global.BuffActiveState.BeforeAction)) { DebugLog(LogType.INFO, "BeforeAction"); //如果没有技能执行,则手动进入下一状态 ToActionState(); } })); } })); return; } //接着判断一下当前回合的英雄有没有回合开始前发动的技能,然后处理一下 if (!_CurTurnHero.ExcuteSkill(Global.BuffActiveState.BeforeAction)) { DebugLog(LogType.INFO, "BeforeAction"); //如果没有技能执行,则手动进入下一状态 ToActionState(); } }
public override void DefenseSkill(HeroMono attacker, HeroMono defender) { long hurt = 0; //完全物理攻击,没有任何添加 bool is_physicl_critical = this.IsInPercent(CriticalChance); hurt = attacker.CurrentAttack + Mathf.RoundToInt(this.Attack * (is_physicl_critical ? 2 : 1)) - defender.CurrentDefense; defender.CurrentLife -= hurt; //播放动画 defender.PlayTriggerAnimation(HeroAnimation.Defense1); if (!defender.HasLife()) { defender.ExcuteBuff(Global.BuffActiveState.IsDead); defender.ExcuteSkill(Global.BuffActiveState.IsDead); } else { //如果是物理攻击防御技能则发动 defender.ExcuteBuff(Global.BuffActiveState.Attacked); defender.ExcuteSkill(Global.BuffActiveState.Attacked); } //显示HeroHub if (is_physicl_critical) { if (hurt > 0) { defender.ShowHeroHub(HubType.Critical, new ValueUnit(hurt, Global.UnitType.Value)); } else if (hurt == 0) { defender.ShowHeroHub(HubType.Miss); } } //正常的显示 else if (hurt > 0) { defender.ShowHeroHub(HubType.DecreseLife, new ValueUnit(hurt, Global.UnitType.Value)); } else if (hurt == 0) { defender.ShowHeroHub(HubType.Miss); } //进行buff判断 AddSkillBuff(attacker, defender); // Debug.Log((attacker.IsPlayerHero ? "玩家的" : "敌人的") + attacker.Name + "使用技能" + this.Name + "对" + defender.Name + "造成" + hurt + "点伤害"); }