changeset 1553:b98812ead5d9

Get(skillname) functions cleaned up, using GetMultiplierForSkillLevel instead of nested conditions
author Grumpy7
date Sat, 07 Sep 2013 21:00:02 +0200
parents d253172de469
children e303d8a9bcdc
files Items.h Player.cpp Player.h
diffstat 3 files changed, 71 insertions(+), 244 deletions(-) [+]
line wrap: on
line diff
--- a/Items.h	Sat Sep 07 10:49:42 2013 +0200
+++ b/Items.h	Sat Sep 07 21:00:02 2013 +0200
@@ -188,6 +188,7 @@
   int _bonus_strength;  //8
   int uSpecEnchantmentType; // 25  +5 levels //0c
                             // 16  Drain Hit Points from target.
+                            // 35  Increases chance of disarming.
                             // 39  Double damage vs Demons.
                             // 40  Double damage vs Dragons
                             // 45  +5 Speed and Accuracy
--- a/Player.cpp	Sat Sep 07 10:49:42 2013 +0200
+++ b/Player.cpp	Sat Sep 07 21:00:02 2013 +0200
@@ -1127,296 +1127,122 @@
 int Player::GetBodybuilding()
 {
   int v1; // al@1
-  int v2; // ecx@1
-  int v4; // eax@3
-  signed int v6; // [sp-4h] [bp-4h]@2
 
   v1 = GetActualSkillLevel(PLAYER_SKILL_BODYBUILDING);
-  v2 = v1 & 0x3F;
-  if ( v1 & 0x100 )
-  {
-    v6 = 5;
-  }
-  else
-  {
-    if ( (v1&0xFF) >= 0 )
-    {
-      v4 = ((v1 & 0x40) != 0) + 1;
-      return v2 * v4;
-    }
-    v6 = 3;
-  }
-  v4 = v6;
-  return v2 * v4;
+  int multiplier = GetMultiplierForSkillLevel(v1, 1, 2, 3, 5);
+  return multiplier * (v1 & 0x3F);
 }
 
 //----- (004910A8) --------------------------------------------------------
 int Player::GetMeditation()
 {
   int v1; // al@1
-  int base_level; // ecx@1
-  int v4; // eax@3
-  signed int v6; // [sp-4h] [bp-4h]@2
 
   v1 = GetActualSkillLevel(PLAYER_SKILL_MEDITATION);
-  base_level = v1 & 0x3F;
-  if ( v1 & 0x100 )
-  {
-    v6 = 5;
-  }
-  else
-  {
-    if ( (v1&0xFF) >= 0 )
-    {
-      v4 = ((v1 & 0x40) != 0) + 1;
-      return base_level * v4;
-    }
-    v6 = 3;
-  }
-  v4 = v6;
-  return base_level * v4;
+  int multiplier = GetMultiplierForSkillLevel(v1, 1, 2, 3, 5);
+  return multiplier * (v1 & 0x3F);
 }
 
 //----- (004910D3) --------------------------------------------------------
