Browse Source

♻️ Leverage 'Damage' for '_i[Min|Max]Dam' 'Monster' fields

julealgon/Enhancements/DamageStruct
Juliano Leal Goncalves 5 years ago
parent
commit
ab88730299
  1. 11
      Source/loadsave.cpp
  2. 13
      Source/missiles.cpp
  3. 33
      Source/monster.cpp
  4. 4
      Source/monster.h

11
Source/loadsave.cpp

@ -622,8 +622,11 @@ void LoadMonster(LoadHelper *file, Monster &monster)
monster.mHit = file->NextLE<uint8_t>(); monster.mHit = file->NextLE<uint8_t>();
else else
file->Skip(1); // Skip mHit as it's already initialized file->Skip(1); // Skip mHit as it's already initialized
monster.mMinDamage = file->NextLE<uint8_t>();
monster.mMaxDamage = file->NextLE<uint8_t>(); auto minDamage = file->NextLE<uint8_t>();
auto maxDamage = file->NextLE<uint8_t>();
monster.mDamage = { minDamage, maxDamage };
file->Skip(1); // Skip mHit2 as it's already initialized file->Skip(1); // Skip mHit2 as it's already initialized
monster.mMinDamage2 = file->NextLE<uint8_t>(); monster.mMinDamage2 = file->NextLE<uint8_t>();
monster.mMaxDamage2 = file->NextLE<uint8_t>(); monster.mMaxDamage2 = file->NextLE<uint8_t>();
@ -1281,8 +1284,8 @@ void SaveMonster(SaveHelper *file, Monster &monster)
file->WriteLE<uint16_t>(monster.mExp); file->WriteLE<uint16_t>(monster.mExp);
file->WriteLE<uint8_t>(std::min<uint16_t>(monster.mHit, std::numeric_limits<uint8_t>::max())); // For backwards compatibility file->WriteLE<uint8_t>(std::min<uint16_t>(monster.mHit, std::numeric_limits<uint8_t>::max())); // For backwards compatibility
file->WriteLE<uint8_t>(monster.mMinDamage); file->WriteLE<uint8_t>(monster.mDamage.minValue);
file->WriteLE<uint8_t>(monster.mMaxDamage); file->WriteLE<uint8_t>(monster.mDamage.maxValue);
file->WriteLE<uint8_t>(std::min<uint16_t>(monster.mHit2, std::numeric_limits<uint8_t>::max())); // For backwards compatibility file->WriteLE<uint8_t>(std::min<uint16_t>(monster.mHit2, std::numeric_limits<uint8_t>::max())); // For backwards compatibility
file->WriteLE<uint8_t>(monster.mMinDamage2); file->WriteLE<uint8_t>(monster.mMinDamage2);
file->WriteLE<uint8_t>(monster.mMaxDamage2); file->WriteLE<uint8_t>(monster.mMaxDamage2);

13
Source/missiles.cpp

