changeset 1576:e66e0c89d81b

More OnInventoryItemRightClick (not finished)
author Nomad
date Tue, 10 Sep 2013 12:54:07 +0200
parents 43d3536a20f7
children 1b6217e07b26
files Items.h mm7_5.cpp mm7_data.cpp mm7_data.h
diffstat 4 files changed, 142 insertions(+), 123 deletions(-) [+]
line wrap: on
line diff
--- a/Items.h	Mon Sep 09 20:09:01 2013 +0200
+++ b/Items.h	Tue Sep 10 12:54:07 2013 +0200
@@ -70,11 +70,19 @@
   ITEM_REAGENT_PHILOSOPHERS_STONE = 219,
   ITEM_POTION_BOTTLE = 220,
   ITEM_POTION_CATALYST = 221,
+  ITEM_POTION_CURE_WOUNDS = 222,
+  ITEM_POTION_CURE_DISEASE = 225,
+  ITEM_POTION_AWAKEN = 227,
+  ITEM_POTION_HASTE = 228,
   ITEM_POTION_RECHARGE_ITEM = 233,
   ITEM_POTION_HARDEN_ITEM = 236,
+  ITEM_POTION_CURE_INSANITY = 239,
+  ITEM_POTION_MIGHT_BOOST = 240,
   ITEM_POTION_ACCURACY_BOOST = 245,
   ITEM_POTION_FLAMING_POTION = 246,
   ITEM_POTION_SWIFT_POTION = 250,
+  ITEM_POTION_BODY_RESISTANE = 261,
+  ITEM_POTION_STONE_TO_FLESH = 262,
   ITEM_POTION_SLAYING_POTION = 263,
   ITEM_POTION_REJUVENATION = 271,
   ITEM_SPELLBOOK_TORCHLIGHT = 400,//0x190
--- a/mm7_5.cpp	Mon Sep 09 20:09:01 2013 +0200
+++ b/mm7_5.cpp	Tue Sep 10 12:54:07 2013 +0200
@@ -4920,7 +4920,7 @@
   int v7; // eax@7
   //unsigned __int16 v8; // ax@10
   int v9; // edi@10
-  int v10; // eax@10
+  //int v10; // eax@10
   //int v11; // edx@13
   //LONG v12; // edx@23
   //signed int v13; // edx@23
@@ -4939,12 +4939,12 @@
   int v26; // eax@84
   ItemGen *v27; // esi@98
   //unsigned int v28; // eax@98
-  ItemGen *v29; // edi@98
-  unsigned int v30; // ecx@103
+  //ItemGen *v29; // edi@98
+  //unsigned int v30; // ecx@103
   double v31; // st7@112
-  unsigned __int64 v32; // qax@113
+  //unsigned __int64 v32; // qax@113
   //unsigned int v33; // ecx@117
-  int v34; // eax@126
+  //int v34; // eax@126
   //unsigned int v35; // ecx@127
   double v36; // st7@132
   signed __int64 v37; // qax@135
@@ -4957,7 +4957,7 @@
   //unsigned int pY; // [sp+60h] [bp-30h]@2
   int v45; // [sp+64h] [bp-2Ch]@10
   //unsigned int pX; // [sp+68h] [bp-28h]@2
-  int v47; // [sp+6Ch] [bp-24h]@25
+  //int v47; // [sp+6Ch] [bp-24h]@25
   //POINT y; // [sp+70h] [bp-20h]@2
   POINT a2; // [sp+78h] [bp-18h]@2
   //Vec3_int_ pOut; // [sp+80h] [bp-10h]@2
@@ -5016,14 +5016,107 @@
   v9 = alchemy_level & 0x3F;
   //v45 = alchemy_level & 0x3F;
   int alchemy_skill = SkillToMastery(alchemy_level);
-  v10 = item_pid;
-  if ( pParty->pPickedItem.uItemID == ITEM_POTION_BOTTLE )
+
+  auto item = &player->pInventoryItemList[item_pid];
+  if (pParty->pPickedItem.uItemID == ITEM_POTION_BOTTLE)
   {
 LABEL_116:
-    GameUI_DrawItemInfo(&player->pInventoryItemList[v10]);
+    GameUI_DrawItemInfo(item);
     return;
   }
 