-int Player::CanIdentify(ItemGen *pItem)
+bool Player::CanIdentify( ItemGen *pItem )
 {
   unsigned __int16 v2; // ax@1
-  unsigned __int16 v3; // bx@1
-  int uSkillMult; // eax@3
   int v5; // edi@7
-  signed int v6; // ebp@7
-  char *v7; // esi@7
-  signed int uSkillMultiplier; // [sp-4h] [bp-14h]@2
 
   if (CheckHiredNPCSpeciality(Scholar))
     return true;
 
-  v2 = pPlayers[uActiveCharacter]->GetActualSkillLevel(PLAYER_SKILL_ITEM_ID);
-  v3 = v2;
-  if ( v2 & 1 )
-  {
-    uSkillMultiplier = 5;
-  }
-  else
-  {
-    if ( (v2 & 0x80u) == 0 )
-    {
-      uSkillMult = ((v2 & 0x40) != 0) + 1;
-      v5 = uSkillMult * (v3 & 0x3F);
-      v6 = 0;
-      v7 = (char *)&pItemsTable->pItems[pItem->uItemID].pIconName;
-
-      if ( (signed int)SkillToMastery(v3) >= 4 )
-        v6 = 1;
-      if ( v5 >= (unsigned __int8)v7[46] )
-        v6 = 1;
-      return v6;
-    }
-    uSkillMultiplier = 3;
-  }
-  uSkillMult = uSkillMultiplier;
-  v5 = uSkillMult * (v3 & 0x3F);
-  v6 = 0;
-  v7 = (char *)&pItemsTable->pItems[pItem->uItemID].pIconName;
-
-  if ( (signed int)SkillToMastery(v3) >= 4 )
-    v6 = 1;
-  if ( v5 >= (unsigned __int8)v7[46] )
-    v6 = 1;
-  return v6;
+  v2 = GetActualSkillLevel(PLAYER_SKILL_ITEM_ID);
+  if ( (signed int)SkillToMastery(v2) >= 4 )
+    return true;
+
+  int multiplier = GetMultiplierForSkillLevel(v2, 1, 2, 3, 5);
+  v5 = multiplier * (v2 & 0x3F);
+  return v5 >= pItemsTable->pItems[pItem->uItemID].uItemID_Rep_St;
 }
 
 //----- (00491151) --------------------------------------------------------
