From 3364a4e00c7b6bd81e8059c9619dd6867bf323e5 Mon Sep 17 00:00:00 2001 From: Vladimir Olteanu Date: Thu, 22 Jul 2021 08:45:51 +0300 Subject: [PATCH] Refactor MisFileData MisFileData: make pinnedMem private --- Source/dead.cpp | 4 +- Source/misdat.cpp | 218 +++++++++++++++++++++++++++++++------------- Source/misdat.h | 65 ++++++++++--- Source/missiles.cpp | 82 +++++------------ Source/scrollrt.cpp | 6 +- 5 files changed, 237 insertions(+), 138 deletions(-) diff --git a/Source/dead.cpp b/Source/dead.cpp index 50f447c2d..4c1a2cd4c 100644 --- a/Source/dead.cpp +++ b/Source/dead.cpp @@ -46,14 +46,14 @@ void InitDead() } for (auto &dead : Dead[nd].data) - dead = MissileSpriteData[MFILE_BLODBUR].mAnimData[0]; + dead = MissileSpriteData[MFILE_BLODBUR].animData[0]; Dead[nd].frame = 8; Dead[nd].width = 128; Dead[nd].translationPaletteIndex = 0; nd++; for (auto &dead : Dead[nd].data) - dead = MissileSpriteData[MFILE_SHATTER1].mAnimData[0]; + dead = MissileSpriteData[MFILE_SHATTER1].animData[0]; Dead[nd].frame = 12; Dead[nd].width = 128; diff --git a/Source/misdat.cpp b/Source/misdat.cpp index 70f058b12..9863fa5d5 100644 --- a/Source/misdat.cpp +++ b/Source/misdat.cpp @@ -6,6 +6,8 @@ #include "misdat.h" #include "missiles.h" +#include "engine/load_file.hpp" +#include "engine/cel_header.hpp" namespace devilution { @@ -127,68 +129,162 @@ MissileDataStruct MissileData[] = { /** Data related to each missile graphic ID. */ MisFileData MissileSpriteData[] = { // clang-format off - // mName, mAnimName, mAnimFAmt, mFlags, mAnimData[16], mAnimDelay[16], mAnimLen[16], mAnimWidth[16], mAnimWidth2[16] - { "Arrows", MFILE_ARROWS, 1, 2, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Fireba", MFILE_FIREBA, 16, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } }, - { "Guard", MFILE_GUARD, 3, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Lghning", MFILE_LGHNING, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Firewal", MFILE_FIREWAL, 2, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 13, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "MagBlos", MFILE_MAGBLOS, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Portal", MFILE_PORTAL, 2, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Bluexfr", MFILE_BLUEXFR, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Bluexbk", MFILE_BLUEXBK, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Manashld", MFILE_MANASHLD, 1, 2, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Blood", MFILE_BLOOD, 4, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Bone", MFILE_BONE, 3, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Metlhit", MFILE_METLHIT, 3, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Farrow", MFILE_FARROW, 16, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } }, - { "Doom", MFILE_DOOM, 9, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0 } }, - { " ", MFILE_0F, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Blodbur", MFILE_BLODBUR, 2, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Newexp", MFILE_NEWEXP, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Shatter1", MFILE_SHATTER1, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Bigexp", MFILE_BIGEXP, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Inferno", MFILE_INFERNO, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Thinlght", MFILE_THINLGHT, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Flare", MFILE_FLARE, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Flareexp", MFILE_FLAREEXP, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Magball", MFILE_MAGBALL, 8, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 32, 32, 32, 32, 32, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Krull", MFILE_KRULL, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Miniltng", MFILE_MINILTNG, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Holy", MFILE_HOLY, 16, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } }, - { "Holyexpl", MFILE_HOLYEXPL, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Larrow", MFILE_LARROW, 16, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } }, - { "Firarwex", MFILE_FIRARWEX, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Acidbf", MFILE_ACIDBF, 16, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } }, - { "Acidspla", MFILE_ACIDSPLA, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Acidpud", MFILE_ACIDPUD, 2, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 9, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Ethrshld", MFILE_ETHRSHLD, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Firerun", MFILE_FIRERUN, 8, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Ressur1", MFILE_RESSUR1, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Sklball", MFILE_SKLBALL, 9, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 16, 16, 16, 16, 16, 16, 8, 0, 0, 0, 0, 0, 0, 0 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0 } }, - { "Rportal", MFILE_RPORTAL, 2, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Fireplar", MFILE_FIREPLAR, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Scubmisb", MFILE_SCUBMISB, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Scbsexpb", MFILE_SCBSEXPB, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Scubmisc", MFILE_SCUBMISC, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Scbsexpc", MFILE_SCBSEXPC, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Scubmisd", MFILE_SCUBMISD, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "Scbsexpd", MFILE_SCBSEXPD, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "spawns", MFILE_SPAWNS, 8, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "reflect", MFILE_REFLECT, 1, 2, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "ms_ora", MFILE_LICH, 16, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 } }, - { "ms_bla", MFILE_MSBLA, 16, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 } }, - { "ms_reb", MFILE_NECROMORB, 16, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 } }, - { "ms_yeb", MFILE_ARCHLICH, 16, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 } }, - { "rglows1", MFILE_RUNE, 1, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "ex_yel2", MFILE_EXYEL2, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "ex_blu2", MFILE_EXBL2, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "ex_red3", MFILE_EXRED3, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "ms_blb", MFILE_BONEDEMON, 16, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }, { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 } }, - { "ex_ora1", MFILE_EXORA1, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "ex_blu3", MFILE_EXBL3, 1, 1, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { "", MFILE_NONE, 0, 0, { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, + // 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 }, // clang-format on }; +MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + std::array animDelay, std::array animLen, + std::array animWidth, std::array animWidth2) + : name(name) + , animName(animName) + , animFAmt(animFAmt) + , flags(flags) + , animDelay(animDelay) + , animLen(animLen) + , animWidth(animWidth) + , animWidth2(animWidth2) +{ + if (flags & MFLAG_ALLOW_SPECIAL) + pinnedMem.reserve(1); + else + pinnedMem.reserve(animFAmt); +} + +namespace { + +template +constexpr std::array duplicate(T value, unsigned count) +{ + std::array ret = {}; + for (unsigned i = 0; i < count; i++) + ret[i] = value; + return ret; +} + +} //namespace + +MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + uint8_t animDelay, uint8_t animLen, + int16_t animWidth, int16_t animWidth2) + : MisFileData(name, animName, animFAmt, flags, + duplicate(animDelay, animFAmt), duplicate(animLen, animFAmt), + duplicate(animWidth, animFAmt), duplicate(animWidth2, animFAmt)) +{ +} + +MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + uint8_t animDelay, std::array animLen, + int16_t animWidth, int16_t animWidth2) + : MisFileData(name, animName, animFAmt, flags, + duplicate(animDelay, animFAmt), animLen, + duplicate(animWidth, animFAmt), duplicate(animWidth2, animFAmt)) +{ +} + +MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + std::array animDelay, uint8_t animLen, + int16_t animWidth, int16_t animWidth2) + : MisFileData(name, animName, animFAmt, flags, + animDelay, duplicate(animLen, animFAmt), + duplicate(animWidth, animFAmt), duplicate(animWidth2, animFAmt)) +{ +} + +MisFileData::MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + uint8_t animDelay, std::array animLen, + std::array animWidth, std::array animWidth2) + : MisFileData(name, animName, animFAmt, flags, + duplicate(animDelay, animFAmt), animLen, + animWidth, animWidth2) +{ +} + +void MisFileData::LoadGFX() +{ + if (animData[0] != nullptr) + return; + + char pszName[256]; + if ((flags & MFLAG_ALLOW_SPECIAL) != 0) { + sprintf(pszName, "Missiles\\%s.CL2", name); + auto file = LoadFileInMem(pszName); + for (int i = 0; i < animFAmt; i++) + animData[i] = CelGetFrame(file.get(), i); + pinnedMem.push_back(std::move(file)); + } else if (animFAmt == 1) { + sprintf(pszName, "Missiles\\%s.CL2", name); + auto file = LoadFileInMem(pszName); + animData[0] = file.get(); + pinnedMem.push_back(std::move(file)); + } else { + for (unsigned i = 0; i < animFAmt; i++) { + sprintf(pszName, "Missiles\\%s%u.CL2", name, i + 1); + auto file = LoadFileInMem(pszName); + animData[i] = file.get(); + pinnedMem.push_back(std::move(file)); + } + } +} + } // namespace devilution diff --git a/Source/misdat.h b/Source/misdat.h index f57dcc2c8..ebf0d99c9 100644 --- a/Source/misdat.h +++ b/Source/misdat.h @@ -6,6 +6,7 @@ #pragma once #include +#include #include "engine.h" #include "effects.h" @@ -121,19 +122,59 @@ typedef struct MissileData { MissileMovementDistrubution MovementDistribution; } MissileDataStruct; -typedef struct MisFileData { - const char *mName; - uint8_t mAnimName; - uint8_t mAnimFAmt; - uint32_t mFlags; - byte *mAnimData[16]; - uint8_t mAnimDelay[16]; - uint8_t mAnimLen[16]; - int16_t mAnimWidth[16]; - int16_t mAnimWidth2[16]; -} MisFileDataStruct; +struct MisFileData { + const char *name; + uint8_t animName; + uint8_t animFAmt; + uint32_t flags; + std::array animData = {}; + std::array animDelay = {}; + std::array animLen = {}; + std::array animWidth = {}; + std::array animWidth2 = {}; + +private: + std::vector> pinnedMem; + +public: + MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags) + : name(name) + , animName(animName) + , animFAmt(animFAmt) + , flags(flags) + { + } + + MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + std::array animDelay, std::array animLen, + std::array animWidth, std::array animWidth2); + + MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + uint8_t animDelay, uint8_t animLen, + int16_t animWidth, int16_t animWidth2); + + MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + uint8_t animDelay, std::array animLen, + int16_t animWidth, int16_t animWidth2); + + MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + std::array animDelay, uint8_t animLen, + int16_t animWidth, int16_t animWidth2); + + MisFileData(const char *name, uint8_t animName, uint8_t animFAmt, uint32_t flags, + uint8_t animDelay, std::array animLen, + std::array animWidth, std::array animWidth2); + + void LoadGFX(); + + void FreeGFX() + { + animData = {}; + pinnedMem.clear(); + } +}; extern MissileDataStruct MissileData[]; -extern MisFileDataStruct MissileSpriteData[]; +extern MisFileData MissileSpriteData[]; } // namespace devilution diff --git a/Source/missiles.cpp b/Source/missiles.cpp index d6bc5f44d..497073906 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -488,7 +488,7 @@ void CheckMissileCol(int i, int mindam, int maxdam, bool shift, Point position, &blocked)) { if (gbIsHellfire && blocked) { int dir = Missiles[i]._mimfnum + (GenerateRnd(2) != 0 ? 1 : -1); - int mAnimFAmt = MissileSpriteData[Missiles[i]._miAnimType].mAnimFAmt; + int mAnimFAmt = MissileSpriteData[Missiles[i]._miAnimType].animFAmt; if (dir < 0) dir = mAnimFAmt - 1; else if (dir > mAnimFAmt) @@ -523,7 +523,7 @@ void CheckMissileCol(int i, int mindam, int maxdam, bool shift, Point position, &blocked)) { if (gbIsHellfire && blocked) { int dir = Missiles[i]._mimfnum + (GenerateRnd(2) != 0 ? 1 : -1); - int mAnimFAmt = MissileSpriteData[Missiles[i]._miAnimType].mAnimFAmt; + int mAnimFAmt = MissileSpriteData[Missiles[i]._miAnimType].animFAmt; if (dir < 0) dir = mAnimFAmt - 1; else if (dir > mAnimFAmt) @@ -572,7 +572,7 @@ void CheckMissileCol(int i, int mindam, int maxdam, bool shift, Point position, &blocked)) { if (gbIsHellfire && blocked) { int dir = Missiles[i]._mimfnum + (GenerateRnd(2) != 0 ? 1 : -1); - int mAnimFAmt = MissileSpriteData[Missiles[i]._miAnimType].mAnimFAmt; + int mAnimFAmt = MissileSpriteData[Missiles[i]._miAnimType].animFAmt; if (dir < 0) dir = mAnimFAmt - 1; else if (dir > mAnimFAmt) @@ -614,36 +614,16 @@ void SetMissAnim(int mi, int animtype) } Missiles[mi]._miAnimType = animtype; - Missiles[mi]._miAnimFlags = MissileSpriteData[animtype].mFlags; - Missiles[mi]._miAnimData = MissileSpriteData[animtype].mAnimData[dir]; - Missiles[mi]._miAnimDelay = MissileSpriteData[animtype].mAnimDelay[dir]; - Missiles[mi]._miAnimLen = MissileSpriteData[animtype].mAnimLen[dir]; - Missiles[mi]._miAnimWidth = MissileSpriteData[animtype].mAnimWidth[dir]; - Missiles[mi]._miAnimWidth2 = MissileSpriteData[animtype].mAnimWidth2[dir]; + Missiles[mi]._miAnimFlags = MissileSpriteData[animtype].flags; + Missiles[mi]._miAnimData = MissileSpriteData[animtype].animData[dir]; + Missiles[mi]._miAnimDelay = MissileSpriteData[animtype].animDelay[dir]; + Missiles[mi]._miAnimLen = MissileSpriteData[animtype].animLen[dir]; + Missiles[mi]._miAnimWidth = MissileSpriteData[animtype].animWidth[dir]; + Missiles[mi]._miAnimWidth2 = MissileSpriteData[animtype].animWidth2[dir]; Missiles[mi]._miAnimCnt = 0; Missiles[mi]._miAnimFrame = 1; } -void FreeMissileGFX(int mi) -{ - if ((MissileSpriteData[mi].mFlags & MFLAG_ALLOW_SPECIAL) != 0) { - if (MissileSpriteData[mi].mAnimData[0] != nullptr) { - auto *p = (DWORD *)MissileSpriteData[mi].mAnimData[0]; - p -= MissileSpriteData[mi].mAnimFAmt; - delete[] p; - MissileSpriteData[mi].mAnimData[0] = nullptr; - } - return; - } - - for (int i = 0; i < MissileSpriteData[mi].mAnimFAmt; i++) { - if (MissileSpriteData[mi].mAnimData[i] != nullptr) { - delete[] MissileSpriteData[mi].mAnimData[i]; - MissileSpriteData[mi].mAnimData[i] = nullptr; - } - } -} - bool MissilesFoundTarget(int mi, Point *position, int rad) { rad = std::min(rad, 19); @@ -1229,50 +1209,32 @@ void SetMissDir(int mi, int dir) void LoadMissileGFX(BYTE mi) { - MisFileData *mfd = &MissileSpriteData[mi]; - if (mfd->mAnimData[0] != nullptr) - return; - - char pszName[256]; - if ((mfd->mFlags & MFLAG_ALLOW_SPECIAL) != 0) { - sprintf(pszName, "Missiles\\%s.CL2", mfd->mName); - byte *file = LoadFileInMem(pszName).release(); - for (int i = 0; i < mfd->mAnimFAmt; i++) - mfd->mAnimData[i] = CelGetFrame(file, i); - } else if (mfd->mAnimFAmt == 1) { - sprintf(pszName, "Missiles\\%s.CL2", mfd->mName); - mfd->mAnimData[0] = LoadFileInMem(pszName).release(); - } else { - for (unsigned i = 0; i < mfd->mAnimFAmt; i++) { - sprintf(pszName, "Missiles\\%s%u.CL2", mfd->mName, i + 1); - mfd->mAnimData[i] = LoadFileInMem(pszName).release(); - } - } + MissileSpriteData[mi].LoadGFX(); } void InitMissileGFX() { - for (int mi = 0; MissileSpriteData[mi].mAnimFAmt != 0; mi++) { + for (int mi = 0; MissileSpriteData[mi].animFAmt != 0; mi++) { if (!gbIsHellfire && mi > MFILE_SCBSEXPD) break; - if ((MissileSpriteData[mi].mFlags & MFLAG_HIDDEN) == 0) + if ((MissileSpriteData[mi].flags & MFLAG_HIDDEN) == 0) LoadMissileGFX(mi); } } void FreeMissiles() { - for (int mi = 0; MissileSpriteData[mi].mAnimFAmt != 0; mi++) { - if ((MissileSpriteData[mi].mFlags & MFLAG_HIDDEN) == 0) - FreeMissileGFX(mi); + for (int mi = 0; MissileSpriteData[mi].animFAmt != 0; mi++) { + if ((MissileSpriteData[mi].flags & MFLAG_HIDDEN) == 0) + MissileSpriteData[mi].FreeGFX(); } } void FreeMissiles2() { - for (int mi = 0; MissileSpriteData[mi].mAnimFAmt != 0; mi++) { - if ((MissileSpriteData[mi].mFlags & MFLAG_HIDDEN) != 0) - FreeMissileGFX(mi); + for (int mi = 0; MissileSpriteData[mi].animFAmt != 0; mi++) { + if ((MissileSpriteData[mi].flags & MFLAG_HIDDEN) != 0) + MissileSpriteData[mi].FreeGFX(); } } @@ -2500,7 +2462,7 @@ void AddFlare(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i SetMissAnim(mi, MFILE_SCUBMISC); } - if (MissileSpriteData[Missiles[mi]._miAnimType].mAnimFAmt == 16) { + if (MissileSpriteData[Missiles[mi]._miAnimType].animFAmt == 16) { SetMissDir(mi, GetDirection16(src, dst)); } } @@ -2986,7 +2948,7 @@ void AddResurrectBeam(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /* Missiles[mi].position.tile = dst; Missiles[mi].position.start = Missiles[mi].position.tile; Missiles[mi].position.velocity = { 0, 0 }; - Missiles[mi]._mirange = MissileSpriteData[MFILE_RESSUR1].mAnimLen[0]; + Missiles[mi]._mirange = MissileSpriteData[MFILE_RESSUR1].animLen[0]; } void AddTelekinesis(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/) @@ -3078,7 +3040,7 @@ int AddMissile(Point src, Point dst, int midir, int mitype, int8_t micaster, int Missiles[mi]._mispllvl = spllvl; Missiles[mi]._mimfnum = midir; - if (Missiles[mi]._miAnimType == MFILE_NONE || MissileSpriteData[Missiles[mi]._miAnimType].mAnimFAmt < 8) + if (Missiles[mi]._miAnimType == MFILE_NONE || MissileSpriteData[Missiles[mi]._miAnimType].animFAmt < 8) SetMissDir(mi, 0); else SetMissDir(mi, midir); @@ -4805,7 +4767,7 @@ void missiles_process_charge() int mi = ActiveMissiles[i]; MissileStruct *mis = &Missiles[mi]; - mis->_miAnimData = MissileSpriteData[mis->_miAnimType].mAnimData[mis->_mimfnum]; + mis->_miAnimData = MissileSpriteData[mis->_miAnimType].animData[mis->_mimfnum]; if (mis->_mitype != MIS_RHINO) continue; diff --git a/Source/scrollrt.cpp b/Source/scrollrt.cpp index 1e5c035c6..c27951b93 100644 --- a/Source/scrollrt.cpp +++ b/Source/scrollrt.cpp @@ -417,10 +417,10 @@ void DrawMonster(const Surface &out, int x, int y, int mx, int my, const Monster */ void DrawPlayerIconHelper(const Surface &out, int pnum, missile_graphic_id missileGraphicId, int x, int y, bool lighting) { - x += CalculateWidth2(Players[pnum].AnimInfo.pCelSprite->Width()) - MissileSpriteData[missileGraphicId].mAnimWidth2[0]; + x += CalculateWidth2(Players[pnum].AnimInfo.pCelSprite->Width()) - MissileSpriteData[missileGraphicId].animWidth2[0]; - int width = MissileSpriteData[missileGraphicId].mAnimWidth[0]; - byte *pCelBuff = MissileSpriteData[missileGraphicId].mAnimData[0]; + int width = MissileSpriteData[missileGraphicId].animWidth[0]; + byte *pCelBuff = MissileSpriteData[missileGraphicId].animData[0]; CelSprite cel { pCelBuff, width };