public override bool Check(IConditionScorer restictionData)
        {
            var currentCount = _scorers.GetScorer(restictionData.Scorer, restictionData.StageId);
            var value        = (int)_logic.Calculate(restictionData.Value);

            return(restictionData.Operator.Check(currentCount, value));
        }
Beispiel #2
0
        public override void Execute(IUnitImpactBuff data)
        {
            var contextImpact = _context.ContextImpact;
            var value         = (int)_logic.Calculate(data.Value);
            var member        = _battle.GetMember(_context.ContextImpact.CurrentTarget);

            if (!member.Buffs.TryGetValue(data.BuffId, out var buffData))
            {
                if (value < 0)
                {
                    return;
                }
                var buff = _battle.Static.Buffs[data.BuffId];
                _impact.ExecuteImpact(buff.ImpactInit);
                buffData = _battle.Factory.CreateBuff(contextImpact.OwnerId, false);
                if (contextImpact.OwnerId == contextImpact.CurrentTarget &&
                    (_context.TurnType == BattleTurnResultType.ActiveAbility || _context.TurnType == BattleTurnResultType.StartTurn))
                {
                    buffData.NeededRemove = true;
                }
                _buffs.ChangeBuff(member, buffData, data.BuffId, value);
                member.Buffs[data.BuffId] = buffData;
            }
            else
            {
                if (!_buffs.ChangeBuff(member, buffData, data.BuffId, value))
                {
                    _impact.ExecuteImpact(_battle.Static.Buffs[data.BuffId].ImpactTakeOff);
                }
            }
        }
Beispiel #3
0
        public override void Execute(IImpactUnitShard data)
        {
            var value = (int)_logic.Calculate(data.Shards);

            _accessor.AddUnitShard(data.UnitId, value);
            LogicLog.AddUnitShard(data.UnitId, value);
        }
        public override bool Check(IConditionAvailability restictionData)
        {
            _inventory.State.Items.TryGetValue(restictionData.ItemId, out var currentValue);
            var value = (int)_logic.Calculate(restictionData.Value);

            return(restictionData.Operator.Check(currentValue, value));
        }
Beispiel #5
0
        public override void Execute(IImpactRandomWeight data)
        {
            var dataWeight = new List <(int, IImpact)>();

            foreach (var temp in data.Weights.Values)
            {
                if (!_condition.Check(temp.Impact.Condition))
                {
                    continue;
                }
                dataWeight.Add(((int)_formulaLogic.Calculate(temp.Formula), temp.Impact));
            }
            if (dataWeight.Count == 0)
            {
                return;
            }
            if (dataWeight.Count == 1)
            {
                _impactLogic.ExecuteImpact(dataWeight.FirstOrDefault().Item2);
                return;
            }
            var result = _settings.GetWeightRandom(dataWeight);

            _impactLogic.ExecuteImpact(result.Item2, false);
        }
Beispiel #6
0
        public override bool Check(IConditionPlayerLevel restictionData)
        {
            var level        = (int)_logic.Calculate(restictionData.Value);
            var currentLevel = _player.State.Level;

            return(restictionData.Operator.Check(currentLevel, level));
        }
        public override void Execute(IImpactChangeMana data)
        {
            //if (_battle.State.Data == null)
            //{
            //    throw new Exception("ImpactManaExecutor Битва не запущена");
            //}
            var manaId = _scorers.ManaId;
            var value  = (int)_logic.Calculate(data.Value);

            if (!_explorer.State.IsRun)
            {
                Logger.Error("Attempting to record mana for stage outside of explorer", this);
                return;
            }
            var stage = _explorer.GetStage(_explorer.CurrentStage);

            stage.Values.TryGetValue(manaId, out var scorer);

            if (data.Oversize)
            {
                value = (int)scorer + value;
            }
            else
            {
                value = Mathf.Min((int)scorer + value, _settings.Settings.PlayerSettings.ManaMax);
                value = Mathf.Max(value, 0);
            }
            stage.Values[manaId] = value;
        }
Beispiel #8
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));
        }
