Voici le code que j'utilise sur Stump :
public static int CalculateWinExp(CharacterFighter fighter)
{
if (fighter.HasLeft())
return 0;
IEnumerable<MonsterFighter> monsters = fighter.OpposedTeam.GetAllFighters<MonsterFighter>(entry => entry.IsDead()).ToList();
IEnumerable<CharacterFighter> players = fighter.Team.GetAllFighters<CharacterFighter>().ToList();
if (!monsters.Any() || !players.Any())
return 0;
int sumPlayersLevel = players.Sum(entry => entry.Level);
byte maxPlayerLevel = players.Max(entry => entry.Level);
int sumMonstersLevel = monsters.Sum(entry => entry.Level);
byte maxMonsterLevel = monsters.Max(entry => entry.Level);
int sumMonsterXp = monsters.Sum(entry => entry.Monster.Grade.GradeXp);
double levelCoeff = 1;
if (sumPlayersLevel - 5 > sumMonstersLevel)
levelCoeff = (double)sumMonstersLevel / sumPlayersLevel;
else if (sumPlayersLevel + 10 < sumMonstersLevel)
levelCoeff = ( sumPlayersLevel + 10 ) / (double)sumMonstersLevel;
double xpRatio = Math.Min(fighter.Level, Math.Truncate(2.5d * maxMonsterLevel)) / sumPlayersLevel * 100d;
int regularGroupRatio = players.Where(entry => entry.Level >= maxPlayerLevel / 3).Sum(entry => 1);
if (regularGroupRatio <= 0)
regularGroupRatio = 1;
double baseXp = Math.Truncate(xpRatio / 100 * Math.Truncate(sumMonsterXp * GroupCoefficients[regularGroupRatio - 1] * levelCoeff));
double multiplicator = fighter.Fight.AgeBonus <= 0 ? 1 : 1 + fighter.Fight.AgeBonus / 100d;
var xp = (int)Math.Truncate(Math.Truncate(baseXp * ( 100 + fighter.Stats[PlayerFields.Wisdom].Total ) / 100d) * multiplicator * Rates.XpRate);
return InvokeWinXpModifier(fighter, xp);
}
public static readonly double[] GroupCoefficients =
new[]
{
1,
1.1,
1.5,
2.3,
3.1,
3.6,
4.2,
4.7
};