コード例 #1
0
        public bool IsTarget(TriggerUnitData data, TargetActivationType target)
        {
            switch (target)
            {
            case TargetActivationType.Owner:
                if (data.OwnerId != data.TargetId)
                {
                    return(false);
                }
                break;

            case TargetActivationType.Ally:
                if (LiveEnemies.Contains(data.TargetId) && !LiveAllies.Contains(data.OwnerId))
                {
                    return(false);
                }
                break;

            case TargetActivationType.Enemy:
                if (LiveEnemies.Contains(data.TargetId) && LiveAllies.Contains(data.OwnerId))
                {
                    return(false);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(target), target, null);
            }
            return(true);
        }
コード例 #2
0
        public bool CheckTrigger(TriggerUnitData data, IActivationEvent activation, ActivationType type)
        {
            if (activation.Type == TriggerType.TriggerManual)
            {
                return(false);
            }
            if (type == ActivationType.StartBattle)
            {
                return(activation.Type == TriggerType.TriggerStartBattle);
            }

            if (activation.Events == null)
            {
                return(false);
            }

            if (!_battle.IsTarget(data, activation.Target))
            {
                return(false);
            }
            foreach (var temp in activation.Events)
            {
                if (!_triggers.TryGetValue(temp.Value.Activation.Type, out Func <TriggerUnitData, ITrigger, bool> action))
                {
                    throw new Exception($"no register impact executor type = {temp.Value.Activation.Type}");
                }
                if (action.Invoke(data, temp.Value.Activation))
                {
                    return(true);
                }
            }
            return(false);
        }
コード例 #3
0
        public bool CheckTrigger(TriggerUnitData context, ITriggerHp data)
        {
            var state          = _accessor.GetMember(context.TargetId);
            var value          = _formula.Calculate(data.Value) / 100.0f;
            var currentProcent = state.CurrentHp / state.HpMax.Value;

            return(data.Operator.Check(currentProcent, value));
        }
コード例 #4
0
        public bool CheckTrigger(TriggerUnitData triggerData, ITriggerBuff data)
        {
            var member = _battle.GetMember(triggerData.TargetId);
            var all    = member.TurnBuffs.Count(x => x == data.BuffId);
            var value  = _formula.Calculate(data.Value);
            var result = data.Operator.Check(all, value);

            member.TurnBuffs.Clear();
            return(result);
        }
コード例 #5
0
        public bool CheckTrigger(TriggerUnitData triggerData, ITriggerFamiliarSummon data)
        {
            var member = _battle.GetMember(triggerData.TargetId);
            var result = member.TurnFamiliarSummoned;

            if (result)
            {
                member.TurnFamiliarSummoned = false;
            }
            return(result);
        }
コード例 #6
0
        private void ExecuteStartAbility(int unit, bool isEnemy)
        {
            var data = new TriggerUnitData {
                OwnerId = unit, TargetId = unit
            };

            foreach (var temp in _battleLogic.GetAbilities(unit))
            {
                if (!_triggerLogic.CheckTrigger(data, temp.Activation, ActivationType.StartBattle))
                {
                    continue;
                }
                if (!_battleLogic.HasExecuteAbility(data.TargetId, temp.Id))
                {
                    continue;
                }
                Logger.Trace(() => $"----------------------------------- start execute impact passive ability memberId = {data.TargetId} abilityId = {temp.Id}");
                ExecuteAbility(data.OwnerId, null, temp.Impact, temp.Id, isEnemy);
                Logger.Trace(() => $"----------------------------------- finish execute impact ability");
            }
        }
コード例 #7
0
        private void ExecutePassiveAbility(ActivationType eventTrigger, bool isOnlyEnemies = false)
        {
            bool isExecuteAblility = true;

            HashSet <int> lastUnitIds = new HashSet <int>();

            //var ownerId = _contextLogic.ContextTurn?.OwnerId ?? -1;

            while (isExecuteAblility)
            {
                isExecuteAblility = false;
                UpdatePassiveAbilities();

                void UpdatePassiveAbilities()
                {
                    var updateAllies = new List <int>(_battle.LiveAllies);

                    updateAllies.RemoveAll(x => lastUnitIds.Contains(x));
                    var updateEnemies = new List <int>(_battle.State.Data.Enemies.Where(x => x.Value.Status != UnitBattleStatus.Dead).Select(x => x.Key));

                    updateEnemies.RemoveAll(x => lastUnitIds.Contains(x));
                    lastUnitIds.Clear();

                    foreach (var id in updateEnemies)
                    {
                        if (lastUnitIds.Contains(id))
                        {
                            continue;
                        }
                        var data = new TriggerUnitData {
                            OwnerId = id, TargetId = id
                        };
                        UpdateAbilities(data, _battleLogic.GetAbilities(id), true);
                    }
                    if (!isOnlyEnemies)
                    {
                        foreach (var unit in updateAllies)
                        {
                            if (lastUnitIds.Contains(unit))
                            {
                                continue;
                            }
                            var data = new TriggerUnitData {
                                OwnerId = unit, TargetId = unit
                            };
                            UpdateAbilities(data, _battleLogic.GetAbilities(unit), false);
                        }
                    }
                }

                void UpdateAbilities(TriggerUnitData data, IEnumerable <IAbility> abilities, bool isEnemy)
                {
                    foreach (var temp in abilities)
                    {
                        if (_triggerLogic.CheckTrigger(data, temp.Activation, eventTrigger))
                        {
                            if (_battleLogic.HasExecuteAbility(data.TargetId, temp.Id))
                            {
                                Logger.Trace(() => $"----------------------------------- start execute impact passive ability memberId = {data.TargetId} abilityId = {temp.Id}");
                                ExecuteAbility(data.OwnerId, null, temp.Impact, temp.Id, isEnemy);
                                Logger.Trace(() => $"----------------------------------- finish execute impact ability");
                                isExecuteAblility = eventTrigger != ActivationType.StartBattle;
                                lastUnitIds.Add(data.OwnerId);
                            }
                        }
                    }
                }
            }
        }
コード例 #8
0
        public bool CheckTrigger(TriggerUnitData context, ITriggerInfluence data)
        {
            var state = _accessor.GetMember(context.TargetId);

            return(state.TurnInfluence.Remove(data.InfluenceType));
        }