Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 21-installer-nodd
  • 2210-pre1
  • 2210-pre2
  • 2210-rc1
  • 2210-rc2
  • 2210-rc3
  • 2211-pre1
  • 2211-pre2
  • 622-teamlives-hud
  • 64-gl-log
  • COM_ImmedExecute-lua
  • DJGPP
  • accel-momentum
  • add-arg-passing-alias
  • add-forth-interpreter
  • add-ipv6-indicator
  • add-namechange-lua-hook
  • add-server-pm-logging
  • add-textinput-hook
  • add-unblockable-console-key
  • alien-breed-3d
  • allow-non-important-files-dedicated
  • allow-percent-ipv6-address
  • appveyor
  • avoid-double-checkmobjtrigger-call
  • avoid-frame-cap-busywait
  • bbox
  • bbox-tweaks
  • blend-locking
  • blentran
  • blua-unary-not-fix
  • boost-tickrate
  • botchanges
  • bustablemobjzfix
  • bustablesoundz
  • checksector-refactor
  • cleanup-opengl
  • cleanupmusic
  • close-connection-timeout
  • cmake-clang-tidy
  • cmake-enable-cxx
  • cmake-valgrind
  • compile-ffast-math
  • crawlacommander-sprites
  • cutscene-cleanup
  • dd-music-bypass
  • dd-music-fix
  • deprecate-lua-dedicated-server
  • doomcom-global-refactor
  • dpl-2
  • dropshadows-spawning
  • emblem-drawing
  • ensure-ackpak-response
  • exchndl-xp-fix
  • few-kart-lua-changes
  • ffloorclip
  • fix-acknum-not-incrementing
  • fix-bot-2pai-desync
  • fix-compiler-error-touch
  • fix-cvar-conflicts
  • fix-dedicated-segfault
  • fix-move-mobj-reference
  • fix-netxcmd-integer-overflow
  • fix-opengl-shear-roll
  • fix-removemobj-seesound
  • fix-silver-segfault
  • fix-tty-not-resetting-properly
  • fix-unack-lockup
  • flipfuncpointers
  • floorsprite-and-shadow-fake-planes-fix
  • fof-lightlist-fixes
  • font-FUCK
  • font_drawer
  • forceverticalflipflag
  • forkmaster
  • frictionrefactor
  • fuck-macros-1
  • fullscreen-toggle
  • gamepad-luakeydown
  • gamepad-morefixes
  • gamepad_experiments
  • ghost-networking
  • gif-splitting
  • gitlab-ci
  • grr-lj
  • hitboxviewer
  • hwr-texture-cache-refactor
  • hwrender2
  • improve-439
  • increase-packet-tics
  • increase-unlockables
  • inline-mobjwasremoved
  • input-display
  • input-display-translucency
  • io
  • io-limit
  • ipv6
  • joystick-juggling-maz
  • keycodes-only
  • ksf-wadfiles
  • SRB2_release_2.1
  • SRB2_release_2.1.1
  • SRB2_release_2.1.10
  • SRB2_release_2.1.11
  • SRB2_release_2.1.12
  • SRB2_release_2.1.14
  • SRB2_release_2.1.15
  • SRB2_release_2.1.16
  • SRB2_release_2.1.16a
  • SRB2_release_2.1.17
  • SRB2_release_2.1.18
  • SRB2_release_2.1.19
  • SRB2_release_2.1.2
  • SRB2_release_2.1.20
  • SRB2_release_2.1.21
  • SRB2_release_2.1.22
  • SRB2_release_2.1.23
  • SRB2_release_2.1.24
  • SRB2_release_2.1.25
  • SRB2_release_2.1.3
  • SRB2_release_2.1.4
  • SRB2_release_2.1.5
  • SRB2_release_2.1.6
  • SRB2_release_2.1.7
  • SRB2_release_2.1.8
  • SRB2_release_2.1.9
  • SRB2_release_2.2.0
  • SRB2_release_2.2.1
  • SRB2_release_2.2.10
  • SRB2_release_2.2.2
  • SRB2_release_2.2.3
  • SRB2_release_2.2.4
  • SRB2_release_2.2.5
  • SRB2_release_2.2.6
  • SRB2_release_2.2.7
  • SRB2_release_2.2.8
  • SRB2_release_2.2.9
  • td-release-v1.0.0
138 results

Target

Select target project
  • STJr/SRB2
  • Sryder/SRB2
  • wolfy852/SRB2
  • Alpha2244/SRB2
  • Inuyasha/SRB2
  • yoshibot/SRB2
  • TehRealSalt/SRB2
  • PrisimaTF/SRB2
  • Hatninja/SRB2
  • SteelT/SRB2
  • james/SRB2
  • ShaderWraith/SRB2
  • SinnamonLat/SRB2
  • mazmazz_/SRB2
  • filpAM/SRB2
  • chaoloveicemdboy/SRB2
  • Whooa21/SRB2
  • Machturne/SRB2
  • Golden/SRB2
  • Tatsuru/SRB2
  • Snu/SRB2
  • Zwip-Zwap_Zapony/SRB2
  • fickleheart/SRB2
  • alphaRexJames/SRB2
  • JJK/SRB2
  • diskpoppy/SRB2
  • Hannu_Hanhi/SRB2
  • ZipperQR/SRB2
  • kays/SRB2
  • spherallic/SRB2
  • Zippy_Zolton/SRB2
  • namiishere/SRB2
  • Ors/SRB2
  • SMS_Alfredo/SRB2
  • sonic_edge/SRB2
  • lavla/SRB2
  • ashi/SRB2
  • X.organic/SRB2
  • Fafabis/SRB2
  • Meziu/SRB2
  • v-rob/SRB2
  • tertu/SRB2
  • bitten2up/SRB2
  • flarn2006/SRB2
  • Krabs/SRB2
  • clairebun/SRB2
  • Lactozilla/SRB2
  • thehackstack/SRB2
  • Spice/SRB2
  • win8linux/SRB2
  • JohnFrostFox/SRB2
  • talktoneon726/SRB2
  • Wane/SRB2
  • Lamibe/SRB2
  • spectrumuk2/srb-2
  • nerdyminer18/srb-2
  • 256nil/SRB2
  • ARJr/SRB2
  • Alam/SRB2
  • Zenya/srb-2-marathon-demos
  • Acelite/srb-2-archivedmodifications
  • MIDIMan/SRB2
  • Lach/SRB2
  • Frostiikin/bounce-tweaks
  • Jaden/SRB2
  • Tyron/SRB2
  • Astronight/SRB2
  • Mari0shi06/SRB2
  • aiire/SRB2
  • Galactice/SRB2
  • srb2-ports/srb2-dreamcast
  • sdasdas/SRB2
  • chreas/srb-2-vr
  • StarManiaKG/the-story-of-sinically-rocketing-and-botching-the-2nd
  • LoganAir/SRB2
  • NepDisk/srb-2
  • alufolie91/SRB2
  • Felicia.iso/SRB2
  • twi/SRB2
  • BarrelsOFun/SRB2
  • Speed2411/SRB2
  • Leather_Realms/SRB2
  • Ayemar/SRB2
  • Acelite/SRB2
  • VladDoc/SRB2
  • kaldrum/model-features
  • strawberryfox417/SRB2
  • Lugent/SRB2
  • Rem/SRB2
  • Refrag/SRB2
  • Henry_3230/srb-3230
  • TehPuertoRicanSpartan2/tprs-srb2
  • Leminn/srb-2-marathon-stuff
  • chromaticpipe2/SRB2
  • MiguelGustavo15/SRB2
  • Maru/srb-2-tests
  • SilicDev/SRB2
  • UnmatchedBracket/SRB2
  • HybridDog/SRB2
  • xordspar0/SRB2
  • jsjhbewfhh/SRB2
  • Fancy2209/SRB2
  • Lorsoen/SRB2
  • shindoukin/SRB2
  • GamerOfDays/SRB2
  • Craftyawesome/SRB2
  • tenshi-tensai-tennoji/SRB2
  • Scarfdudebalder/SRB2
  • luigi-budd/srb-2-fix-interplag-lockon
  • mskluesner/SRB2
  • johnpetersa19/SRB2
  • Pheazant/SRB2
  • chromaticpipe2/srb2classic
  • romoney5/SRB2
  • PAS/SRB2Classic
  • BlueStaggo/SRB2
  • Jisk/srb-2-beef-jerky
117 results
Select Git revision
  • 21-installer-nodd
  • 2210-pre1
  • 2210-pre2
  • 2210-rc1
  • 2210-rc2
  • 2210-rc3
  • 2211-pre1
  • 2211-pre2
  • 2211-rc1
  • 2212-pre1
  • 2212-pre2
  • 2212-pre3
  • 2212-rc1
  • 2213
  • 2214-pre1
  • 2214-pre2
  • 2214-pre3
  • 2214-pre4
  • 2_2_12
  • 64-gl-log
  • COM_ImmedExecute-lua
  • DJGPP
  • accel-momentum
  • acs
  • action-args
  • alpha-fixes
  • any-resolution
  • appveyor
  • blend-locking
  • blentran
  • blua-unary-not-fix
  • boost-tickrate
  • bustablesoundz
  • cleanup-opengl
  • cleanupmusic
  • clipmidtex
  • cmake-valgrind
  • crawlacommander-sprites
  • custom-map-names
  • custom-teams
  • cutscene-cleanup
  • dd-music-bypass
  • dd-music-fix
  • delfile2
  • deprecate-lua-dedicated-server
  • dpl-2
  • dropshadows-spawning
  • dynabsp
  • emblem-drawing
  • exchndl-xp-fix
  • extra-textures
  • few-kart-lua-changes
  • ffloorclip
  • fix-167
  • fix-cvar-conflicts
  • fix-opengl-parameter-crash
  • fix-opengl-shear-roll
  • flipfuncpointers
  • fof-lightlist-fixes
  • font-FUCK
  • frictionrefactor
  • fuck-macros-1
  • gamepad-luakeydown
  • gamepad-morefixes
  • gamepad_experiments
  • gametype-refactor
  • gametype-refactor-1
  • gametype-refactor-player-spawns
  • ghost-networking
  • gif-splitting
  • grr-lj
  • hitboxviewer
  • hwr-texture-cache-refactor
  • hwrender2
  • improve-439
  • increase-maxconditionsets
  • increase-packet-tics
  • input-display
  • input-display-translucency
  • io
  • joystick-juggling-maz
  • just-in-case
  • keycodes-only
  • ksf-wadfiles
  • ld413-mp-fix
  • levelstruct
  • libpng-version-support
  • linedef-actions
  • lj-test
  • lol-states
  • loopedsounds
  • lower-unpegged-fix
  • lua-change-gametype
  • lua-command-netids
  • lua-gfx-2
  • lua-gfx-sprites
  • lua-local
  • makefile-auto-mingw-gcc
  • makefile-tinkering
  • map-components-signedness-fixes
  • SRB2_release_2.1
  • SRB2_release_2.1.1
  • SRB2_release_2.1.10
  • SRB2_release_2.1.11
  • SRB2_release_2.1.12
  • SRB2_release_2.1.14
  • SRB2_release_2.1.15
  • SRB2_release_2.1.16
  • SRB2_release_2.1.16a
  • SRB2_release_2.1.17
  • SRB2_release_2.1.18
  • SRB2_release_2.1.19
  • SRB2_release_2.1.2
  • SRB2_release_2.1.20
  • SRB2_release_2.1.21
  • SRB2_release_2.1.22
  • SRB2_release_2.1.23
  • SRB2_release_2.1.24
  • SRB2_release_2.1.25
  • SRB2_release_2.1.3
  • SRB2_release_2.1.4
  • SRB2_release_2.1.5
  • SRB2_release_2.1.6
  • SRB2_release_2.1.7
  • SRB2_release_2.1.8
  • SRB2_release_2.1.9
  • SRB2_release_2.2.0
  • SRB2_release_2.2.1
  • SRB2_release_2.2.10
  • SRB2_release_2.2.11
  • SRB2_release_2.2.12
  • SRB2_release_2.2.13
  • SRB2_release_2.2.15
  • SRB2_release_2.2.2
  • SRB2_release_2.2.3
  • SRB2_release_2.2.4
  • SRB2_release_2.2.5
  • SRB2_release_2.2.6
  • SRB2_release_2.2.7
  • SRB2_release_2.2.8
  • SRB2_release_2.2.9
  • td-release-v1.0.0
