ace/Source/ACE.Server/Entity/ExperienceSystem.cs

84 lines
2.2 KiB
C#
Raw Permalink Normal View History

using System;
using ACE.Entity.Enum;
namespace ACE.Server.Entity
{
public static class ExperienceSystem
{
public static ulong ItemLevelToTotalXP(int itemLevel, ulong baseXP, int maxLevel, ItemXpStyle xpScheme)
{
if (itemLevel < 1)
return 0;
if (itemLevel > maxLevel)
itemLevel = maxLevel;
if (itemLevel == 1)
return baseXP;
switch (xpScheme)
{
case ItemXpStyle.Fixed:
return (ulong)itemLevel * baseXP;
case ItemXpStyle.ScalesWithLevel:
default:
var levelXP = baseXP;
var totalXP = baseXP;
for (var i = itemLevel - 1; i > 0; i--)
{
levelXP *= 2;
totalXP += levelXP;
}
return totalXP;
case ItemXpStyle.FixedPlusBase:
return (ulong)itemLevel * baseXP + baseXP;
}
}
public static int ItemTotalXPToLevel(ulong gainedXP, ulong baseXP, int maxLevel, ItemXpStyle xpScheme)
{
var level = 0;
switch (xpScheme)
{
case ItemXpStyle.Fixed:
level = (int)Math.Floor((double)gainedXP / baseXP);
break;
case ItemXpStyle.ScalesWithLevel:
var levelXP = baseXP;
var remainXP = gainedXP;
while (remainXP >= levelXP)
{
level++;
remainXP -= levelXP;
levelXP *= 2;
}
break;
case ItemXpStyle.FixedPlusBase:
if (gainedXP >= baseXP && gainedXP < baseXP * 3)
level = 1;
else
level = (int)Math.Floor((double)(gainedXP - baseXP) / baseXP);
break;
}
if (level > maxLevel)
level = maxLevel;
return level;
}
}
}