public void ExecuteUnitAbility(int unitId, int targetId, int ablilityId) { var allies = new List <int>(_battle.LiveAllies); var enemies = new List <int>(_battle.LiveEnemies); if (!allies.Contains(unitId)) { Logger.Error($"unit id = {unitId} dead.", this); return; } int?interfaceTargetId = null; if (targetId != -1) { interfaceTargetId = targetId; } if (!_battleLogic.HasExecuteAbility(unitId, ablilityId)) { throw new Exception($"No actable ability unitId = {unitId} ablilityId = {ablilityId}"); } _contextLogic.TurnType = BattleTurnResultType.StartTurn; _battleLogic.StartTurn(unitId, interfaceTargetId, false); if (!_battle.HasStan(unitId)) { _contextLogic.TurnType = BattleTurnResultType.ActiveAbility; var ability = _units.Static.Abilities[ablilityId]; Logger.Trace(() => $"----------------------------------- start execute impact unit active ability unitId = {unitId} abilityId = {ablilityId}"); ExecuteAbility(unitId, interfaceTargetId, ability.Impact, ablilityId, false); Logger.Trace(() => $"----------------------------------- finish execute impact unit active ability"); } else { _contextLogic.SetAbilityContext(unitId, interfaceTargetId, false); } _contextLogic.TurnType = BattleTurnResultType.Buff; UpdateBuffs(false); _contextLogic.TurnType = BattleTurnResultType.PassiveAbility; ExecutePassiveAbility(ActivationType.Events); _contextLogic.TurnType = BattleTurnResultType.EndTurn; _battleLogic.UpdateMobs(); var members = new List <int>(_battle.LiveEnemies); members.RemoveAll(x => enemies.Contains(x)); foreach (var enemy in members) { if (_contextLogic.MobImpacts.TryGetValue(enemy, out var impact)) { _contextLogic.SetAbilityContext(enemy, null, true); _impactLogic.ExecuteImpact(impact); } } _battleLogic.FinishTurn(); if (_battle.State.Data.Status == BattleStatus.Running) { var newAllies = new List <int>(_battle.LiveAllies); newAllies.RemoveAll(x => allies.Contains(x)); foreach (var ally in newAllies) { _contextLogic.TurnType = BattleTurnResultType.PassiveAbility; ExecuteStartAbility(ally, false); } foreach (var enemy in members) { _contextLogic.TurnType = BattleTurnResultType.PassiveAbility; ExecuteStartAbility(enemy, true); } } LogicLog.ExecuteAbility(ablilityId); }