Mercurial > mm7
changeset 1550:cdb7fafede0c
Player::CalculateMeleeDamageTo extracted 2 almost identical sections to a separate function, variable cleanup, changed parameter types
author | Grumpy7 |
---|---|
date | Sat, 07 Sep 2013 09:45:09 +0200 |
parents | 5a3afcaa6717 |
children | a9e8d2a7abb5 |
files | Actor.cpp Player.cpp Player.h |
diffstat | 3 files changed, 96 insertions(+), 157 deletions(-) [+] |
line wrap: on
line diff
--- a/Actor.cpp Sat Sep 07 09:16:55 2013 +0200 +++ b/Actor.cpp Sat Sep 07 09:45:09 2013 +0200 @@ -5076,7 +5076,7 @@ v50 = pMonster->pMonsterInfo.uID; a2 = 4; //v27 = player->CalculateMeleeDamageTo(0, 0, v50); - uDamageAmount = player->CalculateMeleeDamageTo(0, 0, v50); + uDamageAmount = player->CalculateMeleeDamageTo(false, false, v50); //if ( !v57 ) goto LABEL_67; //goto LABEL_69; @@ -5138,7 +5138,7 @@ if ( (signed int)SkillToMastery(v16) >= 3 ) a4 = player->pActiveSkills[7] & 0x3F; a2 = 4; - uDamageAmount = player->CalculateMeleeDamageTo(1, 1, 0); + uDamageAmount = player->CalculateMeleeDamageTo(true, true, 0); goto LABEL_67; } if ( v15 != SPELL_BOW_ARROW )
--- a/Player.cpp Sat Sep 07 09:16:55 2013 +0200 +++ b/Player.cpp Sat Sep 07 09:45:09 2013 +0200 @@ -1864,153 +1864,101 @@ } //----- (0048CDDB) -------------------------------------------------------- -int Player::CalculateMeleeDamageTo(int a2, int a3, unsigned int uTargetActorID) -{ - int v4; // esi@1 - Player *v5; // edi@1 - ItemGen *v6; // ebx@4 - unsigned int v7; // ebp@4 - unsigned int v8; // esi@4 - int v9; // eax@4 - int v10; // eax@9 - char v11; // zf@9 - int v12; // esi@10 - int v13; // eax@11 - enum MONSTER_SUPERTYPE v14; // edx@24 - ItemGen *v15; // ebx@35 - unsigned int v16; // ebp@35 - unsigned int v17; // esi@35 - int v18; // edx@38 - int v19; // eax@40 - enum MONSTER_SUPERTYPE v20; // edx@53 - int v21; // esi@62 - int v22; // eax@63 - int v23; // ebx@63 - int v24; // ebx@63 +int Player::CalculateMeleeDamageTo( bool ignoreSkillBonus, bool ignoreOffhand, unsigned int uTargetActorID ) +{ + int dmgSum; // esi@62 signed int result; // eax@64 - MONSTER_SUPERTYPE v26; // [sp-4h] [bp-24h]@20 - MONSTER_SUPERTYPE v27; // [sp-4h] [bp-24h]@49 - int v28; // [sp+10h] [bp-10h]@1 - int v29; // [sp+10h] [bp-10h]@33 - signed int v30; // [sp+14h] [bp-Ch]@7 - signed int v31; // [sp+14h] [bp-Ch]@36 - int v32; // [sp+18h] [bp-8h]@1 - int v33; // [sp+18h] [bp-8h]@8 - int v34; // [sp+1Ch] [bp-4h]@1 - int v35; // [sp+28h] [bp+8h]@37 - - v4 = 0; - v5 = this; - v34 = 0; - v32 = 0; - v28 = 0; + int mainWpnDmg; // [sp+18h] [bp-8h]@1 + int offHndWpnDmg; // [sp+1Ch] [bp-4h]@1 + + offHndWpnDmg = 0; + mainWpnDmg = 0; if ( IsUnarmed() ) { - v32 = rand() % 3 + 1; -LABEL_61: - v34 = v4; + mainWpnDmg = rand() % 3 + 1; } else { - if ( HasItemEquipped(EQUIP_MAIN_HAND) ) - { - v6 = &this->pInventoryItemList[v5->pEquipment.uMainHand-1]; - v7 = v6->uItemID; - v9 = pItemsTable->pItems[v7].uDamageDice; - if ( pItemsTable->pItems[v7].uSkillType == PLAYER_SKILL_SPEAR && !v5->pEquipment.uShield ) - ++v9; - v30 = pItemsTable->pItems[v7].uDamageRoll; - for (int i = 0; i < v9; i++) - { - v10 = rand(); - v28 += v10 % v30 + 1; - } - v12 = pItemsTable->pItems[v7].uDamageMod + v28; - if ( uTargetActorID > 0) + if ( HasItemEquipped(EQUIP_MAIN_HAND) ) + { + ItemGen *mainHandItemGen = &this->pInventoryItemList[this->pEquipment.uMainHand-1]; + int itemId = mainHandItemGen->uItemID; + bool addOneDice = false; + if ( pItemsTable->pItems[itemId].uSkillType == PLAYER_SKILL_SPEAR && !this->pEquipment.uShield ) + addOneDice = true; + mainWpnDmg = CalculateMeleeDmgToEnemyWithWeapon(mainHandItemGen, uTargetActorID, addOneDice); + } + if ( !ignoreOffhand ) + { + if ( this->HasItemEquipped(EQUIP_OFF_HAND) ) { - v13 = v6->uSpecEnchantmentType; - if ( MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_UNDEAD) && (v13 == 64 || v7 == ITEM_ARTIFACT_GHOULSBANE || v7 == ITEM_ARTIFACT_GIBBET || v7 == ITEM_RELIC_JUSTICE) ) - { - v12 *= 2; - } - else if (MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_KREEGAN) && ( v13 == 39 || v7 == ITEM_ARTIFACT_GIBBET)) + ItemGen *offHandItemGen = (ItemGen *)&this->pInventoryItemList[this->pEquipment.uShield - 1]; + int itemId = offHandItemGen->uItemID; + if ( pItemsTable->pItems[itemId].uEquipType != EQUIP_SHIELD ) { - v12 *= 2; - } - else if (MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_DRAGON) && ( v13 == 40 || v7 == ITEM_ARTIFACT_GIBBET)) - { - v12 *= 2; - } - else if (MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_TITAN) && ( v13 == 65 )) - { - v12 *= 2; + offHndWpnDmg = CalculateMeleeDmgToEnemyWithWeapon(offHandItemGen, uTargetActorID, false); } } - if ( (signed int)SkillToMastery(v5->pActiveSkills[2]) >= 3 - && pItemsTable->pItems[v6->uItemID].uSkillType == 2 - && rand() % 100 < 10 ) - v12 *= 3; - v32 = v12; - } - v29 = 0; - if ( !a3 ) - { - if ( v5->HasItemEquipped(EQUIP_OFF_HAND) ) - { - v15 = (ItemGen *)&v5->pInventoryItemList[v5->pEquipment.uShield - 1]; - v16 = v15->uItemID; - if ( pItemsTable->pItems[v16].uEquipType != EQUIP_SHIELD ) - { - v31 = pItemsTable->pItems[v16].uDamageRoll; - v35 = pItemsTable->pItems[v16].uDamageDice; - for (int i = 0; i < v35; i++) - { - v10 = rand(); - v29 += v10 % v31 + 1; - } - v4 = pItemsTable->pItems[v16].uDamageMod + v29; - if ( uTargetActorID > 0) - { - v19 = v15->uSpecEnchantmentType; - if ( MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_UNDEAD) && (v19 == 64 || v16 == ITEM_ARTIFACT_GHOULSBANE || v16 == ITEM_ARTIFACT_GIBBET || v16 == ITEM_RELIC_JUSTICE) ) - { - v4 *= 2; - } - else if (MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_KREEGAN) && ( v19 == 39 || v16 == ITEM_ARTIFACT_GIBBET)) - { - v4 *= 2; - } - else if (MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_DRAGON) && ( v19 == 40 || v16 == ITEM_ARTIFACT_GIBBET)) - { - v4 *= 2; - } - else if (MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_TITAN) && ( v19 == 65 )) - { - v4 *= 2; - } - } - if ( pItemsTable->pItems[v15->uItemID].uSkillType == PLAYER_SKILL_DAGGER - && SkillToMastery(v5->pActiveSkills[2] >= 3u) - && rand() % 100 < 10 ) - v4 *= 3; - } - } - } - } - v21 = v32 + v34; - if ( !a2 ) - { - v22 = GetActualMight(); - v23 = GetParameterBonus(v22); - v24 = GetSkillBonus(CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS) + v23; - v21 += v5->_melee_dmg_bonus + GetMagicalBonus(CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS) + v24; + } + } + dmgSum = mainWpnDmg + offHndWpnDmg; + if ( !ignoreSkillBonus ) + { + int might = GetActualMight(); + int mightBonus = GetParameterBonus(might); + int mightAndSkillbonus = GetSkillBonus(CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS) + mightBonus; + dmgSum += this->_melee_dmg_bonus + GetMagicalBonus(CHARACTER_ATTRIBUTE_MELEE_DMG_BONUS) + mightAndSkillbonus; } result = 1; - if ( v21 >= 1 ) - result = v21; + if ( dmgSum >= 1 ) + result = dmgSum; return result; } + +int Player::CalculateMeleeDmgToEnemyWithWeapon( ItemGen * weapon, unsigned int uTargetActorID , bool addOneDice ) +{ + int itemId = weapon->uItemID; + int diceCount = pItemsTable->pItems[itemId].uDamageDice; + if (addOneDice) + { + diceCount++; + } + int diceSides = pItemsTable->pItems[itemId].uDamageRoll; + int diceResult = 0; + for (int i = 0; i < diceCount; i++) + { + diceResult += rand() % diceSides + 1; + } + int totalDmg = pItemsTable->pItems[itemId].uDamageMod + diceResult; + if ( uTargetActorID > 0) + { + int enchType = weapon->uSpecEnchantmentType; + if ( MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_UNDEAD) && (enchType == 64 || itemId == ITEM_ARTIFACT_GHOULSBANE || itemId == ITEM_ARTIFACT_GIBBET || itemId == ITEM_RELIC_JUSTICE) ) + { + totalDmg *= 2; + } + else if (MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_KREEGAN) && ( enchType == 39 || itemId == ITEM_ARTIFACT_GIBBET)) + { + totalDmg *= 2; + } + else if (MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_DRAGON) && ( enchType == 40 || itemId == ITEM_ARTIFACT_GIBBET)) + { + totalDmg *= 2; + } + else if (MonsterStats::BelongsToSupertype(uTargetActorID, MONSTER_SUPERTYPE_TITAN) && ( enchType == 65 )) + { + totalDmg *= 2; + } + } + if ( (signed int)SkillToMastery(this->pActiveSkills[2]) >= 3 + && pItemsTable->pItems[itemId].uSkillType == 2 + && rand() % 100 < 10 ) + totalDmg *= 3; + return totalDmg; +} + + //----- (0048D0B9) -------------------------------------------------------- int Player::GetRangedAttack() { @@ -2088,7 +2036,6 @@ bool result; // eax@1 ItemGen *v4; // ebx@2 unsigned int v5; // edi@2 - unsigned int v6; // esi@2 int v7; // edx@4 char v8; // zf@4 int v9; // esi@5 @@ -2109,29 +2056,25 @@ return result; v4 = (ItemGen *)&v2->pInventoryItemList[v2->pEquipment.uBow-1]; v5 = v4->uItemID; - v6 = v4->uItemID; - v15 = pItemsTable->pItems[v6].uDamageRoll; - if ( (signed int)pItemsTable->pItems[v6].uDamageDice > 0 ) - { - v16 = pItemsTable->pItems[v6].uDamageDice; - do + v15 = pItemsTable->pItems[v5].uDamageRoll; + if ( (signed int)pItemsTable->pItems[v5].uDamageDice > 0 ) + { + for( int i = 0; i < pItemsTable->pItems[v5].uDamageDice; i++ ) { v7 = rand() % v15; - v8 = v16-- == 1; v17 += v7 + 1; } - while ( !v8 ); - } - v9 = pItemsTable->pItems[v6].uDamageMod + v17; + } + v9 = pItemsTable->pItems[v5].uDamageMod + v17; if ( a2 ) { v10 = v4->uSpecEnchantmentType; if ( v10 == 64 ) { - v11 = (MONSTER_SUPERTYPE)1; + v11 = MONSTER_SUPERTYPE_UNDEAD; goto LABEL_17; } - if ( v10 == 39 || v5 == 508 ) + if ( v10 == 39 ) { v13 = MONSTER_SUPERTYPE_KREEGAN; goto LABEL_16; @@ -2141,7 +2084,7 @@ v13 = MONSTER_SUPERTYPE_DRAGON; goto LABEL_16; } - if ( v10 == 63 || v5 == 517 ) + if ( v10 == 63 ) { v13 = MONSTER_SUPERTYPE_ELF; LABEL_16: @@ -2153,13 +2096,7 @@ } } LABEL_19: - v12 = v14->pActiveSkills[5]; - if ( v12 ) - { - if ( (signed int)SkillToMastery(v12) >= 4 ) - v9 += v14->pActiveSkills[5] & 0x3F; - } - return v9; + return v9 + this->GetSkillBonus(CHARACTER_ATTRIBUTE_RANGED_DMG_BONUS); } //----- (0048D2EA) --------------------------------------------------------
--- a/Player.h Sat Sep 07 09:16:55 2013 +0200 +++ b/Player.h Sat Sep 07 09:45:09 2013 +0200 @@ -483,7 +483,7 @@ int GetActualAttack(int a2); int GetMeleeDamageMinimal(); int GetMeleeDamageMaximal(); - int CalculateMeleeDamageTo(int a2, int a3, unsigned int uTargetActorID); + int CalculateMeleeDamageTo(bool ignoreSkillBonus, bool ignoreOffhand, unsigned int uTargetActorID); int GetRangedAttack(); int GetRangedDamageMin(); int GetRangedDamageMax(); @@ -581,6 +581,9 @@ void DrawPlayerBuffAnimBasedOnCondition(int currPlayerId); void EquipBody(ITEM_EQUIP_TYPE uEquipType); + unsigned int GetMultiplierForMastery(unsigned int skillValue, int mult1, int mult2, int mult3, int mult4); + int CalculateMeleeDmgToEnemyWithWeapon( ItemGen * weapon, unsigned int uTargetActorID , bool addOneDice); + bool IsWeak(); bool IsDead(); bool IsEradicated(); @@ -621,7 +624,6 @@ 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];