Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Item Convert from main.exe (Source)

Newbie Spellweaver
Joined
Oct 3, 2009
Messages
33
Reaction score
25
From this function you can change view of level/stat requirement, additional/excellent/luck options, etc on item
1.04d gmo

.h
Code:
#pragma pack(push, 1)
typedef struct	//-> Complete (size: 107)
{
/*+0*/		WORD	m_Type;
/*+2*/		int		m_Level;
/*+6*/		BYTE	Unknown6;
/*+7*/		BYTE	Unknown7;
/*+8*/		BYTE	Unknown8;
/*+9*/		WORD	DamageMin;
/*+11*/		WORD	DamageMax;
/*+13*/		BYTE	Unknown13;
/*+14*/		WORD	Defense;
/*+16*/		WORD	MagicDefense;
/*+18*/		BYTE	MagicDamage;
/*+19*/		BYTE	Unknown19;
/*+20*/		WORD	Unknown20;
/*+22*/		BYTE	Durability;
/*+23*/		BYTE	ExcellentOption;
/*+24*/		BYTE	AncientOption;
/*+25*/		WORD	ReqStrenght;
/*+27*/		WORD	ReqDextirity;
/*+29*/		WORD	ReqEnergy;
/*+31*/		WORD	ReqVitality;
/*+33*/		WORD	ReqCommand;
/*+35*/		WORD	ReqLevel;
/*+37*/		BYTE    SpecialCount;
/*+38*/		WORD	SpecialType[8];
/*+54*/		BYTE	SpecialValue[8];
/*+62*/		int		UniqueID;
/*+66*/		BYTE	Unknown66;
/*+67*/		BYTE 	PosX;
/*+68*/		BYTE 	PosY;
/*+69*/		WORD 	HarmonyType;
/*+71*/		WORD	HarmonyValue;
/*+73*/		BYTE 	Is380Item;
/*+74*/		BYTE	SocketOption[5];
/*+79*/		BYTE	Unknown79;
/*+80*/		BYTE	SocketSeedIndex[5];
/*+85*/		BYTE	SocketSphereLevel[5];
/*+90*/		BYTE	SocketSet;
BYTE gap01[5];
/*+96*/		BYTE	DurabilityState;
/*+97*/		BYTE 	PeriodItem;
/*+98*/		BYTE 	ExpiredItem;
/*+99*/		int		ExpireDateConvert;
/*+103*/	int		Unknown103;
} ObjectItem, * lpItemObj;
#pragma pack(pop)
.cpp
Code:
#define sub_4F9B50 ((char(*) (int a1, int a2)) 0x4F9B50)

char sub_58B8D0(signed int a1)
{
	if ( (a1 >= ITEM(2,8) && a1 <= ITEM(2,15))
		|| a1 == ITEM(2,17)
		|| a1 == ITEM(2,18)
		|| a1 == ITEM(2,21) )
		return TRUE;

	return FALSE;
}

char sub_5C9370(signed int a1, int a2)
{
	BYTE result = FALSE;

	int v2 = (a2 + a1) % 512;

	if ( a1 >= ITEM(7,0) && a1 <= ITEM(12,0) && v2 >= 62 && v2 <= 72 )
		result = TRUE;

	return result;
}

