Browse Source

Introduce CMonster::GetAnimData

pull/2364/head
obligaron 5 years ago committed by Anders Jenbo
parent
commit
5f7a2803fc
  1. 9
      Source/dead.cpp
  2. 14
      Source/missiles.cpp
  3. 34
      Source/monster.cpp
  4. 7
      Source/monster.h

9
Source/dead.cpp

@ -16,13 +16,14 @@ DeadStruct Dead[MaxDead];
int8_t stonendx; int8_t stonendx;
namespace { namespace {
void InitDeadAnimationFromMonster(DeadStruct &dead, const CMonster &mon) void InitDeadAnimationFromMonster(DeadStruct &dead, CMonster &mon)
{ {
int i = 0; int i = 0;
for (const auto &celSprite : mon.Anims[MA_DEATH].CelSpritesForDirections) auto &animData = mon.GetAnimData(MA_DEATH);
for (const auto &celSprite : animData.CelSpritesForDirections)
dead.data[i++] = celSprite->Data(); dead.data[i++] = celSprite->Data();
dead.frame = mon.Anims[MA_DEATH].Frames; dead.frame = animData.Frames;
dead.width = mon.Anims[MA_DEATH].CelSpritesForDirections[0]->Width(); dead.width = animData.CelSpritesForDirections[0]->Width();
} }
} // namespace } // namespace

14
Source/missiles.cpp

@ -2322,7 +2322,7 @@ void AddMetlHit(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienem
namespace { namespace {
void InitMissileAnimationFromMonster(MissileStruct &mis, int midir, const MonsterStruct &mon, int graphic) void InitMissileAnimationFromMonster(MissileStruct &mis, int midir, const MonsterStruct &mon, int graphic)
{ {
const AnimStruct &anim = mon.MType->Anims[graphic]; const AnimStruct &anim = mon.MType->GetAnimData(graphic);
mis._mimfnum = midir; mis._mimfnum = midir;
mis._miAnimFlags = 0; mis._miAnimFlags = 0;
const auto &celSprite = *anim.CelSpritesForDirections[midir]; const auto &celSprite = *anim.CelSpritesForDirections[midir];
@ -4324,7 +4324,7 @@ void MI_Fireman(int i)
if (!PosOkMissile(0, b) || (j > 0 && (Missiles[i]._miVar1 & 1) == 0)) { if (!PosOkMissile(0, b) || (j > 0 && (Missiles[i]._miVar1 & 1) == 0)) {
Missiles[i].position.velocity *= -1; Missiles[i].position.velocity *= -1;
Missiles[i]._mimfnum = opposite[Missiles[i]._mimfnum]; Missiles[i]._mimfnum = opposite[Missiles[i]._mimfnum];
Missiles[i]._miAnimData = Monsters[src].MType->Anims[MA_WALK].CelSpritesForDirections[Missiles[i]._mimfnum]->Data(); Missiles[i]._miAnimData = Monsters[src].MType->GetAnimData(MA_WALK).CelSpritesForDirections[Missiles[i]._mimfnum]->Data();
Missiles[i]._miVar2++; Missiles[i]._miVar2++;
if (j > 0) if (j > 0)
Missiles[i]._miVar1 |= 1; Missiles[i]._miVar1 |= 1;
@ -4832,15 +4832,15 @@ void missiles_process_charge()
CMonster *mon = Monsters[mis->_misource].MType; CMonster *mon = Monsters[mis->_misource].MType;
AnimStruct *anim; int graphic;
if (mon->mtype >= MT_HORNED && mon->mtype <= MT_OBLORD) { if (mon->mtype >= MT_HORNED && mon->mtype <= MT_OBLORD) {
anim = &mon->Anims[MA_SPECIAL]; graphic = MA_SPECIAL;
} else if (mon->mtype >= MT_NSNAKE && mon->mtype <= MT_GSNAKE) { } else if (mon->mtype >= MT_NSNAKE && mon->mtype <= MT_GSNAKE) {
anim = &mon->Anims[MA_ATTACK]; graphic = MA_ATTACK;
} else { } else {
anim = &mon->Anims[MA_WALK]; graphic = MA_WALK;
} }
Missiles[mi]._miAnimData = anim->CelSpritesForDirections[mis->_mimfnum]->Data(); Missiles[mi]._miAnimData = mon->GetAnimData(graphic).CelSpritesForDirections[mis->_mimfnum]->Data();
} }
} }

34
Source/monster.cpp

@ -43,7 +43,7 @@ namespace {
void NewMonsterAnim(MonsterStruct& monster, int graphic, Direction md, AnimationDistributionFlags flags = AnimationDistributionFlags::None, int numSkippedFrames = 0, int distributeFramesBeforeFrame = 0) void NewMonsterAnim(MonsterStruct& monster, int graphic, Direction md, AnimationDistributionFlags flags = AnimationDistributionFlags::None, int numSkippedFrames = 0, int distributeFramesBeforeFrame = 0)
{ {
auto &animData = monster.MType->Anims[graphic]; auto &animData = monster.MType->GetAnimData(graphic);
auto *pCelSprite = &*animData.CelSpritesForDirections[md]; auto *pCelSprite = &*animData.CelSpritesForDirections[md];
monster.AnimInfo.SetNewAnimation(pCelSprite, animData.Frames, animData.Rate, flags, numSkippedFrames, distributeFramesBeforeFrame); monster.AnimInfo.SetNewAnimation(pCelSprite, animData.Frames, animData.Rate, flags, numSkippedFrames, distributeFramesBeforeFrame);
monster._mFlags &= ~(MFLAG_LOCK_ANIMATION | MFLAG_ALLOW_SPECIAL); monster._mFlags &= ~(MFLAG_LOCK_ANIMATION | MFLAG_ALLOW_SPECIAL);
@ -529,7 +529,7 @@ void InitMonster(int i, Direction rd, int mtype, Point position)
{ {
CMonster *monst = &LevelMonsterTypes[mtype]; CMonster *monst = &LevelMonsterTypes[mtype];
auto &animData = monst->Anims[MA_STAND]; auto &animData = monst->GetAnimData(MA_STAND);
Monsters[i]._mdir = rd; Monsters[i]._mdir = rd;
Monsters[i].position.tile = position; Monsters[i].position.tile = position;
@ -591,7 +591,7 @@ void InitMonster(int i, Direction rd, int mtype, Point position)
Monsters[i].mtalkmsg = TEXT_NONE; Monsters[i].mtalkmsg = TEXT_NONE;
if (Monsters[i]._mAi == AI_GARG) { if (Monsters[i]._mAi == AI_GARG) {
Monsters[i].AnimInfo.pCelSprite = &*monst->Anims[MA_SPECIAL].CelSpritesForDirections[rd]; Monsters[i].AnimInfo.pCelSprite = &*monst->GetAnimData(MA_SPECIAL).CelSpritesForDirections[rd];
Monsters[i].AnimInfo.CurrentFrame = 1; Monsters[i].AnimInfo.CurrentFrame = 1;
Monsters[i]._mFlags |= MFLAG_ALLOW_SPECIAL; Monsters[i]._mFlags |= MFLAG_ALLOW_SPECIAL;
Monsters[i]._mmode = MM_SATTACK; Monsters[i]._mmode = MM_SATTACK;
@ -933,7 +933,7 @@ void PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize)
} }
if (monst->_mAi != AI_GARG) { if (monst->_mAi != AI_GARG) {
monst->AnimInfo.pCelSprite = &*monst->MType->Anims[MA_STAND].CelSpritesForDirections[monst->_mdir]; monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_STAND).CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.CurrentFrame = GenerateRnd(monst->AnimInfo.NumberOfFrames - 1) + 1; monst->AnimInfo.CurrentFrame = GenerateRnd(monst->AnimInfo.NumberOfFrames - 1) + 1;
monst->_mFlags &= ~MFLAG_ALLOW_SPECIAL; monst->_mFlags &= ~MFLAG_ALLOW_SPECIAL;
monst->_mmode = MM_STAND; monst->_mmode = MM_STAND;
@ -1103,7 +1103,7 @@ void PlaceGroup(int mtype, int num, int leaderf, int leader)
} }
if (Monsters[ActiveMonsterCount]._mAi != AI_GARG) { if (Monsters[ActiveMonsterCount]._mAi != AI_GARG) {
Monsters[ActiveMonsterCount].AnimInfo.pCelSprite = &*Monsters[ActiveMonsterCount].MType->Anims[MA_STAND].CelSpritesForDirections[Monsters[ActiveMonsterCount]._mdir]; Monsters[ActiveMonsterCount].AnimInfo.pCelSprite = &*Monsters[ActiveMonsterCount].MType->GetAnimData(MA_STAND).CelSpritesForDirections[Monsters[ActiveMonsterCount]._mdir];
Monsters[ActiveMonsterCount].AnimInfo.CurrentFrame = GenerateRnd(Monsters[ActiveMonsterCount].AnimInfo.NumberOfFrames - 1) + 1; Monsters[ActiveMonsterCount].AnimInfo.CurrentFrame = GenerateRnd(Monsters[ActiveMonsterCount].AnimInfo.NumberOfFrames - 1) + 1;
Monsters[ActiveMonsterCount]._mFlags &= ~MFLAG_ALLOW_SPECIAL; Monsters[ActiveMonsterCount]._mFlags &= ~MFLAG_ALLOW_SPECIAL;
Monsters[ActiveMonsterCount]._mmode = MM_STAND; Monsters[ActiveMonsterCount]._mmode = MM_STAND;
@ -1873,8 +1873,8 @@ void M_StartHeal(int i)
assurance(Monsters[i].MType != nullptr, i); assurance(Monsters[i].MType != nullptr, i);
MonsterStruct *monst = &Monsters[i]; MonsterStruct *monst = &Monsters[i];
monst->AnimInfo.pCelSprite = &*monst->MType->Anims[MA_SPECIAL].CelSpritesForDirections[monst->_mdir]; monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_SPECIAL).CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.CurrentFrame = monst->MType->Anims[MA_SPECIAL].Frames; monst->AnimInfo.CurrentFrame = monst->MType->GetAnimData(MA_SPECIAL).Frames;
monst->_mFlags |= MFLAG_LOCK_ANIMATION; monst->_mFlags |= MFLAG_LOCK_ANIMATION;
monst->_mmode = MM_HEAL; monst->_mmode = MM_HEAL;
monst->_mVar1 = monst->_mmaxhp / (16 * (GenerateRnd(5) + 4)); monst->_mVar1 = monst->_mmaxhp / (16 * (GenerateRnd(5) + 4));
@ -1898,9 +1898,9 @@ bool M_DoStand(int i)
MonsterStruct *monst = &Monsters[i]; MonsterStruct *monst = &Monsters[i];
if (monst->MType->mtype == MT_GOLEM) if (monst->MType->mtype == MT_GOLEM)
monst->AnimInfo.pCelSprite = &*monst->MType->Anims[MA_WALK].CelSpritesForDirections[monst->_mdir]; monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_WALK).CelSpritesForDirections[monst->_mdir];
else else
monst->AnimInfo.pCelSprite = &*monst->MType->Anims[MA_STAND].CelSpritesForDirections[monst->_mdir]; monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_STAND).CelSpritesForDirections[monst->_mdir];
if (monst->AnimInfo.CurrentFrame == monst->AnimInfo.NumberOfFrames) if (monst->AnimInfo.CurrentFrame == monst->AnimInfo.NumberOfFrames)
M_Enemy(i); M_Enemy(i);
@ -2579,7 +2579,7 @@ bool M_DoDelay(int i)
commitment((DWORD)i < MAXMONSTERS, i); commitment((DWORD)i < MAXMONSTERS, i);
commitment(Monsters[i].MType != nullptr, i); commitment(Monsters[i].MType != nullptr, i);
Monsters[i].AnimInfo.pCelSprite = &*Monsters[i].MType->Anims[MA_STAND].CelSpritesForDirections[M_GetDir(i)]; Monsters[i].AnimInfo.pCelSprite = &*Monsters[i].MType->GetAnimData(MA_STAND).CelSpritesForDirections[M_GetDir(i)];
if (Monsters[i]._mAi == AI_LAZURUS) { if (Monsters[i]._mAi == AI_LAZURUS) {
if (Monsters[i]._mVar2 > 8 || Monsters[i]._mVar2 < 0) if (Monsters[i]._mVar2 > 8 || Monsters[i]._mVar2 < 0)
Monsters[i]._mVar2 = 8; Monsters[i]._mVar2 = 8;
@ -2611,7 +2611,7 @@ void M_WalkDir(int i, Direction md)
{ {
assurance((DWORD)i < MAXMONSTERS, i); assurance((DWORD)i < MAXMONSTERS, i);
int mwi = Monsters[i].MType->Anims[MA_WALK].Frames - 1; int mwi = Monsters[i].MType->GetAnimData(MA_WALK).Frames - 1;
switch (md) { switch (md) {
case DIR_N: case DIR_N:
M_StartWalk(i, 0, -MWVel[mwi][1], -1, -1, 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 (monst->_mmode == MM_STAND) {
if (abs(mx) >= 2 || abs(my) >= 2 || v >= 4 * monst->_mint + 10) if (abs(mx) >= 2 || abs(my) >= 2 || v >= 4 * monst->_mint + 10)
monst->AnimInfo.pCelSprite = &*monst->MType->Anims[MA_STAND].CelSpritesForDirections[md]; monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_STAND).CelSpritesForDirections[md];
else else
M_StartAttack(i); M_StartAttack(i);
} }
@ -4644,16 +4644,16 @@ void SyncMonsterAnim(int i)
case MM_CHARGE: case MM_CHARGE:
graphic = MA_ATTACK; graphic = MA_ATTACK;
Monsters[i].AnimInfo.CurrentFrame = 1; Monsters[i].AnimInfo.CurrentFrame = 1;
Monsters[i].AnimInfo.NumberOfFrames = Monsters[i].MType->Anims[MA_ATTACK].Frames; Monsters[i].AnimInfo.NumberOfFrames = Monsters[i].MType->GetAnimData(MA_ATTACK).Frames;
break; break;
default: default:
Monsters[i].AnimInfo.CurrentFrame = 1; Monsters[i].AnimInfo.CurrentFrame = 1;
Monsters[i].AnimInfo.NumberOfFrames = Monsters[i].MType->Anims[MA_STAND].Frames; Monsters[i].AnimInfo.NumberOfFrames = Monsters[i].MType->GetAnimData(MA_STAND).Frames;
break; break;
} }
if (Monsters[i].MType->Anims[graphic].CelSpritesForDirections[mdir]) if (Monsters[i].MType->GetAnimData(graphic).CelSpritesForDirections[mdir])
Monsters[i].AnimInfo.pCelSprite = &*Monsters[i].MType->Anims[graphic].CelSpritesForDirections[mdir]; Monsters[i].AnimInfo.pCelSprite = &*Monsters[i].MType->GetAnimData(graphic).CelSpritesForDirections[mdir];
else else
Monsters[i].AnimInfo.pCelSprite = nullptr; Monsters[i].AnimInfo.pCelSprite = nullptr;
} }
@ -5177,7 +5177,7 @@ void MonsterStruct::CheckStandAnimationIsLoaded(Direction mdir)
{ {
if (_mmode == MM_STAND || _mmode == MM_TALK) { if (_mmode == MM_STAND || _mmode == MM_TALK) {
_mdir = mdir; _mdir = mdir;
AnimInfo.pCelSprite = &*MType->Anims[MA_STAND].CelSpritesForDirections[mdir]; AnimInfo.pCelSprite = &*MType->GetAnimData(MA_STAND).CelSpritesForDirections[mdir];
} }
} }

7
Source/monster.h

@ -127,6 +127,13 @@ struct CMonster {
/** placeflag enum as a flags*/ /** placeflag enum as a flags*/
uint8_t mPlaceFlags; uint8_t mPlaceFlags;
AnimStruct Anims[6]; AnimStruct Anims[6];
/**
* @brief Returns AnimStruct for specified graphic
*/
AnimStruct& GetAnimData(int graphic)
{
return Anims[graphic];
}
#ifndef NOSOUND #ifndef NOSOUND
std::unique_ptr<TSnd> Snds[4][2]; std::unique_ptr<TSnd> Snds[4][2];
#endif #endif

Loading…
Cancel
Save