+  if (pParty->pPickedItem.uItemID == ITEM_POTION_RECHARGE_ITEM)
+  {
+    if (item->uItemID != ITEM_POTION_BOTTLE &&     // cant recharge bottle
+        item->uItemID < ITEM_POTION_CATALYST &&    // cant recharge
+        item->uItemID > ITEM_POTION_REJUVENATION)  //              all potions
+    {
+      if (pItemsTable->pItems[item->uItemID].uEquipType != EQUIP_WAND) // can recharge only wands
+      {
+        pAudioPlayer->PlaySound(SOUND_27, 0, 0, -1, 0, 0, 0, 0);
+        return;
+      }
+
+      v36 = (70.0 - (double)pParty->pPickedItem.uEnchantmentType) * 0.01;
+      if ( v36 < 0.0 )
+        v36 = 0.0;
+      v37 = (signed __int64)((double)item->uMaxCharges - v36 * (double)item->uMaxCharges);
+      item->uMaxCharges = v37;
+      item->uNumCharges = v37;
+
+      pMouse->RemoveHoldingItem();
+      no_rightlick_in_inventory = 1;
+      return;
+    }
+  }
+
+  else if (pParty->pPickedItem.uItemID == ITEM_POTION_HARDEN_ITEM)
+  {
+    if (item->uItemID != ITEM_POTION_BOTTLE &&        // cant harden bottle
+        item->uItemID < ITEM_POTION_CATALYST &&       // cant harden
+        item->uItemID > ITEM_POTION_REJUVENATION)     //              all potions
+    {
+      if (item->IsBroken() ||                         // cant harden broken items
+          item->uItemID >= ITEM_ARTIFACT_PUCK ||      // cant harden artifacts
+          pItemsTable->pItems[item->uItemID].uEquipType < EQUIP_OFF_HAND ||
+          pItemsTable->pItems[item->uItemID].uEquipType > EQUIP_WAND)
+        goto __invalid_item;
+
+      item->uAttributes |= ITEM_AURA_EFFECT_RED | ITEM_ENCHANTED;
+
+      _50C9A8_item_enchantment_timer = 256;
+      pMouse->RemoveHoldingItem();
+      no_rightlick_in_inventory = true;
+      return;
+    }
+  }
+
+  else if (pParty->pPickedItem.uItemID >= ITEM_POTION_FLAMING_POTION &&
+           pParty->pPickedItem.uItemID <= ITEM_POTION_SWIFT_POTION ||
+           pParty->pPickedItem.uItemID == ITEM_POTION_SLAYING_POTION)
+  {
+    if (item->uItemID != ITEM_POTION_BOTTLE &&        // cant enchant bottle
+        item->uItemID < ITEM_POTION_CATALYST &&       // cant enchant
+        item->uItemID > ITEM_POTION_REJUVENATION)     //              all potions
+    {
+      if (item->uItemID >= ITEM_BLASTER && item->uItemID <= ITEM_LASER_RIFLE ||
+          item->uItemID >= ITEM_ARTIFACT_PUCK ||
+          item->IsBroken() ||
+          item->uSpecEnchantmentType ||
+          item->uEnchantmentType ||
+          pItemsTable->pItems[item->uItemID].uEquipType >= EQUIP_ARMOUR)  // only melee weapons and bows
+         goto __invalid_item;
+      
+      item->UpdateTempBonus(pParty->uTimePlayed);
+      if (pParty->pPickedItem.uItemID == ITEM_POTION_SLAYING_POTION)
+      {
+        item->uSpecEnchantmentType = 40; // of Slaying
+        v31 = (double)(1800 * pParty->pPickedItem.uEnchantmentType * 128);
+      }
+      else
+      {
+        static int _4E2904_enchantment_by_potion_lut[] =
+        {
+          164, 93, 22,
+          164, 93, 22,
+          11, 5, 13, 7, 59
+        };
+        item->uSpecEnchantmentType = _4E2904_enchantment_by_potion_lut[pParty->pPickedItem.uItemID - 240];
+        v31 = (double)(1800 * pParty->pPickedItem.uEnchantmentType * 128);
+      }
+
+      v27->uExpireTime = pParty->uTimePlayed + v31 * 0.033333335;
+      v27->uAttributes = alchemy_skill | 0x18;
+
+      _50C9A8_item_enchantment_timer = 256;
+      pMouse->RemoveHoldingItem();
+      no_rightlick_in_inventory = true;
+      return;
+    }
+  }
+
+
+
   if (pParty->pPickedItem.uItemID < ITEM_REAGENT_WIDOWSWEEP_BERRIES ||
       pParty->pPickedItem.uItemID > ITEM_REAGENT_PHILOSOPHERS_STONE ||
       player->pInventoryItemList[item_pid].uItemID != ITEM_POTION_BOTTLE)
