Browse Source

Introduce MissileDataFlags

pull/2583/head
Vladimir Olteanu 5 years ago committed by Anders Jenbo
parent
commit
b76e8c060b
  1. 4
      Source/loadsave.cpp
  2. 126
      Source/misdat.cpp
  3. 12
      Source/misdat.h
  4. 4
      Source/missiles.cpp
  5. 2
      Source/missiles.h

4
Source/loadsave.cpp

@ -655,7 +655,7 @@ void LoadMissile(LoadHelper *file, int i)
pMissile->_miDelFlag = file->NextBool32();
pMissile->_miAnimType = file->NextLE<uint8_t>();
file->Skip(3); // Alignment
pMissile->_miAnimFlags = file->NextLE<int32_t>();
pMissile->_miAnimFlags = static_cast<MissileDataFlags>(file->NextLE<int32_t>());
file->Skip(4); // Skip pointer _miAnimData
pMissile->_miAnimDelay = file->NextLE<int32_t>();
pMissile->_miAnimLen = file->NextLE<int32_t>();
@ -1304,7 +1304,7 @@ void SaveMissile(SaveHelper *file, int i)
file->WriteLE<uint32_t>(pMissile->_miDelFlag ? 1 : 0);
file->WriteLE<uint8_t>(pMissile->_miAnimType);
file->Skip(3); // Alignment
file->WriteLE<int32_t>(pMissile->_miAnimFlags);
file->WriteLE<int32_t>(static_cast<int32_t>(pMissile->_miAnimFlags));
file->Skip(4); // Skip pointer _miAnimData
file->WriteLE<int32_t>(pMissile->_miAnimDelay);
file->WriteLE<int32_t>(pMissile->_miAnimLen);

126
Source/misdat.cpp

