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;
namespace {
void InitDeadAnimationFromMonster(DeadStruct &dead, const CMonster &mon)
void InitDeadAnimationFromMonster(DeadStruct &dead, CMonster &mon)
{
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.frame = mon.Anims[MA_DEATH].Frames;
dead.width = mon.Anims[MA_DEATH].CelSpritesForDirections[0]->Width();
dead.frame = animData.Frames;
dead.width = animData.CelSpritesForDirections[0]->Width();
}
} // namespace

14
Source/missiles.cpp

@ -2322,7 +2322,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)
{
const AnimStruct &anim = mon.MType->Anims[graphic];
const AnimStruct &anim = mon.MType->GetAnimData(graphic);
mis._mimfnum = midir;
mis._miAnimFlags = 0;
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)) {
Missiles[i].position.velocity *= -1;
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++;
if (j > 0)
Missiles[i]._miVar1 |= 1;
@ -4832,15 +4832,15 @@ void missiles_process_charge()
CMonster *mon = Monsters[mis->_misource].MType;
AnimStruct *anim;
int graphic;
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) {
anim = &mon->Anims[MA_ATTACK];
graphic = MA_ATTACK;
} 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)
{
auto &animData = monster.MType->Anims[graphic];
auto &animData = monster.MType->GetAnimData(graphic);
auto *pCelSprite = &*animData.CelSpritesForDirections[md];
monster.AnimInfo.SetNewAnimation(pCelSprite, animData.Frames, animData.Rate, flags, numSkippedFrames, distributeFramesBeforeFrame);
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];
auto &animData = monst->Anims[MA_STAND];
auto &animData = monst->GetAnimData(MA_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->Anims[MA_SPECIAL].CelSpritesForDirections[rd];
Monsters[i].AnimInfo.pCelSprite = &*monst->GetAnimData(MA_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->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->_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->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]._mFlags &= ~MFLAG_ALLOW_SPECIAL;
Monsters[ActiveMonsterCount]._mmode = MM_STAND;
@ -1873,8 +1873,8 @@ void M_StartHeal(int i)
assurance(Monsters[i].MType != nullptr, i);
MonsterStruct *monst = &Monsters[i];
monst->AnimInfo.pCelSprite = &*monst->MType->Anims[MA_SPECIAL].CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.CurrentFrame = monst->MType->Anims[MA_SPECIAL].Frames;
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_SPECIAL).CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.CurrentFrame = monst->MType->GetAnimData(MA_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->Anims[MA_WALK].CelSpritesForDirections[monst->_mdir];
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_WALK).CelSpritesForDirections[monst->_mdir];
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)
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->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]._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->Anims[MA_WALK].Frames - 1;
int mwi = Monsters[i].MType->GetAnimData(MA_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->Anims[MA_STAND].CelSpritesForDirections[md];
monst->AnimInfo.pCelSprite = &*monst->MType->GetAnimData(MA_STAND).CelSpritesForDirections[md];
else
M_StartAttack(i);
}
@ -4644,16 +4644,16 @@ void SyncMonsterAnim(int i)
case MM_CHARGE:
graphic = MA_ATTACK;
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;
default:
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;
}
if (Monsters[i].MType->Anims[graphic].CelSpritesForDirections[mdir])
Monsters[i].AnimInfo.pCelSprite = &*Monsters[i].MType->Anims[graphic].CelSpritesForDirections[mdir];
if (Monsters[i].MType->GetAnimData(graphic).CelSpritesForDirections[mdir])
Monsters[i].AnimInfo.pCelSprite = &*Monsters[i].MType->GetAnimData(graphic).CelSpritesForDirections[mdir];
else
Monsters[i].AnimInfo.pCelSprite = nullptr;
}
@ -5177,7 +5177,7 @@ void MonsterStruct::CheckStandAnimationIsLoaded(Direction mdir)
{
if (_mmode == MM_STAND || _mmode == MM_TALK) {
_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*/
uint8_t mPlaceFlags;
AnimStruct Anims[6];
/**
* @brief Returns AnimStruct for specified graphic
*/
AnimStruct& GetAnimData(int graphic)
{
return Anims[graphic];
}
#ifndef NOSOUND
std::unique_ptr<TSnd> Snds[4][2];
#endif

Loading…
Cancel
Save