Browse Source

Introduce MonsterGraphic enum class

pull/2364/head
obligaron 5 years ago committed by Anders Jenbo
parent
commit
3e57d0d69b
  1. 2
      Source/dead.cpp
  2. 20
      Source/missiles.cpp
  3. 78
      Source/monster.cpp
  4. 18
      Source/monster.h

2
Source/dead.cpp

@ -19,7 +19,7 @@ namespace {
void InitDeadAnimationFromMonster(DeadStruct &dead, CMonster &mon)
{
int i = 0;
auto &animData = mon.GetAnimData(MA_DEATH);
auto &animData = mon.GetAnimData(MonsterGraphic::Death);
for (const auto &celSprite : animData.CelSpritesForDirections)
dead.data[i++] = celSprite->Data();
dead.frame = animData.Frames;

20
Source/missiles.cpp

@ -2320,7 +2320,7 @@ void AddMetlHit(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienem
}
namespace {
void InitMissileAnimationFromMonster(MissileStruct &mis, int midir, const MonsterStruct &mon, int graphic)
void InitMissileAnimationFromMonster(MissileStruct &mis, int midir, const MonsterStruct &mon, MonsterGraphic graphic)
{
const AnimStruct &anim = mon.MType->GetAnimData(graphic);
mis._mimfnum = midir;
@ -2341,12 +2341,12 @@ void InitMissileAnimationFromMonster(MissileStruct &mis, int midir, const Monste
void AddRhino(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int id, int /*dam*/)
{
int graphic = MA_SPECIAL;
MonsterGraphic graphic = MonsterGraphic::Special;
if (Monsters[id].MType->mtype < MT_HORNED || Monsters[id].MType->mtype > MT_OBLORD) {
if (Monsters[id].MType->mtype < MT_NSNAKE || Monsters[id].MType->mtype > MT_GSNAKE) {
graphic = MA_WALK;
graphic = MonsterGraphic::Walk;
} else {
graphic = MA_ATTACK;
graphic = MonsterGraphic::Attack;
}
}
UpdateMissileVel(mi, src, dst, 18);
@ -2364,7 +2364,7 @@ void AddFireman(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int
{
UpdateMissileVel(mi, src, dst, 16);
auto &mon = Monsters[id];
InitMissileAnimationFromMonster(Missiles[mi], midir, mon, MA_WALK);
InitMissileAnimationFromMonster(Missiles[mi], midir, mon, MonsterGraphic::Walk);
if (mon._uniqtype != 0)
Missiles[mi]._miUniqTrans = mon._uniqtrans + 1;
dMonster[mon.position.tile.x][mon.position.tile.y] = 0;
@ -4324,7 +4324,7 @@ void MI_Fireman(int i)
if (!PosOkMissile(0, b) || (j > 0 && (Missiles[i]._miVar1 & 1) == 0)) {
Missiles[i].position.velocity *= -1;
Missiles[i]._mimfnum = opposite[Missiles[i]._mimfnum];
Missiles[i]._miAnimData = Monsters[src].MType->GetAnimData(MA_WALK).CelSpritesForDirections[Missiles[i]._mimfnum]->Data();
Missiles[i]._miAnimData = Monsters[src].MType->GetAnimData(MonsterGraphic::Walk).CelSpritesForDirections[Missiles[i]._mimfnum]->Data();
Missiles[i]._miVar2++;
if (j > 0)
Missiles[i]._miVar1 |= 1;
@ -4832,13 +4832,13 @@ void missiles_process_charge()
CMonster *mon = Monsters[mis->_misource].MType;
int graphic;
MonsterGraphic graphic;
if (mon->mtype >= MT_HORNED && mon->mtype <= MT_OBLORD) {
graphic = MA_SPECIAL;
graphic = MonsterGraphic::Special;
} else if (mon->mtype >= MT_NSNAKE && mon->mtype <= MT_GSNAKE) {
graphic = MA_ATTACK;
graphic = MonsterGraphic::Attack;
} else {
graphic = MA_WALK;
graphic = MonsterGraphic::Walk;
}
Missiles[mi]._miAnimData = mon->GetAnimData(graphic).CelSpritesForDirections[mis->_mimfnum]->Data();
}

78
Source/monster.cpp

@ -41,7 +41,7 @@ namespace devilution {
namespace {
void NewMonsterAnim(MonsterStruct& monster, int graphic, Direction md, AnimationDistributionFlags flags = AnimationDistributionFlags::None, int numSkippedFrames = 0, int distributeFramesBeforeFrame = 0)
void NewMonsterAnim(MonsterStruct &monster, MonsterGraphic graphic, Direction md, AnimationDistributionFlags flags = AnimationDistributionFlags::None, int numSkippedFrames = 0, int distributeFramesBeforeFrame = 0)
{
auto &animData = monster.MType->GetAnimData(graphic);
auto *pCelSprite = &*animData.CelSpritesForDirections[md];
@ -56,7 +56,7 @@ void StartMonsterGotHit(int monsterId)
if (monster.MType->mtype != MT_GOLEM) {
auto animationFlags = gGameLogicStep < GameLogicStep::ProcessMonsters ? AnimationDistributionFlags::ProcessAnimationPending : AnimationDistributionFlags::None;
int numSkippedFrames = (gbIsHellfire && monster.MType->mtype == MT_DIABLO) ? 4 : 0;
NewMonsterAnim(monster, MA_GOTHIT, monster._mdir, animationFlags, numSkippedFrames);
NewMonsterAnim(monster, MonsterGraphic::GotHit, monster._mdir, animationFlags, numSkippedFrames);
monster._mmode = MM_GOTHIT;
}
monster.position.offset = { 0, 0 };
@ -529,7 +529,7 @@ void InitMonster(int i, Direction rd, int mtype, Point position)
{
CMonster *monst = &LevelMonsterTypes[mtype];
auto &animData = monst->GetAnimData(MA_STAND);
auto &animData = monst->GetAnimData(MonsterGraphic::Stand);
Monsters[i]._mdir = rd;
Monsters[i].position.tile = position;
@ -591,7 +591,7 @@ void InitMonster(int i, Direction rd, int mtype, Point position)
Monsters[i].mtalkmsg = TEXT_NONE;
if (Monsters[i]._mAi == AI_GARG) {
Monsters[i].AnimInfo.pCelSprite = &*monst->GetAnimData(MA_SPECIAL).CelSpritesForDirections[rd];
Monsters[i].AnimInfo.pCelSprite = &*monst->GetAnimData(MonsterGraphic::Special).CelSpritesForDirections[rd];
Monsters[i].AnimInfo.CurrentFrame = 1;
Monsters[i]._mFlags |= MFLAG_ALLOW_SPECIAL;
Monsters[i]._mmode = MM_SATTACK;
@ -933,7 +933,7 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize)
}
if (monst->_mAi != AI_GARG) {
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_STAND).CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MonsterGraphic::Stand).CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.CurrentFrame = GenerateRnd(monst->AnimInfo.NumberOfFrames - 1) + 1;
monst->_mFlags &= ~MFLAG_ALLOW_SPECIAL;
monst->_mmode = MM_STAND;
@ -1103,7 +1103,7 @@ void PlaceGroup(int mtype, int num, int leaderf, int leader)
}
if (Monsters[ActiveMonsterCount]._mAi != AI_GARG) {
Monsters[ActiveMonsterCount].AnimInfo.pCelSprite = &*Monsters[ActiveMonsterCount].MType->GetAnimData(MA_STAND).CelSpritesForDirections[Monsters[ActiveMonsterCount]._mdir];
Monsters[ActiveMonsterCount].AnimInfo.pCelSprite = &*Monsters[ActiveMonsterCount].MType->GetAnimData(MonsterGraphic::Stand).CelSpritesForDirections[Monsters[ActiveMonsterCount]._mdir];
Monsters[ActiveMonsterCount].AnimInfo.CurrentFrame = GenerateRnd(Monsters[ActiveMonsterCount].AnimInfo.NumberOfFrames - 1) + 1;
Monsters[ActiveMonsterCount]._mFlags &= ~MFLAG_ALLOW_SPECIAL;
Monsters[ActiveMonsterCount]._mmode = MM_STAND;
@ -1395,9 +1395,9 @@ void M_StartStand(int i, Direction md)
{
ClearMVars(i);
if (Monsters[i].MType->mtype == MT_GOLEM)
NewMonsterAnim(Monsters[i], MA_WALK, md);
NewMonsterAnim(Monsters[i], MonsterGraphic::Walk, md);
else
NewMonsterAnim(Monsters[i], MA_STAND, md);
NewMonsterAnim(Monsters[i], MonsterGraphic::Stand, md);
Monsters[i]._mVar1 = Monsters[i]._mmode;
Monsters[i]._mVar2 = 0;
Monsters[i]._mmode = MM_STAND;
@ -1421,7 +1421,7 @@ void M_StartDelay(int i, int len)
void M_StartSpStand(int i, Direction md)
{
NewMonsterAnim(Monsters[i], MA_SPECIAL, md);
NewMonsterAnim(Monsters[i], MonsterGraphic::Special, md);
Monsters[i]._mmode = MM_SPSTAND;
Monsters[i].position.offset = { 0, 0 };
Monsters[i].position.future = Monsters[i].position.tile;
@ -1441,7 +1441,7 @@ void M_StartWalk(int i, int xvel, int yvel, int xadd, int yadd, Direction endDir
Monsters[i]._mVar1 = xadd;
Monsters[i]._mVar2 = yadd;
Monsters[i]._mVar3 = endDir;
NewMonsterAnim(Monsters[i], MA_WALK, endDir, AnimationDistributionFlags::ProcessAnimationPending, -1);
NewMonsterAnim(Monsters[i], MonsterGraphic::Walk, endDir, AnimationDistributionFlags::ProcessAnimationPending, -1);
Monsters[i].position.offset2 = { 0, 0 };
}
@ -1463,7 +1463,7 @@ void M_StartWalk2(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int y
Monsters[i]._mmode = MM_WALK2;
Monsters[i].position.velocity = { xvel, yvel };
Monsters[i]._mVar3 = endDir;
NewMonsterAnim(Monsters[i], MA_WALK, endDir, AnimationDistributionFlags::ProcessAnimationPending, -1);
NewMonsterAnim(Monsters[i], MonsterGraphic::Walk, endDir, AnimationDistributionFlags::ProcessAnimationPending, -1);
Monsters[i].position.offset2 = { 16 * xoff, 16 * yoff };
}
@ -1489,14 +1489,14 @@ void M_StartWalk3(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int y
Monsters[i]._mVar1 = fx;
Monsters[i]._mVar2 = fy;
Monsters[i]._mVar3 = endDir;
NewMonsterAnim(Monsters[i], MA_WALK, endDir, AnimationDistributionFlags::ProcessAnimationPending, -1);
NewMonsterAnim(Monsters[i], MonsterGraphic::Walk, endDir, AnimationDistributionFlags::ProcessAnimationPending, -1);
Monsters[i].position.offset2 = { 16 * xoff, 16 * yoff };
}
void M_StartAttack(int i)
{
Direction md = M_GetDir(i);
NewMonsterAnim(Monsters[i], MA_ATTACK, md, AnimationDistributionFlags::ProcessAnimationPending);
NewMonsterAnim(Monsters[i], MonsterGraphic::Attack, md, AnimationDistributionFlags::ProcessAnimationPending);
Monsters[i]._mmode = MM_ATTACK;
Monsters[i].position.offset = { 0, 0 };
Monsters[i].position.future = Monsters[i].position.tile;
@ -1506,7 +1506,7 @@ void M_StartAttack(int i)
void M_StartRAttack(int i, missile_id missileType, int dam)
{
Direction md = M_GetDir(i);
NewMonsterAnim(Monsters[i], MA_ATTACK, md, AnimationDistributionFlags::ProcessAnimationPending);
NewMonsterAnim(Monsters[i], MonsterGraphic::Attack, md, AnimationDistributionFlags::ProcessAnimationPending);
Monsters[i]._mmode = MM_RATTACK;
Monsters[i]._mVar1 = missileType;
Monsters[i]._mVar2 = dam;
@ -1521,7 +1521,7 @@ void M_StartRSpAttack(int i, missile_id missileType, int dam)
int distributeFramesBeforeFrame = 0;
if (Monsters[i]._mAi == AI_MEGA)
distributeFramesBeforeFrame = Monsters[i].MData->mAFNum2;
NewMonsterAnim(Monsters[i], MA_SPECIAL, md, AnimationDistributionFlags::ProcessAnimationPending, 0, distributeFramesBeforeFrame);
NewMonsterAnim(Monsters[i], MonsterGraphic::Special, md, AnimationDistributionFlags::ProcessAnimationPending, 0, distributeFramesBeforeFrame);
Monsters[i]._mmode = MM_RSPATTACK;
Monsters[i]._mVar1 = missileType;
Monsters[i]._mVar2 = 0;
@ -1534,7 +1534,7 @@ void M_StartRSpAttack(int i, missile_id missileType, int dam)
void M_StartSpAttack(int i)
{
Direction md = M_GetDir(i);
NewMonsterAnim(Monsters[i], MA_SPECIAL, md);
NewMonsterAnim(Monsters[i], MonsterGraphic::Special, md);
Monsters[i]._mmode = MM_SATTACK;
Monsters[i].position.offset = { 0, 0 };
Monsters[i].position.future = Monsters[i].position.tile;
@ -1543,7 +1543,7 @@ void M_StartSpAttack(int i)
void M_StartEat(int i)
{
NewMonsterAnim(Monsters[i], MA_SPECIAL, Monsters[i]._mdir);
NewMonsterAnim(Monsters[i], MonsterGraphic::Special, Monsters[i]._mdir);
Monsters[i]._mmode = MM_SATTACK;
Monsters[i].position.offset = { 0, 0 };
Monsters[i].position.future = Monsters[i].position.tile;
@ -1628,7 +1628,7 @@ void M_DiabloDeath(int i, bool sendmsg)
if (k == i || monst->_msquelch == 0)
continue;
NewMonsterAnim(Monsters[k], MA_DEATH, Monsters[k]._mdir);
NewMonsterAnim(Monsters[k], MonsterGraphic::Death, Monsters[k]._mdir);
Monsters[k]._mmode = MM_DEATH;
Monsters[k].position.offset = { 0, 0 };
Monsters[k]._mVar1 = 0;
@ -1734,7 +1734,7 @@ void MonstStartKill(int i, int pnum, bool sendmsg)
PlayEffect(i, 2);
Direction md = pnum >= 0 ? M_GetDir(i) : monst->_mdir;
NewMonsterAnim(*monst, MA_DEATH, md, gGameLogicStep < GameLogicStep::ProcessMonsters ? AnimationDistributionFlags::ProcessAnimationPending : AnimationDistributionFlags::None);
NewMonsterAnim(*monst, MonsterGraphic::Death, md, gGameLogicStep < GameLogicStep::ProcessMonsters ? AnimationDistributionFlags::ProcessAnimationPending : AnimationDistributionFlags::None);
monst->_mmode = MM_DEATH;
monst->_mgoal = MGOAL_NONE;
monst->position.offset = { 0, 0 };
@ -1779,7 +1779,7 @@ void M2MStartKill(int i, int mid)
if (Monsters[mid].MType->mtype == MT_GOLEM)
md = DIR_S;
NewMonsterAnim(Monsters[mid], MA_DEATH, md, gGameLogicStep < GameLogicStep::ProcessMonsters ? AnimationDistributionFlags::ProcessAnimationPending : AnimationDistributionFlags::None);
NewMonsterAnim(Monsters[mid], MonsterGraphic::Death, md, gGameLogicStep < GameLogicStep::ProcessMonsters ? AnimationDistributionFlags::ProcessAnimationPending : AnimationDistributionFlags::None);
Monsters[mid]._mmode = MM_DEATH;
Monsters[mid].position.offset = { 0, 0 };
Monsters[mid].position.tile = Monsters[mid].position.old;
@ -1838,7 +1838,7 @@ void M_StartFadein(int i, Direction md, bool backwards)
assurance((DWORD)i < MAXMONSTERS, i);
assurance(Monsters[i].MType != nullptr, i);
NewMonsterAnim(Monsters[i], MA_SPECIAL, md);
NewMonsterAnim(Monsters[i], MonsterGraphic::Special, md);
Monsters[i]._mmode = MM_FADEIN;
Monsters[i].position.offset = { 0, 0 };
Monsters[i].position.future = Monsters[i].position.tile;
@ -1856,7 +1856,7 @@ void M_StartFadeout(int i, Direction md, bool backwards)
assurance(Monsters[i].MType != nullptr, i);
assurance(Monsters[i].MType != nullptr, i);
NewMonsterAnim(Monsters[i], MA_SPECIAL, md);
NewMonsterAnim(Monsters[i], MonsterGraphic::Special, md);
Monsters[i]._mmode = MM_FADEOUT;
Monsters[i].position.offset = { 0, 0 };
Monsters[i].position.future = Monsters[i].position.tile;
@ -1873,8 +1873,8 @@ void M_StartHeal(int i)
assurance(Monsters[i].MType != nullptr, i);
MonsterStruct *monst = &Monsters[i];
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_SPECIAL).CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.CurrentFrame = monst->MType->GetAnimData(MA_SPECIAL).Frames;
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MonsterGraphic::Special).CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.CurrentFrame = monst->MType->GetAnimData(MonsterGraphic::Special).Frames;
monst->_mFlags |= MFLAG_LOCK_ANIMATION;
monst->_mmode = MM_HEAL;
monst->_mVar1 = monst->_mmaxhp / (16 * (GenerateRnd(5) + 4));
@ -1898,9 +1898,9 @@ bool M_DoStand(int i)
MonsterStruct *monst = &Monsters[i];
if (monst->MType->mtype == MT_GOLEM)
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_WALK).CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MonsterGraphic::Walk).CelSpritesForDirections[monst->_mdir];
else
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_STAND).CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MonsterGraphic::Stand).CelSpritesForDirections[monst->_mdir];
if (monst->AnimInfo.CurrentFrame == monst->AnimInfo.NumberOfFrames)
M_Enemy(i);
@ -2579,7 +2579,7 @@ bool M_DoDelay(int i)
commitment((DWORD)i < MAXMONSTERS, i);
commitment(Monsters[i].MType != nullptr, i);
Monsters[i].AnimInfo.pCelSprite = &*Monsters[i].MType->GetAnimData(MA_STAND).CelSpritesForDirections[M_GetDir(i)];
Monsters[i].AnimInfo.pCelSprite = &*Monsters[i].MType->GetAnimData(MonsterGraphic::Stand).CelSpritesForDirections[M_GetDir(i)];
if (Monsters[i]._mAi == AI_LAZURUS) {
if (Monsters[i]._mVar2 > 8 || Monsters[i]._mVar2 < 0)
Monsters[i]._mVar2 = 8;
@ -2611,7 +2611,7 @@ void M_WalkDir(int i, Direction md)
{
assurance((DWORD)i < MAXMONSTERS, i);
int mwi = Monsters[i].MType->GetAnimData(MA_WALK).Frames - 1;
int mwi = Monsters[i].MType->GetAnimData(MonsterGraphic::Walk).Frames - 1;
switch (md) {
case DIR_N:
M_StartWalk(i, 0, -MWVel[mwi][1], -1, -1, DIR_N);
@ -3139,7 +3139,7 @@ void MAI_Sneak(int i)
}
if (monst->_mmode == MM_STAND) {
if (abs(mx) >= 2 || abs(my) >= 2 || v >= 4 * monst->_mint + 10)
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_STAND).CelSpritesForDirections[md];
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MonsterGraphic::Stand).CelSpritesForDirections[md];
else
M_StartAttack(i);
}
@ -4611,7 +4611,7 @@ void SyncMonsterAnim(int i)
Monsters[i].mName = _(Monsters[i].MData->mName);
int mdir = Monsters[i]._mdir;
int graphic = MA_STAND;
MonsterGraphic graphic = MonsterGraphic::Stand;
switch (Monsters[i]._mmode) {
case MM_STAND:
@ -4621,17 +4621,17 @@ void SyncMonsterAnim(int i)
case MM_WALK:
case MM_WALK2:
case MM_WALK3:
graphic = MA_WALK;
graphic = MonsterGraphic::Walk;
break;
case MM_ATTACK:
case MM_RATTACK:
graphic = MA_ATTACK;
graphic = MonsterGraphic::Attack;
break;
case MM_GOTHIT:
graphic = MA_GOTHIT;
graphic = MonsterGraphic::GotHit;
break;
case MM_DEATH:
graphic = MA_DEATH;
graphic = MonsterGraphic::Death;
break;
case MM_SATTACK:
case MM_FADEIN:
@ -4639,16 +4639,16 @@ void SyncMonsterAnim(int i)
case MM_SPSTAND:
case MM_RSPATTACK:
case MM_HEAL:
graphic = MA_SPECIAL;
graphic = MonsterGraphic::Special;
break;
case MM_CHARGE:
graphic = MA_ATTACK;
graphic = MonsterGraphic::Attack;
Monsters[i].AnimInfo.CurrentFrame = 1;
Monsters[i].AnimInfo.NumberOfFrames = Monsters[i].MType->GetAnimData(MA_ATTACK).Frames;
Monsters[i].AnimInfo.NumberOfFrames = Monsters[i].MType->GetAnimData(MonsterGraphic::Attack).Frames;
break;
default:
Monsters[i].AnimInfo.CurrentFrame = 1;
Monsters[i].AnimInfo.NumberOfFrames = Monsters[i].MType->GetAnimData(MA_STAND).Frames;
Monsters[i].AnimInfo.NumberOfFrames = Monsters[i].MType->GetAnimData(MonsterGraphic::Stand).Frames;
break;
}
@ -5177,7 +5177,7 @@ void MonsterStruct::CheckStandAnimationIsLoaded(Direction mdir)
{
if (_mmode == MM_STAND || _mmode == MM_TALK) {
_mdir = mdir;
AnimInfo.pCelSprite = &*MType->GetAnimData(MA_STAND).CelSpritesForDirections[mdir];
AnimInfo.pCelSprite = &*MType->GetAnimData(MonsterGraphic::Stand).CelSpritesForDirections[mdir];
}
}

18
Source/monster.h

@ -87,13 +87,13 @@ enum MON_MODE : uint8_t {
MM_TALK,
};
enum {
MA_STAND,
MA_WALK,
MA_ATTACK,
MA_GOTHIT,
MA_DEATH,
MA_SPECIAL,
enum class MonsterGraphic {
Stand,
Walk,
Attack,
GotHit,
Death,
Special,
};
enum monster_goal : uint8_t {
@ -130,9 +130,9 @@ struct CMonster {
/**
* @brief Returns AnimStruct for specified graphic
*/
AnimStruct& GetAnimData(int graphic)
AnimStruct& GetAnimData(MonsterGraphic graphic)
{
return Anims[graphic];
return Anims[static_cast<int>(graphic)];
}
#ifndef NOSOUND
std::unique_ptr<TSnd> Snds[4][2];

Loading…
Cancel
Save