# HG changeset patch # User Grumpy7 # Date 1381992928 -7200 # Node ID 1d9e4b50bc7c1cede2832668909064faf130d31a # Parent a6276dda880457190b3dd5c9677352660a0f5acc Actor::_43B3E0_CalcDamage cleaned up, fixed actor buff enums and added 2 values diff -r a6276dda8804 -r 1d9e4b50bc7c Actor.cpp --- a/Actor.cpp Thu Oct 17 07:57:01 2013 +0200 +++ b/Actor.cpp Thu Oct 17 08:55:28 2013 +0200 @@ -1347,25 +1347,25 @@ case 1: if ( a3 ) { - pOtherOverlayList->_4418B6(904, v4, 0, (sub_43AE12(a3) * 65536.0), 0); + pOtherOverlayList->_4418B6(904, v4, 0, (int)(sub_43AE12(a3) * 65536.0), 0); } return; case 2: if ( a3 ) { - pOtherOverlayList->_4418B6(905, v4, 0, (sub_43AE12(a3) * 65536.0), 0); + pOtherOverlayList->_4418B6(905, v4, 0, (int)(sub_43AE12(a3) * 65536.0), 0); } return; case 3: if ( a3 ) { - pOtherOverlayList->_4418B6(906, v4, 0, (sub_43AE12(a3) * 65536.0), 0); + pOtherOverlayList->_4418B6(906, v4, 0, (int)(sub_43AE12(a3) * 65536.0), 0); } return; case 4: if ( a3 ) { - pOtherOverlayList->_4418B6(907, v4, 0, (sub_43AE12(a3) * 65536.0), 0); + pOtherOverlayList->_4418B6(907, v4, 0, (int)(sub_43AE12(a3) * 65536.0), 0); } return; case 5: @@ -1393,13 +1393,12 @@ } //----- (0043B3E0) -------------------------------------------------------- -int Actor::_43B3E0_CalcDamage(Actor *a1, signed int a2) +int Actor::_43B3E0_CalcDamage(Actor *a1, signed int dmgSource) { signed int v2; // ebp@1 int v3; // eax@9 signed int v4; // edi@9 int v5; // esi@9 - int v6; // ebx@11 unsigned __int16 v8; // si@21 int v9; // edi@21 signed int v10; // eax@23 @@ -1407,61 +1406,47 @@ v2 = 0; v11 = 0; - if ( a2 ) + + switch( dmgSource ) { - if ( a2 == 1 ) - { + case 0: + if ( a1->pActorBuffs[14].uExpireTime > 0 ) + v2 = a1->pActorBuffs[14].uPower; + if ( a1->pActorBuffs[18].uExpireTime > 0 && a1->pActorBuffs[18].uPower > v2 ) + v2 = a1->pActorBuffs[18].uPower; + if ( a1->pActorBuffs[21].uExpireTime > 0 ) + v2 += a1->pActorBuffs[21].uPower; + v3 = a1->pMonsterInfo.uAttack1DamageDiceRolls; + v4 = a1->pMonsterInfo.uAttack1DamageDiceSides; + v5 = a1->pMonsterInfo.uAttack1DamageBonus; + break; + case 1: v3 = a1->pMonsterInfo.uAttack2DamageDiceRolls; v4 = a1->pMonsterInfo.uAttack2DamageDiceSides; v5 = a1->pMonsterInfo.uAttack2DamageBonus; - } - else - { - if ( a2 <= 1 ) - return 0; - if ( a2 <= 3 ) - { - if ( a2 == 2 ) - { - v8 = a1->pMonsterInfo.uSpellSkillAndMastery1; - v9 = a1->pMonsterInfo.uSpell1ID; - } - else - { - v8 = a1->pMonsterInfo.uSpellSkillAndMastery2; - v9 = a1->pMonsterInfo.uSpell2ID; - } - v10 = SkillToMastery(v8); - return _43AFE3_calc_spell_damage(v9, v8 & 0x3F, v10, 0); - } - if ( a2 != 4 ) - return 0; + break; + case 2: + v8 = a1->pMonsterInfo.uSpellSkillAndMastery1; + v9 = a1->pMonsterInfo.uSpell1ID; + v10 = SkillToMastery(v8); + return _43AFE3_calc_spell_damage(v9, v8 & 0x3F, v10, 0); + break; + case 3: + v8 = a1->pMonsterInfo.uSpellSkillAndMastery2; + v9 = a1->pMonsterInfo.uSpell2ID; + v10 = SkillToMastery(v8); + return _43AFE3_calc_spell_damage(v9, v8 & 0x3F, v10, 0); + break; + case 4: v3 = a1->pMonsterInfo.uSpecialAbilityDamageDiceRolls; v4 = a1->pMonsterInfo.uSpecialAbilityDamageDiceSides; v5 = a1->pMonsterInfo.uSpecialAbilityDamageDiceBonus; - } + default: + return 0; } - else + for ( int i = 0; i < v3; i++) { - if ( (signed __int64)a1->pActorBuffs[14].uExpireTime > 0 ) - v2 = a1->pActorBuffs[14].uPower; - if ( (signed __int64)a1->pActorBuffs[18].uExpireTime > 0 && a1->pActorBuffs[18].uPower > v2 ) - v2 = a1->pActorBuffs[18].uPower; - if ( (signed __int64)a1->pActorBuffs[21].uExpireTime > 0 ) - v2 += a1->pActorBuffs[21].uPower; - v3 = a1->pMonsterInfo.uAttack1DamageDiceRolls; - v4 = a1->pMonsterInfo.uAttack1DamageDiceSides; - v5 = a1->pMonsterInfo.uAttack1DamageBonus; - } - if ( v3 > 0 ) - { - v6 = v3; - do - { - --v6; - v11 += rand() % v4 + 1; - } - while ( v6 ); + v11 += rand() % v4 + 1; } return v11 + v5 + v2; } diff -r a6276dda8804 -r 1d9e4b50bc7c Actor.h --- a/Actor.h Thu Oct 17 07:57:01 2013 +0200 +++ b/Actor.h Thu Oct 17 08:55:28 2013 +0200 @@ -45,20 +45,21 @@ ACTOR_BUFF_AFRAID = 4, ACTOR_BUFF_STONED = 5, ACTOR_BUFF_PARALYZED = 6, - - ACTOR_BUFF_BERSERK = 8, - - ACTOR_BUFF_FATE = 10, - ACTOR_BUFF_ENSLAVED = 11, - ACTOR_BUFF_DAY_OF_PROTECTION = 12, - ACTOR_BUFF_HOUR_OF_POWER = 13, - ACTOR_BUFF_SHIELD = 14, - ACTOR_BUFF_STONESKIN = 15, - ACTOR_BUFF_BLESS = 16, - ACTOR_BUFF_HEROISM = 17, - ACTOR_BUFF_HASTE = 18, - ACTOR_BUFF_PAIN_REFLECTION = 19, - ACTOR_BUFF_PAIN_HAMMERHANDS = 20, + ACTOR_BUFF_SLOWED = 7, + ACTOR_BUFF_SOMETHING_THAT_HALVES_AC = 8, + ACTOR_BUFF_BERSERK = 9, + ACTOR_BUFF_MASS_DISTORTION = 10, + ACTOR_BUFF_FATE = 11, + ACTOR_BUFF_ENSLAVED = 12, + ACTOR_BUFF_DAY_OF_PROTECTION = 13, + ACTOR_BUFF_HOUR_OF_POWER = 14, + ACTOR_BUFF_SHIELD = 15, + ACTOR_BUFF_STONESKIN = 16, + ACTOR_BUFF_BLESS = 17, + ACTOR_BUFF_HEROISM = 18, + ACTOR_BUFF_HASTE = 19, + ACTOR_BUFF_PAIN_REFLECTION = 20, + ACTOR_BUFF_PAIN_HAMMERHANDS = 21, }; diff -r a6276dda8804 -r 1d9e4b50bc7c Player.cpp --- a/Player.cpp Thu Oct 17 07:57:01 2013 +0200 +++ b/Player.cpp Thu Oct 17 08:55:28 2013 +0200 @@ -7246,7 +7246,7 @@ //----- (00439FCB) -------------------------------------------------------- -void __fastcall DamagePlayerFromMonster(unsigned int uObjID, int element, Vec3_int_ *pPos, unsigned int a4) +void __fastcall DamagePlayerFromMonster(unsigned int uObjID, int dmgSource, Vec3_int_ *pPos, unsigned int a4) { Player *playerPtr; // ebx@3 Actor *actorPtr; // esi@3 @@ -7297,7 +7297,7 @@ } } pAudioPlayer->PlaySound(soundToPlay, PID(OBJECT_Player,a4 + 80), 0, -1, 0, 0, 0, 0); - int dmgToReceive = Actor::_43B3E0_CalcDamage(actorPtr, element); + int dmgToReceive = Actor::_43B3E0_CalcDamage(actorPtr, dmgSource); if ( actorPtr->pActorBuffs[3].uExpireTime > 0 ) { __int16 spellPower = actorPtr->pActorBuffs[3].uPower; @@ -7305,7 +7305,7 @@ dmgToReceive /= (signed int)spellPower; } int damageType; - switch (element) + switch (dmgSource) { case 0: damageType = actorPtr->pMonsterInfo.uAttack1Type; break; @@ -7437,7 +7437,7 @@ if ( a4 == -1 ) a4 = stru_50C198.which_player_would_attack(actorPtr); Player *playerPtr = &pParty->pPlayers[a4]; - int dmgToReceive = Actor::_43B3E0_CalcDamage(actorPtr, element); + int dmgToReceive = Actor::_43B3E0_CalcDamage(actorPtr, dmgSource); unsigned __int16 spriteType = v37->uType; if ( v37->uType == 545 ) { @@ -7492,7 +7492,7 @@ dmgToReceive /= (signed int)spellPower; } int damageType; - switch(element) + switch(dmgSource) { case 0: damageType = actorPtr->pMonsterInfo.uAttack1Type; @@ -7553,7 +7553,7 @@ } } } - if ( !element + if ( !dmgSource && !(dword_6BE368_debug_settings_2 & 0x10) && actorPtr->pMonsterInfo.uSpecialAttackType && rand() % 100 < actorPtr->pMonsterInfo.uLevel * actorPtr->pMonsterInfo.uSpecialAttackLevel )