public bool HasExecuteAbility(int id, int abilityId)
        {
            var data       = _battle.GetMember(id);
            var staticData = _units.Static.Abilities[abilityId];

            if (!_condition.CheckUnit(staticData.Actable, id))
            {
                return(false);
            }

            //if (staticData.Params.Mode != AbilityType.Passive && data.CurrentHp <= 0)
            //{
            //    return false;
            //}

            var abilityData = data.Abilities[abilityId];

            if (staticData.LimitTurn > 0)
            {
                if (abilityData.CountTurn >= staticData.LimitTurn)
                {
                    return(false);
                }
            }
            if (staticData.LimitBattle > 0)
            {
                if (abilityData.CountBattle >= staticData.LimitBattle)
                {
                    return(false);
                }
            }
            return(true);
        }
Example #2
0
        public List <int> UpdateBuff()
        {
            var list = new List <int>();
            var data = _accessor.GetMember(_contextLogic.ContextTurn.OwnerId);

            foreach (var temp in data.Buffs.Select(x => x.Key).ToArray())
            {
                var buffState  = data.Buffs[temp];
                var staticData = _accessor.Static.Buffs[temp];
                if (buffState.NeededRemove)
                {
                    buffState.NeededRemove = false;
                    continue;
                }

                var targetData = _accessor.GetMember(buffState.OwnerId);

                if (targetData != null && targetData.Status == UnitBattleStatus.DeadInTern)
                {
                    buffState.CountStack -= staticData.WithdrawDeath;
                }

                if (buffState.CountStack <= staticData.WithdrawTurn)
                {
                    data.Buffs.Remove(temp);
                    list.Add(temp);
                }
                else
                {
                    buffState.CountStack -= staticData.WithdrawTurn;
                }
            }
            _logic.BatchBattle();
            return(list);
        }
        public IMemberBattleData GetMember(TargetType restictionDataTarget)
        {
            switch (restictionDataTarget)
            {
            case TargetType.Owner:
                return(_battleAccessor.GetMember(CurrentContext.OwnerId));

            case TargetType.Target:
                return(_battleAccessor.GetMember(CurrentContext.CurrentTarget));

            default:
                throw new ArgumentOutOfRangeException(nameof(restictionDataTarget), restictionDataTarget, null);
            }
        }
Example #4
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);
                }
            }
        }
Example #5
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));
        }
Example #6
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));
        }
