Ejemplo n.º 1
0
        public override void Execute(IImpactUnitSetSlot impactData)
        {
            if (_accessor.TryGetUnit(impactData.UnitId, false, out var data))
            {
                if (data.ExplorerPosition == impactData.SlotId)
                {
                    return;
                }

                if (impactData.SlotId < 0)
                {
                    _accessor.SetUnitReserve(impactData.UnitId, false);
                    return;
                }
                var unit = _accessor.State.Units.FirstOrDefault(x => x.ExplorerPosition == impactData.SlotId);
                if (unit == null)
                {
                    data.ExplorerPosition = impactData.SlotId;
                }
                else
                {
                    if (impactData.Replace)
                    {
                        _accessor.SetUnitReserve(unit.Id, false);
                        data.ExplorerPosition = impactData.SlotId;
                    }
                    else
                    {
                        var slots = new List <int> {
                            1, 2, 3
                        };
                        foreach (var temp in _accessor.State.Units)
                        {
                            slots.Remove(temp.ExplorerPosition);
                        }
                        if (slots.Count > 0)
                        {
                            data.ExplorerPosition = slots.First();
                        }
                    }
                }
            }
            else
            {
            }
        }
Ejemplo n.º 2
0
        public void SetReserveUnit(int unitId)
        {
            var unit = _battle.State.Data.Allies[unitId];

            _battle.State.Data.Allies.Remove(unitId);
            _battle.State.Data.ReserveAllies[unitId] = unit;
            _units.SetUnitReserve(unitId, false);
        }
        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);
                }
            }
        }