# HG changeset patch # User Grumpy7 # Date 1378522872 -7200 # Node ID fed56133bf8a6cffee5c82bedd9d3a1bb53dd137 # Parent e264ce95f27dbfd9e1595f58cbaceafdcfbd3a40 Player:GetSkillBonus cleanup, multiplier evaluation moved to a separate function, variable clanup, renaming, scope reduction diff -r e264ce95f27d -r fed56133bf8a Player.cpp --- a/Player.cpp Sat Sep 07 04:15:06 2013 +0200 +++ b/Player.cpp Sat Sep 07 05:01:12 2013 +0200 @@ -4805,282 +4805,136 @@ //----- (0048FC00) -------------------------------------------------------- -int Player::GetSkillBonus(enum CHARACTER_ATTRIBUTE_TYPE a2) -{ - Player *v2; // esi@1 - int armmaster_skill; // eax@1 - char v4; // di@1 - signed int v5; // ebx@1 - unsigned int armaster_mastery; // eax@2 - unsigned __int8 v7; // sf@5 - unsigned __int8 v8; // of@5 - PlayerEquipment *v9; // ebx@19 - Player *v10; // ecx@20 - PLAYER_SKILL_TYPE v11; // edi@21 - int v12; // eax@21 - int v13; // edi@21 - signed int v15; // esi@25 - char v16; // al@32 - int v18; // eax@36 - unsigned int v19; // eax@37 - unsigned int v20; // edi@40 - int v21; // edx@41 - int v22; // eax@42 - PLAYER_SKILL_TYPE v23; // edi@45 - unsigned __int16 v24; // ax@45 - unsigned __int16 v25; // bx@45 - unsigned int v26; // eax@45 - unsigned __int8 v27; // sf@50 - unsigned __int8 v28; // of@50 - unsigned int v29; // eax@52 - int v30; // eax@55 - int v31; // eax@58 - unsigned int v32; // eax@59 - int v33; // eax@65 - char v34; // si@65 - ITEM_EQUIP_TYPE v35; // edi@69 - int v36; // edx@70 - int v37; // eax@71 - PLAYER_SKILL_TYPE v38; // edi@74 - int v39; // eax@74 - int v40; // eax@89 - char v41; // si@89 - int v42; // eax@96 - PLAYER_SKILL_TYPE v43; // edx@97 - int v44; // eax@97 - int v45; // eax@98 - int v46; // eax@99 - int v47; // eax@100 - int v48; // eax@101 - int v49; // eax@102 - unsigned __int16 v50; // ax@113 - char v51; // di@113 - unsigned int v52; // eax@113 - int v53; // edi@113 - signed int i; // ecx@113 - unsigned __int16 v55; // ax@118 - char v56; // si@118 - unsigned int v57; // eax@118 - int v58; // esi@121 - signed int j; // ecx@121 - int base_value; // edi@126 - int attrib_modif; // eax@126 - signed int v62; // [sp-4h] [bp-30h]@26 - signed int v63; // [sp-4h] [bp-30h]@80 - int v64; // [sp+Ch] [bp-20h]@104 - int v65; // [sp+10h] [bp-1Ch]@104 - int v66; // [sp+14h] [bp-18h]@104 - int v67; // [sp+18h] [bp-14h]@104 - int v68; // [sp+1Ch] [bp-10h]@69 - //PlayerEquipment *v69; // [sp+20h] [bp-Ch]@1 - int skill_bonus; // [sp+24h] [bp-8h]@1 - int v71; // [sp+28h] [bp-4h]@1 - int a1; // [sp+34h] [bp+8h]@21 - int a1a; // [sp+34h] [bp+8h]@74 - signed int a1b; // [sp+34h] [bp+8h]@94 - int multiplier; - int arm_bonus; - int lvl_avl[4]; - - v2 = this; - skill_bonus = 0; - //v69 = 0; - multiplier =0; - arm_bonus =0; - v71 = 0; - armmaster_skill = GetActualSkillLevel(PLAYER_SKILL_ARMSMASTER); - v4 = armmaster_skill; - v5 = 1; - if ( armmaster_skill ) - { - armaster_mastery = SkillToMastery(armmaster_skill); - if ( a2 == CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS ) - { - if ( armaster_mastery == 4 ) - multiplier =2; - else if ( armaster_mastery == 3 ) - multiplier =1; - } - else if ( a2 == CHARACTER_ATTRIBUTE_ATTACK ) - { - if ( armaster_mastery == 4 ) - multiplier =2; - else if ( armaster_mastery >= 2 ) - multiplier =1; +int Player::GetSkillBonus(enum CHARACTER_ATTRIBUTE_TYPE inSkill) +{ + int armsMasterBonus; + + armsMasterBonus = 0; + int armmaster_skill = GetActualSkillLevel(PLAYER_SKILL_ARMSMASTER); + if ( armmaster_skill > 0 ) + { + int multiplier = 0; + if ( inSkill == CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS ) + { + multiplier = GetMultiplierForMastery(armmaster_skill, 0, 0, 1, 2); + } + else if ( inSkill == CHARACTER_ATTRIBUTE_ATTACK ) + { + multiplier = GetMultiplierForMastery(armmaster_skill, 0, 1, 1, 2); } - arm_bonus=(armmaster_skill&0x3F)*multiplier; - } - - switch(a2) + armsMasterBonus = multiplier * (armmaster_skill & 0x3F); + } + + switch(inSkill) { case CHARACTER_ATTRIBUTE_HEALTH: { - base_value = pBaseHealthPerLevelByClass[classType]; - attrib_modif = GetBodybuilding(); + int base_value = pBaseHealthPerLevelByClass[classType]; + int attrib_modif = GetBodybuilding(); return base_value * attrib_modif; } break; case CHARACTER_ATTRIBUTE_MANA: { - base_value = pBaseManaPerLevelByClass[classType]; - attrib_modif = GetMeditation(); + int base_value = pBaseManaPerLevelByClass[classType]; + int attrib_modif = GetMeditation(); return base_value * attrib_modif; } break; case CHARACTER_ATTRIBUTE_AC_BONUS: { - a1b = 0; - v71 = 0; - - for (j=0; j<16; ++j) - { - if (pEquipment.pIndices[j]&&(!pOwnItems[ pEquipment.pIndices[j]].Broken())) + bool wearingArmor = false; + bool wearingLeather = false; + unsigned int ACSum = 0; + + for (int j = 0; j < 16; ++j) + { + if (pEquipment.pIndices[j] && (!pOwnItems[pEquipment.pIndices[j]].Broken())) { - int curr_item =pOwnItems[pEquipment.pIndices[j]].uItemID; - v44=pItemsTable->pItems[curr_item].uSkillType; - switch (v44) + int curr_item = pOwnItems[pEquipment.pIndices[j]].uItemID; + PLAYER_SKILL_TYPE itemSkillType = (PLAYER_SKILL_TYPE)pItemsTable->pItems[curr_item].uSkillType; + int currArmorSkillLevel = GetActualSkillLevel(itemSkillType); + int multiplier = 0; + switch (itemSkillType) { case PLAYER_SKILL_STAFF: - - lvl_avl[0]=0; - lvl_avl[1]=1; - lvl_avl[2]=0; - lvl_avl[3]=0; + multiplier = GetMultiplierForMastery(currArmorSkillLevel, 0, 1, 1, 1); break; case PLAYER_SKILL_SWORD: case PLAYER_SKILL_SPEAR: - lvl_avl[0]=0; - lvl_avl[1]=0; - lvl_avl[2]=0; - lvl_avl[3]=1; + multiplier = GetMultiplierForMastery(currArmorSkillLevel, 0, 0, 0, 1); break; case PLAYER_SKILL_SHIELD: - a1b = 1; - lvl_avl[0]=1; - lvl_avl[1]=0; - lvl_avl[2]=1; - lvl_avl[3]=0; + wearingArmor = true; + multiplier = GetMultiplierForMastery(currArmorSkillLevel, 1, 1, 2, 2); break; case PLAYER_SKILL_LEATHER: - v71 = 1; - lvl_avl[0]=1; - lvl_avl[1]=0; - lvl_avl[2]=1; - lvl_avl[3]=0; - + wearingLeather = true; + multiplier = GetMultiplierForMastery(currArmorSkillLevel, 1, 1, 2, 2); break; case PLAYER_SKILL_CHAIN: - a1b = 1; - lvl_avl[0]=1; - lvl_avl[1]=0; - lvl_avl[2]=0; - lvl_avl[3]=0; + wearingArmor = true; + multiplier = GetMultiplierForMastery(currArmorSkillLevel, 1, 1, 1, 1); break; case PLAYER_SKILL_PLATE: - a1b = 1; - lvl_avl[0]=1; - lvl_avl[1]=0; - lvl_avl[2]=0; - lvl_avl[3]=0; + wearingArmor = true; + multiplier = GetMultiplierForMastery(currArmorSkillLevel, 1, 1, 1, 1); break; - default: - continue; } - - v50= GetActualSkillLevel((PLAYER_SKILL_TYPE)v44); - v51 = v50; - v52 = SkillToMastery(v50); - v53 = v51 & 0x3F; - for ( i = 0; i < (signed int)v52; ++i ) - { - if ( lvl_avl[i] ) - skill_bonus += v53; - } + ACSum += multiplier * (currArmorSkillLevel & 0x3F); } } - lvl_avl[0]=1; - lvl_avl[1]=1; - lvl_avl[2]=1; - lvl_avl[3]=0; - - v55 = GetActualSkillLevel(PLAYER_SKILL_DODGE); - v56 = v55; - v57 = SkillToMastery(v55); - if ( !a1b && (!v71 || v57 == 4) ) - { - v58 = v56 & 0x3F; - for ( j = 0; j < (signed int)v57; ++j ) - { - if ( lvl_avl[j] ) - skill_bonus += v58; - } - } - return skill_bonus; + int dodgeSkillLevel = GetActualSkillLevel(PLAYER_SKILL_DODGE); + int dodgeMastery = SkillToMastery(dodgeSkillLevel); + int multiplier = GetMultiplierForMastery(dodgeSkillLevel, 1, 2, 3, 3); + if ( !wearingArmor && (!wearingLeather || dodgeMastery == 4) ) + { + ACSum += multiplier * (dodgeSkillLevel & 0x3F); + } + return ACSum; } break; case CHARACTER_ATTRIBUTE_ATTACK: { - if ( v2->IsUnarmed() == 1 ) - { - v33 = v2->GetActualSkillLevel(PLAYER_SKILL_UNARMED); - if (!v33) + if ( this->IsUnarmed() ) + { + int unarmedSkill = this->GetActualSkillLevel(PLAYER_SKILL_UNARMED); + if (!unarmedSkill) { return 0; } - v34 = SkillToMastery(v33); - if (v34 >= 3) - { - multiplier = 2; - } - else + int multiplier = GetMultiplierForMastery(unarmedSkill, 0, 1, 2, 2); + return armsMasterBonus + multiplier * (unarmedSkill & 0x3F); + } + for (int i = 0; i < 16; ++i) + { + if ( this->HasItemEquipped((ITEM_EQUIP_TYPE)i) ) { - multiplier = 1; - } - v30 = multiplier * (v33 & 0x3F); - return arm_bonus + v30; - } - v35 = (ITEM_EQUIP_TYPE)0; - v68 = 0; - for (i=0; i<16 ; ++i) - { - if ( v2->HasItemEquipped((ITEM_EQUIP_TYPE)i) ) - { - v37 = v2->pEquipment.pIndices[i]-1; - if ( pItemsTable->pItems[v37].uEquipType <= EQUIP_MAIN_HAND) - break; + int currItemIndex = this->pEquipment.pIndices[i] - 1; + if ( pItemsTable->pItems[currItemIndex].uEquipType <= EQUIP_MAIN_HAND) + { + PLAYER_SKILL_TYPE currItemSkillType = (PLAYER_SKILL_TYPE)pItemsTable->pItems[currItemIndex].uSkillType; + int currentItemSkillLevel = this->GetActualSkillLevel(currItemSkillType); + if (currItemSkillType == PLAYER_SKILL_BLASTER) + { + int multiplier = GetMultiplierForMastery(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); + return multiplier * (unarmedSkillLevel & 0x3F) + armsMasterBonus + (currentItemSkillLevel & 0x3F); + } + else + { + return armsMasterBonus + (currentItemSkillLevel & 0x3F); + } + } } } - if ( i >= 16 ) - return 0; - - v38 = (PLAYER_SKILL_TYPE)pItemsTable->pItems[v37].uSkillType; - a1a = v2->GetActualSkillLevel(v38); - if (v38 == PLAYER_SKILL_BLASTER) - { - v39 = SkillToMastery(a1a); - switch (v39) - { - case 1: multiplier=1; break; - case 2: multiplier=2; break; - case 3: multiplier=3; break; - case 4: multiplier=5; break; - } - return multiplier * (a1a & 0x3F); - } - else if (v38 == PLAYER_SKILL_STAFF && v2->GetActualSkillLevel(PLAYER_SKILL_UNARMED) > 0) - { - v40 = v2->GetActualSkillLevel(PLAYER_SKILL_UNARMED); - if ( SkillToMastery(v40) >= 3 ) - multiplier = 2; - else - multiplier = 1; - return multiplier * (v40 & 0x3F) + arm_bonus + (a1a & 0x3F); - } - else - { - return arm_bonus + (a1a & 0x3F); - } + return 0; } break; @@ -5088,25 +4942,19 @@ { for (int i = 0; i < 16; i++) { - if ( v2->HasItemEquipped((ITEM_EQUIP_TYPE)v71) ) + if ( this->HasItemEquipped((ITEM_EQUIP_TYPE)i) ) { - v11 = (PLAYER_SKILL_TYPE)pItemsTable->pItems[v2->pInventoryItemList[v2->pEquipment.pIndices[v71] - 1].uItemID].uSkillType; - v12 = this->GetActualSkillLevel(v11); - if ( v11 == PLAYER_SKILL_BOW ) + PLAYER_SKILL_TYPE currentItemSkillType = (PLAYER_SKILL_TYPE)pItemsTable->pItems[this->pInventoryItemList[this->pEquipment.pIndices[i] - 1].uItemID].uSkillType; + int currentItemSkillLevel = this->GetActualSkillLevel(currentItemSkillType); + if ( currentItemSkillType == PLAYER_SKILL_BOW ) { - return v12 & 0x3F; + int multiplier = GetMultiplierForMastery(currentItemSkillLevel, 0, 0, 0, 0); + return multiplier * (currentItemSkillLevel & 0x3F); } - else if ( v11 == PLAYER_SKILL_BLASTER ) + else if ( currentItemSkillType == PLAYER_SKILL_BLASTER ) { - v39 = SkillToMastery(a1); - switch (v39) - { - case 1: multiplier=1; break; - case 2: multiplier=2; break; - case 3: multiplier=3; break; - case 4: multiplier=5; break; - } - return multiplier * (v11 & 0x3F); + int multiplier = GetMultiplierForMastery(currentItemSkillLevel, 1, 2, 3, 5); + return multiplier * (currentItemSkillLevel & 0x3F); } } } @@ -5116,114 +4964,87 @@ case CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS: { - if ( v2->IsUnarmed() ) - { - v18 = v2->GetActualSkillLevel(PLAYER_SKILL_UNARMED); - if ( !v18 ) + if ( this->IsUnarmed() ) + { + int unarmedSkillLevel = this->GetActualSkillLevel(PLAYER_SKILL_UNARMED); + if ( !unarmedSkillLevel ) return 0; { - v39 = SkillToMastery(v18); - switch (v39) - { - case 1: multiplier=0; break; - case 2: multiplier=1; break; - case 3: multiplier=1; break; - case 4: multiplier=2; break; - } - return multiplier * (v18 & 0x3F); - } - } - v20 = 0; - while ( 1 ) - { - if ( v2->HasItemEquipped((ITEM_EQUIP_TYPE)v20) ) - { - v22 = this->pInventoryItemList[this->pEquipment.pIndices[v20]].uItemID; - if ( pItemsTable->pItems[v22].uEquipType <= 1u ) - break; + int multiplier = GetMultiplierForMastery(unarmedSkillLevel, 0, 1, 2, 2); + return multiplier * (unarmedSkillLevel & 0x3F); } - v20++; - if ( (signed int)v20 >= 16 ) - return 0; - } - v71 = 0; - v23 = (PLAYER_SKILL_TYPE)pItemsTable->pItems[v22].uSkillType; - LOBYTE(v24) = v2->GetActualSkillLevel(v23); - v25 = v24; - v26 = SkillToMastery(v24); - switch (v23) - { - case PLAYER_SKILL_STAFF: - if ( (signed int)SkillToMastery(v25) >= 4 && v2->GetActualSkillLevel(PLAYER_SKILL_UNARMED) > 0) + } + for (int i = 0; i < 16; i++) + { + if ( this->HasItemEquipped((ITEM_EQUIP_TYPE)i) ) + { + int currItemId = this->pInventoryItemList[this->pEquipment.pIndices[i]].uItemID; + if ( pItemsTable->pItems[currItemId].uEquipType == EQUIP_MAIN_HAND || pItemsTable->pItems[currItemId].uEquipType == EQUIP_OFF_HAND ) { - v31 = v2->GetActualSkillLevel(PLAYER_SKILL_UNARMED); - if ( v31 ) + PLAYER_SKILL_TYPE currItemSkillType = (PLAYER_SKILL_TYPE)pItemsTable->pItems[currItemId].uSkillType; + int currItemSkillLevel = this->GetActualSkillLevel(currItemSkillType); + int baseSkillBonus; + int multiplier; + switch (currItemSkillType) { - v32 = SkillToMastery(v31); - switch (v32) + case PLAYER_SKILL_STAFF: + 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); + return multiplier * (unarmedSkillLevel & 0x3F); + } + else { - case 1: multiplier=0; break; - case 2: multiplier=1; break; - case 3: multiplier=2; break; - case 4: multiplier=2; break; + return armsMasterBonus; } - return multiplier * (v31 & 0x3F); + break; + + case PLAYER_SKILL_DAGGER: + multiplier = GetMultiplierForMastery(currItemSkillLevel, 0, 0, 0, 1); + baseSkillBonus = multiplier * (currItemSkillLevel & 0x3F); + return armsMasterBonus + baseSkillBonus; + break; + case PLAYER_SKILL_SWORD: + multiplier = GetMultiplierForMastery(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); + baseSkillBonus = multiplier * (currItemSkillLevel & 0x3F); + return armsMasterBonus + baseSkillBonus; + break; + case PLAYER_SKILL_AXE: + multiplier = GetMultiplierForMastery(currItemSkillLevel, 0, 0, 1, 1); + baseSkillBonus = multiplier * (currItemSkillLevel & 0x3F); + return armsMasterBonus + baseSkillBonus; + break; } } - else - { - return arm_bonus; - } - break; - - case PLAYER_SKILL_DAGGER: - v29 = SkillToMastery(v25); - switch (v29) - { - case 1: multiplier=0; break; - case 2: multiplier=0; break; - case 3: multiplier=0; break; - case 4: multiplier=1; break; - } - v30 = multiplier * (v29 & 0x3F); - return arm_bonus + v30; - break; - case PLAYER_SKILL_SWORD: - return arm_bonus; - break; - case PLAYER_SKILL_MACE: - case PLAYER_SKILL_SPEAR: - v29 = SkillToMastery(v25); - switch (v29) - { - case 1: multiplier=0; break; - case 2: multiplier=1; break; - case 3: multiplier=1; break; - case 4: multiplier=1; break; - } - v30 = multiplier * (v29 & 0x3F); - return arm_bonus + v30; - break; - case PLAYER_SKILL_AXE: - v29 = SkillToMastery(v25); - switch (v29) - { - case 1: multiplier=0; break; - case 2: multiplier=0; break; - case 3: multiplier=1; break; - case 4: multiplier=1; break; - } - v30 = multiplier * (v29 & 0x3F); - return arm_bonus + v30; - break; - } + } + } + return 0; } default: return 0; } - -} - +} + +unsigned int Player::GetMultiplierForMastery(unsigned int skillValue, int mult1, int mult2, int mult3, int mult4) +{ + int masteryLvl = SkillToMastery(skillValue); + switch (masteryLvl) + { + case 1: return mult1; + case 2: return mult2; + case 3: return mult3; + case 4: return mult4; + } + assert(false); + return 0; +} //----- (00490109) -------------------------------------------------------- // faces are: 0 1 2 3 human males // 4 5 6 7 human females diff -r e264ce95f27d -r fed56133bf8a Player.h --- a/Player.h Sat Sep 07 04:15:06 2013 +0200 +++ b/Player.h Sat Sep 07 05:01:12 2013 +0200 @@ -621,6 +621,7 @@ inline bool IsMale() { return GetSexByVoice() == SEX_MALE;} inline bool IsFemale() { return !IsMale();} + unsigned int GetMultiplierForMastery(unsigned int skillValue, int mult1, int mult2, int mult3, int mult4); __int64 pConditions[20]; unsigned __int64 uExperience; char pName[16];