diff Items.cpp @ 201:30aa44013f7a

On Items
author Nomad
date Sun, 17 Feb 2013 00:16:48 +0200
parents 821fd955c379
children 1bd823f52e3a
line wrap: on
line diff
--- a/Items.cpp	Sat Feb 16 22:35:58 2013 +0200
+++ b/Items.cpp	Sun Feb 17 00:16:48 2013 +0200
@@ -1029,18 +1029,10 @@
         {
           switch ( v101 )
           {
-            case 2:
-              pItems[v35].field_2C = atoi(v36);
-              break;
-            case 3:
-              pItems[v35].field_2D = atoi(v36);
-              break;
-            case 4:
-              pItems[v35].field_2E = atoi(v36);
-              break;
-            case 5:
-              pItems[v35].field_2F = atoi(v36);
-              break;
+            case 2: pItems[v35].field_2C[0] = atoi(v36); break;
+            case 3: pItems[v35].field_2C[1] = atoi(v36); break;
+            case 4: pItems[v35].field_2C[2] = atoi(v36); break;
+            case 5: pItems[v35].field_2C[3] = atoi(v36); break;
             case 6:
               *((unsigned char *)&pItems[0].uItemID + 16 * (3 * v35 + 3)) = atoi(v36);
               break;
@@ -1073,7 +1065,7 @@
   }
   v39 = (char *)field_11684;
   memset(field_11684, 0, 0x18u);
-  v40 = &pItems[0].field_2C;
+  v40 = pItems[0].field_2C;
   v77 = 6;
   do
   {
@@ -1787,14 +1779,14 @@
 
 
 //----- (00456620) --------------------------------------------------------
-void ItemsTable::GenerateItem(int a2, int a3, ItemGen *pItem)
+void ItemsTable::GenerateItem(int a2, int a3, ItemGen *out_item)
 {
-  ItemGen *v4; // esi@1
-  ItemsTable *v5; // edi@1
+  //ItemGen *v4; // esi@1
+  //ItemsTable *v5; // edi@1
   int v6; // ebx@3
   int *v7; // ecx@33
-  int v8; // eax@34
-  int v9; // eax@39
+  //int v8; // eax@34
+  //int v9; // eax@39
   int v10; // ebx@43
   int v11; // ecx@47
   unsigned int *v12; // edx@48
@@ -1836,163 +1828,101 @@
   unsigned int v48; // ecx@123
   int v49; // eax@123
   int v50; // eax@123
-  unsigned char Dst[0xC80]; // [sp+Ch] [bp-C88h]@33
+  int Dst[800]; // [sp+Ch] [bp-C88h]@33
   int v52; // [sp+C8Ch] [bp-8h]@33
-  int v53; // [sp+C90h] [bp-4h]@1
+  //int v53; // [sp+C90h] [bp-4h]@1
   int v54; // [sp+C9Ch] [bp+8h]@3
-  int v55; // [sp+CA0h] [bp+Ch]@34
+  //int v55; // [sp+CA0h] [bp+Ch]@34
   signed int v56; // [sp+CA0h] [bp+Ch]@55
   int v57; // [sp+CA0h] [bp+Ch]@62
   int *v58; // [sp+CA0h] [bp+Ch]@102
   int v59; // [sp+CA0h] [bp+Ch]@123
-  signed int a2a; // [sp+CA4h] [bp+10h]@33
+  //signed int a2a; // [sp+CA4h] [bp+10h]@33
   int a2b; // [sp+CA4h] [bp+10h]@101
   int a2c; // [sp+CA4h] [bp+10h]@120
 
-  v53 = -1;
-  v4 = pItem;
-  v5 = this;
-  if ( !pItem )
-    v4 = (ItemGen *)pAllocator->AllocNamedChunk(pItem, 0x24u, "newItemGen");
-  memset(v4, 0, 0x24u);
+  //v53 = -1;
+  //v4 = pItem;
+  //v5 = this;
+  if ( !out_item )
+    out_item = (ItemGen *)pAllocator->AllocNamedChunk(out_item, sizeof(*out_item), "newItemGen");
+  memset(out_item, 0, sizeof(*out_item));
   v6 = a2 - 1;
   v54 = a2 - 1;
   if ( a3 )
   {
-    switch ( a3 )
+    ITEM_EQUIP_TYPE   requested_equip;
+    PLAYER_SKILL_TYPE requested_skill = PLAYER_SKILL_INVALID;
+    switch (a3)
     {
-      case 20:
-        a3 = EQUIP_ONE_OR_TWO_HANDS;
-        break;
-      case 21:
-        a3 = 3;
-        break;
-      case 22:
-        v53 = 38;
-        break;
-      case 23:
-        v53 = 1;
-        break;
-      case 24:
-        v53 = 2;
-        break;
-      case 25:
-        v53 = 3;
-        break;
-      case 26:
-        v53 = 4;
-        break;
-      case 27:
-        v53 = 5;
-        break;
-      case 28:
-        v53 = 6;
-        break;
-      case 30:
-        v53 = 0;
-        break;
-      case 31:
-        v53 = 9;
-        break;
-      case 32:
-        v53 = 10;
-        break;
-      case 33:
-        v53 = 0xBu;
-        break;
-      case 34:
-        a3 = 4;
-        break;
-      case 35:
-        a3 = 5;
-        break;
-      case 36:
-        a3 = 6;
-        break;
-      case 37:
-        a3 = 7;
-        break;
-      case 38:
-        a3 = 8;
-        break;
-      case 39:
-        a3 = EQUIP_BOOTS;
-        break;
-      case 40:
-        a3 = EQUIP_RING;
-        break;
-      case 41:
-        a3 = 0xBu;
-        break;
-      case 42:
-        a3 = EQUIP_C;
-        break;
-      case 43:
-        a3 = EQUIP_F;
-        break;
-      case 44:
-        a3 = EQUIP_POTION;
-        break;
-      case 45:
-        a3 = EQUIP_REAGENT;
-        break;
-      case 46:
-        a3 = EQUIP_GEM;
-        break;
-      case 29:
-        v53 = 37;
-        break;
+      case 20: requested_equip = EQUIP_ONE_OR_TWO_HANDS; break;
+      case 21: requested_equip = EQUIP_ARMOUR; break;
+      case 22: requested_skill = (PLAYER_SKILL_TYPE)38; __debugbreak();/*check this skill*/ break;
+      case 23: requested_skill = PLAYER_SKILL_SWORD; break;
+      case 24: requested_skill = PLAYER_SKILL_DAGGER; break;
+      case 25: requested_skill = PLAYER_SKILL_AXE; break;
+      case 26: requested_skill = PLAYER_SKILL_SPEAR; break;
+      case 27: requested_skill = PLAYER_SKILL_BOW; break;
+      case 28: requested_skill = PLAYER_SKILL_MACE; break;
+      case 29: requested_skill = (PLAYER_SKILL_TYPE)37; __debugbreak();/*check this skill*/break;
+      case 30: requested_skill = PLAYER_SKILL_STAFF; break;
+      case 31: requested_skill = PLAYER_SKILL_LEATHER; break;
+      case 32: requested_skill = PLAYER_SKILL_CHAIN; break;
+      case 33: requested_skill = PLAYER_SKILL_PLATE; break;
+      case 34: requested_equip = EQUIP_SHIELD; break;
+      case 35: requested_equip = EQUIP_HELMET; break;
+      case 36: requested_equip = EQUIP_BELT; break;
+      case 37: requested_equip = EQUIP_CLOAK; break;
+      case 38: requested_equip = EQUIP_GAUNTLETS; break;
+      case 39: requested_equip = EQUIP_BOOTS; break;
+      case 40: requested_equip = EQUIP_RING; break;
+      case 41: requested_equip = EQUIP_AMULET; break;
+      case 42: requested_equip = EQUIP_C; break;
+      case 43: requested_equip = EQUIP_F; break;
+      case 44: requested_equip = EQUIP_POTION; break;
+      case 45: requested_equip = EQUIP_REAGENT; break;
+      case 46: requested_equip = EQUIP_GEM; break;
       default:
-        --a3;
+        __debugbreak(); // check this condition
+        requested_equip = (ITEM_EQUIP_TYPE)(a3 - 1);
         break;
     }
-    memset(&Dst, 0, 0xC80u);
+
+    memset(Dst, 0, sizeof(Dst));
+
     v52 = 0;
-    v7 = (int *)&Dst;
-    a2a = 1;
-    if ( v53 == -1 )
+    v7 = Dst;
+
+    if (requested_skill == PLAYER_SKILL_INVALID)
     {
-      v53 = (int)&v5->pItems[1].uEquipType;
-      v9 = (int)(&v5->pItems[1].field_2C + v6);
-      do
+      for (uint i = 1; i < 500; ++i)
       {
-        if ( *(unsigned char *)v53 == a3 )
+        if (pItems[i].uEquipType == requested_equip)
         {
-          *v7 = a2a;
-          ++v7;
-          v52 += *(unsigned char *)v9;
+          *v7++ = i;
+          v52 += pItems[i].field_2C[v6];
         }
-        ++a2a;
-        v53 += 48;
-        v9 += 48;
       }
-      while ( a2a < 500 );
     }
     else
     {
-      v55 = (int)&v5->pItems[1].uSkillType;
-      v8 = (int)(&v5->pItems[1].field_2C + v6);
-      do
+      for (uint i = 1; i < 500; ++i)
       {
-        if ( *(unsigned char *)v55 == v53 )
+        if (pItems[i].uSkillType == requested_skill)
         {
-          *v7 = a2a;
-          ++v7;
-          v52 += *(unsigned char *)v8;
+          *v7++ = i;
+          v52 += pItems[i].field_2C[v6];
         }
-        ++a2a;
-        v55 += 48;
-        v8 += 48;
       }
-      while ( a2a < 500 );
     }
+
     v10 = 0;
     if ( v52 )
       v10 = rand() % v52;
-    v4->uItemID = *(uint *)Dst;
-    if ( !Dst )
-      v4->uItemID = 1;
-    v11 = *(&v5->pItems[v4->uItemID].field_2C + v54);
+    out_item->uItemID = *Dst;
+    if ( !*Dst )
+      out_item->uItemID = 1;
+    v11 = pItems[out_item->uItemID].field_2C[v54];
     if ( v11 < v10 )
     {
       v12 = (uint *)Dst;
@@ -2000,24 +1930,24 @@
       {
         ++v12;
         v13 = *v12;
-        v4->uItemID = *v12;
-        v11 += *(&v5->pItems[v13].field_2C + v54);
+        out_item->uItemID = *v12;
+        v11 += pItems[v13].field_2C[v54];
       }
       while ( v11 < v10 );
     }
-    if ( v5->pItems[v4->uItemID].uEquipType == EQUIP_POTION && v4->uItemID != ITEM_POTION_BOTTLE )
+    if (pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE)
     {
-      v4->_bonus_type = 0;
+      out_item->_bonus_type = 0;
       v14 = 2;
       do
       {
-        v4->_bonus_type += rand() % 4 + 1;
-        v15 = v4->_bonus_type;
+        out_item->_bonus_type += rand() % 4 + 1;
+        v15 = out_item->_bonus_type;
         --v14;
       }
       while ( v14 );
 LABEL_72:
-      v4->_bonus_type = v15 * (v54 + 1);
+      out_item->_bonus_type = v15 * (v54 + 1);
       goto LABEL_73;
     }
   }
@@ -2032,32 +1962,32 @@
     if ( v54 == 5 && rand() % 100 < 5 && !pParty->field_7BA[v17] && v56 < 13 )
     {
       pParty->field_7BA[v17] = 1;
-      v4->uAttributes = 0;
-      v4->uItemID = v17 + 500;
-      v5->SetSpecialBonus(v4);
+      out_item->uAttributes = 0;
+      out_item->uItemID = v17 + 500;
+      SetSpecialBonus(out_item);
       return;
     }
     v57 = 0;
-    v18 = rand() % v5->field_11684[v54];
-    v4->uItemID = 0;
+    v18 = rand() % field_11684[v54];
+    out_item->uItemID = 0;
     if ( v18 > 0 )
     {
       do
-        v57 += *(&v5->pItems[v4->uItemID++ + 1].field_2C + v54);
+        v57 += pItems[out_item->uItemID++ + 1].field_2C[v54];
       while ( v57 < v18 );
     }
     if ( !v18 )
-      v4->uItemID = 1;
-    if ( !v4->uItemID )
-      v4->uItemID = 1;
-    if ( v5->pItems[v4->uItemID].uEquipType == EQUIP_POTION && v4->uItemID != ITEM_POTION_BOTTLE )
+      out_item->uItemID = 1;
+    if ( !out_item->uItemID )
+      out_item->uItemID = 1;
+    if ( pItems[out_item->uItemID].uEquipType == EQUIP_POTION && out_item->uItemID != ITEM_POTION_BOTTLE )
     {
-      v4->_bonus_type = 0;
+      out_item->_bonus_type = 0;
       v19 = 2;
       do
       {
-        v4->_bonus_type += rand() % 4 + 1;
-        v15 = v4->_bonus_type;
+        out_item->_bonus_type += rand() % 4 + 1;
+        v15 = out_item->_bonus_type;
         --v19;
       }
       while ( v19 );
@@ -2065,22 +1995,22 @@
     }
   }
 LABEL_73:
-  if ( v4->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION
+  if (out_item->uItemID == ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION
     && !(unsigned __int16)_449B57_test_bit(pParty->_award_bits, 239) )
-    v4->uItemID = ITEM_SPELLBOOK_LIGHT_SUN_BURST;
-  if ( BYTE2(pItemsTable->pItems[v4->uItemID + 1].uItemID) )
-    v4->uAttributes = 0;
+    out_item->uItemID = ITEM_SPELLBOOK_LIGHT_SUN_BURST;
+  if ( BYTE2(pItems[out_item->uItemID + 1].uItemID) )
+    out_item->uAttributes = 0;
   else
-    v4->uAttributes = 1;
-  if ( v5->pItems[v4->uItemID].uEquipType != EQUIP_POTION )
+    out_item->uAttributes = 1;
+  if (pItems[out_item->uItemID].uEquipType != EQUIP_POTION )
   {
-    v4->uAdditionalValue = 0;
-    v4->_bonus_type = 0;
+    out_item->uAdditionalValue = 0;
+    out_item->_bonus_type = 0;
   }
-  v20 = v5->pItems[v4->uItemID].uEquipType;
+  v20 = pItems[out_item->uItemID].uEquipType;
   if ( v20 <= EQUIP_BOW )
   {
-    v37 = (int)&v5->field_1169C[4 * v54 + 48];
+    v37 = (int)&field_1169C[4 * v54 + 48];
     if ( !*(unsigned int *)v37 )
       return;
     v38 = rand() % 100;
@@ -2093,13 +2023,13 @@
     {
       if ( v20 == EQUIP_C )
       {
-        v21 = rand() % 6 + pItemsTable->pItems[v4->uItemID].uDamageMod + 1;
-        v4->uNumCharges = v21;
-        v4->uMaxCharges = v21;
+        v21 = rand() % 6 + pItems[out_item->uItemID].uDamageMod + 1;
+        out_item->uNumCharges = v21;
+        out_item->uMaxCharges = v21;
       }
       return;
     }
-    v22 = (int)&v5->field_1169C[4 * v54];
+    v22 = (int)&field_1169C[4 * v54];
     if ( !*(unsigned int *)v22 )
       return;
     v23 = rand();
@@ -2107,34 +2037,34 @@
     v25 = v23 % 100;
     if ( v23 % 100 < v24 )
       goto LABEL_127;
-    if ( !*(unsigned int *)&v5->field_1169C[4 * v54 + 24] )
+    if ( !*(unsigned int *)&field_1169C[4 * v54 + 24] )
       return;
     if ( v25 < v24 )
     {
 LABEL_127:
-      v26 = rand() % v5->field_116D8[v5->pItems[v4->uItemID].uEquipType];
-      v27 = v4->uItemID;
-      v4->_bonus_type = 0;
-      for ( i = v5->pEnchantments[0].field_8[v5->pItems[v27].uEquipType + 1];
+      v26 = rand() % field_116D8[pItems[out_item->uItemID].uEquipType];
+      v27 = out_item->uItemID;
+      out_item->_bonus_type = 0;
+      for ( i = pEnchantments[0].field_8[pItems[v27].uEquipType + 1];
             i < v26;
-            i += v5->pEnchantments[v4->_bonus_type].field_8[v5->pItems[v29].uEquipType + 1] )
+            i += pEnchantments[out_item->_bonus_type].field_8[pItems[v29].uEquipType + 1] )
       {
-        v29 = v4->uItemID;
-        ++v4->_bonus_type;
+        v29 = out_item->uItemID;
+        ++out_item->_bonus_type;
       }
-      ++v4->_bonus_type;
-      v30 = v5->field_116D8[2 * v54 + 12];
+      ++out_item->_bonus_type;
+      v30 = field_116D8[2 * v54 + 12];
       v31 = rand();
-      v32 = v4->_bonus_type - 1;
-      v33 = v31 % (v5->field_116D8[2 * v54 + 13] - v30 + 1) + v30;
-      v4->_bonus_strength = v33;
+      v32 = out_item->_bonus_type - 1;
+      v33 = v31 % (field_116D8[2 * v54 + 13] - v30 + 1) + v30;
+      out_item->_bonus_strength = v33;
       if ( v32 == 21 || v32 == 22 || v32 == 23 )
-        v4->_bonus_strength = v33 >> 1;
-      if ( v4->_bonus_strength <= 0 )
-        v4->_bonus_strength = 1;
+        out_item->_bonus_strength = v33 >> 1;
+      if ( out_item->_bonus_strength <= 0 )
+        out_item->_bonus_strength = 1;
       return;
     }
-    v34 = v24 + *(unsigned int *)&v5->field_1169C[4 * v54 + 24];
+    v34 = v24 + *(unsigned int *)&field_1169C[4 * v54 + 24];
     v36 = __OFSUB__(v25, v34);
     v35 = v25 - v34 < 0;
   }
@@ -2143,11 +2073,11 @@
   memset(&Dst, 0, 0xC80u);
   v39 = 0;
   a2b = 0;
-  if ( v5->field_11798 > 0 )
+  if ( field_11798 > 0 )
   {
-    v52 = -16 - (uint)v5;
+    v52 = -16 - (uint)this;
     v58 = (int *)&Dst;
-    v40 = (int)&v5->pSpecialEnchantments[1];
+    v40 = (int)&pSpecialEnchantments[1];
     do
     {
       switch ( v54 )
@@ -2162,8 +2092,8 @@
           if ( !*(unsigned char *)v40 || v43 == 1 )
           {
 LABEL_117:
-            v39 += *((unsigned char *)&v5->pItems[0].uItemID + v40 + v52 + v5->pItems[v4->uItemID].uEquipType);
-            if ( *((unsigned char *)&v5->pItems[0].uItemID + v40 + v52 + v5->pItems[v4->uItemID].uEquipType) )
+            v39 += *((unsigned char *)&pItems[0].uItemID + v40 + v52 + pItems[out_item->uItemID].uEquipType);
+            if ( *((unsigned char *)&pItems[0].uItemID + v40 + v52 + pItems[out_item->uItemID].uEquipType) )
             {
               v44 = v58;
               ++v58;
@@ -2191,27 +2121,27 @@
       ++a2b;
       v40 += 28;
     }
-    while ( a2b < v5->field_11798 );
+    while ( a2b < field_11798 );
   }
   v45 = rand();
-  v4->uAdditionalValue = *(uint *)Dst;
+  out_item->uAdditionalValue = *Dst;
   v46 = v45 % v39 + 1;
-  a2c = *((unsigned char *)&v5->pItems[0].uItemID + 28 * (*(uint *)Dst + 1389) + v5->pItems[v4->uItemID].uEquipType);
+  a2c = *((unsigned char *)&pItems[0].uItemID + 28 * (*(uint *)Dst + 1389) + pItems[out_item->uItemID].uEquipType);
   if ( a2c < v46 )
   {
     for ( j = (int *)&Dst; ; j = (int *)v59 )
     {
-      v48 = v4->uItemID;
+      v48 = out_item->uItemID;
       v49 = (int)(j + 1);
       v59 = v49;
       v50 = *(unsigned int *)v49;
-      v4->uAdditionalValue = v50;
-      a2c += *((unsigned char *)&v5->pItems[0].uItemID + 28 * (v50 + 1389) + v5->pItems[v48].uEquipType);
+      out_item->uAdditionalValue = v50;
+      a2c += *((unsigned char *)&pItems[0].uItemID + 28 * (v50 + 1389) + pItems[v48].uEquipType);
       if ( a2c >= v46 )
         break;
     }
   }
-  ++v4->uAdditionalValue;
+  ++out_item->uAdditionalValue;
 }
 
 //----- (004505CC) --------------------------------------------------------