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