@@ -5031,127 +5124,40 @@
     if (pParty->pPickedItem.uItemID < ITEM_POTION_CATALYST ||
         pParty->pPickedItem.uItemID > ITEM_POTION_REJUVENATION ||
         player->pInventoryItemList[item_pid].uItemID < ITEM_POTION_CATALYST ||
-        player->pInventoryItemList[item_pid].uItemID >= ITEM_POTION_REJUVENATION)
+        player->pInventoryItemList[item_pid].uItemID > ITEM_POTION_REJUVENATION)
     {
       if (pParty->pPickedItem.uItemID != ITEM_POTION_HARDEN_ITEM &&
           (pParty->pPickedItem.uItemID < ITEM_POTION_FLAMING_POTION || pParty->pPickedItem.uItemID > ITEM_POTION_SWIFT_POTION) &&
           pParty->pPickedItem.uItemID != ITEM_POTION_SLAYING_POTION &&
           pParty->pPickedItem.uItemID != ITEM_POTION_RECHARGE_ITEM)
         goto LABEL_116;
+    }
 
-      int a2_y;
-      v27 = &player->pInventoryItemList[item_pid];
-      v51 = pItemsTable->pItems[v27->uItemID].uEquipType;
-      v29 = (ItemGen *)(1800 * pParty->pPickedItem.uEnchantmentType);
-      if ( pParty->pPickedItem.uItemID != ITEM_POTION_RECHARGE_ITEM )
-      {
-        if ( pParty->pPickedItem.uItemID == ITEM_POTION_HARDEN_ITEM )
-        {
-          if (v27->IsBroken() || v51 < EQUIP_OFF_HAND || v51 > EQUIP_WAND || v27->uItemID >= ITEM_ARTIFACT_PUCK )
-		  {
-			pMouse->RemoveHoldingItem();
-			no_rightlick_in_inventory = true;
-			return;
-		  }
-          v27->uAttributes |= ITEM_AURA_EFFECT_RED | ITEM_ENCHANTED;
-        }
-        else
-        {
-          if (pParty->pPickedItem.uItemID <= ITEM_POTION_ACCURACY_BOOST )
-		  {
-			pMouse->RemoveHoldingItem();
-			no_rightlick_in_inventory = true;
-			return;
-		  }
-          if (pParty->pPickedItem.uItemID <= ITEM_POTION_SWIFT_POTION)
-          {
-            v27->UpdateTempBonus(pParty->uTimePlayed);
-            if ( (signed int)v27->uItemID >= 64 && (signed int)v27->uItemID <= 65
-              || (alchemy_skill = v27->uAttributes, alchemy_skill & 2)
-              || v27->uSpecEnchantmentType
-              || v27->uEnchantmentType
-              || v51 && v51 != 1 && v51 != 2
-              || (signed int)v27->uItemID >= 500 )
-			{
-				pMouse->RemoveHoldingItem();
-				no_rightlick_in_inventory = 1;
-				return;
-			}
-            v34 = *(int *)&aSbwb00[4 * pParty->pPickedItem.uItemID + 4];
-            a2_y = (int)v29 << 7;
-            v31 = (double)(signed int)((int)v29 << 7);
-            v27->uSpecEnchantmentType = v34;
-          }
-          else
-          {
-            if ( pParty->pPickedItem.uItemID != 263
-              || (v27->UpdateTempBonus(pParty->uTimePlayed), v30 = v27->uItemID, (signed int)v27->uItemID >= 64)
-              && (signed int)v30 <= 65
-              || (alchemy_skill = v27->uAttributes, alchemy_skill & 2)
-              || v27->uSpecEnchantmentType
-              || v27->uEnchantmentType
-              || v51 && v51 != 1 && v51 != 2
-              || (signed int)v30 >= 500 )
-			{
-				pMouse->RemoveHoldingItem();
-				no_rightlick_in_inventory = 1;
-				return;
-			}
-            a2_y = (int)v29 << 7;
-            v27->uSpecEnchantmentType = 40;
-            v31 = (double)a2_y;
-          }
-          v32 = pParty->uTimePlayed + (signed int)(signed __int64)(v31 * 0.033333335);
-          LODWORD(v27->uExpireTime) = v32;
-          LODWORD(v32) = alchemy_skill;
-          LOBYTE(v32) = LOBYTE(alchemy_skill) | 0x18;
-          HIDWORD(v27->uExpireTime) = HIDWORD(v32);
-          v27->uAttributes = v32;
-        }
-        _50C9A8_item_enchantment_timer = 256;
-		pMouse->RemoveHoldingItem();
-		no_rightlick_in_inventory = 1;
-		return;
-      }
-      v36 = (70.0 - (double)pParty->pPickedItem.uEnchantmentType) * 0.01;
-      if ( v36 < 0.0 )
-        v36 = 0.0;
-      if ( v51 != 12 )
-      {
-        pAudioPlayer->PlaySound(SOUND_27, 0, 0, -1, 0, 0, 0, 0);
-        return;
-      }
-      a2_y = v27->uMaxCharges;
-      v37 = (signed __int64)((double)a2_y - v36 * (double)a2_y);
-      v27->uMaxCharges = v37;
-      v27->uNumCharges = (unsigned __int8)v37;
-		pMouse->RemoveHoldingItem();
-		no_rightlick_in_inventory = 1;
-		return;
-    }
-    v14 = player->pInventoryItemList[item_pid].uItemID - 222;
-    v15 = pParty->pPickedItem.uItemID - 222;
-    v47 = v14;
+    // src not reagent,  dst not bottle
+    // src potion,       dst potion
 