@ -1389,8 +1389,7 @@ void AddBerserk(Missile &missile, Point dst, Direction /*midir*/)
i = 6; i = 6;
auto slvl = GetSpellLevel(missile._misource, SPL_BERSERK); auto slvl = GetSpellLevel(missile._misource, SPL_BERSERK);
monster._mFlags |= MFLAG_BERSERK | MFLAG_GOLEM; monster._mFlags |= MFLAG_BERSERK | MFLAG_GOLEM;
monster.mMinDamage = (GenerateRnd(10) + 120) * monster.mMinDamage / 100 + slvl; monster.mDamage = { (GenerateRnd(10) + 120) * monster.mDamage.minValue / 100 + slvl, (GenerateRnd(10) + 120) * monster.mDamage.maxValue / 100 + slvl };
monster.mMaxDamage = (GenerateRnd(10) + 120) * monster.mMaxDamage / 100 + slvl;
monster.mMinDamage2 = (GenerateRnd(10) + 120) * monster.mMinDamage2 / 100 + slvl; monster.mMinDamage2 = (GenerateRnd(10) + 120) * monster.mMinDamage2 / 100 + slvl;
monster.mMaxDamage2 = (GenerateRnd(10) + 120) * monster.mMaxDamage2 / 100 + slvl; monster.mMaxDamage2 = (GenerateRnd(10) + 120) * monster.mMaxDamage2 / 100 + slvl;
int r = (currlevel < 17 || currlevel > 20) ? 3 : 9; 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); missile._midam = 8 * i + 16 + ((8 * i + 16) / 2);
} else { } else {
auto &monster = Monsters[missile._misource]; 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) { if (missile._micaster == TARGET_MONSTERS) {
damage = Players[p]._pIDamage; damage = Players[p]._pIDamage;
} else { } else {
damage = { Monsters[p].mMinDamage, Monsters[p].mMaxDamage }; damage = Monsters[p].mDamage;
} }
} else { } else {
damage = { GenerateRnd(10) + 1 + currlevel, GenerateRnd(10) + 1 + currlevel * 2 }; damage = { GenerateRnd(10) + 1 + currlevel, GenerateRnd(10) + 1 + currlevel * 2 };
@ -2906,7 +2905,7 @@ void MI_Arrow(Missile &missile)
if (missile._micaster == TARGET_MONSTERS) { if (missile._micaster == TARGET_MONSTERS) {
damage = Players[p]._pIDamage; damage = Players[p]._pIDamage;
} else { } else {
damage = { Monsters[p].mMinDamage, Monsters[p].mMaxDamage }; damage = Monsters[p].mDamage;
} }
} else { } else {
damage = { currlevel, 2 * currlevel }; damage = { currlevel, 2 * currlevel };
@ -2942,7 +2941,7 @@ void MI_Firebolt(Missile &missile)
} }
} else { } else {
auto &monster = Monsters[p]; auto &monster = Monsters[p];
d = monster.mMinDamage + GenerateRnd(monster.mMaxDamage - monster.mMinDamage + 1); d = monster.mDamage.GetValue();
} }
} else { } else {
d = currlevel + GenerateRnd(2 * currlevel); d = currlevel + GenerateRnd(2 * currlevel);
@ -3374,7 +3373,7 @@ void MI_Lightctrl(Missile &missile)
dam = (GenerateRnd(2) + GenerateRnd(Players[missile._misource]._pLevel) + 2) << 6; dam = (GenerateRnd(2) + GenerateRnd(Players[missile._misource]._pLevel) + 2) << 6;
} else { } else {
auto &monster = Monsters[missile._misource]; auto &monster = Monsters[missile._misource];
dam = 2 * (monster.mMinDamage + GenerateRnd(monster.mMaxDamage - monster.mMinDamage + 1)); dam = 2 * monster.mDamage.GetValue();
} }
SpawnLightning(missile, dam); SpawnLightning(missile, dam);

33
Source/monster.cpp