-int Player::CanRepair(ItemGen *a2)
+bool Player::CanRepair( ItemGen *pItem )
 {
   unsigned __int16 v2; // ax@1
-  unsigned __int16 v3; // bx@1
-  int v4; // eax@3
   int v5; // edi@7
-  signed int v6; // ebp@7
-  signed int v10; // [sp-4h] [bp-14h]@2
-
-  
-  auto v7 = &pItemsTable->pItems[a2->uItemID];
+
+  ItemDesc* v7 = &pItemsTable->pItems[pItem->uItemID];
   if (CheckHiredNPCSpeciality(Smith) && v7->uEquipType <= 2 ||
       CheckHiredNPCSpeciality(Armorer) && v7->uEquipType >= 3 && v7->uEquipType <= 9 ||
       CheckHiredNPCSpeciality(Alchemist) && v7->uEquipType >= 9 )
     return true;
 
   v2 = GetActualSkillLevel(PLAYER_SKILL_REPAIR);
-  v3 = v2;
-  if (v2 & 0x100 )
-  {
-    v10 = 5;
-  }
-  else
-  {
-    if ( (v2 & 0x80u) == 0 )
-    {
-      v4 = ((v2 & 0x40) != 0) + 1;
-      goto LABEL_7;
-    }
-    v10 = 3;
-  }
-  v4 = v10;
-LABEL_7:
-  v5 = v4 * (v3 & 0x3F);
-  v6 = 0;
-  if ( (signed int)SkillToMastery(v3) >= 4 )
+  if ( (signed int)SkillToMastery(v2) >= 4 )
     return true;
-  if ( v5 >= *((char *)(v7 + 1) + 2) )
-  {
-    __debugbreak(); // really odd
-    return true;
-  }
-  return false;
+
+  int multiplier = GetMultiplierForSkillLevel(v2, 1, 2, 3, 5);
+  v5 = multiplier * (v2 & 0x3F);
+  return v5 >= v7->uItemID_Rep_St;
 }
 
 //----- (004911F3) --------------------------------------------------------
 int Player::GetMerchant()
 {
-  Player *v1; // edi@1
   unsigned __int16 v2; // ax@1
-  unsigned __int16 v3; // bx@1
-  int v4; // esi@1
   int v5; // edi@1
   int v7; // eax@3
-  int v8; // ecx@7
-  signed int v9; // [sp-4h] [bp-10h]@6
-
-  v1 = this;
+
   v2 = GetActualSkillLevel(PLAYER_SKILL_MERCHANT);
-  v3 = v1->pActiveSkills[PLAYER_SKILL_MERCHANT];
-  v4 = v2 & 0x003F;
-  v5 = v1->pActiveSkills[PLAYER_SKILL_MERCHANT] & 0x3F;
-  if ( (signed int)SkillToMastery(v2) >= 4 )
+  if ( SkillToMastery(v2) >= 4 )
     return 10000;
+
   v7 = GetPartyReputation();
-  if ( !v4 )
+  int multiplier = GetMultiplierForSkillLevel(v2, 1, 2, 3, 5);
+  v5 = multiplier * (v2 & 0x3F);
+  if (v5 == 0)
+  {
     return -v7;
-  if ( v3 & 0x100 )
-  {
-    v9 = 5;
-  }
-  else
-  {
-    if ( (v3 & 0x80u) == 0 )
-    {
-      v8 = ((v3 & 0x40) != 0) + 1;
-      return v5 * (v8 - 1) - v7 + v4 + 7;
-    }
-    v9 = 3;
-  }
-  v8 = v9;
-  return v5 * (v8 - 1) - v7 + v4 + 7;
+  }
+  return v5 - v7 + 7;
 }
 
 //----- (0049125A) --------------------------------------------------------
 int Player::GetPerception()
 {
-  Player *v1; // edi@1
   unsigned __int16 v2; // ax@1
-  unsigned __int16 v3; // bx@1
-  int v4; // esi@1
   int v5; // edi@1
-  int v7; // eax@5
-  signed int v8; // [sp-4h] [bp-10h]@4
-
-  v1 = this;
+
   v2 = GetActualSkillLevel(PLAYER_SKILL_PERCEPTION);
-  v3 = v1->pActiveSkills[PLAYER_SKILL_PERCEPTION];
-  v4 = v2 & 0x3F;
-  v5 = v1->pActiveSkills[PLAYER_SKILL_PERCEPTION] & 0x3F;
-  if ( (signed int)SkillToMastery(v2) >= 4 )
+  if ( SkillToMastery(v2) >= 4 )
     return 10000;
-  if ( v3 & 0x100 )
-  {
-    v8 = 5;
-  }
-  else
-  {
-    if ( (v3 & 0x80u) == 0 )
-    {
-      v7 = ((v3 & 0x40) != 0) + 1;
-      return v4 + v5 * (v7 - 1);
-    }
-    v8 = 3;
-  }
-  v7 = v8;
-  return v4 + v5 * (v7 - 1);
+
+  int multiplier = GetMultiplierForSkillLevel(v2, 1, 2, 3, 5);
+  v5 = multiplier * (v2 & 0x3F);
+  return v5;
 }
 
 //----- (004912B0) --------------------------------------------------------
 int Player::GetDisarmTrap()
 {
-  Player *v1; // ebp@1
   unsigned __int16 v2; // ax@1
-  unsigned __int16 v3; // bx@1
-  int v4; // esi@1
   int v5; // edi@1
-  int v7; // eax@7
-  signed int v8; // [sp-4h] [bp-14h]@6
-
-  v1 = this;
+
   v2 = GetActualSkillLevel(PLAYER_SKILL_TRAP_DISARM);
-  v3 = v1->pActiveSkills[29];
-  v4 = v2 & 0x3F;
-  v5 = v1->pActiveSkills[29] & 0x3F;
   if ( (signed int)SkillToMastery(v2) >= 4 )
     return 10000;
-  if ( HasEnchantedItemEquipped(35) )
-    v4 *= 2;
-  if ( v3 & 0x100 )
-  {
-    v8 = 5;
-  }
-  else
-  {
-    if ( (v3 & 0x80u) == 0 )
-    {
-      v7 = ((v3 & 0x40) != 0) + 1;
-      return v4 + v5 * (v7 - 1);
-    }
-    v8 = 3;
-  }
-  v7 = v8;
-  return v4 + v5 * (v7 - 1);
+
+  int multiplier = GetMultiplierForSkillLevel(v2, 1, 2, 3, 5);
+  if ( HasEnchantedItemEquipped(35) )  //only the real skill level is supposed to be added again, not the multiplied value
+    multiplier++;
+  v5 = multiplier * (v2 & 0x3F);
+  return v5;
 }
 
 //----- (00491317) --------------------------------------------------------
 char Player::GetLearningPercent()
 {
-  Player *v1; // esi@1
   int v2; // eax@1
-  unsigned __int16 v3; // bx@1
-  int v4; // ecx@1
-  int v5; // eax@4
-  signed int v7; // [sp-4h] [bp-Ch]@3
-
-  v1 = this;
+
   v2 = GetActualSkillLevel(PLAYER_SKILL_LEARNING);
-  v3 = v1->pActiveSkills[36];
-  v4 = v2 & 0x3F;
-  if ( v2 )
-  {
-    if (v3 & 0x100 )
-    {
-      v7 = 5;
-    }
-    else
-    {
-      if ( (v3 & 0x80u) == 0 )
-      {
-        v5 = ((v3 & 0x40) != 0) + 1;
-        goto LABEL_8;
-      }
-      v7 = 3;
-    }
-    v5 = v7;
-LABEL_8:
-    v2 = (v1->pActiveSkills[36] & 0x3F) * (v5 - 1) + v4 + 9;
-  }
-  return v2;
+  int multiplier = GetMultiplierForSkillLevel(v2, 1, 2, 3, 5);
+  return multiplier * v2 + 9;
 }
 
 //----- (0048C6AF) --------------------------------------------------------
