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
  • voltybystorm/SRB2
  • ZenithNeko/srb-2-xp
  • Nep2Disk/SRB2
  • Cloudeon/SRB2
  • mushe/srb-2-ps-b
122 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
  • better-distance-math
  • blend-locking
  • blentran
  • blua-unary-not-fix
  • boost-tickrate
  • bustablesoundz
  • classic-netcode-fixes
  • 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-dedi-pthread
  • fix-enemy-target
  • 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
  • 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 176

76 additional commits have been omitted to prevent performance issues.
version: 2.2.14.{branch}-{build}
version: 2.2.16.{branch}-{build}
os: MinGW
environment:
......
......@@ -21,6 +21,7 @@ add_executable(SRB2SDL2 MACOSX_BUNDLE WIN32
console.c
hu_stuff.c
i_time.c
i_threads.c
y_inter.c
st_stuff.c
m_aatree.c
......
......@@ -13,11 +13,6 @@ ifdef MINGW
libs+=-mconsole
endif
ifndef NOTHREADS
opts+=-DHAVE_THREADS
sources+=dedicated/i_threads.c
endif
NOOPENMPT=1
NOGME=1
NOHW=1
......
......@@ -18,6 +18,11 @@ opts+=-DHWRENDER
sources+=$(call List,hardware/Sourcefile)
endif
ifndef NOTHREADS
opts+=-DHAVE_THREADS
sources+=i_threads.c
endif
ifndef NOMD5
sources+=md5.c
endif
......
......@@ -43,11 +43,6 @@ sources+=sdl/mixer_sound.c
endif
endif
ifndef NOTHREADS
opts+=-DHAVE_THREADS
sources+=sdl/i_threads.c
endif
ifdef SDL_PKGCONFIG
$(eval $(call Use_pkg_config,SDL))
else
......
......@@ -85,7 +85,7 @@ endif
#WFLAGS+=-Wunreachable-code
WFLAGS+=-Winline
ifdef DEBUGMODE
WFLAGS+=-Wno-error=inline
WFLAGS+=-Wno-inline
endif
ifdef GCC43
WFLAGS+=-funit-at-a-time
......@@ -152,12 +152,8 @@ else
endif
ifdef DEBUGMODE
ifdef GCC48
opts+=-Og
else
opts+=-O0
endif
endif
ifdef VALGRIND
ifdef GCC46
......
......@@ -27,23 +27,8 @@ void I_SetPalette(RGBA_t *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)
{
vid.modenum = 0;
vid.width = 320;
vid.height = 240;
vid.bpp = 1;
......@@ -61,11 +46,6 @@ void VID_CheckGLLoaded(rendermode_t oldrender)
(void)oldrender;
}
const char *VID_GetModeName(INT32 modenum)
{
return "A320x240";
}
void I_UpdateNoBlit(void){}
void I_FinishUpdate(void) {
......
......@@ -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 (tails->hnext->type != MT_OVERLAY || (tails->hnext->state != states+S_FLIGHTINDICATOR))
if (tails->hnext->type != MT_OVERLAY || (tails->hnext->state->num != S_FLIGHTINDICATOR))
return;
// if it shouldn't exist, remove it
......
......@@ -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)
// Also set CV_HIDEN during runtime, after config is loaded
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
static boolean joyaxis_default = false;
......@@ -315,6 +315,7 @@ void COM_ImmedExecute(const char *ptext)
typedef struct xcommand_s
{
const char *name;
const char *desc;
struct xcommand_s *next;
com_func_t function;
com_flags_t flags;
......@@ -338,17 +339,17 @@ void COM_Init(void)
VS_Alloc(&com_text, COM_BUF_SIZE);
// add standard commands
COM_AddCommand("alias", COM_Alias_f, 0);
COM_AddCommand("echo", COM_Echo_f, COM_LUA);
COM_AddCommand("cecho", COM_CEcho_f, COM_LUA);
COM_AddCommand("cechoflags", COM_CEchoFlags_f, COM_LUA);
COM_AddCommand("cechoduration", COM_CEchoDuration_f, COM_LUA);
COM_AddCommand("exec", COM_Exec_f, 0);
COM_AddCommand("wait", COM_Wait_f, 0);
COM_AddCommand("help", COM_Help_f, COM_LUA);
COM_AddCommand("find", COM_Find_f, COM_LUA);
COM_AddCommand("toggle", COM_Toggle_f, COM_LUA);
COM_AddCommand("add", COM_Add_f, COM_LUA);
COM_AddCommand("alias", "Create or list commands that expand to other commands", COM_Alias_f, 0);
COM_AddCommand("echo", "Print the specified text, useful for scripts", COM_Echo_f, COM_LUA);
COM_AddCommand("cecho", "Display text on-screen", COM_CEcho_f, COM_LUA);
COM_AddCommand("cechoflags", NULL, COM_CEchoFlags_f, COM_LUA);
COM_AddCommand("cechoduration", NULL, COM_CEchoDuration_f, COM_LUA);
COM_AddCommand("exec", "Run a script", COM_Exec_f, 0);
COM_AddCommand("wait", NULL, COM_Wait_f, 0);
COM_AddCommand("help", "Show information about a variable or command", COM_Help_f, COM_LUA);
COM_AddCommand("find", "Search commands and variables", COM_Find_f, COM_LUA);
COM_AddCommand("toggle", "Toggle a variable on or off", COM_Toggle_f, COM_LUA);
COM_AddCommand("add", NULL, COM_Add_f, COM_LUA);
RegisterNetXCmd(XD_NETVAR, Got_NetVar);
}
......@@ -487,7 +488,7 @@ static void COM_TokenizeString(char *ptext)
* \param name Name of the command.
* \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;
......@@ -516,6 +517,7 @@ void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags)
cmd = ZZ_Alloc(sizeof *cmd);
cmd->name = name;
cmd->desc = desc;
cmd->function = func;
cmd->flags = flags;
cmd->next = com_commands;
......@@ -527,7 +529,7 @@ void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags)
*
* \param name Name of the command.
*/
int COM_AddLuaCommand(const char *name)
int COM_AddLuaCommand(const char *name, const char *desc)
{
xcommand_t *cmd;
......@@ -549,6 +551,7 @@ int COM_AddLuaCommand(const char *name)
// Add a new command.
cmd = ZZ_Alloc(sizeof *cmd);
cmd->name = name;
cmd->desc = desc;
cmd->function = COM_Lua_f;
cmd->flags = COM_LUA;
cmd->next = com_commands;
......@@ -892,7 +895,12 @@ static void COM_Help_f(void)
{
boolean floatmode = false;
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: "));
if (cvar->flags & CV_SAVE)
CONS_Printf("AUTOSAVE ");
......@@ -984,14 +992,15 @@ static void COM_Help_f(void)
if (strcmp(cmd->name, help))
continue;
CONS_Printf("\x82""Command %s:\n", cmd->name);
CONS_Printf(" help is not available for commands");
CONS_Printf("\x82""\nCheck wiki.srb2.org for more or try typing <name> without arguments\n");
CONS_Printf("\x82""Command %s: \x80", cmd->name);
if (cmd->desc != NULL)
CONS_Printf("%s\n", cmd->desc);
else
CONS_Printf("No description provided\n");
return;
}
CONS_Printf("No variable or command named %s", help);
CONS_Printf("\x82""\nCheck wiki.srb2.org for more or try typing help without arguments\n");
CONS_Printf("No variable or command named %s\n", help);
}
return;
}
......@@ -1014,8 +1023,7 @@ static void COM_Help_f(void)
CONS_Printf("%s ",cmd->name);
i++;
}
CONS_Printf("\x82""\nCheck wiki.srb2.org for more or type help <command or variable>\n");
CONS_Printf("\n");
CONS_Debug(DBG_GAMELOGIC, "\x82Total : %d\n", i);
}
......@@ -2482,22 +2490,6 @@ static boolean CV_FilterVarByVersion(consvar_t *v, const char *valstr)
if (!CV_FilterJoyAxisVars(v, valstr))
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;
}
......
......@@ -37,8 +37,8 @@ typedef enum
typedef void (*com_func_t)(void);
void COM_AddCommand(const char *name, com_func_t func, com_flags_t flags);
int COM_AddLuaCommand(const char *name);
void COM_AddCommand(const char *name, const char *desc, com_func_t func, com_flags_t flags);
int COM_AddLuaCommand(const char *name, const char *desc);
size_t COM_Argc(void);
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
{
const char *name;
const char *defaultvalue;
const char *desc;
INT32 flags; // flags see cvflags_t above
CV_PossibleValue_t *PossibleValue; // table of possible values
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
struct consvar_s *next;
} consvar_t;
/* name, defaultvalue, flags, PossibleValue, func */
/* name, defaultvalue, desc, flags, PossibleValue, func */
#define CVAR_INIT( ... ) \
{ __VA_ARGS__, NULL, 0, NULL, NULL, {0, {NULL}}, 0U, (char)0, NULL }
......
......@@ -123,23 +123,23 @@ static char con_buffer[CON_BUFFERSIZE];
// 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
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
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
// (con_speed needs a limit, apparently)
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
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}};
// 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"},
{3, "Brown"}, {4, "Pink"}, {5, "Raspberry"},
......@@ -151,7 +151,7 @@ static CV_PossibleValue_t backcolor_cons_t[] = {{0, "White"}, {1, "Black"}, {
{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);
......@@ -477,7 +477,7 @@ void CON_Init(void)
// 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);
// set console full screen for game startup MAKE SURE VID_Init() done !!!
Lock_state();
......@@ -504,7 +504,7 @@ void CON_Init(void)
CV_RegisterVar(&cons_height);
CV_RegisterVar(&cons_backpic);
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
{
......@@ -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
//
boolean CON_Responder(event_t *ev)
......@@ -1557,13 +1573,6 @@ void CONS_Debug(INT32 debugflags, const char *fmt, ...)
//
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(M_GetText("Press ENTER to continue\n"));
......
......@@ -19,6 +19,7 @@ void CON_Init(void);
void CON_StartRefresh(void);
void CON_StopRefresh(void);
boolean CON_PreResponder(event_t *ev);
boolean CON_Responder(event_t *ev);
#ifdef HAVE_THREADS
......@@ -37,7 +38,8 @@ extern boolean con_refresh;
// 0 means console if off, or moving out
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;
......
......@@ -101,9 +101,6 @@ int SUBVERSION;
// platform independant focus loss
UINT8 window_notinfocus = false;
static addfilelist_t startupwadfiles;
static addfilelist_t startuppwads;
boolean devparm = false; // started game with -devparm
boolean singletics = false; // timedemo
......@@ -227,6 +224,9 @@ void D_ProcessEvents(void)
}
}
if (CON_PreResponder(ev))
continue;
// Screenshots over everything so that they can be taken anywhere.
if (M_ScreenshotResponder(ev))
continue; // ate the event
......@@ -328,7 +328,7 @@ static void D_Display(void)
// 4. The frame is ready to be drawn!
// Check for change of renderer or screen size (video mode)
if ((setrenderneeded || setmodeneeded) && !wipe)
if (vid.change.set && !wipe)
SCR_SetMode(); // change video mode
// Recalc the screen
......@@ -509,18 +509,20 @@ static void D_Display(void)
// render the second screen
if (splitscreen && players[secondarydisplayplayer].mo)
{
viewwindowy = vid.height / 2;
#ifdef HWRENDER
if (rendermode == render_opengl)
if (rendermode != render_soft)
HWR_RenderPlayerView(1, &players[secondarydisplayplayer]);
else
#endif
if (rendermode != render_none)
{
viewwindowy = vid.height / 2;
topleft = screens[0] + viewwindowy*vid.width + viewwindowx;
R_RenderPlayerView(&players[secondarydisplayplayer]);
viewwindowy = 0;
}
viewwindowy = 0;
......@@ -1123,7 +1125,7 @@ static void ChangeDirForUrlHandler(void)
// Identify the SRB2 version, and IWAD file to use.
// ==========================================================================
static void IdentifyVersion(void)
static void IdentifyVersion(addfilelist_t *startupwadfiles)
{
char *srb2wad;
const char *srb2waddir = NULL;
......@@ -1166,7 +1168,7 @@ static void IdentifyVersion(void)
// Load the IWAD
if (srb2wad != NULL && FIL_ReadFileOK(srb2wad))
D_AddFile(&startupwadfiles, srb2wad);
D_AddFile(startupwadfiles, srb2wad);
else
I_Error("srb2.pk3 not found! Expected in %s, ss file: %s\n", srb2waddir, srb2wad);
......@@ -1177,14 +1179,14 @@ static void IdentifyVersion(void)
// checking in D_SRB2Main
// Add the maps
D_AddFile(&startupwadfiles, va(pandf,srb2waddir, "zones.pk3"));
D_AddFile(startupwadfiles, va(pandf,srb2waddir, "zones.pk3"));
// Add the characters
D_AddFile(&startupwadfiles, va(pandf,srb2waddir, "characters.pk3"));
D_AddFile(startupwadfiles, va(pandf,srb2waddir, "characters.pk3"));
#ifdef USE_PATCH_DTA
// 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
#if !defined (HAVE_SDL) || defined (HAVE_MIXER)
......@@ -1194,7 +1196,7 @@ static void IdentifyVersion(void)
const char *musicpath = va(pandf,srb2waddir,str);\
int ms = W_VerifyNMUSlumps(musicpath, false); \
if (ms == 1) \
D_AddFile(&startupwadfiles, musicpath); \
D_AddFile(startupwadfiles, musicpath); \
else if (ms == 0) \
I_Error("File "str" has been modified with non-music/sound lumps"); \
}
......@@ -1239,6 +1241,14 @@ void D_SRB2Main(void)
INT32 pstartmap = 1;
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 */
D_ConvertVersionNumbers();
......@@ -1270,6 +1280,9 @@ void D_SRB2Main(void)
// initialise locale code
M_StartupLocale();
CONS_Printf("Z_Init(): Init zone memory allocation daemon. \n");
Z_Init();
// get parameters from a response file (eg: srb2 @parms.txt)
M_FindResponseFile();
......@@ -1283,7 +1296,7 @@ void D_SRB2Main(void)
ChangeDirForUrlHandler();
// identify the main IWAD file to use
IdentifyVersion();
IdentifyVersion(&startupwadfiles);
#if !defined(NOTERMIOS)
setbuf(stdout, NULL); // non-buffered output
......@@ -1367,15 +1380,12 @@ void D_SRB2Main(void)
P_SetRandSeed(M_RandomizedSeed());
if (M_CheckParm("-password") && M_IsNextParm())
D_SetPassword(M_GetNextParm());
// player setup menu colors must be initialized before
// any wad file is added, as they may contain colors themselves
M_InitPlayerSetupColors();
CONS_Printf("Z_Init(): Init zone memory allocation daemon. \n");
Z_Init();
if (M_CheckParm("-password") && M_IsNextParm())
D_SetPassword(M_GetNextParm());
clientGamedata = M_NewGameDataStruct();
serverGamedata = M_NewGameDataStruct();
......@@ -1383,7 +1393,7 @@ void D_SRB2Main(void)
// Do this up here so that WADs loaded through the command line can use ExecCfg
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
// "-file <file>" or "-folder <folder>" to the add-on list
......@@ -1401,9 +1411,9 @@ void D_SRB2Main(void)
else if (myargv[i][0] == '-' || myargv[i][0] == '+')
addontype = 0;
else if (addontype == 1)
D_AddFile(&startuppwads, myargv[i]);
D_AddFile(&startupwads, myargv[i]);
else if (addontype == 2)
D_AddFolder(&startuppwads, myargv[i]);
D_AddFolder(&startupwads, myargv[i]);
}
}
......@@ -1429,7 +1439,8 @@ void D_SRB2Main(void)
I_InitializeTime();
// Make backups of some SOCcable tables.
P_BackupTables();
P_InitializeTables();
//P_BackupTables();
mainwads = 3; // doesn't include music.pk3
#ifdef USE_PATCH_DTA
......@@ -1488,11 +1499,11 @@ void D_SRB2Main(void)
CON_StopRefresh(); // Temporarily stop refreshing the screen for wad loading
if (startuppwads.numfiles)
if (startupwads.numfiles)
{
CONS_Printf("W_InitMultipleFiles(): Adding extra PWADs.\n");
W_InitMultipleFiles(&startuppwads);
D_CleanFile(&startuppwads);
W_InitMultipleFiles(&startupwads);
D_CleanFile(&startupwads);
}
CON_StartRefresh(); // Restart the refresh!
......@@ -1513,7 +1524,7 @@ void D_SRB2Main(void)
G_LoadGameData(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
SCR_CheckDefaultMode();
......@@ -1776,7 +1787,7 @@ const char *D_Home(void)
const char *userhome = NULL;
#ifdef ANDROID
return "/data/data/org.srb2/";
return "/data/data/org.srb2classic/";
#endif
if (M_CheckParm("-home") && M_IsNextParm())
......@@ -1865,8 +1876,8 @@ boolean D_IsPathAllowed(const char *path)
// Sort folder paths by longest to shortest so
// overlapping paths work. E.g.:
// Path 1: /home/james/.srb2/addons
// Path 2: /home/james/.srb2
// Path 1: /home/james/.srb2classic/addons
// Path 2: /home/james/.srb2classic
qsort(paths, n_paths, sizeof *paths, cmp_strlen_desc);
// These paths are allowed to be absolute
......
......@@ -7,7 +7,7 @@ rendermode_t chosenrendermode = render_none;
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_ShutdownGraphics(void){}
......@@ -19,26 +19,6 @@ void I_SetPalette(RGBA_t *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)
{
return false;
......@@ -49,12 +29,6 @@ void VID_CheckGLLoaded(rendermode_t oldrender)
(void)oldrender;
}
const char *VID_GetModeName(INT32 modenum)
{
(void)modenum;
return NULL;
}
UINT32 I_GetRefreshRate(void) { return 35; }
void I_UpdateNoBlit(void){}
......@@ -76,3 +50,15 @@ void I_ReadScreen(UINT8 *scr)
void I_BeginRead(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 @@
#include "deh_lua.h"
#ifdef MUSICSLOT_COMPATIBILITY
#include "deh_soc.h" // for get_mus
#endif
// freeslot takes a name (string only!)
// and allocates it to the appropriate free slot.
// Returns the slot number allocated for it or nil if failed.
......@@ -55,7 +59,7 @@ static inline int lib_freeslot(lua_State *L)
sfxenum_t sfx;
strlwr(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) {
lua_pushinteger(L, sfx);
r++;
......@@ -65,56 +69,23 @@ static inline int lib_freeslot(lua_State *L)
else if (fastcmp(type, "SPR"))
{
spritenum_t j;
if (strlen(word) > MAXSPRITENAME)
return luaL_error(L, "Sprite name is longer than %d characters\n", MAXSPRITENAME);
for (j = SPR_FIRSTFREESLOT; j <= SPR_LASTFREESLOT; j++)
{
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
j = P_AllocateSpriteinfo(Z_StrDup(word));
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"))
{
statenum_t i;
for (i = 0; i < NUMSTATEFREESLOTS; i++)
if (!FREE_STATES[i]) {
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);
lua_pushinteger(L, P_AllocateState(Z_StrDup(word)));
r++;
break;
}
if (i == NUMSTATEFREESLOTS)
CONS_Alert(CONS_WARNING, "Ran out of free State slots!\n");
}
else if (fastcmp(type, "MT"))
{
mobjtype_t i;
for (i = 0; i < NUMMOBJFREESLOTS; i++)
if (!FREE_MOBJS[i]) {
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);
lua_pushinteger(L, P_AllocateMobjinfo(Z_StrDup(word)));
r++;
break;
}
if (i == NUMMOBJFREESLOTS)
CONS_Alert(CONS_WARNING, "Ran out of free MobjType slots!\n");
}
else if (fastcmp(type, "SKINCOLOR"))
{
......@@ -136,21 +107,15 @@ static inline int lib_freeslot(lua_State *L)
{
// Search if we already have an SPR2 by that name...
playersprite_t i;
for (i = SPR2_FIRSTFREESLOT; i < free_spr2; i++)
if (memcmp(spr2names[i],word,4) == 0)
for (i = 0; i < numplayersprites; i++)
if (memcmp(playersprites[i]->name,word,4) == 0)
break;
// We don't, so allocate a new one.
if (i >= free_spr2) {
if (free_spr2 < NUMPLAYERSPRITES)
if (i >= numplayersprites)
{
// We don't, so allocate a new one.
CONS_Printf("Sprite SPR2_%s allocated.\n",word);
strncpy(spr2names[free_spr2],word,4);
spr2defaults[free_spr2] = 0;
lua_pushinteger(L, free_spr2);
lua_pushinteger(L, P_AllocatePlayersprite(Z_StrDup(word)));
r++;
spr2names[free_spr2++][4] = 0;
} else
CONS_Alert(CONS_WARNING, "Ran out of free SPR2 slots!\n");
}
}
else if (fastcmp(type, "TOL"))
......@@ -421,42 +386,32 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
}
else if (fastncmp("S_",word,2)) {
p = word+2;
for (i = 0; i < NUMSTATEFREESLOTS; i++) {
if (!FREE_STATES[i])
break;
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)) {
for (i = 0; (UINT32)i < numstates; i++)
{
if (fastcmp(p, states[i]->name))
{
CacheAndPushConstant(L, word, i);
return 1;
}
}
return luaL_error(L, "state '%s' does not exist.\n", word);
}
else if (fastncmp("MT_",word,3)) {
p = word+3;
for (i = 0; i < NUMMOBJFREESLOTS; i++) {
if (!FREE_MOBJS[i])
break;
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)) {
for (i = 0; (UINT32)i < nummobjinfo; i++)
{
if (fastcmp(p, mobjinfo[i]->name))
{
CacheAndPushConstant(L, word, i);
return 1;
}
}
return luaL_error(L, "mobjtype '%s' does not exist.\n", word);
}
else if (fastncmp("SPR_",word,4)) {
p = word+4;
i = R_GetSpriteNumByName(p);
if (i != NUMSPRITES)
if ((UINT32)i != numspriteinfo)
{
// updating overridden sprnames is not implemented for soc parser,
// so don't use cache
......@@ -472,18 +427,20 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
}
else if (fastncmp("SPR2_",word,5)) {
p = word+5;
for (i = 0; i < (fixed_t)free_spr2; i++)
if (!spr2names[i][4])
for (i = 0; i < (fixed_t)numplayersprites; i++)
if (!playersprites[i]->name[4])
{
// special 3-char cases, e.g. SPR2_RUN
// the spr2names entry will have "_" on the end, as in "RUN_"
if (spr2names[i][3] == '_' && !p[3]) {
if (fastncmp(p,spr2names[i],3)) {
// the playersprites entry will have "_" on the end, as in "RUN_"
if (playersprites[i]->name[3] == '_' && !p[3])
{
if (fastncmp(p,playersprites[i]->name,3))
{
CacheAndPushConstant(L, word, i);
return 1;
}
}
else if (fastncmp(p,spr2names[i],4)) {
else if (fastncmp(p,playersprites[i]->name,4)) {
CacheAndPushConstant(L, word, i);
return 1;
}
......@@ -493,8 +450,8 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
}
else if (!mathlib && fastncmp("sfx_",word,4)) {
p = word+4;
for (i = 0; i < NUMSFX; i++)
if (S_sfx[i].name && fastcmp(p, S_sfx[i].name)) {
for (i = 0; (UINT32)i < S_numsfx; i++)
if (S_sfx[i]->name && fastcmp(p, S_sfx[i]->name)) {
CacheAndPushConstant(L, word, i);
return 1;
}
......@@ -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!
p = word+4;
for (i = 0; i < NUMSFX; i++)
if (S_sfx[i].name && fasticmp(p, S_sfx[i].name)) {
for (i = 0; (UINT32)i < S_numsfx; i++)
if (S_sfx[i]->name && fasticmp(p, S_sfx[i]->name)) {
CacheAndPushConstant(L, word, i);
return 1;
}
......@@ -511,14 +468,37 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
}
else if (mathlib && fastncmp("DS",word,2)) {
p = word+2;
for (i = 0; i < NUMSFX; i++)
if (S_sfx[i].name && fasticmp(p, S_sfx[i].name)) {
for (i = 0; (UINT32)i < S_numsfx; i++)
if (S_sfx[i]->name && fasticmp(p, S_sfx[i]->name)) {
CacheAndPushConstant(L, word, i);
return 1;
}
if (mathlib) return luaL_error(L, "sfx '%s' could not be found.\n", word);
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)) {
p = word+3;
for (i = 0; i < NUMPOWERS; i++)
......
......@@ -444,41 +444,25 @@ void readfreeslots(MYFILE *f)
// TODO: Out-of-slots warnings/errors.
// TODO: Name too long (truncated) warnings.
if (fastcmp(type, "SFX"))
S_AddSoundFx(word, false, 0, false);
S_AddSoundFx(word, false, 0);
else if (fastcmp(type, "SPR"))
{
if (strlen(word) > MAXSPRITENAME)
I_Error("Sprite name is longer than %d characters\n", MAXSPRITENAME);
for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++)
{
if (in_bit_array(used_spr, i - SPR_FIRSTFREESLOT))
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
CONS_Printf("Sprite SPR_%s allocated.\n",word);
i = P_AllocateSpriteinfo(Z_StrDup(word));
LUA_UpdateSprName(word, i);
break;
}
}
else if (fastcmp(type, "S"))
{
for (i = 0; i < NUMSTATEFREESLOTS; i++)
if (!FREE_STATES[i]) {
FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_STATES[i],word);
break;
}
CONS_Printf("State S_%s allocated.\n",word);
P_AllocateState(Z_StrDup(word));
}
else if (fastcmp(type, "MT"))
{
for (i = 0; i < NUMMOBJFREESLOTS; i++)
if (!FREE_MOBJS[i]) {
FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL);
strcpy(FREE_MOBJS[i],word);
break;
}
CONS_Printf("MobjType MT_%s allocated.\n",word);
P_AllocateMobjinfo(Z_StrDup(word));
}
else if (fastcmp(type, "SKINCOLOR"))
{
......@@ -493,19 +477,14 @@ void readfreeslots(MYFILE *f)
else if (fastcmp(type, "SPR2"))
{
// Search if we already have an SPR2 by that name...
for (i = SPR2_FIRSTFREESLOT; i < (int)free_spr2; i++)
if (memcmp(spr2names[i],word,4) == 0)
for (i = 0; i < (int)numplayersprites; i++)
if (memcmp(playersprites[i]->name,word,4) == 0)
break;
// 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;
// Copy in the spr2 name and increment free_spr2.
if (free_spr2 < NUMPLAYERSPRITES) {
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");
CONS_Printf("Sprite SPR2_%s allocated.\n",word);
P_AllocatePlayersprite(Z_StrDup(word));
}
else if (fastcmp(type, "TOL"))
{
......@@ -572,99 +551,99 @@ void readthing(MYFILE *f, INT32 num)
if (fastcmp(word, "MAPTHINGNUM") || fastcmp(word, "DOOMEDNUM"))
{
mobjinfo[num].doomednum = (INT32)atoi(word2);
mobjinfo[num]->doomednum = (INT32)atoi(word2);
}
else if (fastcmp(word, "SPAWNSTATE"))
{
mobjinfo[num].spawnstate = get_number(word2);
mobjinfo[num]->spawnstate = get_number(word2);
}
else if (fastcmp(word, "SPAWNHEALTH"))
{
mobjinfo[num].spawnhealth = (INT32)get_number(word2);
mobjinfo[num]->spawnhealth = (INT32)get_number(word2);
}
else if (fastcmp(word, "SEESTATE"))
{
mobjinfo[num].seestate = get_number(word2);
mobjinfo[num]->seestate = get_number(word2);
}
else if (fastcmp(word, "SEESOUND"))
{
mobjinfo[num].seesound = get_number(word2);
mobjinfo[num]->seesound = get_number(word2);
}
else if (fastcmp(word, "REACTIONTIME"))
{
mobjinfo[num].reactiontime = (INT32)get_number(word2);
mobjinfo[num]->reactiontime = (INT32)get_number(word2);
}
else if (fastcmp(word, "ATTACKSOUND"))
{
mobjinfo[num].attacksound = get_number(word2);
mobjinfo[num]->attacksound = get_number(word2);
}
else if (fastcmp(word, "PAINSTATE"))
{
mobjinfo[num].painstate = get_number(word2);
mobjinfo[num]->painstate = get_number(word2);
}
else if (fastcmp(word, "PAINCHANCE"))
{
mobjinfo[num].painchance = (INT32)get_number(word2);
mobjinfo[num]->painchance = (INT32)get_number(word2);
}
else if (fastcmp(word, "PAINSOUND"))
{
mobjinfo[num].painsound = get_number(word2);
mobjinfo[num]->painsound = get_number(word2);
}
else if (fastcmp(word, "MELEESTATE"))
{
mobjinfo[num].meleestate = get_number(word2);
mobjinfo[num]->meleestate = get_number(word2);
}
else if (fastcmp(word, "MISSILESTATE"))
{
mobjinfo[num].missilestate = get_number(word2);
mobjinfo[num]->missilestate = get_number(word2);
}
else if (fastcmp(word, "DEATHSTATE"))
{
mobjinfo[num].deathstate = get_number(word2);
mobjinfo[num]->deathstate = get_number(word2);
}
else if (fastcmp(word, "DEATHSOUND"))
{
mobjinfo[num].deathsound = get_number(word2);
mobjinfo[num]->deathsound = get_number(word2);
}
else if (fastcmp(word, "XDEATHSTATE"))
{
mobjinfo[num].xdeathstate = get_number(word2);
mobjinfo[num]->xdeathstate = get_number(word2);
}
else if (fastcmp(word, "SPEED"))
{
mobjinfo[num].speed = get_number(word2);
mobjinfo[num]->speed = get_number(word2);
}
else if (fastcmp(word, "RADIUS"))
{
mobjinfo[num].radius = get_number(word2);
mobjinfo[num]->radius = get_number(word2);
}
else if (fastcmp(word, "HEIGHT"))
{
mobjinfo[num].height = get_number(word2);
mobjinfo[num]->height = get_number(word2);
}
else if (fastcmp(word, "DISPOFFSET"))
{
mobjinfo[num].dispoffset = get_number(word2);
mobjinfo[num]->dispoffset = get_number(word2);
}
else if (fastcmp(word, "MASS"))
{
mobjinfo[num].mass = (INT32)get_number(word2);
mobjinfo[num]->mass = (INT32)get_number(word2);
}
else if (fastcmp(word, "DAMAGE"))
{
mobjinfo[num].damage = (INT32)get_number(word2);
mobjinfo[num]->damage = (INT32)get_number(word2);
}
else if (fastcmp(word, "ACTIVESOUND"))
{
mobjinfo[num].activesound = get_number(word2);
mobjinfo[num]->activesound = get_number(word2);
}
else if (fastcmp(word, "FLAGS"))
{
mobjinfo[num].flags = (INT32)get_number(word2);
mobjinfo[num]->flags = (INT32)get_number(word2);
}
else if (fastcmp(word, "RAISESTATE"))
{
mobjinfo[num].raisestate = get_number(word2);
mobjinfo[num]->raisestate = get_number(word2);
}
else
deh_warning("Thing %d: unknown word '%s'", num, word);
......@@ -1010,7 +989,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
if (fastcmp(word, "LIGHTTYPE"))
{
if (sprite2)
deh_warning("Sprite2 %s: invalid word '%s'", spr2names[num], word);
deh_warning("Sprite2 %s: invalid word '%s'", playersprites[num]->name, word);
else
{
INT32 oldvar;
......@@ -1026,7 +1005,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
INT32 skinnum = -1;
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;
}
......@@ -1035,7 +1014,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
skinnum = R_SkinAvailable(word2);
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;
}
......@@ -1048,14 +1027,14 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean 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;
}
if (num < (INT32)free_spr2 && num >= (INT32)SPR2_FIRSTFREESLOT)
spr2defaults[num] = get_number(word2);
if (num > 0 && num < (INT32)numplayersprites)
playersprites[num]->defaults = get_number(word2);
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;
}
}
......@@ -1066,9 +1045,9 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
if (frame >= 64)
{
if (sprite2)
deh_warning("Sprite2 %s: invalid frame %s", spr2names[num], word2);
deh_warning("Sprite2 %s: invalid frame %s", playersprites[num]->name, word2);
else
deh_warning("Sprite %s: invalid frame %s", sprnames[num], word2);
deh_warning("Sprite %s: invalid frame %s", spriteinfo[num]->name, word2);
break;
}
......@@ -1079,7 +1058,7 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
INT32 i;
if (!foundskins)
{
deh_warning("Sprite2 %s: no skins specified", spr2names[num]);
deh_warning("Sprite2 %s: no skins specified", playersprites[num]->name);
break;
}
for (i = 0; i < foundskins; i++)
......@@ -1090,11 +1069,14 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
}
}
else
M_Memcpy(&spriteinfo[num], info, sizeof(spriteinfo_t));
{
info->name = spriteinfo[num]->name;
M_Memcpy(spriteinfo[num], info, sizeof(spriteinfo_t));
}
}
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;
break;
}
......@@ -1141,9 +1123,9 @@ void readsprite2(MYFILE *f, INT32 num)
word2[strlen(word2)-1] = '\0';
if (fastcmp(word, "DEFAULT"))
spr2defaults[num] = get_number(word2);
playersprites[num]->defaults = get_number(word2);
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
......@@ -1645,8 +1627,23 @@ void readlevelheader(MYFILE *f, INT32 num)
}
}
// TODO: 2.3: Delete
#ifdef MUSICSLOT_COMPATIBILITY
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"))
mapheaderinfo[num-1]->mustrack = ((UINT16)i - 1);
else if (fastcmp(word, "MUSICPOS"))
......@@ -2032,6 +2029,20 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
sizeof cutscenes[num]->scene[scenenum].musswitch,
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"))
{
cutscenes[num]->scene[scenenum].musswitchflags = ((UINT16)i) & MUSIC_TRACKMASK;
......@@ -2301,6 +2312,20 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
sizeof textprompts[num]->page[pagenum].musswitch,
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"))
{
textprompts[num]->page[pagenum].musswitchflags = ((UINT16)i) & MUSIC_TRACKMASK;
......@@ -2642,6 +2667,24 @@ void readmenu(MYFILE *f, INT32 num)
sizeof menupres[num].musname, va("Menu %d: music", num));
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"))
{
menupres[num].mustrack = ((UINT16)value - 1);
......@@ -2801,27 +2844,27 @@ void readframe(MYFILE *f, INT32 num)
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"))
{
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"))
{
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"))
{
states[num].nextstate = get_state(word2);
states[num]->nextstate = get_state(word2);
}
else if (fastcmp(word1, "VAR1"))
{
states[num].var1 = (INT32)get_number(word2);
states[num]->var1 = (INT32)get_number(word2);
}
else if (fastcmp(word1, "VAR2"))
{
states[num].var2 = (INT32)get_number(word2);
states[num]->var2 = (INT32)get_number(word2);
}
else if (fastcmp(word1, "ACTION"))
{
......@@ -2844,20 +2887,20 @@ void readframe(MYFILE *f, INT32 num)
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;
}
z = 0;
found = LUA_SetLuaAction(&states[num], actiontocompare);
found = LUA_SetLuaAction(states[num], actiontocompare);
if (!found)
while (actionpointers[z].name)
{
if (fastcmp(actiontocompare, actionpointers[z].name))
{
states[num].action = actionpointers[z].action;
states[num].action.acv = actionpointers[z].action.acv; // assign
states[num].action.acp1 = actionpointers[z].action.acp1;
states[num]->action = actionpointers[z].action;
states[num]->action.acv = actionpointers[z].action.acv; // assign
states[num]->action.acp1 = actionpointers[z].action.acp1;
found = true;
break;
}
......@@ -2920,20 +2963,20 @@ void readsound(MYFILE *f, INT32 num)
if (fastcmp(word, "SINGULAR"))
{
S_sfx[num].singularity = value;
S_sfx[num]->singularity = value;
}
else if (fastcmp(word, "PRIORITY"))
{
S_sfx[num].priority = value;
S_sfx[num]->priority = value;
}
else if (fastcmp(word, "FLAGS"))
{
S_sfx[num].pitch = value;
S_sfx[num]->pitch = value;
}
else if (fastcmp(word, "CAPTION") || fastcmp(word, "DESCRIPTION"))
{
deh_strlcpy(S_sfx[num].caption, word2,
sizeof(S_sfx[num].caption), va("Sound effect %d: caption", num));
deh_strlcpy(S_sfx[num]->caption, word2,
sizeof(S_sfx[num]->caption), va("Sound effect %d: caption", num));
}
else
deh_warning("Sound %d : unknown word '%s'",num,word);
......@@ -4153,40 +4196,32 @@ void readwipes(MYFILE *f)
mobjtype_t get_mobjtype(const char *word)
{ // Returns the value of MT_ enumerations
mobjtype_t i;
UINT32 i;
if (*word >= '0' && *word <= '9')
return atoi(word);
if (fastncmp("MT_",word,3))
word += 3; // take off the MT_
for (i = 0; i < NUMMOBJFREESLOTS; i++) {
if (!FREE_MOBJS[i])
break;
if (fastcmp(word, FREE_MOBJS[i]))
return MT_FIRSTFREESLOT+i;
}
for (i = 0; i < MT_FIRSTFREESLOT; i++)
if (fastcmp(word, MOBJTYPE_LIST[i]+3))
for (i = 0; i < nummobjinfo; i++)
{
if (fastcmp(word, mobjinfo[i]->name))
return i;
}
deh_warning("Couldn't find mobjtype named 'MT_%s'",word);
return MT_NULL;
}
statenum_t get_state(const char *word)
{ // Returns the value of S_ enumerations
statenum_t i;
UINT32 i;
if (*word >= '0' && *word <= '9')
return atoi(word);
if (fastncmp("S_",word,2))
word += 2; // take off the S_
for (i = 0; i < NUMSTATEFREESLOTS; i++) {
if (!FREE_STATES[i])
break;
if (fastcmp(word, FREE_STATES[i]))
return S_FIRSTFREESLOT+i;
}
for (i = 0; i < S_FIRSTFREESLOT; i++)
if (fastcmp(word, STATE_LIST[i]+2))
for (i = 0; i < numstates; i++)
{
if (fastcmp(word, states[i]->name))
return i;
}
deh_warning("Couldn't find state named 'S_%s'",word);
return S_NULL;
}
......@@ -4219,7 +4254,7 @@ spritenum_t get_sprite(const char *word)
if (fastncmp("SPR_",word,4))
word += 4; // take off the SPR_
i = R_GetSpriteNumByName(word);
if (i != NUMSPRITES)
if (i != numspriteinfo)
return i;
deh_warning("Couldn't find sprite named 'SPR_%s'",word);
return SPR_NULL;
......@@ -4232,8 +4267,8 @@ playersprite_t get_sprite2(const char *word)
return atoi(word);
if (fastncmp("SPR2_",word,5))
word += 5; // take off the SPR2_
for (i = 0; i < NUMPLAYERSPRITES; i++)
if (!spr2names[i][4] && memcmp(word,spr2names[i],4)==0)
for (i = 0; i < numplayersprites; i++)
if (!playersprites[i]->name[4] && memcmp(word,playersprites[i]->name,4)==0)
return i;
deh_warning("Couldn't find sprite named 'SPR2_%s'",word);
return SPR2_STND;
......@@ -4248,13 +4283,53 @@ sfxenum_t get_sfx(const char *word)
word += 4; // take off the SFX_
else if (fastncmp("DS",word,2))
word += 2; // take off the DS
for (i = 0; i < NUMSFX; i++)
if (S_sfx[i].name && fasticmp(word, S_sfx[i].name))
for (i = 0; i < S_numsfx; i++)
if (S_sfx[i]->name && fasticmp(word, S_sfx[i]->name))
return i;
deh_warning("Couldn't find sfx named 'SFX_%s'",word);
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)
{ // Returns the value of HUD_ enumerations
hudnum_t i;
......@@ -4485,6 +4560,13 @@ static fixed_t find_const(const char **rword)
free(word);
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)) {
r = get_power(word);
free(word);
......
......@@ -43,7 +43,7 @@
#include "info.h"
#include "dehacked.h"
#include "doomdef.h" // HWRENDER
#include "doomdef.h" // MUSICSLOT_COMPATIBILITY, HWRENDER
// Crazy word-reading stuff
/// \todo Put these in a seperate file or something.
......@@ -52,6 +52,9 @@ statenum_t get_state(const char *word);
spritenum_t get_sprite(const char *word);
playersprite_t get_sprite2(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);
menutype_t get_menutype(const char *word);
//INT16 get_gametype(const char *word);
......
......@@ -28,8 +28,6 @@
#include "deh_tables.h"
char *FREE_STATES[NUMSTATEFREESLOTS];
char *FREE_MOBJS[NUMMOBJFREESLOTS];
char *FREE_SKINCOLORS[NUMCOLORFREESLOTS];
bitarray_t used_spr[BIT_ARRAY_SIZE(NUMSPRITEFREESLOTS)]; // Sprite freeslots in use
......@@ -347,4012 +345,6 @@ actionpointer_t actionpointers[] =
{{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[] = {
"SPECIAL",
"SOLID",
......@@ -5842,17 +1834,9 @@ struct int_const_s const INT_CONST[] = {
void DEH_TableCheck(void)
{
#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 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)
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 @@
// Free slot names
// The crazy word-reading stuff uses these.
extern char *FREE_STATES[NUMSTATEFREESLOTS];
extern char *FREE_MOBJS[NUMMOBJFREESLOTS];
extern char *FREE_SKINCOLORS[NUMCOLORFREESLOTS];
extern bitarray_t used_spr[BIT_ARRAY_SIZE(NUMSPRITEFREESLOTS)]; // Sprite freeslots in use
#define initfreeslots() {\
memset(FREE_STATES, 0, sizeof(FREE_STATES));\
memset(FREE_MOBJS, 0, sizeof(FREE_MOBJS));\
memset(FREE_SKINCOLORS, 0, sizeof(FREE_SKINCOLORS));\
memset(used_spr, 0, sizeof(used_spr));\
memset(actionsoverridden, LUA_REFNIL, sizeof(actionsoverridden));\
......@@ -57,8 +53,6 @@ struct int_const_s {
extern const char NIGHTSGRADE_LIST[];
extern struct flickytypes_s FLICKYTYPES[];
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 MOBJFLAG2_LIST[]; // \tMF2_(\S+).*// (.+) --> \t"\1", // \2
extern const char *const MOBJEFLAG_LIST[];
......
......@@ -305,11 +305,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{
if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_mobjtype(word2); // find a thing by name
if (i < NUMMOBJTYPES && i > 0)
if (i < (INT32)nummobjinfo && i > 0)
readthing(f, i);
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);
}
}
......@@ -329,11 +329,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{
if (i == 0 && word2[0] != '0') // If word2 isn't a number
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);
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);
}
}
......@@ -354,11 +354,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{
if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_sprite(word2); // find a sprite by name
if (i < NUMSPRITES && i > 0)
if ((UINT32)i < numspriteinfo && i > 0)
readspriteinfo(f, i, false);
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);
}
}
......@@ -366,11 +366,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{
if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_sprite2(word2); // find a sprite by name
if (i < NUMPLAYERSPRITES && i >= 0)
if ((UINT32)i < numplayersprites && i >= 0)
readspriteinfo(f, i, true);
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);
}
}
......@@ -445,11 +445,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{
if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_state(word2); // find a state by name
if (i < NUMSTATES && i >= 0)
if ((UINT32)i < numstates && i >= 0)
readframe(f, i);
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);
}
}
......@@ -457,11 +457,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, boolean mainfile)
{
if (i == 0 && word2[0] != '0') // If word2 isn't a number
i = get_sfx(word2); // find a sound by name
if (i < NUMSFX && i > 0)
if ((UINT32)i < S_numsfx && i > 0)
readsound(f, i);
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);
}
}
......