diff mm7_4.cpp @ 2237:d903816e972e

_4B254D_SkillMasteryTeacher adding case, removing nested ifs, adding some comments
author Grumpy7
date Sun, 23 Feb 2014 14:12:07 +0100
parents 3c802b5e026a
children f66d8be6ad5b
line wrap: on
line diff
--- a/mm7_4.cpp	Sun Feb 23 12:55:01 2014 +0100
+++ b/mm7_4.cpp	Sun Feb 23 14:12:07 2014 +0100
@@ -1823,22 +1823,22 @@
 }
 
 //----- (004B254D) --------------------------------------------------------
-char * _4B254D_SkillMasteryTeacher(int _this)
+const char * _4B254D_SkillMasteryTeacher(int _this)
 {
   //Player *v1; // esi@1
   int v2; // edx@1
   int v3; // ecx@1
   int pClassType; // eax@7
   int v6; // eax@7
-  int v7; // ebx@7
+  int pointsInSkillWOutMastery; // ebx@7
   //int v8; // ebx@8
   signed int v9; // esi@8
-  int v10; // eax@8
+  int classBaseId; // eax@8
   char *v11; // ecx@8
   //int v12; // edi@9
   //char *v13; // edx@9
   signed int v14; // edi@10
-  unsigned int v16; // eax@29
+  unsigned int skillMastery; // eax@29
   //int v17; // eax@36
   char v18; // cl@46
   __int16 v19; // dx@56
@@ -1851,7 +1851,7 @@
   //int v26; // [sp-4h] [bp-30h]@38
   //int v27; // [sp-4h] [bp-30h]@82
   char v28[4]; // [sp+Ch] [bp-20h]@9
-  unsigned __int16 a1[2]; // [sp+1Ch] [bp-10h]@7
+  unsigned __int16 pointsInSkill; // [sp+1Ch] [bp-10h]@7
   //int v33; // [sp+20h] [bp-Ch]@7
   int v34; // [sp+24h] [bp-8h]@7
   char *v35; // [sp+28h] [bp-4h]@1
@@ -1860,119 +1860,90 @@
   v2 = (_this - 200) % 3;
   v3 = (_this - 200) / 3;
   v35 = (char *)pNPCTopics[127].pText;
-  dword_F8B1AC_award_bit_number = v3;
-  if ( v2 )
+    dword_F8B1AC_award_bit_number = v3;
+  switch(v2)
   {
-    if ( v2 == 1 )
-    {
+    case 0: 
+      gold_transaction_amount = 2000;
+      dword_F8B1B0 = 2;
+      break;
+    case 1: 
       gold_transaction_amount = 5000;
       dword_F8B1B0 = 3;
-    }
-    else
-    {
-      if ( v2 == 2 )
-      {
-        gold_transaction_amount = 8000;
-        dword_F8B1B0 = 4;
-      }
-    }
-  }
-  else
-  {
-    gold_transaction_amount = 2000;
-    dword_F8B1B0 = 2;
+      break;
+    case 2: 
+      gold_transaction_amount = 8000;
+      dword_F8B1B0 = 4;
+      break;
   }
   pClassType = pPlayers[uActiveCharacter]->classType;
   //v33 = pClassType;
   v6 = byte_4ED970_skill_learn_ability_by_class_table[pClassType][v3];
-  *(int *)a1 = pPlayers[uActiveCharacter]->pActiveSkills[v3];
-  v7 = a1[0] & 0x3F;
   v34 = v2 + 2;
   if ( v6 < v2 + 2 )
   {
-    //v8 = v33;
-    
-    v10 = pClassType - pClassType % 4;
-    v11 = &byte_4ED970_skill_learn_ability_by_class_table[pClassType - pClassType % 4][v3];
-    for ( v9 = 0; v9 < 4; ++v9 )
-    {
-      v28[v9] = ( (unsigned __int8)*v11 < v34 ) ? 0 : 1;
-      v11 += 37;
-    }
-    if ( v28[1] == 1 )
-    {
-      v25 = pClassNames[v10 + 1];
-    }
+    classBaseId = pClassType - pClassType % 4;
+    if (byte_4ED970_skill_learn_ability_by_class_table[classBaseId + 1][v3] >= v34)
+      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[633], pClassNames[classBaseId + 1]);//Вы должны достичь звания %s для обучения этому уровню навыка. You have to be promoted to %s to learn this skill level.
+    else if (byte_4ED970_skill_learn_ability_by_class_table[classBaseId + 2][v3] >= v34
+      && byte_4ED970_skill_learn_ability_by_class_table[classBaseId + 3][v3] >= v34)
+      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[634], pClassNames[classBaseId + 2], pClassNames[classBaseId + 3]);//Вы должны достичь звания %s или %s для обучения этому уровню навыка. You have to be promoted to %s or %s to learn this skill level.
+    else if (byte_4ED970_skill_learn_ability_by_class_table[classBaseId + 2][v3] >= v34)
+      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[633], pClassNames[classBaseId + 2]);//Вы должны достичь звания %s для обучения этому уровню навыка. You have to be promoted to %s to learn this skill level.
+    else if (byte_4ED970_skill_learn_ability_by_class_table[classBaseId + 3][v3] >= v34)
+      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[633], pClassNames[classBaseId + 3]);//Вы должны достичь звания %s для обучения этому уровню навыка. You have to be promoted to %s to learn this skill level.
     else