Beispiel #9
0
        public override bool Check(IUnitConditionBuffType data)
        {
            var membler = _battle.GetMember(_context.ContextImpact.CurrentTarget);
            var count   = membler.Buffs.Count(x => _battle.Static.Buffs[x.Key].BuffType.Values.Contains(data.BuffTypeId));
            var value   = (int)_formula.Calculate(data.Value);

            return(data.Operator.Check(count, value));
        }
        public override bool Check(IUnitConditionSlots restictionData)
        {
            var members = (restictionData.Target == TargetType.Owner && !_context.ContextTurn.IsEnemy ? _battle.LiveAllies : _battle.LiveEnemies);
            var count   = HardCodeIds.MaxBattleSlots - members.Count();
            var value   = (int)_formula.Calculate(restictionData.Value);

            return(restictionData.Operator.Check(count, value));
        }
Beispiel #11
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);
        }
        public override bool Check(IConditionRand data)
        {
            if (_data.IsEmulate)
            {
                return(false);
            }
            var value = _formula.Calculate(data.Value);

            return(new Random().NextDouble() <= value / 100.0f);
        }
        public override void Execute(IImpactChangeStamina data)
        {
            if (!_explorer.State.IsRun)
            {
                throw new Exception("Explore not running");
            }
            var value     = (int)_logic.Calculate(data.Value);
            var staminaId = _scorers.StaminaId;

            _explorer.SpendScorer(staminaId, -value);
        }
        //public FormulaLogic Logic { get;set; }

        //[Query]
        //public int Stamina => State.Values["stamina"];

        //[Query]
        //public IReadOnlyDictionary<int, IScorer> Scorers => Static.Scorers;

        public void Spend(IPrice price, FormulaLogic logic)
        {
            var value    = (int)logic.Calculate(price.Value);
            var scorerId = Static.MoneyTypes[price.MoneyType].ScorerId;

            State.Values.TryGetValue(scorerId, out var count);
            if (count < value)
            {
                throw new Exception($"Недостаточно ресурсов type = {price.MoneyType} для покупки ({count} < {value})");
            }
            State.Values[scorerId] = count - value;
        }
        public override void Execute(IImpactScorerData data)
        {
            var value  = (long)_logic.Calculate(data.Value);
            var values = _scorers.GetScrorerMap(data.Id, data.StageId);

            if (values == null)
            {
                return;
            }
            long delta = 0;

            switch (data.Operator)
            {
            case OperationType.Add:
                delta            = value;
                values[data.Id] += value;
                break;

            case OperationType.Set:
                delta           = value - values[data.Id];
                values[data.Id] = value;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            if (delta > 0)
            {
                var staticData = _scorers._scorers.Static.MoneyTypes.Values.FirstOrDefault(x => x.ScorerId == data.Id);
                if (staticData != null && staticData.AchievScorerId != 0)
                {
                    values = _scorers.GetScrorerMap(staticData.AchievScorerId, 0);
                    if (values != null)
                    {
                        values[staticData.AchievScorerId] += delta;
                    }
                }
            }

            if (_scorers.HasLog(data.Id))
            {
                var logStage = data.StageId;
                if (logStage == 0)
                {
                    if (_explorer.State.IsRun)
                    {
                        logStage = _explorer.CurrentStage;
                    }
                }
                LogicLog.ChangeScorer(data.Id, data.Operator, value, logStage);
            }
        }
Beispiel #16
0
        public override bool Check(IUnitConditionBuff data)
        {
            var membler = _contextLogic.CurrentTarget;
            var count   = 0;

            if (membler.Buffs.TryGetValue(data.BuffId, out var buffData))
            {
                count = buffData.CountStack;
            }
            var value = (int)_formula.Calculate(data.Value);

            return(data.Operator.Check(count, value));
        }
        public override void Execute(IUnitImpactAnimFrame data)
        {
            _logic.BatchAbilityInFrame();
            var frameData = new FrameAbility {
                FamiliarAnimStart = data.FamiliarAnimStart, UnityId = data.UnityObjectId
            };

            if (float.TryParse(data.ShellDuration, out var value))
            {
                frameData.ShellDuration = value;
            }
            frameData.Time = (float)_formula.Calculate(data.TimeFormula);
            _logic.Data    = frameData;
        }
        public override void Execute(IImpactChangeMoney data)
        {
            var value = (int)_logic.Calculate(data.Value);
            var data1 = _scorers.Static.MoneyTypes[data.MoneyTypeId];
            var id    = _scorers.Static.MoneyTypes[data.MoneyTypeId].ScorerId;
            var dict  = _scorers.State.Values;

            dict.TryGetValue(id, out var oldValue);
            var delta = 0;

            switch (data.Operator)
            {
            case OperationType.Add:
                dict[id] = oldValue + value;
                delta    = value;
                break;

            case OperationType.Set:
                delta    = value - (int)oldValue;
                dict[id] = value;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            if (delta > 0)
            {
                if (data1.AchievScorerId != 0)
                {
                    if (!dict.ContainsKey(data1.AchievScorerId))
                    {
                        dict[data1.AchievScorerId] = 0;
                    }
                    dict[data1.AchievScorerId] += delta;
                }
            }
            if (dict[id] <= 0)
            {
                dict.Remove(id);
            }
            LogicLog.ChangeMoneyType(data.MoneyTypeId, data.Operator, value);
        }
        public override void Execute(IImpactChangePerkCharges data)
        {
            var value    = (int)_logic.Calculate(data.Value);
            var unitData = _units.ExplorerUnits
                           .Select(x => {
                var(unit, _) = _units.GetUnit(x);
                return(unit);
            })
                           .FirstOrDefault(x => {
                x.PerkCharges.TryGetValue(data.PerkId, out value);
                return(value > 0);
            });

            if (unitData == null)
            {
                throw new Exception($"Закончились заряды перка");
            }
            unitData.PerkCharges[data.PerkId] -= 1;
            LogicLog.ChangePerkCharge(data.PerkId, value);
        }
        public override void Execute(IImpactItemData data)
        {
            var value = (int)_logic.Calculate(data.Value);
            ILogicDictionary <int, int> dict;

            if (!data.IsExplorer)
            {
                if (!_inventory.State.Items.ContainsKey(data.ItemId))
                {
                    _inventory.State.Items[data.ItemId] = 0;
                }
                dict = _inventory.State.Items;
            }
            else
            {
                if (!_explorer.State.Inventory.ContainsKey(data.ItemId))
                {
                    _explorer.State.Inventory[data.ItemId] = 0;
                }
                dict = _explorer.State.Inventory;
            }
            switch (data.Operator)
            {
            case OperationType.Add:
                dict[data.ItemId] += value;
                break;

            case OperationType.Set:
                dict[data.ItemId] = value;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            if (dict[data.ItemId] <= 0)
            {
                dict.Remove(data.ItemId);
            }
            LogicLog.ChangeItemValue(data.ItemId, value);
        }
        public override void Execute(IUnitImpactBuffType data)
        {
            var targetId = _context.ContextImpact.CurrentTarget;
            var member   = _battle.GetMember(targetId);

            if (member == null)
            {
                Logger.Error($"No member in battle CurrentTarget = {targetId} ", this);
                return;
            }
            var buffs = member.Buffs
                        //.Where(x => _battle.Static.Buffs[x.Key].BuffType.Values.Contains(data.BuffTypeId))
                        .Select(x => x.Key).ToArray();

            var value = (int)_logic.Calculate(data.Value);

            foreach (var id in buffs)
            {
                var buffTypeValues = _battle.Static.Buffs[id].BuffType.Values;

                var contains = false;
                foreach (var buffType in buffTypeValues)
                {
                    if (data.BuffTypeIds.Values.Contains(buffType))
                    {
                        contains = true;
                        break;
                    }
                }
                if (contains)
                {
                    if (!_buffs.ChangeBuff(member, member.Buffs[id], id, value))
                    {
                        _impacts.ExecuteImpact(_battle.Static.Buffs[id].ImpactTakeOff);
                    }
                }
            }
        }
 public override double Calculate(IFormulaConst formulaData)
 {
     return(_logic.Calculate(_scorer.Static.Consts[formulaData.ConstId].Formula));
 }
Beispiel #23
0
 public override void Execute(IImpactBuff data)
 {
     _explorer.State.PlayerBuffs[data.BuffId] = (int)_logic.Calculate(data.Value);
 }
Beispiel #24
0
 public Double Calculate(IFormula data, Int32 unit)
 {
     return(FormulaLogic.Calculate(data, unit));
 }
        public override void Execute(IImpactPlayerExp data)
        {
            var exp = (int)_formula.Calculate(data.Value);

            _accessor.UpgradeLevel(exp);
        }