@@ -4621,11 +4447,11 @@
     int multiplier = 0;
     if ( inSkill == CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS )
     {
-      multiplier = GetMultiplierForMastery(armmaster_skill, 0, 0, 1, 2);
+      multiplier = GetMultiplierForSkillLevel(armmaster_skill, 0, 0, 1, 2);
     }
     else if ( inSkill == CHARACTER_ATTRIBUTE_ATTACK )
     {
-      multiplier = GetMultiplierForMastery(armmaster_skill, 0, 1, 1, 2);
+      multiplier = GetMultiplierForSkillLevel(armmaster_skill, 0, 1, 1, 2);
     } 
     armsMasterBonus = multiplier * (armmaster_skill & 0x3F);
   }
@@ -4636,7 +4462,7 @@
     if (HasItemEquipped(EQUIP_BOW))
     {
       int bowSkillLevel = GetActualSkillLevel(PLAYER_SKILL_DODGE);
-      int multiplier = GetMultiplierForMastery(bowSkillLevel, 0, 0, 0, 1);
+      int multiplier = GetMultiplierForSkillLevel(bowSkillLevel, 0, 0, 0, 1);
       return multiplier * (bowSkillLevel & 0x3F);
     }
     return 0;
@@ -4672,27 +4498,27 @@
           switch (itemSkillType)
           {
           case PLAYER_SKILL_STAFF:
-            multiplier = GetMultiplierForMastery(currArmorSkillLevel, 0, 1, 1, 1);
+            multiplier = GetMultiplierForSkillLevel(currArmorSkillLevel, 0, 1, 1, 1);
             break;
           case PLAYER_SKILL_SWORD:
           case PLAYER_SKILL_SPEAR:
-            multiplier = GetMultiplierForMastery(currArmorSkillLevel, 0, 0, 0, 1);
+            multiplier = GetMultiplierForSkillLevel(currArmorSkillLevel, 0, 0, 0, 1);
             break;
           case PLAYER_SKILL_SHIELD:
             wearingArmor = true;
-            multiplier = GetMultiplierForMastery(currArmorSkillLevel, 1, 1, 2, 2);
+            multiplier = GetMultiplierForSkillLevel(currArmorSkillLevel, 1, 1, 2, 2);
             break;
           case PLAYER_SKILL_LEATHER:
             wearingLeather = true;
-            multiplier = GetMultiplierForMastery(currArmorSkillLevel, 1, 1, 2, 2);
+            multiplier = GetMultiplierForSkillLevel(currArmorSkillLevel, 1, 1, 2, 2);
             break;
           case PLAYER_SKILL_CHAIN:
             wearingArmor = true;
-            multiplier = GetMultiplierForMastery(currArmorSkillLevel, 1, 1, 1, 1);
+            multiplier = GetMultiplierForSkillLevel(currArmorSkillLevel, 1, 1, 1, 1);
             break;
           case PLAYER_SKILL_PLATE:
             wearingArmor = true; 
-            multiplier = GetMultiplierForMastery(currArmorSkillLevel, 1, 1, 1, 1);
+            multiplier = GetMultiplierForSkillLevel(currArmorSkillLevel, 1, 1, 1, 1);
             break;
           }
           ACSum += multiplier * (currArmorSkillLevel & 0x3F);
