From ab8873029974960e6e428ae8945b45c107e6ff39 Mon Sep 17 00:00:00 2001 From: Juliano Leal Goncalves Date: Mon, 20 Sep 2021 02:03:39 -0300 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Leverage=20'Damage'=20for?= =?UTF-8?q?=20'=5Fi[Min|Max]Dam'=20'Monster'=20fields?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/loadsave.cpp | 11 +++++++---- Source/missiles.cpp | 13 ++++++------- Source/monster.cpp | 33 +++++++++++++++------------------ Source/monster.h | 4 ++-- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index bdea98c5f..e13418373 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -622,8 +622,11 @@ void LoadMonster(LoadHelper *file, Monster &monster) monster.mHit = file->NextLE(); else file->Skip(1); // Skip mHit as it's already initialized - monster.mMinDamage = file->NextLE(); - monster.mMaxDamage = file->NextLE(); + + auto minDamage = file->NextLE(); + auto maxDamage = file->NextLE(); + monster.mDamage = { minDamage, maxDamage }; + file->Skip(1); // Skip mHit2 as it's already initialized monster.mMinDamage2 = file->NextLE(); monster.mMaxDamage2 = file->NextLE(); @@ -1281,8 +1284,8 @@ void SaveMonster(SaveHelper *file, Monster &monster) file->WriteLE(monster.mExp); file->WriteLE(std::min(monster.mHit, std::numeric_limits::max())); // For backwards compatibility - file->WriteLE(monster.mMinDamage); - file->WriteLE(monster.mMaxDamage); + file->WriteLE(monster.mDamage.minValue); + file->WriteLE(monster.mDamage.maxValue); file->WriteLE(std::min(monster.mHit2, std::numeric_limits::max())); // For backwards compatibility file->WriteLE(monster.mMinDamage2); file->WriteLE(monster.mMaxDamage2); diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 7262c189f..919e83002 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1389,8 +1389,7 @@ void AddBerserk(Missile &missile, Point dst, Direction /*midir*/) i = 6; auto slvl = GetSpellLevel(missile._misource, SPL_BERSERK); monster._mFlags |= MFLAG_BERSERK | MFLAG_GOLEM; - monster.mMinDamage = (GenerateRnd(10) + 120) * monster.mMinDamage / 100 + slvl; - monster.mMaxDamage = (GenerateRnd(10) + 120) * monster.mMaxDamage / 100 + slvl; + monster.mDamage = { (GenerateRnd(10) + 120) * monster.mDamage.minValue / 100 + slvl, (GenerateRnd(10) + 120) * monster.mDamage.maxValue / 100 + slvl }; monster.mMinDamage2 = (GenerateRnd(10) + 120) * monster.mMinDamage2 / 100 + slvl; monster.mMaxDamage2 = (GenerateRnd(10) + 120) * monster.mMaxDamage2 / 100 + slvl; int r = (currlevel < 17 || currlevel > 20) ? 3 : 9; @@ -2664,7 +2663,7 @@ void AddFlame(Missile &missile, Point dst, Direction /*midir*/) missile._midam = 8 * i + 16 + ((8 * i + 16) / 2); } else { auto &monster = Monsters[missile._misource]; - missile._midam = monster.mMinDamage + GenerateRnd(monster.mMaxDamage - monster.mMinDamage + 1); + missile._midam = monster.mDamage.GetValue(); } } @@ -2861,7 +2860,7 @@ void MI_LArrow(Missile &missile) if (missile._micaster == TARGET_MONSTERS) { damage = Players[p]._pIDamage; } else { - damage = { Monsters[p].mMinDamage, Monsters[p].mMaxDamage }; + damage = Monsters[p].mDamage; } } else { damage = { GenerateRnd(10) + 1 + currlevel, GenerateRnd(10) + 1 + currlevel * 2 }; @@ -2906,7 +2905,7 @@ void MI_Arrow(Missile &missile) if (missile._micaster == TARGET_MONSTERS) { damage = Players[p]._pIDamage; } else { - damage = { Monsters[p].mMinDamage, Monsters[p].mMaxDamage }; + damage = Monsters[p].mDamage; } } else { damage = { currlevel, 2 * currlevel }; @@ -2942,7 +2941,7 @@ void MI_Firebolt(Missile &missile) } } else { auto &monster = Monsters[p]; - d = monster.mMinDamage + GenerateRnd(monster.mMaxDamage - monster.mMinDamage + 1); + d = monster.mDamage.GetValue(); } } else { d = currlevel + GenerateRnd(2 * currlevel); @@ -3374,7 +3373,7 @@ void MI_Lightctrl(Missile &missile) dam = (GenerateRnd(2) + GenerateRnd(Players[missile._misource]._pLevel) + 2) << 6; } else { auto &monster = Monsters[missile._misource]; - dam = 2 * (monster.mMinDamage + GenerateRnd(monster.mMaxDamage - monster.mMinDamage + 1)); + dam = 2 * monster.mDamage.GetValue(); } SpawnLightning(missile, dam); diff --git a/Source/monster.cpp b/Source/monster.cpp index 3060fe536..520ce0404 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -194,8 +194,7 @@ void InitMonster(Monster &monster, Direction rd, int mtype, Point position) monster.mWhoHit = 0; monster.mExp = monster.MData->mExp; monster.mHit = monster.MData->mHit; - monster.mMinDamage = monster.MData->mMinDamage; - monster.mMaxDamage = monster.MData->mMaxDamage; + monster.mDamage = { monster.MData->mMinDamage, monster.MData->mMaxDamage }; monster.mHit2 = monster.MData->mHit2; monster.mMinDamage2 = monster.MData->mMinDamage2; monster.mMaxDamage2 = monster.MData->mMaxDamage2; @@ -223,8 +222,8 @@ void InitMonster(Monster &monster, Direction rd, int mtype, Point position) monster.mLevel += 15; monster.mExp = 2 * (monster.mExp + 1000); monster.mHit += NIGHTMARE_TO_HIT_BONUS; - monster.mMinDamage = 2 * (monster.mMinDamage + 2); - monster.mMaxDamage = 2 * (monster.mMaxDamage + 2); + monster.mDamage += { 2 }; + monster.mDamage *= 2; monster.mHit2 += NIGHTMARE_TO_HIT_BONUS; monster.mMinDamage2 = 2 * (monster.mMinDamage2 + 2); monster.mMaxDamage2 = 2 * (monster.mMaxDamage2 + 2); @@ -239,8 +238,8 @@ void InitMonster(Monster &monster, Direction rd, int mtype, Point position) monster.mLevel += 30; monster.mExp = 4 * (monster.mExp + 1000); monster.mHit += HELL_TO_HIT_BONUS; - monster.mMinDamage = 4 * monster.mMinDamage + 6; - monster.mMaxDamage = 4 * monster.mMaxDamage + 6; + monster.mDamage *= 4; + monster.mDamage += { 6 }; monster.mHit2 += HELL_TO_HIT_BONUS; monster.mMinDamage2 = 4 * monster.mMinDamage2 + 6; monster.mMaxDamage2 = 4 * monster.mMaxDamage2 + 6; @@ -497,8 +496,7 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize) monster._mhitpoints = monster._mmaxhp; monster._mAi = uniqueMonsterData.mAi; monster._mint = uniqueMonsterData.mint; - monster.mMinDamage = uniqueMonsterData.mMinDamage; - monster.mMaxDamage = uniqueMonsterData.mMaxDamage; + monster.mDamage = { uniqueMonsterData.mMinDamage, uniqueMonsterData.mMaxDamage }; monster.mMinDamage2 = uniqueMonsterData.mMinDamage; monster.mMaxDamage2 = uniqueMonsterData.mMaxDamage; monster.mMagicRes = uniqueMonsterData.mMagicRes; @@ -529,8 +527,8 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize) monster.mLevel += 15; monster._mhitpoints = monster._mmaxhp; monster.mExp = 2 * (monster.mExp + 1000); - monster.mMinDamage = 2 * (monster.mMinDamage + 2); - monster.mMaxDamage = 2 * (monster.mMaxDamage + 2); + monster.mDamage += { 2 }; + monster.mDamage *= 2; monster.mMinDamage2 = 2 * (monster.mMinDamage2 + 2); monster.mMaxDamage2 = 2 * (monster.mMaxDamage2 + 2); } else if (sgGameInitInfo.nDifficulty == DIFF_HELL) { @@ -542,8 +540,8 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize) monster.mLevel += 30; monster._mhitpoints = monster._mmaxhp; monster.mExp = 4 * (monster.mExp + 1000); - monster.mMinDamage = 4 * monster.mMinDamage + 6; - monster.mMaxDamage = 4 * monster.mMaxDamage + 6; + monster.mDamage *= 4; + monster.mDamage += { 6 }; monster.mMinDamage2 = 4 * monster.mMinDamage2 + 6; monster.mMaxDamage2 = 4 * monster.mMaxDamage2 + 6; } @@ -1546,16 +1544,16 @@ bool MonsterAttack(int i) assert(monster.MData != nullptr); if (monster.AnimInfo.CurrentFrame == monster.MData->mAFNum) { - MonsterAttackPlayer(i, monster._menemy, monster.mHit, monster.mMinDamage, monster.mMaxDamage); + MonsterAttackPlayer(i, monster._menemy, monster.mHit, monster.mDamage.minValue, monster.mDamage.maxValue); if (monster._mAi != AI_SNAKE) PlayEffect(monster, 0); } if (monster.MType->mtype >= MT_NMAGMA && monster.MType->mtype <= MT_WMAGMA && monster.AnimInfo.CurrentFrame == 9) { - MonsterAttackPlayer(i, monster._menemy, monster.mHit + 10, monster.mMinDamage - 2, monster.mMaxDamage - 2); + MonsterAttackPlayer(i, monster._menemy, monster.mHit + 10, monster.mDamage.minValue - 2, monster.mDamage.maxValue - 2); PlayEffect(monster, 0); } if (monster.MType->mtype >= MT_STORM && monster.MType->mtype <= MT_MAEL && monster.AnimInfo.CurrentFrame == 13) { - MonsterAttackPlayer(i, monster._menemy, monster.mHit - 20, monster.mMinDamage + 4, monster.mMaxDamage + 4); + MonsterAttackPlayer(i, monster._menemy, monster.mHit - 20, monster.mDamage.minValue + 4, monster.mDamage.maxValue + 4); PlayEffect(monster, 0); } if (monster._mAi == AI_SNAKE && monster.AnimInfo.CurrentFrame == 1) @@ -3099,7 +3097,7 @@ void CounselorAi(int i) if (abs(mx) >= 2 || abs(my) >= 2) { if (v < 5 * (monster._mint + 10) && LineClearMissile(monster.position.tile, { fx, fy })) { constexpr missile_id MissileTypes[4] = { MIS_FIREBOLT, MIS_CBOLT, MIS_LIGHTCTRL, MIS_FIREBALL }; - StartRangedAttack(monster, MissileTypes[monster._mint], monster.mMinDamage + GenerateRnd(monster.mMaxDamage - monster.mMinDamage + 1)); + StartRangedAttack(monster, MissileTypes[monster._mint], monster.mDamage.GetValue()); } else if (GenerateRnd(100) < 30) { monster._mgoal = MGOAL_MOVE; monster._mgoalvar1 = 0; @@ -4912,8 +4910,7 @@ void SpawnGolem(int i, Point position, Missile &missile) golem._mhitpoints = golem._mmaxhp; golem.mArmorClass = 25; golem.mHit = 5 * (missile._mispllvl + 8) + 2 * player._pLevel; - golem.mMinDamage = 2 * (missile._mispllvl + 4); - golem.mMaxDamage = 2 * (missile._mispllvl + 8); + golem.mDamage = (Damage { 4, 8 } + Damage { missile._mispllvl }) * 2; golem._mFlags |= MFLAG_GOLEM; StartSpecialStand(golem, Direction::South); UpdateEnemy(golem); diff --git a/Source/monster.h b/Source/monster.h index d775a9ae5..939ba7806 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -9,6 +9,7 @@ #include #include +#include "damage.hpp" #include "engine.h" #include "engine/actor_position.hpp" #include "engine/animationinfo.h" @@ -204,8 +205,7 @@ struct Monster { // note: missing field _mAFNum int8_t mLevel; uint16_t mExp; uint16_t mHit; - uint8_t mMinDamage; - uint8_t mMaxDamage; + Damage mDamage; uint16_t mHit2; uint8_t mMinDamage2; uint8_t mMaxDamage2;