Mercurial > mm7
diff Player.cpp @ 1604:4b79ff62df3a
Moved enchantment attribute bonus list to items.cpp/h, created static function that create the enchantments + helper functions to get the enchantment strength, moved the whole logic of Player::GetItemsBonus to a case
author | Grumpy7 |
---|---|
date | Sat, 14 Sep 2013 06:04:18 +0200 |
parents | 5ac59bcb68e9 |
children | 434b796cdfd3 |
line wrap: on
line diff
--- a/Player.cpp Thu Sep 12 09:58:07 2013 +0200 +++ b/Player.cpp Sat Sep 14 06:04:18 2013 +0200 @@ -156,329 +156,6 @@ 30 // PLAYER_SKILL_PLATE }; -#include <map> -#include <list> - -typedef struct CEnchantment -{ - CEnchantment(int bonus, unsigned __int16 Player::* skillPtr = NULL): - statBonus(bonus), - statPtr(skillPtr) - { - } - int statBonus; - unsigned __int16 Player::* statPtr; -} CEnchantment; - -#define NEWBONUSINTOSPECIALLIST(x,y) AddToMap(specialBonusMap, enchId, x, y); -#define NEWBONUSINTOSPECIALLIST2(x,y,z) AddToMap(specialBonusMap, enchId, x, y, z); - -#define NEWBONUSINTOREGULARLIST(x) AddToMap(regularBonusMap, enchId, x); - -#define NEWBONUSINTOARTIFACTLIST(x,y) AddToMap(artifactBonusMap, enchId, x, y); -#define NEWBONUSINTOARTIFACTLIST2(x,y,z) AddToMap(artifactBonusMap, enchId, x, y, z); - -std::map<int, std::map<CHARACTER_ATTRIBUTE_TYPE, CEnchantment*>* > regularBonusMap; -std::map<int, std::map<CHARACTER_ATTRIBUTE_TYPE, CEnchantment*>* > specialBonusMap; -std::map<int, std::map<CHARACTER_ATTRIBUTE_TYPE, CEnchantment*>* > artifactBonusMap; -//------------------------------------------------------------------------- - -void AddToMap(std::map<int, std::map<CHARACTER_ATTRIBUTE_TYPE, CEnchantment*>* > &maptoadd, - int enchId, - CHARACTER_ATTRIBUTE_TYPE attrId, - int bonusValue = 0, - unsigned __int16 Player::* skillPtr = NULL) -{ - auto key = maptoadd.find(enchId); - std::map<CHARACTER_ATTRIBUTE_TYPE, CEnchantment*>* currMap; - if (key == maptoadd.end()) - { - currMap = new std::map<CHARACTER_ATTRIBUTE_TYPE, CEnchantment*>; - maptoadd[enchId] = currMap; - } - else - { - currMap = key->second; - } - Assert(currMap->find(attrId) == currMap->end(), "Attribute %d already present for enchantment %d", attrId, enchId); - (*currMap)[attrId] = new CEnchantment(bonusValue, skillPtr); -} -//------------------------------------------------------------------------- - -void PopulateSpecialBonusMap() -{ - int enchId = 1;// of Protection, +10 to all Resistances - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_FIRE, 10); - NEWBONUSINTOSPECIALLIST( CHARACTER_ATTRIBUTE_RESIST_AIR, 10); - NEWBONUSINTOSPECIALLIST( CHARACTER_ATTRIBUTE_RESIST_WATER, 10); - NEWBONUSINTOSPECIALLIST( CHARACTER_ATTRIBUTE_RESIST_EARTH, 10); - NEWBONUSINTOSPECIALLIST( CHARACTER_ATTRIBUTE_RESIST_MIND, 10); - NEWBONUSINTOSPECIALLIST( CHARACTER_ATTRIBUTE_RESIST_BODY, 10); - - enchId = 2;//of The Gods, +10 to all Seven Statistics - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_STRENGTH, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_INTELLIGENCE, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_WILLPOWER, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ENDURANCE, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ACCURACY, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_SPEED, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_LUCK, 10); - - enchId = 26;//of Air Magic - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_AIR,0, &Player::skillAir); - - enchId = 27;//of Body Magic - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_BODY,0, &Player::skillBody); - - enchId = 28;//of Dark Magic - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_DARK,0, &Player::skillDark); - - enchId = 29;//of Earth Magic - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_EARTH,0, &Player::skillEarth); - - enchId = 30;//of Fire Magic - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_FIRE,0, &Player::skillFire); - - enchId = 31;//of Light Magic - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_LIGHT,0, &Player::skillLight); - - enchId = 32;//of Mind Magic - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_MIND,0, &Player::skillMind); - - enchId = 33;//of Spirit Magic - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_SPIRIT,0, &Player::skillSpirit); - - enchId = 34;//of Water Magic - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_WATER,0, &Player::skillWater); - - enchId = 42;//of Doom - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_STRENGTH, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_INTELLIGENCE, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_WILLPOWER, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ENDURANCE, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ACCURACY, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_SPEED, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_LUCK, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_HEALTH, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_MANA, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_AC_BONUS, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_FIRE, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_AIR, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_WATER, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_EARTH, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_MIND, 1); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_BODY, 1); - - enchId = 43;//of Earth - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ENDURANCE, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_AC_BONUS, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_HEALTH, 10); - - enchId = 44;//of Life - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_HEALTH, 10); - - enchId = 45;//Rogues - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_SPEED, 5); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ACCURACY, 5); - - enchId = 46;//of The Dragon - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_STRENGTH, 25); - - enchId = 47;//of The Eclipse - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_MANA, 10); - - enchId = 48;//of The Golem - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ENDURANCE, 15); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_AC_BONUS, 5); - - enchId = 49;//of The Moon - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_INTELLIGENCE, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_LUCK, 10); - - enchId = 50;//of The Phoenix - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_FIRE, 30); - - enchId = 51;//of The Sky - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_MANA, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_SPEED, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_INTELLIGENCE, 10); - - enchId = 52;//of The Stars - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ENDURANCE, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ACCURACY, 10); - - enchId = 53;//of The Sun - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_STRENGTH, 10); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_WILLPOWER, 10); - - enchId = 54;//of The Troll - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ENDURANCE, 15); - - enchId = 55;//of The Unicorn - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_LUCK, 15); - - enchId = 56;//Warriors - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_STRENGTH, 5); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_ENDURANCE, 5); - - enchId = 57;//Wizards - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_INTELLIGENCE, 5); - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_WILLPOWER, 5); - - enchId = 60;//Monks' - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_DODGE, 3, &Player::skillDodge); - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_UNARMED, 3, &Player::skillUnarmed); - - enchId = 61;//Thieves' - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_TRAP_DISARM, 3, &Player::skillStealing); - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_STEALING, 3, &Player::skillDisarmTrap); - - enchId = 62;//of Identifying - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_ITEM_ID, 3, &Player::skillItemId); - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_MONSTER_ID, 3, &Player::skillMonsterId); - - enchId = 67;//Assassins' - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_TRAP_DISARM, 2, &Player::skillDisarmTrap); - - enchId = 68;//Barbarians' - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_AC_BONUS, 5); - - enchId = 69;//of the Storm - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_AIR, 20); - - enchId = 70;//of the Ocean - NEWBONUSINTOSPECIALLIST(CHARACTER_ATTRIBUTE_RESIST_WATER, 10); - NEWBONUSINTOSPECIALLIST2(CHARACTER_ATTRIBUTE_SKILL_ALCHEMY, 2, &Player::skillAlchemy); -} -//------------------------------------------------------------------------- - -void PopulateRegularBonusMap() -{ - int enchId = 1;//of Might - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_STRENGTH); - - enchId = 2;//of Thought - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_INTELLIGENCE); - - enchId = 3;//of Charm - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_WILLPOWER); - - enchId = 4;//of Vigor - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_ENDURANCE); - - enchId = 5;//of Precision - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_ACCURACY); - - enchId = 6;//of Speed - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_SPEED); - - enchId = 7;//of Luck - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_LUCK); - - enchId = 8;//of Health - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_HEALTH); - - enchId = 9;//of Magic - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_MANA); - - enchId = 10;//of Defense - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_AC_BONUS); - - enchId = 11;//of Fire Resistance - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_RESIST_FIRE); - - enchId = 12;//of Air Resistance - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_RESIST_AIR); - - enchId = 13;//of Water Resistance - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_RESIST_WATER); - - enchId = 14;//of Earth Resistance - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_RESIST_EARTH); - - enchId = 15;//of Mind Resistance - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_RESIST_MIND); - - enchId = 16;//of Body Resistance - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_RESIST_BODY); - - enchId = 17;//of Alchemy - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_SKILL_ALCHEMY); - - enchId = 18;//of Stealing - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_SKILL_STEALING); - - enchId = 19;//of Disarming - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_SKILL_TRAP_DISARM); - - enchId = 20;//of Items - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_SKILL_ITEM_ID); - - enchId = 21;//of Monsters - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_SKILL_MONSTER_ID); - - enchId = 22;//of Arms - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_SKILL_ARMSMASTER); - - enchId = 23;//of Dodging - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_SKILL_DODGE); - - enchId = 24;//of the Fist - NEWBONUSINTOREGULARLIST(CHARACTER_ATTRIBUTE_SKILL_UNARMED); -} - -//------------------------------------------------------------------------- -void PopulateArtifactBonusMap() -{ - int enchId = 1;//of Might - NEWBONUSINTOARTIFACTLIST(CHARACTER_ATTRIBUTE_STRENGTH, 5); -} -//------------------------------------------------------------------------- - -void Player::GetItemBonusSpecialEnchantment(int enchantmentId, CHARACTER_ATTRIBUTE_TYPE attrToGet, int* additiveBonus, int* halfSkillBonus) -{ - auto bonusList = specialBonusMap.find(enchantmentId); - if (bonusList == specialBonusMap.end()) - { - return; - } - std::map<CHARACTER_ATTRIBUTE_TYPE, CEnchantment*>* currList = bonusList->second; - if (currList->find(attrToGet) != currList->end()) - { - CEnchantment* currBonus = (*currList)[attrToGet]; - if (currBonus->statPtr != NULL) - { - if (currBonus->statBonus == 0) - { - *halfSkillBonus = this->*currBonus->statPtr / 2; - } - else - { - if (*additiveBonus < currBonus->statBonus) - { - *additiveBonus = currBonus->statBonus; - } - } - } - else - { - *additiveBonus += currBonus->statBonus; - } - } -} - -//------------------------------------------------------------------------- -bool IsRegularEnchanmentForAttribute(int enchantmentId, CHARACTER_ATTRIBUTE_TYPE attrToGet) -{ - auto bonusList = specialBonusMap.find(enchantmentId); - if (bonusList == specialBonusMap.end()) - { - return false; - } - std::map<CHARACTER_ATTRIBUTE_TYPE, CEnchantment*>* currList = bonusList->second; - return (currList->find(attrToGet) != currList->end()); -} - //----- (00490913) -------------------------------------------------------- int PlayerCreation_GetUnspentAttributePointCount() { @@ -1461,7 +1138,7 @@ { unsigned __int16 v2; // ax@1 int v5; // edi@7 - + return true; if (CheckHiredNPCSpeciality(Scholar)) return true; @@ -1561,11 +1238,6 @@ //----- (0048C6AF) -------------------------------------------------------- Player::Player() { - if (specialBonusMap.empty()) - { - PopulateSpecialBonusMap(); - } - memset(&pEquipment, 0, sizeof(PlayerEquipment)); memset(pInventoryMatrix, 0, 126 * sizeof(int)); for (uint i = 0; i < 126; ++i) @@ -3450,72 +3122,30 @@ //----- (0048EAAE) -------------------------------------------------------- int Player::GetItemsBonus( enum CHARACTER_ATTRIBUTE_TYPE attr, bool getOnlyMainHandDmg /*= false*/ ) { - // signed int v4; // eax@1 int v5; // edi@1 - Player *v8; // ecx@48 int v9; // eax@49 - int v10; // edx@49 - Player *v11; // ecx@55 - int v12; // eax@56 - int v13; // edx@56 int v14; // ecx@58 int v15; // eax@58 - Player *v16; // ecx@61 int v17; // eax@62 - Player *v18; // ecx@66 - int v19; // eax@67 int v20; // eax@69 - Player *v21; // ecx@75 int v22; // eax@76 int v23; // edx@76 - //int v24; // eax@79 int v25; // ecx@80 int v26; // edi@80 - Player *v27; // ecx@84 - int v28; // eax@85 - int v29; // edx@85 - Player *v30; // ecx@96 int v31; // ebp@97 int v32; // eax@98 unsigned int v33; // eax@100 - int v34; // eax@103 - char v35; // zf@104 - char v36; // zf@107 - unsigned __int8 v37; // zf@119 - char v38; // sf@119 - unsigned __int8 v39; // of@119 - char v40; // zf@122 - char v41; // zf@145 - char v42; // zf@164 - char v43; // zf@173 - char v44; // zf@189 - char v45; // zf@198 - char v46; // zf@239 - int v47; // eax@268 - int v48; // eax@269 - int v49; // eax@291 - char v50; // zf@295 - int v51; // eax@306 - int v52; // eax@307 - char v53; // zf@312 - char v54; // zf@336 - char v55; // zf@348 int v56; // eax@365 int v57; // ebx@368 signed int v58; // [sp-4h] [bp-20h]@10 - signed int v59; // [sp-4h] [bp-20h]@71 - signed int v60; // [sp-4h] [bp-20h]@347 int v61; // [sp+10h] [bp-Ch]@1 int v62; // [sp+14h] [bp-8h]@1 - int v63; // [sp+18h] [bp-4h]@101 - ItemGen *attra; // [sp+20h] [bp+4h]@101 - unsigned int v65; // [sp+24h] [bp+8h]@95 + ItemGen *currEquippedItem; // [sp+20h] [bp+4h]@101 bool no_skills; v5 = 0; v62 = 0; v61 = 0; - no_skills=false; switch (attr) @@ -3550,455 +3180,214 @@ return 0; } - if ( (signed int)attr > 28 ) - { - if ( attr == CHARACTER_ATTRIBUTE_RANGED_DMG_BONUS || attr == CHARACTER_ATTRIBUTE_RANGED_ATTACK) - { + switch(attr) //TODO would be nice to move these into separate functions + { + case CHARACTER_ATTRIBUTE_RANGED_DMG_BONUS: + case CHARACTER_ATTRIBUTE_RANGED_ATTACK: if ( HasItemEquipped(EQUIP_BOW) ) v5 = pItemsTable->pItems[this->pOwnItems[this->pEquipment.uBow-1].uItemID].uDamageMod; - return v5 + v62 + v61; - } - if ( attr == CHARACTER_ATTRIBUTE_RANGED_DMG_MIN ) - { + return v5; + break; + + case CHARACTER_ATTRIBUTE_RANGED_DMG_MIN: if ( !HasItemEquipped(EQUIP_BOW) ) - return v5 + v62 + v61; + return 0; v57 = this->pOwnItems[this->pEquipment.uBow-1].uItemID; v5 = pItemsTable->pItems[v57].uDamageMod; v56 = pItemsTable->pItems[v57].uDamageDice; - v5 += v56; - return v5 + v62 + v61; - } - if ( attr == CHARACTER_ATTRIBUTE_RANGED_DMG_MAX ) - { + return v5 + v56; + break; + + case CHARACTER_ATTRIBUTE_RANGED_DMG_MAX: if ( !HasItemEquipped(EQUIP_BOW) ) - return v5 + v62 + v61; + return 0; v20 = this->pOwnItems[this->pEquipment.uBow-1].uItemID; v5 = pItemsTable->pItems[v20].uDamageDice * pItemsTable->pItems[v20].uDamageRoll; v56 = pItemsTable->pItems[v20].uDamageMod; - v5 += v56; - return v5 + v62 + v61; - } - if ( (signed int)attr <= 33 || (signed int)attr > 46 ) - return v5 + v62 + v61; -LABEL_95: - v65 = 0; - while ( 1 ) - { - if ( !HasItemEquipped((ITEM_EQUIP_TYPE)v65) ) - goto LABEL_361; - v31 = this->pEquipment.pIndices[v65] - 1; - if ( attr == CHARACTER_ATTRIBUTE_AC_BONUS ) - { - v32 = GetEquippedItemEquipType((ITEM_EQUIP_TYPE)v65); - if ( v32 >= 3 && v32 <= 11 ) - { - v33 = this->pInventoryItemList[v31].uItemID; - v5 += pItemsTable->pItems[v33].uDamageDice + pItemsTable->pItems[v33].uDamageMod; - } - } - v63 = (int)((char *)this + 36 * v31); - attra = (ItemGen *)(v63 + 532); - if ( pItemsTable->IsMaterialNonCommon((ItemGen *)(attra)) == 1 - && !pItemsTable->IsMaterialSpecial(attra) ) + return v5 + v56; + + case CHARACTER_ATTRIBUTE_LEVEL: + if ( !Player::HasEnchantedItemEquipped(25) ) + return 0; + return 5; + break; + + case CHARACTER_ATTRIBUTE_MELEE_DMG_MAX: + if ( IsUnarmed() ) { - v34 = attra->uItemID; - switch ( attra->uItemID ) - { - case ITEM_ARTIFACT_PUCK: - if ( attr == 5 ) - v5 += 50; - goto LABEL_361; - case ITEM_ARTIFACT_IRON_FEATHER: - if ( attr == 0 ) - v5 += 40; - goto LABEL_361; - case ITEM_ARTIFACT_WALLACE: - if ( attr == 21 ) - v61 += 10; - if ( attr == 2 ) - v5 += 40; - goto LABEL_361; - case ITEM_ARTIFACT_CORSAIR: - if ( attr == 17 ) - v61 += 5; - if ( attr == 18 ) - v61 += 5; - if ( attr == 6 ) - v5 += 40; - goto LABEL_361; - case ITEM_ARTICACT_GOVERNONS_ARMOR: - if (attr <= 6) - v5 += 10; - goto LABEL_361; - case ITEM_ARTIFACT_YORUBA: - if ( attr == 3 ) - v5 += 25; - goto LABEL_361; - case ITEM_ARTIFACT_SPLITTER: - if ( attr == 10 ) - v5 += 50; - goto LABEL_361; - case ITEM_ARTEFACT_ULLYSES: - if ( attr == 4 ) - v5 += 50; - goto LABEL_361; - case ITEM_ARTEFACT_HANDS_OF_THE_MASTER: - if ( attr == 23 ) - v61 += 10; - if ( attr == 22 ) - v61 += 10; - goto LABEL_361; - case ITEM_ARTIFACT_LEAGUE_BOOTS: - if ( attr == 36 ) - { - v34 = this->pActiveSkills[PLAYER_SKILL_WATER]; - v62 = (v32 / 2) & 0x1F; - } - if ( attr == 5 ) - v5 += 40; - goto LABEL_361; - case ITEM_ARTIFACT_RULERS_RING: - if ( attr == 39 ) - { - v34 = this->pActiveSkills[PLAYER_SKILL_MIND]; - v62 = (v34 / 2 ) & 0x1F; - } - if ( attr == 42 ) - { - v34 = this->pActiveSkills[PLAYER_SKILL_DARK]; - v62 = (v34 / 2 ) & 0x1F; - } - goto LABEL_361; - case ITEM_RELIC_MASH: - if ( attr == 0 ) - v5 += 150; - if ( attr == 1 ) - v5 -= 40; - if ( attr == 2 ) - v5 -= 40; - if ( attr == 5 ) - v5 -= 40; - goto LABEL_361; - case ITEM_RELIC_ETHRICS_STAFF: - if ( attr == 42 ) - { - v34 = this->pActiveSkills[PLAYER_SKILL_DARK]; - v62 = (v34 / 2 ) & 0x1F; - } - if ( attr == 43 ) - v61 += 15; - goto LABEL_361; - case ITEM_RELIC_HARECS_LEATHER: - if ( attr == 17 ) - v61 += 5; - if ( attr == 18 ) - v61 += 5; - if ( attr == 6 ) - v5 += 50; - if ( attr == 11 || attr == 10 || attr == 12 || attr == 13 || attr == 33 || attr == 14 ) - { - v5 -= 10; - goto LABEL_361; - } - if ( attr == 15 ) - v5 -= 10; - goto LABEL_361; - case ITEM_RELIC_OLD_NICK: - if ( attr == 18 ) - v61 += 5; - goto LABEL_361; - case ITEM_RELIC_AMUCK: - if ( attr == 0) - v5 += 100; - if ( attr == 3 ) - v5 += 100; - if ( attr == 9 ) - v5 -= 15; - goto LABEL_361; - case ITEM_RELIC_GLORY_SHIELD: - if ( attr == 45 ) - v61 += 5; - if ( attr == 15 ) - v5 -= 10; - if ( attr == 14 ) - v5 -= 10; - goto LABEL_361; - case ITEM_RELIC_KELEBRIM: - if ( attr == 3 ) - v5 += 50; - goto LABEL_361; - case ITEM_RELIC_TALEDONS_HELM: - if ( attr == 2 ) - v5 += 15; - if ( !attr ) - v5 += 15; - if ( attr == 6 ) - v5 -= 40; - goto LABEL_361; - case ITEM_RELIC_SCHOLARS_CAP: - if ( attr == 46 ) - v61 += 15; - if ( attr == 3 ) - v5 -= 50; - goto LABEL_361; - case ITEM_RELIC_PHYNAXIAN_CROWN: - if ( attr == 34 ) - { - v34 = this->pActiveSkills[PLAYER_SKILL_FIRE]; - v62 = (v34 / 2 ) & 0x1F; - } - if ( attr == 12 ) - v5 += 50; - if ( attr == 2 ) - v5 += 30; - if ( attr == 9 ) - v5 -= 20; - goto LABEL_361; - case ITEM_RILIC_TITANS_BELT: - if ( !attr ) - v5 += 75; - if ( attr == 5 ) - v5 -= 40; - goto LABEL_361; - case ITEM_RELIC_TWILIGHT: - if ( attr == CHARACTER_ATTRIBUTE_SPEED ) - v5 += 50; - if ( attr == CHARACTER_ATTRIBUTE_LUCK ) - v5 += 50; - if ( attr == CHARACTER_ATTRIBUTE_RESIST_AIR || attr == CHARACTER_ATTRIBUTE_RESIST_FIRE || attr == CHARACTER_ATTRIBUTE_RESIST_WATER || attr == CHARACTER_ATTRIBUTE_RESIST_EARTH || attr == CHARACTER_ATTRIBUTE_RESIST_SPIRIT || attr == CHARACTER_ATTRIBUTE_RESIST_MIND ) - { - v5 -= 15; - goto LABEL_361; - } - if ( attr == 15 ) - v5 -= 15; - goto LABEL_361; - case ITEM_RELIC_ANIA_SELVING: - if ( attr == CHARACTER_ATTRIBUTE_ACCURACY ) - v5 += 150; - if ( attr == CHARACTER_ATTRIBUTE_SKILL_BOW ) - v61 += 5; - if ( attr == CHARACTER_ATTRIBUTE_AC_BONUS ) - v5 -= 25; - goto LABEL_361; - case ITEM_RELIC_JUSTICE: - if ( attr == 39 ) - { - v34 = this->pActiveSkills[PLAYER_SKILL_MIND]; - v62 = (v34 / 2 ) & 0x1F; - } - if ( attr == 40 ) - { - v34 = this->pActiveSkills[PLAYER_SKILL_BODY]; - v62 = (v34 / 2 ) & 0x1F; - } - if ( attr == 5 ) - v5 -= 40; - goto LABEL_361; - case ITEM_RELIC_MEKORIGS_HAMMER: - if ( attr == 38 ) - { - v34 = this->pActiveSkills[PLAYER_SKILL_SPIRIT]; - v62 = ( v34 / 2 ) & 0x1F; - } - if ( attr == 0 ) - v5 += 75; - if ( attr == 11 ) - v5 -= 50; - goto LABEL_361; - case ITEM_ARTIFACT_HERMES_SANDALS: - if ( attr == 5 ) - v5 += 100; - if ( attr == 4 ) - v5 += 50; - if ( attr == 11 ) - v5 += 50; - goto LABEL_361; - case ITEM_ARTIFACT_CLOAK_OF_THE_SHEEP: - if ( attr == 1 ) - v5 -= 20; - if ( attr == 2 ) - v5 -= 20; - goto LABEL_361; - case ITEM_ARTIFACT_MINDS_EYE: - if ( attr == 1 ) - v5 += 15; - if ( attr == 2 ) - v5 += 15; - goto LABEL_361; - case ITEM_ELVEN_CHAINMAIL: - if ( attr == 5 ) - v5 += 15; - if ( attr == 4 ) - v5 += 15; - goto LABEL_361; - case ITEM_FORGE_GAUNTLETS: - if ( attr == 10 ) - v5 += 30; - if ( attr == 0 ) - v5 += 15; - if ( attr == 3 ) - v5 += 15; - goto LABEL_361; - case ITEM_ARTIFACT_HEROS_BELT: - if ( attr == 21 ) - v61 += 5; - if ( attr == 0 ) - v5 += 15; - if (attr >= 10 && attr <= 15) - v5 += 10; - goto LABEL_361; - case ITEM_ARTIFACT_LADYS_ESCORT: - if (attr >= 10 && attr <= 15) - v5 += 10; - goto LABEL_361; - default: - goto LABEL_361; - } - goto LABEL_361; - } - if ( this->pOwnItems[v65].uEnchantmentType == attr + 1 ) - { - if ( attr >= CHARACTER_ATTRIBUTE_STRENGTH ) - { - if ( attr <= CHARACTER_ATTRIBUTE_RESIST_BODY ) - { - v5 += this->pOwnItems[v65].m_enchantmentStrength; - } - else - { - if ( attr <= CHARACTER_ATTRIBUTE_SKILL_UNARMED && v5 < this->pOwnItems[v65].m_enchantmentStrength ) - v5 = this->pOwnItems[v65].m_enchantmentStrength; - } - } + return 3; } else { - v34 = this->pOwnItems[v65].uSpecEnchantmentType; - GetItemBonusSpecialEnchantment(v34, attr, &v5, &v61); - } - -LABEL_361: - ++v65; - if ( (signed int)v65 >= 16 ) - return v5 + v62 + v61; - } - } - if ( attr == CHARACTER_ATTRIBUTE_MELEE_DMG_MAX ) - { - if ( IsUnarmed() != 1 ) - { - if ( this->HasItemEquipped(EQUIP_MAIN_HAND) ) - { - v22 = this->GetEquippedItemEquipType(EQUIP_MAIN_HAND); - if ( v22 >= 0 ) + if ( this->HasItemEquipped(EQUIP_MAIN_HAND) ) { - if ( v22 <= 2 ) + v22 = this->GetEquippedItemEquipType(EQUIP_MAIN_HAND); + if ( v22 >= 0 && v22 <= 2) { - v23 = this->pOwnItems[this->pEquipment.uMainHand].uItemID; + v23 = this->pOwnItems[this->pEquipment.uMainHand].uItemID; + v26 = pItemsTable->pItems[v23].uDamageRoll; if ( this->pEquipment.uShield || pItemsTable->pItems[v23].uSkillType != 4 ) { - v26 = pItemsTable->pItems[v23].uDamageRoll; v25 = pItemsTable->pItems[v23].uDamageDice; } else { - v25 = pItemsTable->pItems[v23].uDamageRoll; - v26 = pItemsTable->pItems[v23].uDamageDice + 1; + v25 = pItemsTable->pItems[v23].uDamageDice + 1; } v5 = pItemsTable->pItems[v23].uDamageMod + v25 * v26; } } - } - - if ( getOnlyMainHandDmg || !this->HasItemEquipped(EQUIP_OFF_HAND) ) - { - - v28 = this->GetEquippedItemEquipType(EQUIP_OFF_HAND); - if ((v28 < 0) || v28 > 2 ) - return v5 + v62 + v61; + if ( getOnlyMainHandDmg || !this->HasItemEquipped(EQUIP_OFF_HAND) || (GetEquippedItemEquipType(EQUIP_OFF_HAND) < 0 && GetEquippedItemEquipType(EQUIP_OFF_HAND) > 2)) + { + return v5; } - v15 = pItemsTable->pItems[v23].uDamageMod; - v14 = pItemsTable->pItems[v23].uDamageDice * pItemsTable->pItems[v23].uDamageRoll; - v5 += v15 + v14; - return v5 + v62 + v61; - } - v59 = 3; - v5 = v59; - return v5 + v62 + v61; - } - if ( (signed int)attr < 0 ) - return v5 + v62 + v61; - if ( (signed int)attr <= CHARACTER_ATTRIBUTE_SKILL_UNARMED ) - goto LABEL_95; - if ( attr == CHARACTER_ATTRIBUTE_LEVEL ) + else + { + v23 = this->pOwnItems[this->pEquipment.uShield].uItemID; + v15 = pItemsTable->pItems[v23].uDamageMod; + v14 = pItemsTable->pItems[v23].uDamageDice * pItemsTable->pItems[v23].uDamageRoll; + return v5 + v15 + v14; + } + } + break; + + case CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS: + case CHARACTER_ATTRIBUTE_ATTACK: + if ( IsUnarmed() ) { - if ( !Player::HasEnchantedItemEquipped(25) ) - return v5 + v62 + v61; - v5 = 5; - return v5 + v62 + v61; + return 0; } - if ( (signed int)attr <= CHARACTER_ATTRIBUTE_LEVEL ) - return v5 + v62 + v61; - if ( (signed int)attr <= CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS ) - { - if ( IsUnarmed() == 1 ) - { - v5 = 0; - return v5 + v62 + v61; - } - if ( this->HasItemEquipped(EQUIP_MAIN_HAND) ) - { - v17 = this->GetEquippedItemEquipType(EQUIP_MAIN_HAND); - if ( v17 >= 0 ) + if ( this->HasItemEquipped(EQUIP_MAIN_HAND) ) { - if ( v17 <= 2 ) + v17 = this->GetEquippedItemEquipType(EQUIP_MAIN_HAND); + if ( v17 >= 0 && v17 <= 2) + { v5 = pItemsTable->pItems[this->pOwnItems[this->pEquipment.uMainHand-1].uItemID].uDamageMod; + } } - } - if ( getOnlyMainHandDmg || !this->HasItemEquipped(EQUIP_OFF_HAND) || (v19 = this->GetEquippedItemEquipType(EQUIP_OFF_HAND), v19 < 0) || v19 > 2 ) - return v5 + v62 + v61; - v20 = this->pOwnItems[this->pEquipment.uShield - 1].uItemID; - v56 = pItemsTable->pItems[v20].uDamageMod; - v5 += v56; - return v5 + v62 + v61; - } - if ( attr == CHARACTER_ATTRIBUTE_MELEE_DMG_MIN ) - { - if ( IsUnarmed() == 1 ) - { - v5 = 1; - return v5 + v62 + v61; - } - if ( this->HasItemEquipped(EQUIP_MAIN_HAND) ) - { - v9 = this->GetEquippedItemEquipType(EQUIP_MAIN_HAND); - if ( v9 >= 0 ) + if ( getOnlyMainHandDmg || !this->HasItemEquipped(EQUIP_OFF_HAND) || (this->GetEquippedItemEquipType(EQUIP_OFF_HAND) < 0) || this->GetEquippedItemEquipType(EQUIP_OFF_HAND) > 2 ) + return v5; + else { - if ( v9 <= 2 ) + v20 = this->pOwnItems[this->pEquipment.uShield - 1].uItemID; + v56 = pItemsTable->pItems[v20].uDamageMod; + return v5 + v56; + } + break; + + case CHARACTER_ATTRIBUTE_MELEE_DMG_MIN: + if ( IsUnarmed() ) + { + return 1; + } + if ( this->HasItemEquipped(EQUIP_MAIN_HAND) ) + { + v9 = this->GetEquippedItemEquipType(EQUIP_MAIN_HAND); + if ( v9 >= 0 && v9 <= 2) { v5 = pItemsTable->pItems[this->pOwnItems[this->pEquipment.uMainHand].uItemID].uDamageDice + - pItemsTable->pItems[this->pOwnItems[this->pEquipment.uMainHand].uItemID].uDamageMod; - if ( !this->pEquipment.uShield ) + pItemsTable->pItems[this->pOwnItems[this->pEquipment.uMainHand].uItemID].uDamageMod; + if ( !this->pEquipment.uShield && pItemsTable->pItems[this->pOwnItems[this->pEquipment.uMainHand].uItemID].uSkillType == 4) { - if ( pItemsTable->pItems[this->pOwnItems[this->pEquipment.uMainHand].uItemID].uSkillType == 4 ) - ++v5; + ++v5; } } } - } - - if ( getOnlyMainHandDmg || !this->HasItemEquipped(EQUIP_OFF_HAND)) + + if ( getOnlyMainHandDmg || !this->HasItemEquipped(EQUIP_OFF_HAND) || (this->GetEquippedItemEquipType(EQUIP_OFF_HAND) < 0) || this->GetEquippedItemEquipType(EQUIP_OFF_HAND) > 2 ) + { + return v5; + } + else + { + v14 = pItemsTable->pItems[this->pOwnItems[this->pEquipment.uShield].uItemID].uDamageMod; + v15 = pItemsTable->pItems[this->pOwnItems[this->pEquipment.uShield].uItemID].uDamageDice; + return v5 + v15 + v14; + } + break; + + case CHARACTER_ATTRIBUTE_STRENGTH: + case CHARACTER_ATTRIBUTE_INTELLIGENCE: + case CHARACTER_ATTRIBUTE_WILLPOWER: + case CHARACTER_ATTRIBUTE_ENDURANCE: + case CHARACTER_ATTRIBUTE_ACCURACY: + case CHARACTER_ATTRIBUTE_SPEED: + case CHARACTER_ATTRIBUTE_LUCK: + case CHARACTER_ATTRIBUTE_HEALTH: + case CHARACTER_ATTRIBUTE_MANA: + case CHARACTER_ATTRIBUTE_AC_BONUS: + + case CHARACTER_ATTRIBUTE_RESIST_FIRE: + case CHARACTER_ATTRIBUTE_RESIST_AIR: + case CHARACTER_ATTRIBUTE_RESIST_WATER: + case CHARACTER_ATTRIBUTE_RESIST_EARTH: + case CHARACTER_ATTRIBUTE_RESIST_MIND: + case CHARACTER_ATTRIBUTE_RESIST_BODY: + case CHARACTER_ATTRIBUTE_RESIST_SPIRIT: + + case CHARACTER_ATTRIBUTE_SKILL_ALCHEMY: + case CHARACTER_ATTRIBUTE_SKILL_STEALING: + case CHARACTER_ATTRIBUTE_SKILL_TRAP_DISARM: + case CHARACTER_ATTRIBUTE_SKILL_ITEM_ID: + case CHARACTER_ATTRIBUTE_SKILL_MONSTER_ID: + case CHARACTER_ATTRIBUTE_SKILL_ARMSMASTER: + case CHARACTER_ATTRIBUTE_SKILL_DODGE: + case CHARACTER_ATTRIBUTE_SKILL_UNARMED: + + case CHARACTER_ATTRIBUTE_SKILL_FIRE: + case CHARACTER_ATTRIBUTE_SKILL_AIR: + case CHARACTER_ATTRIBUTE_SKILL_WATER: + case CHARACTER_ATTRIBUTE_SKILL_EARTH: + case CHARACTER_ATTRIBUTE_SKILL_SPIRIT: + case CHARACTER_ATTRIBUTE_SKILL_MIND: + case CHARACTER_ATTRIBUTE_SKILL_BODY: + case CHARACTER_ATTRIBUTE_SKILL_LIGHT: + case CHARACTER_ATTRIBUTE_SKILL_DARK: + case CHARACTER_ATTRIBUTE_SKILL_MEDITATION: + case CHARACTER_ATTRIBUTE_SKILL_BOW: + case CHARACTER_ATTRIBUTE_SKILL_SHIELD: + case CHARACTER_ATTRIBUTE_SKILL_LEARNING: + for (int i = 0; i < 16; i++) + { + if ( HasItemEquipped((ITEM_EQUIP_TYPE)i) ) { - v12 = this->GetEquippedItemEquipType(EQUIP_OFF_HAND); - if ((v12 < 0) || v12 > 2 ) - return v5 + v62 + v61; + v31 = this->pEquipment.pIndices[i] - 1; + currEquippedItem = &this->pInventoryItemList[v31]; + if ( attr == CHARACTER_ATTRIBUTE_AC_BONUS ) + { + v32 = GetEquippedItemEquipType((ITEM_EQUIP_TYPE)i); + if ( v32 >= 3 && v32 <= 11 ) + { + v33 = currEquippedItem->uItemID; + v5 += pItemsTable->pItems[v33].uDamageDice + pItemsTable->pItems[v33].uDamageMod; + } + } + if ( pItemsTable->IsMaterialNonCommon((ItemGen *)(currEquippedItem)) + && !pItemsTable->IsMaterialSpecial(currEquippedItem) ) + { + currEquippedItem->GetItemBonusArtifact(this, attr, &v62); + } + else if ( currEquippedItem->uEnchantmentType != 0 ) + { + if (currEquippedItem->IsRegularEnchanmentForAttribute(attr)) + { + if ( attr > CHARACTER_ATTRIBUTE_RESIST_BODY && v5 < currEquippedItem->m_enchantmentStrength ) + v5 = currEquippedItem->m_enchantmentStrength; + else + v5 += currEquippedItem->m_enchantmentStrength; + } + } + else + { + currEquippedItem->GetItemBonusSpecialEnchantment(this, attr, &v5, &v61); + } } - v14 = pItemsTable->pItems[this->pOwnItems[this->pEquipment.uShield].uItemID].uDamageMod; - v15 = pItemsTable->pItems[this->pOwnItems[this->pEquipment.uShield].uItemID].uDamageDice; - v5 += v15 + v14; - } - return v5 + v62 + v61; + } + return v5 + v62 + v61; + break; + default: + return 0; + } } //----- (0048F73C) --------------------------------------------------------