@@ -4701,7 +4527,7 @@
 
       int dodgeSkillLevel = GetActualSkillLevel(PLAYER_SKILL_DODGE);
       int dodgeMastery = SkillToMastery(dodgeSkillLevel);
-      int multiplier = GetMultiplierForMastery(dodgeSkillLevel, 1, 2, 3, 3);
+      int multiplier = GetMultiplierForSkillLevel(dodgeSkillLevel, 1, 2, 3, 3);
       if ( !wearingArmor && (!wearingLeather || dodgeMastery == 4) )
       {
         ACSum += multiplier * (dodgeSkillLevel & 0x3F);
@@ -4717,7 +4543,7 @@
       {
         return 0;
       }
-      int multiplier = GetMultiplierForMastery(unarmedSkill, 0, 1, 2, 2);
+      int multiplier = GetMultiplierForSkillLevel(unarmedSkill, 0, 1, 2, 2);
       return armsMasterBonus + multiplier * (unarmedSkill & 0x3F);
     }
     for (int i = 0; i < 16; ++i)
@@ -4731,13 +4557,13 @@
           int currentItemSkillLevel = this->GetActualSkillLevel(currItemSkillType);
           if (currItemSkillType == PLAYER_SKILL_BLASTER)
           {
-            int multiplier = GetMultiplierForMastery(currentItemSkillLevel, 1, 2, 3, 5);
+            int multiplier = GetMultiplierForSkillLevel(currentItemSkillLevel, 1, 2, 3, 5);
             return multiplier * (currentItemSkillLevel & 0x3F);
           }
           else if (currItemSkillType == PLAYER_SKILL_STAFF && this->GetActualSkillLevel(PLAYER_SKILL_UNARMED) > 0)
           {
             int unarmedSkillLevel = this->GetActualSkillLevel(PLAYER_SKILL_UNARMED);
-            int multiplier = GetMultiplierForMastery(currentItemSkillLevel, 1, 1, 2, 2);
+            int multiplier = GetMultiplierForSkillLevel(currentItemSkillLevel, 1, 1, 2, 2);
             return multiplier * (unarmedSkillLevel & 0x3F) + armsMasterBonus + (currentItemSkillLevel & 0x3F);
           }
           else
@@ -4759,12 +4585,12 @@
         int currentItemSkillLevel = this->GetActualSkillLevel(currentItemSkillType);
         if ( currentItemSkillType == PLAYER_SKILL_BOW )
         {
-          int multiplier = GetMultiplierForMastery(currentItemSkillLevel, 1, 1, 1, 1);
+          int multiplier = GetMultiplierForSkillLevel(currentItemSkillLevel, 1, 1, 1, 1);
           return multiplier * (currentItemSkillLevel & 0x3F);
         }
         else if ( currentItemSkillType == PLAYER_SKILL_BLASTER )
         {      
-          int multiplier = GetMultiplierForMastery(currentItemSkillLevel, 1, 2, 3, 5);
+          int multiplier = GetMultiplierForSkillLevel(currentItemSkillLevel, 1, 2, 3, 5);
           return multiplier * (currentItemSkillLevel & 0x3F);
         }
       }
@@ -4780,7 +4606,7 @@
       {
         return 0;
       }
-      int multiplier = GetMultiplierForMastery(unarmedSkillLevel, 0, 1, 2, 2);
+      int multiplier = GetMultiplierForSkillLevel(unarmedSkillLevel, 0, 1, 2, 2);
       return multiplier * (unarmedSkillLevel & 0x3F);
     }
     for (int i = 0; i < 16; i++)