Example #7
0
        public override bool Check(IUnitConditionMostHp restictionData)
        {
            if (_logic.BattleMode)
            {
                var list = new List <int>();
                if (_logic.ConditionTarget != null)
                {
                    list = _logic.FindContextTarget(_logic.ConditionTarget.Value, _logic.ContextImpact);
                }
                else
                {
                    list = _battle.LiveAllies.ToList();
                    list.AddRange(_battle.LiveEnemies.ToList());
                }

                list = list.OrderByDescending(x => _battle.GetMember(x).CurrentHp / _battle.GetMember(x).HpMax.Value).ToList();
                switch (restictionData.HpType)
                {
                case HpType.Healthy:
                    return(list.First() == _logic.ContextCondition.CurrentTarget);

                case HpType.Wounded:
                    return(list.Last() == _logic.ContextCondition.CurrentTarget);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            else
            {
                var members = _units.ExplorerUnits.Select(x => _units.GetUnit(x).data);
                members = members.OrderByDescending(x => x.CurrentHp / _units.CalculateMaxHp(x, _formula).Value).ToList();
                switch (restictionData.HpType)
                {
                case HpType.Healthy:
                    return(members.First().Id == _logic.ContextCondition.CurrentTarget);

                case HpType.Wounded:
                    return(members.Last().Id == _logic.ContextCondition.CurrentTarget);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
        }
Example #8
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 bool CheckTrigger(TriggerUnitData triggerData, ITriggerFamiliarSummon data)
        {
            var member = _battle.GetMember(triggerData.TargetId);
            var result = member.TurnFamiliarSummoned;

            if (result)
            {
                member.TurnFamiliarSummoned = false;
            }
            return(result);
        }
Example #10
0
        public override bool Check(IUnitConditionMob restictionData)
        {
            if (!_context.BattleMode)
            {
                throw new Exception($"It is impossible to check the presence of a mob not in combat. mobId = {restictionData.MobId}");
            }
            var member = _battle.GetMember(_context.ContextCondition.CurrentTarget);

            if (member == null)
            {
                return(true);
            }
            var haveUnit = member.StaticId == restictionData.MobId;

            return(haveUnit);
        }
Example #11
0
        public override void Execute(IUnitImpactExp impactData)
        {
            int currentTarget = _context.ContextImpact.CurrentTarget;

            if (_context.BattleMode)
            {
                if (_context.ContextImpact.IsEnemy)
                {
                    Logger.Error($"The enemy cannot receive exp target = {_context.ContextImpact.CurrentTarget}", this);
                    return;
                }
            }
            var(data, unit) = _units.GetUnit(currentTarget);

            var oldLevel = data.Level;
            var exp      = (int)_formula.Calculate(impactData.Value);

            if (exp < 1)
            {
                return;
            }
            var newLevel = _units.UpgradeUnitLevel(data.Id, exp, _player.State.Level);

            var updateLevel = oldLevel != newLevel;

            while (oldLevel != newLevel)
            {
                oldLevel++;
                var levelData = _units.Static.UnitLevels.Values.FirstOrDefault(x => x.Level == oldLevel);
                _logic.ExecuteImpact(levelData?.Impact);
                _logic.ExecuteImpact(unit.ImpactUpdrade);
            }

            if (updateLevel && _context.BattleMode)
            {
                _context.SetContextFormula(unit.Id);
                _context.NeedExploreParam = true;

                var member = _battle.GetMember(currentTarget);
                member.HpMax      = _units.CalculateMaxHp(data, _formula);
                member.Strength   = _units.CalculateStrength(data, _formula);
                member.Initiative = _units.CalculateInitiative(data, _formula);

                _context.SetContextFormula(null);
                _context.NeedExploreParam = false;
            }
        }
        private void UpdateBuffs(bool isEnemy)
        {
            var owner = _battle.GetMember(_contextLogic.ContextTurn.OwnerId);

            foreach (var temp in owner.Buffs)
            {
                var buffStatic = _battle.Static.Buffs[temp.Key];
                if (buffStatic.Impact != null)
                {
                    _contextLogic.SetContextImpact(temp.Value.OwnerId, _contextLogic.ContextTurn.OwnerId, isEnemy);
                    _impactLogic.ExecuteImpact(buffStatic.Impact);
                }
            }
            var list = _buffLogic.UpdateBuff();

            foreach (var temp in list)
            {
                _impactLogic.ExecuteImpact(_battle.Static.Buffs[temp].ImpactTakeOff);
            }
        }
 public override void Execute(IUnitImpactLeave data)
 {
     if (_context.BattleMode)
     {
         var targetId = _context.ContextImpact.CurrentTarget;
         var member   = _battle.GetMember(targetId);
         if (member == null)
         {
             Logger.Error($"No member in battle CurrentTarget = {targetId} ", this);
             return;
         }
         member.Status    = UnitBattleStatus.Leave;
         member.CurrentHp = 0;
         member.Status    = UnitBattleStatus.DeadInTernNoDropped;
     }
     else
     {
         Logger.Error($"No leave unit in no battle", this);
     }
 }
        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 bool CheckTrigger(TriggerUnitData context, ITriggerInfluence data)
        {
            var state = _accessor.GetMember(context.TargetId);

            return(state.TurnInfluence.Remove(data.InfluenceType));
        }
        public override void Execute(IUnitImpactHp data)
        {
            var targetId = _context.ContextImpact.CurrentTarget;
            var value    = (float)_logic.Calculate(data.Value);

            if (_context.BattleMode)
            {
                var member = _battle.GetMember(targetId);
                if (member == null)
                {
                    Logger.Error($"No member in battle CurrentTarget = {targetId} ", this);
                    return;
                }
                var oldHp = member.CurrentHp;

                if (value < 0)
                {
                    value            = Mathf.Min(value, member.CurrentHp);
                    member.CurrentHp = member.CurrentHp + value;
                    if (member.CurrentHp <= 0)
                    {
                        member.Status = UnitBattleStatus.DeadInTernNoDropped;
                        if (member.MemberType == BattleMemberType.Unit)
                        {
                            _units.SetUnitReserve(member.StaticId, true);
                        }
                    }
                }
                else
                {
                    value            = Mathf.Min(value, (float)member.HpMax.Value - member.CurrentHp);
                    member.CurrentHp = member.CurrentHp + value;
                }
                if (_units.Static.Abilities.TryGetValue(_context.CurrentAbility, out var ability))
                {
                    if (member.CurrentHp < oldHp)
                    {
                        if (ability.Influence.Values.Contains(InfluenceType.Attack))
                        {
                            member.TurnInfluence.Add(InfluenceTargetType.Attack);
                        }
                        if (ability.Influence.Values.Contains(InfluenceType.AttackDistance))
                        {
                            member.TurnInfluence.Add(InfluenceTargetType.AttackDistance);
                        }
                    }
                    if (member.CurrentHp > oldHp)
                    {
                        if (ability.Influence.Values.Contains(InfluenceType.Attack))
                        {
                            member.TurnInfluence.Add(InfluenceTargetType.Heal);
                        }
                    }
                }
            }
            else
            {
                var(member, unit) = _units.GetUnit(targetId);
                var max = _units.CalculateMaxHp(member, _logic);
                if (value < 0)
                {
                    value            = Mathf.Min(value, member.CurrentHp);
                    member.CurrentHp = member.CurrentHp + value;
                    if (member.CurrentHp <= 0)
                    {
                        _units.SetUnitReserve(targetId, true);
                    }
                }
                else
                {
                    member.CurrentHp = Mathf.Min(member.CurrentHp + value, (float)max.Value);
                }
            }
        }