-    if ( pParty->pPickedItem.uItemID == 221 || player->pInventoryItemList[item_pid].uItemID == 221 )
+    v14 = item->uItemID - ITEM_POTION_CURE_WOUNDS;
+    v15 = pParty->pPickedItem.uItemID - ITEM_POTION_CURE_WOUNDS;
+
+    if ( pParty->pPickedItem.uItemID == ITEM_POTION_CATALYST ||
+        item->uItemID == ITEM_POTION_CATALYST )
     {
       v16 = 5;
     }
     else
     {
-      v16 = *(short *)&pItemsTable->field_EDE0[2 * (v14 + 50 * v15) + 388];
-      v10 = item_pid;
+      v16 = pItemsTable->potion_data[v15][v14 + 2];
     }
     v51 = v16;
     if ( v9 )
     {
-      if ( v16 < 225 || v16 > 227 )
+      if ( v16 < ITEM_POTION_CURE_DISEASE || v16 > ITEM_POTION_AWAKEN )
       {
-        if ( v16 < 228 || v16 > 239 )
+        if ( v16 < ITEM_POTION_HASTE || v16 > ITEM_POTION_CURE_INSANITY )
         {
-          if ( v16 < 240 || v16 > 261 )
+          if ( v16 < ITEM_POTION_MIGHT_BOOST || v16 > ITEM_POTION_BODY_RESISTANE )
           {
-            if ( v16 >= 262 && alchemy_level != 4 )
+            if ( v16 >= ITEM_POTION_STONE_TO_FLESH && alchemy_level != 4 )
             {
 LABEL_53:
               v51 = 4;
@@ -5181,21 +5187,21 @@
     }
     else
     {
-      if ( v16 >= 225 && v16 <= 227 )
+      if ( v16 >= ITEM_POTION_CURE_DISEASE && v16 <= ITEM_POTION_AWAKEN )
       {
         v51 = 1;
         goto LABEL_54;
       }
-      if ( v16 >= 228 && v16 <= 239 )
+      if ( v16 >= ITEM_POTION_HASTE && v16 <= ITEM_POTION_CURE_INSANITY )
         goto LABEL_35;
-      if ( v16 >= 240 && v16 <= 261 )
+      if ( v16 >= ITEM_POTION_MIGHT_BOOST && v16 <= ITEM_POTION_BODY_RESISTANE )
         goto LABEL_38;
-      if ( v16 >= 262 )
+      if ( v16 >= ITEM_POTION_STONE_TO_FLESH )
         goto LABEL_53;
     }
 LABEL_54:
     int pOut_y = 0;
-    int pOut_x = v10 + 1;
+    int pOut_x = item_pid + 1;
     v17 = (int)player->pInventoryMatrix;
     while ( *(int *)v17 != pOut_x )
     {
@@ -5210,11 +5216,7 @@
     v18 = pOut_y;
 LABEL_59:
     if ( !v51 )
-    {
-LABEL_115:
-      v10 = item_pid;
       goto LABEL_116;
-    }
     if ( v51 == 1 )
     {
       player->RemoveItemAtInventoryIndex(v18);
@@ -5254,7 +5256,7 @@
               if ( v19 )
                // *(int *)&v0->field_1F5[36 * v19 + 15] = 1;
                  player->pOwnItems[v19-1].uAttributes = ITEM_IDENTIFIED;
-              v20 = v47 + 50 * v15;
+              v20 = v14 + 50 * v15;
               player->pInventoryItemList[item_pid].uItemID = v51;
               player->pInventoryItemList[item_pid].uEnchantmentType = (pParty->pPickedItem.uEnchantmentType
                                                        + player->pInventoryItemList[item_pid].uEnchantmentType)
@@ -5288,7 +5290,7 @@
                 player->pOwnItems[v21-1].uAttributes=ITEM_IDENTIFIED;
               goto LABEL_74;
             }
-            goto LABEL_115;
+            goto LABEL_116;
           }
           player->RemoveItemAtInventoryIndex(v18);
           player->SetCondition(0x10u, 0);
@@ -5320,6 +5322,8 @@
     return;
   }
 
+  // end alchemy
+
   player->pInventoryItemList[item_pid].uEnchantmentType = v9 + pItemsTable->pItems[pParty->pPickedItem.uItemID].uDamageDice;
   switch ( pParty->pPickedItem.uItemID )
   {
@@ -5361,6 +5365,13 @@
     player->PlaySound(SPEECH_16, 0);
     dword_4E455C = 0;
   }
+  return;
+
+
+__invalid_item:
+  pMouse->RemoveHoldingItem();
+  no_rightlick_in_inventory = true;
+  return;
 }
 
 //----- (00417AD4) --------------------------------------------------------
--- a/mm7_data.cpp	Mon Sep 09 20:09:01 2013 +0200
+++ b/mm7_data.cpp	Tue Sep 10 12:54:07 2013 +0200
@@ -374,7 +374,7 @@
 char aPending[777]; // idb
 char aCanTFindS[777]; // idb
 
-std::array<char, 7> aSbwb00; // weak
+//std::array<char, 7> aSbwb00; // weak
 char aW[2]; // idb
 char aA[2]; // idb
 char aSD[777]; // idb
--- a/mm7_data.h	Mon Sep 09 20:09:01 2013 +0200
+++ b/mm7_data.h	Tue Sep 10 12:54:07 2013 +0200
@@ -334,7 +334,7 @@
 
 extern __int16 word_4E1D3A[]; // weak
 
-extern std::array<char, 7> aSbwb00; // weak
+//extern std::array<char, 7> aSbwb00; // weak
 extern char aW[2]; // idb
 extern char aA[2]; // idb
 extern char aSD[]; // idb