Browse Source

Fix MissileFileData arrays not getting properly filled

pull/2596/head
Vladimir Olteanu 5 years ago committed by Anders Jenbo
parent
commit
a437cb1af9
  1. 151
      Source/misdat.cpp
  2. 13
      Source/misdat.h
  3. 28
      Source/utils/autofill_array.h

151
Source/misdat.cpp

@ -130,80 +130,101 @@ MissileDataStruct MissileData[] = {
MissileFileData MissileSpriteData[] = {
// clang-format off
// 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 },
{ "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
};
namespace {
template <typename T>
std::array<T, 16> maybeAutofill(std::initializer_list<T> list)
{
assert(list.size() <= 16);
std::array<T, 16> ret;
if (list.size() == 1) {
ret.fill(*list.begin());
} else {
int i = 0;
for (T x : list)
ret[i++] = x;
}
return ret;
}
} // namespace
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)
std::initializer_list<uint8_t> animDelay, std::initializer_list<uint8_t> animLen,
std::initializer_list<int16_t> animWidth, std::initializer_list<int16_t> animWidth2)
: name(name)
, animName(animName)
, animFAmt(animFAmt)
, flags(flags)
, animDelay(animDelay)
, animLen(animLen)
, animWidth(animWidth)
, animWidth2(animWidth2)
, animDelay(maybeAutofill(animDelay))
, animLen(maybeAutofill(animLen))
, animWidth(maybeAutofill(animWidth))
, animWidth2(maybeAutofill(animWidth2))
{
}

13
Source/misdat.h

@ -10,7 +10,6 @@
#include "engine.h"
#include "effects.h"
#include "utils/autofill_array.h"
#include "utils/stdcompat/cstddef.hpp"
namespace devilution {
@ -137,10 +136,10 @@ struct MissileFileData {
uint8_t animFAmt;
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 = {};
std::array<uint8_t, 16> animDelay = {};
std::array<uint8_t, 16> animLen = {};
std::array<int16_t, 16> animWidth = {};
std::array<int16_t, 16> animWidth2 = {};
MissileFileData(const char *name, uint8_t animName, uint8_t animFAmt, MissileDataFlags flags)
: name(name)
@ -151,8 +150,8 @@ struct 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);
std::initializer_list<uint8_t> animDelay, std::initializer_list<uint8_t> animLen,
std::initializer_list<int16_t> animWidth, std::initializer_list<int16_t> animWidth2);
void LoadGFX();

28
Source/utils/autofill_array.h

@ -1,28 +0,0 @@
#pragma once
#include <array>
namespace devilution {
template <typename T, std::size_t N>
struct AutofillArray : public std::array<T, N> {
using std::array<T, N>::array;
explicit AutofillArray(T x)
{
std::array<T, N>::fill(x);
}
AutofillArray()
: AutofillArray(0)
{
}
template <typename... Xs>
AutofillArray(const T &x, const Xs &...xs)
: std::array<T, N>({ x, static_cast<const T &>(xs)... })
{
}
};
} //namespace devilution
Loading…
Cancel
Save