From b0ed920a2578510ac9ceefe6db0753cfb77e2ee5 Mon Sep 17 00:00:00 2001 From: obligaron Date: Wed, 16 Jun 2021 19:19:10 +0200 Subject: [PATCH] Introduce AnimationInfo to MonsterStruct --- Source/loadsave.cpp | 17 +++--- Source/monster.cpp | 141 ++++++++++++++++++++++---------------------- Source/monster.h | 14 ++--- Source/scrollrt.cpp | 18 +++--- 4 files changed, 92 insertions(+), 98 deletions(-) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index c149d7ec1..016d3914f 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -565,10 +565,11 @@ static void LoadMonster(LoadHelper *file, int i) file->skip(2); // Unused file->skip(4); // Skip pointer _mAnimData - pMonster->_mAnimDelay = file->nextLE(); - pMonster->_mAnimCnt = file->nextLE(); - pMonster->_mAnimLen = file->nextLE(); - pMonster->_mAnimFrame = file->nextLE(); + pMonster->AnimInfo = {}; + pMonster->AnimInfo.DelayLen = file->nextLE(); + pMonster->AnimInfo.DelayCounter = file->nextLE(); + pMonster->AnimInfo.NumberOfFrames = file->nextLE(); + pMonster->AnimInfo.CurrentFrame = file->nextLE(); file->skip(4); // Skip _meflag pMonster->_mDelFlag = file->nextBool32(); pMonster->_mVar1 = file->nextLE(); @@ -1619,10 +1620,10 @@ static void SaveMonster(SaveHelper *file, int i) file->skip(2); // Unused file->skip(4); // Skip pointer _mAnimData - file->writeLE(pMonster->_mAnimDelay); - file->writeLE(pMonster->_mAnimCnt); - file->writeLE(pMonster->_mAnimLen); - file->writeLE(pMonster->_mAnimFrame); + file->writeLE(pMonster->AnimInfo.DelayLen); + file->writeLE(pMonster->AnimInfo.DelayCounter); + file->writeLE(pMonster->AnimInfo.NumberOfFrames); + file->writeLE(pMonster->AnimInfo.CurrentFrame); file->skip(4); // Skip _meflag file->writeLE(pMonster->_mDelFlag); file->writeLE(pMonster->_mVar1); diff --git a/Source/monster.cpp b/Source/monster.cpp index c42c295e3..d56bae98a 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -484,11 +484,12 @@ void InitMonster(int i, Direction rd, int mtype, Point position) monster[i].mName = _(monst->MData->mName); monster[i].MType = monst; monster[i].MData = monst->MData; - monster[i]._mAnimData = monst->Anims[MA_STAND].CelSpritesForDirections[rd] ? &*monst->Anims[MA_STAND].CelSpritesForDirections[rd] : nullptr; - monster[i]._mAnimDelay = monst->Anims[MA_STAND].Rate; - monster[i]._mAnimCnt = GenerateRnd(monster[i]._mAnimDelay - 1); - monster[i]._mAnimLen = monst->Anims[MA_STAND].Frames; - monster[i]._mAnimFrame = GenerateRnd(monster[i]._mAnimLen - 1) + 1; + monster[i].AnimInfo = {}; + monster[i].AnimInfo.pCelSprite = monst->Anims[MA_STAND].CelSpritesForDirections[rd] ? &*monst->Anims[MA_STAND].CelSpritesForDirections[rd] : nullptr; + monster[i].AnimInfo.DelayLen = monst->Anims[MA_STAND].Rate; + monster[i].AnimInfo.DelayCounter = GenerateRnd(monster[i].AnimInfo.DelayLen - 1); + monster[i].AnimInfo.NumberOfFrames = monst->Anims[MA_STAND].Frames; + monster[i].AnimInfo.CurrentFrame = GenerateRnd(monster[i].AnimInfo.NumberOfFrames - 1) + 1; monster[i].mLevel = monst->MData->mLevel; monster[i]._mmaxhp = (monst->mMinHP + GenerateRnd(monst->mMaxHP - monst->mMinHP + 1)) << 6; @@ -534,8 +535,8 @@ void InitMonster(int i, Direction rd, int mtype, Point position) monster[i].mtalkmsg = TEXT_NONE; if (monster[i]._mAi == AI_GARG) { - monster[i]._mAnimData = &*monst->Anims[MA_SPECIAL].CelSpritesForDirections[rd]; - monster[i]._mAnimFrame = 1; + monster[i].AnimInfo.pCelSprite = &*monst->Anims[MA_SPECIAL].CelSpritesForDirections[rd]; + monster[i].AnimInfo.CurrentFrame = 1; monster[i]._mFlags |= MFLAG_ALLOW_SPECIAL; monster[i]._mmode = MM_SATTACK; } @@ -594,11 +595,7 @@ void ClrAllMonsters() Monst->position.old = { 0, 0 }; Monst->_mdir = static_cast(GenerateRnd(8)); Monst->position.velocity = { 0, 0 }; - Monst->_mAnimData = nullptr; - Monst->_mAnimDelay = 0; - Monst->_mAnimCnt = 0; - Monst->_mAnimLen = 0; - Monst->_mAnimFrame = 0; + Monst->AnimInfo = {}; Monst->_mFlags = 0; Monst->_mDelFlag = false; Monst->_menemy = GenerateRnd(gbActivePlayers); @@ -889,8 +886,8 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize) } if (Monst->_mAi != AI_GARG) { - Monst->_mAnimData = &*Monst->MType->Anims[MA_STAND].CelSpritesForDirections[Monst->_mdir]; - Monst->_mAnimFrame = GenerateRnd(Monst->_mAnimLen - 1) + 1; + Monst->AnimInfo.pCelSprite = &*Monst->MType->Anims[MA_STAND].CelSpritesForDirections[Monst->_mdir]; + Monst->AnimInfo.CurrentFrame = GenerateRnd(Monst->AnimInfo.NumberOfFrames - 1) + 1; Monst->_mFlags &= ~MFLAG_ALLOW_SPECIAL; Monst->_mmode = MM_STAND; } @@ -1061,8 +1058,8 @@ void PlaceGroup(int mtype, int num, int leaderf, int leader) } if (monster[nummonsters]._mAi != AI_GARG) { - monster[nummonsters]._mAnimData = &*monster[nummonsters].MType->Anims[MA_STAND].CelSpritesForDirections[monster[nummonsters]._mdir]; - monster[nummonsters]._mAnimFrame = GenerateRnd(monster[nummonsters]._mAnimLen - 1) + 1; + monster[nummonsters].AnimInfo.pCelSprite = &*monster[nummonsters].MType->Anims[MA_STAND].CelSpritesForDirections[monster[nummonsters]._mdir]; + monster[nummonsters].AnimInfo.CurrentFrame = GenerateRnd(monster[nummonsters].AnimInfo.NumberOfFrames - 1) + 1; monster[nummonsters]._mFlags &= ~MFLAG_ALLOW_SPECIAL; monster[nummonsters]._mmode = MM_STAND; } @@ -1271,11 +1268,11 @@ void monster_43C785(int i) void NewMonsterAnim(int i, AnimStruct *anim, Direction md) { MonsterStruct *Monst = &monster[i]; - Monst->_mAnimData = &*anim->CelSpritesForDirections[md]; - Monst->_mAnimLen = anim->Frames; - Monst->_mAnimCnt = 0; - Monst->_mAnimFrame = 1; - Monst->_mAnimDelay = anim->Rate; + Monst->AnimInfo.pCelSprite = &*anim->CelSpritesForDirections[md]; + Monst->AnimInfo.NumberOfFrames = anim->Frames; + Monst->AnimInfo.DelayCounter = 0; + Monst->AnimInfo.CurrentFrame = 1; + Monst->AnimInfo.DelayLen = anim->Rate; Monst->_mFlags &= ~(MFLAG_LOCK_ANIMATION | MFLAG_ALLOW_SPECIAL); Monst->_mdir = md; } @@ -1877,7 +1874,7 @@ void M_StartFadein(int i, Direction md, bool backwards) monster[i]._mFlags &= ~MFLAG_HIDDEN; if (backwards) { monster[i]._mFlags |= MFLAG_LOCK_ANIMATION; - monster[i]._mAnimFrame = monster[i]._mAnimLen; + monster[i].AnimInfo.CurrentFrame = monster[i].AnimInfo.NumberOfFrames; } } @@ -1895,7 +1892,7 @@ void M_StartFadeout(int i, Direction md, bool backwards) monster[i]._mdir = md; if (backwards) { monster[i]._mFlags |= MFLAG_LOCK_ANIMATION; - monster[i]._mAnimFrame = monster[i]._mAnimLen; + monster[i].AnimInfo.CurrentFrame = monster[i].AnimInfo.NumberOfFrames; } } @@ -1907,8 +1904,8 @@ void M_StartHeal(int i) assurance(monster[i].MType != nullptr, i); Monst = &monster[i]; - Monst->_mAnimData = &*Monst->MType->Anims[MA_SPECIAL].CelSpritesForDirections[Monst->_mdir]; - Monst->_mAnimFrame = Monst->MType->Anims[MA_SPECIAL].Frames; + Monst->AnimInfo.pCelSprite = &*Monst->MType->Anims[MA_SPECIAL].CelSpritesForDirections[Monst->_mdir]; + Monst->AnimInfo.CurrentFrame = Monst->MType->Anims[MA_SPECIAL].Frames; Monst->_mFlags |= MFLAG_LOCK_ANIMATION; Monst->_mmode = MM_HEAL; Monst->_mVar1 = Monst->_mmaxhp / (16 * (GenerateRnd(5) + 4)); @@ -1952,11 +1949,11 @@ bool M_DoStand(int i) Monst = &monster[i]; if (Monst->MType->mtype == MT_GOLEM) - Monst->_mAnimData = &*Monst->MType->Anims[MA_WALK].CelSpritesForDirections[Monst->_mdir]; + Monst->AnimInfo.pCelSprite = &*Monst->MType->Anims[MA_WALK].CelSpritesForDirections[Monst->_mdir]; else - Monst->_mAnimData = &*Monst->MType->Anims[MA_STAND].CelSpritesForDirections[Monst->_mdir]; + Monst->AnimInfo.pCelSprite = &*Monst->MType->Anims[MA_STAND].CelSpritesForDirections[Monst->_mdir]; - if (Monst->_mAnimFrame == Monst->_mAnimLen) + if (Monst->AnimInfo.CurrentFrame == Monst->AnimInfo.NumberOfFrames) M_Enemy(i); Monst->_mVar2++; @@ -1998,7 +1995,7 @@ bool M_DoWalk(int i, int variant) M_StartStand(i, monster[i]._mdir); returnValue = true; } else { //We didn't reach new tile so update monster's "sub-tile" position - if (monster[i]._mAnimCnt == 0) { + if (monster[i].AnimInfo.DelayCounter == 0) { if (monster[i].actionFrame == 0 && monster[i].MType->mtype == MT_FLESTHNG) PlayEffect(i, 3); monster[i].actionFrame++; @@ -2209,22 +2206,22 @@ bool M_DoAttack(int i) commitment(Monst->MType != nullptr, i); commitment(Monst->MData != nullptr, i); // BUGFIX: should check MData (fixed) - if (monster[i]._mAnimFrame == monster[i].MData->mAFNum) { + if (monster[i].AnimInfo.CurrentFrame == monster[i].MData->mAFNum) { M_TryH2HHit(i, monster[i]._menemy, monster[i].mHit, monster[i].mMinDamage, monster[i].mMaxDamage); if (monster[i]._mAi != AI_SNAKE) PlayEffect(i, 0); } - if (monster[i].MType->mtype >= MT_NMAGMA && monster[i].MType->mtype <= MT_WMAGMA && monster[i]._mAnimFrame == 9) { + if (monster[i].MType->mtype >= MT_NMAGMA && monster[i].MType->mtype <= MT_WMAGMA && monster[i].AnimInfo.CurrentFrame == 9) { M_TryH2HHit(i, monster[i]._menemy, monster[i].mHit + 10, monster[i].mMinDamage - 2, monster[i].mMaxDamage - 2); PlayEffect(i, 0); } - if (monster[i].MType->mtype >= MT_STORM && monster[i].MType->mtype <= MT_MAEL && monster[i]._mAnimFrame == 13) { + if (monster[i].MType->mtype >= MT_STORM && monster[i].MType->mtype <= MT_MAEL && monster[i].AnimInfo.CurrentFrame == 13) { M_TryH2HHit(i, monster[i]._menemy, monster[i].mHit - 20, monster[i].mMinDamage + 4, monster[i].mMaxDamage + 4); PlayEffect(i, 0); } - if (monster[i]._mAi == AI_SNAKE && monster[i]._mAnimFrame == 1) + if (monster[i]._mAi == AI_SNAKE && monster[i].AnimInfo.CurrentFrame == 1) PlayEffect(i, 0); - if (monster[i]._mAnimFrame == monster[i]._mAnimLen) { + if (monster[i].AnimInfo.CurrentFrame == monster[i].AnimInfo.NumberOfFrames) { M_StartStand(i, monster[i]._mdir); return true; } @@ -2240,7 +2237,7 @@ bool M_DoRAttack(int i) commitment(monster[i].MType != nullptr, i); commitment(monster[i].MData != nullptr, i); - if (monster[i]._mAnimFrame == monster[i].MData->mAFNum) { + if (monster[i].AnimInfo.CurrentFrame == monster[i].MData->mAFNum) { if (monster[i]._mVar1 != -1) { if (monster[i]._mVar1 == MIS_CBOLT) multimissiles = 3; @@ -2266,7 +2263,7 @@ bool M_DoRAttack(int i) PlayEffect(i, 0); } - if (monster[i]._mAnimFrame == monster[i]._mAnimLen) { + if (monster[i].AnimInfo.CurrentFrame == monster[i].AnimInfo.NumberOfFrames) { M_StartStand(i, monster[i]._mdir); return true; } @@ -2280,7 +2277,7 @@ bool M_DoRSpAttack(int i) commitment(monster[i].MType != nullptr, i); commitment(monster[i].MData != nullptr, i); // BUGFIX: should check MData (fixed) - if (monster[i]._mAnimFrame == monster[i].MData->mAFNum2 && monster[i]._mAnimCnt == 0) { + if (monster[i].AnimInfo.CurrentFrame == monster[i].MData->mAFNum2 && monster[i].AnimInfo.DelayCounter == 0) { Point sourcePosition = monster[i].position.tile; if (gbIsHellfire) { sourcePosition += monster[i]._mdir; @@ -2298,7 +2295,7 @@ bool M_DoRSpAttack(int i) PlayEffect(i, 3); } - if (monster[i]._mAi == AI_MEGA && monster[i]._mAnimFrame == 3) { + if (monster[i]._mAi == AI_MEGA && monster[i].AnimInfo.CurrentFrame == 3) { if (monster[i]._mVar2++ == 0) { monster[i]._mFlags |= MFLAG_ALLOW_SPECIAL; } else if (monster[i]._mVar2 == 15) { @@ -2306,7 +2303,7 @@ bool M_DoRSpAttack(int i) } } - if (monster[i]._mAnimFrame == monster[i]._mAnimLen) { + if (monster[i].AnimInfo.CurrentFrame == monster[i].AnimInfo.NumberOfFrames) { M_StartStand(i, monster[i]._mdir); return true; } @@ -2320,10 +2317,10 @@ bool M_DoSAttack(int i) commitment(monster[i].MType != nullptr, i); commitment(monster[i].MData != nullptr, i); - if (monster[i]._mAnimFrame == monster[i].MData->mAFNum2) + if (monster[i].AnimInfo.CurrentFrame == monster[i].MData->mAFNum2) M_TryH2HHit(i, monster[i]._menemy, monster[i].mHit2, monster[i].mMinDamage2, monster[i].mMaxDamage2); - if (monster[i]._mAnimFrame == monster[i]._mAnimLen) { + if (monster[i].AnimInfo.CurrentFrame == monster[i].AnimInfo.NumberOfFrames) { M_StartStand(i, monster[i]._mdir); return true; } @@ -2335,8 +2332,8 @@ bool M_DoFadein(int i) { commitment((DWORD)i < MAXMONSTERS, i); - if ((!(monster[i]._mFlags & MFLAG_LOCK_ANIMATION) || monster[i]._mAnimFrame != 1) - && (monster[i]._mFlags & MFLAG_LOCK_ANIMATION || monster[i]._mAnimFrame != monster[i]._mAnimLen)) { + if ((!(monster[i]._mFlags & MFLAG_LOCK_ANIMATION) || monster[i].AnimInfo.CurrentFrame != 1) + && (monster[i]._mFlags & MFLAG_LOCK_ANIMATION || monster[i].AnimInfo.CurrentFrame != monster[i].AnimInfo.NumberOfFrames)) { return false; } @@ -2352,8 +2349,8 @@ bool M_DoFadeout(int i) commitment((DWORD)i < MAXMONSTERS, i); - if ((!(monster[i]._mFlags & MFLAG_LOCK_ANIMATION) || monster[i]._mAnimFrame != 1) - && (monster[i]._mFlags & MFLAG_LOCK_ANIMATION || monster[i]._mAnimFrame != monster[i]._mAnimLen)) { + if ((!(monster[i]._mFlags & MFLAG_LOCK_ANIMATION) || monster[i].AnimInfo.CurrentFrame != 1) + && (monster[i]._mFlags & MFLAG_LOCK_ANIMATION || monster[i].AnimInfo.CurrentFrame != monster[i].AnimInfo.NumberOfFrames)) { return false; } @@ -2382,7 +2379,7 @@ bool M_DoHeal(int i) return false; } - if (Monst->_mAnimFrame == 1) { + if (Monst->AnimInfo.CurrentFrame == 1) { Monst->_mFlags &= ~MFLAG_LOCK_ANIMATION; Monst->_mFlags |= MFLAG_ALLOW_SPECIAL; if (Monst->_mVar1 + Monst->_mhitpoints < Monst->_mmaxhp) { @@ -2510,7 +2507,7 @@ bool M_DoGotHit(int i) commitment((DWORD)i < MAXMONSTERS, i); commitment(monster[i].MType != nullptr, i); - if (monster[i]._mAnimFrame == monster[i]._mAnimLen) { + if (monster[i].AnimInfo.CurrentFrame == monster[i].AnimInfo.NumberOfFrames) { M_StartStand(i, monster[i]._mdir); return true; @@ -2628,7 +2625,7 @@ bool M_DoDeath(int i) if (monster[i]._mVar1 == 140) PrepDoEnding(); - } else if (monster[i]._mAnimFrame == monster[i]._mAnimLen) { + } else if (monster[i].AnimInfo.CurrentFrame == monster[i].AnimInfo.NumberOfFrames) { if (monster[i]._uniqtype == 0) AddDead(monster[i].position.tile, monster[i].MType->mdeadval, monster[i]._mdir); else @@ -2647,10 +2644,10 @@ bool M_DoSpStand(int i) commitment((DWORD)i < MAXMONSTERS, i); commitment(monster[i].MType != nullptr, i); - if (monster[i]._mAnimFrame == monster[i].MData->mAFNum2) + if (monster[i].AnimInfo.CurrentFrame == monster[i].MData->mAFNum2) PlayEffect(i, 3); - if (monster[i]._mAnimFrame == monster[i]._mAnimLen) { + if (monster[i].AnimInfo.CurrentFrame == monster[i].AnimInfo.NumberOfFrames) { M_StartStand(i, monster[i]._mdir); return true; } @@ -2665,16 +2662,16 @@ bool M_DoDelay(int i) commitment((DWORD)i < MAXMONSTERS, i); commitment(monster[i].MType != nullptr, i); - monster[i]._mAnimData = &*monster[i].MType->Anims[MA_STAND].CelSpritesForDirections[M_GetDir(i)]; + monster[i].AnimInfo.pCelSprite = &*monster[i].MType->Anims[MA_STAND].CelSpritesForDirections[M_GetDir(i)]; if (monster[i]._mAi == AI_LAZURUS) { if (monster[i]._mVar2 > 8 || monster[i]._mVar2 < 0) monster[i]._mVar2 = 8; } if (monster[i]._mVar2-- == 0) { - oFrame = monster[i]._mAnimFrame; + oFrame = monster[i].AnimInfo.CurrentFrame; M_StartStand(i, monster[i]._mdir); - monster[i]._mAnimFrame = oFrame; + monster[i].AnimInfo.CurrentFrame = oFrame; return true; } @@ -3243,7 +3240,7 @@ void MAI_Sneak(int i) } if (Monst->_mmode == MM_STAND) { if (abs(mx) >= 2 || abs(my) >= 2 || v >= 4 * Monst->_mint + 10) - Monst->_mAnimData = &*Monst->MType->Anims[MA_STAND].CelSpritesForDirections[md]; + Monst->AnimInfo.pCelSprite = &*Monst->MType->Anims[MA_STAND].CelSpritesForDirections[md]; else M_StartAttack(i); } @@ -3337,7 +3334,7 @@ void MAI_Fallen(int i) } } - if (Monst->_mAnimFrame == Monst->_mAnimLen) { + if (Monst->AnimInfo.CurrentFrame == Monst->AnimInfo.NumberOfFrames) { if (GenerateRnd(4) != 0) { return; } @@ -3503,7 +3500,7 @@ void MAI_Ranged(int i, int missile_type, bool special) else M_StartRAttack(i, missile_type, 4); } else { - Monst->_mAnimData = &*Monst->MType->Anims[MA_STAND].CelSpritesForDirections[md]; + Monst->AnimInfo.pCelSprite = &*Monst->MType->Anims[MA_STAND].CelSpritesForDirections[md]; } } } else if (Monst->_msquelch != 0) { @@ -4627,18 +4624,18 @@ void ProcessMonsters() } } while (raflag); if (Monst->_mmode != MM_STONE) { - Monst->_mAnimCnt++; - if (!(Monst->_mFlags & MFLAG_ALLOW_SPECIAL) && Monst->_mAnimCnt >= Monst->_mAnimDelay) { - Monst->_mAnimCnt = 0; + Monst->AnimInfo.DelayCounter++; + if (!(Monst->_mFlags & MFLAG_ALLOW_SPECIAL) && Monst->AnimInfo.DelayCounter >= Monst->AnimInfo.DelayLen) { + Monst->AnimInfo.DelayCounter = 0; if (Monst->_mFlags & MFLAG_LOCK_ANIMATION) { - Monst->_mAnimFrame--; - if (Monst->_mAnimFrame == 0) { - Monst->_mAnimFrame = Monst->_mAnimLen; + Monst->AnimInfo.CurrentFrame--; + if (Monst->AnimInfo.CurrentFrame == 0) { + Monst->AnimInfo.CurrentFrame = Monst->AnimInfo.NumberOfFrames; } } else { - Monst->_mAnimFrame++; - if (Monst->_mAnimFrame > Monst->_mAnimLen) { - Monst->_mAnimFrame = 1; + Monst->AnimInfo.CurrentFrame++; + if (Monst->AnimInfo.CurrentFrame > Monst->AnimInfo.NumberOfFrames) { + Monst->AnimInfo.CurrentFrame = 1; } } } @@ -4845,19 +4842,19 @@ void SyncMonsterAnim(int i) break; case MM_CHARGE: graphic = MA_ATTACK; - monster[i]._mAnimFrame = 1; - monster[i]._mAnimLen = monster[i].MType->Anims[MA_ATTACK].Frames; + monster[i].AnimInfo.CurrentFrame = 1; + monster[i].AnimInfo.NumberOfFrames = monster[i].MType->Anims[MA_ATTACK].Frames; break; default: - monster[i]._mAnimFrame = 1; - monster[i]._mAnimLen = monster[i].MType->Anims[MA_STAND].Frames; + monster[i].AnimInfo.CurrentFrame = 1; + monster[i].AnimInfo.NumberOfFrames = monster[i].MType->Anims[MA_STAND].Frames; break; } if (monster[i].MType->Anims[graphic].CelSpritesForDirections[_mdir]) - monster[i]._mAnimData = &*monster[i].MType->Anims[graphic].CelSpritesForDirections[_mdir]; + monster[i].AnimInfo.pCelSprite = &*monster[i].MType->Anims[graphic].CelSpritesForDirections[_mdir]; else - monster[i]._mAnimData = nullptr; + monster[i].AnimInfo.pCelSprite = nullptr; } void M_FallenFear(Point position) @@ -5433,7 +5430,7 @@ void decode_enemy(int m, int enemy) void MonsterStruct::CheckStandAnimationIsLoaded(int mdir) { if (_mmode == MM_STAND || _mmode == MM_TALK) - _mAnimData = &*MType->Anims[MA_STAND].CelSpritesForDirections[mdir]; + AnimInfo.pCelSprite = &*MType->Anims[MA_STAND].CelSpritesForDirections[mdir]; } } // namespace devilution diff --git a/Source/monster.h b/Source/monster.h index 3368c70d5..963afa4bf 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -10,6 +10,7 @@ #include "engine.h" #include "engine/actor_position.hpp" +#include "engine/animationinfo.h" #include "engine/cel_sprite.hpp" #include "engine/point.hpp" #include "miniwin/miniwin.h" @@ -151,15 +152,10 @@ struct MonsterStruct { // note: missing field _mAFNum int _menemy; /** Usually correspond's to the enemy's future position */ Point enemyPosition; - CelSprite *_mAnimData; - /** Tick length of each frame in the current animation */ - int _mAnimDelay; - /** Increases by one each game tick, counting how close we are to _pAnimDelay */ - int _mAnimCnt; - /** Number of frames in current animation */ - int _mAnimLen; - /** Current frame of animation. */ - int _mAnimFrame; + /** + * @brief Contains Information for current Animation + */ + AnimationInfo AnimInfo; bool _mDelFlag; int _mVar1; int _mVar2; diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index bfb64b932..d952312a3 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -315,13 +315,13 @@ static void DrawMonster(const CelOutputBuffer &out, int x, int y, int mx, int my return; } - if (monster[m]._mAnimData == nullptr) { + if (monster[m].AnimInfo.pCelSprite == nullptr) { Log("Draw Monster \"{}\": NULL Cel Buffer", monster[m].mName); return; } - int nCel = monster[m]._mAnimFrame; - auto frameTable = reinterpret_cast(monster[m]._mAnimData->Data()); + int nCel = monster[m].AnimInfo.CurrentFrame; + auto frameTable = reinterpret_cast(monster[m].AnimInfo.pCelSprite->Data()); int frames = SDL_SwapLE32(frameTable[0]); if (nCel < 1 || frames > 50 || nCel > frames) { const char *szMode = "unknown action"; @@ -337,10 +337,10 @@ static void DrawMonster(const CelOutputBuffer &out, int x, int y, int mx, int my return; } - CelSprite &cel = *monster[m]._mAnimData; + CelSprite &cel = *monster[m].AnimInfo.pCelSprite; if ((dFlags[x][y] & BFLAG_LIT) == 0) { - Cl2DrawLightTbl(out, mx, my, cel, monster[m]._mAnimFrame, 1); + Cl2DrawLightTbl(out, mx, my, cel, nCel, 1); return; } @@ -352,9 +352,9 @@ static void DrawMonster(const CelOutputBuffer &out, int x, int y, int mx, int my if (plr[myplr]._pInfraFlag && light_table_index > 8) trans = 1; if (trans) - Cl2DrawLightTbl(out, mx, my, cel, monster[m]._mAnimFrame, trans); + Cl2DrawLightTbl(out, mx, my, cel, nCel, trans); else - Cl2DrawLight(out, mx, my, cel, monster[m]._mAnimFrame); + Cl2DrawLight(out, mx, my, cel, nCel); } /** @@ -696,12 +696,12 @@ static void DrawMonsterHelper(const CelOutputBuffer &out, int x, int y, int oy, return; } - const CelSprite &cel = *pMonster->_mAnimData; + const CelSprite &cel = *pMonster->AnimInfo.pCelSprite; px = sx + pMonster->position.offset.x - CalculateWidth2(cel.Width()); py = sy + pMonster->position.offset.y; if (mi == pcursmonst) { - Cl2DrawOutline(out, 233, px, py, cel, pMonster->_mAnimFrame); + Cl2DrawOutline(out, 233, px, py, cel, pMonster->AnimInfo.CurrentFrame); } DrawMonster(out, x, y, px, py, mi); }