C#:
```csharp
case 19418:
{
try
{
ItemInstance specialistInstance1 = Session.Character.Inventory.LoadBySlotAndType((byte)EquipmentType.Sp, InventoryType.Wear);
if (specialistInstance1 != null)
{
short[] upsuccess = { 50, 40, 30, 20, 10 };
int[] goldprice = { 5000, 10000, 20000, 50000, 100000 };
byte[] stoneprice = { 1, 2, 3, 4, 5 };
short stonevnum;
byte upmode = 1;
short SpDamage = 0;
short SpDefence = 0;
short SpElement = 0;
short SpHP = 0;
short SpFire = 0;
short SpWater = 0;
short SpLight = 0;
short SpDark = 0;
short Fallimenti = 0;
short Successi = 0;
switch (specialistInstance1.Item.Morph)
{
case 2:
case 6:
case 9:
case 12:
stonevnum = 2514;
break;
case 3:
case 4:
case 14:
stonevnum = 2515;
break;
case 5:
case 11:
case 15:
stonevnum = 2516;
break;
case 10:
case 13:
case 7:
stonevnum = 2517;
break;
case 17:
case 18:
case 19:
stonevnum = 2518;
break;
case 20:
case 21:
case 22:
stonevnum = 2519;
break;
case 23:
case 24:
case 25:
stonevnum = 2520;
break;
case 26:
case 27:
case 28:
stonevnum = 2521;
break;
default:
return;
}
while (Session.Character.Inventory.CountItem(stonevnum) > 0)
{
if (specialistInstance1.SpStoneUpgrade > 99)
{
break;
}
if (specialistInstance1.SpStoneUpgrade > 80)
{
upmode = 5;
}
else if (specialistInstance1.SpStoneUpgrade > 60)
{
upmode = 4;
}
else if (specialistInstance1.SpStoneUpgrade > 40)
{
upmode = 3;
}
else if (specialistInstance1.SpStoneUpgrade > 20)
{
upmode = 2;
}
if (Session.Character.Gold < goldprice[upmode - 1])
{
break;
}
if (Session.Character.Inventory.CountItem(stonevnum) < stoneprice[upmode - 1])
{
break;
}
int rnd = ServerManager.RandomNumber();
if (rnd < upsuccess[upmode - 1])
{
byte type = (byte)ServerManager.RandomNumber(0, 16), count = 1;
if (upmode == 4)
{
count = 2;
}
if (upmode == 5)
{
count = (byte)ServerManager.RandomNumber(3, 6);
}
if (type < 3)
{
specialistInstance1.SpDamage += count;
SpDamage += count;
}
else if (type < 6)
{
specialistInstance1.SpDefence += count;
SpDefence += count;
}
else if (type < 9)
{
specialistInstance1.SpElement += count;
SpElement += count;
}
else if (type < 12)
{
specialistInstance1.SpHP += count;
SpHP += count;
}
else if (type == 12)
{
specialistInstance1.SpFire += count;
SpFire += count;
}
else if (type == 13)
{
specialistInstance1.SpWater += count;
SpWater += count;
}
else if (type == 14)
{
specialistInstance1.SpLight += count;
SpLight += count;
}
else if (type == 15)
{
specialistInstance1.SpDark += count;
SpDark += count;
}
specialistInstance1.SpStoneUpgrade++;
Successi++;
}
else
{
Fallimenti++;
}
Session.SendPacket(specialistInstance1.GenerateInventoryAdd());
Session.Character.Gold -= goldprice[upmode - 1];
Session.SendPacket(Session.Character.GenerateGold());
Session.Character.Inventory.RemoveItemAmount(stonevnum, stoneprice[upmode - 1]);
}
if (Successi > 0 || Fallimenti > 0)
{
Session.CurrentMapInstance.Broadcast(StaticPacketHelper.GenerateEff(UserType.Player, Session.Character.CharacterId, 3005), Session.Character.MapX, Session.Character.MapY);
Session.SendPacket(Session.Character.GenerateSay("---------------Perfection Status---------------", 11));
Session.SendPacket(Session.Character.GenerateSay("Succès: " + Successi, 11));
Session.SendPacket(Session.Character.GenerateSay("Fails: " + Fallimenti, 11));
Session.SendPacket(Session.Character.GenerateSay("Attaque: " + SpDamage, 11));
Session.SendPacket(Session.Character.GenerateSay("Défense: " + SpDefence, 11));
Session.SendPacket(Session.Character.GenerateSay("HP: " + SpHP, 11));
Session.SendPacket(Session.Character.GenerateSay("Element " + SpElement, 11));
Session.SendPacket(Session.Character.GenerateSay("Feu: " + SpFire, 11));
Session.SendPacket(Session.Character.GenerateSay("Eau: " + SpWater, 11));
Session.SendPacket(Session.Character.GenerateSay("Lumière: " + SpLight, 11));
Session.SendPacket(Session.Character.GenerateSay("Obscure: " + SpDark, 11));
Session.SendPacket(Session.Character.GenerateSay("-----------------------------------------------", 11));
}
else
{
Session.SendPacket(Session.Character.GenerateSay("NOT_ENOUGH_ITEM", 10));
}
}
else
{
Session.SendPacket(Session.Character.GenerateSay("WEAR_SP", 10));
}
}
catch (Exception ex)
{
Logger.Error(ex);
}
}
break;
```