142 results
Show changes
Commits on Source (178)
version: 2.2.14.{branch}-{build} version: 2.2.16.{branch}-{build}
os: MinGW os: MinGW
environment: environment:
......
...@@ -21,6 +21,7 @@ add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32 ...@@ -21,6 +21,7 @@ add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32
console.c console.c
hu_stuff.c hu_stuff.c
i_time.c i_time.c
i_threads.c
y_inter.c y_inter.c
st_stuff.c st_stuff.c
m_aatree.c m_aatree.c
......
...@@ -13,11 +13,6 @@ ifdef MINGW ...@@ -13,11 +13,6 @@ ifdef MINGW
libs+=-mconsole libs+=-mconsole
endif endif
ifndef NOTHREADS
opts+=-DHAVE_THREADS
sources+=dedicated/i_threads.c
endif
NOOPENMPT=1 NOOPENMPT=1
NOGME=1 NOGME=1
NOHW=1 NOHW=1
......
...@@ -18,6 +18,11 @@ opts+=-DHWRENDER ...@@ -18,6 +18,11 @@ opts+=-DHWRENDER
sources+=$(call List,hardware/Sourcefile) sources+=$(call List,hardware/Sourcefile)
endif endif
ifndef NOTHREADS
opts+=-DHAVE_THREADS
sources+=i_threads.c
endif
ifndef NOMD5 ifndef NOMD5
sources+=md5.c sources+=md5.c
endif endif
......
...@@ -43,11 +43,6 @@ sources+=sdl/mixer_sound.c ...@@ -43,11 +43,6 @@ sources+=sdl/mixer_sound.c
endif endif
endif endif
ifndef NOTHREADS
opts+=-DHAVE_THREADS
sources+=sdl/i_threads.c
endif
ifdef SDL_PKGCONFIG ifdef SDL_PKGCONFIG
$(eval $(call Use_pkg_config,SDL)) $(eval $(call Use_pkg_config,SDL))
else else
......
...@@ -85,7 +85,7 @@ endif ...@@ -85,7 +85,7 @@ endif
#WFLAGS+=-Wunreachable-code #WFLAGS+=-Wunreachable-code
WFLAGS+=-Winline WFLAGS+=-Winline
ifdef DEBUGMODE ifdef DEBUGMODE
WFLAGS+=-Wno-error=inline WFLAGS+=-Wno-inline
endif endif
ifdef GCC43 ifdef GCC43
WFLAGS+=-funit-at-a-time WFLAGS+=-funit-at-a-time
...@@ -152,12 +152,8 @@ else ...@@ -152,12 +152,8 @@ else
endif endif
ifdef DEBUGMODE ifdef DEBUGMODE
ifdef GCC48
opts+=-Og
else
opts+=-O0 opts+=-O0
endif endif
endif
ifdef VALGRIND ifdef VALGRIND
ifdef GCC46 ifdef GCC46
......
...@@ -27,23 +27,8 @@ void I_SetPalette(RGBA_t *palette) ...@@ -27,23 +27,8 @@ void I_SetPalette(RGBA_t *palette)
(void)palette; (void)palette;
} }
INT32 VID_NumModes(void)
{
return 1;
}
INT32 VID_GetModeForSize(INT32 w, INT32 h)
{
(void)w;
(void)h;
return 0;
}
void VID_PrepareModeList(void){}
INT32 VID_SetMode(INT32 modenum) INT32 VID_SetMode(INT32 modenum)
{ {
vid.modenum = 0;
vid.width = 320; vid.width = 320;
vid.height = 240; vid.height = 240;
vid.bpp = 1; vid.bpp = 1;
...@@ -61,11 +46,6 @@ void VID_CheckGLLoaded(rendermode_t oldrender) ...@@ -61,11 +46,6 @@ void VID_CheckGLLoaded(rendermode_t oldrender)
(void)oldrender; (void)oldrender;
} }
const char *VID_GetModeName(INT32 modenum)
{
return "A320x240";
}
void I_UpdateNoBlit(void){} void I_UpdateNoBlit(void){}
void I_FinishUpdate(void) { void I_FinishUpdate(void) {
......
...@@ -625,7 +625,7 @@ void B_HandleFlightIndicator(player_t *player) ...@@ -625,7 +625,7 @@ void B_HandleFlightIndicator(player_t *player)
} }
// if the mobj isn't a flight indicator, let's not mess with it // if the mobj isn't a flight indicator, let's not mess with it
if (tails->hnext->type != MT_OVERLAY || (tails->hnext->state != states+S_FLIGHTINDICATOR)) if (tails->hnext->type != MT_OVERLAY || (tails->hnext->state->num != S_FLIGHTINDICATOR))
return; return;
// if it shouldn't exist, remove it // if it shouldn't exist, remove it
......
...@@ -85,7 +85,7 @@ CV_PossibleValue_t CV_TrueFalse[] = {{0, "False"}, {1, "True"}, {0, NULL}}; ...@@ -85,7 +85,7 @@ CV_PossibleValue_t CV_TrueFalse[] = {{0, "False"}, {1, "True"}, {0, NULL}};
// First implementation is 26 (2.1.21), so earlier configs default at 25 (2.1.20) // First implementation is 26 (2.1.21), so earlier configs default at 25 (2.1.20)
// Also set CV_HIDEN during runtime, after config is loaded // Also set CV_HIDEN during runtime, after config is loaded
static boolean execversion_enabled = false; static boolean execversion_enabled = false;
consvar_t cv_execversion = CVAR_INIT ("execversion","25",CV_CALL,CV_Unsigned, CV_EnforceExecVersion); consvar_t cv_execversion = CVAR_INIT ("execversion", "25", NULL, CV_CALL, CV_Unsigned, CV_EnforceExecVersion);
// for default joyaxis detection // for default joyaxis detection
static boolean joyaxis_default = false; static boolean joyaxis_default = false;
...@@ -315,6 +315,7 @@ void COM_ImmedExecute(const char *ptext) ...@@ -315,6 +315,7 @@ void COM_ImmedExecute(const char *ptext)
typedef struct xcommand_s typedef struct xcommand_s
{ {
const char *name; const char *name;
const char *desc;
struct xcommand_s *next; struct xcommand_s *next;
com_func_t function; com_func_t function;
com_flags_t flags; com_flags_t flags;
...@@ -338,17 +339,17 @@ void COM_Init(void) ...@@ -338,17 +339,17 @@ void COM_Init(void)
VS_Alloc(&com_text, COM_BUF_SIZE); VS_Alloc(&com_text, COM_BUF_SIZE);
// add standard commands // add standard commands
COM_AddCommand("alias", COM_Alias_f, 0); COM_AddCommand("alias", "Create or list commands that expand to other commands", COM_Alias_f, 0);
COM_AddCommand("echo", COM_Echo_f, COM_LUA); COM_AddCommand("echo", "Print the specified text, useful for scripts", COM_Echo_f, COM_LUA);
COM_AddCommand("cecho", COM_CEcho_f, COM_LUA); COM_AddCommand("cecho", "Display text on-screen", COM_CEcho_f, COM_LUA);
COM_AddCommand("cechoflags", COM_CEchoFlags_f, COM_LUA); COM_AddCommand("cechoflags", NULL, COM_CEchoFlags_f, COM_LUA);
COM_AddCommand("cechoduration", COM_CEchoDuration_f, COM_LUA); COM_AddCommand("cechoduration", NULL, COM_CEchoDuration_f, COM_LUA);
COM_AddCommand("exec", COM_Exec_f, 0); COM_AddCommand("exec", "Run a script", COM_Exec_f, 0);
COM_AddCommand("wait", COM_Wait_f, 0); COM_AddCommand("wait", NULL, COM_Wait_f, 0);
COM_AddCommand("help", COM_Help_f, COM_LUA); COM_AddCommand("help", "Show information about a variable or command", COM_Help_f, COM_LUA);
COM_AddCommand("find", COM_Find_f, COM_LUA); COM_AddCommand("find", "Search commands and variables", COM_Find_f, COM_LUA);
COM_AddCommand("toggle", COM_Toggle_f, COM_LUA); COM_AddCommand("toggle", "Toggle a variable on or off", COM_Toggle_f, COM_LUA);
COM_AddCommand("add", COM_Add_f, COM_LUA); COM_AddCommand("add", NULL, COM_Add_f, COM_LUA);
RegisterNetXCmd(XD_NETVAR, Got_NetVar); RegisterNetXCmd(XD_NETVAR, Got_NetVar);
} }
...@@ -487,7 +488,7 @@ static void COM_TokenizeString(char *ptext) ...@@ -487,7 +488,7 @@ static void COM_TokenizeString(char *ptext)
* \param name Name of the command. * \param name Name of the command.
* \param func Function called when the command is run. * \param func Function called when the command is run.
*/ */
void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags) void COM_AddCommand(const char *name, const char *desc, com_func_t func, com_flags_t flags)
{ {
xcommand_t *cmd; xcommand_t *cmd;
...@@ -516,6 +517,7 @@ void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags) ...@@ -516,6 +517,7 @@ void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags)
cmd = ZZ_Alloc(sizeof *cmd); cmd = ZZ_Alloc(sizeof *cmd);
cmd->name = name; cmd->name = name;
cmd->desc = desc;
cmd->function = func; cmd->function = func;
cmd->flags = flags; cmd->flags = flags;
cmd->next = com_commands; cmd->next = com_commands;
...@@ -527,7 +529,7 @@ void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags) ...@@ -527,7 +529,7 @@ void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags)
* *
* \param name Name of the command. * \param name Name of the command.
*/ */
int COM_AddLuaCommand(const char *name) int COM_AddLuaCommand(const char *name, const char *desc)
{ {
xcommand_t *cmd; xcommand_t *cmd;
...@@ -549,6 +551,7 @@ int COM_AddLuaCommand(const char *name) ...@@ -549,6 +551,7 @@ int COM_AddLuaCommand(const char *name)
// Add a new command. // Add a new command.
cmd = ZZ_Alloc(sizeof *cmd); cmd = ZZ_Alloc(sizeof *cmd);
cmd->name = name; cmd->name = name;
cmd->desc = desc;
cmd->function = COM_Lua_f; cmd->function = COM_Lua_f;
cmd->flags = COM_LUA; cmd->flags = COM_LUA;
cmd->next = com_commands; cmd->next = com_commands;
...@@ -892,7 +895,12 @@ static void COM_Help_f(void) ...@@ -892,7 +895,12 @@ static void COM_Help_f(void)
{ {
boolean floatmode = false; boolean floatmode = false;
const char *cvalue = NULL; const char *cvalue = NULL;
CONS_Printf("\x82""Variable %s:\n", cvar->name); CONS_Printf("\x82""Variable %s: \x80", cvar->name);
if (cvar->desc != NULL)
CONS_Printf("%s\n", cvar->desc);
else
CONS_Printf("No description provided\n");
CONS_Printf(M_GetText(" flags: ")); CONS_Printf(M_GetText(" flags: "));
if (cvar->flags & CV_SAVE) if (cvar->flags & CV_SAVE)
CONS_Printf("AUTOSAVE "); CONS_Printf("AUTOSAVE ");
...@@ -984,14 +992,15 @@ static void COM_Help_f(void) ...@@ -984,14 +992,15 @@ static void COM_Help_f(void)
if (strcmp(cmd->name, help)) if (strcmp(cmd->name, help))
continue; continue;
CONS_Printf("\x82""Command %s:\n", cmd->name); CONS_Printf("\x82""Command %s: \x80", cmd->name);
CONS_Printf(" help is not available for commands"); if (cmd->desc != NULL)
CONS_Printf("\x82""\nCheck wiki.srb2.org for more or try typing <name> without arguments\n"); CONS_Printf("%s\n", cmd->desc);
else
CONS_Printf("No description provided\n");
return; return;
} }
CONS_Printf("No variable or command named %s", help); CONS_Printf("No variable or command named %s\n", help);
CONS_Printf("\x82""\nCheck wiki.srb2.org for more or try typing help without arguments\n");
} }
return; return;
} }
...@@ -1014,8 +1023,7 @@ static void COM_Help_f(void) ...@@ -1014,8 +1023,7 @@ static void COM_Help_f(void)
CONS_Printf("%s ",cmd->name); CONS_Printf("%s ",cmd->name);
i++; i++;
} }
CONS_Printf("\n");
CONS_Printf("\x82""\nCheck wiki.srb2.org for more or type help <command or variable>\n");
CONS_Debug(DBG_GAMELOGIC, "\x82Total : %d\n", i); CONS_Debug(DBG_GAMELOGIC, "\x82Total : %d\n", i);
} }
...@@ -2482,22 +2490,6 @@ static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr) ...@@ -2482,22 +2490,6 @@ static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr)
if (!CV_FilterJoyAxisVars(v, valstr)) if (!CV_FilterJoyAxisVars(v, valstr))
return false; return false;
} }
if (GETMAJOREXECVERSION(cv_execversion.value) < 57) // 57 = 2.2.16
{
if (
(!stricmp(v->name, "movebob") && atoi(valstr) == FRACUNIT) ||
(!stricmp(v->name, "playersforexit") && atoi(valstr) == 4) || // 4 = all
(!stricmp(v->name, "advancemap") && atoi(valstr) == 1) || // 1 = next
(!stricmp(v->name, "cam_speed") && !stricmp(valstr, "0.3")) ||
(!stricmp(v->name, "cam2_speed") && !stricmp(valstr, "0.3")) ||
(!stricmp(v->name, "timerres") && atoi(valstr) == 0) || // 0 = classic
(!stricmp(v->name, "gr_modelinterpolation")) || // Force reset
(!stricmp(v->name, "fov") && atoi(valstr) == 90)
)
return false;
}
return true; return true;
} }
......
...@@ -37,8 +37,8 @@ typedef enum ...@@ -37,8 +37,8 @@ typedef enum
typedef void (*com_func_t)(void); typedef void (*com_func_t)(void);
void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags); void COM_AddCommand(const char *name, const char *desc, com_func_t func, com_flags_t flags);
int COM_AddLuaCommand(const char *name); int COM_AddLuaCommand(const char *name, const char *desc);
size_t COM_Argc(void); size_t COM_Argc(void);
const char *COM_Argv(size_t arg); // if argv > argc, returns empty string const char *COM_Argv(size_t arg); // if argv > argc, returns empty string
...@@ -137,6 +137,7 @@ typedef struct consvar_s //NULL, NULL, 0, NULL, NULL |, 0, NULL, NULL, 0, 0, NUL ...@@ -137,6 +137,7 @@ typedef struct consvar_s //NULL, NULL, 0, NULL, NULL |, 0, NULL, NULL, 0, 0, NUL
{ {
const char *name; const char *name;
const char *defaultvalue; const char *defaultvalue;
const char *desc;
INT32 flags; // flags see cvflags_t above INT32 flags; // flags see cvflags_t above
CV_PossibleValue_t *PossibleValue; // table of possible values CV_PossibleValue_t *PossibleValue; // table of possible values
void (*func)(void); // called on change, if CV_CALL set void (*func)(void); // called on change, if CV_CALL set
...@@ -161,7 +162,7 @@ typedef struct consvar_s //NULL, NULL, 0, NULL, NULL |, 0, NULL, NULL, 0, 0, NUL ...@@ -161,7 +162,7 @@ typedef struct consvar_s //NULL, NULL, 0, NULL, NULL |, 0, NULL, NULL, 0, 0, NUL
struct consvar_s *next; struct consvar_s *next;
} consvar_t; } consvar_t;
/* name, defaultvalue, flags, PossibleValue, func */ /* name, defaultvalue, desc, flags, PossibleValue, func */
#define CVAR_INIT( ... ) \ #define CVAR_INIT( ... ) \
{ __VA_ARGS__, NULL, 0, NULL, NULL, {0, {NULL}}, 0U, (char)0, NULL } { __VA_ARGS__, NULL, 0, NULL, NULL, {0, {NULL}}, 0U, (char)0, NULL }
......
...@@ -123,23 +123,23 @@ static char con_buffer[CON_BUFFERSIZE]; ...@@ -123,23 +123,23 @@ static char con_buffer[CON_BUFFERSIZE];
// how many seconds the hud messages lasts on the screen // how many seconds the hud messages lasts on the screen
// CV_Unsigned can overflow when multiplied by TICRATE later, so let's use a 3-year limit instead // CV_Unsigned can overflow when multiplied by TICRATE later, so let's use a 3-year limit instead
static CV_PossibleValue_t hudtime_cons_t[] = {{0, "MIN"}, {99999999, "MAX"}, {0, NULL}}; static CV_PossibleValue_t hudtime_cons_t[] = {{0, "MIN"}, {99999999, "MAX"}, {0, NULL}};
static consvar_t cons_hudtime = CVAR_INIT ("con_hudtime", "5", CV_SAVE, hudtime_cons_t, NULL); static consvar_t cons_hudtime = CVAR_INIT ("con_hudtime", "5", NULL, CV_SAVE, hudtime_cons_t, NULL);
// number of lines displayed on the HUD // number of lines displayed on the HUD
static CV_PossibleValue_t hudlines_cons_t[] = {{0, "MIN"}, {MAXHUDLINES, "MAX"}, {0, NULL}}; static CV_PossibleValue_t hudlines_cons_t[] = {{0, "MIN"}, {MAXHUDLINES, "MAX"}, {0, NULL}};
static consvar_t cons_hudlines = CVAR_INIT ("con_hudlines", "5", CV_CALL|CV_SAVE, hudlines_cons_t, CONS_hudlines_Change); static consvar_t cons_hudlines = CVAR_INIT ("con_hudlines", "5", NULL, CV_CALL|CV_SAVE, hudlines_cons_t, CONS_hudlines_Change);
// number of lines console move per frame // number of lines console move per frame
// (con_speed needs a limit, apparently) // (con_speed needs a limit, apparently)
static CV_PossibleValue_t speed_cons_t[] = {{0, "MIN"}, {64, "MAX"}, {0, NULL}}; static CV_PossibleValue_t speed_cons_t[] = {{0, "MIN"}, {64, "MAX"}, {0, NULL}};
static consvar_t cons_speed = CVAR_INIT ("con_speed", "8", CV_SAVE, speed_cons_t, NULL); static consvar_t cons_speed = CVAR_INIT ("con_speed", "8", NULL, CV_SAVE, speed_cons_t, NULL);
// percentage of screen height to use for console // percentage of screen height to use for console
static consvar_t cons_height = CVAR_INIT ("con_height", "50", CV_CALL|CV_SAVE, CV_Unsigned, CONS_height_Change); static consvar_t cons_height = CVAR_INIT ("con_height", "50", NULL, CV_CALL|CV_SAVE, CV_Unsigned, CONS_height_Change);
static CV_PossibleValue_t backpic_cons_t[] = {{0, "translucent"}, {1, "picture"}, {0, NULL}}; static CV_PossibleValue_t backpic_cons_t[] = {{0, "translucent"}, {1, "picture"}, {0, NULL}};
// whether to use console background picture, or translucent mode // whether to use console background picture, or translucent mode
static consvar_t cons_backpic = CVAR_INIT ("con_backpic", "translucent", CV_SAVE, backpic_cons_t, NULL); static consvar_t cons_backpic = CVAR_INIT ("con_backpic", "translucent", NULL, CV_SAVE, backpic_cons_t, NULL);
static CV_PossibleValue_t backcolor_cons_t[] = {{0, "White"}, {1, "Black"}, {2, "Sepia"}, static CV_PossibleValue_t backcolor_cons_t[] = {{0, "White"}, {1, "Black"}, {2, "Sepia"},
{3, "Brown"}, {4, "Pink"}, {5, "Raspberry"}, {3, "Brown"}, {4, "Pink"}, {5, "Raspberry"},
...@@ -151,7 +151,7 @@ static CV_PossibleValue_t backcolor_cons_t[] = {{0, "White"}, {1, "Black"}, { ...@@ -151,7 +151,7 @@ static CV_PossibleValue_t backcolor_cons_t[] = {{0, "White"}, {1, "Black"}, {
{0, NULL}}; {0, NULL}};
consvar_t cons_backcolor = CVAR_INIT ("con_backcolor", "Green", CV_CALL|CV_SAVE, backcolor_cons_t, CONS_backcolor_Change); consvar_t cons_backcolor = CVAR_INIT ("con_backcolor", "Green", "Color of the console background", CV_CALL|CV_SAVE, backcolor_cons_t, CONS_backcolor_Change);
static void CON_Print(char *msg); static void CON_Print(char *msg);
...@@ -477,7 +477,7 @@ void CON_Init(void) ...@@ -477,7 +477,7 @@ void CON_Init(void)
// register our commands // register our commands
// //
COM_AddCommand("cls", CONS_Clear_f, 0); COM_AddCommand("cls", "Clear the console", CONS_Clear_f, 0);
//COM_AddCommand("english", CONS_English_f); //COM_AddCommand("english", CONS_English_f);
// set console full screen for game startup MAKE SURE VID_Init() done !!! // set console full screen for game startup MAKE SURE VID_Init() done !!!
Lock_state(); Lock_state();
...@@ -504,7 +504,7 @@ void CON_Init(void) ...@@ -504,7 +504,7 @@ void CON_Init(void)
CV_RegisterVar(&cons_height); CV_RegisterVar(&cons_height);
CV_RegisterVar(&cons_backpic); CV_RegisterVar(&cons_backpic);
CV_RegisterVar(&cons_backcolor); CV_RegisterVar(&cons_backcolor);
COM_AddCommand("bind", CONS_Bind_f, 0); COM_AddCommand("bind", "Bind a command to a button", CONS_Bind_f, 0);
} }
else else
{ {
...@@ -918,6 +918,22 @@ static void CON_InputDelChar(void) ...@@ -918,6 +918,22 @@ static void CON_InputDelChar(void)
// ---- // ----
// //
//
// Same as CON_Responder, but is process before everything else, so it cannot be blocked.
//
boolean CON_PreResponder(event_t *ev)
{
if (ev->type == ev_keydown && shiftdown == 1 && ev->key == KEY_ESCAPE)
{
I_SetTextInputMode(con_destlines == 0); // inverse, since this is changed next tic.
consoletoggle = true;
return true;
}
return false;
}
//
// Handles console key input // Handles console key input
// //
boolean CON_Responder(event_t *ev) boolean CON_Responder(event_t *ev)
...@@ -1557,13 +1573,6 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...) ...@@ -1557,13 +1573,6 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...)
// //
void CONS_Error(const char *msg) void CONS_Error(const char *msg)
{ {
#if defined(RPC_NO_WINDOWS_H) && defined(_WINDOWS)
if (!graphics_started)
{
MessageBoxA(vid.WndParent, msg, "SRB2 Warning", MB_OK);
return;
}
#endif
CONS_Printf("\x82%s", msg); // write error msg in different colour CONS_Printf("\x82%s", msg); // write error msg in different colour
CONS_Printf(M_GetText("Press ENTER to continue\n")); CONS_Printf(M_GetText("Press ENTER to continue\n"));
......
...@@ -19,6 +19,7 @@ void CON_Init(void); ...@@ -19,6 +19,7 @@ void CON_Init(void);
void CON_StartRefresh(void); void CON_StartRefresh(void);
void CON_StopRefresh(void); void CON_StopRefresh(void);
boolean CON_PreResponder(event_t *ev);
boolean CON_Responder(event_t *ev); boolean CON_Responder(event_t *ev);
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
...@@ -37,7 +38,8 @@ extern boolean con_refresh; ...@@ -37,7 +38,8 @@ extern boolean con_refresh;
// 0 means console if off, or moving out // 0 means console if off, or moving out
extern INT32 con_destlines; extern INT32 con_destlines;
extern UINT32 con_scalefactor; // console text scale factor // console text scale factor
extern UINT32 con_scalefactor;
extern consvar_t cons_backcolor; extern consvar_t cons_backcolor;
......
...@@ -101,9 +101,6 @@ int SUBVERSION; ...@@ -101,9 +101,6 @@ int SUBVERSION;
// platform independant focus loss // platform independant focus loss
UINT8 window_notinfocus = false; UINT8 window_notinfocus = false;
static addfilelist_t startupwadfiles;
static addfilelist_t startuppwads;
boolean devparm = false; // started game with -devparm boolean devparm = false; // started game with -devparm
boolean singletics = false; // timedemo boolean singletics = false; // timedemo
...@@ -227,6 +224,9 @@ void D_ProcessEvents(void) ...@@ -227,6 +224,9 @@ void D_ProcessEvents(void)
} }
} }
if (CON_PreResponder(ev))
continue;
// Screenshots over everything so that they can be taken anywhere. // Screenshots over everything so that they can be taken anywhere.
if (M_ScreenshotResponder(ev)) if (M_ScreenshotResponder(ev))
continue; // ate the event continue; // ate the event
...@@ -328,7 +328,7 @@ static void D_Display(void) ...@@ -328,7 +328,7 @@ static void D_Display(void)
// 4. The frame is ready to be drawn! // 4. The frame is ready to be drawn!
// Check for change of renderer or screen size (video mode) // Check for change of renderer or screen size (video mode)
if ((setrenderneeded || setmodeneeded) && !wipe) if (vid.change.set && !wipe)
SCR_SetMode(); // change video mode SCR_SetMode(); // change video mode
// Recalc the screen // Recalc the screen
...@@ -509,18 +509,20 @@ static void D_Display(void) ...@@ -509,18 +509,20 @@ static void D_Display(void)
// render the second screen // render the second screen
if (splitscreen && players[secondarydisplayplayer].mo) if (splitscreen && players[secondarydisplayplayer].mo)
{ {
viewwindowy = vid.height / 2; #ifdef HWRENDER
if (rendermode != render_soft)
#ifdef HWRENDER
if (rendermode == render_opengl)
HWR_RenderPlayerView(1, &players[secondarydisplayplayer]); HWR_RenderPlayerView(1, &players[secondarydisplayplayer]);
else else
#endif #endif
if (rendermode != render_none) if (rendermode != render_none)
{ {
viewwindowy = vid.height / 2;
topleft = screens[0] + viewwindowy*vid.width + viewwindowx; topleft = screens[0] + viewwindowy*vid.width + viewwindowx;
R_RenderPlayerView(&players[secondarydisplayplayer]); R_RenderPlayerView(&players[secondarydisplayplayer]);
viewwindowy = 0;
} }
viewwindowy = 0; viewwindowy = 0;
...@@ -1123,7 +1125,7 @@ static void ChangeDirForUrlHandler(void) ...@@ -1123,7 +1125,7 @@ static void ChangeDirForUrlHandler(void)
// Identify the SRB2 version, and IWAD file to use. // Identify the SRB2 version, and IWAD file to use.
// ========================================================================== // ==========================================================================
static void IdentifyVersion(void) static void IdentifyVersion(addfilelist_t *startupwadfiles)
{ {
char *srb2wad; char *srb2wad;
const char *srb2waddir = NULL; const char *srb2waddir = NULL;
...@@ -1166,7 +1168,7 @@ static void IdentifyVersion(void) ...@@ -1166,7 +1168,7 @@ static void IdentifyVersion(void)
// Load the IWAD // Load the IWAD
if (srb2wad != NULL && FIL_ReadFileOK(srb2wad)) if (srb2wad != NULL && FIL_ReadFileOK(srb2wad))
D_AddFile(&startupwadfiles, srb2wad); D_AddFile(startupwadfiles, srb2wad);
else else
I_Error("srb2.pk3 not found! Expected in %s, ss file: %s\n", srb2waddir, srb2wad); I_Error("srb2.pk3 not found! Expected in %s, ss file: %s\n", srb2waddir, srb2wad);
...@@ -1177,14 +1179,14 @@ static void IdentifyVersion(void) ...@@ -1177,14 +1179,14 @@ static void IdentifyVersion(void)
// checking in D_SRB2Main // checking in D_SRB2Main
// Add the maps // Add the maps
D_AddFile(&startupwadfiles, va(pandf,srb2waddir, "zones.pk3")); D_AddFile(startupwadfiles, va(pandf,srb2waddir, "zones.pk3"));
// Add the characters // Add the characters
D_AddFile(&startupwadfiles, va(pandf,srb2waddir, "characters.pk3")); D_AddFile(startupwadfiles, va(pandf,srb2waddir, "characters.pk3"));
#ifdef USE_PATCH_DTA #ifdef USE_PATCH_DTA
// Add our crappy patches to fix our bugs // Add our crappy patches to fix our bugs
D_AddFile(&startupwadfiles, va(pandf,srb2waddir, "patch.pk3")); D_AddFile(startupwadfiles, va(pandf,srb2waddir, "patch.pk3"));
#endif #endif
#if !defined (HAVE_SDL) || defined (HAVE_MIXER) #if !defined (HAVE_SDL) || defined (HAVE_MIXER)
...@@ -1194,7 +1196,7 @@ static void IdentifyVersion(void) ...@@ -1194,7 +1196,7 @@ static void IdentifyVersion(void)
const char *musicpath = va(pandf,srb2waddir,str);\ const char *musicpath = va(pandf,srb2waddir,str);\
int ms = W_VerifyNMUSlumps(musicpath, false); \ int ms = W_VerifyNMUSlumps(musicpath, false); \
if (ms == 1) \ if (ms == 1) \
D_AddFile(&startupwadfiles, musicpath); \ D_AddFile(startupwadfiles, musicpath); \
else if (ms == 0) \ else if (ms == 0) \
I_Error("File "str" has been modified with non-music/sound lumps"); \ I_Error("File "str" has been modified with non-music/sound lumps"); \
} }
...@@ -1239,6 +1241,14 @@ void D_SRB2Main(void) ...@@ -1239,6 +1241,14 @@ void D_SRB2Main(void)
INT32 pstartmap = 1; INT32 pstartmap = 1;
boolean autostart = false; boolean autostart = false;
addfilelist_t startupwads;
addfilelist_t startupwadfiles;
startupwads.files = NULL;
startupwads.numfiles = 0;
startupwadfiles.files = NULL;
startupwadfiles.numfiles = 0;
/* break the version string into version numbers, for netplay */ /* break the version string into version numbers, for netplay */
D_ConvertVersionNumbers(); D_ConvertVersionNumbers();
...@@ -1270,6 +1280,9 @@ void D_SRB2Main(void) ...@@ -1270,6 +1280,9 @@ void D_SRB2Main(void)
// initialise locale code // initialise locale code
M_StartupLocale(); M_StartupLocale();
CONS_Printf("Z_Init(): Init zone memory allocation daemon. \n");
Z_Init();
// get parameters from a response file (eg: srb2 @parms.txt) // get parameters from a response file (eg: srb2 @parms.txt)
M_FindResponseFile(); M_FindResponseFile();
...@@ -1283,7 +1296,7 @@ void D_SRB2Main(void) ...@@ -1283,7 +1296,7 @@ void D_SRB2Main(void)
ChangeDirForUrlHandler(); ChangeDirForUrlHandler();
// identify the main IWAD file to use // identify the main IWAD file to use
IdentifyVersion(); IdentifyVersion(&startupwadfiles);
#if !defined(NOTERMIOS) #if !defined(NOTERMIOS)
setbuf(stdout, NULL); // non-buffered output setbuf(stdout, NULL); // non-buffered output
...@@ -1367,15 +1380,12 @@ void D_SRB2Main(void) ...@@ -1367,15 +1380,12 @@ void D_SRB2Main(void)
P_SetRandSeed(M_RandomizedSeed()); P_SetRandSeed(M_RandomizedSeed());
if (M_CheckParm("-password") && M_IsNextParm())
D_SetPassword(M_GetNextParm());
// player setup menu colors must be initialized before // player setup menu colors must be initialized before
// any wad file is added, as they may contain colors themselves // any wad file is added, as they may contain colors themselves
M_InitPlayerSetupColors(); M_InitPlayerSetupColors();
CONS_Printf("Z_Init(): Init zone memory allocation daemon. \n"); if (M_CheckParm("-password") && M_IsNextParm())
Z_Init(); D_SetPassword(M_GetNextParm());
clientGamedata = M_NewGameDataStruct(); clientGamedata = M_NewGameDataStruct();
serverGamedata = M_NewGameDataStruct(); serverGamedata = M_NewGameDataStruct();
...@@ -1383,7 +1393,7 @@ void D_SRB2Main(void) ...@@ -1383,7 +1393,7 @@ void D_SRB2Main(void)
// Do this up here so that WADs loaded through the command line can use ExecCfg // Do this up here so that WADs loaded through the command line can use ExecCfg
COM_Init(); COM_Init();
COM_AddCommand("assert", Command_assert, COM_LUA); COM_AddCommand("assert", NULL, Command_assert, COM_LUA);
// Add any files specified on the command line with // Add any files specified on the command line with
// "-file <file>" or "-folder <folder>" to the add-on list // "-file <file>" or "-folder <folder>" to the add-on list
...@@ -1401,9 +1411,9 @@ void D_SRB2Main(void) ...@@ -1401,9 +1411,9 @@ void D_SRB2Main(void)
else if (myargv[i][0] == '-' || myargv[i][0] == '+') else if (myargv[i][0] == '-' || myargv[i][0] == '+')
addontype = 0; addontype = 0;
else if (addontype == 1) else if (addontype == 1)
D_AddFile(&startuppwads, myargv[i]); D_AddFile(&startupwads, myargv[i]);
else if (addontype == 2) else if (addontype == 2)
D_AddFolder(&startuppwads, myargv[i]); D_AddFolder(&startupwads, myargv[i]);
} }
} }
...@@ -1429,7 +1439,8 @@ void D_SRB2Main(void) ...@@ -1429,7 +1439,8 @@ void D_SRB2Main(void)
I_InitializeTime(); I_InitializeTime();
// Make backups of some SOCcable tables. // Make backups of some SOCcable tables.
P_BackupTables(); P_InitializeTables();
//P_BackupTables();
mainwads = 3; // doesn't include music.pk3 mainwads = 3; // doesn't include music.pk3
#ifdef USE_PATCH_DTA #ifdef USE_PATCH_DTA
...@@ -1488,11 +1499,11 @@ void D_SRB2Main(void) ...@@ -1488,11 +1499,11 @@ void D_SRB2Main(void)
CON_StopRefresh(); // Temporarily stop refreshing the screen for wad loading CON_StopRefresh(); // Temporarily stop refreshing the screen for wad loading
if (startuppwads.numfiles) if (startupwads.numfiles)
{ {
CONS_Printf("W_InitMultipleFiles(): Adding extra PWADs.\n"); CONS_Printf("W_InitMultipleFiles(): Adding extra PWADs.\n");
W_InitMultipleFiles(&startuppwads); W_InitMultipleFiles(&startupwads);
D_CleanFile(&startuppwads); D_CleanFile(&startupwads);
} }
CON_StartRefresh(); // Restart the refresh! CON_StartRefresh(); // Restart the refresh!
...@@ -1513,7 +1524,7 @@ void D_SRB2Main(void) ...@@ -1513,7 +1524,7 @@ void D_SRB2Main(void)
G_LoadGameData(clientGamedata); G_LoadGameData(clientGamedata);
M_CopyGameData(serverGamedata, clientGamedata); M_CopyGameData(serverGamedata, clientGamedata);
VID_PrepareModeList(); // Regenerate Modelist according to cv_fullscreen allow_fullscreen = true;
// set user default mode or mode set at cmdline // set user default mode or mode set at cmdline
SCR_CheckDefaultMode(); SCR_CheckDefaultMode();
...@@ -1776,7 +1787,7 @@ const char *D_Home(void) ...@@ -1776,7 +1787,7 @@ const char *D_Home(void)
const char *userhome = NULL; const char *userhome = NULL;
#ifdef ANDROID #ifdef ANDROID
return "/data/data/org.srb2/"; return "/data/data/org.srb2classic/";
#endif #endif
if (M_CheckParm("-home") && M_IsNextParm()) if (M_CheckParm("-home") && M_IsNextParm())
...@@ -1865,8 +1876,8 @@ boolean D_IsPathAllowed(const char *path) ...@@ -1865,8 +1876,8 @@ boolean D_IsPathAllowed(const char *path)
// Sort folder paths by longest to shortest so // Sort folder paths by longest to shortest so
// overlapping paths work. E.g.: // overlapping paths work. E.g.:
// Path 1: /home/james/.srb2/addons // Path 1: /home/james/.srb2classic/addons
// Path 2: /home/james/.srb2 // Path 2: /home/james/.srb2classic
qsort(paths, n_paths, sizeof *paths, cmp_strlen_desc); qsort(paths, n_paths, sizeof *paths, cmp_strlen_desc);
// These paths are allowed to be absolute // These paths are allowed to be absolute
......
...@@ -7,7 +7,7 @@ rendermode_t chosenrendermode = render_none; ...@@ -7,7 +7,7 @@ rendermode_t chosenrendermode = render_none;
boolean allow_fullscreen = false; boolean allow_fullscreen = false;
consvar_t cv_vidwait = CVAR_INIT ("vid_wait", "On", CV_SAVE, CV_OnOff, NULL); consvar_t cv_vidwait = CVAR_INIT ("vid_wait", "On", "Has no effect on this build", CV_SAVE, CV_OnOff, NULL);
void I_StartupGraphics(void){} void I_StartupGraphics(void){}
void I_ShutdownGraphics(void){} void I_ShutdownGraphics(void){}
...@@ -19,26 +19,6 @@ void I_SetPalette(RGBA_t *palette) ...@@ -19,26 +19,6 @@ void I_SetPalette(RGBA_t *palette)
(void)palette; (void)palette;
} }
INT32 VID_NumModes(void)
{
return 0;
}
INT32 VID_GetModeForSize(INT32 w, INT32 h)
{
(void)w;
(void)h;
return 0;
}
void VID_PrepareModeList(void){}
INT32 VID_SetMode(INT32 modenum)
{
(void)modenum;
return 0;
}
boolean VID_CheckRenderer(void) boolean VID_CheckRenderer(void)
{ {
return false; return false;
...@@ -49,12 +29,6 @@ void VID_CheckGLLoaded(rendermode_t oldrender) ...@@ -49,12 +29,6 @@ void VID_CheckGLLoaded(rendermode_t oldrender)
(void)oldrender; (void)oldrender;
} }
const char *VID_GetModeName(INT32 modenum)
{
(void)modenum;
return NULL;
}
UINT32 I_GetRefreshRate(void) { return 35; } UINT32 I_GetRefreshRate(void) { return 35; }
void I_UpdateNoBlit(void){} void I_UpdateNoBlit(void){}
...@@ -76,3 +50,15 @@ void I_ReadScreen(UINT8 *scr) ...@@ -76,3 +50,15 @@ void I_ReadScreen(UINT8 *scr)
void I_BeginRead(void){} void I_BeginRead(void){}
void I_EndRead(void){} void I_EndRead(void){}
void VID_SetSize(INT32 width, INT32 height)
{
(void)width;
(void)height;
}
boolean VID_IsMaximized(void)
{
return false;
}
void VID_RestoreWindow(void){}
...@@ -12,6 +12,10 @@ ...@@ -12,6 +12,10 @@
#include "deh_lua.h" #include "deh_lua.h"
#ifdef MUSICSLOT_COMPATIBILITY
#include "deh_soc.h" // for get_mus
#endif
// freeslot takes a name (string only!) // freeslot takes a name (string only!)
// and allocates it to the appropriate free slot. // and allocates it to the appropriate free slot.
// Returns the slot number allocated for it or nil if failed. // Returns the slot number allocated for it or nil if failed.
...@@ -55,7 +59,7 @@ static inline int lib_freeslot(lua_State *L) ...@@ -55,7 +59,7 @@ static inline int lib_freeslot(lua_State *L)
sfxenum_t sfx; sfxenum_t sfx;
strlwr(word); strlwr(word);
CONS_Printf("Sound sfx_%s allocated.\n",word); CONS_Printf("Sound sfx_%s allocated.\n",word);
sfx = S_AddSoundFx(word, false, 0, false); sfx = S_AddSoundFx(word, false, 0);
if (sfx != sfx_None) { if (sfx != sfx_None) {
lua_pushinteger(L, sfx); lua_pushinteger(L, sfx);
r++; r++;
...@@ -65,56 +69,23 @@ static inline int lib_freeslot(lua_State *L) ...@@ -65,56 +69,23 @@ static inline int lib_freeslot(lua_State *L)
else if (fastcmp(type, "SPR")) else if (fastcmp(type, "SPR"))
{ {
spritenum_t j; spritenum_t j;
CONS_Printf("Sprite SPR_%s allocated.\n",word);
if (strlen(word) > MAXSPRITENAME) j = P_AllocateSpriteinfo(Z_StrDup(word));
return luaL_error(L, "Sprite name is longer than %d characters\n", MAXSPRITENAME); LUA_UpdateSprName(word, j);
lua_pushinteger(L, j);
for (j = SPR_FIRSTFREESLOT; j <= SPR_LASTFREESLOT; j++) r++;
{
if (in_bit_array(used_spr, j - SPR_FIRSTFREESLOT))
continue; // Already allocated, next.
// Found a free slot!
CONS_Printf("Sprite SPR_%s allocated.\n",word);
strcpy(sprnames[j], word);
set_bit_array(used_spr, j - SPR_FIRSTFREESLOT); // Okay, this sprite slot has been named now.
// Lua needs to update the value in _G if it exists
LUA_UpdateSprName(word, j);
lua_pushinteger(L, j);
r++;
break;
}
if (j > SPR_LASTFREESLOT)
CONS_Alert(CONS_WARNING, "Ran out of free sprite slots!\n");
} }
else if (fastcmp(type, "S")) else if (fastcmp(type, "S"))
{ {
statenum_t i; CONS_Printf("State S_%s allocated.\n",word);
for (i = 0; i < NUMSTATEFREESLOTS; i++) lua_pushinteger(L, P_AllocateState(Z_StrDup(word)));
if (!FREE_STATES[i]) { r++;
CONS_Printf("State S_%s allocated.\n",word);
FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_STATES[i],word);
lua_pushinteger(L, S_FIRSTFREESLOT + i);
r++;
break;
}
if (i == NUMSTATEFREESLOTS)
CONS_Alert(CONS_WARNING, "Ran out of free State slots!\n");
} }
else if (fastcmp(type, "MT")) else if (fastcmp(type, "MT"))
{ {
mobjtype_t i; CONS_Printf("MobjType MT_%s allocated.\n",word);
for (i = 0; i < NUMMOBJFREESLOTS; i++) lua_pushinteger(L, P_AllocateMobjinfo(Z_StrDup(word)));
if (!FREE_MOBJS[i]) { r++;
CONS_Printf("MobjType MT_%s allocated.\n",word);
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_MOBJS[i],word);
lua_pushinteger(L, MT_FIRSTFREESLOT + i);
r++;
break;
}
if (i == NUMMOBJFREESLOTS)
CONS_Alert(CONS_WARNING, "Ran out of free MobjType slots!\n");
} }
else if (fastcmp(type, "SKINCOLOR")) else if (fastcmp(type, "SKINCOLOR"))
{ {
...@@ -136,21 +107,15 @@ static inline int lib_freeslot(lua_State *L) ...@@ -136,21 +107,15 @@ static inline int lib_freeslot(lua_State *L)
{ {
// Search if we already have an SPR2 by that name... // Search if we already have an SPR2 by that name...
playersprite_t i; playersprite_t i;
for (i = SPR2_FIRSTFREESLOT; i < free_spr2; i++) for (i = 0; i < numplayersprites; i++)
if (memcmp(spr2names[i],word,4) == 0) if (memcmp(playersprites[i]->name,word,4) == 0)
break; break;
// We don't, so allocate a new one. if (i >= numplayersprites)
if (i >= free_spr2) { {
if (free_spr2 < NUMPLAYERSPRITES) // We don't, so allocate a new one.
{ CONS_Printf("Sprite SPR2_%s allocated.\n",word);
CONS_Printf("Sprite SPR2_%s allocated.\n",word); lua_pushinteger(L, P_AllocatePlayersprite(Z_StrDup(word)));
strncpy(spr2names[free_spr2],word,4); r++;
spr2defaults[free_spr2] = 0;
lua_pushinteger(L, free_spr2);
r++;
spr2names[free_spr2++][4] = 0;
} else
CONS_Alert(CONS_WARNING, "Ran out of free SPR2 slots!\n");
} }
} }
else if (fastcmp(type, "TOL")) else if (fastcmp(type, "TOL"))
...@@ -421,42 +386,32 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word) ...@@ -421,42 +386,32 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
} }
else if (fastncmp("S_",word,2)) { else if (fastncmp("S_",word,2)) {
p = word+2; p = word+2;
for (i = 0; i < NUMSTATEFREESLOTS; i++) { for (i = 0; (UINT32)i < numstates; i++)
if (!FREE_STATES[i]) {
break; if (fastcmp(p, states[i]->name))
if (fastcmp(p, FREE_STATES[i])) { {
CacheAndPushConstant(L, word, S_FIRSTFREESLOT+i);
return 1;
}
}
for (i = 0; i < S_FIRSTFREESLOT; i++)
if (fastcmp(p, STATE_LIST[i]+2)) {
CacheAndPushConstant(L, word, i); CacheAndPushConstant(L, word, i);
return 1; return 1;
} }
}
return luaL_error(L, "state '%s' does not exist.\n", word); return luaL_error(L, "state '%s' does not exist.\n", word);
} }
else if (fastncmp("MT_",word,3)) { else if (fastncmp("MT_",word,3)) {
p = word+3; p = word+3;
for (i = 0; i < NUMMOBJFREESLOTS; i++) { for (i = 0; (UINT32)i < nummobjinfo; i++)
if (!FREE_MOBJS[i]) {
break; if (fastcmp(p, mobjinfo[i]->name))
if (fastcmp(p, FREE_MOBJS[i])) { {
CacheAndPushConstant(L, word, MT_FIRSTFREESLOT+i);
return 1;
}
}
for (i = 0; i < MT_FIRSTFREESLOT; i++)
if (fastcmp(p, MOBJTYPE_LIST[i]+3)) {
CacheAndPushConstant(L, word, i); CacheAndPushConstant(L, word, i);
return 1; return 1;
} }
}
return luaL_error(L, "mobjtype '%s' does not exist.\n", word); return luaL_error(L, "mobjtype '%s' does not exist.\n", word);
} }
else if (fastncmp("SPR_",word,4)) { else if (fastncmp("SPR_",word,4)) {
p = word+4; p = word+4;
i = R_GetSpriteNumByName(p); i = R_GetSpriteNumByName(p);
if (i != NUMSPRITES) if ((UINT32)i != numspriteinfo)
{ {
// updating overridden sprnames is not implemented for soc parser, // updating overridden sprnames is not implemented for soc parser,
// so don't use cache // so don't use cache
...@@ -472,18 +427,20 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word) ...@@ -472,18 +427,20 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
} }
else if (fastncmp("SPR2_",word,5)) { else if (fastncmp("SPR2_",word,5)) {
p = word+5; p = word+5;
for (i = 0; i < (fixed_t)free_spr2; i++) for (i = 0; i < (fixed_t)numplayersprites; i++)
if (!spr2names[i][4]) if (!playersprites[i]->name[4])
{ {
// special 3-char cases, e.g. SPR2_RUN // special 3-char cases, e.g. SPR2_RUN
// the spr2names entry will have "_" on the end, as in "RUN_" // the playersprites entry will have "_" on the end, as in "RUN_"
if (spr2names[i][3] == '_' && !p[3]) { if (playersprites[i]->name[3] == '_' && !p[3])
if (fastncmp(p,spr2names[i],3)) { {
if (fastncmp(p,playersprites[i]->name,3))
{
CacheAndPushConstant(L, word, i); CacheAndPushConstant(L, word, i);
return 1; return 1;
} }
} }
else if (fastncmp(p,spr2names[i],4)) { else if (fastncmp(p,playersprites[i]->name,4)) {
CacheAndPushConstant(L, word, i); CacheAndPushConstant(L, word, i);
return 1; return 1;
} }
...@@ -493,8 +450,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word) ...@@ -493,8 +450,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
} }
else if (!mathlib && fastncmp("sfx_",word,4)) { else if (!mathlib && fastncmp("sfx_",word,4)) {
p = word+4; p = word+4;
for (i = 0; i < NUMSFX; i++) for (i = 0; (UINT32)i < S_numsfx; i++)
if (S_sfx[i].name && fastcmp(p, S_sfx[i].name)) { if (S_sfx[i]->name && fastcmp(p, S_sfx[i]->name)) {
CacheAndPushConstant(L, word, i); CacheAndPushConstant(L, word, i);
return 1; return 1;
} }
...@@ -502,8 +459,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word) ...@@ -502,8 +459,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
} }
else if (mathlib && fastncmp("SFX_",word,4)) { // SOCs are ALL CAPS! else if (mathlib && fastncmp("SFX_",word,4)) { // SOCs are ALL CAPS!
p = word+4; p = word+4;
for (i = 0; i < NUMSFX; i++) for (i = 0; (UINT32)i < S_numsfx; i++)
if (S_sfx[i].name && fasticmp(p, S_sfx[i].name)) { if (S_sfx[i]->name && fasticmp(p, S_sfx[i]->name)) {
CacheAndPushConstant(L, word, i); CacheAndPushConstant(L, word, i);
return 1; return 1;
} }
...@@ -511,14 +468,37 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word) ...@@ -511,14 +468,37 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
} }
else if (mathlib && fastncmp("DS",word,2)) { else if (mathlib && fastncmp("DS",word,2)) {
p = word+2; p = word+2;
for (i = 0; i < NUMSFX; i++) for (i = 0; (UINT32)i < S_numsfx; i++)
if (S_sfx[i].name && fasticmp(p, S_sfx[i].name)) { if (S_sfx[i]->name && fasticmp(p, S_sfx[i]->name)) {
CacheAndPushConstant(L, word, i); CacheAndPushConstant(L, word, i);
return 1; return 1;
} }
if (mathlib) return luaL_error(L, "sfx '%s' could not be found.\n", word); if (mathlib) return luaL_error(L, "sfx '%s' could not be found.\n", word);
return 0; return 0;
} }
#ifdef MUSICSLOT_COMPATIBILITY
else if (!mathlib && fastncmp("mus_",word,4)) {
p = word+4;
if ((i = get_mus(p, false)) == 0)
return 0;
lua_pushinteger(L, i);
return 1;
}
else if (mathlib && fastncmp("MUS_",word,4)) { // SOCs are ALL CAPS!
p = word+4;
if ((i = get_mus(p, false)) == 0)
return luaL_error(L, "music '%s' could not be found.\n", word);
lua_pushinteger(L, i);
return 1;
}
else if (mathlib && (fastncmp("O_",word,2) || fastncmp("D_",word,2))) {
p = word+2;
if ((i = get_mus(p, false)) == 0)
return luaL_error(L, "music '%s' could not be found.\n", word);
lua_pushinteger(L, i);
return 1;
}
#endif
else if (!mathlib && fastncmp("pw_",word,3)) { else if (!mathlib && fastncmp("pw_",word,3)) {
p = word+3; p = word+3;
for (i = 0; i < NUMPOWERS; i++) for (i = 0; i < NUMPOWERS; i++)
......
...@@ -444,41 +444,25 @@ void readfreeslots(MYFILE *f) ...@@ -444,41 +444,25 @@ void readfreeslots(MYFILE *f)
// TODO: Out-of-slots warnings/errors. // TODO: Out-of-slots warnings/errors.
// TODO: Name too long (truncated) warnings. // TODO: Name too long (truncated) warnings.
if (fastcmp(type, "SFX")) if (fastcmp(type, "SFX"))
S_AddSoundFx(word, false, 0, false); S_AddSoundFx(word, false, 0);
else if (fastcmp(type, "SPR")) else if (fastcmp(type, "SPR"))
{ {
if (strlen(word) > MAXSPRITENAME) if (strlen(word) > MAXSPRITENAME)
I_Error("Sprite name is longer than %d characters\n", MAXSPRITENAME); I_Error("Sprite name is longer than %d characters\n", MAXSPRITENAME);
for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++) CONS_Printf("Sprite SPR_%s allocated.\n",word);
{ i = P_AllocateSpriteinfo(Z_StrDup(word));
if (in_bit_array(used_spr, i - SPR_FIRSTFREESLOT)) LUA_UpdateSprName(word, i);
continue; // Already allocated, next.
// Found a free slot!
strcpy(sprnames[i], word);
set_bit_array(used_spr, i - SPR_FIRSTFREESLOT); // Okay, this sprite slot has been named now.
// Lua needs to update the value in _G if it exists
LUA_UpdateSprName(word, i);
break;
}
} }
else if (fastcmp(type, "S")) else if (fastcmp(type, "S"))
{ {
for (i = 0; i < NUMSTATEFREESLOTS; i++) CONS_Printf("State S_%s allocated.\n",word);
if (!FREE_STATES[i]) { P_AllocateState(Z_StrDup(word));
FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_STATES[i],word);
break;
}
} }
else if (fastcmp(type, "MT")) else if (fastcmp(type, "MT"))
{ {
for (i = 0; i < NUMMOBJFREESLOTS; i++) CONS_Printf("MobjType MT_%s allocated.\n",word);
if (!FREE_MOBJS[i]) { P_AllocateMobjinfo(Z_StrDup(word));
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_MOBJS[i],word);
break;
}
} }
else if (fastcmp(type, "SKINCOLOR")) else if (fastcmp(type, "SKINCOLOR"))
{ {
...@@ -493,19 +477,14 @@ void readfreeslots(MYFILE *f) ...@@ -493,19 +477,14 @@ void readfreeslots(MYFILE *f)
else if (fastcmp(type, "SPR2")) else if (fastcmp(type, "SPR2"))
{ {
// Search if we already have an SPR2 by that name... // Search if we already have an SPR2 by that name...
for (i = SPR2_FIRSTFREESLOT; i < (int)free_spr2; i++) for (i = 0; i < (int)numplayersprites; i++)
if (memcmp(spr2names[i],word,4) == 0) if (memcmp(playersprites[i]->name,word,4) == 0)
break; break;
// We found it? (Two mods using the same SPR2 name?) Then don't allocate another one. // We found it? (Two mods using the same SPR2 name?) Then don't allocate another one.
if (i < (int)free_spr2) if (i < (int)numplayersprites)
continue; continue;
// Copy in the spr2 name and increment free_spr2. CONS_Printf("Sprite SPR2_%s allocated.\n",word);
if (free_spr2 < NUMPLAYERSPRITES) { P_AllocatePlayersprite(Z_StrDup(word));
strncpy(spr2names[free_spr2],word,4);
spr2defaults[free_spr2] = 0;
spr2names[free_spr2++][4] = 0;
} else
deh_warning("Ran out of free SPR2 slots!\n");
} }
else if (fastcmp(type, "TOL")) else if (fastcmp(type, "TOL"))
{ {
...@@ -572,99 +551,99 @@ void readthing(MYFILE *f, INT32 num) ...@@ -572,99 +551,99 @@ void readthing(MYFILE *f, INT32 num)
if (fastcmp(word, "MAPTHINGNUM") || fastcmp(word, "DOOMEDNUM")) if (fastcmp(word, "MAPTHINGNUM") || fastcmp(word, "DOOMEDNUM"))
{ {
mobjinfo[num].doomednum = (INT32)atoi(word2); mobjinfo[num]->doomednum = (INT32)atoi(word2);
} }
else if (fastcmp(word, "SPAWNSTATE")) else if (fastcmp(word, "SPAWNSTATE"))
{ {
mobjinfo[num].spawnstate = get_number(word2); mobjinfo[num]->spawnstate = get_number(word2);
} }
else if (fastcmp(word, "SPAWNHEALTH")) else if (fastcmp(word, "SPAWNHEALTH"))
{ {
mobjinfo[num].spawnhealth = (INT32)get_number(word2); mobjinfo[num]->spawnhealth = (INT32)get_number(word2);
} }
else if (fastcmp(word, "SEESTATE")) else if (fastcmp(word, "SEESTATE"))
{ {
mobjinfo[num].seestate = get_number(word2); mobjinfo[num]->seestate = get_number(word2);
} }
else if (fastcmp(word, "SEESOUND")) else if (fastcmp(word, "SEESOUND"))
{ {
mobjinfo[num].seesound = get_number(word2); mobjinfo[num]->seesound = get_number(word2);
} }
else if (fastcmp(word, "REACTIONTIME")) else if (fastcmp(word, "REACTIONTIME"))
{ {
mobjinfo[num].reactiontime = (INT32)get_number(word2); mobjinfo[num]->reactiontime = (INT32)get_number(word2);
} }
else if (fastcmp(word, "ATTACKSOUND")) else if (fastcmp(word, "ATTACKSOUND"))
{ {
mobjinfo[num].attacksound = get_number(word2); mobjinfo[num]->attacksound = get_number(word2);
} }
else if (fastcmp(word, "PAINSTATE")) else if (fastcmp(word, "PAINSTATE"))
{ {
mobjinfo[num].painstate = get_number(word2); mobjinfo[num]->painstate = get_number(word2);
} }
else if (fastcmp(word, "PAINCHANCE")) else if (fastcmp(word, "PAINCHANCE"))
{ {
mobjinfo[num].painchance = (INT32)get_number(word2); mobjinfo[num]->painchance = (INT32)get_number(word2);
} }
else if (fastcmp(word, "PAINSOUND")) else if (fastcmp(word, "PAINSOUND"))
{ {
mobjinfo[num].painsound = get_number(word2); mobjinfo[num]->painsound = get_number(word2);
} }
else if (fastcmp(word, "MELEESTATE")) else if (fastcmp(word, "MELEESTATE"))
{ {
mobjinfo[num].meleestate = get_number(word2); mobjinfo[num]->meleestate = get_number(word2);
} }
else if (fastcmp(word, "MISSILESTATE")) else if (fastcmp(word, "MISSILESTATE"))
{ {
mobjinfo[num].missilestate = get_number(word2); mobjinfo[num]->missilestate = get_number(word2);
} }
else if (fastcmp(word, "DEATHSTATE")) else if (fastcmp(word, "DEATHSTATE"))
{ {
mobjinfo[num].deathstate = get_number(word2); mobjinfo[num]->deathstate = get_number(word2);
} }
else if (fastcmp(word, "DEATHSOUND")) else if (fastcmp(word, "DEATHSOUND"))
{ {
mobjinfo[num].deathsound = get_number(word2); mobjinfo[num]->deathsound = get_number(word2);
} }
else if (fastcmp(word, "XDEATHSTATE")) else if (fastcmp(word, "XDEATHSTATE"))
{ {
mobjinfo[num].xdeathstate = get_number(word2); mobjinfo[num]->xdeathstate = get_number(word2);
} }
else if (fastcmp(word, "SPEED")) else if (fastcmp(word, "SPEED"))
{ {
mobjinfo[num].speed = get_number(word2); mobjinfo[num]->speed = get_number(word2);
} }
else if (fastcmp(word, "RADIUS")) else if (fastcmp(word, "RADIUS"))
{ {
mobjinfo[num].radius = get_number(word2); mobjinfo[num]->radius = get_number(word2);
} }
else if (fastcmp(word, "HEIGHT")) else if (fastcmp(word, "HEIGHT"))
{ {
mobjinfo[num].height = get_number(word2); mobjinfo[num]->height = get_number(word2);
} }
else if (fastcmp(word, "DISPOFFSET")) else if (fastcmp(word, "DISPOFFSET"))
{ {
mobjinfo[num].dispoffset = get_number(word2); mobjinfo[num]->dispoffset = get_number(word2);
} }
else if (fastcmp(word, "MASS")) else if (fastcmp(word, "MASS"))
{ {
mobjinfo[num].mass = (INT32)get_number(word2); mobjinfo[num]->mass = (INT32)get_number(word2);
} }
else if (fastcmp(word, "DAMAGE")) else if (fastcmp(word, "DAMAGE"))
{ {
mobjinfo[num].damage = (INT32)get_number(word2); mobjinfo[num]->damage = (INT32)get_number(word2);
} }
else if (fastcmp(word, "ACTIVESOUND")) else if (fastcmp(word, "ACTIVESOUND"))
{ {
mobjinfo[num].activesound = get_number(word2); mobjinfo[num]->activesound = get_number(word2);
} }
else if (fastcmp(word, "FLAGS")) else if (fastcmp(word, "FLAGS"))
{ {
mobjinfo[num].flags = (INT32)get_number(word2); mobjinfo[num]->flags = (INT32)get_number(word2);
} }
else if (fastcmp(word, "RAISESTATE")) else if (fastcmp(word, "RAISESTATE"))
{ {
mobjinfo[num].raisestate = get_number(word2); mobjinfo[num]->raisestate = get_number(word2);
} }
else else
deh_warning("Thing %d: unknown word '%s'", num, word); deh_warning("Thing %d: unknown word '%s'", num, word);
...@@ -1010,7 +989,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2) ...@@ -1010,7 +989,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
if (fastcmp(word, "LIGHTTYPE")) if (fastcmp(word, "LIGHTTYPE"))
{ {
if (sprite2) if (sprite2)
deh_warning("Sprite2 %s: invalid word '%s'", spr2names[num], word); deh_warning("Sprite2 %s: invalid word '%s'", playersprites[num]->name, word);
else else
{ {
INT32 oldvar; INT32 oldvar;
...@@ -1026,7 +1005,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2) ...@@ -1026,7 +1005,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
INT32 skinnum = -1; INT32 skinnum = -1;
if (!sprite2) if (!sprite2)
{ {
deh_warning("Sprite %s: %s keyword found outside of SPRITE2INFO block, ignoring", spr2names[num], word); deh_warning("Sprite %s: %s keyword found outside of SPRITE2INFO block, ignoring", playersprites[num]->name, word);
continue; continue;
} }
...@@ -1035,7 +1014,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2) ...@@ -1035,7 +1014,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
skinnum = R_SkinAvailable(word2); skinnum = R_SkinAvailable(word2);
if (skinnum == -1) if (skinnum == -1)
{ {
deh_warning("Sprite2 %s: unknown skin %s", spr2names[num], word2); deh_warning("Sprite2 %s: unknown skin %s", playersprites[num]->name, word2);
break; break;
} }
...@@ -1048,14 +1027,14 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2) ...@@ -1048,14 +1027,14 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
{ {
if (!sprite2) if (!sprite2)
{ {
deh_warning("Sprite %s: %s keyword found outside of SPRITE2INFO block, ignoring", spr2names[num], word); deh_warning("Sprite %s: %s keyword found outside of SPRITE2INFO block, ignoring", playersprites[num]->name, word);
continue; continue;
} }
if (num < (INT32)free_spr2 && num >= (INT32)SPR2_FIRSTFREESLOT) if (num > 0 && num < (INT32)numplayersprites)
spr2defaults[num] = get_number(word2); playersprites[num]->defaults = get_number(word2);
else else
{ {
deh_warning("Sprite2 %s: out of range (%d - %d), ignoring", spr2names[num], SPR2_FIRSTFREESLOT, free_spr2-1); deh_warning("Sprite2 %s: out of range (1 - %d), ignoring", playersprites[num]->name, numplayersprites-1);
continue; continue;
} }
} }
...@@ -1066,9 +1045,9 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2) ...@@ -1066,9 +1045,9 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
if (frame >= 64) if (frame >= 64)
{ {
if (sprite2) if (sprite2)
deh_warning("Sprite2 %s: invalid frame %s", spr2names[num], word2); deh_warning("Sprite2 %s: invalid frame %s", playersprites[num]->name, word2);
else else
deh_warning("Sprite %s: invalid frame %s", sprnames[num], word2); deh_warning("Sprite %s: invalid frame %s", spriteinfo[num]->name, word2);
break; break;
} }
...@@ -1079,7 +1058,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2) ...@@ -1079,7 +1058,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
INT32 i; INT32 i;
if (!foundskins) if (!foundskins)
{ {
deh_warning("Sprite2 %s: no skins specified", spr2names[num]); deh_warning("Sprite2 %s: no skins specified", playersprites[num]->name);
break; break;
} }
for (i = 0; i < foundskins; i++) for (i = 0; i < foundskins; i++)
...@@ -1090,11 +1069,14 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2) ...@@ -1090,11 +1069,14 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
} }
} }
else else
M_Memcpy(&spriteinfo[num], info, sizeof(spriteinfo_t)); {
info->name = spriteinfo[num]->name;
M_Memcpy(spriteinfo[num], info, sizeof(spriteinfo_t));
}
} }
else else
{ {
//deh_warning("Sprite %s: unknown word '%s'", sprnames[num], word); //deh_warning("Sprite %s: unknown word '%s'", spriteinfo[num]->name, word);
f->curpos = lastline; f->curpos = lastline;
break; break;
} }
...@@ -1141,9 +1123,9 @@ void readsprite2(MYFILE *f, INT32 num) ...@@ -1141,9 +1123,9 @@ void readsprite2(MYFILE *f, INT32 num)
word2[strlen(word2)-1] = '\0'; word2[strlen(word2)-1] = '\0';
if (fastcmp(word, "DEFAULT")) if (fastcmp(word, "DEFAULT"))
spr2defaults[num] = get_number(word2); playersprites[num]->defaults = get_number(word2);
else else
deh_warning("Sprite2 %s: unknown word '%s'", spr2names[num], word); deh_warning("Sprite2 %s: unknown word '%s'", playersprites[num]->name, word);
} }
} while (!myfeof(f)); // finish when the line is empty } while (!myfeof(f)); // finish when the line is empty
...@@ -1645,8 +1627,23 @@ void readlevelheader(MYFILE *f, INT32 num) ...@@ -1645,8 +1627,23 @@ void readlevelheader(MYFILE *f, INT32 num)
} }
} }
// TODO: 2.3: Delete // TODO: 2.3: Delete
#ifdef MUSICSLOT_COMPATIBILITY
else if (fastcmp(word, "MUSICSLOT")) else if (fastcmp(word, "MUSICSLOT"))
deh_warning("Level header %d: MusicSlot parameter is deprecated and will be removed.\nUse \"Music\" instead.", num); {
deh_warning("Level header %d: MUSICSLOT is deprecated, consider using MUSIC instead", num);
i = get_mus(word2, true);
if (i && i <= 1035)
snprintf(mapheaderinfo[num-1]->musname, 7, "%sM", G_BuildMapName(i));
else if (i && i <= 1050)
{
strncpy(mapheaderinfo[num-1]->musname, compat_special_music_slots[i - 1036], 6);
mapheaderinfo[num-1]->musname[6] = '\0';
}
else
mapheaderinfo[num-1]->musname[0] = 0; // becomes empty string
mapheaderinfo[num-1]->musname[6] = 0;
}
#endif
else if (fastcmp(word, "MUSICTRACK")) else if (fastcmp(word, "MUSICTRACK"))
mapheaderinfo[num-1]->mustrack = ((UINT16)i - 1); mapheaderinfo[num-1]->mustrack = ((UINT16)i - 1);
else if (fastcmp(word, "MUSICPOS")) else if (fastcmp(word, "MUSICPOS"))
...@@ -2032,6 +2029,20 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum) ...@@ -2032,6 +2029,20 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
sizeof cutscenes[num]->scene[scenenum].musswitch, sizeof cutscenes[num]->scene[scenenum].musswitch,
va("Cutscene %d, scene %d: music", num + 1, scenenum + 1)); va("Cutscene %d, scene %d: music", num + 1, scenenum + 1));
} }
#ifdef MUSICSLOT_COMPATIBILITY
else if (fastcmp(word, "MUSICSLOT"))
{
deh_warning("Cutscene %d, scene %d: MUSICSLOT is deprecated, consider using MUSIC instead", num + 1, scenenum + 1);
i = get_mus(word2, true);
if (i && i <= 1035)
snprintf(cutscenes[num]->scene[scenenum].musswitch, 7, "%sM", G_BuildMapName(i));
else if (i && i <= 1050)
strncpy(cutscenes[num]->scene[scenenum].musswitch, compat_special_music_slots[i - 1036], 7);
else
cutscenes[num]->scene[scenenum].musswitch[0] = 0; // becomes empty string
cutscenes[num]->scene[scenenum].musswitch[6] = 0;
}
#endif
else if (fastcmp(word, "MUSICTRACK")) else if (fastcmp(word, "MUSICTRACK"))
{ {
cutscenes[num]->scene[scenenum].musswitchflags = ((UINT16)i) & MUSIC_TRACKMASK; cutscenes[num]->scene[scenenum].musswitchflags = ((UINT16)i) & MUSIC_TRACKMASK;
...@@ -2301,6 +2312,20 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum) ...@@ -2301,6 +2312,20 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
sizeof textprompts[num]->page[pagenum].musswitch, sizeof textprompts[num]->page[pagenum].musswitch,
va("Text prompt %d, page %d: music", num + 1, pagenum + 1)); va("Text prompt %d, page %d: music", num + 1, pagenum + 1));
} }
#ifdef MUSICSLOT_COMPATIBILITY
else if (fastcmp(word, "MUSICSLOT"))
{
deh_warning("Text prompt %d, page %d: MUSICSLOT is deprecated, consider using MUSIC instead", num + 1, pagenum + 1);
i = get_mus(word2, true);
if (i && i <= 1035)
snprintf(textprompts[num]->page[pagenum].musswitch, 7, "%sM", G_BuildMapName(i));
else if (i && i <= 1050)
strncpy(textprompts[num]->page[pagenum].musswitch, compat_special_music_slots[i - 1036], 7);
else
textprompts[num]->page[pagenum].musswitch[0] = 0; // becomes empty string
textprompts[num]->page[pagenum].musswitch[6] = 0;
}
#endif
else if (fastcmp(word, "MUSICTRACK")) else if (fastcmp(word, "MUSICTRACK"))
{ {
textprompts[num]->page[pagenum].musswitchflags = ((UINT16)i) & MUSIC_TRACKMASK; textprompts[num]->page[pagenum].musswitchflags = ((UINT16)i) & MUSIC_TRACKMASK;
...@@ -2642,6 +2667,24 @@ void readmenu(MYFILE *f, INT32 num) ...@@ -2642,6 +2667,24 @@ void readmenu(MYFILE *f, INT32 num)
sizeof menupres[num].musname, va("Menu %d: music", num)); sizeof menupres[num].musname, va("Menu %d: music", num));
titlechanged = true; titlechanged = true;
} }
#ifdef MUSICSLOT_COMPATIBILITY
else if (fastcmp(word, "MUSICSLOT"))
{
deh_warning("Menu %d: MUSICSLOT is deprecated, consider using MUSIC instead", num);
value = get_mus(word2, true);
if (value && value <= 1035)
snprintf(menupres[num].musname, 7, "%sM", G_BuildMapName(value));
else if (value && value <= 1050)
{
strncpy(menupres[num].musname, compat_special_music_slots[value - 1036], 6);
menupres[num].musname[6] = '\0';
}
else
menupres[num].musname[0] = 0; // becomes empty string
menupres[num].musname[6] = 0;
titlechanged = true;
}
#endif
else if (fastcmp(word, "MUSICTRACK")) else if (fastcmp(word, "MUSICTRACK"))
{ {
menupres[num].mustrack = ((UINT16)value - 1); menupres[num].mustrack = ((UINT16)value - 1);
...@@ -2801,27 +2844,27 @@ void readframe(MYFILE *f, INT32 num) ...@@ -2801,27 +2844,27 @@ void readframe(MYFILE *f, INT32 num)
if (fastcmp(word1, "SPRITENUMBER") || fastcmp(word1, "SPRITENAME")) if (fastcmp(word1, "SPRITENUMBER") || fastcmp(word1, "SPRITENAME"))
{ {
states[num].sprite = get_sprite(word2); states[num]->sprite = get_sprite(word2);
} }
else if (fastcmp(word1, "SPRITESUBNUMBER") || fastcmp(word1, "SPRITEFRAME")) else if (fastcmp(word1, "SPRITESUBNUMBER") || fastcmp(word1, "SPRITEFRAME"))
{ {
states[num].frame = (INT32)get_number(word2); // So the FF_ flags get calculated states[num]->frame = (INT32)get_number(word2); // So the FF_ flags get calculated
} }
else if (fastcmp(word1, "DURATION")) else if (fastcmp(word1, "DURATION"))
{ {
states[num].tics = (INT32)get_number(word2); // So TICRATE can be used states[num]->tics = (INT32)get_number(word2); // So TICRATE can be used
} }
else if (fastcmp(word1, "NEXT")) else if (fastcmp(word1, "NEXT"))
{ {
states[num].nextstate = get_state(word2); states[num]->nextstate = get_state(word2);
} }
else if (fastcmp(word1, "VAR1")) else if (fastcmp(word1, "VAR1"))
{ {
states[num].var1 = (INT32)get_number(word2); states[num]->var1 = (INT32)get_number(word2);
} }
else if (fastcmp(word1, "VAR2")) else if (fastcmp(word1, "VAR2"))
{ {
states[num].var2 = (INT32)get_number(word2); states[num]->var2 = (INT32)get_number(word2);
} }
else if (fastcmp(word1, "ACTION")) else if (fastcmp(word1, "ACTION"))
{ {
...@@ -2844,20 +2887,20 @@ void readframe(MYFILE *f, INT32 num) ...@@ -2844,20 +2887,20 @@ void readframe(MYFILE *f, INT32 num)
for (z = 0; actionpointers[z].name; z++) for (z = 0; actionpointers[z].name; z++)
{ {
if (actionpointers[z].action.acv == states[num].action.acv) if (actionpointers[z].action.acv == states[num]->action.acv)
break; break;
} }
z = 0; z = 0;
found = LUA_SetLuaAction(&states[num], actiontocompare); found = LUA_SetLuaAction(states[num], actiontocompare);
if (!found) if (!found)
while (actionpointers[z].name) while (actionpointers[z].name)
{ {
if (fastcmp(actiontocompare, actionpointers[z].name)) if (fastcmp(actiontocompare, actionpointers[z].name))
{ {
states[num].action = actionpointers[z].action; states[num]->action = actionpointers[z].action;
states[num].action.acv = actionpointers[z].action.acv; // assign states[num]->action.acv = actionpointers[z].action.acv; // assign
states[num].action.acp1 = actionpointers[z].action.acp1; states[num]->action.acp1 = actionpointers[z].action.acp1;
found = true; found = true;
break; break;
} }
...@@ -2920,20 +2963,20 @@ void readsound(MYFILE *f, INT32 num) ...@@ -2920,20 +2963,20 @@ void readsound(MYFILE *f, INT32 num)
if (fastcmp(word, "SINGULAR")) if (fastcmp(word, "SINGULAR"))
{ {
S_sfx[num].singularity = value; S_sfx[num]->singularity = value;
} }
else if (fastcmp(word, "PRIORITY")) else if (fastcmp(word, "PRIORITY"))
{ {
S_sfx[num].priority = value; S_sfx[num]->priority = value;
} }
else if (fastcmp(word, "FLAGS")) else if (fastcmp(word, "FLAGS"))
{ {
S_sfx[num].pitch = value; S_sfx[num]->pitch = value;
} }
else if (fastcmp(word, "CAPTION") || fastcmp(word, "DESCRIPTION")) else if (fastcmp(word, "CAPTION") || fastcmp(word, "DESCRIPTION"))
{ {
deh_strlcpy(S_sfx[num].caption, word2, deh_strlcpy(S_sfx[num]->caption, word2,
sizeof(S_sfx[num].caption), va("Sound effect %d: caption", num)); sizeof(S_sfx[num]->caption), va("Sound effect %d: caption", num));
} }
else else
deh_warning("Sound %d : unknown word '%s'",num,word); deh_warning("Sound %d : unknown word '%s'",num,word);
...@@ -4153,40 +4196,32 @@ void readwipes(MYFILE *f) ...@@ -4153,40 +4196,32 @@ void readwipes(MYFILE *f)
mobjtype_t get_mobjtype(const char *word) mobjtype_t get_mobjtype(const char *word)
{ // Returns the value of MT_ enumerations { // Returns the value of MT_ enumerations
mobjtype_t i; UINT32 i;
if (*word >= '0' && *word <= '9') if (*word >= '0' && *word <= '9')
return atoi(word); return atoi(word);
if (fastncmp("MT_",word,3)) if (fastncmp("MT_",word,3))
word += 3; // take off the MT_ word += 3; // take off the MT_
for (i = 0; i < NUMMOBJFREESLOTS; i++) { for (i = 0; i < nummobjinfo; i++)
if (!FREE_MOBJS[i]) {
break; if (fastcmp(word, mobjinfo[i]->name))
if (fastcmp(word, FREE_MOBJS[i]))
return MT_FIRSTFREESLOT+i;
}
for (i = 0; i < MT_FIRSTFREESLOT; i++)
if (fastcmp(word, MOBJTYPE_LIST[i]+3))
return i; return i;
}
deh_warning("Couldn't find mobjtype named 'MT_%s'",word); deh_warning("Couldn't find mobjtype named 'MT_%s'",word);
return MT_NULL; return MT_NULL;
} }
statenum_t get_state(const char *word) statenum_t get_state(const char *word)
{ // Returns the value of S_ enumerations { // Returns the value of S_ enumerations
statenum_t i; UINT32 i;
if (*word >= '0' && *word <= '9') if (*word >= '0' && *word <= '9')
return atoi(word); return atoi(word);
if (fastncmp("S_",word,2)) if (fastncmp("S_",word,2))
word += 2; // take off the S_ word += 2; // take off the S_
for (i = 0; i < NUMSTATEFREESLOTS; i++) { for (i = 0; i < numstates; i++)
if (!FREE_STATES[i]) {
break; if (fastcmp(word, states[i]->name))
if (fastcmp(word, FREE_STATES[i]))
return S_FIRSTFREESLOT+i;
}
for (i = 0; i < S_FIRSTFREESLOT; i++)
if (fastcmp(word, STATE_LIST[i]+2))
return i; return i;
}
deh_warning("Couldn't find state named 'S_%s'",word); deh_warning("Couldn't find state named 'S_%s'",word);
return S_NULL; return S_NULL;
} }
...@@ -4219,7 +4254,7 @@ spritenum_t get_sprite(const char *word) ...@@ -4219,7 +4254,7 @@ spritenum_t get_sprite(const char *word)
if (fastncmp("SPR_",word,4)) if (fastncmp("SPR_",word,4))
word += 4; // take off the SPR_ word += 4; // take off the SPR_
i = R_GetSpriteNumByName(word); i = R_GetSpriteNumByName(word);
if (i != NUMSPRITES) if (i != numspriteinfo)
return i; return i;
deh_warning("Couldn't find sprite named 'SPR_%s'",word); deh_warning("Couldn't find sprite named 'SPR_%s'",word);
return SPR_NULL; return SPR_NULL;
...@@ -4232,8 +4267,8 @@ playersprite_t get_sprite2(const char *word) ...@@ -4232,8 +4267,8 @@ playersprite_t get_sprite2(const char *word)
return atoi(word); return atoi(word);
if (fastncmp("SPR2_",word,5)) if (fastncmp("SPR2_",word,5))
word += 5; // take off the SPR2_ word += 5; // take off the SPR2_
for (i = 0; i < NUMPLAYERSPRITES; i++) for (i = 0; i < numplayersprites; i++)
if (!spr2names[i][4] && memcmp(word,spr2names[i],4)==0) if (!playersprites[i]->name[4] && memcmp(word,playersprites[i]->name,4)==0)
return i; return i;
deh_warning("Couldn't find sprite named 'SPR2_%s'",word); deh_warning("Couldn't find sprite named 'SPR2_%s'",word);
return SPR2_STND; return SPR2_STND;
...@@ -4248,13 +4283,53 @@ sfxenum_t get_sfx(const char *word) ...@@ -4248,13 +4283,53 @@ sfxenum_t get_sfx(const char *word)
word += 4; // take off the SFX_ word += 4; // take off the SFX_
else if (fastncmp("DS",word,2)) else if (fastncmp("DS",word,2))
word += 2; // take off the DS word += 2; // take off the DS
for (i = 0; i < NUMSFX; i++) for (i = 0; i < S_numsfx; i++)
if (S_sfx[i].name && fasticmp(word, S_sfx[i].name)) if (S_sfx[i]->name && fasticmp(word, S_sfx[i]->name))
return i; return i;
deh_warning("Couldn't find sfx named 'SFX_%s'",word); deh_warning("Couldn't find sfx named 'SFX_%s'",word);
return sfx_None; return sfx_None;
} }
#ifdef MUSICSLOT_COMPATIBILITY
UINT16 get_mus(const char *word, UINT8 dehacked_mode)
{ // Returns the value of MUS_ enumerations
UINT16 i;
char lumptmp[4];
if (*word >= '0' && *word <= '9')
return atoi(word);
if (!word[2] && toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
return (UINT16)M_MapNumber(word[0], word[1]);
if (fastncmp("MUS_",word,4))
word += 4; // take off the MUS_
else if (fastncmp("O_",word,2) || fastncmp("D_",word,2))
word += 2; // take off the O_ or D_
strncpy(lumptmp, word, 4);
lumptmp[3] = 0;
if (fasticmp("MAP",lumptmp))
{
word += 3;
if (toupper(word[0]) >= 'A' && toupper(word[0]) <= 'Z')
return (UINT16)M_MapNumber(word[0], word[1]);
else if ((i = atoi(word)))
return i;
word -= 3;
if (dehacked_mode)
deh_warning("Couldn't find music named 'MUS_%s'",word);
return 0;
}
for (i = 0; compat_special_music_slots[i][0]; ++i)
if (fasticmp(word, compat_special_music_slots[i]))
return i + 1036;
if (dehacked_mode)
deh_warning("Couldn't find music named 'MUS_%s'",word);
return 0;
}
#endif
hudnum_t get_huditem(const char *word) hudnum_t get_huditem(const char *word)
{ // Returns the value of HUD_ enumerations { // Returns the value of HUD_ enumerations
hudnum_t i; hudnum_t i;
...@@ -4485,6 +4560,13 @@ static fixed_t find_const(const char **rword) ...@@ -4485,6 +4560,13 @@ static fixed_t find_const(const char **rword)
free(word); free(word);
return r; return r;
} }
#ifdef MUSICSLOT_COMPATIBILITY
else if (fastncmp("MUS_",word,4) || fastncmp("O_",word,2)) {
r = get_mus(word, true);
free(word);
return r;
}
#endif
else if (fastncmp("PW_",word,3)) { else if (fastncmp("PW_",word,3)) {
r = get_power(word); r = get_power(word);
free(word); free(word);
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#include "info.h" #include "info.h"
#include "dehacked.h" #include "dehacked.h"
#include "doomdef.h" // HWRENDER #include "doomdef.h" // MUSICSLOT_COMPATIBILITY, HWRENDER
// Crazy word-reading stuff // Crazy word-reading stuff
/// \todo Put these in a seperate file or something. /// \todo Put these in a seperate file or something.
...@@ -52,6 +52,9 @@ statenum_t get_state(const char *word); ...@@ -52,6 +52,9 @@ statenum_t get_state(const char *word);
spritenum_t get_sprite(const char *word); spritenum_t get_sprite(const char *word);
playersprite_t get_sprite2(const char *word); playersprite_t get_sprite2(const char *word);
sfxenum_t get_sfx(const char *word); sfxenum_t get_sfx(const char *word);
#ifdef MUSICSLOT_COMPATIBILITY
UINT16 get_mus(const char *word, UINT8 dehacked_mode);
#endif
hudnum_t get_huditem(const char *word); hudnum_t get_huditem(const char *word);
menutype_t get_menutype(const char *word); menutype_t get_menutype(const char *word);
//INT16 get_gametype(const char *word); //INT16 get_gametype(const char *word);
......
...@@ -28,8 +28,6 @@ ...@@ -28,8 +28,6 @@
#include "deh_tables.h" #include "deh_tables.h"
char *FREE_STATES[NUMSTATEFREESLOTS];
char *FREE_MOBJS[NUMMOBJFREESLOTS];
char *FREE_SKINCOLORS[NUMCOLORFREESLOTS]; char *FREE_SKINCOLORS[NUMCOLORFREESLOTS];
bitarray_t used_spr[BIT_ARRAY_SIZE(NUMSPRITEFREESLOTS)]; // Sprite freeslots in use bitarray_t used_spr[BIT_ARRAY_SIZE(NUMSPRITEFREESLOTS)]; // Sprite freeslots in use
...@@ -347,4012 +345,6 @@ actionpointer_t actionpointers[] = ...@@ -347,4012 +345,6 @@ actionpointer_t actionpointers[] =
{{NULL}, NULL}, {{NULL}, NULL},
}; };
////////////////////////////////////////////////////////////////////////////////
// CRAZY LIST OF STATE NAMES AND ALL FROM HERE DOWN
// TODO: Make this all a seperate file or something, like part of info.c??
// TODO: Read the list from a text lump in a WAD as necessary instead
// or something, don't just keep it all in memory like this.
// TODO: Make the lists public so we can start using actual mobj
// and state names in warning and error messages! :D
// RegEx to generate this from info.h: ^\tS_([^,]+), --> \t"S_\1",
// I am leaving the prefixes solely for clarity to programmers,
// because sadly no one remembers this place while searching for full state names.
const char *const STATE_LIST[] = { // array length left dynamic for sanity testing later.
"S_NULL",
"S_UNKNOWN",
"S_INVISIBLE", // state for invisible sprite
"S_SPAWNSTATE",
"S_SEESTATE",
"S_MELEESTATE",
"S_MISSILESTATE",
"S_DEATHSTATE",
"S_XDEATHSTATE",
"S_RAISESTATE",
// Thok
"S_THOK",
// Player
"S_PLAY_STND",
"S_PLAY_WAIT",
"S_PLAY_WALK",
"S_PLAY_SKID",
"S_PLAY_RUN",
"S_PLAY_DASH",
"S_PLAY_PAIN",
"S_PLAY_STUN",
"S_PLAY_DEAD",
"S_PLAY_DRWN",
"S_PLAY_ROLL",
"S_PLAY_GASP",
"S_PLAY_JUMP",
"S_PLAY_SPRING",
"S_PLAY_FALL",
"S_PLAY_EDGE",
"S_PLAY_RIDE",
// CA2_SPINDASH
"S_PLAY_SPINDASH",
// CA_FLY/SWIM
"S_PLAY_FLY",
"S_PLAY_SWIM",
"S_PLAY_FLY_TIRED",
// CA_GLIDEANDCLIMB
"S_PLAY_GLIDE",
"S_PLAY_GLIDE_LANDING",
"S_PLAY_CLING",
"S_PLAY_CLIMB",
// CA_FLOAT/CA_SLOWFALL
"S_PLAY_FLOAT",
"S_PLAY_FLOAT_RUN",
// CA_BOUNCE
"S_PLAY_BOUNCE",
"S_PLAY_BOUNCE_LANDING",
// CA2_GUNSLINGER
"S_PLAY_FIRE",
"S_PLAY_FIRE_FINISH",
// CA_TWINSPIN
"S_PLAY_TWINSPIN",
// CA2_MELEE
"S_PLAY_MELEE",
"S_PLAY_MELEE_FINISH",
"S_PLAY_MELEE_LANDING",
// SF_SUPER
"S_PLAY_SUPER_TRANS1",
"S_PLAY_SUPER_TRANS2",
"S_PLAY_SUPER_TRANS3",
"S_PLAY_SUPER_TRANS4",
"S_PLAY_SUPER_TRANS5",
"S_PLAY_SUPER_TRANS6",
// technically the player goes here but it's an infinite tic state
"S_OBJPLACE_DUMMY",
// 1-Up Box Sprites overlay (uses player sprite)
"S_PLAY_BOX1",
"S_PLAY_BOX2",
"S_PLAY_ICON1",
"S_PLAY_ICON2",
"S_PLAY_ICON3",
// Level end sign overlay (uses player sprite)
"S_PLAY_SIGN",
// NiGHTS character (uses player sprite)
"S_PLAY_NIGHTS_TRANS1",
"S_PLAY_NIGHTS_TRANS2",
"S_PLAY_NIGHTS_TRANS3",
"S_PLAY_NIGHTS_TRANS4",
"S_PLAY_NIGHTS_TRANS5",
"S_PLAY_NIGHTS_TRANS6",
"S_PLAY_NIGHTS_STAND",
"S_PLAY_NIGHTS_FLOAT",
"S_PLAY_NIGHTS_FLY",
"S_PLAY_NIGHTS_DRILL",
"S_PLAY_NIGHTS_STUN",
"S_PLAY_NIGHTS_PULL",
"S_PLAY_NIGHTS_ATTACK",
// c:
"S_TAILSOVERLAY_STAND",
"S_TAILSOVERLAY_0DEGREES",
"S_TAILSOVERLAY_PLUS30DEGREES",
"S_TAILSOVERLAY_PLUS60DEGREES",
"S_TAILSOVERLAY_MINUS30DEGREES",
"S_TAILSOVERLAY_MINUS60DEGREES",
"S_TAILSOVERLAY_RUN",
"S_TAILSOVERLAY_FLY",
"S_TAILSOVERLAY_TIRE",
"S_TAILSOVERLAY_PAIN",
"S_TAILSOVERLAY_GASP",
"S_TAILSOVERLAY_EDGE",
"S_TAILSOVERLAY_DASH",
// [:
"S_JETFUMEFLASH",
// Blue Crawla
"S_POSS_STND",
"S_POSS_RUN1",
"S_POSS_RUN2",
"S_POSS_RUN3",
"S_POSS_RUN4",
"S_POSS_RUN5",
"S_POSS_RUN6",
// Red Crawla
"S_SPOS_STND",
"S_SPOS_RUN1",
"S_SPOS_RUN2",
"S_SPOS_RUN3",
"S_SPOS_RUN4",
"S_SPOS_RUN5",
"S_SPOS_RUN6",
// Greenflower Fish
"S_FISH1",
"S_FISH2",
"S_FISH3",
"S_FISH4",
// Buzz (Gold)
"S_BUZZLOOK1",
"S_BUZZLOOK2",
"S_BUZZFLY1",
"S_BUZZFLY2",
// Buzz (Red)
"S_RBUZZLOOK1",
"S_RBUZZLOOK2",
"S_RBUZZFLY1",
"S_RBUZZFLY2",
// Jetty-Syn Bomber
"S_JETBLOOK1",
"S_JETBLOOK2",
"S_JETBZOOM1",
"S_JETBZOOM2",
// Jetty-Syn Gunner
"S_JETGLOOK1",
"S_JETGLOOK2",
"S_JETGZOOM1",
"S_JETGZOOM2",
"S_JETGSHOOT1",
"S_JETGSHOOT2",
// Crawla Commander
"S_CCOMMAND1",
"S_CCOMMAND2",
"S_CCOMMAND3",
"S_CCOMMAND4",
// Deton
"S_DETON1",
"S_DETON2",
"S_DETON3",
"S_DETON4",
"S_DETON5",
"S_DETON6",
"S_DETON7",
"S_DETON8",
"S_DETON9",
"S_DETON10",
"S_DETON11",
"S_DETON12",
"S_DETON13",
"S_DETON14",
"S_DETON15",
// Skim Mine Dropper
"S_SKIM1",
"S_SKIM2",
"S_SKIM3",
"S_SKIM4",
// THZ Turret
"S_TURRET",
"S_TURRETFIRE",
"S_TURRETSHOCK1",
"S_TURRETSHOCK2",
"S_TURRETSHOCK3",
"S_TURRETSHOCK4",
"S_TURRETSHOCK5",
"S_TURRETSHOCK6",
"S_TURRETSHOCK7",
"S_TURRETSHOCK8",
"S_TURRETSHOCK9",
// Popup Turret
"S_TURRETLOOK",
"S_TURRETSEE",
"S_TURRETPOPUP1",
"S_TURRETPOPUP2",
"S_TURRETPOPUP3",
"S_TURRETPOPUP4",
"S_TURRETPOPUP5",
"S_TURRETPOPUP6",
"S_TURRETPOPUP7",
"S_TURRETPOPUP8",
"S_TURRETSHOOT",
"S_TURRETPOPDOWN1",
"S_TURRETPOPDOWN2",
"S_TURRETPOPDOWN3",
"S_TURRETPOPDOWN4",
"S_TURRETPOPDOWN5",
"S_TURRETPOPDOWN6",
"S_TURRETPOPDOWN7",
"S_TURRETPOPDOWN8",
// Spincushion
"S_SPINCUSHION_LOOK",
"S_SPINCUSHION_CHASE1",
"S_SPINCUSHION_CHASE2",
"S_SPINCUSHION_CHASE3",
"S_SPINCUSHION_CHASE4",
"S_SPINCUSHION_AIM1",
"S_SPINCUSHION_AIM2",
"S_SPINCUSHION_AIM3",
"S_SPINCUSHION_AIM4",
"S_SPINCUSHION_AIM5",
"S_SPINCUSHION_SPIN1",
"S_SPINCUSHION_SPIN2",
"S_SPINCUSHION_SPIN3",
"S_SPINCUSHION_SPIN4",
"S_SPINCUSHION_STOP1",
"S_SPINCUSHION_STOP2",
"S_SPINCUSHION_STOP3",
"S_SPINCUSHION_STOP4",
// Crushstacean
"S_CRUSHSTACEAN_ROAM1",
"S_CRUSHSTACEAN_ROAM2",
"S_CRUSHSTACEAN_ROAM3",
"S_CRUSHSTACEAN_ROAM4",
"S_CRUSHSTACEAN_ROAMPAUSE",
"S_CRUSHSTACEAN_PUNCH1",
"S_CRUSHSTACEAN_PUNCH2",
"S_CRUSHCLAW_AIM",
"S_CRUSHCLAW_OUT",
"S_CRUSHCLAW_STAY",
"S_CRUSHCLAW_IN",
"S_CRUSHCLAW_WAIT",
"S_CRUSHCHAIN",
// Banpyura
"S_BANPYURA_ROAM1",
"S_BANPYURA_ROAM2",
"S_BANPYURA_ROAM3",
"S_BANPYURA_ROAM4",
"S_BANPYURA_ROAMPAUSE",
"S_CDIAG1",
"S_CDIAG2",
"S_CDIAG3",
"S_CDIAG4",
"S_CDIAG5",
"S_CDIAG6",
"S_CDIAG7",
"S_CDIAG8",
// Jet Jaw
"S_JETJAW_ROAM1",
"S_JETJAW_ROAM2",
"S_JETJAW_ROAM3",
"S_JETJAW_ROAM4",
"S_JETJAW_ROAM5",
"S_JETJAW_ROAM6",
"S_JETJAW_ROAM7",
"S_JETJAW_ROAM8",
"S_JETJAW_CHOMP1",
"S_JETJAW_CHOMP2",
"S_JETJAW_CHOMP3",
"S_JETJAW_CHOMP4",
"S_JETJAW_CHOMP5",
"S_JETJAW_CHOMP6",
"S_JETJAW_CHOMP7",
"S_JETJAW_CHOMP8",
"S_JETJAW_CHOMP9",
"S_JETJAW_CHOMP10",
"S_JETJAW_CHOMP11",
"S_JETJAW_CHOMP12",
"S_JETJAW_CHOMP13",
"S_JETJAW_CHOMP14",
"S_JETJAW_CHOMP15",
"S_JETJAW_CHOMP16",
"S_JETJAW_SOUND",
// Snailer
"S_SNAILER1",
"S_SNAILER_FLICKY",
// Vulture
"S_VULTURE_STND",
"S_VULTURE_DRIFT",
"S_VULTURE_ZOOM1",
"S_VULTURE_ZOOM2",
"S_VULTURE_STUNNED",
// Pointy
"S_POINTY1",
"S_POINTYBALL1",
// Robo-Hood
"S_ROBOHOOD_LOOK",
"S_ROBOHOOD_STAND",
"S_ROBOHOOD_FIRE1",
"S_ROBOHOOD_FIRE2",
"S_ROBOHOOD_JUMP1",
"S_ROBOHOOD_JUMP2",
"S_ROBOHOOD_JUMP3",
// Castlebot Facestabber
"S_FACESTABBER_STND1",
"S_FACESTABBER_STND2",
"S_FACESTABBER_STND3",
"S_FACESTABBER_STND4",
"S_FACESTABBER_STND5",
"S_FACESTABBER_STND6",
"S_FACESTABBER_CHARGE1",
"S_FACESTABBER_CHARGE2",
"S_FACESTABBER_CHARGE3",
"S_FACESTABBER_CHARGE4",
"S_FACESTABBER_PAIN",
"S_FACESTABBER_DIE1",
"S_FACESTABBER_DIE2",
"S_FACESTABBER_DIE3",
"S_FACESTABBERSPEAR",
// Egg Guard
"S_EGGGUARD_STND",
"S_EGGGUARD_WALK1",
"S_EGGGUARD_WALK2",
"S_EGGGUARD_WALK3",
"S_EGGGUARD_WALK4",
"S_EGGGUARD_MAD1",
"S_EGGGUARD_MAD2",
"S_EGGGUARD_MAD3",
"S_EGGGUARD_RUN1",
"S_EGGGUARD_RUN2",
"S_EGGGUARD_RUN3",
"S_EGGGUARD_RUN4",
// Egg Shield for Egg Guard
"S_EGGSHIELD",
"S_EGGSHIELDBREAK",
// Green Snapper
"S_SNAPPER_SPAWN",
"S_SNAPPER_SPAWN2",
"S_GSNAPPER_STND",
"S_GSNAPPER1",
"S_GSNAPPER2",
"S_GSNAPPER3",
"S_GSNAPPER4",
"S_SNAPPER_XPLD",
"S_SNAPPER_LEG",
"S_SNAPPER_LEGRAISE",
"S_SNAPPER_HEAD",
// Minus
"S_MINUS_INIT",
"S_MINUS_STND",
"S_MINUS_DIGGING1",
"S_MINUS_DIGGING2",
"S_MINUS_DIGGING3",
"S_MINUS_DIGGING4",
"S_MINUS_BURST0",
"S_MINUS_BURST1",
"S_MINUS_BURST2",
"S_MINUS_BURST3",
"S_MINUS_BURST4",
"S_MINUS_BURST5",
"S_MINUS_POPUP",
"S_MINUS_AERIAL1",
"S_MINUS_AERIAL2",
"S_MINUS_AERIAL3",
"S_MINUS_AERIAL4",
// Minus dirt
"S_MINUSDIRT1",
"S_MINUSDIRT2",
"S_MINUSDIRT3",
"S_MINUSDIRT4",
"S_MINUSDIRT5",
"S_MINUSDIRT6",
"S_MINUSDIRT7",
// Spring Shell
"S_SSHELL_STND",
"S_SSHELL_RUN1",
"S_SSHELL_RUN2",
"S_SSHELL_RUN3",
"S_SSHELL_RUN4",
"S_SSHELL_SPRING1",
"S_SSHELL_SPRING2",
"S_SSHELL_SPRING3",
"S_SSHELL_SPRING4",
// Spring Shell (yellow)
"S_YSHELL_STND",
"S_YSHELL_RUN1",
"S_YSHELL_RUN2",
"S_YSHELL_RUN3",
"S_YSHELL_RUN4",
"S_YSHELL_SPRING1",
"S_YSHELL_SPRING2",
"S_YSHELL_SPRING3",
"S_YSHELL_SPRING4",
// Unidus
"S_UNIDUS_STND",
"S_UNIDUS_RUN",
"S_UNIDUS_BALL",
// Canarivore
"S_CANARIVORE_LOOK",
"S_CANARIVORE_AWAKEN1",
"S_CANARIVORE_AWAKEN2",
"S_CANARIVORE_AWAKEN3",
"S_CANARIVORE_GAS1",
"S_CANARIVORE_GAS2",
"S_CANARIVORE_GAS3",
"S_CANARIVORE_GAS4",
"S_CANARIVORE_GAS5",
"S_CANARIVORE_GASREPEAT",
"S_CANARIVORE_CLOSE1",
"S_CANARIVORE_CLOSE2",
"S_CANARIVOREGAS_1",
"S_CANARIVOREGAS_2",
"S_CANARIVOREGAS_3",
"S_CANARIVOREGAS_4",
"S_CANARIVOREGAS_5",
"S_CANARIVOREGAS_6",
"S_CANARIVOREGAS_7",
"S_CANARIVOREGAS_8",
// Pyre Fly
"S_PYREFLY_FLY",
"S_PYREFLY_BURN",
"S_PYREFIRE1",
"S_PYREFIRE2",
// Pterabyte
"S_PTERABYTESPAWNER",
"S_PTERABYTEWAYPOINT",
"S_PTERABYTE_FLY1",
"S_PTERABYTE_FLY2",
"S_PTERABYTE_FLY3",
"S_PTERABYTE_FLY4",
"S_PTERABYTE_SWOOPDOWN",
"S_PTERABYTE_SWOOPUP",
// Dragonbomber
"S_DRAGONBOMBER",
"S_DRAGONWING1",
"S_DRAGONWING2",
"S_DRAGONWING3",
"S_DRAGONWING4",
"S_DRAGONTAIL_LOADED",
"S_DRAGONTAIL_EMPTY",
"S_DRAGONTAIL_EMPTYLOOP",
"S_DRAGONTAIL_RELOAD",
"S_DRAGONMINE",
"S_DRAGONMINE_LAND1",
"S_DRAGONMINE_LAND2",
"S_DRAGONMINE_SLOWFLASH1",
"S_DRAGONMINE_SLOWFLASH2",
"S_DRAGONMINE_SLOWLOOP",
"S_DRAGONMINE_FASTFLASH1",
"S_DRAGONMINE_FASTFLASH2",
"S_DRAGONMINE_FASTLOOP",
// Boss Explosion
"S_BOSSEXPLODE",
// S3&K Boss Explosion
"S_SONIC3KBOSSEXPLOSION1",
"S_SONIC3KBOSSEXPLOSION2",
"S_SONIC3KBOSSEXPLOSION3",
"S_SONIC3KBOSSEXPLOSION4",
"S_SONIC3KBOSSEXPLOSION5",
"S_SONIC3KBOSSEXPLOSION6",
"S_JETFUME1",
// Boss 1
"S_EGGMOBILE_STND",
"S_EGGMOBILE_ROFL",
"S_EGGMOBILE_LATK1",
"S_EGGMOBILE_LATK2",
"S_EGGMOBILE_LATK3",
"S_EGGMOBILE_LATK4",
"S_EGGMOBILE_LATK5",
"S_EGGMOBILE_LATK6",
"S_EGGMOBILE_LATK7",
"S_EGGMOBILE_LATK8",
"S_EGGMOBILE_LATK9",
"S_EGGMOBILE_RATK1",
"S_EGGMOBILE_RATK2",
"S_EGGMOBILE_RATK3",
"S_EGGMOBILE_RATK4",
"S_EGGMOBILE_RATK5",
"S_EGGMOBILE_RATK6",
"S_EGGMOBILE_RATK7",
"S_EGGMOBILE_RATK8",
"S_EGGMOBILE_RATK9",
"S_EGGMOBILE_PANIC1",
"S_EGGMOBILE_PANIC2",
"S_EGGMOBILE_PANIC3",
"S_EGGMOBILE_PANIC4",
"S_EGGMOBILE_PANIC5",
"S_EGGMOBILE_PANIC6",
"S_EGGMOBILE_PANIC7",
"S_EGGMOBILE_PANIC8",
"S_EGGMOBILE_PANIC9",
"S_EGGMOBILE_PANIC10",
"S_EGGMOBILE_PANIC11",
"S_EGGMOBILE_PANIC12",
"S_EGGMOBILE_PANIC13",
"S_EGGMOBILE_PANIC14",
"S_EGGMOBILE_PANIC15",
"S_EGGMOBILE_PAIN",
"S_EGGMOBILE_PAIN2",
"S_EGGMOBILE_DIE1",
"S_EGGMOBILE_DIE2",
"S_EGGMOBILE_DIE3",
"S_EGGMOBILE_DIE4",
"S_EGGMOBILE_FLEE1",
"S_EGGMOBILE_FLEE2",
"S_EGGMOBILE_BALL",
"S_EGGMOBILE_TARGET",
"S_BOSSEGLZ1",
"S_BOSSEGLZ2",
// Boss 2
"S_EGGMOBILE2_STND",
"S_EGGMOBILE2_POGO1",
"S_EGGMOBILE2_POGO2",
"S_EGGMOBILE2_POGO3",
"S_EGGMOBILE2_POGO4",
"S_EGGMOBILE2_POGO5",
"S_EGGMOBILE2_POGO6",
"S_EGGMOBILE2_POGO7",
"S_EGGMOBILE2_PAIN",
"S_EGGMOBILE2_PAIN2",
"S_EGGMOBILE2_DIE1",
"S_EGGMOBILE2_DIE2",
"S_EGGMOBILE2_DIE3",
"S_EGGMOBILE2_DIE4",
"S_EGGMOBILE2_FLEE1",
"S_EGGMOBILE2_FLEE2",
"S_BOSSTANK1",
"S_BOSSTANK2",
"S_BOSSSPIGOT",
// Boss 2 Goop
"S_GOOP1",
"S_GOOP2",
"S_GOOP3",
"S_GOOPTRAIL",
// Boss 3
"S_EGGMOBILE3_STND",
"S_EGGMOBILE3_SHOCK",
"S_EGGMOBILE3_ATK1",
"S_EGGMOBILE3_ATK2",
"S_EGGMOBILE3_ATK3A",
"S_EGGMOBILE3_ATK3B",
"S_EGGMOBILE3_ATK3C",
"S_EGGMOBILE3_ATK3D",
"S_EGGMOBILE3_ATK4",
"S_EGGMOBILE3_ATK5",
"S_EGGMOBILE3_ROFL",
"S_EGGMOBILE3_PAIN",
"S_EGGMOBILE3_PAIN2",
"S_EGGMOBILE3_DIE1",
"S_EGGMOBILE3_DIE2",
"S_EGGMOBILE3_DIE3",
"S_EGGMOBILE3_DIE4",
"S_EGGMOBILE3_FLEE1",
"S_EGGMOBILE3_FLEE2",
// Boss 3 Pinch
"S_FAKEMOBILE_INIT",
"S_FAKEMOBILE",
"S_FAKEMOBILE_ATK1",
"S_FAKEMOBILE_ATK2",
"S_FAKEMOBILE_ATK3A",
"S_FAKEMOBILE_ATK3B",
"S_FAKEMOBILE_ATK3C",
"S_FAKEMOBILE_ATK3D",
"S_FAKEMOBILE_DIE1",
"S_FAKEMOBILE_DIE2",
"S_BOSSSEBH1",
"S_BOSSSEBH2",
// Boss 3 Shockwave
"S_SHOCKWAVE1",
"S_SHOCKWAVE2",
// Boss 4
"S_EGGMOBILE4_STND",
"S_EGGMOBILE4_LATK1",
"S_EGGMOBILE4_LATK2",
"S_EGGMOBILE4_LATK3",
"S_EGGMOBILE4_LATK4",
"S_EGGMOBILE4_LATK5",
"S_EGGMOBILE4_LATK6",
"S_EGGMOBILE4_RATK1",
"S_EGGMOBILE4_RATK2",
"S_EGGMOBILE4_RATK3",
"S_EGGMOBILE4_RATK4",
"S_EGGMOBILE4_RATK5",
"S_EGGMOBILE4_RATK6",
"S_EGGMOBILE4_RAISE1",
"S_EGGMOBILE4_RAISE2",
"S_EGGMOBILE4_PAIN1",
"S_EGGMOBILE4_PAIN2",
"S_EGGMOBILE4_DIE1",
"S_EGGMOBILE4_DIE2",
"S_EGGMOBILE4_DIE3",
"S_EGGMOBILE4_DIE4",
"S_EGGMOBILE4_FLEE1",
"S_EGGMOBILE4_FLEE2",
"S_EGGMOBILE4_MACE",
"S_EGGMOBILE4_MACE_DIE1",
"S_EGGMOBILE4_MACE_DIE2",
"S_EGGMOBILE4_MACE_DIE3",
// Boss 4 jet flame
"S_JETFLAME",
// Boss 4 Spectator Eggrobo
"S_EGGROBO1_STND",
"S_EGGROBO1_BSLAP1",
"S_EGGROBO1_BSLAP2",
"S_EGGROBO1_PISSED",
// Boss 4 Spectator Eggrobo jet flame
"S_EGGROBOJET",
// Boss 5
"S_FANG_SETUP",
"S_FANG_INTRO0",
"S_FANG_INTRO1",
"S_FANG_INTRO2",
"S_FANG_INTRO3",
"S_FANG_INTRO4",
"S_FANG_INTRO5",
"S_FANG_INTRO6",
"S_FANG_INTRO7",
"S_FANG_INTRO8",
"S_FANG_INTRO9",
"S_FANG_INTRO10",
"S_FANG_INTRO11",
"S_FANG_INTRO12",
"S_FANG_CLONE1",
"S_FANG_CLONE2",
"S_FANG_CLONE3",
"S_FANG_CLONE4",
"S_FANG_IDLE0",
"S_FANG_IDLE1",
"S_FANG_IDLE2",
"S_FANG_IDLE3",
"S_FANG_IDLE4",
"S_FANG_IDLE5",
"S_FANG_IDLE6",
"S_FANG_IDLE7",
"S_FANG_IDLE8",
"S_FANG_PAIN1",
"S_FANG_PAIN2",
"S_FANG_PATHINGSTART1",
"S_FANG_PATHINGSTART2",
"S_FANG_PATHING",
"S_FANG_BOUNCE1",
"S_FANG_BOUNCE2",
"S_FANG_BOUNCE3",
"S_FANG_BOUNCE4",
"S_FANG_FALL1",
"S_FANG_FALL2",
"S_FANG_CHECKPATH1",
"S_FANG_CHECKPATH2",
"S_FANG_PATHINGCONT1",
"S_FANG_PATHINGCONT2",
"S_FANG_PATHINGCONT3",
"S_FANG_SKID1",
"S_FANG_SKID2",
"S_FANG_SKID3",
"S_FANG_CHOOSEATTACK",
"S_FANG_FIRESTART1",
"S_FANG_FIRESTART2",
"S_FANG_FIRE1",
"S_FANG_FIRE2",
"S_FANG_FIRE3",
"S_FANG_FIREREPEAT",
"S_FANG_LOBSHOT0",
"S_FANG_LOBSHOT1",
"S_FANG_LOBSHOT2",
"S_FANG_LOBSHOT3",
"S_FANG_WAIT1",
"S_FANG_WAIT2",
"S_FANG_WALLHIT",
"S_FANG_PINCHPATHINGSTART1",
"S_FANG_PINCHPATHINGSTART2",
"S_FANG_PINCHPATHING",
"S_FANG_PINCHBOUNCE0",
"S_FANG_PINCHBOUNCE1",
"S_FANG_PINCHBOUNCE2",
"S_FANG_PINCHBOUNCE3",
"S_FANG_PINCHBOUNCE4",
"S_FANG_PINCHFALL0",
"S_FANG_PINCHFALL1",
"S_FANG_PINCHFALL2",
"S_FANG_PINCHSKID1",
"S_FANG_PINCHSKID2",
"S_FANG_PINCHLOBSHOT0",
"S_FANG_PINCHLOBSHOT1",
"S_FANG_PINCHLOBSHOT2",
"S_FANG_PINCHLOBSHOT3",
"S_FANG_PINCHLOBSHOT4",
"S_FANG_PINCHLOBSHOT5",
"S_FANG_DIE1",
"S_FANG_DIE2",
"S_FANG_DIE3",
"S_FANG_DIE4",
"S_FANG_DIE5",
"S_FANG_DIE6",
"S_FANG_DIE7",
"S_FANG_DIE8",
"S_FANG_FLEEPATHING1",
"S_FANG_FLEEPATHING2",
"S_FANG_FLEEBOUNCE1",
"S_FANG_FLEEBOUNCE2",
"S_FANG_KO",
"S_BROKENROBOTRANDOM",
"S_BROKENROBOTA",
"S_BROKENROBOTB",
"S_BROKENROBOTC",
"S_BROKENROBOTD",
"S_BROKENROBOTE",
"S_BROKENROBOTF",
"S_ALART1",
"S_ALART2",
"S_VWREF",
"S_VWREB",
"S_PROJECTORLIGHT1",
"S_PROJECTORLIGHT2",
"S_PROJECTORLIGHT3",
"S_PROJECTORLIGHT4",
"S_PROJECTORLIGHT5",
"S_FBOMB1",
"S_FBOMB2",
"S_FBOMB_EXPL1",
"S_FBOMB_EXPL2",
"S_FBOMB_EXPL3",
"S_FBOMB_EXPL4",
"S_FBOMB_EXPL5",
"S_FBOMB_EXPL6",
"S_TNTDUST_1",
"S_TNTDUST_2",
"S_TNTDUST_3",
"S_TNTDUST_4",
"S_TNTDUST_5",
"S_TNTDUST_6",
"S_TNTDUST_7",
"S_TNTDUST_8",
"S_FSGNA",
"S_FSGNB",
"S_FSGNC",
"S_FSGND",
// Black Eggman (Boss 7)
"S_BLACKEGG_STND",
"S_BLACKEGG_STND2",
"S_BLACKEGG_WALK1",
"S_BLACKEGG_WALK2",
"S_BLACKEGG_WALK3",
"S_BLACKEGG_WALK4",
"S_BLACKEGG_WALK5",
"S_BLACKEGG_WALK6",
"S_BLACKEGG_SHOOT1",
"S_BLACKEGG_SHOOT2",
"S_BLACKEGG_PAIN1",
"S_BLACKEGG_PAIN2",
"S_BLACKEGG_PAIN3",
"S_BLACKEGG_PAIN4",
"S_BLACKEGG_PAIN5",
"S_BLACKEGG_PAIN6",
"S_BLACKEGG_PAIN7",
"S_BLACKEGG_PAIN8",
"S_BLACKEGG_PAIN9",
"S_BLACKEGG_PAIN10",
"S_BLACKEGG_PAIN11",
"S_BLACKEGG_PAIN12",
"S_BLACKEGG_PAIN13",
"S_BLACKEGG_PAIN14",
"S_BLACKEGG_PAIN15",
"S_BLACKEGG_PAIN16",
"S_BLACKEGG_PAIN17",
"S_BLACKEGG_PAIN18",
"S_BLACKEGG_PAIN19",
"S_BLACKEGG_PAIN20",
"S_BLACKEGG_PAIN21",
"S_BLACKEGG_PAIN22",
"S_BLACKEGG_PAIN23",
"S_BLACKEGG_PAIN24",
"S_BLACKEGG_PAIN25",
"S_BLACKEGG_PAIN26",
"S_BLACKEGG_PAIN27",
"S_BLACKEGG_PAIN28",
"S_BLACKEGG_PAIN29",
"S_BLACKEGG_PAIN30",
"S_BLACKEGG_PAIN31",
"S_BLACKEGG_PAIN32",
"S_BLACKEGG_PAIN33",
"S_BLACKEGG_PAIN34",
"S_BLACKEGG_PAIN35",
"S_BLACKEGG_HITFACE1",
"S_BLACKEGG_HITFACE2",
"S_BLACKEGG_HITFACE3",
"S_BLACKEGG_HITFACE4",
"S_BLACKEGG_DIE1",
"S_BLACKEGG_DIE2",
"S_BLACKEGG_DIE3",
"S_BLACKEGG_DIE4",
"S_BLACKEGG_DIE5",
"S_BLACKEGG_MISSILE1",
"S_BLACKEGG_MISSILE2",
"S_BLACKEGG_MISSILE3",
"S_BLACKEGG_GOOP",
"S_BLACKEGG_JUMP1",
"S_BLACKEGG_JUMP2",
"S_BLACKEGG_DESTROYPLAT1",
"S_BLACKEGG_DESTROYPLAT2",
"S_BLACKEGG_DESTROYPLAT3",
"S_BLACKEGG_HELPER", // Collision helper
"S_BLACKEGG_GOOP1",
"S_BLACKEGG_GOOP2",
"S_BLACKEGG_GOOP3",
"S_BLACKEGG_GOOP4",
"S_BLACKEGG_GOOP5",
"S_BLACKEGG_GOOP6",
"S_BLACKEGG_GOOP7",
"S_BLACKEGG_MISSILE",
// New Very-Last-Minute 2.1 Brak Eggman (Cy-Brak-demon)
"S_CYBRAKDEMON_IDLE",
"S_CYBRAKDEMON_WALK1",
"S_CYBRAKDEMON_WALK2",
"S_CYBRAKDEMON_WALK3",
"S_CYBRAKDEMON_WALK4",
"S_CYBRAKDEMON_WALK5",
"S_CYBRAKDEMON_WALK6",
"S_CYBRAKDEMON_CHOOSE_ATTACK1",
"S_CYBRAKDEMON_MISSILE_ATTACK1", // Aim
"S_CYBRAKDEMON_MISSILE_ATTACK2", // Fire
"S_CYBRAKDEMON_MISSILE_ATTACK3", // Aim
"S_CYBRAKDEMON_MISSILE_ATTACK4", // Fire
"S_CYBRAKDEMON_MISSILE_ATTACK5", // Aim
"S_CYBRAKDEMON_MISSILE_ATTACK6", // Fire
"S_CYBRAKDEMON_FLAME_ATTACK1", // Reset
"S_CYBRAKDEMON_FLAME_ATTACK2", // Aim
"S_CYBRAKDEMON_FLAME_ATTACK3", // Fire
"S_CYBRAKDEMON_FLAME_ATTACK4", // Loop
"S_CYBRAKDEMON_CHOOSE_ATTACK2",
"S_CYBRAKDEMON_VILE_ATTACK1",
"S_CYBRAKDEMON_VILE_ATTACK2",
"S_CYBRAKDEMON_VILE_ATTACK3",
"S_CYBRAKDEMON_VILE_ATTACK4",
"S_CYBRAKDEMON_VILE_ATTACK5",
"S_CYBRAKDEMON_VILE_ATTACK6",
"S_CYBRAKDEMON_NAPALM_ATTACK1",
"S_CYBRAKDEMON_NAPALM_ATTACK2",
"S_CYBRAKDEMON_NAPALM_ATTACK3",
"S_CYBRAKDEMON_FINISH_ATTACK1", // If just attacked, remove MF2_FRET w/out going back to spawnstate
"S_CYBRAKDEMON_FINISH_ATTACK2", // Force a delay between attacks so you don't get bombarded with them back-to-back
"S_CYBRAKDEMON_PAIN1",
"S_CYBRAKDEMON_PAIN2",
"S_CYBRAKDEMON_PAIN3",
"S_CYBRAKDEMON_DIE1",
"S_CYBRAKDEMON_DIE2",
"S_CYBRAKDEMON_DIE3",
"S_CYBRAKDEMON_DIE4",
"S_CYBRAKDEMON_DIE5",
"S_CYBRAKDEMON_DIE6",
"S_CYBRAKDEMON_DIE7",
"S_CYBRAKDEMON_DIE8",
"S_CYBRAKDEMON_DEINVINCIBLERIZE",
"S_CYBRAKDEMON_INVINCIBLERIZE",
"S_CYBRAKDEMONMISSILE",
"S_CYBRAKDEMONMISSILE_EXPLODE1",
"S_CYBRAKDEMONMISSILE_EXPLODE2",
"S_CYBRAKDEMONMISSILE_EXPLODE3",
"S_CYBRAKDEMONFLAMESHOT_FLY1",
"S_CYBRAKDEMONFLAMESHOT_FLY2",
"S_CYBRAKDEMONFLAMESHOT_FLY3",
"S_CYBRAKDEMONFLAMESHOT_DIE",
"S_CYBRAKDEMONFLAMEREST",
"S_CYBRAKDEMONELECTRICBARRIER_INIT1",
"S_CYBRAKDEMONELECTRICBARRIER_INIT2",
"S_CYBRAKDEMONELECTRICBARRIER_PLAYSOUND",
"S_CYBRAKDEMONELECTRICBARRIER1",
"S_CYBRAKDEMONELECTRICBARRIER2",
"S_CYBRAKDEMONELECTRICBARRIER3",
"S_CYBRAKDEMONELECTRICBARRIER4",
"S_CYBRAKDEMONELECTRICBARRIER5",
"S_CYBRAKDEMONELECTRICBARRIER6",
"S_CYBRAKDEMONELECTRICBARRIER7",
"S_CYBRAKDEMONELECTRICBARRIER8",
"S_CYBRAKDEMONELECTRICBARRIER9",
"S_CYBRAKDEMONELECTRICBARRIER10",
"S_CYBRAKDEMONELECTRICBARRIER11",
"S_CYBRAKDEMONELECTRICBARRIER12",
"S_CYBRAKDEMONELECTRICBARRIER13",
"S_CYBRAKDEMONELECTRICBARRIER14",
"S_CYBRAKDEMONELECTRICBARRIER15",
"S_CYBRAKDEMONELECTRICBARRIER16",
"S_CYBRAKDEMONELECTRICBARRIER17",
"S_CYBRAKDEMONELECTRICBARRIER18",
"S_CYBRAKDEMONELECTRICBARRIER19",
"S_CYBRAKDEMONELECTRICBARRIER20",
"S_CYBRAKDEMONELECTRICBARRIER21",
"S_CYBRAKDEMONELECTRICBARRIER22",
"S_CYBRAKDEMONELECTRICBARRIER23",
"S_CYBRAKDEMONELECTRICBARRIER24",
"S_CYBRAKDEMONELECTRICBARRIER_DIE1",
"S_CYBRAKDEMONELECTRICBARRIER_DIE2",
"S_CYBRAKDEMONELECTRICBARRIER_DIE3",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHECK",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMSUCCESS",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMCHOOSE",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM1",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM2",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM3",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM4",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM5",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM6",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM7",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM8",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM9",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM10",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM11",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOM12",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMFAIL",
"S_CYBRAKDEMONELECTRICBARRIER_SPARK_RANDOMLOOP",
"S_CYBRAKDEMONELECTRICBARRIER_REVIVE1",
"S_CYBRAKDEMONELECTRICBARRIER_REVIVE2",
"S_CYBRAKDEMONELECTRICBARRIER_REVIVE3",
"S_CYBRAKDEMONTARGETRETICULE1",
"S_CYBRAKDEMONTARGETRETICULE2",
"S_CYBRAKDEMONTARGETRETICULE3",
"S_CYBRAKDEMONTARGETRETICULE4",
"S_CYBRAKDEMONTARGETRETICULE5",
"S_CYBRAKDEMONTARGETRETICULE6",
"S_CYBRAKDEMONTARGETRETICULE7",
"S_CYBRAKDEMONTARGETRETICULE8",
"S_CYBRAKDEMONTARGETRETICULE9",
"S_CYBRAKDEMONTARGETRETICULE10",
"S_CYBRAKDEMONTARGETRETICULE11",
"S_CYBRAKDEMONTARGETRETICULE12",
"S_CYBRAKDEMONTARGETRETICULE13",
"S_CYBRAKDEMONTARGETRETICULE14",
"S_CYBRAKDEMONTARGETDOT",
"S_CYBRAKDEMONNAPALMBOMBLARGE_FLY1",
"S_CYBRAKDEMONNAPALMBOMBLARGE_FLY2",
"S_CYBRAKDEMONNAPALMBOMBLARGE_FLY3",
"S_CYBRAKDEMONNAPALMBOMBLARGE_FLY4",
"S_CYBRAKDEMONNAPALMBOMBLARGE_DIE1", // Explode
"S_CYBRAKDEMONNAPALMBOMBLARGE_DIE2", // Outer ring
"S_CYBRAKDEMONNAPALMBOMBLARGE_DIE3", // Center
"S_CYBRAKDEMONNAPALMBOMBLARGE_DIE4", // Sound
"S_CYBRAKDEMONNAPALMBOMBSMALL",
"S_CYBRAKDEMONNAPALMBOMBSMALL_DIE1", // Explode
"S_CYBRAKDEMONNAPALMBOMBSMALL_DIE2", // Outer ring
"S_CYBRAKDEMONNAPALMBOMBSMALL_DIE3", // Inner ring
"S_CYBRAKDEMONNAPALMBOMBSMALL_DIE4", // Center
"S_CYBRAKDEMONNAPALMBOMBSMALL_DIE5", // Sound
"S_CYBRAKDEMONNAPALMFLAME_FLY1",
"S_CYBRAKDEMONNAPALMFLAME_FLY2",
"S_CYBRAKDEMONNAPALMFLAME_FLY3",
"S_CYBRAKDEMONNAPALMFLAME_FLY4",
"S_CYBRAKDEMONNAPALMFLAME_FLY5",
"S_CYBRAKDEMONNAPALMFLAME_FLY6",
"S_CYBRAKDEMONNAPALMFLAME_DIE",
"S_CYBRAKDEMONVILEEXPLOSION1",
"S_CYBRAKDEMONVILEEXPLOSION2",
"S_CYBRAKDEMONVILEEXPLOSION3",
// Metal Sonic (Race)
"S_METALSONIC_RACE",
// Metal Sonic (Battle)
"S_METALSONIC_FLOAT",
"S_METALSONIC_VECTOR",
"S_METALSONIC_STUN",
"S_METALSONIC_RAISE",
"S_METALSONIC_GATHER",
"S_METALSONIC_DASH",
"S_METALSONIC_BOUNCE",
"S_METALSONIC_BADBOUNCE",
"S_METALSONIC_SHOOT",
"S_METALSONIC_PAIN",
"S_METALSONIC_DEATH1",
"S_METALSONIC_DEATH2",
"S_METALSONIC_DEATH3",
"S_METALSONIC_DEATH4",
"S_METALSONIC_FLEE1",
"S_METALSONIC_FLEE2",
"S_MSSHIELD_F1",
"S_MSSHIELD_F2",
// Ring
"S_RING",
// Blue Sphere for special stages
"S_BLUESPHERE",
"S_BLUESPHEREBONUS",
"S_BLUESPHERESPARK",
// Bomb Sphere
"S_BOMBSPHERE1",
"S_BOMBSPHERE2",
"S_BOMBSPHERE3",
"S_BOMBSPHERE4",
// NiGHTS Chip
"S_NIGHTSCHIP",
"S_NIGHTSCHIPBONUS",
// NiGHTS Star
"S_NIGHTSSTAR",
"S_NIGHTSSTARXMAS",
// Gravity Wells for special stages
"S_GRAVWELLGREEN",
"S_GRAVWELLRED",
// Individual Team Rings
"S_TEAMRING",
// Special Stage Token
"S_TOKEN",
// CTF Flags
"S_REDFLAG",
"S_BLUEFLAG",
// Emblem
"S_EMBLEM1",
"S_EMBLEM2",
"S_EMBLEM3",
"S_EMBLEM4",
"S_EMBLEM5",
"S_EMBLEM6",
"S_EMBLEM7",
"S_EMBLEM8",
"S_EMBLEM9",
"S_EMBLEM10",
"S_EMBLEM11",
"S_EMBLEM12",
"S_EMBLEM13",
"S_EMBLEM14",
"S_EMBLEM15",
"S_EMBLEM16",
"S_EMBLEM17",
"S_EMBLEM18",
"S_EMBLEM19",
"S_EMBLEM20",
"S_EMBLEM21",
"S_EMBLEM22",
"S_EMBLEM23",
"S_EMBLEM24",
"S_EMBLEM25",
"S_EMBLEM26",
// Chaos Emeralds
"S_CEMG1",
"S_CEMG2",
"S_CEMG3",
"S_CEMG4",
"S_CEMG5",
"S_CEMG6",
"S_CEMG7",
// Emerald hunt shards
"S_SHRD1",
"S_SHRD2",
"S_SHRD3",
// Bubble Source
"S_BUBBLES1",
"S_BUBBLES2",
"S_BUBBLES3",
"S_BUBBLES4",
// Level End Sign
"S_SIGN",
"S_SIGNSPIN1",
"S_SIGNSPIN2",
"S_SIGNSPIN3",
"S_SIGNSPIN4",
"S_SIGNSPIN5",
"S_SIGNSPIN6",
"S_SIGNPLAYER",
"S_SIGNSLOW",
"S_SIGNSTOP",
"S_SIGNBOARD",
"S_EGGMANSIGN",
"S_CLEARSIGN",
// Spike Ball
"S_SPIKEBALL1",
"S_SPIKEBALL2",
"S_SPIKEBALL3",
"S_SPIKEBALL4",
"S_SPIKEBALL5",
"S_SPIKEBALL6",
"S_SPIKEBALL7",
"S_SPIKEBALL8",
// Elemental Shield's Spawn
"S_SPINFIRE1",
"S_SPINFIRE2",
"S_SPINFIRE3",
"S_SPINFIRE4",
"S_SPINFIRE5",
"S_SPINFIRE6",
"S_TEAM_SPINFIRE1",
"S_TEAM_SPINFIRE2",
"S_TEAM_SPINFIRE3",
"S_TEAM_SPINFIRE4",
"S_TEAM_SPINFIRE5",
"S_TEAM_SPINFIRE6",
// Spikes
"S_SPIKE1",
"S_SPIKE2",
"S_SPIKE3",
"S_SPIKE4",
"S_SPIKE5",
"S_SPIKE6",
"S_SPIKED1",
"S_SPIKED2",
// Wall spikes
"S_WALLSPIKE1",
"S_WALLSPIKE2",
"S_WALLSPIKE3",
"S_WALLSPIKE4",
"S_WALLSPIKE5",
"S_WALLSPIKE6",
"S_WALLSPIKEBASE",
"S_WALLSPIKED1",
"S_WALLSPIKED2",
// Starpost
"S_STARPOST_IDLE",
"S_STARPOST_FLASH",
"S_STARPOST_STARTSPIN",
"S_STARPOST_SPIN",
"S_STARPOST_ENDSPIN",
// Big floating mine
"S_BIGMINE_IDLE",
"S_BIGMINE_ALERT1",
"S_BIGMINE_ALERT2",
"S_BIGMINE_ALERT3",
"S_BIGMINE_SET1",
"S_BIGMINE_SET2",
"S_BIGMINE_SET3",
"S_BIGMINE_BLAST1",
"S_BIGMINE_BLAST2",
"S_BIGMINE_BLAST3",
"S_BIGMINE_BLAST4",
"S_BIGMINE_BLAST5",
// Cannon Launcher
"S_CANNONLAUNCHER1",
"S_CANNONLAUNCHER2",
"S_CANNONLAUNCHER3",
// Monitor Miscellany
"S_BOXSPARKLE1",
"S_BOXSPARKLE2",
"S_BOXSPARKLE3",
"S_BOXSPARKLE4",
"S_BOX_FLICKER",
"S_BOX_POP1",
"S_BOX_POP2",
"S_GOLDBOX_FLICKER",
"S_GOLDBOX_OFF1",
"S_GOLDBOX_OFF2",
"S_GOLDBOX_OFF3",
"S_GOLDBOX_OFF4",
"S_GOLDBOX_OFF5",
"S_GOLDBOX_OFF6",
"S_GOLDBOX_OFF7",
// Monitor States (one per box)
"S_MYSTERY_BOX",
"S_RING_BOX",
"S_PITY_BOX",
"S_ATTRACT_BOX",
"S_FORCE_BOX",
"S_ARMAGEDDON_BOX",
"S_WHIRLWIND_BOX",
"S_ELEMENTAL_BOX",
"S_SNEAKERS_BOX",
"S_INVULN_BOX",
"S_1UP_BOX",
"S_EGGMAN_BOX",
"S_MIXUP_BOX",
"S_GRAVITY_BOX",
"S_RECYCLER_BOX",
"S_SCORE1K_BOX",
"S_SCORE10K_BOX",
"S_FLAMEAURA_BOX",
"S_BUBBLEWRAP_BOX",
"S_THUNDERCOIN_BOX",
// Gold Repeat Monitor States (one per box)
"S_PITY_GOLDBOX",
"S_ATTRACT_GOLDBOX",
"S_FORCE_GOLDBOX",
"S_ARMAGEDDON_GOLDBOX",
"S_WHIRLWIND_GOLDBOX",
"S_ELEMENTAL_GOLDBOX",
"S_SNEAKERS_GOLDBOX",
"S_INVULN_GOLDBOX",
"S_EGGMAN_GOLDBOX",
"S_GRAVITY_GOLDBOX",
"S_FLAMEAURA_GOLDBOX",
"S_BUBBLEWRAP_GOLDBOX",
"S_THUNDERCOIN_GOLDBOX",
// Team Ring Boxes (these are special)
"S_RING_REDBOX1",
"S_RING_REDBOX2",
"S_REDBOX_POP1",
"S_REDBOX_POP2",
"S_RING_BLUEBOX1",
"S_RING_BLUEBOX2",
"S_BLUEBOX_POP1",
"S_BLUEBOX_POP2",
// Box Icons -- 2 states each, animation and action
"S_RING_ICON1",
"S_RING_ICON2",
"S_PITY_ICON1",
"S_PITY_ICON2",
"S_ATTRACT_ICON1",
"S_ATTRACT_ICON2",
"S_FORCE_ICON1",
"S_FORCE_ICON2",
"S_ARMAGEDDON_ICON1",
"S_ARMAGEDDON_ICON2",
"S_WHIRLWIND_ICON1",
"S_WHIRLWIND_ICON2",
"S_ELEMENTAL_ICON1",
"S_ELEMENTAL_ICON2",
"S_SNEAKERS_ICON1",
"S_SNEAKERS_ICON2",
"S_INVULN_ICON1",
"S_INVULN_ICON2",
"S_1UP_ICON1",
"S_1UP_ICON2",
"S_EGGMAN_ICON1",
"S_EGGMAN_ICON2",
"S_MIXUP_ICON1",
"S_MIXUP_ICON2",
"S_GRAVITY_ICON1",
"S_GRAVITY_ICON2",
"S_RECYCLER_ICON1",
"S_RECYCLER_ICON2",
"S_SCORE1K_ICON1",
"S_SCORE1K_ICON2",
"S_SCORE10K_ICON1",
"S_SCORE10K_ICON2",
"S_FLAMEAURA_ICON1",
"S_FLAMEAURA_ICON2",
"S_BUBBLEWRAP_ICON1",
"S_BUBBLEWRAP_ICON2",
"S_THUNDERCOIN_ICON1",
"S_THUNDERCOIN_ICON2",
// ---
"S_ROCKET",
"S_LASER",
"S_LASER2",
"S_LASERFLASH",
"S_LASERFLAME1",
"S_LASERFLAME2",
"S_LASERFLAME3",
"S_LASERFLAME4",
"S_LASERFLAME5",
"S_TORPEDO",
"S_ENERGYBALL1",
"S_ENERGYBALL2",
// Skim Mine, also used by Jetty-Syn bomber
"S_MINE1",
"S_MINE_BOOM1",
"S_MINE_BOOM2",
"S_MINE_BOOM3",
"S_MINE_BOOM4",
// Jetty-Syn Bullet
"S_JETBULLET1",
"S_JETBULLET2",
"S_TURRETLASER",
"S_TURRETLASEREXPLODE1",
"S_TURRETLASEREXPLODE2",
// Cannonball
"S_CANNONBALL1",
// Arrow
"S_ARROW",
"S_ARROWBONK",
// Glaregoyle Demon fire
"S_DEMONFIRE",
// The letter
"S_LETTER",
// Tutorial Scenery
"S_TUTORIALLEAF1",
"S_TUTORIALLEAF2",
"S_TUTORIALLEAF3",
"S_TUTORIALLEAF4",
"S_TUTORIALLEAF5",
"S_TUTORIALLEAF6",
"S_TUTORIALLEAF7",
"S_TUTORIALLEAF8",
"S_TUTORIALLEAF9",
"S_TUTORIALLEAF10",
"S_TUTORIALLEAF11",
"S_TUTORIALLEAF12",
"S_TUTORIALLEAF13",
"S_TUTORIALLEAF14",
"S_TUTORIALLEAF15",
"S_TUTORIALLEAF16",
"S_TUTORIALFLOWER1",
"S_TUTORIALFLOWER2",
"S_TUTORIALFLOWER3",
"S_TUTORIALFLOWER4",
"S_TUTORIALFLOWER5",
"S_TUTORIALFLOWER6",
"S_TUTORIALFLOWER7",
"S_TUTORIALFLOWER8",
"S_TUTORIALFLOWER9",
"S_TUTORIALFLOWER10",
"S_TUTORIALFLOWER11",
"S_TUTORIALFLOWER12",
"S_TUTORIALFLOWER13",
"S_TUTORIALFLOWER14",
"S_TUTORIALFLOWER15",
"S_TUTORIALFLOWER16",
"S_TUTORIALFLOWERF1",
"S_TUTORIALFLOWERF2",
"S_TUTORIALFLOWERF3",
"S_TUTORIALFLOWERF4",
"S_TUTORIALFLOWERF5",
"S_TUTORIALFLOWERF6",
"S_TUTORIALFLOWERF7",
"S_TUTORIALFLOWERF8",
"S_TUTORIALFLOWERF9",
"S_TUTORIALFLOWERF10",
"S_TUTORIALFLOWERF11",
"S_TUTORIALFLOWERF12",
"S_TUTORIALFLOWERF13",
"S_TUTORIALFLOWERF14",
"S_TUTORIALFLOWERF15",
"S_TUTORIALFLOWERF16",
// GFZ flowers
"S_GFZFLOWERA",
"S_GFZFLOWERB",
"S_GFZFLOWERC",
"S_BLUEBERRYBUSH",
"S_BERRYBUSH",
"S_BUSH",
// Trees (both GFZ and misc)
"S_GFZTREE",
"S_GFZBERRYTREE",
"S_GFZCHERRYTREE",
"S_CHECKERTREE",
"S_CHECKERSUNSETTREE",
"S_FHZTREE", // Frozen Hillside
"S_FHZPINKTREE",
"S_POLYGONTREE",
"S_BUSHTREE",
"S_BUSHREDTREE",
"S_SPRINGTREE",
// THZ flowers
"S_THZFLOWERA", // THZ1 Steam flower
"S_THZFLOWERB", // THZ1 Spin flower (red)
"S_THZFLOWERC", // THZ1 Spin flower (yellow)
// THZ Steam Whistle tree/bush
"S_THZTREE",
"S_THZTREEBRANCH1",
"S_THZTREEBRANCH2",
"S_THZTREEBRANCH3",
"S_THZTREEBRANCH4",
"S_THZTREEBRANCH5",
"S_THZTREEBRANCH6",
"S_THZTREEBRANCH7",
"S_THZTREEBRANCH8",
"S_THZTREEBRANCH9",
"S_THZTREEBRANCH10",
"S_THZTREEBRANCH11",
"S_THZTREEBRANCH12",
"S_THZTREEBRANCH13",
// THZ Alarm
"S_ALARM1",
// Deep Sea Gargoyle
"S_GARGOYLE",
"S_BIGGARGOYLE",
// DSZ Seaweed
"S_SEAWEED1",
"S_SEAWEED2",
"S_SEAWEED3",
"S_SEAWEED4",
"S_SEAWEED5",
"S_SEAWEED6",
// Dripping Water
"S_DRIPA1",
"S_DRIPA2",
"S_DRIPA3",
"S_DRIPA4",
"S_DRIPB1",
"S_DRIPC1",
"S_DRIPC2",
// Coral
"S_CORAL1",
"S_CORAL2",
"S_CORAL3",
"S_CORAL4",
"S_CORAL5",
// Blue Crystal
"S_BLUECRYSTAL1",
// Kelp,
"S_KELP",
// Animated algae
"S_ANIMALGAETOP1",
"S_ANIMALGAETOP2",
"S_ANIMALGAESEG",
// DSZ Stalagmites
"S_DSZSTALAGMITE",
"S_DSZ2STALAGMITE",
// DSZ Light beam
"S_LIGHTBEAM1",
"S_LIGHTBEAM2",
"S_LIGHTBEAM3",
"S_LIGHTBEAM4",
"S_LIGHTBEAM5",
"S_LIGHTBEAM6",
"S_LIGHTBEAM7",
"S_LIGHTBEAM8",
"S_LIGHTBEAM9",
"S_LIGHTBEAM10",
"S_LIGHTBEAM11",
"S_LIGHTBEAM12",
// CEZ Chain
"S_CEZCHAIN",
// Flame
"S_FLAME",
"S_FLAMEPARTICLE",
"S_FLAMEREST",
// Eggman Statue
"S_EGGSTATUE1",
// CEZ hidden sling
"S_SLING1",
"S_SLING2",
// CEZ maces and chains
"S_SMALLMACECHAIN",
"S_BIGMACECHAIN",
"S_SMALLMACE",
"S_BIGMACE",
"S_SMALLGRABCHAIN",
"S_BIGGRABCHAIN",
// Blue spring on a ball
"S_BLUESPRINGBALL",
"S_BLUESPRINGBALL2",
"S_BLUESPRINGBALL3",
"S_BLUESPRINGBALL4",
"S_BLUESPRINGBALL5",
// Yellow spring on a ball
"S_YELLOWSPRINGBALL",
"S_YELLOWSPRINGBALL2",
"S_YELLOWSPRINGBALL3",
"S_YELLOWSPRINGBALL4",
"S_YELLOWSPRINGBALL5",
// Red spring on a ball
"S_REDSPRINGBALL",
"S_REDSPRINGBALL2",
"S_REDSPRINGBALL3",
"S_REDSPRINGBALL4",
"S_REDSPRINGBALL5",
// Small Firebar
"S_SMALLFIREBAR1",
"S_SMALLFIREBAR2",
"S_SMALLFIREBAR3",
"S_SMALLFIREBAR4",
"S_SMALLFIREBAR5",
"S_SMALLFIREBAR6",
"S_SMALLFIREBAR7",
"S_SMALLFIREBAR8",
"S_SMALLFIREBAR9",
"S_SMALLFIREBAR10",
"S_SMALLFIREBAR11",
"S_SMALLFIREBAR12",
"S_SMALLFIREBAR13",
"S_SMALLFIREBAR14",
"S_SMALLFIREBAR15",
"S_SMALLFIREBAR16",
// Big Firebar
"S_BIGFIREBAR1",
"S_BIGFIREBAR2",
"S_BIGFIREBAR3",
"S_BIGFIREBAR4",
"S_BIGFIREBAR5",
"S_BIGFIREBAR6",
"S_BIGFIREBAR7",
"S_BIGFIREBAR8",
"S_BIGFIREBAR9",
"S_BIGFIREBAR10",
"S_BIGFIREBAR11",
"S_BIGFIREBAR12",
"S_BIGFIREBAR13",
"S_BIGFIREBAR14",
"S_BIGFIREBAR15",
"S_BIGFIREBAR16",
"S_CEZFLOWER",
"S_CEZPOLE",
"S_CEZBANNER1",
"S_CEZBANNER2",
"S_PINETREE",
"S_CEZBUSH1",
"S_CEZBUSH2",
"S_CANDLE",
"S_CANDLEPRICKET",
"S_FLAMEHOLDER",
"S_FIRETORCH",
"S_WAVINGFLAG",
"S_WAVINGFLAGSEG1",
"S_WAVINGFLAGSEG2",
"S_CRAWLASTATUE",
"S_FACESTABBERSTATUE",
"S_SUSPICIOUSFACESTABBERSTATUE_WAIT",
"S_SUSPICIOUSFACESTABBERSTATUE_BURST1",
"S_SUSPICIOUSFACESTABBERSTATUE_BURST2",
"S_BRAMBLES",
// Big Tumbleweed
"S_BIGTUMBLEWEED",
"S_BIGTUMBLEWEED_ROLL1",
"S_BIGTUMBLEWEED_ROLL2",
"S_BIGTUMBLEWEED_ROLL3",
"S_BIGTUMBLEWEED_ROLL4",
"S_BIGTUMBLEWEED_ROLL5",
"S_BIGTUMBLEWEED_ROLL6",
"S_BIGTUMBLEWEED_ROLL7",
"S_BIGTUMBLEWEED_ROLL8",
// Little Tumbleweed
"S_LITTLETUMBLEWEED",
"S_LITTLETUMBLEWEED_ROLL1",
"S_LITTLETUMBLEWEED_ROLL2",
"S_LITTLETUMBLEWEED_ROLL3",
"S_LITTLETUMBLEWEED_ROLL4",
"S_LITTLETUMBLEWEED_ROLL5",
"S_LITTLETUMBLEWEED_ROLL6",
"S_LITTLETUMBLEWEED_ROLL7",
"S_LITTLETUMBLEWEED_ROLL8",
// Cacti
"S_CACTI1",
"S_CACTI2",
"S_CACTI3",
"S_CACTI4",
"S_CACTI5",
"S_CACTI6",
"S_CACTI7",
"S_CACTI8",
"S_CACTI9",
"S_CACTI10",
"S_CACTI11",
"S_CACTITINYSEG",
"S_CACTISMALLSEG",
// Warning signs
"S_ARIDSIGN_CAUTION",
"S_ARIDSIGN_CACTI",
"S_ARIDSIGN_SHARPTURN",
// Oil lamp
"S_OILLAMP",
"S_OILLAMPFLARE",
// TNT barrel
"S_TNTBARREL_STND1",
"S_TNTBARREL_EXPL1",
"S_TNTBARREL_EXPL2",
"S_TNTBARREL_EXPL3",
"S_TNTBARREL_EXPL4",
"S_TNTBARREL_EXPL5",
"S_TNTBARREL_EXPL6",
"S_TNTBARREL_EXPL7",
"S_TNTBARREL_FLYING",
// TNT proximity shell
"S_PROXIMITY_TNT",
"S_PROXIMITY_TNT_TRIGGER1",
"S_PROXIMITY_TNT_TRIGGER2",
"S_PROXIMITY_TNT_TRIGGER3",
"S_PROXIMITY_TNT_TRIGGER4",
"S_PROXIMITY_TNT_TRIGGER5",
"S_PROXIMITY_TNT_TRIGGER6",
"S_PROXIMITY_TNT_TRIGGER7",
"S_PROXIMITY_TNT_TRIGGER8",
"S_PROXIMITY_TNT_TRIGGER9",
"S_PROXIMITY_TNT_TRIGGER10",
"S_PROXIMITY_TNT_TRIGGER11",
"S_PROXIMITY_TNT_TRIGGER12",
"S_PROXIMITY_TNT_TRIGGER13",
"S_PROXIMITY_TNT_TRIGGER14",
"S_PROXIMITY_TNT_TRIGGER15",
"S_PROXIMITY_TNT_TRIGGER16",
"S_PROXIMITY_TNT_TRIGGER17",
"S_PROXIMITY_TNT_TRIGGER18",
"S_PROXIMITY_TNT_TRIGGER19",
"S_PROXIMITY_TNT_TRIGGER20",
"S_PROXIMITY_TNT_TRIGGER21",
"S_PROXIMITY_TNT_TRIGGER22",
"S_PROXIMITY_TNT_TRIGGER23",
// Dust devil
"S_DUSTDEVIL",
"S_DUSTLAYER1",
"S_DUSTLAYER2",
"S_DUSTLAYER3",
"S_DUSTLAYER4",
"S_DUSTLAYER5",
"S_ARIDDUST1",
"S_ARIDDUST2",
"S_ARIDDUST3",
// Minecart
"S_MINECART_IDLE",
"S_MINECART_DTH1",
"S_MINECARTEND",
"S_MINECARTSEG_FRONT",
"S_MINECARTSEG_BACK",
"S_MINECARTSEG_LEFT",
"S_MINECARTSEG_RIGHT",
"S_MINECARTSIDEMARK1",
"S_MINECARTSIDEMARK2",
"S_MINECARTSPARK",
// Saloon door
"S_SALOONDOOR",
"S_SALOONDOORCENTER",
// Train cameo
"S_TRAINCAMEOSPAWNER_1",
"S_TRAINCAMEOSPAWNER_2",
"S_TRAINCAMEOSPAWNER_3",
"S_TRAINCAMEOSPAWNER_4",
"S_TRAINCAMEOSPAWNER_5",
"S_TRAINPUFFMAKER",
// Train
"S_TRAINDUST",
"S_TRAINSTEAM",
// Flame jet
"S_FLAMEJETSTND",
"S_FLAMEJETSTART",
"S_FLAMEJETSTOP",
"S_FLAMEJETFLAME1",
"S_FLAMEJETFLAME2",
"S_FLAMEJETFLAME3",
"S_FLAMEJETFLAME4",
"S_FLAMEJETFLAME5",
"S_FLAMEJETFLAME6",
"S_FLAMEJETFLAME7",
"S_FLAMEJETFLAME8",
"S_FLAMEJETFLAME9",
// Spinning flame jets
"S_FJSPINAXISA1", // Counter-clockwise
"S_FJSPINAXISA2",
"S_FJSPINAXISB1", // Clockwise
"S_FJSPINAXISB2",
// Blade's flame
"S_FLAMEJETFLAMEB1",
"S_FLAMEJETFLAMEB2",
"S_FLAMEJETFLAMEB3",
// Lavafall
"S_LAVAFALL_DORMANT",
"S_LAVAFALL_TELL",
"S_LAVAFALL_SHOOT",
"S_LAVAFALL_LAVA1",
"S_LAVAFALL_LAVA2",
"S_LAVAFALL_LAVA3",
"S_LAVAFALLROCK",
// Rollout Rock
"S_ROLLOUTSPAWN",
"S_ROLLOUTROCK",
// RVZ scenery
"S_BIGFERNLEAF",
"S_BIGFERN1",
"S_BIGFERN2",
"S_JUNGLEPALM",
"S_TORCHFLOWER",
"S_WALLVINE_LONG",
"S_WALLVINE_SHORT",
// Glaregoyles
"S_GLAREGOYLE",
"S_GLAREGOYLE_CHARGE",
"S_GLAREGOYLE_BLINK",
"S_GLAREGOYLE_HOLD",
"S_GLAREGOYLE_FIRE",
"S_GLAREGOYLE_LOOP",
"S_GLAREGOYLE_COOLDOWN",
"S_GLAREGOYLEUP",
"S_GLAREGOYLEUP_CHARGE",
"S_GLAREGOYLEUP_BLINK",
"S_GLAREGOYLEUP_HOLD",
"S_GLAREGOYLEUP_FIRE",
"S_GLAREGOYLEUP_LOOP",
"S_GLAREGOYLEUP_COOLDOWN",
"S_GLAREGOYLEDOWN",
"S_GLAREGOYLEDOWN_CHARGE",
"S_GLAREGOYLEDOWN_BLINK",
"S_GLAREGOYLEDOWN_HOLD",
"S_GLAREGOYLEDOWN_FIRE",
"S_GLAREGOYLEDOWN_LOOP",
"S_GLAREGOYLEDOWN_COOLDOWN",
"S_GLAREGOYLELONG",
"S_GLAREGOYLELONG_CHARGE",
"S_GLAREGOYLELONG_BLINK",
"S_GLAREGOYLELONG_HOLD",
"S_GLAREGOYLELONG_FIRE",
"S_GLAREGOYLELONG_LOOP",
"S_GLAREGOYLELONG_COOLDOWN",
// ATZ's Red Crystal/Target
"S_TARGET_IDLE",
"S_TARGET_HIT1",
"S_TARGET_HIT2",
"S_TARGET_RESPAWN",
"S_TARGET_ALLDONE",
// ATZ's green flame
"S_GREENFLAME",
// ATZ Blue Gargoyle
"S_BLUEGARGOYLE",
// Stalagmites
"S_STG0",
"S_STG1",
"S_STG2",
"S_STG3",
"S_STG4",
"S_STG5",
"S_STG6",
"S_STG7",
"S_STG8",
"S_STG9",
// Xmas-specific stuff
"S_XMASPOLE",
"S_CANDYCANE",
"S_SNOWMAN", // normal
"S_SNOWMANHAT", // with hat + scarf
"S_LAMPPOST1", // normal
"S_LAMPPOST2", // with snow
"S_HANGSTAR",
"S_MISTLETOE",
"S_SSZTREE",
"S_SSZTREE_BRANCH",
"S_SSZTREE2",
"S_SSZTREE2_BRANCH",
// Xmas GFZ bushes
"S_XMASBLUEBERRYBUSH",
"S_XMASBERRYBUSH",
"S_XMASBUSH",
// FHZ
"S_FHZICE1",
"S_FHZICE2",
"S_ROSY_IDLE",
"S_ROSY_JUMP",
"S_ROSY_FALL",
"S_ROSY_WALK",
"S_ROSY_HUG",
"S_ROSY_PAIN",
"S_ROSY_STND",
"S_ROSY_UNHAPPY",
// Halloween Scenery
// Pumpkins
"S_JACKO1",
"S_JACKO1OVERLAY_1",
"S_JACKO1OVERLAY_2",
"S_JACKO1OVERLAY_3",
"S_JACKO1OVERLAY_4",
"S_JACKO2",
"S_JACKO2OVERLAY_1",
"S_JACKO2OVERLAY_2",
"S_JACKO2OVERLAY_3",
"S_JACKO2OVERLAY_4",
"S_JACKO3",
"S_JACKO3OVERLAY_1",
"S_JACKO3OVERLAY_2",
"S_JACKO3OVERLAY_3",
"S_JACKO3OVERLAY_4",
// Dr Seuss Trees
"S_HHZTREE_TOP",
"S_HHZTREE_TRUNK",
"S_HHZTREE_LEAF",
// Mushroom
"S_HHZSHROOM_1",
"S_HHZSHROOM_2",
"S_HHZSHROOM_3",
"S_HHZSHROOM_4",
"S_HHZSHROOM_5",
"S_HHZSHROOM_6",
"S_HHZSHROOM_7",
"S_HHZSHROOM_8",
"S_HHZSHROOM_9",
"S_HHZSHROOM_10",
"S_HHZSHROOM_11",
"S_HHZSHROOM_12",
"S_HHZSHROOM_13",
"S_HHZSHROOM_14",
"S_HHZSHROOM_15",
"S_HHZSHROOM_16",
// Misc
"S_HHZGRASS",
"S_HHZTENT1",
"S_HHZTENT2",
"S_HHZSTALAGMITE_TALL",
"S_HHZSTALAGMITE_SHORT",
// Botanic Serenity's loads of scenery states
"S_BSZTALLFLOWER_RED",
"S_BSZTALLFLOWER_PURPLE",
"S_BSZTALLFLOWER_BLUE",
"S_BSZTALLFLOWER_CYAN",
"S_BSZTALLFLOWER_YELLOW",
"S_BSZTALLFLOWER_ORANGE",
"S_BSZFLOWER_RED",
"S_BSZFLOWER_PURPLE",
"S_BSZFLOWER_BLUE",
"S_BSZFLOWER_CYAN",
"S_BSZFLOWER_YELLOW",
"S_BSZFLOWER_ORANGE",
"S_BSZSHORTFLOWER_RED",
"S_BSZSHORTFLOWER_PURPLE",
"S_BSZSHORTFLOWER_BLUE",
"S_BSZSHORTFLOWER_CYAN",
"S_BSZSHORTFLOWER_YELLOW",
"S_BSZSHORTFLOWER_ORANGE",
"S_BSZTULIP_RED",
"S_BSZTULIP_PURPLE",
"S_BSZTULIP_BLUE",
"S_BSZTULIP_CYAN",
"S_BSZTULIP_YELLOW",
"S_BSZTULIP_ORANGE",
"S_BSZCLUSTER_RED",
"S_BSZCLUSTER_PURPLE",
"S_BSZCLUSTER_BLUE",
"S_BSZCLUSTER_CYAN",
"S_BSZCLUSTER_YELLOW",
"S_BSZCLUSTER_ORANGE",
"S_BSZBUSH_RED",
"S_BSZBUSH_PURPLE",
"S_BSZBUSH_BLUE",
"S_BSZBUSH_CYAN",
"S_BSZBUSH_YELLOW",
"S_BSZBUSH_ORANGE",
"S_BSZVINE_RED",
"S_BSZVINE_PURPLE",
"S_BSZVINE_BLUE",
"S_BSZVINE_CYAN",
"S_BSZVINE_YELLOW",
"S_BSZVINE_ORANGE",
"S_BSZSHRUB",
"S_BSZCLOVER",
"S_BIG_PALMTREE_TRUNK",
"S_BIG_PALMTREE_TOP",
"S_PALMTREE_TRUNK",
"S_PALMTREE_TOP",
"S_DBALL1",
"S_DBALL2",
"S_DBALL3",
"S_DBALL4",
"S_DBALL5",
"S_DBALL6",
"S_EGGSTATUE2",
"S_GINE",
"S_PPAL",
"S_PPEL",
// Shield Orb
"S_ARMA1",
"S_ARMA2",
"S_ARMA3",
"S_ARMA4",
"S_ARMA5",
"S_ARMA6",
"S_ARMA7",
"S_ARMA8",
"S_ARMA9",
"S_ARMA10",
"S_ARMA11",
"S_ARMA12",
"S_ARMA13",
"S_ARMA14",
"S_ARMA15",
"S_ARMA16",
"S_ARMF1",
"S_ARMF2",
"S_ARMF3",
"S_ARMF4",
"S_ARMF5",
"S_ARMF6",
"S_ARMF7",
"S_ARMF8",
"S_ARMF9",
"S_ARMF10",
"S_ARMF11",
"S_ARMF12",
"S_ARMF13",
"S_ARMF14",
"S_ARMF15",
"S_ARMF16",
"S_ARMF17",
"S_ARMF18",
"S_ARMF19",
"S_ARMF20",
"S_ARMF21",
"S_ARMF22",
"S_ARMF23",
"S_ARMF24",
"S_ARMF25",
"S_ARMF26",
"S_ARMF27",
"S_ARMF28",
"S_ARMF29",
"S_ARMF30",
"S_ARMF31",
"S_ARMF32",
"S_ARMB1",
"S_ARMB2",
"S_ARMB3",
"S_ARMB4",
"S_ARMB5",
"S_ARMB6",
"S_ARMB7",
"S_ARMB8",
"S_ARMB9",
"S_ARMB10",
"S_ARMB11",
"S_ARMB12",
"S_ARMB13",
"S_ARMB14",
"S_ARMB15",
"S_ARMB16",
"S_ARMB17",
"S_ARMB18",
"S_ARMB19",
"S_ARMB20",
"S_ARMB21",
"S_ARMB22",
"S_ARMB23",
"S_ARMB24",
"S_ARMB25",
"S_ARMB26",
"S_ARMB27",
"S_ARMB28",
"S_ARMB29",
"S_ARMB30",
"S_ARMB31",
"S_ARMB32",
"S_WIND1",
"S_WIND2",
"S_WIND3",
"S_WIND4",
"S_WIND5",
"S_WIND6",
"S_WIND7",
"S_WIND8",
"S_MAGN1",
"S_MAGN2",
"S_MAGN3",
"S_MAGN4",
"S_MAGN5",
"S_MAGN6",
"S_MAGN7",
"S_MAGN8",
"S_MAGN9",
"S_MAGN10",
"S_MAGN11",
"S_MAGN12",
"S_MAGN13",
"S_FORC1",
"S_FORC2",
"S_FORC3",
"S_FORC4",
"S_FORC5",
"S_FORC6",
"S_FORC7",
"S_FORC8",
"S_FORC9",
"S_FORC10",
"S_FORC11",
"S_FORC12",
"S_FORC13",
"S_FORC14",
"S_FORC15",
"S_FORC16",
"S_FORC17",
"S_FORC18",
"S_FORC19",
"S_FORC20",
"S_FORC21",
"S_ELEM1",
"S_ELEM2",
"S_ELEM3",
"S_ELEM4",
"S_ELEM5",
"S_ELEM6",
"S_ELEM7",
"S_ELEM8",
"S_ELEM9",
"S_ELEM10",
"S_ELEM11",
"S_ELEM12",
"S_ELEM13",
"S_ELEM14",
"S_ELEMF1",
"S_ELEMF2",
"S_ELEMF3",
"S_ELEMF4",
"S_ELEMF5",
"S_ELEMF6",
"S_ELEMF7",
"S_ELEMF8",
"S_ELEMF9",
"S_ELEMF10",
"S_PITY1",
"S_PITY2",
"S_PITY3",
"S_PITY4",
"S_PITY5",
"S_PITY6",
"S_PITY7",
"S_PITY8",
"S_PITY9",
"S_PITY10",
"S_PITY11",
"S_PITY12",
"S_FIRS1",
"S_FIRS2",
"S_FIRS3",
"S_FIRS4",
"S_FIRS5",
"S_FIRS6",
"S_FIRS7",
"S_FIRS8",
"S_FIRS9",
"S_FIRS10",
"S_FIRS11",
"S_FIRSB1",
"S_FIRSB2",
"S_FIRSB3",
"S_FIRSB4",
"S_FIRSB5",
"S_FIRSB6",
"S_FIRSB7",
"S_FIRSB8",
"S_FIRSB9",
"S_FIRSB10",
"S_BUBS1",
"S_BUBS2",
"S_BUBS3",
"S_BUBS4",
"S_BUBS5",
"S_BUBS6",
"S_BUBS7",
"S_BUBS8",
"S_BUBS9",
"S_BUBS10",
"S_BUBS11",
"S_BUBSB1",
"S_BUBSB2",
"S_BUBSB3",
"S_BUBSB4",
"S_BUBSB5",
"S_BUBSB6",
"S_ZAPS1",
"S_ZAPS2",
"S_ZAPS3",
"S_ZAPS4",
"S_ZAPS5",
"S_ZAPS6",
"S_ZAPS7",
"S_ZAPS8",
"S_ZAPS9",
"S_ZAPS10",
"S_ZAPS11",
"S_ZAPS12",
"S_ZAPS13", // blank frame
"S_ZAPS14",
"S_ZAPS15",
"S_ZAPS16",
"S_ZAPSB1", // blank frame
"S_ZAPSB2",
"S_ZAPSB3",
"S_ZAPSB4",
"S_ZAPSB5",
"S_ZAPSB6",
"S_ZAPSB7",
"S_ZAPSB8",
"S_ZAPSB9",
"S_ZAPSB10",
"S_ZAPSB11", // blank frame
//Thunder spark
"S_THUNDERCOIN_SPARK",
// Invincibility Sparkles
"S_IVSP",
// Super Sonic Spark
"S_SSPK1",
"S_SSPK2",
"S_SSPK3",
"S_SSPK4",
"S_SSPK5",
// Flicky-sized bubble
"S_FLICKY_BUBBLE",
// Bluebird
"S_FLICKY_01_OUT",
"S_FLICKY_01_FLAP1",
"S_FLICKY_01_FLAP2",
"S_FLICKY_01_FLAP3",
"S_FLICKY_01_STAND",
"S_FLICKY_01_CENTER",
// Rabbit
"S_FLICKY_02_OUT",
"S_FLICKY_02_AIM",
"S_FLICKY_02_HOP",
"S_FLICKY_02_UP",
"S_FLICKY_02_DOWN",
"S_FLICKY_02_STAND",
"S_FLICKY_02_CENTER",
// Chicken
"S_FLICKY_03_OUT",
"S_FLICKY_03_AIM",
"S_FLICKY_03_HOP",
"S_FLICKY_03_UP",
"S_FLICKY_03_FLAP1",
"S_FLICKY_03_FLAP2",
"S_FLICKY_03_STAND",
"S_FLICKY_03_CENTER",
// Seal
"S_FLICKY_04_OUT",
"S_FLICKY_04_AIM",
"S_FLICKY_04_HOP",
"S_FLICKY_04_UP",
"S_FLICKY_04_DOWN",
"S_FLICKY_04_SWIM1",
"S_FLICKY_04_SWIM2",
"S_FLICKY_04_SWIM3",
"S_FLICKY_04_SWIM4",
"S_FLICKY_04_STAND",
"S_FLICKY_04_CENTER",
// Pig
"S_FLICKY_05_OUT",
"S_FLICKY_05_AIM",
"S_FLICKY_05_HOP",
"S_FLICKY_05_UP",
"S_FLICKY_05_DOWN",
"S_FLICKY_05_STAND",
"S_FLICKY_05_CENTER",
// Chipmunk
"S_FLICKY_06_OUT",
"S_FLICKY_06_AIM",
"S_FLICKY_06_HOP",
"S_FLICKY_06_UP",
"S_FLICKY_06_DOWN",
"S_FLICKY_06_STAND",
"S_FLICKY_06_CENTER",
// Penguin
"S_FLICKY_07_OUT",
"S_FLICKY_07_AIML",
"S_FLICKY_07_HOPL",
"S_FLICKY_07_UPL",
"S_FLICKY_07_DOWNL",
"S_FLICKY_07_AIMR",
"S_FLICKY_07_HOPR",
"S_FLICKY_07_UPR",
"S_FLICKY_07_DOWNR",
"S_FLICKY_07_SWIM1",
"S_FLICKY_07_SWIM2",
"S_FLICKY_07_SWIM3",
"S_FLICKY_07_STAND",
"S_FLICKY_07_CENTER",
// Fish
"S_FLICKY_08_OUT",
"S_FLICKY_08_AIM",
"S_FLICKY_08_HOP",
"S_FLICKY_08_FLAP1",
"S_FLICKY_08_FLAP2",
"S_FLICKY_08_FLAP3",
"S_FLICKY_08_FLAP4",
"S_FLICKY_08_SWIM1",
"S_FLICKY_08_SWIM2",
"S_FLICKY_08_SWIM3",
"S_FLICKY_08_SWIM4",
"S_FLICKY_08_STAND",
"S_FLICKY_08_CENTER",
// Ram
"S_FLICKY_09_OUT",
"S_FLICKY_09_AIM",
"S_FLICKY_09_HOP",
"S_FLICKY_09_UP",
"S_FLICKY_09_DOWN",
"S_FLICKY_09_STAND",
"S_FLICKY_09_CENTER",
// Puffin
"S_FLICKY_10_OUT",
"S_FLICKY_10_FLAP1",
"S_FLICKY_10_FLAP2",
"S_FLICKY_10_STAND",
"S_FLICKY_10_CENTER",
// Cow
"S_FLICKY_11_OUT",
"S_FLICKY_11_AIM",
"S_FLICKY_11_RUN1",
"S_FLICKY_11_RUN2",
"S_FLICKY_11_RUN3",
"S_FLICKY_11_STAND",
"S_FLICKY_11_CENTER",
// Rat
"S_FLICKY_12_OUT",
"S_FLICKY_12_AIM",
"S_FLICKY_12_RUN1",
"S_FLICKY_12_RUN2",
"S_FLICKY_12_RUN3",
"S_FLICKY_12_STAND",
"S_FLICKY_12_CENTER",
// Bear
"S_FLICKY_13_OUT",
"S_FLICKY_13_AIM",
"S_FLICKY_13_HOP",
"S_FLICKY_13_UP",
"S_FLICKY_13_DOWN",
"S_FLICKY_13_STAND",
"S_FLICKY_13_CENTER",
// Dove
"S_FLICKY_14_OUT",
"S_FLICKY_14_FLAP1",
"S_FLICKY_14_FLAP2",
"S_FLICKY_14_FLAP3",
"S_FLICKY_14_STAND",
"S_FLICKY_14_CENTER",
// Cat
"S_FLICKY_15_OUT",
"S_FLICKY_15_AIM",
"S_FLICKY_15_HOP",
"S_FLICKY_15_UP",
"S_FLICKY_15_DOWN",
"S_FLICKY_15_STAND",
"S_FLICKY_15_CENTER",
// Canary
"S_FLICKY_16_OUT",
"S_FLICKY_16_FLAP1",
"S_FLICKY_16_FLAP2",
"S_FLICKY_16_FLAP3",
"S_FLICKY_16_STAND",
"S_FLICKY_16_CENTER",
// Spider
"S_SECRETFLICKY_01_OUT",
"S_SECRETFLICKY_01_AIM",
"S_SECRETFLICKY_01_HOP",
"S_SECRETFLICKY_01_UP",
"S_SECRETFLICKY_01_DOWN",
"S_SECRETFLICKY_01_STAND",
"S_SECRETFLICKY_01_CENTER",
// Bat
"S_SECRETFLICKY_02_OUT",
"S_SECRETFLICKY_02_FLAP1",
"S_SECRETFLICKY_02_FLAP2",
"S_SECRETFLICKY_02_FLAP3",
"S_SECRETFLICKY_02_STAND",
"S_SECRETFLICKY_02_CENTER",
// Fan
"S_FAN",
"S_FAN2",
"S_FAN3",
"S_FAN4",
"S_FAN5",
// Steam Riser
"S_STEAM1",
"S_STEAM2",
"S_STEAM3",
"S_STEAM4",
"S_STEAM5",
"S_STEAM6",
"S_STEAM7",
"S_STEAM8",
// Bumpers
"S_BUMPER",
"S_BUMPERHIT",
// Balloons
"S_BALLOON",
"S_BALLOONPOP1",
"S_BALLOONPOP2",
"S_BALLOONPOP3",
"S_BALLOONPOP4",
"S_BALLOONPOP5",
"S_BALLOONPOP6",
// Yellow Spring
"S_YELLOWSPRING",
"S_YELLOWSPRING2",
"S_YELLOWSPRING3",
"S_YELLOWSPRING4",
"S_YELLOWSPRING5",
// Red Spring
"S_REDSPRING",
"S_REDSPRING2",
"S_REDSPRING3",
"S_REDSPRING4",
"S_REDSPRING5",
// Blue Spring
"S_BLUESPRING",
"S_BLUESPRING2",
"S_BLUESPRING3",
"S_BLUESPRING4",
"S_BLUESPRING5",
// Yellow Diagonal Spring
"S_YDIAG1",
"S_YDIAG2",
"S_YDIAG3",
"S_YDIAG4",
"S_YDIAG5",
"S_YDIAG6",
"S_YDIAG7",
"S_YDIAG8",
// Red Diagonal Spring
"S_RDIAG1",
"S_RDIAG2",
"S_RDIAG3",
"S_RDIAG4",
"S_RDIAG5",
"S_RDIAG6",
"S_RDIAG7",
"S_RDIAG8",
// Blue Diagonal Spring
"S_BDIAG1",
"S_BDIAG2",
"S_BDIAG3",
"S_BDIAG4",
"S_BDIAG5",
"S_BDIAG6",
"S_BDIAG7",
"S_BDIAG8",
// Yellow Side Spring
"S_YHORIZ1",
"S_YHORIZ2",
"S_YHORIZ3",
"S_YHORIZ4",
"S_YHORIZ5",
"S_YHORIZ6",
"S_YHORIZ7",
"S_YHORIZ8",
// Red Side Spring
"S_RHORIZ1",
"S_RHORIZ2",
"S_RHORIZ3",
"S_RHORIZ4",
"S_RHORIZ5",
"S_RHORIZ6",
"S_RHORIZ7",
"S_RHORIZ8",
// Blue Side Spring
"S_BHORIZ1",
"S_BHORIZ2",
"S_BHORIZ3",
"S_BHORIZ4",
"S_BHORIZ5",
"S_BHORIZ6",
"S_BHORIZ7",
"S_BHORIZ8",
// Booster
"S_BOOSTERSOUND",
"S_YELLOWBOOSTERROLLER",
"S_YELLOWBOOSTERSEG_LEFT",
"S_YELLOWBOOSTERSEG_RIGHT",
"S_YELLOWBOOSTERSEG_FACE",
"S_REDBOOSTERROLLER",
"S_REDBOOSTERSEG_LEFT",
"S_REDBOOSTERSEG_RIGHT",
"S_REDBOOSTERSEG_FACE",
// Rain
"S_RAIN1",
"S_RAINRETURN",
// Snowflake
"S_SNOW1",
"S_SNOW2",
"S_SNOW3",
// Water Splish
"S_SPLISH1",
"S_SPLISH2",
"S_SPLISH3",
"S_SPLISH4",
"S_SPLISH5",
"S_SPLISH6",
"S_SPLISH7",
"S_SPLISH8",
"S_SPLISH9",
// Lava Splish
"S_LAVASPLISH",
// added water splash
"S_SPLASH1",
"S_SPLASH2",
"S_SPLASH3",
// lava/slime damage burn smoke
"S_SMOKE1",
"S_SMOKE2",
"S_SMOKE3",
"S_SMOKE4",
"S_SMOKE5",
// Bubbles
"S_SMALLBUBBLE",
"S_MEDIUMBUBBLE",
"S_LARGEBUBBLE1",
"S_LARGEBUBBLE2",
"S_EXTRALARGEBUBBLE", // breathable
"S_POP1", // Extra Large bubble goes POP!
"S_WATERZAP",
// Spindash dust
"S_SPINDUST1",
"S_SPINDUST2",
"S_SPINDUST3",
"S_SPINDUST4",
"S_SPINDUST_BUBBLE1",
"S_SPINDUST_BUBBLE2",
"S_SPINDUST_BUBBLE3",
"S_SPINDUST_BUBBLE4",
"S_SPINDUST_FIRE1",
"S_SPINDUST_FIRE2",
"S_SPINDUST_FIRE3",
"S_SPINDUST_FIRE4",
"S_FOG1",
"S_FOG2",
"S_FOG3",
"S_FOG4",
"S_FOG5",
"S_FOG6",
"S_FOG7",
"S_FOG8",
"S_FOG9",
"S_FOG10",
"S_FOG11",
"S_FOG12",
"S_FOG13",
"S_FOG14",
"S_SEED",
"S_PARTICLE",
// Score Logos
"S_SCRA", // 100
"S_SCRB", // 200
"S_SCRC", // 500
"S_SCRD", // 1000
"S_SCRE", // 10000
"S_SCRF", // 400 (mario)
"S_SCRG", // 800 (mario)
"S_SCRH", // 2000 (mario)
"S_SCRI", // 4000 (mario)
"S_SCRJ", // 8000 (mario)
"S_SCRK", // 1UP (mario)
"S_SCRL", // 10
// Drowning Timer Numbers
"S_ZERO1",
"S_ONE1",
"S_TWO1",
"S_THREE1",
"S_FOUR1",
"S_FIVE1",
"S_ZERO2",
"S_ONE2",
"S_TWO2",
"S_THREE2",
"S_FOUR2",
"S_FIVE2",
"S_FLIGHTINDICATOR",
"S_LOCKON1",
"S_LOCKON2",
"S_LOCKON3",
"S_LOCKON4",
"S_LOCKONINF1",
"S_LOCKONINF2",
"S_LOCKONINF3",
"S_LOCKONINF4",
// Tag Sign
"S_TTAG",
// Got Flag Sign
"S_GOTFLAG",
// Finish flag
"S_FINISHFLAG",
"S_CORK",
"S_LHRT",
// Red Ring
"S_RRNG1",
"S_RRNG2",
"S_RRNG3",
"S_RRNG4",
"S_RRNG5",
"S_RRNG6",
"S_RRNG7",
// Weapon Ring Ammo
"S_BOUNCERINGAMMO",
"S_RAILRINGAMMO",
"S_INFINITYRINGAMMO",
"S_AUTOMATICRINGAMMO",
"S_EXPLOSIONRINGAMMO",
"S_SCATTERRINGAMMO",
"S_GRENADERINGAMMO",
// Weapon pickup
"S_BOUNCEPICKUP",
"S_BOUNCEPICKUPFADE1",
"S_BOUNCEPICKUPFADE2",
"S_BOUNCEPICKUPFADE3",
"S_BOUNCEPICKUPFADE4",
"S_BOUNCEPICKUPFADE5",
"S_BOUNCEPICKUPFADE6",
"S_BOUNCEPICKUPFADE7",
"S_BOUNCEPICKUPFADE8",
"S_RAILPICKUP",
"S_RAILPICKUPFADE1",
"S_RAILPICKUPFADE2",
"S_RAILPICKUPFADE3",
"S_RAILPICKUPFADE4",
"S_RAILPICKUPFADE5",
"S_RAILPICKUPFADE6",
"S_RAILPICKUPFADE7",
"S_RAILPICKUPFADE8",
"S_AUTOPICKUP",
"S_AUTOPICKUPFADE1",
"S_AUTOPICKUPFADE2",
"S_AUTOPICKUPFADE3",
"S_AUTOPICKUPFADE4",
"S_AUTOPICKUPFADE5",
"S_AUTOPICKUPFADE6",
"S_AUTOPICKUPFADE7",
"S_AUTOPICKUPFADE8",
"S_EXPLODEPICKUP",
"S_EXPLODEPICKUPFADE1",
"S_EXPLODEPICKUPFADE2",
"S_EXPLODEPICKUPFADE3",
"S_EXPLODEPICKUPFADE4",
"S_EXPLODEPICKUPFADE5",
"S_EXPLODEPICKUPFADE6",
"S_EXPLODEPICKUPFADE7",
"S_EXPLODEPICKUPFADE8",
"S_SCATTERPICKUP",
"S_SCATTERPICKUPFADE1",
"S_SCATTERPICKUPFADE2",
"S_SCATTERPICKUPFADE3",
"S_SCATTERPICKUPFADE4",
"S_SCATTERPICKUPFADE5",
"S_SCATTERPICKUPFADE6",
"S_SCATTERPICKUPFADE7",
"S_SCATTERPICKUPFADE8",
"S_GRENADEPICKUP",
"S_GRENADEPICKUPFADE1",
"S_GRENADEPICKUPFADE2",
"S_GRENADEPICKUPFADE3",
"S_GRENADEPICKUPFADE4",
"S_GRENADEPICKUPFADE5",
"S_GRENADEPICKUPFADE6",
"S_GRENADEPICKUPFADE7",
"S_GRENADEPICKUPFADE8",
// Thrown Weapon Rings
"S_THROWNBOUNCE1",
"S_THROWNBOUNCE2",
"S_THROWNBOUNCE3",
"S_THROWNBOUNCE4",
"S_THROWNBOUNCE5",
"S_THROWNBOUNCE6",
"S_THROWNBOUNCE7",
"S_THROWNINFINITY1",
"S_THROWNINFINITY2",
"S_THROWNINFINITY3",
"S_THROWNINFINITY4",
"S_THROWNINFINITY5",
"S_THROWNINFINITY6",
"S_THROWNINFINITY7",
"S_THROWNAUTOMATIC1",
"S_THROWNAUTOMATIC2",
"S_THROWNAUTOMATIC3",
"S_THROWNAUTOMATIC4",
"S_THROWNAUTOMATIC5",
"S_THROWNAUTOMATIC6",
"S_THROWNAUTOMATIC7",
"S_THROWNEXPLOSION1",
"S_THROWNEXPLOSION2",
"S_THROWNEXPLOSION3",
"S_THROWNEXPLOSION4",
"S_THROWNEXPLOSION5",
"S_THROWNEXPLOSION6",
"S_THROWNEXPLOSION7",
"S_THROWNGRENADE1",
"S_THROWNGRENADE2",
"S_THROWNGRENADE3",
"S_THROWNGRENADE4",
"S_THROWNGRENADE5",
"S_THROWNGRENADE6",
"S_THROWNGRENADE7",
"S_THROWNGRENADE8",
"S_THROWNGRENADE9",
"S_THROWNGRENADE10",
"S_THROWNGRENADE11",
"S_THROWNGRENADE12",
"S_THROWNGRENADE13",
"S_THROWNGRENADE14",
"S_THROWNGRENADE15",
"S_THROWNGRENADE16",
"S_THROWNGRENADE17",
"S_THROWNGRENADE18",
"S_THROWNSCATTER",
"S_RINGEXPLODE",
"S_COIN1",
"S_COIN2",
"S_COIN3",
"S_COINSPARKLE1",
"S_COINSPARKLE2",
"S_COINSPARKLE3",
"S_COINSPARKLE4",
"S_GOOMBA1",
"S_GOOMBA1B",
"S_GOOMBA2",
"S_GOOMBA3",
"S_GOOMBA4",
"S_GOOMBA5",
"S_GOOMBA6",
"S_GOOMBA7",
"S_GOOMBA8",
"S_GOOMBA9",
"S_GOOMBA_DEAD",
"S_BLUEGOOMBA1",
"S_BLUEGOOMBA1B",
"S_BLUEGOOMBA2",
"S_BLUEGOOMBA3",
"S_BLUEGOOMBA4",
"S_BLUEGOOMBA5",
"S_BLUEGOOMBA6",
"S_BLUEGOOMBA7",
"S_BLUEGOOMBA8",
"S_BLUEGOOMBA9",
"S_BLUEGOOMBA_DEAD",
// Mario-specific stuff
"S_FIREFLOWER1",
"S_FIREFLOWER2",
"S_FIREFLOWER3",
"S_FIREFLOWER4",
"S_FIREBALL",
"S_FIREBALLTRAIL1",
"S_FIREBALLTRAIL2",
"S_SHELL",
"S_PUMA_START1",
"S_PUMA_START2",
"S_PUMA_UP1",
"S_PUMA_UP2",
"S_PUMA_UP3",
"S_PUMA_DOWN1",
"S_PUMA_DOWN2",
"S_PUMA_DOWN3",
"S_PUMATRAIL1",
"S_PUMATRAIL2",
"S_PUMATRAIL3",
"S_PUMATRAIL4",
"S_HAMMER",
"S_KOOPA1",
"S_KOOPA2",
"S_KOOPAFLAME1",
"S_KOOPAFLAME2",
"S_KOOPAFLAME3",
"S_AXE1",
"S_AXE2",
"S_AXE3",
"S_MARIOBUSH1",
"S_MARIOBUSH2",
"S_TOAD",
// Nights-specific stuff
"S_NIGHTSDRONE_MAN1",
"S_NIGHTSDRONE_MAN2",
"S_NIGHTSDRONE_SPARKLING1",
"S_NIGHTSDRONE_SPARKLING2",
"S_NIGHTSDRONE_SPARKLING3",
"S_NIGHTSDRONE_SPARKLING4",
"S_NIGHTSDRONE_SPARKLING5",
"S_NIGHTSDRONE_SPARKLING6",
"S_NIGHTSDRONE_SPARKLING7",
"S_NIGHTSDRONE_SPARKLING8",
"S_NIGHTSDRONE_SPARKLING9",
"S_NIGHTSDRONE_SPARKLING10",
"S_NIGHTSDRONE_SPARKLING11",
"S_NIGHTSDRONE_SPARKLING12",
"S_NIGHTSDRONE_SPARKLING13",
"S_NIGHTSDRONE_SPARKLING14",
"S_NIGHTSDRONE_SPARKLING15",
"S_NIGHTSDRONE_SPARKLING16",
"S_NIGHTSDRONE_GOAL1",
"S_NIGHTSDRONE_GOAL2",
"S_NIGHTSDRONE_GOAL3",
"S_NIGHTSDRONE_GOAL4",
"S_NIGHTSPARKLE1",
"S_NIGHTSPARKLE2",
"S_NIGHTSPARKLE3",
"S_NIGHTSPARKLE4",
"S_NIGHTSPARKLESUPER1",
"S_NIGHTSPARKLESUPER2",
"S_NIGHTSPARKLESUPER3",
"S_NIGHTSPARKLESUPER4",
"S_NIGHTSLOOPHELPER",
// NiGHTS bumper
"S_NIGHTSBUMPER1",
"S_NIGHTSBUMPER2",
"S_NIGHTSBUMPER3",
"S_NIGHTSBUMPER4",
"S_NIGHTSBUMPER5",
"S_NIGHTSBUMPER6",
"S_NIGHTSBUMPER7",
"S_NIGHTSBUMPER8",
"S_NIGHTSBUMPER9",
"S_NIGHTSBUMPER10",
"S_NIGHTSBUMPER11",
"S_NIGHTSBUMPER12",
"S_HOOP",
"S_HOOP_XMASA",
"S_HOOP_XMASB",
"S_NIGHTSCORE10",
"S_NIGHTSCORE20",
"S_NIGHTSCORE30",
"S_NIGHTSCORE40",
"S_NIGHTSCORE50",
"S_NIGHTSCORE60",
"S_NIGHTSCORE70",
"S_NIGHTSCORE80",
"S_NIGHTSCORE90",
"S_NIGHTSCORE100",
"S_NIGHTSCORE10_2",
"S_NIGHTSCORE20_2",
"S_NIGHTSCORE30_2",
"S_NIGHTSCORE40_2",
"S_NIGHTSCORE50_2",
"S_NIGHTSCORE60_2",
"S_NIGHTSCORE70_2",
"S_NIGHTSCORE80_2",
"S_NIGHTSCORE90_2",
"S_NIGHTSCORE100_2",
// NiGHTS Paraloop Powerups
"S_NIGHTSSUPERLOOP",
"S_NIGHTSDRILLREFILL",
"S_NIGHTSHELPER",
"S_NIGHTSEXTRATIME",
"S_NIGHTSLINKFREEZE",
"S_EGGCAPSULE",
// Orbiting Chaos Emeralds
"S_ORBITEM1",
"S_ORBITEM2",
"S_ORBITEM3",
"S_ORBITEM4",
"S_ORBITEM5",
"S_ORBITEM6",
"S_ORBITEM7",
"S_ORBITEM8",
"S_ORBIDYA1",
"S_ORBIDYA2",
"S_ORBIDYA3",
"S_ORBIDYA4",
"S_ORBIDYA5",
// "Flicky" helper
"S_NIGHTOPIANHELPER1",
"S_NIGHTOPIANHELPER2",
"S_NIGHTOPIANHELPER3",
"S_NIGHTOPIANHELPER4",
"S_NIGHTOPIANHELPER5",
"S_NIGHTOPIANHELPER6",
"S_NIGHTOPIANHELPER7",
"S_NIGHTOPIANHELPER8",
"S_NIGHTOPIANHELPER9",
// Nightopian
"S_PIAN_LOOK1",
"S_PIAN_LOOK2",
"S_PIAN_LOOK3",
"S_PIAN_FLY1",
"S_PIAN_FLY2",
"S_PIAN_FLY3",
"S_PIAN_SING",
// Shleep
"S_SHLEEP1",
"S_SHLEEP2",
"S_SHLEEP3",
"S_SHLEEP4",
"S_SHLEEPBOUNCE1",
"S_SHLEEPBOUNCE2",
"S_SHLEEPBOUNCE3",
// Secret badniks and hazards, shhhh
"S_PENGUINATOR_LOOK",
"S_PENGUINATOR_WADDLE1",
"S_PENGUINATOR_WADDLE2",
"S_PENGUINATOR_WADDLE3",
"S_PENGUINATOR_WADDLE4",
"S_PENGUINATOR_SLIDE1",
"S_PENGUINATOR_SLIDE2",
"S_PENGUINATOR_SLIDE3",
"S_PENGUINATOR_SLIDE4",
"S_PENGUINATOR_SLIDE5",
"S_POPHAT_LOOK",
"S_POPHAT_SHOOT1",
"S_POPHAT_SHOOT2",
"S_POPHAT_SHOOT3",
"S_POPHAT_SHOOT4",
"S_POPSHOT",
"S_POPSHOT_TRAIL",
"S_HIVEELEMENTAL_LOOK",
"S_HIVEELEMENTAL_PREPARE1",
"S_HIVEELEMENTAL_PREPARE2",
"S_HIVEELEMENTAL_SHOOT1",
"S_HIVEELEMENTAL_SHOOT2",
"S_HIVEELEMENTAL_DORMANT",
"S_HIVEELEMENTAL_PAIN",
"S_HIVEELEMENTAL_DIE1",
"S_HIVEELEMENTAL_DIE2",
"S_HIVEELEMENTAL_DIE3",
"S_BUMBLEBORE_SPAWN",
"S_BUMBLEBORE_LOOK1",
"S_BUMBLEBORE_LOOK2",
"S_BUMBLEBORE_FLY1",
"S_BUMBLEBORE_FLY2",
"S_BUMBLEBORE_RAISE",
"S_BUMBLEBORE_FALL1",
"S_BUMBLEBORE_FALL2",
"S_BUMBLEBORE_STUCK1",
"S_BUMBLEBORE_STUCK2",
"S_BUMBLEBORE_DIE",
"S_BUGGLEIDLE",
"S_BUGGLEFLY",
"S_SMASHSPIKE_FLOAT",
"S_SMASHSPIKE_EASE1",
"S_SMASHSPIKE_EASE2",
"S_SMASHSPIKE_FALL",
"S_SMASHSPIKE_STOMP1",
"S_SMASHSPIKE_STOMP2",
"S_SMASHSPIKE_RISE1",
"S_SMASHSPIKE_RISE2",
"S_CACO_LOOK",
"S_CACO_WAKE1",
"S_CACO_WAKE2",
"S_CACO_WAKE3",
"S_CACO_WAKE4",
"S_CACO_ROAR",
"S_CACO_CHASE",
"S_CACO_CHASE_REPEAT",
"S_CACO_RANDOM",
"S_CACO_PREPARE_SOUND",
"S_CACO_PREPARE1",
"S_CACO_PREPARE2",
"S_CACO_PREPARE3",
"S_CACO_SHOOT_SOUND",
"S_CACO_SHOOT1",
"S_CACO_SHOOT2",
"S_CACO_CLOSE",
"S_CACO_DIE_FLAGS",
"S_CACO_DIE_GIB1",
"S_CACO_DIE_GIB2",
"S_CACO_DIE_SCREAM",
"S_CACO_DIE_SHATTER",
"S_CACO_DIE_FALL",
"S_CACOSHARD_RANDOMIZE",
"S_CACOSHARD1_1",
"S_CACOSHARD1_2",
"S_CACOSHARD2_1",
"S_CACOSHARD2_2",
"S_CACOFIRE1",
"S_CACOFIRE2",
"S_CACOFIRE3",
"S_CACOFIRE_EXPLODE1",
"S_CACOFIRE_EXPLODE2",
"S_CACOFIRE_EXPLODE3",
"S_CACOFIRE_EXPLODE4",
"S_SPINBOBERT_MOVE_FLIPUP",
"S_SPINBOBERT_MOVE_UP",
"S_SPINBOBERT_MOVE_FLIPDOWN",
"S_SPINBOBERT_MOVE_DOWN",
"S_SPINBOBERT_FIRE_MOVE",
"S_SPINBOBERT_FIRE_GHOST",
"S_SPINBOBERT_FIRE_TRAIL1",
"S_SPINBOBERT_FIRE_TRAIL2",
"S_SPINBOBERT_FIRE_TRAIL3",
"S_HANGSTER_LOOK",
"S_HANGSTER_SWOOP1",
"S_HANGSTER_SWOOP2",
"S_HANGSTER_ARC1",
"S_HANGSTER_ARC2",
"S_HANGSTER_ARC3",
"S_HANGSTER_FLY1",
"S_HANGSTER_FLY2",
"S_HANGSTER_FLY3",
"S_HANGSTER_FLY4",
"S_HANGSTER_FLYREPEAT",
"S_HANGSTER_ARCUP1",
"S_HANGSTER_ARCUP2",
"S_HANGSTER_ARCUP3",
"S_HANGSTER_RETURN1",
"S_HANGSTER_RETURN2",
"S_HANGSTER_RETURN3",
"S_CRUMBLE1",
"S_CRUMBLE2",
// Spark
"S_SPRK1",
"S_SPRK2",
"S_SPRK3",
// Robot Explosion
"S_XPLD_FLICKY",
"S_XPLD1",
"S_XPLD2",
"S_XPLD3",
"S_XPLD4",
"S_XPLD5",
"S_XPLD6",
"S_XPLD_EGGTRAP",
// Underwater Explosion
"S_WPLD1",
"S_WPLD2",
"S_WPLD3",
"S_WPLD4",
"S_WPLD5",
"S_WPLD6",
"S_DUST1",
"S_DUST2",
"S_DUST3",
"S_DUST4",
"S_ROCKSPAWN",
"S_ROCKCRUMBLEA",
"S_ROCKCRUMBLEB",
"S_ROCKCRUMBLEC",
"S_ROCKCRUMBLED",
"S_ROCKCRUMBLEE",
"S_ROCKCRUMBLEF",
"S_ROCKCRUMBLEG",
"S_ROCKCRUMBLEH",
"S_ROCKCRUMBLEI",
"S_ROCKCRUMBLEJ",
"S_ROCKCRUMBLEK",
"S_ROCKCRUMBLEL",
"S_ROCKCRUMBLEM",
"S_ROCKCRUMBLEN",
"S_ROCKCRUMBLEO",
"S_ROCKCRUMBLEP",
// Level debris
"S_GFZDEBRIS",
"S_BRICKDEBRIS",
"S_WOODDEBRIS",
"S_REDBRICKDEBRIS",
"S_BLUEBRICKDEBRIS",
"S_YELLOWBRICKDEBRIS",
"S_NAMECHECK",
// LJ Knuckles
"S_OLDK_STND",
"S_OLDK_DIE0",
"S_OLDK_DIE1",
"S_OLDK_DIE2",
};
// RegEx to generate this from info.h: ^\tMT_([^,]+), --> \t"MT_\1",
// I am leaving the prefixes solely for clarity to programmers,
// because sadly no one remembers this place while searching for full state names.
const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity testing later.
"MT_NULL",
"MT_UNKNOWN",
"MT_THOK", // Thok! mobj
"MT_PLAYER",
"MT_TAILSOVERLAY", // c:
"MT_METALJETFUME",
// Enemies
"MT_BLUECRAWLA", // Crawla (Blue)
"MT_REDCRAWLA", // Crawla (Red)
"MT_GFZFISH", // SDURF
"MT_GOLDBUZZ", // Buzz (Gold)
"MT_REDBUZZ", // Buzz (Red)
"MT_JETTBOMBER", // Jetty-Syn Bomber
"MT_JETTGUNNER", // Jetty-Syn Gunner
"MT_CRAWLACOMMANDER", // Crawla Commander
"MT_DETON", // Deton
"MT_SKIM", // Skim mine dropper
"MT_TURRET", // Industrial Turret
"MT_POPUPTURRET", // Pop-Up Turret
"MT_SPINCUSHION", // Spincushion
"MT_CRUSHSTACEAN", // Crushstacean
"MT_CRUSHCLAW", // Big meaty claw
"MT_CRUSHCHAIN", // Chain
"MT_BANPYURA", // Banpyura
"MT_BANPSPRING", // Banpyura spring
"MT_JETJAW", // Jet Jaw
"MT_SNAILER", // Snailer
"MT_VULTURE", // BASH
"MT_POINTY", // Pointy
"MT_POINTYBALL", // Pointy Ball
"MT_ROBOHOOD", // Robo-Hood
"MT_FACESTABBER", // Castlebot Facestabber
"MT_FACESTABBERSPEAR", // Castlebot Facestabber spear aura
"MT_EGGGUARD", // Egg Guard
"MT_EGGSHIELD", // Egg Guard's shield
"MT_GSNAPPER", // Green Snapper
"MT_SNAPPER_LEG", // Green Snapper leg
"MT_SNAPPER_HEAD", // Green Snapper head
"MT_MINUS", // Minus
"MT_MINUSDIRT", // Minus dirt
"MT_SPRINGSHELL", // Spring Shell
"MT_YELLOWSHELL", // Spring Shell (yellow)
"MT_UNIDUS", // Unidus
"MT_UNIBALL", // Unidus Ball
"MT_CANARIVORE", // Canarivore
"MT_CANARIVORE_GAS", // Canarivore gas
"MT_PYREFLY", // Pyre Fly
"MT_PYREFLY_FIRE", // Pyre Fly fire
"MT_PTERABYTESPAWNER", // Pterabyte spawner
"MT_PTERABYTEWAYPOINT", // Pterabyte waypoint
"MT_PTERABYTE", // Pterabyte
"MT_DRAGONBOMBER", // Dragonbomber
"MT_DRAGONWING", // Dragonbomber wing
"MT_DRAGONTAIL", // Dragonbomber tail segment
"MT_DRAGONMINE", // Dragonbomber mine
// Generic Boss Items
"MT_BOSSEXPLODE",
"MT_SONIC3KBOSSEXPLODE",
"MT_BOSSFLYPOINT",
"MT_EGGTRAP",
"MT_BOSS3WAYPOINT",
"MT_BOSS9GATHERPOINT",
"MT_BOSSJUNK",
// Boss 1
"MT_EGGMOBILE",
"MT_JETFUME1",
"MT_EGGMOBILE_BALL",
"MT_EGGMOBILE_TARGET",
"MT_EGGMOBILE_FIRE",
// Boss 2
"MT_EGGMOBILE2",
"MT_EGGMOBILE2_POGO",
"MT_GOOP",
"MT_GOOPTRAIL",
// Boss 3
"MT_EGGMOBILE3",
"MT_FAKEMOBILE",
"MT_SHOCKWAVE",
// Boss 4
"MT_EGGMOBILE4",
"MT_EGGMOBILE4_MACE",
"MT_JETFLAME",
"MT_EGGROBO1",
"MT_EGGROBO1JET",
// Boss 5
"MT_FANG",
"MT_BROKENROBOT",
"MT_VWREF",
"MT_VWREB",
"MT_PROJECTORLIGHT",
"MT_FBOMB",
"MT_TNTDUST", // also used by barrel
"MT_FSGNA",
"MT_FSGNB",
"MT_FANGWAYPOINT",
// Black Eggman (Boss 7)
"MT_BLACKEGGMAN",
"MT_BLACKEGGMAN_HELPER",
"MT_BLACKEGGMAN_GOOPFIRE",
"MT_BLACKEGGMAN_MISSILE",
// New Very-Last-Minute 2.1 Brak Eggman (Cy-Brak-demon)
"MT_CYBRAKDEMON",
"MT_CYBRAKDEMON_ELECTRIC_BARRIER",
"MT_CYBRAKDEMON_MISSILE",
"MT_CYBRAKDEMON_FLAMESHOT",
"MT_CYBRAKDEMON_FLAMEREST",
"MT_CYBRAKDEMON_TARGET_RETICULE",
"MT_CYBRAKDEMON_TARGET_DOT",
"MT_CYBRAKDEMON_NAPALM_BOMB_LARGE",
"MT_CYBRAKDEMON_NAPALM_BOMB_SMALL",
"MT_CYBRAKDEMON_NAPALM_FLAMES",
"MT_CYBRAKDEMON_VILE_EXPLOSION",
// Metal Sonic (Boss 9)
"MT_METALSONIC_RACE",
"MT_METALSONIC_BATTLE",
"MT_MSSHIELD_FRONT",
"MT_MSGATHER",
// Collectible Items
"MT_RING",
"MT_FLINGRING", // Lost ring
"MT_BLUESPHERE", // Blue sphere for special stages
"MT_FLINGBLUESPHERE", // Lost blue sphere
"MT_BOMBSPHERE",
"MT_REDTEAMRING", //Rings collectable by red team.
"MT_BLUETEAMRING", //Rings collectable by blue team.
"MT_TOKEN", // Special Stage token for special stage
"MT_REDFLAG", // Red CTF Flag
"MT_BLUEFLAG", // Blue CTF Flag
"MT_EMBLEM",
"MT_EMERALD1",
"MT_EMERALD2",
"MT_EMERALD3",
"MT_EMERALD4",
"MT_EMERALD5",
"MT_EMERALD6",
"MT_EMERALD7",
"MT_EMERHUNT", // Emerald Hunt
"MT_EMERALDSPAWN", // Emerald spawner w/ delay
"MT_FLINGEMERALD", // Lost emerald
// Springs and others
"MT_FAN",
"MT_STEAM",
"MT_BUMPER",
"MT_BALLOON",
"MT_YELLOWSPRING",
"MT_REDSPRING",
"MT_BLUESPRING",
"MT_YELLOWDIAG",
"MT_REDDIAG",
"MT_BLUEDIAG",
"MT_YELLOWHORIZ",
"MT_REDHORIZ",
"MT_BLUEHORIZ",
"MT_BOOSTERSEG",
"MT_BOOSTERROLLER",
"MT_YELLOWBOOSTER",
"MT_REDBOOSTER",
// Interactive Objects
"MT_BUBBLES", // Bubble source
"MT_SIGN", // Level end sign
"MT_SPIKEBALL", // Spike Ball
"MT_SPINFIRE",
"MT_SPIKE",
"MT_WALLSPIKE",
"MT_WALLSPIKEBASE",
"MT_STARPOST",
"MT_BIGMINE",
"MT_BLASTEXECUTOR",
"MT_CANNONLAUNCHER",
// Monitor miscellany
"MT_BOXSPARKLE",
// Monitor boxes -- regular
"MT_RING_BOX",
"MT_PITY_BOX",
"MT_ATTRACT_BOX",
"MT_FORCE_BOX",
"MT_ARMAGEDDON_BOX",
"MT_WHIRLWIND_BOX",
"MT_ELEMENTAL_BOX",
"MT_SNEAKERS_BOX",
"MT_INVULN_BOX",
"MT_1UP_BOX",
"MT_EGGMAN_BOX",
"MT_MIXUP_BOX",
"MT_MYSTERY_BOX",
"MT_GRAVITY_BOX",
"MT_RECYCLER_BOX",
"MT_SCORE1K_BOX",
"MT_SCORE10K_BOX",
"MT_FLAMEAURA_BOX",
"MT_BUBBLEWRAP_BOX",
"MT_THUNDERCOIN_BOX",
// Monitor boxes -- repeating (big) boxes
"MT_PITY_GOLDBOX",
"MT_ATTRACT_GOLDBOX",
"MT_FORCE_GOLDBOX",
"MT_ARMAGEDDON_GOLDBOX",
"MT_WHIRLWIND_GOLDBOX",
"MT_ELEMENTAL_GOLDBOX",
"MT_SNEAKERS_GOLDBOX",
"MT_INVULN_GOLDBOX",
"MT_EGGMAN_GOLDBOX",
"MT_GRAVITY_GOLDBOX",
"MT_FLAMEAURA_GOLDBOX",
"MT_BUBBLEWRAP_GOLDBOX",
"MT_THUNDERCOIN_GOLDBOX",
// Monitor boxes -- special
"MT_RING_REDBOX",
"MT_RING_BLUEBOX",
// Monitor icons
"MT_RING_ICON",
"MT_PITY_ICON",
"MT_ATTRACT_ICON",
"MT_FORCE_ICON",
"MT_ARMAGEDDON_ICON",
"MT_WHIRLWIND_ICON",
"MT_ELEMENTAL_ICON",
"MT_SNEAKERS_ICON",
"MT_INVULN_ICON",
"MT_1UP_ICON",
"MT_EGGMAN_ICON",
"MT_MIXUP_ICON",
"MT_GRAVITY_ICON",
"MT_RECYCLER_ICON",
"MT_SCORE1K_ICON",
"MT_SCORE10K_ICON",
"MT_FLAMEAURA_ICON",
"MT_BUBBLEWRAP_ICON",
"MT_THUNDERCOIN_ICON",
// Projectiles
"MT_ROCKET",
"MT_LASER",
"MT_TORPEDO",
"MT_TORPEDO2", // silent
"MT_ENERGYBALL",
"MT_MINE", // Skim/Jetty-Syn mine
"MT_JETTBULLET", // Jetty-Syn Bullet
"MT_TURRETLASER",
"MT_CANNONBALL", // Cannonball
"MT_CANNONBALLDECOR", // Decorative/still cannonball
"MT_ARROW", // Arrow
"MT_DEMONFIRE", // Glaregoyle fire
// The letter
"MT_LETTER",
// Tutorial Scenery
"MT_TUTORIALPLANT",
"MT_TUTORIALLEAF",
"MT_TUTORIALFLOWER",
"MT_TUTORIALFLOWERF",
// Greenflower Scenery
"MT_GFZFLOWER1",
"MT_GFZFLOWER2",
"MT_GFZFLOWER3",
"MT_BLUEBERRYBUSH",
"MT_BERRYBUSH",
"MT_BUSH",
// Trees (both GFZ and misc)
"MT_GFZTREE",
"MT_GFZBERRYTREE",
"MT_GFZCHERRYTREE",
"MT_CHECKERTREE",
"MT_CHECKERSUNSETTREE",
"MT_FHZTREE", // Frozen Hillside
"MT_FHZPINKTREE",
"MT_POLYGONTREE",
"MT_BUSHTREE",
"MT_BUSHREDTREE",
"MT_SPRINGTREE",
// Techno Hill Scenery
"MT_THZFLOWER1",
"MT_THZFLOWER2",
"MT_THZFLOWER3",
"MT_THZTREE", // Steam whistle tree/bush
"MT_THZTREEBRANCH", // branch of said tree
"MT_ALARM",
// Deep Sea Scenery
"MT_GARGOYLE", // Deep Sea Gargoyle
"MT_BIGGARGOYLE", // Deep Sea Gargoyle (Big)
"MT_SEAWEED", // DSZ Seaweed
"MT_WATERDRIP", // Dripping Water source
"MT_WATERDROP", // Water drop from dripping water
"MT_CORAL1", // Coral
"MT_CORAL2",
"MT_CORAL3",
"MT_CORAL4",
"MT_CORAL5",
"MT_BLUECRYSTAL", // Blue Crystal
"MT_KELP", // Kelp
"MT_ANIMALGAETOP", // Animated algae top
"MT_ANIMALGAESEG", // Animated algae segment
"MT_DSZSTALAGMITE", // Deep Sea 1 Stalagmite
"MT_DSZ2STALAGMITE", // Deep Sea 2 Stalagmite
"MT_LIGHTBEAM", // DSZ Light beam
// Castle Eggman Scenery
"MT_CHAIN", // CEZ Chain
"MT_FLAME", // Flame (has corona)
"MT_FLAMEPARTICLE",
"MT_EGGSTATUE", // Eggman Statue
"MT_MACEPOINT", // Mace rotation point
"MT_CHAINMACEPOINT", // Combination of chains and maces point
"MT_SPRINGBALLPOINT", // Spring ball point
"MT_CHAINPOINT", // Mace chain
"MT_HIDDEN_SLING", // Spin mace chain (activatable)
"MT_FIREBARPOINT", // Firebar
"MT_CUSTOMMACEPOINT", // Custom mace
"MT_SMALLMACECHAIN", // Small Mace Chain
"MT_BIGMACECHAIN", // Big Mace Chain
"MT_SMALLMACE", // Small Mace
"MT_BIGMACE", // Big Mace
"MT_SMALLGRABCHAIN", // Small Grab Chain
"MT_BIGGRABCHAIN", // Big Grab Chain
"MT_BLUESPRINGBALL", // Blue spring on a ball
"MT_YELLOWSPRINGBALL", // Yellow spring on a ball
"MT_REDSPRINGBALL", // Red spring on a ball
"MT_SMALLFIREBAR", // Small Firebar
"MT_BIGFIREBAR", // Big Firebar
"MT_CEZFLOWER", // Flower
"MT_CEZPOLE1", // Pole (with red banner)
"MT_CEZPOLE2", // Pole (with blue banner)
"MT_CEZBANNER1", // Banner (red)
"MT_CEZBANNER2", // Banner (blue)
"MT_PINETREE", // Pine Tree
"MT_CEZBUSH1", // Bush 1
"MT_CEZBUSH2", // Bush 2
"MT_CANDLE", // Candle
"MT_CANDLEPRICKET", // Candle pricket
"MT_FLAMEHOLDER", // Flame holder
"MT_FIRETORCH", // Fire torch
"MT_WAVINGFLAG1", // Waving flag (red)
"MT_WAVINGFLAG2", // Waving flag (blue)
"MT_WAVINGFLAGSEG1", // Waving flag segment (red)
"MT_WAVINGFLAGSEG2", // Waving flag segment (blue)
"MT_CRAWLASTATUE", // Crawla statue
"MT_FACESTABBERSTATUE", // Facestabber statue
"MT_SUSPICIOUSFACESTABBERSTATUE", // :eggthinking:
"MT_BRAMBLES", // Brambles
// Arid Canyon Scenery
"MT_BIGTUMBLEWEED",
"MT_LITTLETUMBLEWEED",
"MT_CACTI1", // Tiny Red Flower Cactus
"MT_CACTI2", // Small Red Flower Cactus
"MT_CACTI3", // Tiny Blue Flower Cactus
"MT_CACTI4", // Small Blue Flower Cactus
"MT_CACTI5", // Prickly Pear
"MT_CACTI6", // Barrel Cactus
"MT_CACTI7", // Tall Barrel Cactus
"MT_CACTI8", // Armed Cactus
"MT_CACTI9", // Ball Cactus
"MT_CACTI10", // Tiny Cactus
"MT_CACTI11", // Small Cactus
"MT_CACTITINYSEG", // Tiny Cactus Segment
"MT_CACTISMALLSEG", // Small Cactus Segment
"MT_ARIDSIGN_CAUTION", // Caution Sign
"MT_ARIDSIGN_CACTI", // Cacti Sign
"MT_ARIDSIGN_SHARPTURN", // Sharp Turn Sign
"MT_OILLAMP",
"MT_TNTBARREL",
"MT_PROXIMITYTNT",
"MT_DUSTDEVIL",
"MT_DUSTLAYER",
"MT_ARIDDUST",
"MT_MINECART",
"MT_MINECARTSEG",
"MT_MINECARTSPAWNER",
"MT_MINECARTEND",
"MT_MINECARTENDSOLID",
"MT_MINECARTSIDEMARK",
"MT_MINECARTSPARK",
"MT_SALOONDOOR",
"MT_SALOONDOORCENTER",
"MT_TRAINCAMEOSPAWNER",
"MT_TRAINSEG",
"MT_TRAINDUSTSPAWNER",
"MT_TRAINSTEAMSPAWNER",
"MT_MINECARTSWITCHPOINT",
// Red Volcano Scenery
"MT_FLAMEJET",
"MT_VERTICALFLAMEJET",
"MT_FLAMEJETFLAME",
"MT_FJSPINAXISA", // Counter-clockwise
"MT_FJSPINAXISB", // Clockwise
"MT_FLAMEJETFLAMEB", // Blade's flame
"MT_LAVAFALL",
"MT_LAVAFALL_LAVA",
"MT_LAVAFALLROCK",
"MT_ROLLOUTSPAWN",
"MT_ROLLOUTROCK",
"MT_BIGFERNLEAF",
"MT_BIGFERN",
"MT_JUNGLEPALM",
"MT_TORCHFLOWER",
"MT_WALLVINE_LONG",
"MT_WALLVINE_SHORT",
// Dark City Scenery
// Egg Rock Scenery
// Azure Temple Scenery
"MT_GLAREGOYLE",
"MT_GLAREGOYLEUP",
"MT_GLAREGOYLEDOWN",
"MT_GLAREGOYLELONG",
"MT_TARGET", // AKA Red Crystal
"MT_GREENFLAME",
"MT_BLUEGARGOYLE",
// Stalagmites
"MT_STALAGMITE0",
"MT_STALAGMITE1",
"MT_STALAGMITE2",
"MT_STALAGMITE3",
"MT_STALAGMITE4",
"MT_STALAGMITE5",
"MT_STALAGMITE6",
"MT_STALAGMITE7",
"MT_STALAGMITE8",
"MT_STALAGMITE9",
// Christmas Scenery
"MT_XMASPOLE",
"MT_CANDYCANE",
"MT_SNOWMAN", // normal
"MT_SNOWMANHAT", // with hat + scarf
"MT_LAMPPOST1", // normal
"MT_LAMPPOST2", // with snow
"MT_HANGSTAR",
"MT_MISTLETOE",
"MT_SSZTREE",
"MT_SSZTREE_BRANCH",
"MT_SSZTREE2",
"MT_SSZTREE2_BRANCH",
// Xmas GFZ bushes
"MT_XMASBLUEBERRYBUSH",
"MT_XMASBERRYBUSH",
"MT_XMASBUSH",
// FHZ
"MT_FHZICE1",
"MT_FHZICE2",
"MT_ROSY",
"MT_CDLHRT",
// Halloween Scenery
// Pumpkins
"MT_JACKO1",
"MT_JACKO2",
"MT_JACKO3",
// Dr Seuss Trees
"MT_HHZTREE_TOP",
"MT_HHZTREE_PART",
// Misc
"MT_HHZSHROOM",
"MT_HHZGRASS",
"MT_HHZTENTACLE1",
"MT_HHZTENTACLE2",
"MT_HHZSTALAGMITE_TALL",
"MT_HHZSTALAGMITE_SHORT",
// Botanic Serenity scenery
"MT_BSZTALLFLOWER_RED",
"MT_BSZTALLFLOWER_PURPLE",
"MT_BSZTALLFLOWER_BLUE",
"MT_BSZTALLFLOWER_CYAN",
"MT_BSZTALLFLOWER_YELLOW",
"MT_BSZTALLFLOWER_ORANGE",
"MT_BSZFLOWER_RED",
"MT_BSZFLOWER_PURPLE",
"MT_BSZFLOWER_BLUE",
"MT_BSZFLOWER_CYAN",
"MT_BSZFLOWER_YELLOW",
"MT_BSZFLOWER_ORANGE",
"MT_BSZSHORTFLOWER_RED",
"MT_BSZSHORTFLOWER_PURPLE",
"MT_BSZSHORTFLOWER_BLUE",
"MT_BSZSHORTFLOWER_CYAN",
"MT_BSZSHORTFLOWER_YELLOW",
"MT_BSZSHORTFLOWER_ORANGE",
"MT_BSZTULIP_RED",
"MT_BSZTULIP_PURPLE",
"MT_BSZTULIP_BLUE",
"MT_BSZTULIP_CYAN",
"MT_BSZTULIP_YELLOW",
"MT_BSZTULIP_ORANGE",
"MT_BSZCLUSTER_RED",
"MT_BSZCLUSTER_PURPLE",
"MT_BSZCLUSTER_BLUE",
"MT_BSZCLUSTER_CYAN",
"MT_BSZCLUSTER_YELLOW",
"MT_BSZCLUSTER_ORANGE",
"MT_BSZBUSH_RED",
"MT_BSZBUSH_PURPLE",
"MT_BSZBUSH_BLUE",
"MT_BSZBUSH_CYAN",
"MT_BSZBUSH_YELLOW",
"MT_BSZBUSH_ORANGE",
"MT_BSZVINE_RED",
"MT_BSZVINE_PURPLE",
"MT_BSZVINE_BLUE",
"MT_BSZVINE_CYAN",
"MT_BSZVINE_YELLOW",
"MT_BSZVINE_ORANGE",
"MT_BSZSHRUB",
"MT_BSZCLOVER",
"MT_BIG_PALMTREE_TRUNK",
"MT_BIG_PALMTREE_TOP",
"MT_PALMTREE_TRUNK",
"MT_PALMTREE_TOP",
// Misc scenery
"MT_DBALL",
"MT_EGGSTATUE2",
"MT_GINE",
"MT_PPAL",
"MT_PPEL",
// Powerup Indicators
"MT_ELEMENTAL_ORB", // Elemental shield mobj
"MT_ATTRACT_ORB", // Attract shield mobj
"MT_FORCE_ORB", // Force shield mobj
"MT_ARMAGEDDON_ORB", // Armageddon shield mobj
"MT_WHIRLWIND_ORB", // Whirlwind shield mobj
"MT_PITY_ORB", // Pity shield mobj
"MT_FLAMEAURA_ORB", // Flame shield mobj
"MT_BUBBLEWRAP_ORB", // Bubble shield mobj
"MT_THUNDERCOIN_ORB", // Thunder shield mobj
"MT_THUNDERCOIN_SPARK", // Thunder spark
"MT_IVSP", // Invincibility sparkles
"MT_SUPERSPARK", // Super Sonic Spark
// Flickies
"MT_FLICKY_01", // Bluebird
"MT_FLICKY_01_CENTER",
"MT_FLICKY_02", // Rabbit
"MT_FLICKY_02_CENTER",
"MT_FLICKY_03", // Chicken
"MT_FLICKY_03_CENTER",
"MT_FLICKY_04", // Seal
"MT_FLICKY_04_CENTER",
"MT_FLICKY_05", // Pig
"MT_FLICKY_05_CENTER",
"MT_FLICKY_06", // Chipmunk
"MT_FLICKY_06_CENTER",
"MT_FLICKY_07", // Penguin
"MT_FLICKY_07_CENTER",
"MT_FLICKY_08", // Fish
"MT_FLICKY_08_CENTER",
"MT_FLICKY_09", // Ram
"MT_FLICKY_09_CENTER",
"MT_FLICKY_10", // Puffin
"MT_FLICKY_10_CENTER",
"MT_FLICKY_11", // Cow
"MT_FLICKY_11_CENTER",
"MT_FLICKY_12", // Rat
"MT_FLICKY_12_CENTER",
"MT_FLICKY_13", // Bear
"MT_FLICKY_13_CENTER",
"MT_FLICKY_14", // Dove
"MT_FLICKY_14_CENTER",
"MT_FLICKY_15", // Cat
"MT_FLICKY_15_CENTER",
"MT_FLICKY_16", // Canary
"MT_FLICKY_16_CENTER",
"MT_SECRETFLICKY_01", // Spider
"MT_SECRETFLICKY_01_CENTER",
"MT_SECRETFLICKY_02", // Bat
"MT_SECRETFLICKY_02_CENTER",
"MT_SEED",
// Environmental Effects
"MT_RAIN", // Rain
"MT_SNOWFLAKE", // Snowflake
"MT_SPLISH", // Water splish!
"MT_LAVASPLISH", // Lava splish!
"MT_SMOKE",
"MT_SMALLBUBBLE", // small bubble
"MT_MEDIUMBUBBLE", // medium bubble
"MT_EXTRALARGEBUBBLE", // extra large bubble
"MT_WATERZAP",
"MT_SPINDUST", // Spindash dust
"MT_TFOG",
"MT_PARTICLE",
"MT_PARTICLEGEN", // For fans, etc.
// Game Indicators
"MT_SCORE", // score logo
"MT_DROWNNUMBERS", // Drowning Timer
"MT_GOTEMERALD", // Chaos Emerald (intangible)
"MT_LOCKON", // Target
"MT_LOCKONINF", // In-level Target
"MT_TAG", // Tag Sign
"MT_GOTFLAG", // Got Flag sign
"MT_FINISHFLAG", // Finish flag
// Ambient Sounds
"MT_AMBIENT",
"MT_CORK",
"MT_LHRT",
// Ring Weapons
"MT_REDRING",
"MT_BOUNCERING",
"MT_RAILRING",
"MT_INFINITYRING",
"MT_AUTOMATICRING",
"MT_EXPLOSIONRING",
"MT_SCATTERRING",
"MT_GRENADERING",
"MT_BOUNCEPICKUP",
"MT_RAILPICKUP",
"MT_AUTOPICKUP",
"MT_EXPLODEPICKUP",
"MT_SCATTERPICKUP",
"MT_GRENADEPICKUP",
"MT_THROWNBOUNCE",
"MT_THROWNINFINITY",
"MT_THROWNAUTOMATIC",
"MT_THROWNSCATTER",
"MT_THROWNEXPLOSION",
"MT_THROWNGRENADE",
// Mario-specific stuff
"MT_COIN",
"MT_FLINGCOIN",
"MT_GOOMBA",
"MT_BLUEGOOMBA",
"MT_FIREFLOWER",
"MT_FIREBALL",
"MT_FIREBALLTRAIL",
"MT_SHELL",
"MT_PUMA",
"MT_PUMATRAIL",
"MT_HAMMER",
"MT_KOOPA",
"MT_KOOPAFLAME",
"MT_AXE",
"MT_MARIOBUSH1",
"MT_MARIOBUSH2",
"MT_TOAD",
// NiGHTS Stuff
"MT_AXIS",
"MT_AXISTRANSFER",
"MT_AXISTRANSFERLINE",
"MT_NIGHTSDRONE",
"MT_NIGHTSDRONE_MAN",
"MT_NIGHTSDRONE_SPARKLING",
"MT_NIGHTSDRONE_GOAL",
"MT_NIGHTSPARKLE",
"MT_NIGHTSLOOPHELPER",
"MT_NIGHTSBUMPER", // NiGHTS Bumper
"MT_HOOP",
"MT_HOOPCOLLIDE", // Collision detection for NiGHTS hoops
"MT_HOOPCENTER", // Center of a hoop
"MT_NIGHTSCORE",
"MT_NIGHTSCHIP", // NiGHTS Chip
"MT_FLINGNIGHTSCHIP", // Lost NiGHTS Chip
"MT_NIGHTSSTAR", // NiGHTS Star
"MT_FLINGNIGHTSSTAR", // Lost NiGHTS Star
"MT_NIGHTSSUPERLOOP",
"MT_NIGHTSDRILLREFILL",
"MT_NIGHTSHELPER",
"MT_NIGHTSEXTRATIME",
"MT_NIGHTSLINKFREEZE",
"MT_EGGCAPSULE",
"MT_IDEYAANCHOR",
"MT_NIGHTOPIANHELPER", // the actual helper object that orbits you
"MT_PIAN", // decorative singing friend
"MT_SHLEEP", // almost-decorative sleeping enemy
// Secret badniks and hazards, shhhh
"MT_PENGUINATOR",
"MT_POPHAT",
"MT_POPSHOT",
"MT_POPSHOT_TRAIL",
"MT_HIVEELEMENTAL",
"MT_BUMBLEBORE",
"MT_BUGGLE",
"MT_SMASHINGSPIKEBALL",
"MT_CACOLANTERN",
"MT_CACOSHARD",
"MT_CACOFIRE",
"MT_SPINBOBERT",
"MT_SPINBOBERT_FIRE1",
"MT_SPINBOBERT_FIRE2",
"MT_HANGSTER",
// Utility Objects
"MT_TELEPORTMAN",
"MT_ALTVIEWMAN",
"MT_CRUMBLEOBJ", // Sound generator for crumbling platform
"MT_TUBEWAYPOINT",
"MT_PUSH",
"MT_GHOST",
"MT_OVERLAY",
"MT_ANGLEMAN",
"MT_POLYANCHOR",
"MT_POLYSPAWN",
// Portal objects
"MT_SKYBOX",
// Debris
"MT_SPARK", //spark
"MT_EXPLODE", // Robot Explosion
"MT_UWEXPLODE", // Underwater Explosion
"MT_DUST",
"MT_ROCKSPAWNER",
"MT_FALLINGROCK",
"MT_ROCKCRUMBLE1",
"MT_ROCKCRUMBLE2",
"MT_ROCKCRUMBLE3",
"MT_ROCKCRUMBLE4",
"MT_ROCKCRUMBLE5",
"MT_ROCKCRUMBLE6",
"MT_ROCKCRUMBLE7",
"MT_ROCKCRUMBLE8",
"MT_ROCKCRUMBLE9",
"MT_ROCKCRUMBLE10",
"MT_ROCKCRUMBLE11",
"MT_ROCKCRUMBLE12",
"MT_ROCKCRUMBLE13",
"MT_ROCKCRUMBLE14",
"MT_ROCKCRUMBLE15",
"MT_ROCKCRUMBLE16",
// Level debris
"MT_GFZDEBRIS",
"MT_BRICKDEBRIS",
"MT_WOODDEBRIS",
"MT_REDBRICKDEBRIS",
"MT_BLUEBRICKDEBRIS",
"MT_YELLOWBRICKDEBRIS",
"MT_NAMECHECK",
"MT_RAY",
"MT_OLDK",
};
const char *const MOBJFLAG_LIST[] = { const char *const MOBJFLAG_LIST[] = {
"SPECIAL", "SPECIAL",
"SOLID", "SOLID",
...@@ -5842,17 +1834,9 @@ struct int_const_s const INT_CONST[] = { ...@@ -5842,17 +1834,9 @@ struct int_const_s const INT_CONST[] = {
void DEH_TableCheck(void) void DEH_TableCheck(void)
{ {
#if defined(_DEBUG) || defined(PARANOIA) #if defined(_DEBUG) || defined(PARANOIA)
const size_t dehstates = sizeof(STATE_LIST)/sizeof(const char*);
const size_t dehmobjs = sizeof(MOBJTYPE_LIST)/sizeof(const char*);
const size_t dehpowers = sizeof(POWERS_LIST)/sizeof(const char*); const size_t dehpowers = sizeof(POWERS_LIST)/sizeof(const char*);
const size_t dehcolors = sizeof(COLOR_ENUMS)/sizeof(const char*); const size_t dehcolors = sizeof(COLOR_ENUMS)/sizeof(const char*);
if (dehstates != S_FIRSTFREESLOT)
I_Error("You forgot to update the Dehacked states list, you dolt!\n(%d states defined, versus %s in the Dehacked list)\n", S_FIRSTFREESLOT, sizeu1(dehstates));
if (dehmobjs != MT_FIRSTFREESLOT)
I_Error("You forgot to update the Dehacked mobjtype list, you dolt!\n(%d mobj types defined, versus %s in the Dehacked list)\n", MT_FIRSTFREESLOT, sizeu1(dehmobjs));
if (dehpowers != NUMPOWERS) if (dehpowers != NUMPOWERS)
I_Error("You forgot to update the Dehacked powers list, you dolt!\n(%d powers defined, versus %s in the Dehacked list)\n", NUMPOWERS, sizeu1(dehpowers)); I_Error("You forgot to update the Dehacked powers list, you dolt!\n(%d powers defined, versus %s in the Dehacked list)\n", NUMPOWERS, sizeu1(dehpowers));
......
...@@ -20,14 +20,10 @@ ...@@ -20,14 +20,10 @@
// Free slot names // Free slot names
// The crazy word-reading stuff uses these. // The crazy word-reading stuff uses these.
extern char *FREE_STATES[NUMSTATEFREESLOTS];
extern char *FREE_MOBJS[NUMMOBJFREESLOTS];
extern char *FREE_SKINCOLORS[NUMCOLORFREESLOTS]; extern char *FREE_SKINCOLORS[NUMCOLORFREESLOTS];
extern bitarray_t used_spr[BIT_ARRAY_SIZE(NUMSPRITEFREESLOTS)]; // Sprite freeslots in use extern bitarray_t used_spr[BIT_ARRAY_SIZE(NUMSPRITEFREESLOTS)]; // Sprite freeslots in use
#define initfreeslots() {\ #define initfreeslots() {\
memset(FREE_STATES, 0, sizeof(FREE_STATES));\
memset(FREE_MOBJS, 0, sizeof(FREE_MOBJS));\
memset(FREE_SKINCOLORS, 0, sizeof(FREE_SKINCOLORS));\ memset(FREE_SKINCOLORS, 0, sizeof(FREE_SKINCOLORS));\
memset(used_spr, 0, sizeof(used_spr));\ memset(used_spr, 0, sizeof(used_spr));\
memset(actionsoverridden, LUA_REFNIL, sizeof(actionsoverridden));\ memset(actionsoverridden, LUA_REFNIL, sizeof(actionsoverridden));\
...@@ -57,8 +53,6 @@ struct int_const_s { ...@@ -57,8 +53,6 @@ struct int_const_s {
extern const char NIGHTSGRADE_LIST[]; extern const char NIGHTSGRADE_LIST[];
extern struct flickytypes_s FLICKYTYPES[]; extern struct flickytypes_s FLICKYTYPES[];
extern actionpointer_t actionpointers[]; // Array mapping action names to action functions. extern actionpointer_t actionpointers[]; // Array mapping action names to action functions.
extern const char *const STATE_LIST[];
extern const char *const MOBJTYPE_LIST[];
extern const char *const MOBJFLAG_LIST[]; extern const char *const MOBJFLAG_LIST[];
extern const char *const MOBJFLAG2_LIST[]; // \tMF2_(\S+).*// (.+) --> \t"\1", // \2 extern const char *const MOBJFLAG2_LIST[]; // \tMF2_(\S+).*// (.+) --> \t"\1", // \2
extern const char *const MOBJEFLAG_LIST[]; extern const char *const MOBJEFLAG_LIST[];
......
...@@ -305,11 +305,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) ...@@ -305,11 +305,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{ {
if (i == 0 && word2[0] != '0') // If word2 isn't a number if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_mobjtype(word2); // find a thing by name i = get_mobjtype(word2); // find a thing by name
if (i < NUMMOBJTYPES && i > 0) if (i < (INT32)nummobjinfo && i > 0)
readthing(f, i); readthing(f, i);
else else
{ {
deh_warning("Thing %d out of range (1 - %d)", i, NUMMOBJTYPES-1); deh_warning("Thing %d out of range (1 - %d)", i, nummobjinfo-1);
ignorelines(f); ignorelines(f);
} }
} }
...@@ -329,11 +329,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) ...@@ -329,11 +329,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{ {
if (i == 0 && word2[0] != '0') // If word2 isn't a number if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_sprite2(word2); // find a sprite by name i = get_sprite2(word2); // find a sprite by name
if (i < (INT32)free_spr2 && i >= (INT32)SPR2_FIRSTFREESLOT) if (i < (INT32)numplayersprites && i >= 0)
readsprite2(f, i); readsprite2(f, i);
else else
{ {
deh_warning("Sprite2 number %d out of range (%d - %d)", i, SPR2_FIRSTFREESLOT, free_spr2-1); deh_warning("Sprite2 number %d out of range (1 - %d)", i, numplayersprites-1);
ignorelines(f); ignorelines(f);
} }
} }
...@@ -354,11 +354,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) ...@@ -354,11 +354,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{ {
if (i == 0 && word2[0] != '0') // If word2 isn't a number if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_sprite(word2); // find a sprite by name i = get_sprite(word2); // find a sprite by name
if (i < NUMSPRITES && i > 0) if ((UINT32)i < numspriteinfo && i > 0)
readspriteinfo(f, i, false); readspriteinfo(f, i, false);
else else
{ {
deh_warning("Sprite number %d out of range (0 - %d)", i, NUMSPRITES-1); deh_warning("Sprite number %d out of range (0 - %d)", i, numspriteinfo-1);
ignorelines(f); ignorelines(f);
} }
} }
...@@ -366,11 +366,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) ...@@ -366,11 +366,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{ {
if (i == 0 && word2[0] != '0') // If word2 isn't a number if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_sprite2(word2); // find a sprite by name i = get_sprite2(word2); // find a sprite by name
if (i < NUMPLAYERSPRITES && i >= 0) if ((UINT32)i < numplayersprites && i >= 0)
readspriteinfo(f, i, true); readspriteinfo(f, i, true);
else else
{ {
deh_warning("Sprite2 number %d out of range (0 - %d)", i, NUMPLAYERSPRITES-1); deh_warning("Sprite2 number %d out of range (0 - %d)", i, numplayersprites-1);
ignorelines(f); ignorelines(f);
} }
} }
...@@ -445,11 +445,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) ...@@ -445,11 +445,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{ {
if (i == 0 && word2[0] != '0') // If word2 isn't a number if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_state(word2); // find a state by name i = get_state(word2); // find a state by name
if (i < NUMSTATES && i >= 0) if ((UINT32)i < numstates && i >= 0)
readframe(f, i); readframe(f, i);
else else
{ {
deh_warning("Frame %d out of range (0 - %d)", i, NUMSTATES-1); deh_warning("Frame %d out of range (0 - %d)", i, numstates-1);
ignorelines(f); ignorelines(f);
} }
} }
...@@ -457,11 +457,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile) ...@@ -457,11 +457,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{ {
if (i == 0 && word2[0] != '0') // If word2 isn't a number if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_sfx(word2); // find a sound by name i = get_sfx(word2); // find a sound by name
if (i < NUMSFX && i > 0) if ((UINT32)i < S_numsfx && i > 0)
readsound(f, i); readsound(f, i);
else else
{ {
deh_warning("Sound %d out of range (1 - %d)", i, NUMSFX-1); deh_warning("Sound %d out of range (1 - %d)", i, S_numsfx-1);
ignorelines(f); ignorelines(f);
} }
} }
......