Upgrade Quality Calculation

11/30/2013 16:51 TaiZer#1
Hello epvp.

With the forging interface in the latest patches I made a calculation for the upgrading quality wich give the same calculations as the client.
If you use it, you will have to adapt it to your source.
I hope this will help someone.

Code:
        public static bool UpgradeQuality(ItemInfo Item, List<ItemInfo> Items)
        {
            if (Item.IsWeapon)
            {
                ItemType Data;
                if (!Kernel.ItemTypes.TryGetValue(Item.ItemID + 1, out Data))
                    return false;
                if (Item.ItemData.RequiredLevel == 1)
                    return false;
                if (Data.RequiredLevel < 120)
                {
                    double Chance = 0;
                    double Percentage = 100;
                    switch (Item.ItemID % 10)
                    {
                        case 9://SUPER
                            return false;
                        case 8://ELITE
                            Percentage = 20;
                            if (Item.ItemData.RequiredLevel <= 70)
                                Percentage = 20;
                            else
                                for (int i = 70; i < Data.RequiredLevel; i += 5)
                                    Percentage -= 1;
                            break;
                        case 7://UNIQUE
                            Percentage = 33;
                            if (Item.ItemData.RequiredLevel <= 70)
                                Percentage = 33;
                            else
                                for (int i = 70; i < Data.RequiredLevel; i += 5)
                                    Percentage -= 2;
                            break;
                        case 6://REFINED
                            Percentage = 50;
                            if (Item.ItemData.RequiredLevel <= 70)
                                Percentage = 100;
                            else
                                for (int i = 70; i < Data.RequiredLevel; i += 5)
                                    Percentage -= 2.5;
                            break;
                        default://NORMAL
                            Percentage = 100;
                            if (Item.ItemData.RequiredLevel <= 70)
                                Percentage = 100;
                            else
                                for (int i = 70; i < Data.RequiredLevel; i += 5)
                                    Percentage -= 5;
                            break;
                    }
                    foreach (var DragonBall in Items)
                    {
                        if (DragonBall.ItemID == 720028)//DB_SCROLL
                            Chance += Percentage * 10;
                        else if (DragonBall.ItemID == 1088000)//DRAGONBALL
                            Chance += Percentage;
                    }
                    return Calculations.PercentSuccess(Chance);
                }
                else
                {
                    double Chance = 0;
                    double Percentage = 0;
                    switch (Item.ItemID % 10)
                    {
                        case 9://SUPER
                            return false;
                        case 8://ELITE
                            Percentage = 10;
                            for (int i = 120; i < Data.RequiredLevel; i += 1)
                                Percentage -= 0.2;
                            break;
                        case 7://UNIQUE
                            Percentage = 16;
                            for (int i = 120; i < Data.RequiredLevel; i += 1)
                                Percentage -= 0.4;
                            break;
                        case 6://REFINED
                            Percentage = 25;
                            for (int i = 120; i < Data.RequiredLevel; i += 1)
                                Percentage -= 0.5;
                            break;
                        default://NORMAL
                            Percentage = 50;
                            for (int i = 120; i < Data.RequiredLevel; i += 1)
                                Percentage -= 1;
                            break;
                    }
                    foreach (var DragonBall in Items)
                    {
                        if (DragonBall.ItemID == 720028)//DB_SCROLL
                            Chance += ((100 / Percentage) * 10);
                        else if (DragonBall.ItemID == 1088000)//DRAGONBALL
                            Chance += (100 / Percentage);
                    }
                    return Calculations.PercentSuccess(Chance);
                }
            }
            return false;
        }
Here is a screen of the interface if you don't see what is it:

[Only registered and activated users can see links. Click Here To Register...]
11/30/2013 17:19 pro4never#2
for (int i = 70; i < Data.RequiredLevel; i += 5)
Percentage -= 2.5;


why are you looping instead of doing simple math?

This entire script could be collapsed down a TON with a bit of logical thinking tbh.

Example...
Code:
double chance = 0;
//Get initial chance
switch(Item.ItemID % 10)
{
	case 9:
		return false;
	case 8:
		chance = Data.RequiredLevel < 120 ? 20 : 10;
		break;
	case 7:
		chance = Data.RequiredLevel < 120 ? 33 : 16;
		break;
	case 6:
		chance = Data.RequiredLevel < 120 ? 50 : 25;
		break;
	case 5:
		chance = Data.RequiredLevel < 120 ? 100 : 50;
		break;
}


//Adjust by item level
if(Data.RequiredLevel > 120)
	switch(Item.ItemID % 10)
	{
		case 8:
			chance -= Data.RequiredLevel - 120;
			break;
		case 7:
			chance -= (Data.RequiredLevel - 120) * 2;
			break;
		case 6:
			chance -= (Data.RequiredLevel - 120) * 2.5;
			break;
		case 5:
			chance -= (Data.RequiredLevel - 120) * 5;
			break;
	}

else if(Data.RequiredLevel > 70)
	switch(Item.ItemID % 10)
	{
		case 8:
			chance -= (Data.RequiredLevel - 70) / 5 * .2;
			break;
		case 7:
			chance -= (Data.RequiredLevel - 70) / 5 * .4;
			break;
		case 6:
			chance -= (Data.RequiredLevel - 70) / 5 * .5;
			break;
		case 5:
			chance -= (Data.RequiredLevel - 70) / 5;
			break;
	}
Tada! You now have your chance to upgrade and can use it any way you like.