@ -194,8 +194,7 @@ void InitMonster(Monster &monster, Direction rd, int mtype, Point position)
monster.mWhoHit = 0; monster.mWhoHit = 0;
monster.mExp = monster.MData->mExp; monster.mExp = monster.MData->mExp;
monster.mHit = monster.MData->mHit; monster.mHit = monster.MData->mHit;
monster.mMinDamage = monster.MData->mMinDamage; monster.mDamage = { monster.MData->mMinDamage, monster.MData->mMaxDamage };
monster.mMaxDamage = monster.MData->mMaxDamage;
monster.mHit2 = monster.MData->mHit2; monster.mHit2 = monster.MData->mHit2;
monster.mMinDamage2 = monster.MData->mMinDamage2; monster.mMinDamage2 = monster.MData->mMinDamage2;
monster.mMaxDamage2 = monster.MData->mMaxDamage2; monster.mMaxDamage2 = monster.MData->mMaxDamage2;
@ -223,8 +222,8 @@ void InitMonster(Monster &monster, Direction rd, int mtype, Point position)
monster.mLevel += 15; monster.mLevel += 15;
monster.mExp = 2 * (monster.mExp + 1000); monster.mExp = 2 * (monster.mExp + 1000);
monster.mHit += NIGHTMARE_TO_HIT_BONUS; monster.mHit += NIGHTMARE_TO_HIT_BONUS;
monster.mMinDamage = 2 * (monster.mMinDamage + 2); monster.mDamage += { 2 };
monster.mMaxDamage = 2 * (monster.mMaxDamage + 2); monster.mDamage *= 2;
monster.mHit2 += NIGHTMARE_TO_HIT_BONUS; monster.mHit2 += NIGHTMARE_TO_HIT_BONUS;
monster.mMinDamage2 = 2 * (monster.mMinDamage2 + 2); monster.mMinDamage2 = 2 * (monster.mMinDamage2 + 2);
monster.mMaxDamage2 = 2 * (monster.mMaxDamage2 + 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.mLevel += 30;
monster.mExp = 4 * (monster.mExp + 1000); monster.mExp = 4 * (monster.mExp + 1000);
monster.mHit += HELL_TO_HIT_BONUS; monster.mHit += HELL_TO_HIT_BONUS;
monster.mMinDamage = 4 * monster.mMinDamage + 6; monster.mDamage *= 4;
monster.mMaxDamage = 4 * monster.mMaxDamage + 6; monster.mDamage += { 6 };
monster.mHit2 += HELL_TO_HIT_BONUS; monster.mHit2 += HELL_TO_HIT_BONUS;
monster.mMinDamage2 = 4 * monster.mMinDamage2 + 6; monster.mMinDamage2 = 4 * monster.mMinDamage2 + 6;
monster.mMaxDamage2 = 4 * monster.mMaxDamage2 + 6; monster.mMaxDamage2 = 4 * monster.mMaxDamage2 + 6;
@ -497,8 +496,7 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize)
monster._mhitpoints = monster._mmaxhp; monster._mhitpoints = monster._mmaxhp;
monster._mAi = uniqueMonsterData.mAi; monster._mAi = uniqueMonsterData.mAi;
monster._mint = uniqueMonsterData.mint; monster._mint = uniqueMonsterData.mint;
monster.mMinDamage = uniqueMonsterData.mMinDamage; monster.mDamage = { uniqueMonsterData.mMinDamage, uniqueMonsterData.mMaxDamage };
monster.mMaxDamage = uniqueMonsterData.mMaxDamage;
monster.mMinDamage2 = uniqueMonsterData.mMinDamage; monster.mMinDamage2 = uniqueMonsterData.mMinDamage;
monster.mMaxDamage2 = uniqueMonsterData.mMaxDamage; monster.mMaxDamage2 = uniqueMonsterData.mMaxDamage;
monster.mMagicRes = uniqueMonsterData.mMagicRes; monster.mMagicRes = uniqueMonsterData.mMagicRes;
@ -529,8 +527,8 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize)
monster.mLevel += 15; monster.mLevel += 15;
monster._mhitpoints = monster._mmaxhp; monster._mhitpoints = monster._mmaxhp;
monster.mExp = 2 * (monster.mExp + 1000); monster.mExp = 2 * (monster.mExp + 1000);
monster.mMinDamage = 2 * (monster.mMinDamage + 2); monster.mDamage += { 2 };
monster.mMaxDamage = 2 * (monster.mMaxDamage + 2); monster.mDamage *= 2;
monster.mMinDamage2 = 2 * (monster.mMinDamage2 + 2); monster.mMinDamage2 = 2 * (monster.mMinDamage2 + 2);
monster.mMaxDamage2 = 2 * (monster.mMaxDamage2 + 2); monster.mMaxDamage2 = 2 * (monster.mMaxDamage2 + 2);
} else if (sgGameInitInfo.nDifficulty == DIFF_HELL) { } else if (sgGameInitInfo.nDifficulty == DIFF_HELL) {
@ -542,8 +540,8 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize)
monster.mLevel += 30; monster.mLevel += 30;
monster._mhitpoints = monster._mmaxhp; monster._mhitpoints = monster._mmaxhp;
monster.mExp = 4 * (monster.mExp + 1000); monster.mExp = 4 * (monster.mExp + 1000);
monster.mMinDamage = 4 * monster.mMinDamage + 6; monster.mDamage *= 4;
monster.mMaxDamage = 4 * monster.mMaxDamage + 6; monster.mDamage += { 6 };
monster.mMinDamage2 = 4 * monster.mMinDamage2 + 6; monster.mMinDamage2 = 4 * monster.mMinDamage2 + 6;
monster.mMaxDamage2 = 4 * monster.mMaxDamage2 + 6; monster.mMaxDamage2 = 4 * monster.mMaxDamage2 + 6;
} }
@ -1546,16 +1544,16 @@ bool MonsterAttack(int i)
assert(monster.MData != nullptr); assert(monster.MData != nullptr);
if (monster.AnimInfo.CurrentFrame == monster.MData->mAFNum) { 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) if (monster._mAi != AI_SNAKE)
PlayEffect(monster, 0); PlayEffect(monster, 0);
} }
if (monster.MType->mtype >= MT_NMAGMA && monster.MType->mtype <= MT_WMAGMA && monster.AnimInfo.CurrentFrame == 9) { 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); PlayEffect(monster, 0);
} }
if (monster.MType->mtype >= MT_STORM && monster.MType->mtype <= MT_MAEL && monster.AnimInfo.CurrentFrame == 13) { 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); PlayEffect(monster, 0);
} }
if (monster._mAi == AI_SNAKE && monster.AnimInfo.CurrentFrame == 1) 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 (abs(mx) >= 2 || abs(my) >= 2) {
if (v < 5 * (monster._mint + 10) && LineClearMissile(monster.position.tile, { fx, fy })) { 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 }; 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) { } else if (GenerateRnd(100) < 30) {
monster._mgoal = MGOAL_MOVE; monster._mgoal = MGOAL_MOVE;
monster._mgoalvar1 = 0; monster._mgoalvar1 = 0;
@ -4912,8 +4910,7 @@ void SpawnGolem(int i, Point position, Missile &missile)
golem._mhitpoints = golem._mmaxhp; golem._mhitpoints = golem._mmaxhp;
golem.mArmorClass = 25; golem.mArmorClass = 25;
golem.mHit = 5 * (missile._mispllvl + 8) + 2 * player._pLevel; golem.mHit = 5 * (missile._mispllvl + 8) + 2 * player._pLevel;
golem.mMinDamage = 2 * (missile._mispllvl + 4); golem.mDamage = (Damage { 4, 8 } + Damage { missile._mispllvl }) * 2;
golem.mMaxDamage = 2 * (missile._mispllvl + 8);
golem._mFlags |= MFLAG_GOLEM; golem._mFlags |= MFLAG_GOLEM;
StartSpecialStand(golem, Direction::South); StartSpecialStand(golem, Direction::South);
UpdateEnemy(golem); UpdateEnemy(golem);

4
Source/monster.h

@ -9,6 +9,7 @@
#include <array> #include <array>
#include <functional> #include <functional>
#include "damage.hpp"
#include "engine.h" #include "engine.h"
#include "engine/actor_position.hpp" #include "engine/actor_position.hpp"
#include "engine/animationinfo.h" #include "engine/animationinfo.h"
@ -204,8 +205,7 @@ struct Monster { // note: missing field _mAFNum
int8_t mLevel; int8_t mLevel;
uint16_t mExp; uint16_t mExp;
uint16_t mHit; uint16_t mHit;
uint8_t mMinDamage; Damage mDamage;
uint8_t mMaxDamage;
uint16_t mHit2; uint16_t mHit2;
uint8_t mMinDamage2; uint8_t mMinDamage2;
uint8_t mMaxDamage2; uint8_t mMaxDamage2;

Loading…
Cancel
Save