@ -129,71 +129,71 @@ MissileDataStruct MissileData[] = {
/** Data related to each missile graphic ID. */
MissileFileData MissileSpriteData[] = {
// clang-format off
// name, animName, animFAmt, flags, animDelay[16], animLen[16], animWidth[16], animWidth2[16]
{ "Arrows", MFILE_ARROWS, 1, MFLAG_LOCK_ANIMATION, 0, 16, 96, 16 },
{ "Fireba", MFILE_FIREBA, 16, 0, 0, 14, 96, 16 },
{ "Guard", MFILE_GUARD, 3, 0, 1, { 15, 14, 3 }, 96, 16 },
{ "Lghning", MFILE_LGHNING, 1, 0, 0, 8, 96, 16 },
{ "Firewal", MFILE_FIREWAL, 2, 0, 0, { 13, 11 }, 128, 32 },
{ "MagBlos", MFILE_MAGBLOS, 1, 0, 1, 10, 128, 32 },
{ "Portal", MFILE_PORTAL, 2, 0, { 0, 1 }, 16, 96, 16 },
{ "Bluexfr", MFILE_BLUEXFR, 1, 0, 0, 19, 160, 48 },
{ "Bluexbk", MFILE_BLUEXBK, 1, 0, 0, 19, 160, 48 },
{ "Manashld", MFILE_MANASHLD, 1, MFLAG_LOCK_ANIMATION, 0, 1, 96, 16 },
{ "Blood", MFILE_BLOOD, 4, 0, 0, { 15, 8, 8, 8 }, { 96, 128, 128, 128 }, { 16, 32, 32, 32 } },
{ "Bone", MFILE_BONE, 3, 0, 2, 8, 128, 32 },
{ "Metlhit", MFILE_METLHIT, 3, 0, 2, 10, 96, 16 },
{ "Farrow", MFILE_FARROW, 16, 0, 0, 4, 96, 16 },
{ "Doom", MFILE_DOOM, 9, MFLAG_HIDDEN, 1, 15, 96, 16 },
{ " ", MFILE_0F, 1, MFLAG_HIDDEN, 0, 0, 0, 0 },
{ "Blodbur", MFILE_BLODBUR, 2, 0, 2, 8, 128, 32 },
{ "Newexp", MFILE_NEWEXP, 1, 0, 1, 15, 96, 16 },
{ "Shatter1", MFILE_SHATTER1, 1, 0, 1, 12, 128, 32 },
{ "Bigexp", MFILE_BIGEXP, 1, 0, 0, 15, 160, 48 },
{ "Inferno", MFILE_INFERNO, 1, 0, 0, 20, 96, 16 },
{ "Thinlght", MFILE_THINLGHT, 1, MFLAG_HIDDEN, 0, 8, 96, 16 },
{ "Flare", MFILE_FLARE, 1, 0, 0, 16, 128, 32 },
{ "Flareexp", MFILE_FLAREEXP, 1, 0, 0, 7, 128, 32 },
{ "Magball", MFILE_MAGBALL, 8, MFLAG_HIDDEN, 1, 16, 128, 32 },
{ "Krull", MFILE_KRULL, 1, MFLAG_HIDDEN, 0, 14, 96, 16 },
{ "Miniltng", MFILE_MINILTNG, 1, 0, 1, 8, 64, 0 },
{ "Holy", MFILE_HOLY, 16, 0, { 1, 0 }, 14, 96, 16 },
{ "Holyexpl", MFILE_HOLYEXPL, 1, 0, 0, 8, 160, 48 },
{ "Larrow", MFILE_LARROW, 16, 0, 0, 4, 96, 16 },
{ "Firarwex", MFILE_FIRARWEX, 1, 0, 0, 6, 64, 0 },
{ "Acidbf", MFILE_ACIDBF, 16, MFLAG_HIDDEN, 0, 8, 96, 16 },
{ "Acidspla", MFILE_ACIDSPLA, 1, MFLAG_HIDDEN, 0, 8, 96, 16 },
{ "Acidpud", MFILE_ACIDPUD, 2, MFLAG_HIDDEN, 0, { 9, 4 }, 96, 16 },
{ "Ethrshld", MFILE_ETHRSHLD, 1, 0, 0, 1, 96, 16 },
{ "Firerun", MFILE_FIRERUN, 8, 0, 1, 12, 96, 16 },
{ "Ressur1", MFILE_RESSUR1, 1, 0, 0, 16, 96, 16 },
{ "Sklball", MFILE_SKLBALL, 9, 0, 1, { 16, 16, 16, 16, 16, 16, 16, 16, 8 }, 96, 16 },
{ "Rportal", MFILE_RPORTAL, 2, 0, 0, 16, 96, 16 },
{ "Fireplar", MFILE_FIREPLAR, 1, MFLAG_HIDDEN, 1, 17, 160, 48 },
{ "Scubmisb", MFILE_SCUBMISB, 1, MFLAG_HIDDEN, 0, 16, 96, 16 },
{ "Scbsexpb", MFILE_SCBSEXPB, 1, MFLAG_HIDDEN, 0, 6, 128, 32 },
{ "Scubmisc", MFILE_SCUBMISC, 1, MFLAG_HIDDEN, 0, 16, 96, 16 },
{ "Scbsexpc", MFILE_SCBSEXPC, 1, MFLAG_HIDDEN, 0, 6, 128, 32 },
{ "Scubmisd", MFILE_SCUBMISD, 1, MFLAG_HIDDEN, 0, 16, 96, 16 },
{ "Scbsexpd", MFILE_SCBSEXPD, 1, MFLAG_HIDDEN, 0, 6, 128, 32 },
{ "spawns", MFILE_SPAWNS, 8, MFLAG_HIDDEN, 0, 9, 96, 16 },
{ "reflect", MFILE_REFLECT, 1, MFLAG_LOCK_ANIMATION, 0, 1, 160, 64 },
{ "ms_ora", MFILE_LICH, 16, MFLAG_HIDDEN, 0, 15, 96, 8 },
{ "ms_bla", MFILE_MSBLA, 16, MFLAG_HIDDEN, 0, 15, 96, 8 },
{ "ms_reb", MFILE_NECROMORB, 16, MFLAG_HIDDEN, 0, 15, 96, 8 },
{ "ms_yeb", MFILE_ARCHLICH, 16, MFLAG_HIDDEN, 0, 15, 96, 8 },
{ "rglows1", MFILE_RUNE, 1, 0, 0, 10, 96, 8 },
{ "ex_yel2", MFILE_EXYEL2, 1, MFLAG_HIDDEN, 0, 10, 220, 78 },
{ "ex_blu2", MFILE_EXBL2, 1, MFLAG_HIDDEN, 0, 10, 212, 86 },
{ "ex_red3", MFILE_EXRED3, 1, MFLAG_HIDDEN, 0, 7, 292, 114 },
{ "ms_blb", MFILE_BONEDEMON, 16, MFLAG_HIDDEN, 0, 15, 96, 8 },
{ "ex_ora1", MFILE_EXORA1, 1, MFLAG_HIDDEN, 0, 13, 96, -12 },
{ "ex_blu3", MFILE_EXBL3, 1, MFLAG_HIDDEN, 0, 7, 292, 114 },
{ "", MFILE_NONE, 0, 0 },
// name, animName, animFAmt, flags, animDelay[16], animLen[16], animWidth[16], animWidth2[16]
{ "Arrows", MFILE_ARROWS, 1, MissileDataFlags::NotAnimated, 0, 16, 96, 16 },
{ "Fireba", MFILE_FIREBA, 16, MissileDataFlags::None, 0, 14, 96, 16 },
{ "Guard", MFILE_GUARD, 3, MissileDataFlags::None, 1, { 15, 14, 3 }, 96, 16 },
{ "Lghning", MFILE_LGHNING, 1, MissileDataFlags::None, 0, 8, 96, 16 },
{ "Firewal", MFILE_FIREWAL, 2, MissileDataFlags::None, 0, { 13, 11 }, 128, 32 },
{ "MagBlos", MFILE_MAGBLOS, 1, MissileDataFlags::None, 1, 10, 128, 32 },
{ "Portal", MFILE_PORTAL, 2, MissileDataFlags::None, { 0, 1 }, 16, 96, 16 },
{ "Bluexfr", MFILE_BLUEXFR, 1, MissileDataFlags::None, 0, 19, 160, 48 },
{ "Bluexbk", MFILE_BLUEXBK, 1, MissileDataFlags::None, 0, 19, 160, 48 },
{ "Manashld", MFILE_MANASHLD, 1, MissileDataFlags::NotAnimated, 0, 1, 96, 16 },
{ "Blood", MFILE_BLOOD, 4, MissileDataFlags::None, 0, { 15, 8, 8, 8 }, { 96, 128, 128, 128 }, { 16, 32, 32, 32 } },
{ "Bone", MFILE_BONE, 3, MissileDataFlags::None, 2, 8, 128, 32 },
{ "Metlhit", MFILE_METLHIT, 3, MissileDataFlags::None, 2, 10, 96, 16 },
{ "Farrow", MFILE_FARROW, 16, MissileDataFlags::None, 0, 4, 96, 16 },
{ "Doom", MFILE_DOOM, 9, MissileDataFlags::NoGraphics, 1, 15, 96, 16 },
{ " ", MFILE_0F, 1, MissileDataFlags::NoGraphics, 0, 0, 0, 0 },
{ "Blodbur", MFILE_BLODBUR, 2, MissileDataFlags::None, 2, 8, 128, 32 },
{ "Newexp", MFILE_NEWEXP, 1, MissileDataFlags::None, 1, 15, 96, 16 },
{ "Shatter1", MFILE_SHATTER1, 1, MissileDataFlags::None, 1, 12, 128, 32 },
{ "Bigexp", MFILE_BIGEXP, 1, MissileDataFlags::None, 0, 15, 160, 48 },
{ "Inferno", MFILE_INFERNO, 1, MissileDataFlags::None, 0, 20, 96, 16 },
{ "Thinlght", MFILE_THINLGHT, 1, MissileDataFlags::NoGraphics, 0, 8, 96, 16 },
{ "Flare", MFILE_FLARE, 1, MissileDataFlags::None, 0, 16, 128, 32 },
{ "Flareexp", MFILE_FLAREEXP, 1, MissileDataFlags::None, 0, 7, 128, 32 },
{ "Magball", MFILE_MAGBALL, 8, MissileDataFlags::NoGraphics, 1, 16, 128, 32 },
{ "Krull", MFILE_KRULL, 1, MissileDataFlags::NoGraphics, 0, 14, 96, 16 },
{ "Miniltng", MFILE_MINILTNG, 1, MissileDataFlags::None, 1, 8, 64, 0 },
{ "Holy", MFILE_HOLY, 16, MissileDataFlags::None, { 1, 0 }, 14, 96, 16 },
{ "Holyexpl", MFILE_HOLYEXPL, 1, MissileDataFlags::None, 0, 8, 160, 48 },
{ "Larrow", MFILE_LARROW, 16, MissileDataFlags::None, 0, 4, 96, 16 },
{ "Firarwex", MFILE_FIRARWEX, 1, MissileDataFlags::None, 0, 6, 64, 0 },
{ "Acidbf", MFILE_ACIDBF, 16, MissileDataFlags::NoGraphics, 0, 8, 96, 16 },
{ "Acidspla", MFILE_ACIDSPLA, 1, MissileDataFlags::NoGraphics, 0, 8, 96, 16 },
{ "Acidpud", MFILE_ACIDPUD, 2, MissileDataFlags::NoGraphics, 0, { 9, 4 }, 96, 16 },
{ "Ethrshld", MFILE_ETHRSHLD, 1, MissileDataFlags::None, 0, 1, 96, 16 },
{ "Firerun", MFILE_FIRERUN, 8, MissileDataFlags::None, 1, 12, 96, 16 },
{ "Ressur1", MFILE_RESSUR1, 1, MissileDataFlags::None, 0, 16, 96, 16 },
{ "Sklball", MFILE_SKLBALL, 9, MissileDataFlags::None, 1, { 16, 16, 16, 16, 16, 16, 16, 16, 8 }, 96, 16 },
{ "Rportal", MFILE_RPORTAL, 2, MissileDataFlags::None, 0, 16, 96, 16 },
{ "Fireplar", MFILE_FIREPLAR, 1, MissileDataFlags::NoGraphics, 1, 17, 160, 48 },
{ "Scubmisb", MFILE_SCUBMISB, 1, MissileDataFlags::NoGraphics, 0, 16, 96, 16 },
{ "Scbsexpb", MFILE_SCBSEXPB, 1, MissileDataFlags::NoGraphics, 0, 6, 128, 32 },
{ "Scubmisc", MFILE_SCUBMISC, 1, MissileDataFlags::NoGraphics, 0, 16, 96, 16 },
{ "Scbsexpc", MFILE_SCBSEXPC, 1, MissileDataFlags::NoGraphics, 0, 6, 128, 32 },
{ "Scubmisd", MFILE_SCUBMISD, 1, MissileDataFlags::NoGraphics, 0, 16, 96, 16 },
{ "Scbsexpd", MFILE_SCBSEXPD, 1, MissileDataFlags::NoGraphics, 0, 6, 128, 32 },
{ "spawns", MFILE_SPAWNS, 8, MissileDataFlags::NoGraphics, 0, 9, 96, 16 },
{ "reflect", MFILE_REFLECT, 1, MissileDataFlags::NotAnimated, 0, 1, 160, 64 },
{ "ms_ora", MFILE_LICH, 16, MissileDataFlags::NoGraphics, 0, 15, 96, 8 },
{ "ms_bla", MFILE_MSBLA, 16, MissileDataFlags::NoGraphics, 0, 15, 96, 8 },
{ "ms_reb", MFILE_NECROMORB, 16, MissileDataFlags::NoGraphics, 0, 15, 96, 8 },
{ "ms_yeb", MFILE_ARCHLICH, 16, MissileDataFlags::NoGraphics, 0, 15, 96, 8 },
{ "rglows1", MFILE_RUNE, 1, MissileDataFlags::None, 0, 10, 96, 8 },
{ "ex_yel2", MFILE_EXYEL2, 1, MissileDataFlags::NoGraphics, 0, 10, 220, 78 },
{ "ex_blu2", MFILE_EXBL2, 1, MissileDataFlags::NoGraphics, 0, 10, 212, 86 },
{ "ex_red3", MFILE_EXRED3, 1, MissileDataFlags::NoGraphics, 0, 7, 292, 114 },
{ "ms_blb", MFILE_BONEDEMON, 16, MissileDataFlags::NoGraphics, 0, 15, 96, 8 },
{ "ex_ora1", MFILE_EXORA1, 1, MissileDataFlags::NoGraphics, 0, 13, 96, -12 },
{ "ex_blu3", MFILE_EXBL3, 1, MissileDataFlags::NoGraphics, 0, 7, 292, 114 },
{ "", MFILE_NONE, 0, MissileDataFlags::None, },
// clang-format on
};
MissileFileData::MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
MissileFileData::MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, MissileDataFlags flags,
AutofillArray<uint8_t, 16> animDelay, AutofillArray<uint8_t, 16> animLen,
AutofillArray<int16_t, 16> animWidth, AutofillArray<int16_t, 16> animWidth2)
: name(name)
@ -212,7 +212,7 @@ void MissileFileData::LoadGFX()
if (animData[0] != nullptr)
return;
if ((flags & MFLAG_HIDDEN) != 0)
if (flags == MissileDataFlags::NoGraphics)
return;
char pszName[256];

