public static uint AdjustExp(int damage, YiObj attacker, YiObj target) { byte level = 120; if (attacker.Level < 120) { level = attacker.Level; } float exp = Math.Min(damage, target.CurrentHp); var deltaLvl = level - target.Level; if (target.IsGreen(attacker)) { if (deltaLvl >= 3 && deltaLvl <= 5) { exp *= 0.70f; } else if (deltaLvl > 5 && deltaLvl <= 10) { exp *= 0.20f; } else if (deltaLvl > 10 && deltaLvl <= 20) { exp *= 0.10f; } else if (deltaLvl > 20) { exp *= 0.05f; } } else if (target.IsRed(attacker)) { exp *= 1.30f; } else if (target.IsBlack(attacker)) { if (deltaLvl >= -10 && deltaLvl < -5) { exp *= 1.5f; } else if (deltaLvl >= -20 && deltaLvl < -10) { exp *= 1.8f; } else if (deltaLvl < -20) { exp *= 2.3f; } } double adjustedExp = Math.Max(1, exp); if (target is Player) { if (target.HasFlag(StatusEffect.RedName)) { adjustedExp = adjustedExp * 0.1; } else if (target.HasFlag(StatusEffect.BlackName)) { adjustedExp = adjustedExp * 0.2; } else { adjustedExp = adjustedExp * 0.02; } if (attacker is Player) { target.Experience -= (uint)Math.Max(1, adjustedExp); } } return((uint)Math.Max(1, adjustedExp)); }