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