@@ -4800,7 +4626,7 @@
             if ( SkillToMastery(currItemSkillLevel) >= 4 && this->GetActualSkillLevel(PLAYER_SKILL_UNARMED) > 0)
             {
               int unarmedSkillLevel = this->GetActualSkillLevel(PLAYER_SKILL_UNARMED);
-              int multiplier = GetMultiplierForMastery(unarmedSkillLevel, 0, 1, 2, 2);
+              int multiplier = GetMultiplierForSkillLevel(unarmedSkillLevel, 0, 1, 2, 2);
               return multiplier * (unarmedSkillLevel & 0x3F);
             }
             else
@@ -4810,23 +4636,23 @@
             break;
 
           case PLAYER_SKILL_DAGGER:
-            multiplier = GetMultiplierForMastery(currItemSkillLevel, 0, 0, 0, 1);
+            multiplier = GetMultiplierForSkillLevel(currItemSkillLevel, 0, 0, 0, 1);
             baseSkillBonus = multiplier * (currItemSkillLevel & 0x3F);
             return armsMasterBonus + baseSkillBonus;
             break;
           case PLAYER_SKILL_SWORD:
-            multiplier = GetMultiplierForMastery(currItemSkillLevel, 0, 0, 0, 0);
+            multiplier = GetMultiplierForSkillLevel(currItemSkillLevel, 0, 0, 0, 0);
             baseSkillBonus = multiplier * (currItemSkillLevel & 0x3F);
             return armsMasterBonus + baseSkillBonus;
             break;
           case PLAYER_SKILL_MACE:
           case PLAYER_SKILL_SPEAR:
-            multiplier = GetMultiplierForMastery(currItemSkillLevel, 0, 1, 1, 1);
+            multiplier = GetMultiplierForSkillLevel(currItemSkillLevel, 0, 1, 1, 1);
             baseSkillBonus = multiplier * (currItemSkillLevel & 0x3F);
             return armsMasterBonus + baseSkillBonus;
             break;
           case PLAYER_SKILL_AXE:
-            multiplier = GetMultiplierForMastery(currItemSkillLevel, 0, 0, 1, 1);
+            multiplier = GetMultiplierForSkillLevel(currItemSkillLevel, 0, 0, 1, 1);
             baseSkillBonus = multiplier * (currItemSkillLevel & 0x3F);
             return armsMasterBonus + baseSkillBonus;
             break;
@@ -4841,7 +4667,7 @@
   }
 }
 
-unsigned int Player::GetMultiplierForMastery(unsigned int skillValue, int mult1, int mult2, int mult3, int mult4)
+unsigned int Player::GetMultiplierForSkillLevel(unsigned int skillValue, int mult1, int mult2, int mult3, int mult4)
 {
   int masteryLvl = SkillToMastery(skillValue);
   switch (masteryLvl)
--- a/Player.h	Sat Sep 07 10:49:42 2013 +0200
+++ b/Player.h	Sat Sep 07 21:00:02 2013 +0200
@@ -537,8 +537,8 @@
   int SelectPhrasesTransaction(ItemGen *pItem, int building_type, int BuildID_2Events, int a5);
   int GetBodybuilding();
   int GetMeditation();
-  int CanIdentify(ItemGen *pItem);
-  int CanRepair(ItemGen *);
+  bool CanIdentify(ItemGen *pItem);
+  bool CanRepair(ItemGen *pItem);
   int GetMerchant();
   int GetPerception();
   int GetDisarmTrap();
@@ -581,7 +581,7 @@
   void DrawPlayerBuffAnimBasedOnCondition(int currPlayerId);
   void EquipBody(ITEM_EQUIP_TYPE uEquipType);
 
-  unsigned int GetMultiplierForMastery(unsigned int skillValue, int mult1, int mult2, int mult3, int mult4);
+  unsigned int GetMultiplierForSkillLevel(unsigned int skillValue, int mult1, int mult2, int mult3, int mult4);
   int CalculateMeleeDmgToEnemyWithWeapon( ItemGen * weapon, unsigned int uTargetActorID , bool addOneDice);
 
   bool IsWeak();