-    {
-      if ( v28[2] == 1 )
-      {
-        if ( v28[3] == 1 )
-        {
-          sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[634], pClassNames[v10 + 2], pClassNames[v10 + 3]);//Вы должны достичь звания %s или %s для обучения этому уровню навыка.
-          return pTmpBuf.data();
-        }
-        v25 = pClassNames[v10 + 2];
-      }
-      else
-      {
-        if ( v28[3] != 1 )
-        {
-          sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[632], pClassNames[pClassType]);//Этот уровень навыка не может быть постигнут классом %s.
-          return pTmpBuf.data();
-        }
-        v25 = pClassNames[v10 + 3];
-      }
-    }
-    sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[633], v25);//Вы должны достичь звания %s для обучения этому уровню навыка.
+      sprintf(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[632], pClassNames[pClassType]);//Этот уровень навыка не может быть постигнут классом %s. This skill level can not be learned by the %s class.
     return pTmpBuf.data();
   }
   if ( !pPlayers[uActiveCharacter]->CanAct() )
-    return (char *)pNPCTopics[122].pText;
-  if ( !v7 )
-    return (char *)pNPCTopics[131].pText;
-  v16 = SkillToMastery(a1[0]);
-  if ( (signed int)v16 > v2 + 1 )
-    return (char *)pNPCTopics[v2 + 128].pText;
+    return pNPCTopics[122].pText; //Not in your condition!
+  pointsInSkill = pPlayers[uActiveCharacter]->pActiveSkills[v3];
+  pointsInSkillWOutMastery = pointsInSkill & 0x3F;
+  if ( !pointsInSkillWOutMastery )
+    return pNPCTopics[131].pText; //You must know the skill before you can become an expert in it!
+  skillMastery = SkillToMastery(pointsInSkill);
+  if ( (signed int)skillMastery > v2 + 1 )  // You are already an SKILLLEVEL in this skill.	
+    return pNPCTopics[v2 + 128].pText;
   if ( v34 != 2 )
   {
     if ( v34 == 3 )
     {
-      if ( (signed int)v16 >= 2 && v7 >= 7 )
+      if ( (signed int)skillMastery >= 2 && pointsInSkillWOutMastery >= 7 )
       {
         switch ( dword_F8B1AC_award_bit_number )
         {
-          case 12:
-          case 13:
-          case 14:
-          case 15:
-          case 16:
-          case 17:
-          case 18:
+          case 12:    //Fire magic
+          case 13:    //Air magic
+          case 14:    //Water magic
+          case 15:    //Earth magic
+          case 16:    //Spirit magic
+          case 17:    //Mind magic
+          case 18:    //Body magic
             gold_transaction_amount = 4000;
             goto LABEL_42;
-          case 19:
+          case 19:    //Light magic
             v19 = 114;
             if ( !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, v19) )
               return v35;
             if ( !gold_transaction_amount )
               goto LABEL_79;
             goto LABEL_42;
-          case 20:
+          case 20:    //Dark magic
             v19 = 110;
             if ( !(unsigned __int16)_449B57_test_bit(pParty->_quest_bits, v19) )
               return v35;
             if ( !gold_transaction_amount )
               goto LABEL_79;
             goto LABEL_42;
-          case 22:
+          case 22:     //Merchant
             v20 = pPlayers[uActiveCharacter]->GetBaseWillpower();
             if ( v20 < 50 )
               return v35;
             if ( !gold_transaction_amount )
               goto LABEL_79;
             goto LABEL_42;
-          case 24:
+          case 24:     //Body Building
             gold_transaction_amount = 2500;
             v20 = pPlayers[uActiveCharacter]->GetBaseEndurance();
             if ( v20 < 50 )
@@ -1980,30 +1951,30 @@
             if ( !gold_transaction_amount )
               goto LABEL_79;
             goto LABEL_42;
-          case 36:
+          case 36:     //Learning
             v20 = pPlayers[uActiveCharacter]->GetBaseIntelligence();
             if ( v20 < 50 )
               return v35;
             if ( !gold_transaction_amount )
               goto LABEL_79;
             goto LABEL_42;
-          case 21:
-          case 23:
-          case 25:
-          case 26:
-          case 29:
-          case 32:
-          case 34:
-          case 35:
+          case 21:     //Identify Item
+          case 23:     //Repait Item
+          case 25:     //Meditation
+          case 26:     //Perception
+          case 29:     //Disarm Trap
+          case 32:     //Identify Monster
+          case 34:     //Stealing
+          case 35:     //Alchemy
             gold_transaction_amount = 2500;
             goto LABEL_42;
-          case 8:
-          case 9:
-          case 10:
-          case 11:
+          case 8:     //Shield
+          case 9:     //Leather
+          case 10:     //Chain
+          case 11:     //Plate
             gold_transaction_amount = 3000;
             goto LABEL_42;
-          case 7:
+          case 7:     //Blaster
             gold_transaction_amount = 0;
             if ( !gold_transaction_amount )
               goto LABEL_79;
@@ -2027,11 +1998,11 @@
           goto LABEL_79;
         goto LABEL_42;
       }
-      if ( (signed int)v16 >= 3 && v7 >= 10 )
+      if ( (signed int)skillMastery >= 3 && pointsInSkillWOutMastery >= 10 )
       {
         switch ( dword_F8B1AC_award_bit_number )
         {
-          case 19:
+        case 19:     //Light Magic
             if ( pPlayers[uActiveCharacter]->ProfessionOrGuildFlagsCorrect(0x22u, 1) == 1 )
             {
               if ( !gold_transaction_amount )
@@ -2045,7 +2016,7 @@
               goto LABEL_42;
             }
             return v35;
-          case 20:
+          case 20:     //Dark Magic
             if ( pPlayers[uActiveCharacter]->ProfessionOrGuildFlagsCorrect(0x23u, 1) == 1 )
             {
               if ( !gold_transaction_amount )
@@ -2059,38 +2030,38 @@
               goto LABEL_42;
             }
             return v35;
-          case 30:
+          case 30:     //Dodging
             v18 = LOBYTE(pPlayers[uActiveCharacter]->pActiveSkills[PLAYER_SKILL_UNARMED]);
             if ( (v18 & 0x3Fu) < 0xA )
               return v35;
             if ( !gold_transaction_amount )
               goto LABEL_79;
             goto LABEL_42;
-          case 31:
+          case 31:     //Unarmed
             v18 = LOBYTE(pPlayers[uActiveCharacter]->pActiveSkills[PLAYER_SKILL_DODGE]);
             if ( (v18 & 0x3Fu) < 0xA )
               return v35;
             if ( !gold_transaction_amount )
               goto LABEL_79;
             goto LABEL_42;
-          case 21:
-          case 23:
-          case 24:
-          case 25:
-          case 26:
-          case 29:
-          case 32:
-          case 34:
-          case 35:
+          case 21:     //Identify Item
+          case 23:     //Repait Item
+          case 24:     //Body Building
+          case 25:     //Meditation
+          case 26:     //Perception
+          case 29:     //Disarm Trap
+          case 32:     //Identify Monster
+          case 34:     //Stealing
+          case 35:     //Alchemy
             gold_transaction_amount = 6000;
             goto LABEL_42;
-          case 8:
-          case 9:
-          case 10:
-          case 11:
+          case 8:     //Shield
+          case 9:     //Leather
+          case 10:     //Chain
+          case 11:     //Plate
             gold_transaction_amount = 7000;
             goto LABEL_42;
-          case 7:
+          case 7:    //Blaster
             break;
           default:
             if ( !gold_transaction_amount )
@@ -2105,7 +2076,7 @@
     }
     return v35;
   }
-  if ( v7 < 4 )
+  if ( pointsInSkillWOutMastery < 4 )
     return v35;
   if ( dword_F8B1AC_award_bit_number > 27 )
   {