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>();
else
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
monster.mMinDamage2 = 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<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.mMaxDamage);
file->WriteLE<uint8_t>(monster.mDamage.minValue);
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>(monster.mMinDamage2);
file->WriteLE<uint8_t>(monster.mMaxDamage2);

13
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);

33
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);

4
Source/monster.h

@ -9,6 +9,7 @@
#include <array>
#include <functional>
#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;

Loading…
Cancel
Save