char gObjItemConvert(lpItemObj CItem, BYTE a2, BYTE a3, BYTE a4)
{
	int *v4; // eax@439
	int v6; // [sp+14h] [bp-68h]@156
	int v10; // [sp+2Ch] [bp-50h]@115
	int v11; // [sp+34h] [bp-48h]@89
	int v12; // [sp+3Ch] [bp-40h]@73
	int v13; // [sp+44h] [bp-38h]@55
	int v14; // [sp+4Ch] [bp-30h]@37
	int v16; // [sp+54h] [bp-28h]@1
	int v20; // [sp+64h] [bp-18h]@165
	int v21; // [sp+68h] [bp-14h]@1
	char v22; // [sp+6Fh] [bp-Dh]@1
	int v24; // [sp+74h] [bp-8h]@1
	int v25; // [sp+78h] [bp-4h]@22

	CItem->Level = a2;
	v24 = (a2 >> 3) & 0xF;
	v16 = a3 & 0x3F;
	v21 = a3 & 0x3F;
	v22 = 0;

	if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6))
		|| (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
		|| (CItem->m_Type >= ITEM(12,42) && CItem->m_Type <= ITEM(12,43))
		|| CItem->m_Type == ITEM(0,19)
		|| CItem->m_Type == 2066
		|| CItem->m_Type == 2570
		|| CItem->m_Type == 1037
		|| CItem->m_Type == ITEM(13,30)
		|| (CItem->m_Type >= 6274 && CItem->m_Type <= 6278)
		|| (CItem->m_Type >= ITEM(12,49) && CItem->m_Type <= ITEM(12,50)) // RF capes
		|| CItem->m_Type == 6279
		|| CItem->m_Type == 2596 )
		v16 = 0;

	if ( a4 % 4 == 1 || a4 % 4 == 2 )
	{
		v16 = 1;
		v22 = 1;
	}

	v25 = *(int*)0x8128AC0 + 84 * CItem->m_Type;
	CItem->Unknown8 = *(BYTE *)(v25 + 30);
	CItem->Unknown19 = *(BYTE *)(v25 + 45);
	CItem->DamageMin = *(BYTE *)(v25 + 40);
	CItem->DamageMax = *(BYTE *)(v25 + 41);
	CItem->Unknown13 = *(BYTE *)(v25 + 42);
	CItem->Defense = *(BYTE *)(v25 + 43);
	CItem->MagicDefense = *(BYTE *)(v25 + 44);
	CItem->Unknown20 = *(BYTE *)(v25 + 46);
	CItem->Unknown18 = *(BYTE *)(v25 + 49);
	int v17 = *(WORD *)(v25 + 32) + 30;
	
	int damage = 0;
	switch ( CItem->m_Type )
	{
		case 0x406:
		damage = 15;
		break;
		case 0x806:
		damage = 30;
		break;
		case 0xA07:
		damage = 25;
		break;
	}
	//MIN DAMAGE
	if ( *(BYTE *)(v25 + 40) > 0 )
	{
		if ( v16 > 0 )
		{
			if ( *(WORD *)(v25 + 32) )
			{
				if ( damage )
					CItem->DamageMin += damage;
				else
					CItem->DamageMin += 25 * *(BYTE *)(v25 + 40) / *(WORD *)(v25 + 32) + 5;
			}
		}

		if ( v22 )
			CItem->DamageMin += v17 / 40 + 5;
		if ( v24 <= 9 )
			v14 = (a2 >> 3) & 0xF;
		else
			v14 = 9;
		CItem->DamageMin += 3 * v14;

		switch ( v24 )
		{
			case 15:
			CItem->DamageMin += 9;
			goto LABEL_41;
			case 14:
			LABEL_41:
			CItem->DamageMin += 8;
			goto LABEL_42;
			case 13:
			LABEL_42:
			CItem->DamageMin += 7;
			goto LABEL_43;
			case 12:
			LABEL_43:
			CItem->DamageMin += 6;
			goto LABEL_44;
			case 11:
			LABEL_44:
			CItem->DamageMin += 5;
			goto LABEL_45;
			case 10:
			LABEL_45:
			CItem->DamageMin += 4;
			break;
			default:
			break;
		}
	}
	// MAX DAMAGE
	if ( *(BYTE *)(v25 + 41) > 0 )
	{
		if ( v16 > 0 )
		{
			if ( *(WORD *)(v25 + 32) )
			{
				if ( damage )
					CItem->DamageMax += damage;
				else
					CItem->DamageMax += 25 * *(BYTE *)(v25 + 40) / *(WORD *)(v25 + 32) + 5;
			}
		}

		if ( v22 )
			CItem->DamageMax += v17 / 40 + 5;
		if ( v24 <= 9 )
			v13 = (a2 >> 3) & 0xF;
		else
			v13 = 9;
		CItem->DamageMax += 3 * v13;

		switch ( v24 )
		{
			case 15:
			CItem->DamageMax += 9;
			goto LABEL_59;
			case 14:
			LABEL_59:
			CItem->DamageMax += 8;
			goto LABEL_60;
			case 13:
			LABEL_60:
			CItem->DamageMax += 7;
			goto LABEL_61;
			case 12:
			LABEL_61:
			CItem->DamageMax += 6;
			goto LABEL_62;
			case 11:
			LABEL_62:
			CItem->DamageMax += 5;
			goto LABEL_63;
			case 10:
			LABEL_63:
			CItem->DamageMax += 4;
			break;
			default:
			break;
		}
	}
	// DAMAGE ?
	if ( *(BYTE *)(v25 + 49) > 0 )
	{
		if ( v16 > 0 )
		{
			if ( *(WORD *)(v25 + 32) )
			{
				if ( damage )
					CItem->Unknown18 += damage;
				else
					CItem->Unknown18 += 25 * *(BYTE *)(v25 + 49) / *(WORD *)(v25 + 32) + 5;
			}
		}

		if ( v22 )
			CItem->Unknown18 += v17 / 60 + 2;
		if ( v24 <= 9 )
			v12 = (a2 >> 3) & 0xF;
		else
			v12 = 9;
		CItem->Unknown18 += 3 * v12;

		switch ( v24 )
		{
			case 15:
			CItem->Unknown18 += 9;
			goto LABEL_77;
			case 14:
			LABEL_77:
			CItem->Unknown18 += 8;
			goto LABEL_78;
			case 13:
			LABEL_78:
			CItem->Unknown18 += 7;
			goto LABEL_79;
			case 12:
			LABEL_79:
			CItem->Unknown18 += 6;
			goto LABEL_80;
			case 11:
			LABEL_80:
			CItem->Unknown18 += 5;
			goto LABEL_81;
			case 10:
			LABEL_81:
			CItem->Unknown18 += 4;
			break;
			default:
			break;
		}

		CItem->Unknown18 >>= 1;
		if ( !sub_58B8D0(CItem->m_Type) )
			CItem->Unknown18 += 2 * v24;
	}
	//
	if ( *(BYTE *)(v25 + 42) > 0 )
	{
		if ( v16 > 0 )
		{
			if ( *(WORD *)(v25 + 32) )
				CItem->Unknown13 += 25 * *(BYTE *)(v25 + 42) / *(WORD *)(v25 + 32) + 5;
		}

		if ( v24 <= 9 )
			v11 = (a2 >> 3) & 0xF;
		else
			v11 = 9;
		CItem->Unknown13 += 3 * v11;

		switch ( v24 )
		{
			case 15:
			CItem->Unknown13 += 9;
			goto LABEL_93;
			case 14:
			LABEL_93:
			CItem->Unknown13 += 8;
			goto LABEL_94;
			case 13:
			LABEL_94:
			CItem->Unknown13 += 7;
			goto LABEL_95;
			case 12:
			LABEL_95:
			CItem->Unknown13 += 6;
			goto LABEL_96;
			case 11:
			LABEL_96:
			CItem->Unknown13 += 5;
			goto LABEL_97;
			case 10:
			LABEL_97:
			CItem->Unknown13 += 4;
			break;
			default:
			break;
		}
	}
	//DEFENCE
	if ( CItem->m_Type == ITEM(13,30) )
	{
		*(BYTE *)(v25 + 43) = 15;
		CItem->Defense = 15;
	}

	if ( *(BYTE *)(v25 + 43) > 0 )
	{
		if ( CItem->m_Type >= ITEM(6,0) && CItem->m_Type < ITEM(7,0) ) // Shields
		{
			CItem->Defense += v24;
			if ( v22 )
				CItem->Defense += 20 * CItem->Defense / v17 + 2;
		}
		else
		{
			if ( v16 > 0 )
			{
				if ( *(WORD *)(v25 + 32) )
					CItem->Defense += 12 * *(BYTE *)(v25 + 43) / *(WORD *)(v25 + 32) + *(WORD *)(v25 + 32) / 5 + 4;
			}

			if ( v22 )
				CItem->Defense += 3 * CItem->Defense / v17 + v17 / 30 + 2;

			if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6))
				|| CItem->m_Type == ITEM(12,42)
				|| CItem->m_Type == ITEM(13,30)
				|| CItem->m_Type == ITEM(12,49) ) // Wings 2
			{
				if ( v24 <= 9 )
					v10 = (a2 >> 3) & 0xF;
				else
					v10 = 9;
				CItem->Defense += 2 * v10;
			}
			else if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
					|| CItem->m_Type == ITEM(12,43)
					|| CItem->m_Type == ITEM(12,50) ) // Wings 3

			{
				if ( v24 <= 9 )
					v10 = (a2 >> 3) & 0xF;
				else
					v10 = 9;
				CItem->Defense += 4 * v10;
			}
			else
			{
				if ( v24 <= 9 )
					v10 = (a2 >> 3) & 0xF;
				else
					v10 = 9;
				CItem->Defense += 3 * v10;
			}

			if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
				|| CItem->m_Type == ITEM(12,43)
				|| CItem->m_Type == ITEM(12,50) )
			{
				switch ( v24 )
				{
					case 15:
					CItem->Defense += 10;
					goto LABEL_142;
					case 14:
					LABEL_142:
					CItem->Defense += 9;
					goto LABEL_143;
					case 13:
					LABEL_143:
					CItem->Defense += 8;
					goto LABEL_144;
					case 12:
					LABEL_144:
					CItem->Defense += 7;
					goto LABEL_145;
					case 11:
					LABEL_145:
					CItem->Defense += 6;
					goto LABEL_146;
					case 10:
					LABEL_146:
					CItem->Defense += 5;
					break;
					default:
					break;
				}
			}
			else
			{
				switch ( v24 )
				{
					case 15:
					CItem->Defense += 9;
					goto LABEL_149;
					case 14:
					LABEL_149:
					CItem->Defense += 8;
					goto LABEL_150;
					case 13:
					LABEL_150:
					CItem->Defense += 7;
					goto LABEL_151;
					case 12:
					LABEL_151:
					CItem->Defense += 6;
					goto LABEL_152;
					case 11:
					LABEL_152:
					CItem->Defense += 5;
					goto LABEL_153;
					case 10:
					LABEL_153:
					CItem->Defense += 4;
					break;
					default:
					break;
				}
			}
		}
	}
	//MAGIC DEFENCE
	if ( *(BYTE *)(v25 + 44) > 0 )
	{
		if ( v24 <= 9 )
			v6 = (a2 >> 3) & 0xF;
		else
			v6 = 9;

		CItem->MagicDefense += 3 * v6;

		switch ( v24 )
		{
			case 15:
			CItem->MagicDefense += 9;
			goto LABEL_160;
			case 14:
			LABEL_160:
			CItem->MagicDefense += 8;
			goto LABEL_161;
			case 13:
			LABEL_161:
			CItem->MagicDefense += 7;
			goto LABEL_162;
			case 12:
			LABEL_162:
			CItem->MagicDefense += 6;
			goto LABEL_163;
			case 11:
			LABEL_163:
			CItem->MagicDefense += 5;
			goto LABEL_164;
			case 10:
			LABEL_164:
			CItem->MagicDefense += 4;
			break;
			default:
			break;
		}
	}
	//REQ
	v20 = *(WORD *)(v25 + 32);

	if ( v16 )
		v20 = *(WORD *)(v25 + 32) + 25;
	else if ( v22 )
		v20 = *(WORD *)(v25 + 32) + 30;

	int ReqLevel = 4;

	if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6))
		|| CItem->m_Type == ITEM(12,42) )
		ReqLevel = 5;

	if ( *(WORD *)(v25 + 60)
		&& ((CItem->m_Type >= 0 && CItem->m_Type < ITEM(12,0))
		|| CItem->m_Type == ITEM(13,37)
		|| (CItem->m_Type >= ITEM(12,7) && CItem->m_Type <= ITEM(12,40))
		|| (CItem->m_Type >= ITEM(12,43) && CItem->m_Type < ITEM(13,0) && CItem->m_Type != ITEM(12,49))) )
	{
		CItem->ReqLevel = *(WORD *)(v25 + 60);
	}
	else if ( *(WORD *)(v25 + 60)
			&& ((CItem->m_Type >= ITEM(12,0) && CItem->m_Type <= ITEM(12,7))
			|| (CItem->m_Type >= ITEM(12,41) && CItem->m_Type <= ITEM(12,42))
			|| CItem->m_Type == ITEM(12,49)
			|| CItem->m_Type >= ITEM(13,0)) )
		CItem->ReqLevel = ReqLevel * v24 + *(WORD *)(v25 + 60);
	else
		CItem->ReqLevel = 0;

	if ( *(WORD *)(v25 + 50) )
		CItem->ReqStrenght = 3 * (v20 + 3 * v24) * *(WORD *)(v25 + 50) / 100 + 20;
	else
		CItem->ReqStrenght = 0;

	if ( *(WORD *)(v25 + 52) )
		CItem->ReqDextirity = 3 * (v20 + 3 * v24) * *(WORD *)(v25 + 52) / 100 + 20;
	else
		CItem->ReqDextirity = 0;

	if ( *(WORD *)(v25 + 56) )
		CItem->ReqVitality = 3 * (v20 + 3 * v24) * *(WORD *)(v25 + 56) / 100 + 20;
	else
		CItem->ReqVitality = 0;

	if ( *(WORD *)(v25 + 54) )
	{
		if ( (CItem->m_Type < 2581 || CItem->m_Type > 2589) && CItem->m_Type != 2600 )
		{
			if ( *(WORD *)(v25 + 60) <= 0 || CItem->m_Type < 7680 || CItem->m_Type >= 8192 )
				CItem->ReqEnergy = 4 * (v20 + 3 * v24) * *(WORD *)(v25 + 54) / 100 + 20;
			else
				CItem->ReqEnergy = 4 * *(WORD *)(v25 + 60) * *(WORD *)(v25 + 54) / 100 + 20;
		}
		else
		{
		CItem->ReqEnergy = 3 * (v24 + v20) * *(WORD *)(v25 + 54) / 100 + 20;
		}
	}
	else
	{
		CItem->ReqEnergy = 0;
	}

	if ( *(WORD *)(v25 + 58) )
		CItem->ReqCommand = 3 * (v20 + 3 * v24) * *(WORD *)(v25 + 58) / 100 + 20;
	else
		CItem->ReqCommand = 0;

	if ( CItem->m_Type == 6155 )
	{
		int ReqEnergy = 0;
		switch ( v24 )
		{
			case 0:
			ReqEnergy = 30;
			break;
			case 1:
			ReqEnergy = 60;
			break;
			case 2:
			ReqEnergy = 90;
			break;
			case 3:
			ReqEnergy = 130;
			break;
			case 4:
			ReqEnergy = 170;
			break;
			case 5:
			ReqEnergy = 210;
			break;
			case 6:
			ReqEnergy = 300;
			break;
			default:
			break;
		}
		CItem->ReqEnergy = ReqEnergy;
	}

	if ( *(WORD *)(v25 + 58) )
	{
		if ( CItem->m_Type == 7832 )
			CItem->ReqCommand = 15 * *(WORD *)(v25 + 58) + 185;
		else
			CItem->ReqCommand = *(WORD *)(v25 + 58);
	}

	if ( CItem->m_Type == 6666 )
	{
		if ( v24 > 2 )
			CItem->ReqLevel = 50;
		else
			CItem->ReqLevel = 20;
	}

	if ( (CItem->m_Type >= 3613 && CItem->m_Type <= 3617)
		|| (CItem->m_Type >= 4125 && CItem->m_Type <= 4129)
		|| (CItem->m_Type >= 4637 && CItem->m_Type <= 4641)
		|| (CItem->m_Type >= 5149 && CItem->m_Type <= 5153)
		|| (CItem->m_Type >= 5661 && CItem->m_Type <= 5665)
		|| CItem->m_Type == 22
		|| CItem->m_Type == 23
		|| CItem->m_Type == 2572
		|| CItem->m_Type == 2069
		|| CItem->m_Type == 1038
		|| CItem->m_Type == 2579
		|| CItem->m_Type == 3627
		|| CItem->m_Type == 4139
		|| CItem->m_Type == 4651
		|| CItem->m_Type == 5163
		|| CItem->m_Type == 5675
		|| sub_5C9370(CItem->m_Type, 0) )
		v16 = 0;

	if ( v16 > 0 )
	{
		if ( CItem->ReqLevel > 0 )
		{
			if ( CItem->m_Type != ITEM(13,37) )
				CItem->ReqLevel += 20;
		}
	}

	CItem->SpecialCount = 0;
	// WINGS EXCELLENT
	if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6)) // Wings 2
		|| CItem->m_Type == ITEM(12,42) )
	{
		if ( v21 & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 50;
			CItem->SpecialType[CItem->SpecialCount++] = 101;
		}
		if ( (v21 >> 1) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 50;
			CItem->SpecialType[CItem->SpecialCount++] = 102;
		}
		if ( (v21 >> 2) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 3;
			CItem->SpecialType[CItem->SpecialCount++] = 103;
		}
		if ( (v21 >> 3) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 50;
			CItem->SpecialType[CItem->SpecialCount++] = 104;
		}
		if ( (v21 >> 4) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 98;
		}
	}
	else if ( CItem->m_Type == ITEM(13,30) || CItem->m_Type == ITEM(12,49) ) // RF DL Capes 1
	{
		if ( v21 & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 50;
			CItem->SpecialType[CItem->SpecialCount++] = 101;
		}
		if ( (v21 >> 1) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 50;
			CItem->SpecialType[CItem->SpecialCount++] = 102;
		}
		if ( (v21 >> 2) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 3;
			CItem->SpecialType[CItem->SpecialCount++] = 103;
		}
		if ( (v21 >> 3) & 1 )
		{
			if ( CItem->m_Type != ITEM(12,49) )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 10;
				CItem->SpecialType[CItem->SpecialCount++] = 172;
			}
		}
	}
	else if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
			|| CItem->m_Type == ITEM(12,43)
			|| CItem->m_Type == ITEM(12,50) ) // Wings 3
	{
		if ( v21 & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 103;
		}
		if ( (v21 >> 1) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 106;
		}
		if ( (v21 >> 2) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 107;
		}
		if ( (v21 >> 3) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 108;
		}
	}
	//??
	if ( (a2 >> 7) & 1 )
	{
		if ( *(WORD *)(v25 + 36) )
			CItem->SpecialType[CItem->SpecialCount++] = *(WORD *)(v25 + 36);
	}
	//LUCK
	if ( (a2 >> 2) & 1 )
	{
		if ( (CItem->m_Type >= 0 && CItem->m_Type < ITEM(12,0))
			&& CItem->m_Type != ITEM(4,7)
			&& CItem->m_Type != ITEM(4,15) )
			CItem->SpecialType[CItem->SpecialCount++] = 85;

		if ( (CItem->m_Type >= ITEM(12,0) && CItem->m_Type <= ITEM(12,6))
			|| (CItem->m_Type >= ITEM(12,41) && CItem->m_Type <= ITEM(12,42)) )
			CItem->SpecialType[CItem->SpecialCount++] = 85;

		if ( CItem->m_Type == ITEM(13,30) || CItem->m_Type == ITEM(12,49) )
			CItem->SpecialType[CItem->SpecialCount++] = 85;

		if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
			|| CItem->m_Type == ITEM(12,43)
			|| CItem->m_Type == ITEM(12,50) )
			CItem->SpecialType[CItem->SpecialCount++] = 85;
	}
	// ADD OPTION
	int add = (a2 & 3) + 4 * ((a3 & 0x40) >> 6);

	if ( add )
	{
		if ( CItem->m_Type == ITEM(13,3) )
		{
			if ( add & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 5;
				CItem->SpecialType[CItem->SpecialCount++] = 105;
			}
			if ( (add >> 1) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 50;
				CItem->SpecialType[CItem->SpecialCount++] = 104;
			}
			if ( (add >> 2) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 5;
				CItem->SpecialType[CItem->SpecialCount++] = 98;
			}
		}
		else
		{
			if ( (CItem->m_Type >= 0 && CItem->m_Type < ITEM(5,0)) // Weapon
				&& CItem->m_Type != ITEM(4,7)
				&& CItem->m_Type != ITEM(4,15) )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
				CItem->SpecialType[CItem->SpecialCount++] = 80;
				CItem->ReqStrenght += 5 * add;
			}

			if ( CItem->m_Type >= ITEM(5,0) && CItem->m_Type < ITEM(6,0) ) // Staff
			{
				CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
				if ( (CItem->m_Type < 2581 || CItem->m_Type > 2589) && CItem->m_Type != 2600 )
					CItem->SpecialType[CItem->SpecialCount] = 81;
				else
					CItem->SpecialType[CItem->SpecialCount] = 82;
				++CItem->SpecialCount;
				CItem->ReqStrenght += 5 * add;
			}

			if ( CItem->m_Type >= ITEM(6,0) && CItem->m_Type < ITEM(7,0) ) // Shield
			{
				CItem->SpecialValue[CItem->SpecialCount] = 5 * add;
				CItem->SpecialType[CItem->SpecialCount++] = 83;
				CItem->ReqStrenght += 5 * add;
			}

			if ( CItem->m_Type >= ITEM(7,0) && CItem->m_Type < ITEM(12,0) ) // Sets
			{
				CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
				CItem->SpecialType[CItem->SpecialCount++] = 84;
				CItem->ReqStrenght += 5 * add;
			}

			if ( (CItem->m_Type >= ITEM(13,8) && CItem->m_Type < ITEM(14,0))
				&& CItem->m_Type != ITEM(13,30) ) // Rings Pendant
			{
				if ( CItem->m_Type == ITEM(13,24) )
				{
					CItem->SpecialValue[CItem->SpecialCount] = add;
					CItem->SpecialType[CItem->SpecialCount++] = 204;
				}
				else if ( CItem->m_Type == ITEM(13,28) )
				{
					CItem->SpecialValue[CItem->SpecialCount] = add;
					CItem->SpecialType[CItem->SpecialCount++] = 205;
				}
				else
				{
					CItem->SpecialValue[CItem->SpecialCount] = add;
					CItem->SpecialType[CItem->SpecialCount++] = 86;
				}
			}

			switch ( CItem->m_Type ) // Other
			{
				case ITEM(12,0):
					CItem->SpecialValue[CItem->SpecialCount] = add;
					CItem->SpecialType[CItem->SpecialCount++] = 86;
				break;
				case ITEM(12,1):
				case ITEM(12,41):
					CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
					CItem->SpecialType[CItem->SpecialCount++] = 81;
				break;
				case ITEM(12,2):
					CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
					CItem->SpecialType[CItem->SpecialCount++] = 80;
				break;
				case ITEM(12,3):
					if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
				break;
				case ITEM(12,4):
					if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,5):
					if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,6):
					if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
				break;
				case ITEM(13,30): // DL Cape 1
					CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
					CItem->SpecialType[CItem->SpecialCount++] = 80;
				break;
				case ITEM(12,49): // RF Cape 1
					if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,42):
					CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
					if ( (v21 >> 5) & 1 )
						CItem->SpecialType[CItem->SpecialCount] = 81;
					else
						CItem->SpecialType[CItem->SpecialCount] = 82;
					++CItem->SpecialCount;
				break;
				case ITEM(12,36):
					if ( (v21 >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 84;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,37):
					if ( (v21 >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
					else if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 84;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,38):
					if ( (v21 >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 84;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,39):
					if ( (v21 >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,40): // DL Cape 2
				case ITEM(12,50): // RF Cape 2
					if ( (v21 >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 84;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				case ITEM(12,43): // SUM Wings 3
					if ( (v21 >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
					else if ( (v21 >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 82;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
			}
		}
	}
	// ----

	if ( CItem->m_Type == 6660 )
	{
		v4 = sub_4F9930(*(int*)CItem);
		sub_4F9B50(*(int*)CItem, *v4);
	}

	// SHIELDS/SETS/RINGS EXCELLENT
	if ( (CItem->m_Type >= ITEM(6,0) && CItem->m_Type < ITEM(12,0))
		|| (CItem->m_Type >= ITEM(13,8) && CItem->m_Type <= ITEM(13,9))
		|| (CItem->m_Type >= ITEM(13,21) && CItem->m_Type <= ITEM(13,24)) )
	{
		if ( (a3 >> 5) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 87;
		if ( (a3 >> 4) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 88;
		if ( (a3 >> 3) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 89;
		if ( (a3 >> 2) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 90;
		if ( (a3 >> 1) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 91;
		if ( a3 & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 92;
	}

	// WEAPON/PENDANTS EXCELLENT
	if ( CItem->m_Type >= 0 && CItem->m_Type < ITEM(6,0)
		|| CItem->m_Type >= ITEM(13,12) && CItem->m_Type <= ITEM(13,13)
		|| CItem->m_Type >= ITEM(13,25) && CItem->m_Type <= ITEM(13,28) )
	{
		if ( (a3 >> 5) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 93;

		if ( (CItem->m_Type >= ITEM(5,0) && CItem->m_Type < ITEM(6,0))
			|| CItem->m_Type == 6668
			|| CItem->m_Type == 6681
			|| CItem->m_Type == 6683 )
		{
			if ( (a3 >> 4) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = *(WORD *)(0x8128AC8 + 14) / 20;
				CItem->SpecialType[CItem->SpecialCount++] = 96;
			}
			if ( (a3 >> 3) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 2;
				CItem->SpecialType[CItem->SpecialCount++] = 97;
			}
		}
		else
		{
			if ( (a3 >> 4) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = *(WORD *)(0x8128AC8 + 14) / 20;
				CItem->SpecialType[CItem->SpecialCount++] = 94;
			}
			if ( (a3 >> 3) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 2;
				CItem->SpecialType[CItem->SpecialCount++] = 95;
			}
		}

		if ( (a3 >> 2) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 7;
			CItem->SpecialType[CItem->SpecialCount++] = 98;
		}

		if ( (a3 >> 1) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 99;
		if ( a3 & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 100;
	}

	if ( CItem->m_Type == ITEM(13,20) ) // Wizard ring
	{
		if ( v24 )
		{
			if ( v24 == 3 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 10;
				CItem->SpecialType[CItem->SpecialCount++] = 97;
				CItem->SpecialValue[CItem->SpecialCount] = 10;
				CItem->SpecialType[CItem->SpecialCount++] = 95;
				CItem->SpecialValue[CItem->SpecialCount] = 10;
				CItem->SpecialType[CItem->SpecialCount++] = 98;
			}
		}
		else
		{
			CItem->SpecialValue[CItem->SpecialCount] = 10;
			CItem->SpecialType[CItem->SpecialCount++] = 97;
			CItem->SpecialValue[CItem->SpecialCount] = 10;
			CItem->SpecialType[CItem->SpecialCount++] = 95;
			CItem->SpecialValue[CItem->SpecialCount] = 10;
			CItem->SpecialType[CItem->SpecialCount++] = 98;
		}
	}

	if ( CItem->m_Type == ITEM(13,107) ) // Lethal Wizard's Ring
	{
		CItem->SpecialValue[CItem->SpecialCount] = 15;
		CItem->SpecialType[CItem->SpecialCount++] = 97;
		CItem->SpecialValue[CItem->SpecialCount] = 15;
		CItem->SpecialType[CItem->SpecialCount++] = 95;
		CItem->SpecialValue[CItem->SpecialCount] = 10;
		CItem->SpecialType[CItem->SpecialCount++] = 98;
	}

	char result = *(BYTE *)(0x8128AC0 + 84 * CItem->m_Type + 34);
	CItem->Unknown6 = result;
	return result;
}

Local calls from 0058B77E, 005C7833, 005C7D71, 005C7F1B, 005C80BE, 007E216A
 
Last edited:
Newbie Spellweaver
Joined
Oct 3, 2009
Messages
33
Reaction score
25
screen shot ?
additional/excellent/luck options added through this function
02pSAM8 - Item Convert from main.exe (Source) - RaGEZONE Forums


Changed the name of the variables for a better understanding
If bugs appear, use the function from the first post
Code:
char gObjItemConvert(lpItemObj CItem, BYTE a2, BYTE a3, BYTE ItemAncient)
{
	CItem->m_Level = a2;
	int Level = (a2 >> 3) & 0xF;
	int IFExcellent = a3 & 0x3F;
	int Excellent = a3 & 0x3F;
	char Ancient = 0;

	if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6))
		|| (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
		|| (CItem->m_Type >= ITEM(12,42) && CItem->m_Type <= ITEM(12,43))
		|| CItem->m_Type == ITEM(0,19)
		|| CItem->m_Type == 2066
		|| CItem->m_Type == 2570
		|| CItem->m_Type == 1037
		|| CItem->m_Type == ITEM(13,30)
		|| (CItem->m_Type >= 6274 && CItem->m_Type <= 6278)
		|| (CItem->m_Type >= ITEM(12,49) && CItem->m_Type <= ITEM(12,50)) // RF capes
		|| CItem->m_Type == 6279
		|| CItem->m_Type == 2596 )
		IFExcellent = 0;

	if ( ItemAncient % 4 == 1 || ItemAncient % 4 == 2 )
	{
		IFExcellent = 1;
		Ancient = 1;
	}

	int ItemAttribute = *(int*)0x8128AC0 + 84 * CItem->m_Type;
	CItem->Unknown8 = *(BYTE *)(ItemAttribute + 30);
	CItem->Unknown19 = *(BYTE *)(ItemAttribute + 45);
	CItem->DamageMin = *(BYTE *)(ItemAttribute + 40);
	CItem->DamageMax = *(BYTE *)(ItemAttribute + 41);
	CItem->Unknown13 = *(BYTE *)(ItemAttribute + 42);
	CItem->Defense = *(BYTE *)(ItemAttribute + 43);
	CItem->MagicDefense = *(BYTE *)(ItemAttribute + 44);
	CItem->Unknown20 = *(BYTE *)(ItemAttribute + 46);
	CItem->MagicDamage = *(BYTE *)(ItemAttribute + 49);
	int ItemLevel = *(WORD *)(ItemAttribute + 32) + 30;
	
	int damage = 0;
	switch ( CItem->m_Type )
	{
		case 0x406:
		damage = 15;
		break;
		case 0x806:
		damage = 30;
		break;
		case 0xA07:
		damage = 25;
		break;
	}
	//MIN DAMAGE
	if ( *(BYTE *)(ItemAttribute + 40) > 0 )
	{
		if ( IFExcellent > 0 && *(WORD *)(ItemAttribute + 32) )
		{
			if ( damage )
				CItem->DamageMin += damage;
			else
				CItem->DamageMin += 25 * *(BYTE *)(ItemAttribute + 40) / *(WORD *)(ItemAttribute + 32) + 5;
		}

		if ( Ancient )
			CItem->DamageMin += ItemLevel / 40 + 5;

		if ( Level <= 9 )
			CItem->DamageMin += 3 * Level;
		else
			CItem->DamageMin += 3 * 9;

		switch ( Level )
		{
			case 15:
			CItem->DamageMin += 9;
			goto LABEL_41;
			case 14:
			LABEL_41:
			CItem->DamageMin += 8;
			goto LABEL_42;
			case 13:
			LABEL_42:
			CItem->DamageMin += 7;
			goto LABEL_43;
			case 12:
			LABEL_43:
			CItem->DamageMin += 6;
			goto LABEL_44;
			case 11:
			LABEL_44:
			CItem->DamageMin += 5;
			goto LABEL_45;
			case 10:
			LABEL_45:
			CItem->DamageMin += 4;
			break;
			default:
			break;
		}
	}
	// MAX DAMAGE
	if ( *(BYTE *)(ItemAttribute + 41) > 0 )
	{
		if ( IFExcellent > 0 && *(WORD *)(ItemAttribute + 32) )
		{
			if ( damage )
				CItem->DamageMax += damage;
			else
				CItem->DamageMax += 25 * *(BYTE *)(ItemAttribute + 40) / *(WORD *)(ItemAttribute + 32) + 5;
		}

		if ( Ancient )
			CItem->DamageMax += ItemLevel / 40 + 5;

		if ( Level <= 9 )
			CItem->DamageMax += 3 * Level;
		else
			CItem->DamageMax += 3 * 9;

		switch ( Level )
		{
			case 15:
			CItem->DamageMax += 9;
			goto LABEL_59;
			case 14:
			LABEL_59:
			CItem->DamageMax += 8;
			goto LABEL_60;
			case 13:
			LABEL_60:
			CItem->DamageMax += 7;
			goto LABEL_61;
			case 12:
			LABEL_61:
			CItem->DamageMax += 6;
			goto LABEL_62;
			case 11:
			LABEL_62:
			CItem->DamageMax += 5;
			goto LABEL_63;
			case 10:
			LABEL_63:
			CItem->DamageMax += 4;
			break;
			default:
			break;
		}
	}
	// WIZARDY DAMAGE
	if ( *(BYTE *)(ItemAttribute + 49) > 0 )
	{
		if ( IFExcellent > 0 && *(WORD *)(ItemAttribute + 32) )
		{
			if ( damage )
				CItem->MagicDamage += damage;
			else
				CItem->MagicDamage += 25 * *(BYTE *)(ItemAttribute + 49) / *(WORD *)(ItemAttribute + 32) + 5;
		}

		if ( Ancient )
			CItem->MagicDamage += ItemLevel / 60 + 2;

		if ( Level <= 9 )
			CItem->MagicDamage += 3 * Level;
		else
			CItem->MagicDamage += 3 * 9;

		switch ( Level )
		{
			case 15:
			CItem->MagicDamage += 9;
			goto LABEL_77;
			case 14:
			LABEL_77:
			CItem->MagicDamage += 8;
			goto LABEL_78;
			case 13:
			LABEL_78:
			CItem->MagicDamage += 7;
			goto LABEL_79;
			case 12:
			LABEL_79:
			CItem->MagicDamage += 6;
			goto LABEL_80;
			case 11:
			LABEL_80:
			CItem->MagicDamage += 5;
			goto LABEL_81;
			case 10:
			LABEL_81:
			CItem->MagicDamage += 4;
			break;
			default:
			break;
		}

		CItem->MagicDamage >>= 1;
		if ( !sub_58B8D0(CItem->m_Type) )
			CItem->MagicDamage += 2 * Level;
	}
	//
	if ( *(BYTE *)(ItemAttribute + 42) > 0 )
	{
		if ( IFExcellent > 0 && *(WORD *)(ItemAttribute + 32) )
		{
			CItem->Unknown13 += 25 * *(BYTE *)(ItemAttribute + 42) / *(WORD *)(ItemAttribute + 32) + 5;
		}

		if ( Level <= 9 )
			CItem->Unknown13 += 3 * Level;
		else
			CItem->Unknown13 += 3 * 9;

		switch ( Level )
		{
			case 15:
			CItem->Unknown13 += 9;
			goto LABEL_93;
			case 14:
			LABEL_93:
			CItem->Unknown13 += 8;
			goto LABEL_94;
			case 13:
			LABEL_94:
			CItem->Unknown13 += 7;
			goto LABEL_95;
			case 12:
			LABEL_95:
			CItem->Unknown13 += 6;
			goto LABEL_96;
			case 11:
			LABEL_96:
			CItem->Unknown13 += 5;
			goto LABEL_97;
			case 10:
			LABEL_97:
			CItem->Unknown13 += 4;
			break;
			default:
			break;
		}
	}
	//DEFENCE
	if ( CItem->m_Type == ITEM(13,30) )
	{
		*(BYTE *)(ItemAttribute + 43) = 15;
		CItem->Defense = 15;
	}

	if ( *(BYTE *)(ItemAttribute + 43) > 0 )
	{
		if ( CItem->m_Type >= ITEM(6,0) && CItem->m_Type < ITEM(7,0) ) // Shields
		{
			CItem->Defense += Level;
			if ( Ancient )
				CItem->Defense += 20 * CItem->Defense / ItemLevel + 2;
		}
		else
		{
			if ( IFExcellent > 0 )
			{
				if ( *(WORD *)(ItemAttribute + 32) )
					CItem->Defense += 12 * *(BYTE *)(ItemAttribute + 43) / *(WORD *)(ItemAttribute + 32) + *(WORD *)(ItemAttribute + 32) / 5 + 4;
			}

			if ( Ancient )
				CItem->Defense += 3 * CItem->Defense / ItemLevel + ItemLevel / 30 + 2;

			if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6))
				|| CItem->m_Type == ITEM(12,42)
				|| CItem->m_Type == ITEM(13,30)
				|| CItem->m_Type == ITEM(12,49) ) // Wings 2
			{
				if ( Level <= 9 )
					CItem->Defense += 2 * Level;
				else
					CItem->Defense += 2 * 9;
			}
			else if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
					|| CItem->m_Type == ITEM(12,43)
					|| CItem->m_Type == ITEM(12,50) ) // Wings 3

			{
				if ( Level <= 9 )
					CItem->Defense += 4 * Level;
				else
					CItem->Defense += 4 * 9;
			}
			else
			{
				if ( Level <= 9 )
					CItem->Defense += 3 * Level;
				else
					CItem->Defense += 3 * 9;
			}

			if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
				|| CItem->m_Type == ITEM(12,43)
				|| CItem->m_Type == ITEM(12,50) )
			{
				switch ( Level )
				{
					case 15:
					CItem->Defense += 10;
					goto LABEL_142;
					case 14:
					LABEL_142:
					CItem->Defense += 9;
					goto LABEL_143;
					case 13:
					LABEL_143:
					CItem->Defense += 8;
					goto LABEL_144;
					case 12:
					LABEL_144:
					CItem->Defense += 7;
					goto LABEL_145;
					case 11:
					LABEL_145:
					CItem->Defense += 6;
					goto LABEL_146;
					case 10:
					LABEL_146:
					CItem->Defense += 5;
					break;
					default:
					break;
				}
			}
			else
			{
				switch ( Level )
				{
					case 15:
					CItem->Defense += 9;
					goto LABEL_149;
					case 14:
					LABEL_149:
					CItem->Defense += 8;
					goto LABEL_150;
					case 13:
					LABEL_150:
					CItem->Defense += 7;
					goto LABEL_151;
					case 12:
					LABEL_151:
					CItem->Defense += 6;
					goto LABEL_152;
					case 11:
					LABEL_152:
					CItem->Defense += 5;
					goto LABEL_153;
					case 10:
					LABEL_153:
					CItem->Defense += 4;
					break;
					default:
					break;
				}
			}
		}
	}
	//MAGIC DEFENCE
	if ( *(BYTE *)(ItemAttribute + 44) > 0 )
	{
		if ( Level <= 9 )
			CItem->MagicDefense += 3 * Level;
		else
			CItem->MagicDefense += 3 * 9;

		switch ( Level )
		{
			case 15:
			CItem->MagicDefense += 9;
			goto LABEL_160;
			case 14:
			LABEL_160:
			CItem->MagicDefense += 8;
			goto LABEL_161;
			case 13:
			LABEL_161:
			CItem->MagicDefense += 7;
			goto LABEL_162;
			case 12:
			LABEL_162:
			CItem->MagicDefense += 6;
			goto LABEL_163;
			case 11:
			LABEL_163:
			CItem->MagicDefense += 5;
			goto LABEL_164;
			case 10:
			LABEL_164:
			CItem->MagicDefense += 4;
			break;
			default:
			break;
		}
	}
	//REQ
	int v20 = *(WORD *)(ItemAttribute + 32);

	if ( IFExcellent )
		v20 = *(WORD *)(ItemAttribute + 32) + 25;
	else if ( Ancient )
		v20 = *(WORD *)(ItemAttribute + 32) + 30;

	int ReqLevel = 4;

	if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6))
		|| CItem->m_Type == ITEM(12,42) )
		ReqLevel = 5;

	if ( *(WORD *)(ItemAttribute + 60) > 0
		&& ((CItem->m_Type >= 0 && CItem->m_Type < ITEM(12,0))
		|| CItem->m_Type == ITEM(13,37)
		|| (CItem->m_Type >= ITEM(12,7) && CItem->m_Type <= ITEM(12,40))
		|| (CItem->m_Type >= ITEM(12,43) && CItem->m_Type < ITEM(13,0) && CItem->m_Type != ITEM(12,49))) )
	{
		CItem->ReqLevel = *(WORD *)(ItemAttribute + 60);
	}
	else if ( *(WORD *)(ItemAttribute + 60) > 0
			&& ((CItem->m_Type >= ITEM(12,0) && CItem->m_Type <= ITEM(12,7))
			|| (CItem->m_Type >= ITEM(12,41) && CItem->m_Type <= ITEM(12,42))
			|| CItem->m_Type == ITEM(12,49)
			|| CItem->m_Type >= ITEM(13,0)) )
		CItem->ReqLevel = ReqLevel * Level + *(WORD *)(ItemAttribute + 60);
	else
		CItem->ReqLevel = 0;

	if ( *(WORD *)(ItemAttribute + 50) )
		CItem->ReqStrenght = 3 * (v20 + 3 * Level) * *(WORD *)(ItemAttribute + 50) / 100 + 20;
	else
		CItem->ReqStrenght = 0;

	if ( *(WORD *)(ItemAttribute + 52) )
		CItem->ReqDextirity = 3 * (v20 + 3 * Level) * *(WORD *)(ItemAttribute + 52) / 100 + 20;
	else
		CItem->ReqDextirity = 0;

	if ( *(WORD *)(ItemAttribute + 56) )
		CItem->ReqVitality = 3 * (v20 + 3 * Level) * *(WORD *)(ItemAttribute + 56) / 100 + 20;
	else
		CItem->ReqVitality = 0;

	if ( *(WORD *)(ItemAttribute + 54) )
	{
		if ( (CItem->m_Type < 2581 || CItem->m_Type > 2589) && CItem->m_Type != 2600 )
		{
			if ( *(WORD *)(ItemAttribute + 60) <= 0 || CItem->m_Type < 7680 || CItem->m_Type >= 8192 )
				CItem->ReqEnergy = 4 * (v20 + 3 * Level) * *(WORD *)(ItemAttribute + 54) / 100 + 20;
			else
				CItem->ReqEnergy = 4 * *(WORD *)(ItemAttribute + 60) * *(WORD *)(ItemAttribute + 54) / 100 + 20;
		}
		else
		{
			CItem->ReqEnergy = 3 * (Level + v20) * *(WORD *)(ItemAttribute + 54) / 100 + 20;
		}
	}
	else
	{
		CItem->ReqEnergy = 0;
	}

	if ( *(WORD *)(ItemAttribute + 58) )
		CItem->ReqCommand = 3 * (v20 + 3 * Level) * *(WORD *)(ItemAttribute + 58) / 100 + 20;
	else
		CItem->ReqCommand = 0;

	if ( CItem->m_Type == 6155 )
	{
		int ReqEnergy = 0;
		switch ( Level )
		{
			case 0:
			ReqEnergy = 30;
			break;
			case 1:
			ReqEnergy = 60;
			break;
			case 2:
			ReqEnergy = 90;
			break;
			case 3:
			ReqEnergy = 130;
			break;
			case 4:
			ReqEnergy = 170;
			break;
			case 5:
			ReqEnergy = 210;
			break;
			case 6:
			ReqEnergy = 300;
			break;
			default:
			break;
		}
		CItem->ReqEnergy = ReqEnergy;
	}

	if ( *(WORD *)(ItemAttribute + 58) )
	{
		if ( CItem->m_Type == 7832 )
			CItem->ReqCommand = 15 * *(WORD *)(ItemAttribute + 58) + 185;
		else
			CItem->ReqCommand = *(WORD *)(ItemAttribute + 58);
	}

	if ( CItem->m_Type == 6666 )
	{
		if ( Level > 2 )
			CItem->ReqLevel = 50;
		else
			CItem->ReqLevel = 20;
	}

	if ( (CItem->m_Type >= 3613 && CItem->m_Type <= 3617)
		|| (CItem->m_Type >= 4125 && CItem->m_Type <= 4129)
		|| (CItem->m_Type >= 4637 && CItem->m_Type <= 4641)
		|| (CItem->m_Type >= 5149 && CItem->m_Type <= 5153)
		|| (CItem->m_Type >= 5661 && CItem->m_Type <= 5665)
		|| CItem->m_Type == 22
		|| CItem->m_Type == 23
		|| CItem->m_Type == 2572
		|| CItem->m_Type == 2069
		|| CItem->m_Type == 1038
		|| CItem->m_Type == 2579
		|| CItem->m_Type == 3627
		|| CItem->m_Type == 4139
		|| CItem->m_Type == 4651
		|| CItem->m_Type == 5163
		|| CItem->m_Type == 5675
		|| sub_5C9370(CItem->m_Type, 0) )
		IFExcellent = 0;

	if ( IFExcellent > 0 )
	{
		if ( CItem->ReqLevel > 0 )
		{
			if ( CItem->m_Type != ITEM(13,37) )
				CItem->ReqLevel += 20;
		}
	}

	CItem->SpecialCount = 0;
	// WINGS EXCELLENT
	if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6)) // Wings 2
		|| CItem->m_Type == ITEM(12,42) )
	{
		if ( Excellent & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5 * Level + 50;
			CItem->SpecialType[CItem->SpecialCount++] = 101;
		}
		if ( (Excellent >> 1) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5 * Level + 50;
			CItem->SpecialType[CItem->SpecialCount++] = 102;
		}
		if ( (Excellent >> 2) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 3;
			CItem->SpecialType[CItem->SpecialCount++] = 103;
		}
		if ( (Excellent >> 3) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 50;
			CItem->SpecialType[CItem->SpecialCount++] = 104;
		}
		if ( (Excellent >> 4) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 98;
		}
	}
	else if ( CItem->m_Type == ITEM(13,30) || CItem->m_Type == ITEM(12,49) ) // RF DL Capes 1
	{
		if ( Excellent & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5 * Level + 50;
			CItem->SpecialType[CItem->SpecialCount++] = 101;
		}
		if ( (Excellent >> 1) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5 * Level + 50;
			CItem->SpecialType[CItem->SpecialCount++] = 102;
		}
		if ( (Excellent >> 2) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 3;
			CItem->SpecialType[CItem->SpecialCount++] = 103;
		}
		if ( (Excellent >> 3) & 1 )
		{
			if ( CItem->m_Type != ITEM(12,49) )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 5 * Level + 10;
				CItem->SpecialType[CItem->SpecialCount++] = 172;
			}
		}
	}
	else if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
			|| CItem->m_Type == ITEM(12,43)
			|| CItem->m_Type == ITEM(12,50) ) // Wings 3
	{
		if ( Excellent & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 103;
		}
		if ( (Excellent >> 1) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 106;
		}
		if ( (Excellent >> 2) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 107;
		}
		if ( (Excellent >> 3) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 5;
			CItem->SpecialType[CItem->SpecialCount++] = 108;
		}
	}
	//??
	if ( (a2 >> 7) & 1 )
	{
		if ( *(WORD *)(ItemAttribute + 36) )
			CItem->SpecialType[CItem->SpecialCount++] = *(WORD *)(ItemAttribute + 36);
	}
	//LUCK
	if ( (a2 >> 2) & 1 )
	{
		if ( (CItem->m_Type >= 0 && CItem->m_Type < ITEM(12,0))
			&& CItem->m_Type != ITEM(4,7)
			&& CItem->m_Type != ITEM(4,15) )
			CItem->SpecialType[CItem->SpecialCount++] = 85;

		if ( (CItem->m_Type >= ITEM(12,0) && CItem->m_Type <= ITEM(12,6))
			|| (CItem->m_Type >= ITEM(12,41) && CItem->m_Type <= ITEM(12,42)) )
			CItem->SpecialType[CItem->SpecialCount++] = 85;

		if ( CItem->m_Type == ITEM(13,30) || CItem->m_Type == ITEM(12,49) )
			CItem->SpecialType[CItem->SpecialCount++] = 85;

		if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
			|| CItem->m_Type == ITEM(12,43)
			|| CItem->m_Type == ITEM(12,50) )
			CItem->SpecialType[CItem->SpecialCount++] = 85;
	}
	// ADD OPTION
	int add = (a2 & 3) + 4 * ((a3 & 0x40) >> 6);

	if ( add )
	{
		if ( CItem->m_Type == ITEM(13,3) )
		{
			if ( add & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 5;
				CItem->SpecialType[CItem->SpecialCount++] = 105;
			}
			if ( (add >> 1) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 50;
				CItem->SpecialType[CItem->SpecialCount++] = 104;
			}
			if ( (add >> 2) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 5;
				CItem->SpecialType[CItem->SpecialCount++] = 98;
			}
		}
		else
		{
			if ( (CItem->m_Type >= 0 && CItem->m_Type < ITEM(5,0)) // Weapon
				&& CItem->m_Type != ITEM(4,7)
				&& CItem->m_Type != ITEM(4,15) )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
				CItem->SpecialType[CItem->SpecialCount++] = 80;
				CItem->ReqStrenght += 5 * add;
			}

			if ( CItem->m_Type >= ITEM(5,0) && CItem->m_Type < ITEM(6,0) ) // Staff
			{
				CItem->SpecialValue[CItem->SpecialCount] = 4 * add;

				if ( (CItem->m_Type < 2581 || CItem->m_Type > 2589) && CItem->m_Type != 2600 )
					CItem->SpecialType[CItem->SpecialCount] = 81;
				else
					CItem->SpecialType[CItem->SpecialCount] = 82;

				CItem->SpecialCount++;
				CItem->ReqStrenght += 5 * add;
			}

			if ( CItem->m_Type >= ITEM(6,0) && CItem->m_Type < ITEM(7,0) ) // Shield
			{
				CItem->SpecialValue[CItem->SpecialCount] = 5 * add;
				CItem->SpecialType[CItem->SpecialCount++] = 83;
				CItem->ReqStrenght += 5 * add;
			}

			if ( CItem->m_Type >= ITEM(7,0) && CItem->m_Type < ITEM(12,0) ) // Sets
			{
				CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
				CItem->SpecialType[CItem->SpecialCount++] = 84;
				CItem->ReqStrenght += 5 * add;
			}

			if ( (CItem->m_Type >= ITEM(13,8) && CItem->m_Type < ITEM(14,0))
				&& CItem->m_Type != ITEM(13,30) ) // Rings Pendant
			{
				if ( CItem->m_Type == ITEM(13,24) )
				{
					CItem->SpecialValue[CItem->SpecialCount] = add;
					CItem->SpecialType[CItem->SpecialCount++] = 204;
				}
				else if ( CItem->m_Type == ITEM(13,28) )
				{
					CItem->SpecialValue[CItem->SpecialCount] = add;
					CItem->SpecialType[CItem->SpecialCount++] = 205;
				}
				else
				{
					CItem->SpecialValue[CItem->SpecialCount] = add;
					CItem->SpecialType[CItem->SpecialCount++] = 86;
				}
			}

			switch ( CItem->m_Type ) // Other
			{
				case ITEM(12,0):
					CItem->SpecialValue[CItem->SpecialCount] = add;
					CItem->SpecialType[CItem->SpecialCount++] = 86;
				break;
				case ITEM(12,1):
				case ITEM(12,41):
					CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
					CItem->SpecialType[CItem->SpecialCount++] = 81;
				break;
				case ITEM(12,2):
					CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
					CItem->SpecialType[CItem->SpecialCount++] = 80;
				break;
				case ITEM(12,3):
					if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
				break;
				case ITEM(12,4):
					if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,5):
					if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,6):
					if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
				break;
				case ITEM(13,30): // DL Cape 1
					CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
					CItem->SpecialType[CItem->SpecialCount++] = 80;
				break;
				case ITEM(12,49): // RF Cape 1
					if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,42):
					CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
					if ( (Excellent >> 5) & 1 )
						CItem->SpecialType[CItem->SpecialCount] = 81;
					else
						CItem->SpecialType[CItem->SpecialCount] = 82;
					++CItem->SpecialCount;
				break;
				case ITEM(12,36):
					if ( (Excellent >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 84;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,37):
					if ( (Excellent >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
					else if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 84;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,38):
					if ( (Excellent >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 84;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,39):
					if ( (Excellent >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
				case ITEM(12,40): // DL Cape 2
				case ITEM(12,50): // RF Cape 2
					if ( (Excellent >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 80;
					}
					else if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 84;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				case ITEM(12,43): // SUM Wings 3
					if ( (Excellent >> 4) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 81;
					}
					else if ( (Excellent >> 5) & 1 )
					{
						CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
						CItem->SpecialType[CItem->SpecialCount++] = 82;
					}
					else
					{
						CItem->SpecialValue[CItem->SpecialCount] = add;
						CItem->SpecialType[CItem->SpecialCount++] = 86;
					}
				break;
			}
		}
	}
	// ----
	if ( CItem->m_Type == ITEM(13,4) )
	{
		int *horse = sub_4F9930(*(int*)CItem);
		sub_4F9B50(*(int*)CItem, *horse);
	}
	// SHIELDS/SETS/RINGS EXCELLENT
	if ( (CItem->m_Type >= ITEM(6,0) && CItem->m_Type < ITEM(12,0))
		|| (CItem->m_Type >= ITEM(13,8) && CItem->m_Type <= ITEM(13,9))
		|| (CItem->m_Type >= ITEM(13,21) && CItem->m_Type <= ITEM(13,24)) )
	{
		if ( (a3 >> 5) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 87;
		if ( (a3 >> 4) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 88;
		if ( (a3 >> 3) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 89;
		if ( (a3 >> 2) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 90;
		if ( (a3 >> 1) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 91;
		if ( a3 & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 92;
	}
	// WEAPON/PENDANTS EXCELLENT
	if ( CItem->m_Type >= 0 && CItem->m_Type < ITEM(6,0)
		|| CItem->m_Type >= ITEM(13,12) && CItem->m_Type <= ITEM(13,13)
		|| CItem->m_Type >= ITEM(13,25) && CItem->m_Type <= ITEM(13,28) )
	{
		if ( (a3 >> 5) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 93;

		if ( (CItem->m_Type >= ITEM(5,0) && CItem->m_Type < ITEM(6,0))
			|| CItem->m_Type == 6668
			|| CItem->m_Type == 6681
			|| CItem->m_Type == 6683 )
		{
			if ( (a3 >> 4) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = *(WORD *)(0x8128AC8 + 14) / 20;
				CItem->SpecialType[CItem->SpecialCount++] = 96;
			}
			if ( (a3 >> 3) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 2;
				CItem->SpecialType[CItem->SpecialCount++] = 97;
			}
		}
		else
		{
			if ( (a3 >> 4) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = *(WORD *)(0x8128AC8 + 14) / 20;
				CItem->SpecialType[CItem->SpecialCount++] = 94;
			}
			if ( (a3 >> 3) & 1 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 2;
				CItem->SpecialType[CItem->SpecialCount++] = 95;
			}
		}

		if ( (a3 >> 2) & 1 )
		{
			CItem->SpecialValue[CItem->SpecialCount] = 7;
			CItem->SpecialType[CItem->SpecialCount++] = 98;
		}

		if ( (a3 >> 1) & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 99;

		if ( a3 & 1 )
			CItem->SpecialType[CItem->SpecialCount++] = 100;
	}

	if ( CItem->m_Type == ITEM(13,20) ) // Wizard ring
	{
		if ( Level )
		{
			if ( Level == 3 )
			{
				CItem->SpecialValue[CItem->SpecialCount] = 10;
				CItem->SpecialType[CItem->SpecialCount++] = 97;
				CItem->SpecialValue[CItem->SpecialCount] = 10;
				CItem->SpecialType[CItem->SpecialCount++] = 95;
				CItem->SpecialValue[CItem->SpecialCount] = 10;
				CItem->SpecialType[CItem->SpecialCount++] = 98;
			}
		}
		else
		{
			CItem->SpecialValue[CItem->SpecialCount] = 10;
			CItem->SpecialType[CItem->SpecialCount++] = 97;
			CItem->SpecialValue[CItem->SpecialCount] = 10;
			CItem->SpecialType[CItem->SpecialCount++] = 95;
			CItem->SpecialValue[CItem->SpecialCount] = 10;
			CItem->SpecialType[CItem->SpecialCount++] = 98;
		}
	}

	if ( CItem->m_Type == ITEM(13,107) ) // Lethal Wizard's Ring
	{
		CItem->SpecialValue[CItem->SpecialCount] = 15;
		CItem->SpecialType[CItem->SpecialCount++] = 97;
		CItem->SpecialValue[CItem->SpecialCount] = 15;
		CItem->SpecialType[CItem->SpecialCount++] = 95;
		CItem->SpecialValue[CItem->SpecialCount] = 10;
		CItem->SpecialType[CItem->SpecialCount++] = 98;
	}

	char result = *(BYTE *)(0x8128AC0 + 84 * CItem->m_Type + 34);
	CItem->Unknown6 = result;
	return result;
}
 

Attachments

You must be registered for see attachments list
Last edited:
Joined
Feb 4, 2014
Messages
962
Reaction score
36
From this function you can change view of level/stat requirement, additional/excellent/luck options, etc on item
1.04d gmo

.h
Code:
#pragma pack(push, 1)
typedef struct    //-> Complete (size: 107)
{
/*+0*/        WORD    m_Type;
/*+2*/        int        m_Level;
/*+6*/        BYTE    Unknown6;
/*+7*/        BYTE    Unknown7;
/*+8*/        BYTE    Unknown8;
/*+9*/        WORD    DamageMin;
/*+11*/        WORD    DamageMax;
/*+13*/        BYTE    Unknown13;
/*+14*/        WORD    Defense;
/*+16*/        WORD    MagicDefense;
/*+18*/        BYTE    MagicDamage;
/*+19*/        BYTE    Unknown19;
/*+20*/        WORD    Unknown20;
/*+22*/        BYTE    Durability;
/*+23*/        BYTE    ExcellentOption;
/*+24*/        BYTE    AncientOption;
/*+25*/        WORD    ReqStrenght;
/*+27*/        WORD    ReqDextirity;
/*+29*/        WORD    ReqEnergy;
/*+31*/        WORD    ReqVitality;
/*+33*/        WORD    ReqCommand;
/*+35*/        WORD    ReqLevel;
/*+37*/        BYTE    SpecialCount;
/*+38*/        WORD    SpecialType[8];
/*+54*/        BYTE    SpecialValue[8];
/*+62*/        int        UniqueID;
/*+66*/        BYTE    Unknown66;
/*+67*/        BYTE     PosX;
/*+68*/        BYTE     PosY;
/*+69*/        WORD     HarmonyType;
/*+71*/        WORD    HarmonyValue;
/*+73*/        BYTE     Is380Item;
/*+74*/        BYTE    SocketOption[5];
/*+79*/        BYTE    Unknown79;
/*+80*/        BYTE    SocketSeedIndex[5];
/*+85*/        BYTE    SocketSphereLevel[5];
/*+90*/        BYTE    SocketSet;
BYTE gap01[5];
/*+96*/        BYTE    DurabilityState;
/*+97*/        BYTE     PeriodItem;
/*+98*/        BYTE     ExpiredItem;
/*+99*/        int        ExpireDateConvert;
/*+103*/    int        Unknown103;
} ObjectItem, * lpItemObj;
#pragma pack(pop)
.cpp
Code:
#define sub_4F9B50 ((char(*) (int a1, int a2)) 0x4F9B50)

char sub_58B8D0(signed int a1)
{
    if ( (a1 >= ITEM(2,8) && a1 <= ITEM(2,15))
        || a1 == ITEM(2,17)
        || a1 == ITEM(2,18)
        || a1 == ITEM(2,21) )
        return TRUE;

    return FALSE;
}

char sub_5C9370(signed int a1, int a2)
{
    BYTE result = FALSE;

    int v2 = (a2 + a1) % 512;

    if ( a1 >= ITEM(7,0) && a1 <= ITEM(12,0) && v2 >= 62 && v2 <= 72 )
        result = TRUE;

    return result;
}

char gObjItemConvert(lpItemObj CItem, BYTE a2, BYTE a3, BYTE a4)
{
    int *v4; // eax@439
    int v6; // [sp+14h] [bp-68h]@156
    int v10; // [sp+2Ch] [bp-50h]@115
    int v11; // [sp+34h] [bp-48h]@89
    int v12; // [sp+3Ch] [bp-40h]@73
    int v13; // [sp+44h] [bp-38h]@55
    int v14; // [sp+4Ch] [bp-30h]@37
    int v16; // [sp+54h] [bp-28h]@1
    int v20; // [sp+64h] [bp-18h]@165
    int v21; // [sp+68h] [bp-14h]@1
    char v22; // [sp+6Fh] [bp-Dh]@1
    int v24; // [sp+74h] [bp-8h]@1
    int v25; // [sp+78h] [bp-4h]@22

    CItem->Level = a2;
    v24 = (a2 >> 3) & 0xF;
    v16 = a3 & 0x3F;
    v21 = a3 & 0x3F;
    v22 = 0;

    if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6))
        || (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
        || (CItem->m_Type >= ITEM(12,42) && CItem->m_Type <= ITEM(12,43))
        || CItem->m_Type == ITEM(0,19)
        || CItem->m_Type == 2066
        || CItem->m_Type == 2570
        || CItem->m_Type == 1037
        || CItem->m_Type == ITEM(13,30)
        || (CItem->m_Type >= 6274 && CItem->m_Type <= 6278)
        || (CItem->m_Type >= ITEM(12,49) && CItem->m_Type <= ITEM(12,50)) // RF capes
        || CItem->m_Type == 6279
        || CItem->m_Type == 2596 )
        v16 = 0;

    if ( a4 % 4 == 1 || a4 % 4 == 2 )
    {
        v16 = 1;
        v22 = 1;
    }

    v25 = *(int*)0x8128AC0 + 84 * CItem->m_Type;
    CItem->Unknown8 = *(BYTE *)(v25 + 30);
    CItem->Unknown19 = *(BYTE *)(v25 + 45);
    CItem->DamageMin = *(BYTE *)(v25 + 40);
    CItem->DamageMax = *(BYTE *)(v25 + 41);
    CItem->Unknown13 = *(BYTE *)(v25 + 42);
    CItem->Defense = *(BYTE *)(v25 + 43);
    CItem->MagicDefense = *(BYTE *)(v25 + 44);
    CItem->Unknown20 = *(BYTE *)(v25 + 46);
    CItem->Unknown18 = *(BYTE *)(v25 + 49);
    int v17 = *(WORD *)(v25 + 32) + 30;
    
    int damage = 0;
    switch ( CItem->m_Type )
    {
        case 0x406:
        damage = 15;
        break;
        case 0x806:
        damage = 30;
        break;
        case 0xA07:
        damage = 25;
        break;
    }
    //MIN DAMAGE
    if ( *(BYTE *)(v25 + 40) > 0 )
    {
        if ( v16 > 0 )
        {
            if ( *(WORD *)(v25 + 32) )
            {
                if ( damage )
                    CItem->DamageMin += damage;
                else
                    CItem->DamageMin += 25 * *(BYTE *)(v25 + 40) / *(WORD *)(v25 + 32) + 5;
            }
        }

        if ( v22 )
            CItem->DamageMin += v17 / 40 + 5;
        if ( v24 <= 9 )
            v14 = (a2 >> 3) & 0xF;
        else
            v14 = 9;
        CItem->DamageMin += 3 * v14;

        switch ( v24 )
        {
            case 15:
            CItem->DamageMin += 9;
            goto LABEL_41;
            case 14:
            LABEL_41:
            CItem->DamageMin += 8;
            goto LABEL_42;
            case 13:
            LABEL_42:
            CItem->DamageMin += 7;
            goto LABEL_43;
            case 12:
            LABEL_43:
            CItem->DamageMin += 6;
            goto LABEL_44;
            case 11:
            LABEL_44:
            CItem->DamageMin += 5;
            goto LABEL_45;
            case 10:
            LABEL_45:
            CItem->DamageMin += 4;
            break;
            default:
            break;
        }
    }
    // MAX DAMAGE
    if ( *(BYTE *)(v25 + 41) > 0 )
    {
        if ( v16 > 0 )
        {
            if ( *(WORD *)(v25 + 32) )
            {
                if ( damage )
                    CItem->DamageMax += damage;
                else
                    CItem->DamageMax += 25 * *(BYTE *)(v25 + 40) / *(WORD *)(v25 + 32) + 5;
            }
        }

        if ( v22 )
            CItem->DamageMax += v17 / 40 + 5;
        if ( v24 <= 9 )
            v13 = (a2 >> 3) & 0xF;
        else
            v13 = 9;
        CItem->DamageMax += 3 * v13;

        switch ( v24 )
        {
            case 15:
            CItem->DamageMax += 9;
            goto LABEL_59;
            case 14:
            LABEL_59:
            CItem->DamageMax += 8;
            goto LABEL_60;
            case 13:
            LABEL_60:
            CItem->DamageMax += 7;
            goto LABEL_61;
            case 12:
            LABEL_61:
            CItem->DamageMax += 6;
            goto LABEL_62;
            case 11:
            LABEL_62:
            CItem->DamageMax += 5;
            goto LABEL_63;
            case 10:
            LABEL_63:
            CItem->DamageMax += 4;
            break;
            default:
            break;
        }
    }
    // DAMAGE ?
    if ( *(BYTE *)(v25 + 49) > 0 )
    {
        if ( v16 > 0 )
        {
            if ( *(WORD *)(v25 + 32) )
            {
                if ( damage )
                    CItem->Unknown18 += damage;
                else
                    CItem->Unknown18 += 25 * *(BYTE *)(v25 + 49) / *(WORD *)(v25 + 32) + 5;
            }
        }

        if ( v22 )
            CItem->Unknown18 += v17 / 60 + 2;
        if ( v24 <= 9 )
            v12 = (a2 >> 3) & 0xF;
        else
            v12 = 9;
        CItem->Unknown18 += 3 * v12;

        switch ( v24 )
        {
            case 15:
            CItem->Unknown18 += 9;
            goto LABEL_77;
            case 14:
            LABEL_77:
            CItem->Unknown18 += 8;
            goto LABEL_78;
            case 13:
            LABEL_78:
            CItem->Unknown18 += 7;
            goto LABEL_79;
            case 12:
            LABEL_79:
            CItem->Unknown18 += 6;
            goto LABEL_80;
            case 11:
            LABEL_80:
            CItem->Unknown18 += 5;
            goto LABEL_81;
            case 10:
            LABEL_81:
            CItem->Unknown18 += 4;
            break;
            default:
            break;
        }

        CItem->Unknown18 >>= 1;
        if ( !sub_58B8D0(CItem->m_Type) )
            CItem->Unknown18 += 2 * v24;
    }
    //
    if ( *(BYTE *)(v25 + 42) > 0 )
    {
        if ( v16 > 0 )
        {
            if ( *(WORD *)(v25 + 32) )
                CItem->Unknown13 += 25 * *(BYTE *)(v25 + 42) / *(WORD *)(v25 + 32) + 5;
        }

        if ( v24 <= 9 )
            v11 = (a2 >> 3) & 0xF;
        else
            v11 = 9;
        CItem->Unknown13 += 3 * v11;

        switch ( v24 )
        {
            case 15:
            CItem->Unknown13 += 9;
            goto LABEL_93;
            case 14:
            LABEL_93:
            CItem->Unknown13 += 8;
            goto LABEL_94;
            case 13:
            LABEL_94:
            CItem->Unknown13 += 7;
            goto LABEL_95;
            case 12:
            LABEL_95:
            CItem->Unknown13 += 6;
            goto LABEL_96;
            case 11:
            LABEL_96:
            CItem->Unknown13 += 5;
            goto LABEL_97;
            case 10:
            LABEL_97:
            CItem->Unknown13 += 4;
            break;
            default:
            break;
        }
    }
    //DEFENCE
    if ( CItem->m_Type == ITEM(13,30) )
    {
        *(BYTE *)(v25 + 43) = 15;
        CItem->Defense = 15;
    }

    if ( *(BYTE *)(v25 + 43) > 0 )
    {
        if ( CItem->m_Type >= ITEM(6,0) && CItem->m_Type < ITEM(7,0) ) // Shields
        {
            CItem->Defense += v24;
            if ( v22 )
                CItem->Defense += 20 * CItem->Defense / v17 + 2;
        }
        else
        {
            if ( v16 > 0 )
            {
                if ( *(WORD *)(v25 + 32) )
                    CItem->Defense += 12 * *(BYTE *)(v25 + 43) / *(WORD *)(v25 + 32) + *(WORD *)(v25 + 32) / 5 + 4;
            }

            if ( v22 )
                CItem->Defense += 3 * CItem->Defense / v17 + v17 / 30 + 2;

            if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6))
                || CItem->m_Type == ITEM(12,42)
                || CItem->m_Type == ITEM(13,30)
                || CItem->m_Type == ITEM(12,49) ) // Wings 2
            {
                if ( v24 <= 9 )
                    v10 = (a2 >> 3) & 0xF;
                else
                    v10 = 9;
                CItem->Defense += 2 * v10;
            }
            else if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
                    || CItem->m_Type == ITEM(12,43)
                    || CItem->m_Type == ITEM(12,50) ) // Wings 3

            {
                if ( v24 <= 9 )
                    v10 = (a2 >> 3) & 0xF;
                else
                    v10 = 9;
                CItem->Defense += 4 * v10;
            }
            else
            {
                if ( v24 <= 9 )
                    v10 = (a2 >> 3) & 0xF;
                else
                    v10 = 9;
                CItem->Defense += 3 * v10;
            }

            if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
                || CItem->m_Type == ITEM(12,43)
                || CItem->m_Type == ITEM(12,50) )
            {
                switch ( v24 )
                {
                    case 15:
                    CItem->Defense += 10;
                    goto LABEL_142;
                    case 14:
                    LABEL_142:
                    CItem->Defense += 9;
                    goto LABEL_143;
                    case 13:
                    LABEL_143:
                    CItem->Defense += 8;
                    goto LABEL_144;
                    case 12:
                    LABEL_144:
                    CItem->Defense += 7;
                    goto LABEL_145;
                    case 11:
                    LABEL_145:
                    CItem->Defense += 6;
                    goto LABEL_146;
                    case 10:
                    LABEL_146:
                    CItem->Defense += 5;
                    break;
                    default:
                    break;
                }
            }
            else
            {
                switch ( v24 )
                {
                    case 15:
                    CItem->Defense += 9;
                    goto LABEL_149;
                    case 14:
                    LABEL_149:
                    CItem->Defense += 8;
                    goto LABEL_150;
                    case 13:
                    LABEL_150:
                    CItem->Defense += 7;
                    goto LABEL_151;
                    case 12:
                    LABEL_151:
                    CItem->Defense += 6;
                    goto LABEL_152;
                    case 11:
                    LABEL_152:
                    CItem->Defense += 5;
                    goto LABEL_153;
                    case 10:
                    LABEL_153:
                    CItem->Defense += 4;
                    break;
                    default:
                    break;
                }
            }
        }
    }
    //MAGIC DEFENCE
    if ( *(BYTE *)(v25 + 44) > 0 )
    {
        if ( v24 <= 9 )
            v6 = (a2 >> 3) & 0xF;
        else
            v6 = 9;

        CItem->MagicDefense += 3 * v6;

        switch ( v24 )
        {
            case 15:
            CItem->MagicDefense += 9;
            goto LABEL_160;
            case 14:
            LABEL_160:
            CItem->MagicDefense += 8;
            goto LABEL_161;
            case 13:
            LABEL_161:
            CItem->MagicDefense += 7;
            goto LABEL_162;
            case 12:
            LABEL_162:
            CItem->MagicDefense += 6;
            goto LABEL_163;
            case 11:
            LABEL_163:
            CItem->MagicDefense += 5;
            goto LABEL_164;
            case 10:
            LABEL_164:
            CItem->MagicDefense += 4;
            break;
            default:
            break;
        }
    }
    //REQ
    v20 = *(WORD *)(v25 + 32);

    if ( v16 )
        v20 = *(WORD *)(v25 + 32) + 25;
    else if ( v22 )
        v20 = *(WORD *)(v25 + 32) + 30;

    int ReqLevel = 4;

    if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6))
        || CItem->m_Type == ITEM(12,42) )
        ReqLevel = 5;

    if ( *(WORD *)(v25 + 60)
        && ((CItem->m_Type >= 0 && CItem->m_Type < ITEM(12,0))
        || CItem->m_Type == ITEM(13,37)
        || (CItem->m_Type >= ITEM(12,7) && CItem->m_Type <= ITEM(12,40))
        || (CItem->m_Type >= ITEM(12,43) && CItem->m_Type < ITEM(13,0) && CItem->m_Type != ITEM(12,49))) )
    {
        CItem->ReqLevel = *(WORD *)(v25 + 60);
    }
    else if ( *(WORD *)(v25 + 60)
            && ((CItem->m_Type >= ITEM(12,0) && CItem->m_Type <= ITEM(12,7))
            || (CItem->m_Type >= ITEM(12,41) && CItem->m_Type <= ITEM(12,42))
            || CItem->m_Type == ITEM(12,49)
            || CItem->m_Type >= ITEM(13,0)) )
        CItem->ReqLevel = ReqLevel * v24 + *(WORD *)(v25 + 60);
    else
        CItem->ReqLevel = 0;

    if ( *(WORD *)(v25 + 50) )
        CItem->ReqStrenght = 3 * (v20 + 3 * v24) * *(WORD *)(v25 + 50) / 100 + 20;
    else
        CItem->ReqStrenght = 0;

    if ( *(WORD *)(v25 + 52) )
        CItem->ReqDextirity = 3 * (v20 + 3 * v24) * *(WORD *)(v25 + 52) / 100 + 20;
    else
        CItem->ReqDextirity = 0;

    if ( *(WORD *)(v25 + 56) )
        CItem->ReqVitality = 3 * (v20 + 3 * v24) * *(WORD *)(v25 + 56) / 100 + 20;
    else
        CItem->ReqVitality = 0;

    if ( *(WORD *)(v25 + 54) )
    {
        if ( (CItem->m_Type < 2581 || CItem->m_Type > 2589) && CItem->m_Type != 2600 )
        {
            if ( *(WORD *)(v25 + 60) <= 0 || CItem->m_Type < 7680 || CItem->m_Type >= 8192 )
                CItem->ReqEnergy = 4 * (v20 + 3 * v24) * *(WORD *)(v25 + 54) / 100 + 20;
            else
                CItem->ReqEnergy = 4 * *(WORD *)(v25 + 60) * *(WORD *)(v25 + 54) / 100 + 20;
        }
        else
        {
        CItem->ReqEnergy = 3 * (v24 + v20) * *(WORD *)(v25 + 54) / 100 + 20;
        }
    }
    else
    {
        CItem->ReqEnergy = 0;
    }

    if ( *(WORD *)(v25 + 58) )
        CItem->ReqCommand = 3 * (v20 + 3 * v24) * *(WORD *)(v25 + 58) / 100 + 20;
    else
        CItem->ReqCommand = 0;

    if ( CItem->m_Type == 6155 )
    {
        int ReqEnergy = 0;
        switch ( v24 )
        {
            case 0:
            ReqEnergy = 30;
            break;
            case 1:
            ReqEnergy = 60;
            break;
            case 2:
            ReqEnergy = 90;
            break;
            case 3:
            ReqEnergy = 130;
            break;
            case 4:
            ReqEnergy = 170;
            break;
            case 5:
            ReqEnergy = 210;
            break;
            case 6:
            ReqEnergy = 300;
            break;
            default:
            break;
        }
        CItem->ReqEnergy = ReqEnergy;
    }

    if ( *(WORD *)(v25 + 58) )
    {
        if ( CItem->m_Type == 7832 )
            CItem->ReqCommand = 15 * *(WORD *)(v25 + 58) + 185;
        else
            CItem->ReqCommand = *(WORD *)(v25 + 58);
    }

    if ( CItem->m_Type == 6666 )
    {
        if ( v24 > 2 )
            CItem->ReqLevel = 50;
        else
            CItem->ReqLevel = 20;
    }

    if ( (CItem->m_Type >= 3613 && CItem->m_Type <= 3617)
        || (CItem->m_Type >= 4125 && CItem->m_Type <= 4129)
        || (CItem->m_Type >= 4637 && CItem->m_Type <= 4641)
        || (CItem->m_Type >= 5149 && CItem->m_Type <= 5153)
        || (CItem->m_Type >= 5661 && CItem->m_Type <= 5665)
        || CItem->m_Type == 22
        || CItem->m_Type == 23
        || CItem->m_Type == 2572
        || CItem->m_Type == 2069
        || CItem->m_Type == 1038
        || CItem->m_Type == 2579
        || CItem->m_Type == 3627
        || CItem->m_Type == 4139
        || CItem->m_Type == 4651
        || CItem->m_Type == 5163
        || CItem->m_Type == 5675
        || sub_5C9370(CItem->m_Type, 0) )
        v16 = 0;

    if ( v16 > 0 )
    {
        if ( CItem->ReqLevel > 0 )
        {
            if ( CItem->m_Type != ITEM(13,37) )
                CItem->ReqLevel += 20;
        }
    }

    CItem->SpecialCount = 0;
    // WINGS EXCELLENT
    if ( (CItem->m_Type >= ITEM(12,3) && CItem->m_Type <= ITEM(12,6)) // Wings 2
        || CItem->m_Type == ITEM(12,42) )
    {
        if ( v21 & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 50;
            CItem->SpecialType[CItem->SpecialCount++] = 101;
        }
        if ( (v21 >> 1) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 50;
            CItem->SpecialType[CItem->SpecialCount++] = 102;
        }
        if ( (v21 >> 2) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 3;
            CItem->SpecialType[CItem->SpecialCount++] = 103;
        }
        if ( (v21 >> 3) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 50;
            CItem->SpecialType[CItem->SpecialCount++] = 104;
        }
        if ( (v21 >> 4) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 5;
            CItem->SpecialType[CItem->SpecialCount++] = 98;
        }
    }
    else if ( CItem->m_Type == ITEM(13,30) || CItem->m_Type == ITEM(12,49) ) // RF DL Capes 1
    {
        if ( v21 & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 50;
            CItem->SpecialType[CItem->SpecialCount++] = 101;
        }
        if ( (v21 >> 1) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 50;
            CItem->SpecialType[CItem->SpecialCount++] = 102;
        }
        if ( (v21 >> 2) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 3;
            CItem->SpecialType[CItem->SpecialCount++] = 103;
        }
        if ( (v21 >> 3) & 1 )
        {
            if ( CItem->m_Type != ITEM(12,49) )
            {
                CItem->SpecialValue[CItem->SpecialCount] = 5 * v24 + 10;
                CItem->SpecialType[CItem->SpecialCount++] = 172;
            }
        }
    }
    else if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
            || CItem->m_Type == ITEM(12,43)
            || CItem->m_Type == ITEM(12,50) ) // Wings 3
    {
        if ( v21 & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 5;
            CItem->SpecialType[CItem->SpecialCount++] = 103;
        }
        if ( (v21 >> 1) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 5;
            CItem->SpecialType[CItem->SpecialCount++] = 106;
        }
        if ( (v21 >> 2) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 5;
            CItem->SpecialType[CItem->SpecialCount++] = 107;
        }
        if ( (v21 >> 3) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 5;
            CItem->SpecialType[CItem->SpecialCount++] = 108;
        }
    }
    //??
    if ( (a2 >> 7) & 1 )
    {
        if ( *(WORD *)(v25 + 36) )
            CItem->SpecialType[CItem->SpecialCount++] = *(WORD *)(v25 + 36);
    }
    //LUCK
    if ( (a2 >> 2) & 1 )
    {
        if ( (CItem->m_Type >= 0 && CItem->m_Type < ITEM(12,0))
            && CItem->m_Type != ITEM(4,7)
            && CItem->m_Type != ITEM(4,15) )
            CItem->SpecialType[CItem->SpecialCount++] = 85;

        if ( (CItem->m_Type >= ITEM(12,0) && CItem->m_Type <= ITEM(12,6))
            || (CItem->m_Type >= ITEM(12,41) && CItem->m_Type <= ITEM(12,42)) )
            CItem->SpecialType[CItem->SpecialCount++] = 85;

        if ( CItem->m_Type == ITEM(13,30) || CItem->m_Type == ITEM(12,49) )
            CItem->SpecialType[CItem->SpecialCount++] = 85;

        if ( (CItem->m_Type >= ITEM(12,36) && CItem->m_Type <= ITEM(12,40))
            || CItem->m_Type == ITEM(12,43)
            || CItem->m_Type == ITEM(12,50) )
            CItem->SpecialType[CItem->SpecialCount++] = 85;
    }
    // ADD OPTION
    int add = (a2 & 3) + 4 * ((a3 & 0x40) >> 6);

    if ( add )
    {
        if ( CItem->m_Type == ITEM(13,3) )
        {
            if ( add & 1 )
            {
                CItem->SpecialValue[CItem->SpecialCount] = 5;
                CItem->SpecialType[CItem->SpecialCount++] = 105;
            }
            if ( (add >> 1) & 1 )
            {
                CItem->SpecialValue[CItem->SpecialCount] = 50;
                CItem->SpecialType[CItem->SpecialCount++] = 104;
            }
            if ( (add >> 2) & 1 )
            {
                CItem->SpecialValue[CItem->SpecialCount] = 5;
                CItem->SpecialType[CItem->SpecialCount++] = 98;
            }
        }
        else
        {
            if ( (CItem->m_Type >= 0 && CItem->m_Type < ITEM(5,0)) // Weapon
                && CItem->m_Type != ITEM(4,7)
                && CItem->m_Type != ITEM(4,15) )
            {
                CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                CItem->SpecialType[CItem->SpecialCount++] = 80;
                CItem->ReqStrenght += 5 * add;
            }

            if ( CItem->m_Type >= ITEM(5,0) && CItem->m_Type < ITEM(6,0) ) // Staff
            {
                CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                if ( (CItem->m_Type < 2581 || CItem->m_Type > 2589) && CItem->m_Type != 2600 )
                    CItem->SpecialType[CItem->SpecialCount] = 81;
                else
                    CItem->SpecialType[CItem->SpecialCount] = 82;
                ++CItem->SpecialCount;
                CItem->ReqStrenght += 5 * add;
            }

            if ( CItem->m_Type >= ITEM(6,0) && CItem->m_Type < ITEM(7,0) ) // Shield
            {
                CItem->SpecialValue[CItem->SpecialCount] = 5 * add;
                CItem->SpecialType[CItem->SpecialCount++] = 83;
                CItem->ReqStrenght += 5 * add;
            }

            if ( CItem->m_Type >= ITEM(7,0) && CItem->m_Type < ITEM(12,0) ) // Sets
            {
                CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                CItem->SpecialType[CItem->SpecialCount++] = 84;
                CItem->ReqStrenght += 5 * add;
            }

            if ( (CItem->m_Type >= ITEM(13,8) && CItem->m_Type < ITEM(14,0))
                && CItem->m_Type != ITEM(13,30) ) // Rings Pendant
            {
                if ( CItem->m_Type == ITEM(13,24) )
                {
                    CItem->SpecialValue[CItem->SpecialCount] = add;
                    CItem->SpecialType[CItem->SpecialCount++] = 204;
                }
                else if ( CItem->m_Type == ITEM(13,28) )
                {
                    CItem->SpecialValue[CItem->SpecialCount] = add;
                    CItem->SpecialType[CItem->SpecialCount++] = 205;
                }
                else
                {
                    CItem->SpecialValue[CItem->SpecialCount] = add;
                    CItem->SpecialType[CItem->SpecialCount++] = 86;
                }
            }

            switch ( CItem->m_Type ) // Other
            {
                case ITEM(12,0):
                    CItem->SpecialValue[CItem->SpecialCount] = add;
                    CItem->SpecialType[CItem->SpecialCount++] = 86;
                break;
                case ITEM(12,1):
                case ITEM(12,41):
                    CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                    CItem->SpecialType[CItem->SpecialCount++] = 81;
                break;
                case ITEM(12,2):
                    CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                    CItem->SpecialType[CItem->SpecialCount++] = 80;
                break;
                case ITEM(12,3):
                    if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 80;
                    }
                break;
                case ITEM(12,4):
                    if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 81;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                break;
                case ITEM(12,5):
                    if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 80;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                break;
                case ITEM(12,6):
                    if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 80;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 81;
                    }
                break;
                case ITEM(13,30): // DL Cape 1
                    CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                    CItem->SpecialType[CItem->SpecialCount++] = 80;
                break;
                case ITEM(12,49): // RF Cape 1
                    if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 80;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                break;
                case ITEM(12,42):
                    CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                    if ( (v21 >> 5) & 1 )
                        CItem->SpecialType[CItem->SpecialCount] = 81;
                    else
                        CItem->SpecialType[CItem->SpecialCount] = 82;
                    ++CItem->SpecialCount;
                break;
                case ITEM(12,36):
                    if ( (v21 >> 4) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 80;
                    }
                    else if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 84;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                break;
                case ITEM(12,37):
                    if ( (v21 >> 4) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 81;
                    }
                    else if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 84;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                break;
                case ITEM(12,38):
                    if ( (v21 >> 4) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 80;
                    }
                    else if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 84;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                break;
                case ITEM(12,39):
                    if ( (v21 >> 4) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 80;
                    }
                    else if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 81;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                break;
                case ITEM(12,40): // DL Cape 2
                case ITEM(12,50): // RF Cape 2
                    if ( (v21 >> 4) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 80;
                    }
                    else if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 84;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                case ITEM(12,43): // SUM Wings 3
                    if ( (v21 >> 4) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 81;
                    }
                    else if ( (v21 >> 5) & 1 )
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = 4 * add;
                        CItem->SpecialType[CItem->SpecialCount++] = 82;
                    }
                    else
                    {
                        CItem->SpecialValue[CItem->SpecialCount] = add;
                        CItem->SpecialType[CItem->SpecialCount++] = 86;
                    }
                break;
            }
        }
    }
    // ----

    if ( CItem->m_Type == 6660 )
    {
        v4 = sub_4F9930(*(int*)CItem);
        sub_4F9B50(*(int*)CItem, *v4);
    }

    // SHIELDS/SETS/RINGS EXCELLENT
    if ( (CItem->m_Type >= ITEM(6,0) && CItem->m_Type < ITEM(12,0))
        || (CItem->m_Type >= ITEM(13,8) && CItem->m_Type <= ITEM(13,9))
        || (CItem->m_Type >= ITEM(13,21) && CItem->m_Type <= ITEM(13,24)) )
    {
        if ( (a3 >> 5) & 1 )
            CItem->SpecialType[CItem->SpecialCount++] = 87;
        if ( (a3 >> 4) & 1 )
            CItem->SpecialType[CItem->SpecialCount++] = 88;
        if ( (a3 >> 3) & 1 )
            CItem->SpecialType[CItem->SpecialCount++] = 89;
        if ( (a3 >> 2) & 1 )
            CItem->SpecialType[CItem->SpecialCount++] = 90;
        if ( (a3 >> 1) & 1 )
            CItem->SpecialType[CItem->SpecialCount++] = 91;
        if ( a3 & 1 )
            CItem->SpecialType[CItem->SpecialCount++] = 92;
    }

    // WEAPON/PENDANTS EXCELLENT
    if ( CItem->m_Type >= 0 && CItem->m_Type < ITEM(6,0)
        || CItem->m_Type >= ITEM(13,12) && CItem->m_Type <= ITEM(13,13)
        || CItem->m_Type >= ITEM(13,25) && CItem->m_Type <= ITEM(13,28) )
    {
        if ( (a3 >> 5) & 1 )
            CItem->SpecialType[CItem->SpecialCount++] = 93;

        if ( (CItem->m_Type >= ITEM(5,0) && CItem->m_Type < ITEM(6,0))
            || CItem->m_Type == 6668
            || CItem->m_Type == 6681
            || CItem->m_Type == 6683 )
        {
            if ( (a3 >> 4) & 1 )
            {
                CItem->SpecialValue[CItem->SpecialCount] = *(WORD *)(0x8128AC8 + 14) / 20;
                CItem->SpecialType[CItem->SpecialCount++] = 96;
            }
            if ( (a3 >> 3) & 1 )
            {
                CItem->SpecialValue[CItem->SpecialCount] = 2;
                CItem->SpecialType[CItem->SpecialCount++] = 97;
            }
        }
        else
        {
            if ( (a3 >> 4) & 1 )
            {
                CItem->SpecialValue[CItem->SpecialCount] = *(WORD *)(0x8128AC8 + 14) / 20;
                CItem->SpecialType[CItem->SpecialCount++] = 94;
            }
            if ( (a3 >> 3) & 1 )
            {
                CItem->SpecialValue[CItem->SpecialCount] = 2;
                CItem->SpecialType[CItem->SpecialCount++] = 95;
            }
        }

        if ( (a3 >> 2) & 1 )
        {
            CItem->SpecialValue[CItem->SpecialCount] = 7;
            CItem->SpecialType[CItem->SpecialCount++] = 98;
        }

        if ( (a3 >> 1) & 1 )
            CItem->SpecialType[CItem->SpecialCount++] = 99;
        if ( a3 & 1 )
            CItem->SpecialType[CItem->SpecialCount++] = 100;
    }

    if ( CItem->m_Type == ITEM(13,20) ) // Wizard ring
    {
        if ( v24 )
        {
            if ( v24 == 3 )
            {
                CItem->SpecialValue[CItem->SpecialCount] = 10;
                CItem->SpecialType[CItem->SpecialCount++] = 97;
                CItem->SpecialValue[CItem->SpecialCount] = 10;
                CItem->SpecialType[CItem->SpecialCount++] = 95;
                CItem->SpecialValue[CItem->SpecialCount] = 10;
                CItem->SpecialType[CItem->SpecialCount++] = 98;
            }
        }
        else
        {
            CItem->SpecialValue[CItem->SpecialCount] = 10;
            CItem->SpecialType[CItem->SpecialCount++] = 97;
            CItem->SpecialValue[CItem->SpecialCount] = 10;
            CItem->SpecialType[CItem->SpecialCount++] = 95;
            CItem->SpecialValue[CItem->SpecialCount] = 10;
            CItem->SpecialType[CItem->SpecialCount++] = 98;
        }
    }

    if ( CItem->m_Type == ITEM(13,107) ) // Lethal Wizard's Ring
    {
        CItem->SpecialValue[CItem->SpecialCount] = 15;
        CItem->SpecialType[CItem->SpecialCount++] = 97;
        CItem->SpecialValue[CItem->SpecialCount] = 15;
        CItem->SpecialType[CItem->SpecialCount++] = 95;
        CItem->SpecialValue[CItem->SpecialCount] = 10;
        CItem->SpecialType[CItem->SpecialCount++] = 98;
    }

    char result = *(BYTE *)(0x8128AC0 + 84 * CItem->m_Type + 34);
    CItem->Unknown6 = result;
    return result;
}

Local calls from 0058B77E, 005C7833, 005C7D71, 005C7F1B, 005C80BE, 007E216A


Can you upload Full Source 1.04D Main including this change you made?

thanks :)
 
Back
Top