12
Source/misdat.h

@ -123,18 +123,24 @@ typedef struct MissileData {
MissileMovementDistrubution MovementDistribution;
} MissileDataStruct;
enum class MissileDataFlags {
None = 0,
NoGraphics = 1 << 0,
NotAnimated = 1 << 1,
};
struct MissileFileData {
const char *name;
uint8_t animName;
uint8_t animFAmt;
uint32_t flags;
MissileDataFlags flags;
std::array<std::unique_ptr<byte[]>, 16> animData;
AutofillArray<uint8_t, 16> animDelay = {};
AutofillArray<uint8_t, 16> animLen = {};
AutofillArray<int16_t, 16> animWidth = {};
AutofillArray<int16_t, 16> animWidth2 = {};
MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags)
MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, MissileDataFlags flags)
: name(name)
, animName(animName)
, animFAmt(animFAmt)
@ -142,7 +148,7 @@ struct MissileFileData {
{
}
MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags,
MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, MissileDataFlags flags,
AutofillArray<uint8_t, 16> animDelay, AutofillArray<uint8_t, 16> animLen,
AutofillArray<int16_t, 16> animWidth, AutofillArray<int16_t, 16> animWidth2);

4
Source/missiles.cpp

@ -2377,7 +2377,7 @@ void InitMissileAnimationFromMonster(MissileStruct &mis, int midir, const Monste
{
const AnimStruct &anim = mon.MType->GetAnimData(graphic);
mis._mimfnum = midir;
mis._miAnimFlags = 0;
mis._miAnimFlags = MissileDataFlags::None;
const auto &celSprite = *anim.CelSpritesForDirections[midir];
mis._miAnimData = celSprite.Data();
mis._miAnimDelay = anim.Rate;
@ -4733,7 +4733,7 @@ void ProcessMissiles()
for (int i = 0; i < ActiveMissileCount; i++) {
auto &missile = Missiles[ActiveMissiles[i]];
MissileData[missile._mitype].mProc(ActiveMissiles[i]);
if ((missile._miAnimFlags & MFLAG_LOCK_ANIMATION) != 0)
if (missile._miAnimFlags == MissileDataFlags::NotAnimated)
continue;
missile._miAnimCnt++;

2
Source/missiles.h

@ -94,7 +94,7 @@ struct MissileStruct {
int _mispllvl;
bool _miDelFlag; // Indicate whether the missile should be deleted
uint8_t _miAnimType;
int _miAnimFlags;
MissileDataFlags _miAnimFlags;
const byte *_miAnimData;
int _miAnimDelay; // Tick length of each frame in the current animation
int _miAnimLen; // Number of frames in current animation

Loading…
Cancel
Save