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);
        }