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
  • 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
  • cleanup-opengl
  • cleanupmusic
  • clipmidtex
  • cmake-valgrind
  • crawlacommander-sprites
  • custom-map-names
  • custom-teams
  • cutscene-cleanup
  • dd-music-bypass
  • dd-music-fix
  • delfile2
  • deprecate-lua-dedicated-server
  • dpl-2
  • dropshadows-spawning
  • dynabsp
  • emblem-drawing
  • exchndl-xp-fix
  • extra-textures
  • few-kart-lua-changes
  • ffloorclip
  • fix-167
  • fix-cvar-conflicts
  • fix-opengl-parameter-crash
  • fix-opengl-shear-roll
  • flipfuncpointers
  • fof-lightlist-fixes
  • font-FUCK
  • frictionrefactor
  • fuck-macros-1
  • gamepad-luakeydown
  • gamepad-morefixes
  • gamepad_experiments
  • gametype-refactor
  • gametype-refactor-1
  • gametype-refactor-player-spawns
  • ghost-networking
  • gif-splitting
  • grr-lj
  • hitboxviewer
  • hwr-texture-cache-refactor
  • hwrender2
  • improve-439
  • increase-maxconditionsets
  • increase-packet-tics
  • input-display
  • input-display-translucency
  • io
  • joystick-juggling-maz
  • just-in-case
  • keycodes-only
  • ksf-wadfiles
  • ld413-mp-fix
  • levelstruct
  • libpng-version-support
  • linedef-actions
  • lj-test
  • lol-states
  • loopedsounds
  • lower-unpegged-fix
  • lua-change-gametype
  • lua-command-netids
  • lua-gfx-2
  • lua-gfx-sprites
  • lua-local
  • makefile-auto-mingw-gcc
  • makefile-tinkering
  • 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

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
121 results
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
  • fixithreads
  • 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
  • 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
Show changes
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
/// \brief Lua SOC library /// \brief Lua SOC library
#include "deh_lua.h" #include "deh_lua.h"
#include "g_input.h"
// freeslot takes a name (string only!) // freeslot takes a name (string only!)
// and allocates it to the appropriate free slot. // and allocates it to the appropriate free slot.
...@@ -189,7 +188,7 @@ static inline int lib_freeslot(lua_State *L) ...@@ -189,7 +188,7 @@ static inline int lib_freeslot(lua_State *L)
// Arguments: mobj_t actor, int var1, int var2 // Arguments: mobj_t actor, int var1, int var2
static int action_call(lua_State *L) static int action_call(lua_State *L)
{ {
actionf_t *action = *((actionf_t **)luaL_checkudata(L, 1, META_ACTION)); actionf_p1 *action = *((actionf_p1 **)luaL_checkudata(L, 1, META_ACTION));
mobj_t *actor = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ)); mobj_t *actor = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
var1 = (INT32)luaL_optinteger(L, 3, 0); var1 = (INT32)luaL_optinteger(L, 3, 0);
...@@ -200,7 +199,7 @@ static int action_call(lua_State *L) ...@@ -200,7 +199,7 @@ static int action_call(lua_State *L)
return LUA_ErrInvalid(L, "mobj_t"); return LUA_ErrInvalid(L, "mobj_t");
} }
action->acp1(actor); (*action)(actor);
return 0; return 0;
} }
...@@ -600,20 +599,12 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word) ...@@ -600,20 +599,12 @@ static int ScanConstants(lua_State *L, boolean mathlib, const char *word)
return luaL_error(L, "translation '%s' could not be found.\n", word); return luaL_error(L, "translation '%s' could not be found.\n", word);
} }
// TODO: 2.3: Delete these aliases // TODO: 2.3: Delete this alias
else if (fastcmp(word, "BT_USE")) if (fastcmp(word, "BT_USE"))
{ {
CacheAndPushConstant(L, word, (lua_Integer)BT_SPIN); CacheAndPushConstant(L, word, (lua_Integer)BT_SPIN);
return 1; return 1;
} }
else if (fastcmp(word, "GC_WEPSLOT8") || fastcmp(word, "GC_WEPSLOT9") || fastcmp(word, "GC_WEPSLOT10"))
{
// Using GC_WEPSLOT7 isn't accurate, but ensures that "if x >= GC_WEPSLOT1 and x <= GC_WEPSLOT10" keeps the intended effect
CacheAndPushConstant(L, word, (lua_Integer)GC_WEPSLOT7);
if (!mathlib)
LUA_Deprecated(L, "GC_WEPSLOT8\"-\"GC_WEPSLOT10", "GC_WEPSLOT1\"-\"GC_WEPSLOT7");
return 1;
}
for (i = 0; INT_CONST[i].n; i++) for (i = 0; INT_CONST[i].n; i++)
if (fastcmp(word,INT_CONST[i].n)) { if (fastcmp(word,INT_CONST[i].n)) {
...@@ -641,7 +632,7 @@ FUNCINLINE static ATTRINLINE int getEnum(lua_State *L, boolean mathlib, const ch ...@@ -641,7 +632,7 @@ FUNCINLINE static ATTRINLINE int getEnum(lua_State *L, boolean mathlib, const ch
{ {
if (fasticmp(word, actionpointers[i].name)) if (fasticmp(word, actionpointers[i].name))
{ {
// We push the actionf_t* itself as userdata! // We push the actionf_p1* itself as userdata!
LUA_PushUserdata(L, &actionpointers[i].action, META_ACTION); LUA_PushUserdata(L, &actionpointers[i].action, META_ACTION);
return 1; return 1;
} }
...@@ -779,7 +770,7 @@ static int lib_getActionName(lua_State *L) ...@@ -779,7 +770,7 @@ static int lib_getActionName(lua_State *L)
{ {
if (lua_isuserdata(L, 1)) // arg 1 is built-in action, expect action userdata if (lua_isuserdata(L, 1)) // arg 1 is built-in action, expect action userdata
{ {
actionf_t *action = *((actionf_t **)luaL_checkudata(L, 1, META_ACTION)); actionf_p1 *action = *((actionf_p1 **)luaL_checkudata(L, 1, META_ACTION));
const char *name = NULL; const char *name = NULL;
if (!action) if (!action)
return luaL_error(L, "not a valid action?"); return luaL_error(L, "not a valid action?");
...@@ -849,11 +840,11 @@ int LUA_SOCLib(lua_State *L) ...@@ -849,11 +840,11 @@ int LUA_SOCLib(lua_State *L)
const char *LUA_GetActionName(void *action) const char *LUA_GetActionName(void *action)
{ {
actionf_t *act = (actionf_t *)action; actionf_p1 *act = (actionf_p1 *)action;
size_t z; size_t z;
for (z = 0; actionpointers[z].name; z++) for (z = 0; actionpointers[z].name; z++)
{ {
if (actionpointers[z].action.acv == act->acv) if (actionpointers[z].action == *act)
return actionpointers[z].name; return actionpointers[z].name;
} }
return NULL; return NULL;
...@@ -868,8 +859,6 @@ void LUA_SetActionByName(void *state, const char *actiontocompare) ...@@ -868,8 +859,6 @@ void LUA_SetActionByName(void *state, const char *actiontocompare)
if (fasticmp(actiontocompare, actionpointers[z].name)) if (fasticmp(actiontocompare, actionpointers[z].name))
{ {
st->action = actionpointers[z].action; st->action = actionpointers[z].action;
st->action.acv = actionpointers[z].action.acv; // assign
st->action.acp1 = actionpointers[z].action.acp1;
return; return;
} }
} }
......
// SONIC ROBO BLAST 2 // SONIC ROBO BLAST 2
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Copyright (C) 1998-2000 by DooM Legacy Team. // Copyright (C) 1998-2000 by DooM Legacy Team.
// Copyright (C) 1999-2024 by Sonic Team Junior. // Copyright (C) 1999-2025 by Sonic Team Junior.
// //
// This program is free software distributed under the // This program is free software distributed under the
// terms of the GNU General Public License, version 2. // terms of the GNU General Public License, version 2.
...@@ -286,6 +286,7 @@ void readPlayer(MYFILE *f, INT32 num) ...@@ -286,6 +286,7 @@ void readPlayer(MYFILE *f, INT32 num)
} }
if (playertext) if (playertext)
{ {
// PLAYERTEXT is really weird, so this doesn't use deh_strlcpy.
strlcpy(description[num].notes, playertext, NOTE_SIZE); strlcpy(description[num].notes, playertext, NOTE_SIZE);
strlcat(description[num].notes, strlcat(description[num].notes,
myhashfgets(playertext, NOTE_SIZE, f), NOTE_SIZE); myhashfgets(playertext, NOTE_SIZE, f), NOTE_SIZE);
...@@ -324,7 +325,8 @@ void readPlayer(MYFILE *f, INT32 num) ...@@ -324,7 +325,8 @@ void readPlayer(MYFILE *f, INT32 num)
if (fastcmp(word, "PICNAME")) if (fastcmp(word, "PICNAME"))
{ {
SLOTFOUND SLOTFOUND
strncpy(description[num].picname, word2, sizeof(description[num].picname)-1); deh_strlcpy(description[num].picname, word2, sizeof description[num].picname,
va("Character %d: picname", num));
} }
else if (fastcmp(word, "DISPLAYNAME")) else if (fastcmp(word, "DISPLAYNAME"))
{ {
...@@ -345,7 +347,8 @@ void readPlayer(MYFILE *f, INT32 num) ...@@ -345,7 +347,8 @@ void readPlayer(MYFILE *f, INT32 num)
cur = strchr(cur, '#'); cur = strchr(cur, '#');
} }
strlcpy(description[num].displayname, stringvalue, sizeof description[num].displayname); deh_strlcpy(description[num].displayname, stringvalue, sizeof description[num].displayname,
va("Character %d: displayname", num));
} }
else if (fastcmp(word, "OPPOSITECOLOR") || fastcmp(word, "OPPOSITECOLOUR")) else if (fastcmp(word, "OPPOSITECOLOR") || fastcmp(word, "OPPOSITECOLOUR"))
{ {
...@@ -355,7 +358,8 @@ void readPlayer(MYFILE *f, INT32 num) ...@@ -355,7 +358,8 @@ void readPlayer(MYFILE *f, INT32 num)
else if (fastcmp(word, "NAMETAG") || fastcmp(word, "TAGNAME")) else if (fastcmp(word, "NAMETAG") || fastcmp(word, "TAGNAME"))
{ {
SLOTFOUND SLOTFOUND
strncpy(description[num].nametag, word2, sizeof(description[num].nametag)-1); deh_strlcpy(description[num].nametag, word2, sizeof description[num].nametag,
va("Character %d: nametag", num));
} }
else if (fastcmp(word, "TAGTEXTCOLOR") || fastcmp(word, "TAGTEXTCOLOUR")) else if (fastcmp(word, "TAGTEXTCOLOR") || fastcmp(word, "TAGTEXTCOLOUR"))
{ {
...@@ -387,7 +391,8 @@ void readPlayer(MYFILE *f, INT32 num) ...@@ -387,7 +391,8 @@ void readPlayer(MYFILE *f, INT32 num)
{ {
// Send to free slot. // Send to free slot.
SLOTFOUND SLOTFOUND
strlcpy(description[num].skinname, word2, sizeof description[num].skinname); deh_strlcpy(description[num].skinname, word2, sizeof description[num].skinname,
va("Character %d: skinname", num));
strlwr(description[num].skinname); strlwr(description[num].skinname);
} }
else if (!failure) else if (!failure)
...@@ -869,6 +874,7 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame) ...@@ -869,6 +874,7 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame)
char *tmp; char *tmp;
INT32 value; INT32 value;
char *lastline; char *lastline;
boolean available = false;
do do
{ {
...@@ -920,9 +926,15 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame) ...@@ -920,9 +926,15 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame)
value = atoi(word2); // used for numerical settings value = atoi(word2); // used for numerical settings
if (fastcmp(word, "XPIVOT")) if (fastcmp(word, "XPIVOT"))
sprinfo->pivot[frame].x = value; {
sprinfo->frames[frame].pivot.x = value;
available = true;
}
else if (fastcmp(word, "YPIVOT")) else if (fastcmp(word, "YPIVOT"))
sprinfo->pivot[frame].y = value; {
sprinfo->frames[frame].pivot.y = value;
available = true;
}
// TODO: 2.3: Delete // TODO: 2.3: Delete
else if (fastcmp(word, "ROTAXIS")) else if (fastcmp(word, "ROTAXIS"))
deh_warning("SpriteInfo: ROTAXIS is deprecated and will be removed."); deh_warning("SpriteInfo: ROTAXIS is deprecated and will be removed.");
...@@ -933,6 +945,10 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame) ...@@ -933,6 +945,10 @@ static void readspriteframe(MYFILE *f, spriteinfo_t *sprinfo, UINT8 frame)
} }
} }
} while (!myfeof(f)); // finish when the line is empty } while (!myfeof(f)); // finish when the line is empty
if (available)
sprinfo->frames[frame].pivot.available = true;
Z_Free(s); Z_Free(s);
} }
...@@ -950,7 +966,6 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2) ...@@ -950,7 +966,6 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
// allocate a spriteinfo // allocate a spriteinfo
spriteinfo_t *info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL); spriteinfo_t *info = Z_Calloc(sizeof(spriteinfo_t), PU_STATIC, NULL);
info->available = true;
do do
{ {
...@@ -1069,6 +1084,12 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2) ...@@ -1069,6 +1084,12 @@ void readspriteinfo(MYFILE *f, INT32 num, boolean sprite2)
// read sprite frame and store it in the spriteinfo_t struct // read sprite frame and store it in the spriteinfo_t struct
readspriteframe(f, info, frame); readspriteframe(f, info, frame);
set_bit_array(info->available, frame);
// TODO: 2.3: Delete
info->frames[SPRINFO_DEFAULT_FRAME].pivot.available = true;
set_bit_array(info->available, SPRINFO_DEFAULT_FRAME);
if (sprite2) if (sprite2)
{ {
INT32 i; INT32 i;
...@@ -1196,6 +1217,7 @@ void readgametype(MYFILE *f, char *gtname) ...@@ -1196,6 +1217,7 @@ void readgametype(MYFILE *f, char *gtname)
} }
if (descr) if (descr)
{ {
// DESCRIPTION is really weird, so this doesn't use deh_strlcpy.
strlcpy(gtdescription, descr, sizeof (gtdescription)); strlcpy(gtdescription, descr, sizeof (gtdescription));
strlcat(gtdescription, strlcat(gtdescription,
myhashfgets(descr, sizeof (gtdescription), f), myhashfgets(descr, sizeof (gtdescription), f),
...@@ -1402,7 +1424,7 @@ void readlevelheader(MYFILE *f, INT32 num) ...@@ -1402,7 +1424,7 @@ void readlevelheader(MYFILE *f, INT32 num)
{ {
deh_strlcpy(mapheaderinfo[num-1]->lvlttl, word2, deh_strlcpy(mapheaderinfo[num-1]->lvlttl, word2,
sizeof(mapheaderinfo[num-1]->lvlttl), va("Level header %d: levelname", num)); sizeof(mapheaderinfo[num-1]->lvlttl), va("Level header %d: levelname", num));
strlcpy(mapheaderinfo[num-1]->selectheading, word2, sizeof(mapheaderinfo[num-1]->selectheading)); // not deh_ so only complains once strlcpy(mapheaderinfo[num-1]->selectheading, word2, sizeof(mapheaderinfo[num-1]->selectheading)); // not deh_strlcpy so only complains once
continue; continue;
} }
// CHEAP HACK: move this over here for lowercase subtitles // CHEAP HACK: move this over here for lowercase subtitles
...@@ -1445,10 +1467,10 @@ void readlevelheader(MYFILE *f, INT32 num) ...@@ -1445,10 +1467,10 @@ void readlevelheader(MYFILE *f, INT32 num)
// Newly allocated // Newly allocated
modoption = &mapheaderinfo[num-1]->customopts[j]; modoption = &mapheaderinfo[num-1]->customopts[j];
strncpy(modoption->option, word, 31); deh_strlcpy(modoption->option, word, sizeof(modoption->option),
modoption->option[31] = '\0'; va("Level header %d: custom option %d key", num, j));
strncpy(modoption->value, word2, 255); deh_strlcpy(modoption->value, word2, sizeof(modoption->value),
modoption->value[255] = '\0'; va("Level header %d: custom option %d value", num, j));
continue; continue;
} }
...@@ -1675,7 +1697,8 @@ void readlevelheader(MYFILE *f, INT32 num) ...@@ -1675,7 +1697,8 @@ void readlevelheader(MYFILE *f, INT32 num)
} }
else if (fastcmp(word, "FORCECHARACTER")) else if (fastcmp(word, "FORCECHARACTER"))
{ {
strlcpy(mapheaderinfo[num-1]->forcecharacter, word2, SKINNAMESIZE+1); deh_strlcpy(mapheaderinfo[num-1]->forcecharacter, word2, sizeof mapheaderinfo[num-1]->forcecharacter,
va("Level header %d: forcecharacter", num));
strlwr(mapheaderinfo[num-1]->forcecharacter); // skin names are lowercase strlwr(mapheaderinfo[num-1]->forcecharacter); // skin names are lowercase
} }
else if (fastcmp(word, "WEATHER")) else if (fastcmp(word, "WEATHER"))
...@@ -1683,7 +1706,10 @@ void readlevelheader(MYFILE *f, INT32 num) ...@@ -1683,7 +1706,10 @@ void readlevelheader(MYFILE *f, INT32 num)
else if (fastcmp(word, "SKYNUM")) else if (fastcmp(word, "SKYNUM"))
mapheaderinfo[num-1]->skynum = (INT16)i; mapheaderinfo[num-1]->skynum = (INT16)i;
else if (fastcmp(word, "INTERSCREEN")) else if (fastcmp(word, "INTERSCREEN"))
strncpy(mapheaderinfo[num-1]->interscreen, word2, sizeof(mapheaderinfo[num-1]->interscreen)-1); {
deh_strlcpy(mapheaderinfo[num-1]->interscreen, word2, sizeof mapheaderinfo[num-1]->interscreen,
va("Level header %d: interscreen", num));
}
else if (fastcmp(word, "PRECUTSCENENUM")) else if (fastcmp(word, "PRECUTSCENENUM"))
mapheaderinfo[num-1]->precutscenenum = (UINT8)i; mapheaderinfo[num-1]->precutscenenum = (UINT8)i;
else if (fastcmp(word, "CUTSCENENUM")) else if (fastcmp(word, "CUTSCENENUM"))
...@@ -1985,14 +2011,17 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum) ...@@ -1985,14 +2011,17 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
picid = (UINT8)atoi(word + 3); picid = (UINT8)atoi(word + 3);
if (picid > 8 || picid == 0) if (picid > 8 || picid == 0)
{ {
deh_warning("CutSceneScene %d: unknown word '%s'", num, word); deh_warning("Cutscene %d, scene %d: pic number %d out of range (1 - %d)",
num + 1, scenenum + 1, picid, 8);
continue; continue;
} }
--picid; --picid;
if (fastcmp(word+4, "NAME")) if (fastcmp(word+4, "NAME"))
{ {
strncpy(cutscenes[num]->scene[scenenum].picname[picid], word2, 8); deh_strlcpy(cutscenes[num]->scene[scenenum].picname[picid], word2,
sizeof cutscenes[num]->scene[scenenum].picname[picid],
va("Cutscene %d, scene %d, pic %d: name", num + 1, scenenum + 1, picid + 1));
} }
else if (fastcmp(word+4, "HIRES")) else if (fastcmp(word+4, "HIRES"))
{ {
...@@ -2011,12 +2040,13 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum) ...@@ -2011,12 +2040,13 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
cutscenes[num]->scene[scenenum].ycoord[picid] = usi; cutscenes[num]->scene[scenenum].ycoord[picid] = usi;
} }
else else
deh_warning("CutSceneScene %d: unknown word '%s'", num, word); deh_warning("Cutscene %d, scene %d: unknown word '%s'", num + 1, scenenum + 1, word);
} }
else if (fastcmp(word, "MUSIC")) else if (fastcmp(word, "MUSIC"))
{ {
strncpy(cutscenes[num]->scene[scenenum].musswitch, word2, 7); deh_strlcpy(cutscenes[num]->scene[scenenum].musswitch, word2,
cutscenes[num]->scene[scenenum].musswitch[6] = 0; sizeof cutscenes[num]->scene[scenenum].musswitch,
va("Cutscene %d, scene %d: music", num + 1, scenenum + 1));
} }
else if (fastcmp(word, "MUSICTRACK")) else if (fastcmp(word, "MUSICTRACK"))
{ {
...@@ -2051,7 +2081,7 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum) ...@@ -2051,7 +2081,7 @@ static void readcutscenescene(MYFILE *f, INT32 num, INT32 scenenum)
cutscenes[num]->scene[scenenum].fadecolor = (UINT8)i; cutscenes[num]->scene[scenenum].fadecolor = (UINT8)i;
} }
else else
deh_warning("CutSceneScene %d: unknown word '%s'", num, word); deh_warning("Cutscene %d, scene %d: unknown word '%s'", num + 1, scenenum + 1, word);
} }
} while (!myfeof(f)); // finish when the line is empty } while (!myfeof(f)); // finish when the line is empty
...@@ -2109,11 +2139,10 @@ void readcutscene(MYFILE *f, INT32 num) ...@@ -2109,11 +2139,10 @@ void readcutscene(MYFILE *f, INT32 num)
readcutscenescene(f, num, value - 1); readcutscenescene(f, num, value - 1);
} }
else else
deh_warning("Scene number %d out of range (1 - 128)", value); deh_warning("Cutscene %d: scene number %d out of range (1 - 128)", num + 1, value);
} }
else else
deh_warning("Cutscene %d: unknown word '%s', Scene <num> expected.", num, word); deh_warning("Cutscene %d: unknown word '%s', Scene <num> expected.", num + 1, word);
} }
} while (!myfeof(f)); // finish when the line is empty } while (!myfeof(f)); // finish when the line is empty
...@@ -2234,7 +2263,8 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum) ...@@ -2234,7 +2263,8 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
for (picid = 0; picid < MAX_PROMPT_PICS; picid++) for (picid = 0; picid < MAX_PROMPT_PICS; picid++)
{ {
strncpy(textprompts[num]->page[pagenum].picname[picid], textprompts[num]->page[metapagenum].picname[picid], 8); // Doesn't use deh_strlcpy because it's not copying input.
strlcpy(textprompts[num]->page[pagenum].picname[picid], textprompts[num]->page[metapagenum].picname[picid], sizeof textprompts[num]->page[pagenum].picname[picid]);
textprompts[num]->page[pagenum].pichires[picid] = textprompts[num]->page[metapagenum].pichires[picid]; textprompts[num]->page[pagenum].pichires[picid] = textprompts[num]->page[metapagenum].pichires[picid];
textprompts[num]->page[pagenum].picduration[picid] = textprompts[num]->page[metapagenum].picduration[picid]; textprompts[num]->page[pagenum].picduration[picid] = textprompts[num]->page[metapagenum].picduration[picid];
textprompts[num]->page[pagenum].xcoord[picid] = textprompts[num]->page[metapagenum].xcoord[picid]; textprompts[num]->page[pagenum].xcoord[picid] = textprompts[num]->page[metapagenum].xcoord[picid];
...@@ -2247,14 +2277,17 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum) ...@@ -2247,14 +2277,17 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
picid = (UINT8)atoi(word + 3); picid = (UINT8)atoi(word + 3);
if (picid > MAX_PROMPT_PICS || picid == 0) if (picid > MAX_PROMPT_PICS || picid == 0)
{ {
deh_warning("textpromptscene %d: unknown word '%s'", num, word); deh_warning("Text prompt %d, page %d: pic number %d out of range (1 - %d)",
num + 1, pagenum + 1, picid, MAX_PROMPT_PICS);
continue; continue;
} }
--picid; --picid;
if (fastcmp(word+4, "NAME")) if (fastcmp(word+4, "NAME"))
{ {
strncpy(textprompts[num]->page[pagenum].picname[picid], word2, 8); deh_strlcpy(textprompts[num]->page[pagenum].picname[picid], word2,
sizeof textprompts[num]->page[pagenum].picname[picid],
va("Text prompt %d, page %d, pic %d: name", num + 1, pagenum + 1, picid + 1));
} }
else if (fastcmp(word+4, "HIRES")) else if (fastcmp(word+4, "HIRES"))
{ {
...@@ -2273,12 +2306,16 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum) ...@@ -2273,12 +2306,16 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
textprompts[num]->page[pagenum].ycoord[picid] = usi; textprompts[num]->page[pagenum].ycoord[picid] = usi;
} }
else else
deh_warning("textpromptscene %d: unknown word '%s'", num, word); {
deh_warning("Text prompt %d, page %d: unknown word '%s'",
num + 1, pagenum + 1, word);
}
} }
else if (fastcmp(word, "MUSIC")) else if (fastcmp(word, "MUSIC"))
{ {
strncpy(textprompts[num]->page[pagenum].musswitch, word2, 7); deh_strlcpy(textprompts[num]->page[pagenum].musswitch, word2,
textprompts[num]->page[pagenum].musswitch[6] = 0; sizeof textprompts[num]->page[pagenum].musswitch,
va("Text prompt %d, page %d: music", num + 1, pagenum + 1));
} }
else if (fastcmp(word, "MUSICTRACK")) else if (fastcmp(word, "MUSICTRACK"))
{ {
...@@ -2293,30 +2330,35 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum) ...@@ -2293,30 +2330,35 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
{ {
if (*word2 != '\0') if (*word2 != '\0')
{ {
INT32 j; size_t j;
// HACK: Add yellow control char now // HACK: Add yellow control char now
// so the drawing function doesn't call it repeatedly // so the drawing function doesn't call it repeatedly
char name[34]; char name[32 + 2];
name[0] = '\x82'; // color yellow name[0] = '\x82'; // color yellow
name[1] = 0;
strncat(name, word2, 32); // So that we still get a warning.
name[33] = 0; deh_strlcpy(name + 1, word2, (sizeof(name)) - 1,
va("Text prompt %d, page %d: name", num + 1, pagenum + 1));
// Replace _ with ' ' // Replace _ with ' '
for (j = 0; j < 32 && name[j]; j++) for (j = 1; j < sizeof(name) && name[j]; j++)
{ {
if (name[j] == '_') if (name[j] == '_')
name[j] = ' '; name[j] = ' ';
} }
strncpy(textprompts[num]->page[pagenum].name, name, sizeof(textprompts[num]->page[pagenum].name)); strlcpy(textprompts[num]->page[pagenum].name, name, sizeof(textprompts[num]->page[pagenum].name));
} }
else else
*textprompts[num]->page[pagenum].name = '\0'; *textprompts[num]->page[pagenum].name = '\0';
} }
else if (fastcmp(word, "ICON")) else if (fastcmp(word, "ICON"))
strncpy(textprompts[num]->page[pagenum].iconname, word2, 8); {
deh_strlcpy(textprompts[num]->page[pagenum].iconname, word2,
sizeof textprompts[num]->page[pagenum].iconname,
va("Text prompt %d, page %d: icon", num + 1, pagenum + 1));
}
else if (fastcmp(word, "ICONALIGN")) else if (fastcmp(word, "ICONALIGN"))
textprompts[num]->page[pagenum].rightside = (i || word2[0] == 'R'); textprompts[num]->page[pagenum].rightside = (i || word2[0] == 'R');
else if (fastcmp(word, "ICONFLIP")) else if (fastcmp(word, "ICONFLIP"))
...@@ -2383,8 +2425,9 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum) ...@@ -2383,8 +2425,9 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
{ {
UINT8 metapagenum = usi - 1; UINT8 metapagenum = usi - 1;
strncpy(textprompts[num]->page[pagenum].name, textprompts[num]->page[metapagenum].name, 32); // Doesn't use deh_strlcpy because it's not copying input.
strncpy(textprompts[num]->page[pagenum].iconname, textprompts[num]->page[metapagenum].iconname, 8); strlcpy(textprompts[num]->page[pagenum].name, textprompts[num]->page[metapagenum].name, sizeof textprompts[num]->page[pagenum].name);
strlcpy(textprompts[num]->page[pagenum].iconname, textprompts[num]->page[metapagenum].iconname, sizeof textprompts[num]->page[pagenum].iconname);
textprompts[num]->page[pagenum].rightside = textprompts[num]->page[metapagenum].rightside; textprompts[num]->page[pagenum].rightside = textprompts[num]->page[metapagenum].rightside;
textprompts[num]->page[pagenum].iconflip = textprompts[num]->page[metapagenum].iconflip; textprompts[num]->page[pagenum].iconflip = textprompts[num]->page[metapagenum].iconflip;
textprompts[num]->page[pagenum].lines = textprompts[num]->page[metapagenum].lines; textprompts[num]->page[pagenum].lines = textprompts[num]->page[metapagenum].lines;
...@@ -2399,17 +2442,25 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum) ...@@ -2399,17 +2442,25 @@ static void readtextpromptpage(MYFILE *f, INT32 num, INT32 pagenum)
} }
} }
else if (fastcmp(word, "TAG")) else if (fastcmp(word, "TAG"))
strncpy(textprompts[num]->page[pagenum].tag, word2, 33); {
deh_strlcpy(textprompts[num]->page[pagenum].tag, word2,
sizeof textprompts[num]->page[pagenum].tag,
va("Text prompt %d, page %d: tag", num + 1, pagenum + 1));
}
else if (fastcmp(word, "NEXTPROMPT")) else if (fastcmp(word, "NEXTPROMPT"))
textprompts[num]->page[pagenum].nextprompt = usi; textprompts[num]->page[pagenum].nextprompt = usi;
else if (fastcmp(word, "NEXTPAGE")) else if (fastcmp(word, "NEXTPAGE"))
textprompts[num]->page[pagenum].nextpage = usi; textprompts[num]->page[pagenum].nextpage = usi;
else if (fastcmp(word, "NEXTTAG")) else if (fastcmp(word, "NEXTTAG"))
strncpy(textprompts[num]->page[pagenum].nexttag, word2, 33); {
deh_strlcpy(textprompts[num]->page[pagenum].nexttag, word2,
sizeof textprompts[num]->page[pagenum].nexttag,
va("Text prompt %d, page %d: nexttag", num + 1, pagenum + 1));
}
else if (fastcmp(word, "TIMETONEXT")) else if (fastcmp(word, "TIMETONEXT"))
textprompts[num]->page[pagenum].timetonext = get_number(word2); textprompts[num]->page[pagenum].timetonext = get_number(word2);
else else
deh_warning("PromptPage %d: unknown word '%s'", num, word); deh_warning("Text prompt %d, page %d: unknown word '%s'", num + 1, pagenum + 1, word);
} }
} while (!myfeof(f)); // finish when the line is empty } while (!myfeof(f)); // finish when the line is empty
...@@ -2469,11 +2520,11 @@ void readtextprompt(MYFILE *f, INT32 num) ...@@ -2469,11 +2520,11 @@ void readtextprompt(MYFILE *f, INT32 num)
readtextpromptpage(f, num, value - 1); readtextpromptpage(f, num, value - 1);
} }
else else
deh_warning("Page number %d out of range (1 - %d)", value, MAX_PAGES); deh_warning("Prompt %d: page number %d out of range (1 - %d)", num + 1, value, MAX_PAGES);
} }
else else
deh_warning("Prompt %d: unknown word '%s', Page <num> expected.", num, word); deh_warning("Prompt %d: unknown word '%s', Page <num> expected.", num + 1, word);
} }
} while (!myfeof(f)); // finish when the line is empty } while (!myfeof(f)); // finish when the line is empty
...@@ -2522,7 +2573,8 @@ void readmenu(MYFILE *f, INT32 num) ...@@ -2522,7 +2573,8 @@ void readmenu(MYFILE *f, INT32 num)
if (fastcmp(word, "BACKGROUNDNAME")) if (fastcmp(word, "BACKGROUNDNAME"))
{ {
strncpy(menupres[num].bgname, word2, 8); deh_strlcpy(menupres[num].bgname, word2,
sizeof menupres[num].bgname, va("Menu %d: backgroundname", num));
titlechanged = true; titlechanged = true;
} }
else if (fastcmp(word, "HIDEBACKGROUND")) else if (fastcmp(word, "HIDEBACKGROUND"))
...@@ -2565,7 +2617,8 @@ void readmenu(MYFILE *f, INT32 num) ...@@ -2565,7 +2617,8 @@ void readmenu(MYFILE *f, INT32 num)
} }
else if (fastcmp(word, "TITLEPICSNAME")) else if (fastcmp(word, "TITLEPICSNAME"))
{ {
strncpy(menupres[num].ttname, word2, 9); deh_strlcpy(menupres[num].ttname, word2,
sizeof menupres[num].ttname, va("Menu %d: titlepicsname", num));
titlechanged = true; titlechanged = true;
} }
else if (fastcmp(word, "TITLEPICSX")) else if (fastcmp(word, "TITLEPICSX"))
...@@ -2601,8 +2654,8 @@ void readmenu(MYFILE *f, INT32 num) ...@@ -2601,8 +2654,8 @@ void readmenu(MYFILE *f, INT32 num)
} }
else if (fastcmp(word, "MUSIC")) else if (fastcmp(word, "MUSIC"))
{ {
strncpy(menupres[num].musname, word2, 7); deh_strlcpy(menupres[num].musname, word2,
menupres[num].musname[6] = 0; sizeof menupres[num].musname, va("Menu %d: music", num));
titlechanged = true; titlechanged = true;
} }
else if (fastcmp(word, "MUSICTRACK")) else if (fastcmp(word, "MUSICTRACK"))
...@@ -2807,7 +2860,7 @@ void readframe(MYFILE *f, INT32 num) ...@@ -2807,7 +2860,7 @@ void readframe(MYFILE *f, INT32 num)
for (z = 0; actionpointers[z].name; z++) for (z = 0; actionpointers[z].name; z++)
{ {
if (actionpointers[z].action.acv == states[num].action.acv) if (actionpointers[z].action == states[num].action)
break; break;
} }
...@@ -2819,8 +2872,6 @@ void readframe(MYFILE *f, INT32 num) ...@@ -2819,8 +2872,6 @@ void readframe(MYFILE *f, INT32 num)
if (fastcmp(actiontocompare, actionpointers[z].name)) if (fastcmp(actiontocompare, actionpointers[z].name))
{ {
states[num].action = actionpointers[z].action; states[num].action = actionpointers[z].action;
states[num].action.acv = actionpointers[z].action.acv; // assign
states[num].action.acp1 = actionpointers[z].action.acp1;
found = true; found = true;
break; break;
} }
...@@ -3453,6 +3504,18 @@ static void readcondition(UINT8 set, UINT32 id, char *word2) ...@@ -3453,6 +3504,18 @@ static void readcondition(UINT8 set, UINT32 id, char *word2)
return; return;
} }
} }
else if (fastcmp(params[0], "LUA"))
{
PARAMCHECK(1);
ty = UC_LUA;
re = atoi(params[1]);
if (re <= 0 || re > MAXLUACONDITIONS)
{
deh_warning("Lua condition %d out of range (1 - %d)", re, MAXLUACONDITIONS);
return;
}
}
else if (fastcmp(params[0], "CONDITIONSET")) else if (fastcmp(params[0], "CONDITIONSET"))
{ {
PARAMCHECK(1); PARAMCHECK(1);
...@@ -3590,9 +3653,7 @@ void readmaincfg(MYFILE *f) ...@@ -3590,9 +3653,7 @@ void readmaincfg(MYFILE *f)
lumpnum_t lumpnum; lumpnum_t lumpnum;
char newname[9]; char newname[9];
strncpy(newname, word2, 8); deh_strlcpy(newname, word2, sizeof newname, va("Maincfg: execcfg"));
newname[8] = '\0';
lumpnum = W_CheckNumForName(newname); lumpnum = W_CheckNumForName(newname);
...@@ -3800,7 +3861,7 @@ void readmaincfg(MYFILE *f) ...@@ -3800,7 +3861,7 @@ void readmaincfg(MYFILE *f)
} }
else if (fastcmp(word, "TITLEPICSNAME")) else if (fastcmp(word, "TITLEPICSNAME"))
{ {
strncpy(ttname, word2, sizeof(ttname)-1); deh_strlcpy(ttname, word2, sizeof ttname, va("Maincfg: titlepicsname"));
titlechanged = true; titlechanged = true;
} }
else if (fastcmp(word, "TITLEPICSX")) else if (fastcmp(word, "TITLEPICSX"))
...@@ -3910,7 +3971,7 @@ void readmaincfg(MYFILE *f) ...@@ -3910,7 +3971,7 @@ void readmaincfg(MYFILE *f)
} }
else if (fastcmp(word, "CUSTOMVERSION")) else if (fastcmp(word, "CUSTOMVERSION"))
{ {
strlcpy(customversionstring, word2, sizeof (customversionstring)); deh_strlcpy(customversionstring, word2, sizeof customversionstring, va("Maincfg: customversion"));
//titlechanged = true; //titlechanged = true;
} }
else if (fastcmp(word, "BOOTMAP")) else if (fastcmp(word, "BOOTMAP"))
......
// SONIC ROBO BLAST 2 // SONIC ROBO BLAST 2
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Copyright (C) 1998-2000 by DooM Legacy Team. // Copyright (C) 1998-2000 by DooM Legacy Team.
// Copyright (C) 1999-2024 by Sonic Team Junior. // Copyright (C) 1999-2025 by Sonic Team Junior.
// //
// This program is free software distributed under the // This program is free software distributed under the
// terms of the GNU General Public License, version 2. // terms of the GNU General Public License, version 2.
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "g_game.h" // Joystick axes (for lua) #include "g_game.h" // Joystick axes (for lua)
#include "i_joy.h" #include "i_joy.h"
#include "g_input.h" // Game controls (for lua) #include "g_input.h" // Game controls (for lua)
#include "p_maputl.h" // P_PathTraverse constants (for lua)
#include "deh_tables.h" #include "deh_tables.h"
...@@ -73,278 +74,278 @@ struct flickytypes_s FLICKYTYPES[] = { ...@@ -73,278 +74,278 @@ struct flickytypes_s FLICKYTYPES[] = {
// DO NOT FORGET TO SYNC THIS LIST WITH THE ACTIONNUM ENUM IN INFO.H // DO NOT FORGET TO SYNC THIS LIST WITH THE ACTIONNUM ENUM IN INFO.H
actionpointer_t actionpointers[] = actionpointer_t actionpointers[] =
{ {
{{A_Explode}, "A_EXPLODE"}, {A_Explode, "A_EXPLODE"},
{{A_Pain}, "A_PAIN"}, {A_Pain, "A_PAIN"},
{{A_Fall}, "A_FALL"}, {A_Fall, "A_FALL"},
{{A_MonitorPop}, "A_MONITORPOP"}, {A_MonitorPop, "A_MONITORPOP"},
{{A_GoldMonitorPop}, "A_GOLDMONITORPOP"}, {A_GoldMonitorPop, "A_GOLDMONITORPOP"},
{{A_GoldMonitorRestore}, "A_GOLDMONITORRESTORE"}, {A_GoldMonitorRestore, "A_GOLDMONITORRESTORE"},
{{A_GoldMonitorSparkle}, "A_GOLDMONITORSPARKLE"}, {A_GoldMonitorSparkle, "A_GOLDMONITORSPARKLE"},
{{A_Look}, "A_LOOK"}, {A_Look, "A_LOOK"},
{{A_Chase}, "A_CHASE"}, {A_Chase, "A_CHASE"},
{{A_FaceStabChase}, "A_FACESTABCHASE"}, {A_FaceStabChase, "A_FACESTABCHASE"},
{{A_FaceStabRev}, "A_FACESTABREV"}, {A_FaceStabRev, "A_FACESTABREV"},
{{A_FaceStabHurl}, "A_FACESTABHURL"}, {A_FaceStabHurl, "A_FACESTABHURL"},
{{A_FaceStabMiss}, "A_FACESTABMISS"}, {A_FaceStabMiss, "A_FACESTABMISS"},
{{A_StatueBurst}, "A_STATUEBURST"}, {A_StatueBurst, "A_STATUEBURST"},
{{A_FaceTarget}, "A_FACETARGET"}, {A_FaceTarget, "A_FACETARGET"},
{{A_FaceTracer}, "A_FACETRACER"}, {A_FaceTracer, "A_FACETRACER"},
{{A_Scream}, "A_SCREAM"}, {A_Scream, "A_SCREAM"},
{{A_BossDeath}, "A_BOSSDEATH"}, {A_BossDeath, "A_BOSSDEATH"},
{{A_SetShadowScale}, "A_SETSHADOWSCALE"}, {A_SetShadowScale, "A_SETSHADOWSCALE"},
{{A_ShadowScream}, "A_SHADOWSCREAM"}, {A_ShadowScream, "A_SHADOWSCREAM"},
{{A_CustomPower}, "A_CUSTOMPOWER"}, {A_CustomPower, "A_CUSTOMPOWER"},
{{A_GiveWeapon}, "A_GIVEWEAPON"}, {A_GiveWeapon, "A_GIVEWEAPON"},
{{A_RingBox}, "A_RINGBOX"}, {A_RingBox, "A_RINGBOX"},
{{A_Invincibility}, "A_INVINCIBILITY"}, {A_Invincibility, "A_INVINCIBILITY"},
{{A_SuperSneakers}, "A_SUPERSNEAKERS"}, {A_SuperSneakers, "A_SUPERSNEAKERS"},
{{A_BunnyHop}, "A_BUNNYHOP"}, {A_BunnyHop, "A_BUNNYHOP"},
{{A_BubbleSpawn}, "A_BUBBLESPAWN"}, {A_BubbleSpawn, "A_BUBBLESPAWN"},
{{A_FanBubbleSpawn}, "A_FANBUBBLESPAWN"}, {A_FanBubbleSpawn, "A_FANBUBBLESPAWN"},
{{A_BubbleRise}, "A_BUBBLERISE"}, {A_BubbleRise, "A_BUBBLERISE"},
{{A_BubbleCheck}, "A_BUBBLECHECK"}, {A_BubbleCheck, "A_BUBBLECHECK"},
{{A_AwardScore}, "A_AWARDSCORE"}, {A_AwardScore, "A_AWARDSCORE"},
{{A_ExtraLife}, "A_EXTRALIFE"}, {A_ExtraLife, "A_EXTRALIFE"},
{{A_GiveShield}, "A_GIVESHIELD"}, {A_GiveShield, "A_GIVESHIELD"},
{{A_GravityBox}, "A_GRAVITYBOX"}, {A_GravityBox, "A_GRAVITYBOX"},
{{A_ScoreRise}, "A_SCORERISE"}, {A_ScoreRise, "A_SCORERISE"},
{{A_AttractChase}, "A_ATTRACTCHASE"}, {A_AttractChase, "A_ATTRACTCHASE"},
{{A_DropMine}, "A_DROPMINE"}, {A_DropMine, "A_DROPMINE"},
{{A_FishJump}, "A_FISHJUMP"}, {A_FishJump, "A_FISHJUMP"},
{{A_ThrownRing}, "A_THROWNRING"}, {A_ThrownRing, "A_THROWNRING"},
{{A_SetSolidSteam}, "A_SETSOLIDSTEAM"}, {A_SetSolidSteam, "A_SETSOLIDSTEAM"},
{{A_UnsetSolidSteam}, "A_UNSETSOLIDSTEAM"}, {A_UnsetSolidSteam, "A_UNSETSOLIDSTEAM"},
{{A_SignSpin}, "A_SIGNSPIN"}, {A_SignSpin, "A_SIGNSPIN"},
{{A_SignPlayer}, "A_SIGNPLAYER"}, {A_SignPlayer, "A_SIGNPLAYER"},
{{A_OverlayThink}, "A_OVERLAYTHINK"}, {A_OverlayThink, "A_OVERLAYTHINK"},
{{A_JetChase}, "A_JETCHASE"}, {A_JetChase, "A_JETCHASE"},
{{A_JetbThink}, "A_JETBTHINK"}, {A_JetbThink, "A_JETBTHINK"},
{{A_JetgThink}, "A_JETGTHINK"}, {A_JetgThink, "A_JETGTHINK"},
{{A_JetgShoot}, "A_JETGSHOOT"}, {A_JetgShoot, "A_JETGSHOOT"},
{{A_ShootBullet}, "A_SHOOTBULLET"}, {A_ShootBullet, "A_SHOOTBULLET"},
{{A_MinusDigging}, "A_MINUSDIGGING"}, {A_MinusDigging, "A_MINUSDIGGING"},
{{A_MinusPopup}, "A_MINUSPOPUP"}, {A_MinusPopup, "A_MINUSPOPUP"},
{{A_MinusCheck}, "A_MINUSCHECK"}, {A_MinusCheck, "A_MINUSCHECK"},
{{A_ChickenCheck}, "A_CHICKENCHECK"}, {A_ChickenCheck, "A_CHICKENCHECK"},
{{A_MouseThink}, "A_MOUSETHINK"}, {A_MouseThink, "A_MOUSETHINK"},
{{A_DetonChase}, "A_DETONCHASE"}, {A_DetonChase, "A_DETONCHASE"},
{{A_CapeChase}, "A_CAPECHASE"}, {A_CapeChase, "A_CAPECHASE"},
{{A_RotateSpikeBall}, "A_ROTATESPIKEBALL"}, {A_RotateSpikeBall, "A_ROTATESPIKEBALL"},
{{A_SlingAppear}, "A_SLINGAPPEAR"}, {A_SlingAppear, "A_SLINGAPPEAR"},
{{A_UnidusBall}, "A_UNIDUSBALL"}, {A_UnidusBall, "A_UNIDUSBALL"},
{{A_RockSpawn}, "A_ROCKSPAWN"}, {A_RockSpawn, "A_ROCKSPAWN"},
{{A_SetFuse}, "A_SETFUSE"}, {A_SetFuse, "A_SETFUSE"},
{{A_CrawlaCommanderThink}, "A_CRAWLACOMMANDERTHINK"}, {A_CrawlaCommanderThink, "A_CRAWLACOMMANDERTHINK"},
{{A_SmokeTrailer}, "A_SMOKETRAILER"}, {A_SmokeTrailer, "A_SMOKETRAILER"},
{{A_RingExplode}, "A_RINGEXPLODE"}, {A_RingExplode, "A_RINGEXPLODE"},
{{A_OldRingExplode}, "A_OLDRINGEXPLODE"}, {A_OldRingExplode, "A_OLDRINGEXPLODE"},
{{A_MixUp}, "A_MIXUP"}, {A_MixUp, "A_MIXUP"},
{{A_RecyclePowers}, "A_RECYCLEPOWERS"}, {A_RecyclePowers, "A_RECYCLEPOWERS"},
{{A_Boss1Chase}, "A_BOSS1CHASE"}, {A_Boss1Chase, "A_BOSS1CHASE"},
{{A_FocusTarget}, "A_FOCUSTARGET"}, {A_FocusTarget, "A_FOCUSTARGET"},
{{A_Boss2Chase}, "A_BOSS2CHASE"}, {A_Boss2Chase, "A_BOSS2CHASE"},
{{A_Boss2Pogo}, "A_BOSS2POGO"}, {A_Boss2Pogo, "A_BOSS2POGO"},
{{A_BossZoom}, "A_BOSSZOOM"}, {A_BossZoom, "A_BOSSZOOM"},
{{A_BossScream}, "A_BOSSSCREAM"}, {A_BossScream, "A_BOSSSCREAM"},
{{A_Boss2TakeDamage}, "A_BOSS2TAKEDAMAGE"}, {A_Boss2TakeDamage, "A_BOSS2TAKEDAMAGE"},
{{A_Boss7Chase}, "A_BOSS7CHASE"}, {A_Boss7Chase, "A_BOSS7CHASE"},
{{A_GoopSplat}, "A_GOOPSPLAT"}, {A_GoopSplat, "A_GOOPSPLAT"},
{{A_Boss2PogoSFX}, "A_BOSS2POGOSFX"}, {A_Boss2PogoSFX, "A_BOSS2POGOSFX"},
{{A_Boss2PogoTarget}, "A_BOSS2POGOTARGET"}, {A_Boss2PogoTarget, "A_BOSS2POGOTARGET"},
{{A_BossJetFume}, "A_BOSSJETFUME"}, {A_BossJetFume, "A_BOSSJETFUME"},
{{A_EggmanBox}, "A_EGGMANBOX"}, {A_EggmanBox, "A_EGGMANBOX"},
{{A_TurretFire}, "A_TURRETFIRE"}, {A_TurretFire, "A_TURRETFIRE"},
{{A_SuperTurretFire}, "A_SUPERTURRETFIRE"}, {A_SuperTurretFire, "A_SUPERTURRETFIRE"},
{{A_TurretStop}, "A_TURRETSTOP"}, {A_TurretStop, "A_TURRETSTOP"},
{{A_JetJawRoam}, "A_JETJAWROAM"}, {A_JetJawRoam, "A_JETJAWROAM"},
{{A_JetJawChomp}, "A_JETJAWCHOMP"}, {A_JetJawChomp, "A_JETJAWCHOMP"},
{{A_PointyThink}, "A_POINTYTHINK"}, {A_PointyThink, "A_POINTYTHINK"},
{{A_CheckBuddy}, "A_CHECKBUDDY"}, {A_CheckBuddy, "A_CHECKBUDDY"},
{{A_HoodFire}, "A_HOODFIRE"}, {A_HoodFire, "A_HOODFIRE"},
{{A_HoodThink}, "A_HOODTHINK"}, {A_HoodThink, "A_HOODTHINK"},
{{A_HoodFall}, "A_HOODFALL"}, {A_HoodFall, "A_HOODFALL"},
{{A_ArrowBonks}, "A_ARROWBONKS"}, {A_ArrowBonks, "A_ARROWBONKS"},
{{A_SnailerThink}, "A_SNAILERTHINK"}, {A_SnailerThink, "A_SNAILERTHINK"},
{{A_SharpChase}, "A_SHARPCHASE"}, {A_SharpChase, "A_SHARPCHASE"},
{{A_SharpSpin}, "A_SHARPSPIN"}, {A_SharpSpin, "A_SHARPSPIN"},
{{A_SharpDecel}, "A_SHARPDECEL"}, {A_SharpDecel, "A_SHARPDECEL"},
{{A_CrushstaceanWalk}, "A_CRUSHSTACEANWALK"}, {A_CrushstaceanWalk, "A_CRUSHSTACEANWALK"},
{{A_CrushstaceanPunch}, "A_CRUSHSTACEANPUNCH"}, {A_CrushstaceanPunch, "A_CRUSHSTACEANPUNCH"},
{{A_CrushclawAim}, "A_CRUSHCLAWAIM"}, {A_CrushclawAim, "A_CRUSHCLAWAIM"},
{{A_CrushclawLaunch}, "A_CRUSHCLAWLAUNCH"}, {A_CrushclawLaunch, "A_CRUSHCLAWLAUNCH"},
{{A_VultureVtol}, "A_VULTUREVTOL"}, {A_VultureVtol, "A_VULTUREVTOL"},
{{A_VultureCheck}, "A_VULTURECHECK"}, {A_VultureCheck, "A_VULTURECHECK"},
{{A_VultureHover}, "A_VULTUREHOVER"}, {A_VultureHover, "A_VULTUREHOVER"},
{{A_VultureBlast}, "A_VULTUREBLAST"}, {A_VultureBlast, "A_VULTUREBLAST"},
{{A_VultureFly}, "A_VULTUREFLY"}, {A_VultureFly, "A_VULTUREFLY"},
{{A_SkimChase}, "A_SKIMCHASE"}, {A_SkimChase, "A_SKIMCHASE"},
{{A_1upThinker}, "A_1UPTHINKER"}, {A_1upThinker, "A_1UPTHINKER"},
{{A_SkullAttack}, "A_SKULLATTACK"}, {A_SkullAttack, "A_SKULLATTACK"},
{{A_LobShot}, "A_LOBSHOT"}, {A_LobShot, "A_LOBSHOT"},
{{A_FireShot}, "A_FIRESHOT"}, {A_FireShot, "A_FIRESHOT"},
{{A_SuperFireShot}, "A_SUPERFIRESHOT"}, {A_SuperFireShot, "A_SUPERFIRESHOT"},
{{A_BossFireShot}, "A_BOSSFIRESHOT"}, {A_BossFireShot, "A_BOSSFIRESHOT"},
{{A_Boss7FireMissiles}, "A_BOSS7FIREMISSILES"}, {A_Boss7FireMissiles, "A_BOSS7FIREMISSILES"},
{{A_Boss1Laser}, "A_BOSS1LASER"}, {A_Boss1Laser, "A_BOSS1LASER"},
{{A_Boss4Reverse}, "A_BOSS4REVERSE"}, {A_Boss4Reverse, "A_BOSS4REVERSE"},
{{A_Boss4SpeedUp}, "A_BOSS4SPEEDUP"}, {A_Boss4SpeedUp, "A_BOSS4SPEEDUP"},
{{A_Boss4Raise}, "A_BOSS4RAISE"}, {A_Boss4Raise, "A_BOSS4RAISE"},
{{A_SparkFollow}, "A_SPARKFOLLOW"}, {A_SparkFollow, "A_SPARKFOLLOW"},
{{A_BuzzFly}, "A_BUZZFLY"}, {A_BuzzFly, "A_BUZZFLY"},
{{A_GuardChase}, "A_GUARDCHASE"}, {A_GuardChase, "A_GUARDCHASE"},
{{A_EggShield}, "A_EGGSHIELD"}, {A_EggShield, "A_EGGSHIELD"},
{{A_SetReactionTime}, "A_SETREACTIONTIME"}, {A_SetReactionTime, "A_SETREACTIONTIME"},
{{A_Boss1Spikeballs}, "A_BOSS1SPIKEBALLS"}, {A_Boss1Spikeballs, "A_BOSS1SPIKEBALLS"},
{{A_Boss3TakeDamage}, "A_BOSS3TAKEDAMAGE"}, {A_Boss3TakeDamage, "A_BOSS3TAKEDAMAGE"},
{{A_Boss3Path}, "A_BOSS3PATH"}, {A_Boss3Path, "A_BOSS3PATH"},
{{A_Boss3ShockThink}, "A_BOSS3SHOCKTHINK"}, {A_Boss3ShockThink, "A_BOSS3SHOCKTHINK"},
{{A_Shockwave}, "A_SHOCKWAVE"}, {A_Shockwave, "A_SHOCKWAVE"},
{{A_LinedefExecute}, "A_LINEDEFEXECUTE"}, {A_LinedefExecute, "A_LINEDEFEXECUTE"},
{{A_LinedefExecuteFromArg}, "A_LINEDEFEXECUTEFROMARG"}, {A_LinedefExecuteFromArg, "A_LINEDEFEXECUTEFROMARG"},
{{A_PlaySeeSound}, "A_PLAYSEESOUND"}, {A_PlaySeeSound, "A_PLAYSEESOUND"},
{{A_PlayAttackSound}, "A_PLAYATTACKSOUND"}, {A_PlayAttackSound, "A_PLAYATTACKSOUND"},
{{A_PlayActiveSound}, "A_PLAYACTIVESOUND"}, {A_PlayActiveSound, "A_PLAYACTIVESOUND"},
{{A_SpawnObjectAbsolute}, "A_SPAWNOBJECTABSOLUTE"}, {A_SpawnObjectAbsolute, "A_SPAWNOBJECTABSOLUTE"},
{{A_SpawnObjectRelative}, "A_SPAWNOBJECTRELATIVE"}, {A_SpawnObjectRelative, "A_SPAWNOBJECTRELATIVE"},
{{A_ChangeAngleRelative}, "A_CHANGEANGLERELATIVE"}, {A_ChangeAngleRelative, "A_CHANGEANGLERELATIVE"},
{{A_ChangeAngleAbsolute}, "A_CHANGEANGLEABSOLUTE"}, {A_ChangeAngleAbsolute, "A_CHANGEANGLEABSOLUTE"},
{{A_RollAngle}, "A_ROLLANGLE"}, {A_RollAngle, "A_ROLLANGLE"},
{{A_ChangeRollAngleRelative},"A_CHANGEROLLANGLERELATIVE"}, {A_ChangeRollAngleRelative,"A_CHANGEROLLANGLERELATIVE"},
{{A_ChangeRollAngleAbsolute},"A_CHANGEROLLANGLEABSOLUTE"}, {A_ChangeRollAngleAbsolute,"A_CHANGEROLLANGLEABSOLUTE"},
{{A_PlaySound}, "A_PLAYSOUND"}, {A_PlaySound, "A_PLAYSOUND"},
{{A_FindTarget}, "A_FINDTARGET"}, {A_FindTarget, "A_FINDTARGET"},
{{A_FindTracer}, "A_FINDTRACER"}, {A_FindTracer, "A_FINDTRACER"},
{{A_SetTics}, "A_SETTICS"}, {A_SetTics, "A_SETTICS"},
{{A_SetRandomTics}, "A_SETRANDOMTICS"}, {A_SetRandomTics, "A_SETRANDOMTICS"},
{{A_ChangeColorRelative}, "A_CHANGECOLORRELATIVE"}, {A_ChangeColorRelative, "A_CHANGECOLORRELATIVE"},
{{A_ChangeColorAbsolute}, "A_CHANGECOLORABSOLUTE"}, {A_ChangeColorAbsolute, "A_CHANGECOLORABSOLUTE"},
{{A_Dye}, "A_DYE"}, {A_Dye, "A_DYE"},
{{A_SetTranslation}, "A_SETTRANSLATION"}, {A_SetTranslation, "A_SETTRANSLATION"},
{{A_MoveRelative}, "A_MOVERELATIVE"}, {A_MoveRelative, "A_MOVERELATIVE"},
{{A_MoveAbsolute}, "A_MOVEABSOLUTE"}, {A_MoveAbsolute, "A_MOVEABSOLUTE"},
{{A_Thrust}, "A_THRUST"}, {A_Thrust, "A_THRUST"},
{{A_ZThrust}, "A_ZTHRUST"}, {A_ZThrust, "A_ZTHRUST"},
{{A_SetTargetsTarget}, "A_SETTARGETSTARGET"}, {A_SetTargetsTarget, "A_SETTARGETSTARGET"},
{{A_SetObjectFlags}, "A_SETOBJECTFLAGS"}, {A_SetObjectFlags, "A_SETOBJECTFLAGS"},
{{A_SetObjectFlags2}, "A_SETOBJECTFLAGS2"}, {A_SetObjectFlags2, "A_SETOBJECTFLAGS2"},
{{A_RandomState}, "A_RANDOMSTATE"}, {A_RandomState, "A_RANDOMSTATE"},
{{A_RandomStateRange}, "A_RANDOMSTATERANGE"}, {A_RandomStateRange, "A_RANDOMSTATERANGE"},
{{A_StateRangeByAngle}, "A_STATERANGEBYANGLE"}, {A_StateRangeByAngle, "A_STATERANGEBYANGLE"},
{{A_StateRangeByParameter}, "A_STATERANGEBYPARAMETER"}, {A_StateRangeByParameter, "A_STATERANGEBYPARAMETER"},
{{A_DualAction}, "A_DUALACTION"}, {A_DualAction, "A_DUALACTION"},
{{A_RemoteAction}, "A_REMOTEACTION"}, {A_RemoteAction, "A_REMOTEACTION"},
{{A_ToggleFlameJet}, "A_TOGGLEFLAMEJET"}, {A_ToggleFlameJet, "A_TOGGLEFLAMEJET"},
{{A_OrbitNights}, "A_ORBITNIGHTS"}, {A_OrbitNights, "A_ORBITNIGHTS"},
{{A_GhostMe}, "A_GHOSTME"}, {A_GhostMe, "A_GHOSTME"},
{{A_SetObjectState}, "A_SETOBJECTSTATE"}, {A_SetObjectState, "A_SETOBJECTSTATE"},
{{A_SetObjectTypeState}, "A_SETOBJECTTYPESTATE"}, {A_SetObjectTypeState, "A_SETOBJECTTYPESTATE"},
{{A_KnockBack}, "A_KNOCKBACK"}, {A_KnockBack, "A_KNOCKBACK"},
{{A_PushAway}, "A_PUSHAWAY"}, {A_PushAway, "A_PUSHAWAY"},
{{A_RingDrain}, "A_RINGDRAIN"}, {A_RingDrain, "A_RINGDRAIN"},
{{A_SplitShot}, "A_SPLITSHOT"}, {A_SplitShot, "A_SPLITSHOT"},
{{A_MissileSplit}, "A_MISSILESPLIT"}, {A_MissileSplit, "A_MISSILESPLIT"},
{{A_MultiShot}, "A_MULTISHOT"}, {A_MultiShot, "A_MULTISHOT"},
{{A_InstaLoop}, "A_INSTALOOP"}, {A_InstaLoop, "A_INSTALOOP"},
{{A_Custom3DRotate}, "A_CUSTOM3DROTATE"}, {A_Custom3DRotate, "A_CUSTOM3DROTATE"},
{{A_SearchForPlayers}, "A_SEARCHFORPLAYERS"}, {A_SearchForPlayers, "A_SEARCHFORPLAYERS"},
{{A_CheckRandom}, "A_CHECKRANDOM"}, {A_CheckRandom, "A_CHECKRANDOM"},
{{A_CheckTargetRings}, "A_CHECKTARGETRINGS"}, {A_CheckTargetRings, "A_CHECKTARGETRINGS"},
{{A_CheckRings}, "A_CHECKRINGS"}, {A_CheckRings, "A_CHECKRINGS"},
{{A_CheckTotalRings}, "A_CHECKTOTALRINGS"}, {A_CheckTotalRings, "A_CHECKTOTALRINGS"},
{{A_CheckHealth}, "A_CHECKHEALTH"}, {A_CheckHealth, "A_CHECKHEALTH"},
{{A_CheckRange}, "A_CHECKRANGE"}, {A_CheckRange, "A_CHECKRANGE"},
{{A_CheckHeight}, "A_CHECKHEIGHT"}, {A_CheckHeight, "A_CHECKHEIGHT"},
{{A_CheckTrueRange}, "A_CHECKTRUERANGE"}, {A_CheckTrueRange, "A_CHECKTRUERANGE"},
{{A_CheckThingCount}, "A_CHECKTHINGCOUNT"}, {A_CheckThingCount, "A_CHECKTHINGCOUNT"},
{{A_CheckAmbush}, "A_CHECKAMBUSH"}, {A_CheckAmbush, "A_CHECKAMBUSH"},
{{A_CheckCustomValue}, "A_CHECKCUSTOMVALUE"}, {A_CheckCustomValue, "A_CHECKCUSTOMVALUE"},
{{A_CheckCusValMemo}, "A_CHECKCUSVALMEMO"}, {A_CheckCusValMemo, "A_CHECKCUSVALMEMO"},
{{A_SetCustomValue}, "A_SETCUSTOMVALUE"}, {A_SetCustomValue, "A_SETCUSTOMVALUE"},
{{A_UseCusValMemo}, "A_USECUSVALMEMO"}, {A_UseCusValMemo, "A_USECUSVALMEMO"},
{{A_RelayCustomValue}, "A_RELAYCUSTOMVALUE"}, {A_RelayCustomValue, "A_RELAYCUSTOMVALUE"},
{{A_CusValAction}, "A_CUSVALACTION"}, {A_CusValAction, "A_CUSVALACTION"},
{{A_ForceStop}, "A_FORCESTOP"}, {A_ForceStop, "A_FORCESTOP"},
{{A_ForceWin}, "A_FORCEWIN"}, {A_ForceWin, "A_FORCEWIN"},
{{A_SpikeRetract}, "A_SPIKERETRACT"}, {A_SpikeRetract, "A_SPIKERETRACT"},
{{A_InfoState}, "A_INFOSTATE"}, {A_InfoState, "A_INFOSTATE"},
{{A_Repeat}, "A_REPEAT"}, {A_Repeat, "A_REPEAT"},
{{A_SetScale}, "A_SETSCALE"}, {A_SetScale, "A_SETSCALE"},
{{A_RemoteDamage}, "A_REMOTEDAMAGE"}, {A_RemoteDamage, "A_REMOTEDAMAGE"},
{{A_HomingChase}, "A_HOMINGCHASE"}, {A_HomingChase, "A_HOMINGCHASE"},
{{A_TrapShot}, "A_TRAPSHOT"}, {A_TrapShot, "A_TRAPSHOT"},
{{A_VileTarget}, "A_VILETARGET"}, {A_VileTarget, "A_VILETARGET"},
{{A_VileAttack}, "A_VILEATTACK"}, {A_VileAttack, "A_VILEATTACK"},
{{A_VileFire}, "A_VILEFIRE"}, {A_VileFire, "A_VILEFIRE"},
{{A_BrakChase}, "A_BRAKCHASE"}, {A_BrakChase, "A_BRAKCHASE"},
{{A_BrakFireShot}, "A_BRAKFIRESHOT"}, {A_BrakFireShot, "A_BRAKFIRESHOT"},
{{A_BrakLobShot}, "A_BRAKLOBSHOT"}, {A_BrakLobShot, "A_BRAKLOBSHOT"},
{{A_NapalmScatter}, "A_NAPALMSCATTER"}, {A_NapalmScatter, "A_NAPALMSCATTER"},
{{A_SpawnFreshCopy}, "A_SPAWNFRESHCOPY"}, {A_SpawnFreshCopy, "A_SPAWNFRESHCOPY"},
{{A_FlickySpawn}, "A_FLICKYSPAWN"}, {A_FlickySpawn, "A_FLICKYSPAWN"},
{{A_FlickyCenter}, "A_FLICKYCENTER"}, {A_FlickyCenter, "A_FLICKYCENTER"},
{{A_FlickyAim}, "A_FLICKYAIM"}, {A_FlickyAim, "A_FLICKYAIM"},
{{A_FlickyFly}, "A_FLICKYFLY"}, {A_FlickyFly, "A_FLICKYFLY"},
{{A_FlickySoar}, "A_FLICKYSOAR"}, {A_FlickySoar, "A_FLICKYSOAR"},
{{A_FlickyCoast}, "A_FLICKYCOAST"}, {A_FlickyCoast, "A_FLICKYCOAST"},
{{A_FlickyHop}, "A_FLICKYHOP"}, {A_FlickyHop, "A_FLICKYHOP"},
{{A_FlickyFlounder}, "A_FLICKYFLOUNDER"}, {A_FlickyFlounder, "A_FLICKYFLOUNDER"},
{{A_FlickyCheck}, "A_FLICKYCHECK"}, {A_FlickyCheck, "A_FLICKYCHECK"},
{{A_FlickyHeightCheck}, "A_FLICKYHEIGHTCHECK"}, {A_FlickyHeightCheck, "A_FLICKYHEIGHTCHECK"},
{{A_FlickyFlutter}, "A_FLICKYFLUTTER"}, {A_FlickyFlutter, "A_FLICKYFLUTTER"},
{{A_FlameParticle}, "A_FLAMEPARTICLE"}, {A_FlameParticle, "A_FLAMEPARTICLE"},
{{A_FadeOverlay}, "A_FADEOVERLAY"}, {A_FadeOverlay, "A_FADEOVERLAY"},
{{A_Boss5Jump}, "A_BOSS5JUMP"}, {A_Boss5Jump, "A_BOSS5JUMP"},
{{A_LightBeamReset}, "A_LIGHTBEAMRESET"}, {A_LightBeamReset, "A_LIGHTBEAMRESET"},
{{A_MineExplode}, "A_MINEEXPLODE"}, {A_MineExplode, "A_MINEEXPLODE"},
{{A_MineRange}, "A_MINERANGE"}, {A_MineRange, "A_MINERANGE"},
{{A_ConnectToGround}, "A_CONNECTTOGROUND"}, {A_ConnectToGround, "A_CONNECTTOGROUND"},
{{A_SpawnParticleRelative}, "A_SPAWNPARTICLERELATIVE"}, {A_SpawnParticleRelative, "A_SPAWNPARTICLERELATIVE"},
{{A_MultiShotDist}, "A_MULTISHOTDIST"}, {A_MultiShotDist, "A_MULTISHOTDIST"},
{{A_WhoCaresIfYourSonIsABee},"A_WHOCARESIFYOURSONISABEE"}, {A_WhoCaresIfYourSonIsABee,"A_WHOCARESIFYOURSONISABEE"},
{{A_ParentTriesToSleep}, "A_PARENTTRIESTOSLEEP"}, {A_ParentTriesToSleep, "A_PARENTTRIESTOSLEEP"},
{{A_CryingToMomma}, "A_CRYINGTOMOMMA"}, {A_CryingToMomma, "A_CRYINGTOMOMMA"},
{{A_CheckFlags2}, "A_CHECKFLAGS2"}, {A_CheckFlags2, "A_CHECKFLAGS2"},
{{A_Boss5FindWaypoint}, "A_BOSS5FINDWAYPOINT"}, {A_Boss5FindWaypoint, "A_BOSS5FINDWAYPOINT"},
{{A_DoNPCSkid}, "A_DONPCSKID"}, {A_DoNPCSkid, "A_DONPCSKID"},
{{A_DoNPCPain}, "A_DONPCPAIN"}, {A_DoNPCPain, "A_DONPCPAIN"},
{{A_PrepareRepeat}, "A_PREPAREREPEAT"}, {A_PrepareRepeat, "A_PREPAREREPEAT"},
{{A_Boss5ExtraRepeat}, "A_BOSS5EXTRAREPEAT"}, {A_Boss5ExtraRepeat, "A_BOSS5EXTRAREPEAT"},
{{A_Boss5Calm}, "A_BOSS5CALM"}, {A_Boss5Calm, "A_BOSS5CALM"},
{{A_Boss5CheckOnGround}, "A_BOSS5CHECKONGROUND"}, {A_Boss5CheckOnGround, "A_BOSS5CHECKONGROUND"},
{{A_Boss5CheckFalling}, "A_BOSS5CHECKFALLING"}, {A_Boss5CheckFalling, "A_BOSS5CHECKFALLING"},
{{A_Boss5PinchShot}, "A_BOSS5PINCHSHOT"}, {A_Boss5PinchShot, "A_BOSS5PINCHSHOT"},
{{A_Boss5MakeItRain}, "A_BOSS5MAKEITRAIN"}, {A_Boss5MakeItRain, "A_BOSS5MAKEITRAIN"},
{{A_Boss5MakeJunk}, "A_BOSS5MAKEJUNK"}, {A_Boss5MakeJunk, "A_BOSS5MAKEJUNK"},
{{A_LookForBetter}, "A_LOOKFORBETTER"}, {A_LookForBetter, "A_LOOKFORBETTER"},
{{A_Boss5BombExplode}, "A_BOSS5BOMBEXPLODE"}, {A_Boss5BombExplode, "A_BOSS5BOMBEXPLODE"},
{{A_DustDevilThink}, "A_DUSTDEVILTHINK"}, {A_DustDevilThink, "A_DUSTDEVILTHINK"},
{{A_TNTExplode}, "A_TNTEXPLODE"}, {A_TNTExplode, "A_TNTEXPLODE"},
{{A_DebrisRandom}, "A_DEBRISRANDOM"}, {A_DebrisRandom, "A_DEBRISRANDOM"},
{{A_TrainCameo}, "A_TRAINCAMEO"}, {A_TrainCameo, "A_TRAINCAMEO"},
{{A_TrainCameo2}, "A_TRAINCAMEO2"}, {A_TrainCameo2, "A_TRAINCAMEO2"},
{{A_CanarivoreGas}, "A_CANARIVOREGAS"}, {A_CanarivoreGas, "A_CANARIVOREGAS"},
{{A_KillSegments}, "A_KILLSEGMENTS"}, {A_KillSegments, "A_KILLSEGMENTS"},
{{A_SnapperSpawn}, "A_SNAPPERSPAWN"}, {A_SnapperSpawn, "A_SNAPPERSPAWN"},
{{A_SnapperThinker}, "A_SNAPPERTHINKER"}, {A_SnapperThinker, "A_SNAPPERTHINKER"},
{{A_SaloonDoorSpawn}, "A_SALOONDOORSPAWN"}, {A_SaloonDoorSpawn, "A_SALOONDOORSPAWN"},
{{A_MinecartSparkThink}, "A_MINECARTSPARKTHINK"}, {A_MinecartSparkThink, "A_MINECARTSPARKTHINK"},
{{A_ModuloToState}, "A_MODULOTOSTATE"}, {A_ModuloToState, "A_MODULOTOSTATE"},
{{A_LavafallRocks}, "A_LAVAFALLROCKS"}, {A_LavafallRocks, "A_LAVAFALLROCKS"},
{{A_LavafallLava}, "A_LAVAFALLLAVA"}, {A_LavafallLava, "A_LAVAFALLLAVA"},
{{A_FallingLavaCheck}, "A_FALLINGLAVACHECK"}, {A_FallingLavaCheck, "A_FALLINGLAVACHECK"},
{{A_FireShrink}, "A_FIRESHRINK"}, {A_FireShrink, "A_FIRESHRINK"},
{{A_SpawnPterabytes}, "A_SPAWNPTERABYTES"}, {A_SpawnPterabytes, "A_SPAWNPTERABYTES"},
{{A_PterabyteHover}, "A_PTERABYTEHOVER"}, {A_PterabyteHover, "A_PTERABYTEHOVER"},
{{A_RolloutSpawn}, "A_ROLLOUTSPAWN"}, {A_RolloutSpawn, "A_ROLLOUTSPAWN"},
{{A_RolloutRock}, "A_ROLLOUTROCK"}, {A_RolloutRock, "A_ROLLOUTROCK"},
{{A_DragonbomberSpawn}, "A_DRAGONBOMBERSPAWN"}, {A_DragonbomberSpawn, "A_DRAGONBOMBERSPAWN"},
{{A_DragonWing}, "A_DRAGONWING"}, {A_DragonWing, "A_DRAGONWING"},
{{A_DragonSegment}, "A_DRAGONSEGMENT"}, {A_DragonSegment, "A_DRAGONSEGMENT"},
{{A_ChangeHeight}, "A_CHANGEHEIGHT"}, {A_ChangeHeight, "A_CHANGEHEIGHT"},
{{NULL}, "NONE"}, {NULL, "NONE"},
// This NULL entry must be the last in the list // This NULL entry must be the last in the list
{{NULL}, NULL}, {NULL, NULL},
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
...@@ -1081,11 +1082,11 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi ...@@ -1081,11 +1082,11 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_FANG_FIRE1", "S_FANG_FIRE1",
"S_FANG_FIRE2", "S_FANG_FIRE2",
"S_FANG_FIRE3", "S_FANG_FIRE3",
"S_FANG_FIRE4",
"S_FANG_FIREREPEAT", "S_FANG_FIREREPEAT",
"S_FANG_LOBSHOT0", "S_FANG_LOBSHOT0",
"S_FANG_LOBSHOT1", "S_FANG_LOBSHOT1",
"S_FANG_LOBSHOT2", "S_FANG_LOBSHOT2",
"S_FANG_LOBSHOT3",
"S_FANG_WAIT1", "S_FANG_WAIT1",
"S_FANG_WAIT2", "S_FANG_WAIT2",
"S_FANG_WALLHIT", "S_FANG_WALLHIT",
...@@ -1107,6 +1108,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi ...@@ -1107,6 +1108,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_FANG_PINCHLOBSHOT2", "S_FANG_PINCHLOBSHOT2",
"S_FANG_PINCHLOBSHOT3", "S_FANG_PINCHLOBSHOT3",
"S_FANG_PINCHLOBSHOT4", "S_FANG_PINCHLOBSHOT4",
"S_FANG_PINCHLOBSHOT5",
"S_FANG_DIE1", "S_FANG_DIE1",
"S_FANG_DIE2", "S_FANG_DIE2",
"S_FANG_DIE3", "S_FANG_DIE3",
...@@ -2256,11 +2258,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi ...@@ -2256,11 +2258,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
// FHZ // FHZ
"S_FHZICE1", "S_FHZICE1",
"S_FHZICE2", "S_FHZICE2",
"S_ROSY_IDLE1", "S_ROSY_IDLE",
"S_ROSY_IDLE2",
"S_ROSY_IDLE3",
"S_ROSY_IDLE4",
"S_ROSY_JUMP", "S_ROSY_JUMP",
"S_ROSY_FALL",
"S_ROSY_WALK", "S_ROSY_WALK",
"S_ROSY_HUG", "S_ROSY_HUG",
"S_ROSY_PAIN", "S_ROSY_PAIN",
...@@ -2920,69 +2920,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi ...@@ -2920,69 +2920,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_BHORIZ7", "S_BHORIZ7",
"S_BHORIZ8", "S_BHORIZ8",
// Yellow Trampoline
"S_YELLOWTRAMPOLINE",
"S_YELLOWTRAMPOLINE2",
"S_YELLOWTRAMPOLINE3",
"S_YELLOWTRAMPOLINE4",
"S_YELLOWTRAMPOLINE5",
// Red Trampoline
"S_REDTRAMPOLINE",
"S_REDTRAMPOLINE2",
"S_REDTRAMPOLINE3",
"S_REDTRAMPOLINE4",
"S_REDTRAMPOLINE5",
// Blue Trampoline
"S_BLUETRAMPOLINE",
"S_BLUETRAMPOLINE2",
"S_BLUETRAMPOLINE3",
"S_BLUETRAMPOLINE4",
"S_BLUETRAMPOLINE5",
// Horizontal Yellow Trampoline
"S_HORIZYELLOWTRAMPOLINE",
"S_HORIZYELLOWTRAMPOLINE2",
"S_HORIZYELLOWTRAMPOLINE3",
"S_HORIZYELLOWTRAMPOLINE4",
"S_HORIZYELLOWTRAMPOLINE5",
// Horizontal Red Trampoline
"S_HORIZREDTRAMPOLINE",
"S_HORIZREDTRAMPOLINE2",
"S_HORIZREDTRAMPOLINE3",
"S_HORIZREDTRAMPOLINE4",
"S_HORIZREDTRAMPOLINE5",
// Horizontal Blue Trampoline
"S_HORIZBLUETRAMPOLINE",
"S_HORIZBLUETRAMPOLINE2",
"S_HORIZBLUETRAMPOLINE3",
"S_HORIZBLUETRAMPOLINE4",
"S_HORIZBLUETRAMPOLINE5",
// Diagonal Yellow Trampoline
"S_DIAGYELLOWTRAMPOLINE",
"S_DIAGYELLOWTRAMPOLINE2",
"S_DIAGYELLOWTRAMPOLINE3",
"S_DIAGYELLOWTRAMPOLINE4",
"S_DIAGYELLOWTRAMPOLINE5",
// Diagonal Red Trampoline
"S_DIAGREDTRAMPOLINE",
"S_DIAGREDTRAMPOLINE2",
"S_DIAGREDTRAMPOLINE3",
"S_DIAGREDTRAMPOLINE4",
"S_DIAGREDTRAMPOLINE5",
// Diagonal Blue Trampoline
"S_DIAGBLUETRAMPOLINE",
"S_DIAGBLUETRAMPOLINE2",
"S_DIAGBLUETRAMPOLINE3",
"S_DIAGBLUETRAMPOLINE4",
"S_DIAGBLUETRAMPOLINE5",
// Booster // Booster
"S_BOOSTERSOUND", "S_BOOSTERSOUND",
"S_YELLOWBOOSTERROLLER", "S_YELLOWBOOSTERROLLER",
...@@ -3255,28 +3192,37 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi ...@@ -3255,28 +3192,37 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_RINGEXPLODE", "S_RINGEXPLODE",
// Mario-specific stuff "S_COIN1",
"S_COIN", "S_COIN2",
"S_COIN3",
"S_COINSPARKLE1", "S_COINSPARKLE1",
"S_COINSPARKLE2", "S_COINSPARKLE2",
"S_COINSPARKLE3",
"S_COINSPARKLE4",
"S_GOOMBA1", "S_GOOMBA1",
"S_GOOMBA1B", "S_GOOMBA1B",
"S_GOOMBA2", "S_GOOMBA2",
"S_GOOMBA3", "S_GOOMBA3",
"S_GOOMBA4", "S_GOOMBA4",
"S_GOOMBA5", "S_GOOMBA5",
"S_GOOMBA6",
"S_GOOMBA7",
"S_GOOMBA8",
"S_GOOMBA9",
"S_GOOMBA_DEAD", "S_GOOMBA_DEAD",
"S_GOOMBA_DEAD2",
"S_GOOMBA_DEAD3",
"S_BLUEGOOMBA1", "S_BLUEGOOMBA1",
"S_BLUEGOOMBA1B", "S_BLUEGOOMBA1B",
"S_BLUEGOOMBA2", "S_BLUEGOOMBA2",
"S_BLUEGOOMBA3", "S_BLUEGOOMBA3",
"S_BLUEGOOMBA4", "S_BLUEGOOMBA4",
"S_BLUEGOOMBA5", "S_BLUEGOOMBA5",
"S_BLUEGOOMBA6",
"S_BLUEGOOMBA7",
"S_BLUEGOOMBA8",
"S_BLUEGOOMBA9",
"S_BLUEGOOMBA_DEAD", "S_BLUEGOOMBA_DEAD",
"S_BLUEGOOMBA_DEAD2",
"S_BLUEGOOMBA_DEAD3", // Mario-specific stuff
"S_FIREFLOWER1", "S_FIREFLOWER1",
"S_FIREFLOWER2", "S_FIREFLOWER2",
"S_FIREFLOWER3", "S_FIREFLOWER3",
...@@ -3284,13 +3230,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi ...@@ -3284,13 +3230,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_FIREBALL", "S_FIREBALL",
"S_FIREBALLTRAIL1", "S_FIREBALLTRAIL1",
"S_FIREBALLTRAIL2", "S_FIREBALLTRAIL2",
"S_GREENKOOPASPAWN",
"S_GREENKOOPA1",
"S_GREENKOOPA2",
"S_GREENKOOPA3",
"S_GREENKOOPA4",
"S_GREENKOOPADEATH1",
"S_GREENKOOPADEATH2",
"S_SHELL", "S_SHELL",
"S_PUMA_START1", "S_PUMA_START1",
"S_PUMA_START2", "S_PUMA_START2",
...@@ -3316,68 +3255,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi ...@@ -3316,68 +3255,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_MARIOBUSH1", "S_MARIOBUSH1",
"S_MARIOBUSH2", "S_MARIOBUSH2",
"S_TOAD", "S_TOAD",
"S_PTZSHROOM",
"S_PTZFLAG1",
"S_PTZFLAG2",
"S_PTZFLAG3",
"S_PTZFLAG4",
"S_PTZFLAG5",
"S_MARIOBUSH",
"S_BSBSHROOM",
"S_BLBSHROOM",
"S_BNWSHROOM",
"S_REDMFLOWER",
"S_BLUEMFLOWER",
"S_YELLOWMFLOWER",
"S_WHITEDANDELION",
"S_MAR64TREE",
// Power up mushrooms
"S_LIFESHROOM",
"S_LIFESHROOM2",
"S_LIFESHROOMD",
"S_LIFESHROOM_INVISIBLE",
"S_LIFESHROOM_INVISIBLE_TOUCH",
"S_POISONSHROOM",
"S_POISONSHROOM2",
"S_POISONSHROOMD",
"S_NUKESHROOM",
"S_NUKESHROOM2",
"S_NUKESHROOMD",
"S_FORCESHROOM",
"S_FORCESHROOM2",
"S_FORCESHROOMD",
"S_ATTRACTSHROOM",
"S_ATTRACTSHROOM2",
"S_ATTRACTSHROOMD",
"S_ELEMENTALSHROOM",
"S_ELEMENTALSHROOM2",
"S_ELEMENTALSHROOMD",
"S_CLOUDSHROOM",
"S_CLOUDSHROOM2",
"S_CLOUDSHROOMD",
"S_STARMAN",
"S_STARMAN1",
"S_STARMAN2",
"S_STARMAN3",
"S_STARMAND",
"S_SPEEDWINGS",
"S_SPEEDWINGSD",
"S_PARTICLEPICKUP1",
"S_PARTICLEPICKUP2",
"S_1000SCOREAWARD",
"S_POWERUPAWARD",
"S_POWERUPAWARD1",
"S_POWERUPAWARD2",
// Nights-specific stuff // Nights-specific stuff
"S_NIGHTSDRONE_MAN1", "S_NIGHTSDRONE_MAN1",
...@@ -3680,11 +3558,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi ...@@ -3680,11 +3558,6 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_REDBRICKDEBRIS", "S_REDBRICKDEBRIS",
"S_BLUEBRICKDEBRIS", "S_BLUEBRICKDEBRIS",
"S_YELLOWBRICKDEBRIS", "S_YELLOWBRICKDEBRIS",
"S_MARIOBRICKDEBRIS",
"S_MARIOBRICKDEBRISS",
"S_MARIOBRICKDEBRISB",
"S_MARIOBRICKDEBRISC",
"S_MARIOBRICKDEBRISM",
"S_NAMECHECK", "S_NAMECHECK",
...@@ -3867,16 +3740,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t ...@@ -3867,16 +3740,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_REDHORIZ", "MT_REDHORIZ",
"MT_BLUEHORIZ", "MT_BLUEHORIZ",
"MT_YELLOWTRAMPOLINE",
"MT_REDTRAMPOLINE",
"MT_BLUETRAMPOLINE",
"MT_HORIZYELLOWTRAMPOLINE",
"MT_HORIZREDTRAMPOLINE",
"MT_HORIZBLUETRAMPOLINE",
"MT_DIAGYELLOWTRAMPOLINE",
"MT_DIAGREDTRAMPOLINE",
"MT_DIAGBLUETRAMPOLINE",
"MT_BOOSTERSEG", "MT_BOOSTERSEG",
"MT_BOOSTERROLLER", "MT_BOOSTERROLLER",
"MT_YELLOWBOOSTER", "MT_YELLOWBOOSTER",
...@@ -4377,7 +4240,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t ...@@ -4377,7 +4240,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_FIREFLOWER", "MT_FIREFLOWER",
"MT_FIREBALL", "MT_FIREBALL",
"MT_FIREBALLTRAIL", "MT_FIREBALLTRAIL",
"MT_GREENKOOPA",
"MT_SHELL", "MT_SHELL",
"MT_PUMA", "MT_PUMA",
"MT_PUMATRAIL", "MT_PUMATRAIL",
...@@ -4388,30 +4250,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t ...@@ -4388,30 +4250,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_MARIOBUSH1", "MT_MARIOBUSH1",
"MT_MARIOBUSH2", "MT_MARIOBUSH2",
"MT_TOAD", "MT_TOAD",
"MT_PTZSHROOM",
"MT_PTZFLAG",
"MT_BSBSHROOM",
"MT_BLBSHROOM",
"MT_BNWSHROOM",
"MT_MARIOBUSH",
"MT_REDMFLOWER",
"MT_BLUEMFLOWER",
"MT_YELLOWMFLOWER",
"MT_WHITEDANDELION",
"MT_MAR64TREE",
// Power up mushrooms
"MT_LIFESHROOM",
"MT_LIFESHROOM_INVISIBLE",
"MT_POISONSHROOM",
"MT_NUKESHROOM",
"MT_FORCESHROOM",
"MT_ATTRACTSHROOM",
"MT_ELEMENTALSHROOM",
"MT_CLOUDSHROOM",
"MT_STARMAN",
"MT_SPEEDWINGS",
"MT_POWERUPAWARD",
// NiGHTS Stuff // NiGHTS Stuff
"MT_AXIS", "MT_AXIS",
...@@ -4509,11 +4347,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t ...@@ -4509,11 +4347,6 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_REDBRICKDEBRIS", "MT_REDBRICKDEBRIS",
"MT_BLUEBRICKDEBRIS", "MT_BLUEBRICKDEBRIS",
"MT_YELLOWBRICKDEBRIS", "MT_YELLOWBRICKDEBRIS",
"MT_MARIOBRICKDEBRIS",
"MT_MARIOBRICKDEBRISS",
"MT_MARIOBRICKDEBRISB",
"MT_MARIOBRICKDEBRISC",
"MT_MARIOBRICKDEBRISM",
"MT_NAMECHECK", "MT_NAMECHECK",
"MT_RAY", "MT_RAY",
...@@ -5426,7 +5259,9 @@ struct int_const_s const INT_CONST[] = { ...@@ -5426,7 +5259,9 @@ struct int_const_s const INT_CONST[] = {
{"SF_MARIODAMAGE",SF_MARIODAMAGE}, {"SF_MARIODAMAGE",SF_MARIODAMAGE},
{"SF_MACHINE",SF_MACHINE}, {"SF_MACHINE",SF_MACHINE},
{"SF_DASHMODE",SF_DASHMODE}, {"SF_DASHMODE",SF_DASHMODE},
{"SF_FASTWAIT",SF_FASTWAIT},
{"SF_FASTEDGE",SF_FASTEDGE}, {"SF_FASTEDGE",SF_FASTEDGE},
{"SF_JETFUME",SF_JETFUME},
{"SF_MULTIABILITY",SF_MULTIABILITY}, {"SF_MULTIABILITY",SF_MULTIABILITY},
{"SF_NONIGHTSROTATION",SF_NONIGHTSROTATION}, {"SF_NONIGHTSROTATION",SF_NONIGHTSROTATION},
{"SF_NONIGHTSSUPER",SF_NONIGHTSSUPER}, {"SF_NONIGHTSSUPER",SF_NONIGHTSSUPER},
...@@ -5774,8 +5609,7 @@ struct int_const_s const INT_CONST[] = { ...@@ -5774,8 +5609,7 @@ struct int_const_s const INT_CONST[] = {
{"ROTAXIS_Z",ROTAXIS_Z}, {"ROTAXIS_Z",ROTAXIS_Z},
// Buttons (ticcmd_t) // Buttons (ticcmd_t)
{"BT_WEAPONMASK",BT_WEAPONMASK}, //our first three bits. {"BT_WEAPONMASK",BT_WEAPONMASK}, //our first four bits.
{"BT_SHIELD",BT_SHIELD},
{"BT_WEAPONNEXT",BT_WEAPONNEXT}, {"BT_WEAPONNEXT",BT_WEAPONNEXT},
{"BT_WEAPONPREV",BT_WEAPONPREV}, {"BT_WEAPONPREV",BT_WEAPONPREV},
{"BT_ATTACK",BT_ATTACK}, // shoot rings {"BT_ATTACK",BT_ATTACK}, // shoot rings
...@@ -5809,6 +5643,7 @@ struct int_const_s const INT_CONST[] = { ...@@ -5809,6 +5643,7 @@ struct int_const_s const INT_CONST[] = {
{"CV_HIDDEN",CV_HIDEN}, {"CV_HIDDEN",CV_HIDEN},
{"CV_CHEAT",CV_CHEAT}, {"CV_CHEAT",CV_CHEAT},
{"CV_ALLOWLUA",CV_ALLOWLUA}, {"CV_ALLOWLUA",CV_ALLOWLUA},
{"CV_MENU",CV_MENU},
// v_video flags // v_video flags
{"V_NOSCALEPATCH",V_NOSCALEPATCH}, {"V_NOSCALEPATCH",V_NOSCALEPATCH},
...@@ -5934,7 +5769,6 @@ struct int_const_s const INT_CONST[] = { ...@@ -5934,7 +5769,6 @@ struct int_const_s const INT_CONST[] = {
{"JA_DIGITAL",JA_DIGITAL}, {"JA_DIGITAL",JA_DIGITAL},
{"JA_JUMP",JA_JUMP}, {"JA_JUMP",JA_JUMP},
{"JA_SPIN",JA_SPIN}, {"JA_SPIN",JA_SPIN},
{"JA_SHIELD",JA_SHIELD},
{"JA_FIRE",JA_FIRE}, {"JA_FIRE",JA_FIRE},
{"JA_FIRENORMAL",JA_FIRENORMAL}, {"JA_FIRENORMAL",JA_FIRENORMAL},
{"JOYAXISRANGE",JOYAXISRANGE}, {"JOYAXISRANGE",JOYAXISRANGE},
...@@ -5956,7 +5790,9 @@ struct int_const_s const INT_CONST[] = { ...@@ -5956,7 +5790,9 @@ struct int_const_s const INT_CONST[] = {
{"GC_WEPSLOT5",GC_WEPSLOT5}, {"GC_WEPSLOT5",GC_WEPSLOT5},
{"GC_WEPSLOT6",GC_WEPSLOT6}, {"GC_WEPSLOT6",GC_WEPSLOT6},
{"GC_WEPSLOT7",GC_WEPSLOT7}, {"GC_WEPSLOT7",GC_WEPSLOT7},
{"GC_SHIELD",GC_SHIELD}, {"GC_WEPSLOT8",GC_WEPSLOT8},
{"GC_WEPSLOT9",GC_WEPSLOT9},
{"GC_WEPSLOT10",GC_WEPSLOT10},
{"GC_FIRE",GC_FIRE}, {"GC_FIRE",GC_FIRE},
{"GC_FIRENORMAL",GC_FIRENORMAL}, {"GC_FIRENORMAL",GC_FIRENORMAL},
{"GC_TOSSFLAG",GC_TOSSFLAG}, {"GC_TOSSFLAG",GC_TOSSFLAG},
...@@ -5996,6 +5832,11 @@ struct int_const_s const INT_CONST[] = { ...@@ -5996,6 +5832,11 @@ struct int_const_s const INT_CONST[] = {
{"MB_SCROLLUP",MB_SCROLLUP}, {"MB_SCROLLUP",MB_SCROLLUP},
{"MB_SCROLLDOWN",MB_SCROLLDOWN}, {"MB_SCROLLDOWN",MB_SCROLLDOWN},
// P_PathTraverse constants
{"PT_ADDLINES",PT_ADDLINES},
{"PT_ADDTHINGS",PT_ADDTHINGS},
{"PT_EARLYOUT",PT_EARLYOUT},
// screen.h constants // screen.h constants
{"BASEVIDWIDTH",BASEVIDWIDTH}, {"BASEVIDWIDTH",BASEVIDWIDTH},
{"BASEVIDHEIGHT",BASEVIDHEIGHT}, {"BASEVIDHEIGHT",BASEVIDHEIGHT},
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#define __DEH_TABLES_H__ #define __DEH_TABLES_H__
#include "doomdef.h" // Constants #include "doomdef.h" // Constants
#include "d_think.h" // actionf_t #include "d_think.h" // actionf_p1
#include "info.h" // Mobj, state, sprite, etc constants #include "info.h" // Mobj, state, sprite, etc constants
#include "lua_script.h" #include "lua_script.h"
...@@ -44,7 +44,7 @@ struct flickytypes_s { ...@@ -44,7 +44,7 @@ struct flickytypes_s {
*/ */
typedef struct typedef struct
{ {
actionf_t action; ///< Function pointer corresponding to the actual action. actionf_p1 action; ///< Function pointer corresponding to the actual action.
const char *name; ///< Name of the action in ALL CAPS. const char *name; ///< Name of the action in ALL CAPS.
} actionpointer_t; } actionpointer_t;
......
...@@ -77,6 +77,31 @@ typedef struct ...@@ -77,6 +77,31 @@ typedef struct
INT16 x, y; INT16 x, y;
}ATTRPACK mapvertex_t; }ATTRPACK mapvertex_t;
typedef enum {
UDMF_TYPE_STRING,
UDMF_TYPE_FIXED,
UDMF_TYPE_NUMERIC,
UDMF_TYPE_BOOLEAN
} udmf_field_type_t;
typedef union { // v added to avoid random compilers cry about nonsense
char* vstring;
fixed_t vfloat;
INT32 vint;
boolean vbool;
} udmf_field_value_t;
// UDMF's Custom Arguments
typedef struct customargs_s
{
char* name;
udmf_field_type_t type;
udmf_field_value_t value;
struct customargs_s* next;
}ATTRPACK customargs_t;
// A SideDef, defining the visual appearance of a wall, // A SideDef, defining the visual appearance of a wall,
// by setting textures and offsets. // by setting textures and offsets.
typedef struct typedef struct
...@@ -218,6 +243,7 @@ typedef struct ...@@ -218,6 +243,7 @@ typedef struct
fixed_t spritexscale, spriteyscale; fixed_t spritexscale, spriteyscale;
INT32 args[NUMMAPTHINGARGS]; INT32 args[NUMMAPTHINGARGS];
char *stringargs[NUMMAPTHINGSTRINGARGS]; char *stringargs[NUMMAPTHINGSTRINGARGS];
struct customargs_s* customargs;
struct mobj_s *mobj; struct mobj_s *mobj;
} mapthing_t; } mapthing_t;
......
...@@ -703,7 +703,9 @@ extern int ...@@ -703,7 +703,9 @@ extern int
/// This stops the game from storing backups of the states, sprites, and mobjinfo tables. /// This stops the game from storing backups of the states, sprites, and mobjinfo tables.
/// Though this info is compressed under normal circumstances, it's still a lot of extra /// Though this info is compressed under normal circumstances, it's still a lot of extra
/// memory that never gets touched. /// memory that never gets touched.
#if !(defined (__EMSCRIPTEN__) && (__SIZEOF_SIZE_T__ == 4))
#define ALLOW_RESETDATA #define ALLOW_RESETDATA
#endif
/// Experimental tweaks to analog mode. (Needs a lot of work before it's ready for primetime.) /// Experimental tweaks to analog mode. (Needs a lot of work before it's ready for primetime.)
//#define REDSANALOG //#define REDSANALOG
...@@ -731,7 +733,7 @@ extern int ...@@ -731,7 +733,7 @@ extern int
/// Maintain compatibility with older 2.2 demos /// Maintain compatibility with older 2.2 demos
#define OLD22DEMOCOMPAT #define OLD22DEMOCOMPAT
#ifdef HAVE_CURL #if defined (HAVE_CURL) && !(defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__))
#define MASTERSERVER #define MASTERSERVER
#else #else
#undef UPDATE_ALERT #undef UPDATE_ALERT
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team. // Copyright (C) 1998-2000 by DooM Legacy Team.
// Copyright (C) 1999-2024 by Sonic Team Junior. // Copyright (C) 1999-2025 by Sonic Team Junior.
// //
// This program is free software distributed under the // This program is free software distributed under the
// terms of the GNU General Public License, version 2. // terms of the GNU General Public License, version 2.
...@@ -209,19 +209,19 @@ typedef struct ...@@ -209,19 +209,19 @@ typedef struct
UINT8 picmode; // sequence mode after displaying last pic, 0 = persist, 1 = loop, 2 = destroy UINT8 picmode; // sequence mode after displaying last pic, 0 = persist, 1 = loop, 2 = destroy
UINT8 pictoloop; // if picmode == loop, which pic to loop to? UINT8 pictoloop; // if picmode == loop, which pic to loop to?
UINT8 pictostart; // initial pic number to show UINT8 pictostart; // initial pic number to show
char picname[MAX_PROMPT_PICS][8]; char picname[MAX_PROMPT_PICS][8+1];
UINT8 pichires[MAX_PROMPT_PICS]; UINT8 pichires[MAX_PROMPT_PICS];
UINT16 xcoord[MAX_PROMPT_PICS]; // gfx UINT16 xcoord[MAX_PROMPT_PICS]; // gfx
UINT16 ycoord[MAX_PROMPT_PICS]; // gfx UINT16 ycoord[MAX_PROMPT_PICS]; // gfx
UINT16 picduration[MAX_PROMPT_PICS]; UINT16 picduration[MAX_PROMPT_PICS];
char musswitch[7]; char musswitch[6+1];
UINT16 musswitchflags; UINT16 musswitchflags;
UINT8 musicloop; UINT8 musicloop;
char tag[33]; // page tag char tag[32+1]; // page tag
char name[34]; // narrator name, extra char for color char name[32+2]; // narrator name, extra char for color
char iconname[8]; // narrator icon lump char iconname[8+1]; // narrator icon lump
boolean rightside; // narrator side, false = left, true = right boolean rightside; // narrator side, false = left, true = right
boolean iconflip; // narrator flip icon horizontally boolean iconflip; // narrator flip icon horizontally
UINT8 hidehud; // hide hud, 0 = show all, 1 = hide depending on prompt position (top/bottom), 2 = hide all UINT8 hidehud; // hide hud, 0 = show all, 1 = hide depending on prompt position (top/bottom), 2 = hide all
...@@ -233,7 +233,7 @@ typedef struct ...@@ -233,7 +233,7 @@ typedef struct
sfxenum_t textsfx; // sfx_ id for printing text sfxenum_t textsfx; // sfx_ id for printing text
UINT8 nextprompt; // next prompt to jump to, one-based. 0 = current prompt UINT8 nextprompt; // next prompt to jump to, one-based. 0 = current prompt
UINT8 nextpage; // next page to jump to, one-based. 0 = next page within prompt->numpages UINT8 nextpage; // next page to jump to, one-based. 0 = next page within prompt->numpages
char nexttag[33]; // next tag to jump to. If set, this overrides nextprompt and nextpage. char nexttag[32+1]; // next tag to jump to. If set, this overrides nextprompt and nextpage.
INT32 timetonext; // time in tics to jump to next page automatically. 0 = don't jump automatically INT32 timetonext; // time in tics to jump to next page automatically. 0 = don't jump automatically
char *text; char *text;
} textpage_t; } textpage_t;
...@@ -249,6 +249,7 @@ extern textprompt_t *textprompts[MAX_PROMPTS]; ...@@ -249,6 +249,7 @@ extern textprompt_t *textprompts[MAX_PROMPTS];
// For the Custom Exit linedef. // For the Custom Exit linedef.
extern INT16 nextmapoverride; extern INT16 nextmapoverride;
extern UINT8 skipstats; extern UINT8 skipstats;
extern boolean keepcutscene;
extern INT16 nextgametype; extern INT16 nextgametype;
extern UINT32 ssspheres; // Total # of spheres in a level extern UINT32 ssspheres; // Total # of spheres in a level
...@@ -287,8 +288,8 @@ typedef struct ...@@ -287,8 +288,8 @@ typedef struct
// (This is not ifdeffed so the map header structure can stay identical, just in case.) // (This is not ifdeffed so the map header structure can stay identical, just in case.)
typedef struct typedef struct
{ {
char option[32]; // 31 usable characters char option[31+1]; // 31 usable characters
char value[256]; // 255 usable characters. If this seriously isn't enough then wtf. char value[255+1]; // 255 usable characters. If this seriously isn't enough then wtf.
} customoption_t; } customoption_t;
/** Map header information. /** Map header information.
...@@ -303,7 +304,7 @@ typedef struct ...@@ -303,7 +304,7 @@ typedef struct
INT16 nextlevel; ///< Map number of next level, or 1100-1102 to end. INT16 nextlevel; ///< Map number of next level, or 1100-1102 to end.
INT16 marathonnext; ///< See nextlevel, but for Marathon mode. Necessary to support hub worlds ala SUGOI. INT16 marathonnext; ///< See nextlevel, but for Marathon mode. Necessary to support hub worlds ala SUGOI.
char keywords[32+1]; ///< Keywords separated by space to search for. 32 characters. char keywords[32+1]; ///< Keywords separated by space to search for. 32 characters.
char musname[7]; ///< Music track to play. "" for no music. char musname[6+1]; ///< Music track to play. "" for no music.
UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore. UINT16 mustrack; ///< Subsong to play. Only really relevant for music modules and specific formats supported by GME. 0 to ignore.
UINT32 muspos; ///< Music position to jump to. UINT32 muspos; ///< Music position to jump to.
char forcecharacter[16+1]; ///< (SKINNAMESIZE+1) Skin to switch to or "" to disable. char forcecharacter[16+1]; ///< (SKINNAMESIZE+1) Skin to switch to or "" to disable.
...@@ -330,7 +331,7 @@ typedef struct ...@@ -330,7 +331,7 @@ typedef struct
UINT16 levelflags; ///< LF_flags: merged booleans into one UINT16 for space, see below UINT16 levelflags; ///< LF_flags: merged booleans into one UINT16 for space, see below
UINT8 menuflags; ///< LF2_flags: options that affect record attack / nights mode menus UINT8 menuflags; ///< LF2_flags: options that affect record attack / nights mode menus
char selectheading[22]; ///< Level select heading. Allows for controllable grouping. char selectheading[21+1]; ///< Level select heading. Allows for controllable grouping.
UINT16 startrings; ///< Number of rings players start with. UINT16 startrings; ///< Number of rings players start with.
INT32 sstimer; ///< Timer for special stages. INT32 sstimer; ///< Timer for special stages.
UINT32 ssspheres; ///< Sphere requirement in special stages. UINT32 ssspheres; ///< Sphere requirement in special stages.
...@@ -352,9 +353,9 @@ typedef struct ...@@ -352,9 +353,9 @@ typedef struct
// Music stuff. // Music stuff.
UINT32 musinterfadeout; ///< Fade out level music on intermission screen in milliseconds UINT32 musinterfadeout; ///< Fade out level music on intermission screen in milliseconds
char musintername[7]; ///< Intermission screen music. char musintername[6+1]; ///< Intermission screen music.
char muspostbossname[7]; ///< Post-bossdeath music. char muspostbossname[6+1]; ///< Post-bossdeath music.
UINT16 muspostbosstrack; ///< Post-bossdeath track. UINT16 muspostbosstrack; ///< Post-bossdeath track.
UINT32 muspostbosspos; ///< Post-bossdeath position UINT32 muspostbosspos; ///< Post-bossdeath position
UINT32 muspostbossfadein; ///< Post-bossdeath fade-in milliseconds. UINT32 muspostbossfadein; ///< Post-bossdeath fade-in milliseconds.
......
...@@ -110,7 +110,7 @@ int startswith (const char *base, const char *tag); ...@@ -110,7 +110,7 @@ int startswith (const char *base, const char *tag);
int endswith (const char *base, const char *tag); int endswith (const char *base, const char *tag);
char *xstrtok(char *line, const char *delims); char *xstrtok(char *line, const char *delims);
#if defined (_WIN32) || defined (__HAIKU__) #if defined (_WIN32) || defined (__HAIKU__) || defined (__EMSCRIPTEN__)
#define HAVE_DOSSTR_FUNCS #define HAVE_DOSSTR_FUNCS
#endif #endif
...@@ -156,6 +156,7 @@ typedef int32_t boolean; ...@@ -156,6 +156,7 @@ typedef int32_t boolean;
#endif #endif
#ifndef __cplusplus #ifndef __cplusplus
#ifndef __bool_true_false_are_defined
#ifndef _WIN32 #ifndef _WIN32
enum {false = 0, true = 1}; enum {false = 0, true = 1};
#else #else
...@@ -163,6 +164,7 @@ enum {false = 0, true = 1}; ...@@ -163,6 +164,7 @@ enum {false = 0, true = 1};
#define true TRUE #define true TRUE
#endif #endif
#endif #endif
#endif
/* 7.18.2.1 Limits of exact-width integer types */ /* 7.18.2.1 Limits of exact-width integer types */
...@@ -245,6 +247,8 @@ enum {false = 0, true = 1}; ...@@ -245,6 +247,8 @@ enum {false = 0, true = 1};
#define FUNCNOINLINE __attribute__((noinline)) #define FUNCNOINLINE __attribute__((noinline))
#define FUNCWARNRV __attribute__((warn_unused_result))
#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4 #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4
#ifdef __i386__ // i386 only #ifdef __i386__ // i386 only
#define FUNCTARGET(X) __attribute__ ((__target__ (X))) #define FUNCTARGET(X) __attribute__ ((__target__ (X)))
...@@ -296,6 +300,9 @@ enum {false = 0, true = 1}; ...@@ -296,6 +300,9 @@ enum {false = 0, true = 1};
#ifndef FUNCTARGET #ifndef FUNCTARGET
#define FUNCTARGET(x) #define FUNCTARGET(x)
#endif #endif
#ifndef FUNCWARNRV
#define FUNCWARNRV
#endif
#ifndef ATTRPACK #ifndef ATTRPACK
#define ATTRPACK #define ATTRPACK
#endif #endif
......
...@@ -919,13 +919,9 @@ void F_IntroTicker(void) ...@@ -919,13 +919,9 @@ void F_IntroTicker(void)
I_OsPolling(); I_OsPolling();
I_UpdateNoBlit(); I_UpdateNoBlit();
#ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex); I_lock_mutex(&m_menu_mutex);
#endif
M_Drawer(); // menu is drawn even on top of wipes M_Drawer(); // menu is drawn even on top of wipes
#ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex); I_unlock_mutex(m_menu_mutex);
#endif
I_FinishUpdate(); // Update the screen with the image Tails 06-19-2001 I_FinishUpdate(); // Update the screen with the image Tails 06-19-2001
if (moviemode) // make sure we save frames for the white hold too if (moviemode) // make sure we save frames for the white hold too
...@@ -1053,6 +1049,7 @@ static const char *credits[] = { ...@@ -1053,6 +1049,7 @@ static const char *credits[] = {
"Logan \"GBA\" Arias", "Logan \"GBA\" Arias",
"Zolton \"Zippy_Zolton\" Auburn", "Zolton \"Zippy_Zolton\" Auburn",
"Colette \"fickleheart\" Bordelon", "Colette \"fickleheart\" Bordelon",
"\"candelavla\"",
"Andrew \"orospakr\" Clunis", "Andrew \"orospakr\" Clunis",
"Sally \"TehRealSalt\" Cochenour", "Sally \"TehRealSalt\" Cochenour",
"Gregor \"Oogaland\" Dick", "Gregor \"Oogaland\" Dick",
...@@ -1065,7 +1062,6 @@ static const char *credits[] = { ...@@ -1065,7 +1062,6 @@ static const char *credits[] = {
"Julio \"Chaos Zero 64\" Guir", "Julio \"Chaos Zero 64\" Guir",
"\"Hanicef\"", "\"Hanicef\"",
"\"Hannu_Hanhi\"", // For many OpenGL performance improvements! "\"Hannu_Hanhi\"", // For many OpenGL performance improvements!
"\"hazepastel\"",
"Kepa \"Nev3r\" Iceta", "Kepa \"Nev3r\" Iceta",
"Thomas \"Shadow Hog\" Igoe", "Thomas \"Shadow Hog\" Igoe",
"Iestyn \"Monster Iestyn\" Jealous", "Iestyn \"Monster Iestyn\" Jealous",
...@@ -1121,11 +1117,11 @@ static const char *credits[] = { ...@@ -1121,11 +1117,11 @@ static const char *credits[] = {
"Alice \"Alacroix\" de Lemos", "Alice \"Alacroix\" de Lemos",
"Logan \"Hyperchaotix\" McCloud", "Logan \"Hyperchaotix\" McCloud",
"Alexander \"DrTapeworm\" Moench-Ford", "Alexander \"DrTapeworm\" Moench-Ford",
"\"orbitalviolet\"", // summit showdown hehehehe (aka Evertone)
"Andrew \"Senku Niola\" Moran", "Andrew \"Senku Niola\" Moran",
"\"MotorRoach\"", "\"MotorRoach\"",
"Phillip \"TelosTurntable\" Robinson", "Phillip \"TelosTurntable\" Robinson",
"\"Scizor300\"", "\"Scizor300\"",
"\"Skydusk\"",
"Wessel \"sphere\" Smit", "Wessel \"sphere\" Smit",
"David \"Instant Sonic\" Spencer Jr.", "David \"Instant Sonic\" Spencer Jr.",
"\"SSNTails\"", "\"SSNTails\"",
...@@ -1173,11 +1169,9 @@ static const char *credits[] = { ...@@ -1173,11 +1169,9 @@ static const char *credits[] = {
"Mujamel \"MK\" Khan", "Mujamel \"MK\" Khan",
"\"Kaito Sinclaire\"", "\"Kaito Sinclaire\"",
"Alexander \"DrTapeworm\" Moench-Ford", "Alexander \"DrTapeworm\" Moench-Ford",
"\"orbitalviolet\"", // summit showdown hehehehe (aka Evertone)
"\"Radicalicious\"", "\"Radicalicious\"",
"\"Revan\"", "\"Revan\"",
"Anna \"QueenDelta\" Sandlin", "Anna \"QueenDelta\" Sandlin",
"\"Skydusk\"",
"Wessel \"sphere\" Smit", "Wessel \"sphere\" Smit",
"\"SSNTails\"", "\"SSNTails\"",
"Aaron \"Othius\" Stojkov", "Aaron \"Othius\" Stojkov",
...@@ -1646,7 +1640,7 @@ void F_GameEvaluationTicker(void) ...@@ -1646,7 +1640,7 @@ void F_GameEvaluationTicker(void)
|| finalecount == (7*TICRATE)/2 || finalecount == (7*TICRATE)/2
|| finalecount == ((7*TICRATE)/2)+5) || finalecount == ((7*TICRATE)/2)+5)
{ {
S_StartSound(NULL, sfx_s3k5c); S_StartSoundFromEverywhere(sfx_s3k5c);
sparklloop = 10; sparklloop = 10;
} }
} }
...@@ -1685,7 +1679,7 @@ void F_GameEvaluationTicker(void) ...@@ -1685,7 +1679,7 @@ void F_GameEvaluationTicker(void)
M_SilentUpdateUnlockablesAndEmblems(serverGamedata); M_SilentUpdateUnlockablesAndEmblems(serverGamedata);
if (M_UpdateUnlockablesAndExtraEmblems(clientGamedata)) if (M_UpdateUnlockablesAndExtraEmblems(clientGamedata))
S_StartSound(NULL, sfx_s3k68); S_StartSoundFromEverywhere(sfx_s3k68);
G_SaveGameData(clientGamedata); G_SaveGameData(clientGamedata);
} }
...@@ -3821,7 +3815,7 @@ void F_ContinueTicker(void) ...@@ -3821,7 +3815,7 @@ void F_ContinueTicker(void)
cont_spr2[1][2] = 0; cont_spr2[1][2] = 0;
if (continuetime == (3*TICRATE)-10) if (continuetime == (3*TICRATE)-10)
S_StartSound(NULL, sfx_cdfm56); // or 31 S_StartSoundFromEverywhere(sfx_cdfm56); // or 31
else if (continuetime == 5) else if (continuetime == 5)
{ {
cont_spr2[0][0] = P_GetSkinSprite2(contskins[0], SPR2_CNT2, NULL); cont_spr2[0][0] = P_GetSkinSprite2(contskins[0], SPR2_CNT2, NULL);
...@@ -3895,7 +3889,7 @@ boolean F_ContinueResponder(event_t *event) ...@@ -3895,7 +3889,7 @@ boolean F_ContinueResponder(event_t *event)
keypressed = true; keypressed = true;
imcontinuing = true; imcontinuing = true;
S_StartSound(NULL, sfx_kc6b); S_StartSoundFromEverywhere(sfx_kc6b);
I_FadeSong(0, MUSICRATE, &S_StopMusic); I_FadeSong(0, MUSICRATE, &S_StopMusic);
return true; return true;
...@@ -4591,9 +4585,9 @@ void F_TextPromptDrawer(void) ...@@ -4591,9 +4585,9 @@ void F_TextPromptDrawer(void)
players[j].powers[pw_nocontrol] = 1;\ players[j].powers[pw_nocontrol] = 1;\
if (players[j].mo)\ if (players[j].mo)\
{\ {\
if (players[j].mo->state == states+S_PLAY_STND && players[j].mo->tics != -1)\ if (P_IsPlayerInState(&players[j], S_PLAY_STND) && players[j].mo->tics != -1)\
players[j].mo->tics++;\ players[j].mo->tics++;\
else if (players[j].mo->state == states+S_PLAY_WAIT)\ else if (P_IsPlayerInState(&players[j], S_PLAY_WAIT))\
P_SetMobjState(players[j].mo, S_PLAY_STND);\ P_SetMobjState(players[j].mo, S_PLAY_STND);\
}\ }\
} }
...@@ -4695,7 +4689,7 @@ void F_TextPromptTicker(void) ...@@ -4695,7 +4689,7 @@ void F_TextPromptTicker(void)
{ {
F_AdvanceToNextPage(); F_AdvanceToNextPage();
if (promptactive) if (promptactive)
S_StartSound(NULL, sfx_menu1); S_StartSoundFromEverywhere(sfx_menu1);
} }
keypressed = true; // prevent repeat events keypressed = true; // prevent repeat events
} }
......
...@@ -601,13 +601,9 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu) ...@@ -601,13 +601,9 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
if (drawMenu) if (drawMenu)
{ {
#ifdef HAVE_THREADS
I_lock_mutex(&m_menu_mutex); I_lock_mutex(&m_menu_mutex);
#endif
M_Drawer(); // menu is drawn even on top of wipes M_Drawer(); // menu is drawn even on top of wipes
#ifdef HAVE_THREADS
I_unlock_mutex(m_menu_mutex); I_unlock_mutex(m_menu_mutex);
#endif
} }
I_FinishUpdate(); // page flip or blit buffer I_FinishUpdate(); // page flip or blit buffer
......
...@@ -100,7 +100,7 @@ demoghost *ghosts = NULL; ...@@ -100,7 +100,7 @@ demoghost *ghosts = NULL;
// DEMO RECORDING // DEMO RECORDING
// //
#define DEMOVERSION 0x0012 #define DEMOVERSION 0x0011
#define DEMOHEADER "\xF0" "SRB2Replay" "\x0F" #define DEMOHEADER "\xF0" "SRB2Replay" "\x0F"
#define DF_GHOST 0x01 // This demo contains ghost data too! #define DF_GHOST 0x01 // This demo contains ghost data too!
...@@ -185,11 +185,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum) ...@@ -185,11 +185,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
if (ziptic & ZT_ANGLE) if (ziptic & ZT_ANGLE)
oldcmd.angleturn = READINT16(demo_p); oldcmd.angleturn = READINT16(demo_p);
if (ziptic & ZT_BUTTONS) if (ziptic & ZT_BUTTONS)
{
oldcmd.buttons = (oldcmd.buttons & (BT_CAMLEFT|BT_CAMRIGHT)) | (READUINT16(demo_p) & ~(BT_CAMLEFT|BT_CAMRIGHT)); oldcmd.buttons = (oldcmd.buttons & (BT_CAMLEFT|BT_CAMRIGHT)) | (READUINT16(demo_p) & ~(BT_CAMLEFT|BT_CAMRIGHT));
if (demoversion < 0x0012 && oldcmd.buttons & BT_SPIN)
oldcmd.buttons |= BT_SHIELD; // Copy BT_SPIN to BT_SHIELD for pre-Shield-button demos
}
if (ziptic & ZT_AIMING) if (ziptic & ZT_AIMING)
oldcmd.aiming = READINT16(demo_p); oldcmd.aiming = READINT16(demo_p);
if (ziptic & ZT_LATENCY) if (ziptic & ZT_LATENCY)
......
...@@ -162,6 +162,8 @@ INT16 nextmapoverride; ...@@ -162,6 +162,8 @@ INT16 nextmapoverride;
UINT8 skipstats; UINT8 skipstats;
INT16 nextgametype = -1; INT16 nextgametype = -1;
boolean keepcutscene;
// Pointers to each CTF flag // Pointers to each CTF flag
mobj_t *redflag; mobj_t *redflag;
mobj_t *blueflag; mobj_t *blueflag;
...@@ -407,7 +409,6 @@ consvar_t cv_lookaxis = CVAR_INIT ("joyaxis_look", "X-Rudder-", CV_SAVE, ...@@ -407,7 +409,6 @@ consvar_t cv_lookaxis = CVAR_INIT ("joyaxis_look", "X-Rudder-", CV_SAVE,
consvar_t cv_turnaxis = CVAR_INIT ("joyaxis_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_turnaxis = CVAR_INIT ("joyaxis_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_jumpaxis = CVAR_INIT ("joyaxis_jump", "None", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_jumpaxis = CVAR_INIT ("joyaxis_jump", "None", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_spinaxis = CVAR_INIT ("joyaxis_spin", "None", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_spinaxis = CVAR_INIT ("joyaxis_spin", "None", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_shieldaxis = CVAR_INIT ("joyaxis_shield", "None", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_fireaxis = CVAR_INIT ("joyaxis_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_fireaxis = CVAR_INIT ("joyaxis_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_firenaxis = CVAR_INIT ("joyaxis_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_firenaxis = CVAR_INIT ("joyaxis_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_deadzone = CVAR_INIT ("joy_deadzone", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL); consvar_t cv_deadzone = CVAR_INIT ("joy_deadzone", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
...@@ -419,7 +420,6 @@ consvar_t cv_lookaxis2 = CVAR_INIT ("joyaxis2_look", "X-Rudder-", CV_SAV ...@@ -419,7 +420,6 @@ consvar_t cv_lookaxis2 = CVAR_INIT ("joyaxis2_look", "X-Rudder-", CV_SAV
consvar_t cv_turnaxis2 = CVAR_INIT ("joyaxis2_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_turnaxis2 = CVAR_INIT ("joyaxis2_turn", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_jumpaxis2 = CVAR_INIT ("joyaxis2_jump", "None", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_jumpaxis2 = CVAR_INIT ("joyaxis2_jump", "None", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_spinaxis2 = CVAR_INIT ("joyaxis2_spin", "None", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_spinaxis2 = CVAR_INIT ("joyaxis2_spin", "None", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_shieldaxis2 = CVAR_INIT ("joyaxis2_shield", "None", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_fireaxis2 = CVAR_INIT ("joyaxis2_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_fireaxis2 = CVAR_INIT ("joyaxis2_fire", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_firenaxis2 = CVAR_INIT ("joyaxis2_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL); consvar_t cv_firenaxis2 = CVAR_INIT ("joyaxis2_firenormal", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL);
consvar_t cv_deadzone2 = CVAR_INIT ("joy_deadzone2", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL); consvar_t cv_deadzone2 = CVAR_INIT ("joy_deadzone2", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL);
...@@ -894,9 +894,6 @@ INT32 JoyAxis(joyaxis_e axissel) ...@@ -894,9 +894,6 @@ INT32 JoyAxis(joyaxis_e axissel)
case JA_SPIN: case JA_SPIN:
axisval = cv_spinaxis.value; axisval = cv_spinaxis.value;
break; break;
case JA_SHIELD:
axisval = cv_shieldaxis.value;
break;
case JA_FIRE: case JA_FIRE:
axisval = cv_fireaxis.value; axisval = cv_fireaxis.value;
break; break;
...@@ -970,9 +967,6 @@ INT32 Joy2Axis(joyaxis_e axissel) ...@@ -970,9 +967,6 @@ INT32 Joy2Axis(joyaxis_e axissel)
case JA_SPIN: case JA_SPIN:
axisval = cv_spinaxis2.value; axisval = cv_spinaxis2.value;
break; break;
case JA_SHIELD:
axisval = cv_shieldaxis2.value;
break;
case JA_FIRE: case JA_FIRE:
axisval = cv_fireaxis2.value; axisval = cv_fireaxis2.value;
break; break;
...@@ -1340,10 +1334,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) ...@@ -1340,10 +1334,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
if (PLAYERINPUTDOWN(ssplayer, GC_WEAPONPREV)) if (PLAYERINPUTDOWN(ssplayer, GC_WEAPONPREV))
cmd->buttons |= BT_WEAPONPREV; // Previous Weapon cmd->buttons |= BT_WEAPONPREV; // Previous Weapon
#if NUM_WEAPONS > 7 #if NUM_WEAPONS > 10
"Add extra inputs to g_input.h/gamecontrols_e, and fix conflicts in d_ticcmd.h/ticcmd_t/buttons" "Add extra inputs to g_input.h/gamecontrols_e"
#endif #endif
//use the three avaliable bits to determine the weapon. //use the four avaliable bits to determine the weapon.
cmd->buttons &= ~BT_WEAPONMASK; cmd->buttons &= ~BT_WEAPONMASK;
for (i = 0; i < NUM_WEAPONS; ++i) for (i = 0; i < NUM_WEAPONS; ++i)
if (PLAYERINPUTDOWN(ssplayer, GC_WEPSLOT1 + i)) if (PLAYERINPUTDOWN(ssplayer, GC_WEPSLOT1 + i))
...@@ -1362,15 +1356,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) ...@@ -1362,15 +1356,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
if (PLAYERINPUTDOWN(ssplayer, GC_FIRENORMAL) || (usejoystick && axis > 0)) if (PLAYERINPUTDOWN(ssplayer, GC_FIRENORMAL) || (usejoystick && axis > 0))
cmd->buttons |= BT_FIRENORMAL; cmd->buttons |= BT_FIRENORMAL;
// Toss flag button
if (PLAYERINPUTDOWN(ssplayer, GC_TOSSFLAG)) if (PLAYERINPUTDOWN(ssplayer, GC_TOSSFLAG))
cmd->buttons |= BT_TOSSFLAG; cmd->buttons |= BT_TOSSFLAG;
// Shield button
axis = PlayerJoyAxis(ssplayer, JA_SHIELD);
if (PLAYERINPUTDOWN(ssplayer, GC_SHIELD) || (usejoystick && axis > 0))
cmd->buttons |= BT_SHIELD;
// Lua scriptable buttons // Lua scriptable buttons
if (PLAYERINPUTDOWN(ssplayer, GC_CUSTOM1)) if (PLAYERINPUTDOWN(ssplayer, GC_CUSTOM1))
cmd->buttons |= BT_CUSTOM1; cmd->buttons |= BT_CUSTOM1;
...@@ -1425,7 +1413,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) ...@@ -1425,7 +1413,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
ticcmd_centerviewdown[forplayer] = true; ticcmd_centerviewdown[forplayer] = true;
} }
else if (ticcmd_centerviewdown[forplayer] || (leveltime < 5)) else if (ticcmd_centerviewdown[forplayer])
{ {
if (controlstyle == CS_SIMPLE) if (controlstyle == CS_SIMPLE)
{ {
...@@ -1440,7 +1428,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) ...@@ -1440,7 +1428,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
{ {
if ( if (
P_MobjWasRemoved(ticcmd_ztargetfocus[forplayer]) || P_MobjWasRemoved(ticcmd_ztargetfocus[forplayer]) ||
(leveltime < 5) || (cv_directionchar[forplayer].value != 2) ||
(R_PointToDist2(player->mo->x, player->mo->y, ticcmd_ztargetfocus[forplayer]->x, ticcmd_ztargetfocus[forplayer]->y) > 3000<<FRACBITS) || // Locks on to the wrong mobj if too far away, so just cancel it
(player->playerstate != PST_LIVE) || (player->playerstate != PST_LIVE) ||
player->exiting || player->exiting ||
!ticcmd_ztargetfocus[forplayer]->health || !ticcmd_ztargetfocus[forplayer]->health ||
...@@ -1493,8 +1482,20 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) ...@@ -1493,8 +1482,20 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
} }
} }
if (ticcmd_centerviewdown[forplayer] && controlstyle == CS_SIMPLE) if (ticcmd_centerviewdown[forplayer] && chasecam)
{
if (controlstyle == CS_SIMPLE)
controlstyle = CS_LEGACY; controlstyle = CS_LEGACY;
}
else if (cv_directionchar[forplayer].value == 2)
{
if (P_MobjWasRemoved(ticcmd_ztargetfocus[forplayer]) || !chasecam)
{
P_SetTarget(&ticcmd_ztargetfocus[forplayer], NULL);
CV_SetValue(&cv_directionchar[forplayer], 1);
}
}
if (PLAYERINPUTDOWN(ssplayer, GC_CAMRESET)) if (PLAYERINPUTDOWN(ssplayer, GC_CAMRESET))
{ {
...@@ -2284,6 +2285,11 @@ boolean G_LuaResponder(event_t *ev) ...@@ -2284,6 +2285,11 @@ boolean G_LuaResponder(event_t *ev)
cancelled = LUA_HookKey(ev, HOOK(KeyUp)); cancelled = LUA_HookKey(ev, HOOK(KeyUp));
LUA_InvalidateUserdata(ev); LUA_InvalidateUserdata(ev);
} }
else if (ev->type == ev_text)
{
cancelled = LUA_HookText(ev, HOOK(TextInput));
LUA_InvalidateUserdata(ev);
}
return cancelled; return cancelled;
} }
...@@ -2777,7 +2783,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) ...@@ -2777,7 +2783,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
p->pflags |= PF_SPINDOWN; p->pflags |= PF_SPINDOWN;
p->pflags |= PF_ATTACKDOWN; p->pflags |= PF_ATTACKDOWN;
p->pflags |= PF_JUMPDOWN; p->pflags |= PF_JUMPDOWN;
p->pflags |= PF_SHIELDDOWN;
p->playerstate = PST_LIVE; p->playerstate = PST_LIVE;
p->panim = PA_IDLE; // standing animation p->panim = PA_IDLE; // standing animation
...@@ -3174,6 +3179,7 @@ void G_DoReborn(INT32 playernum) ...@@ -3174,6 +3179,7 @@ void G_DoReborn(INT32 playernum)
nextmapoverride = gamemap; nextmapoverride = gamemap;
countdown2 = TICRATE; countdown2 = TICRATE;
skipstats = 2; skipstats = 2;
keepcutscene = 0;
for (i = 0; i < MAXPLAYERS; i++) for (i = 0; i < MAXPLAYERS; i++)
{ {
...@@ -4224,7 +4230,7 @@ void G_AfterIntermission(void) ...@@ -4224,7 +4230,7 @@ void G_AfterIntermission(void)
if ((gametyperules & GTR_CUTSCENES) && mapheaderinfo[gamemap-1]->cutscenenum if ((gametyperules & GTR_CUTSCENES) && mapheaderinfo[gamemap-1]->cutscenenum
&& !modeattacking && !modeattacking
&& skipstats <= 1 && (skipstats <= 1 || keepcutscene == true)
&& (gamecomplete || !(marathonmode & MA_NOCUTSCENES)) && (gamecomplete || !(marathonmode & MA_NOCUTSCENES))
&& stagefailed == false) && stagefailed == false)
{ {
...@@ -4350,6 +4356,8 @@ static void G_DoContinued(void) ...@@ -4350,6 +4356,8 @@ static void G_DoContinued(void)
// when something new is added. // when something new is added.
void G_EndGame(void) void G_EndGame(void)
{ {
LUA_HookVoid(HOOK(GameEnd));
// Only do evaluation and credits in coop games. // Only do evaluation and credits in coop games.
if (gametyperules & GTR_CUTSCENES) if (gametyperules & GTR_CUTSCENES)
{ {
......
...@@ -71,8 +71,8 @@ typedef enum { ...@@ -71,8 +71,8 @@ typedef enum {
#define P_ControlStyle(player) ((((player)->pflags & PF_ANALOGMODE) ? CS_LMAOGALOG : 0) | (((player)->pflags & PF_DIRECTIONCHAR) ? CS_STANDARD : 0)) #define P_ControlStyle(player) ((((player)->pflags & PF_ANALOGMODE) ? CS_LMAOGALOG : 0) | (((player)->pflags & PF_DIRECTIONCHAR) ? CS_STANDARD : 0))
extern consvar_t cv_autobrake, cv_autobrake2; extern consvar_t cv_autobrake, cv_autobrake2;
extern consvar_t cv_sideaxis, cv_turnaxis, cv_moveaxis, cv_lookaxis, cv_jumpaxis, cv_spinaxis, cv_shieldaxis, cv_fireaxis, cv_firenaxis, cv_deadzone, cv_digitaldeadzone; extern consvar_t cv_sideaxis,cv_turnaxis,cv_moveaxis,cv_lookaxis,cv_jumpaxis,cv_spinaxis,cv_fireaxis,cv_firenaxis,cv_deadzone,cv_digitaldeadzone;
extern consvar_t cv_sideaxis2,cv_turnaxis2,cv_moveaxis2,cv_lookaxis2,cv_jumpaxis2,cv_spinaxis2,cv_shieldaxis2,cv_fireaxis2,cv_firenaxis2,cv_deadzone2,cv_digitaldeadzone2; extern consvar_t cv_sideaxis2,cv_turnaxis2,cv_moveaxis2,cv_lookaxis2,cv_jumpaxis2,cv_spinaxis2,cv_fireaxis2,cv_firenaxis2,cv_deadzone2,cv_digitaldeadzone2;
extern consvar_t cv_ghost_bestscore, cv_ghost_besttime, cv_ghost_bestrings, cv_ghost_last, cv_ghost_guest; extern consvar_t cv_ghost_bestscore, cv_ghost_besttime, cv_ghost_bestrings, cv_ghost_last, cv_ghost_guest;
// hi here's some new controls // hi here's some new controls
...@@ -100,7 +100,6 @@ typedef enum ...@@ -100,7 +100,6 @@ typedef enum
JA_JUMP = JA_DIGITAL, JA_JUMP = JA_DIGITAL,
JA_SPIN, JA_SPIN,
JA_SHIELD,
JA_FIRE, JA_FIRE,
JA_FIRENORMAL, JA_FIRENORMAL,
} joyaxis_e; } joyaxis_e;
......
...@@ -576,7 +576,9 @@ static const char *gamecontrolname[NUM_GAMECONTROLS] = ...@@ -576,7 +576,9 @@ static const char *gamecontrolname[NUM_GAMECONTROLS] =
"weapon5", "weapon5",
"weapon6", "weapon6",
"weapon7", "weapon7",
"shield", "weapon8",
"weapon9",
"weapon10",
"fire", "fire",
"firenormal", "firenormal",
"tossflag", "tossflag",
...@@ -691,7 +693,6 @@ void G_DefineDefaultControls(void) ...@@ -691,7 +693,6 @@ void G_DefineDefaultControls(void)
gamecontroldefault[gcs_fps][GC_CENTERVIEW ][0] = KEY_LCTRL; gamecontroldefault[gcs_fps][GC_CENTERVIEW ][0] = KEY_LCTRL;
gamecontroldefault[gcs_fps][GC_JUMP ][0] = KEY_SPACE; gamecontroldefault[gcs_fps][GC_JUMP ][0] = KEY_SPACE;
gamecontroldefault[gcs_fps][GC_SPIN ][0] = KEY_LSHIFT; gamecontroldefault[gcs_fps][GC_SPIN ][0] = KEY_LSHIFT;
gamecontroldefault[gcs_fps][GC_SHIELD ][0] = KEY_LALT;
gamecontroldefault[gcs_fps][GC_FIRE ][0] = KEY_RCTRL; gamecontroldefault[gcs_fps][GC_FIRE ][0] = KEY_RCTRL;
gamecontroldefault[gcs_fps][GC_FIRE ][1] = KEY_MOUSE1+0; gamecontroldefault[gcs_fps][GC_FIRE ][1] = KEY_MOUSE1+0;
gamecontroldefault[gcs_fps][GC_FIRENORMAL ][0] = KEY_RALT; gamecontroldefault[gcs_fps][GC_FIRENORMAL ][0] = KEY_RALT;
...@@ -712,7 +713,6 @@ void G_DefineDefaultControls(void) ...@@ -712,7 +713,6 @@ void G_DefineDefaultControls(void)
gamecontroldefault[gcs_platform][GC_CENTERVIEW ][0] = KEY_END; gamecontroldefault[gcs_platform][GC_CENTERVIEW ][0] = KEY_END;
gamecontroldefault[gcs_platform][GC_JUMP ][0] = KEY_SPACE; gamecontroldefault[gcs_platform][GC_JUMP ][0] = KEY_SPACE;
gamecontroldefault[gcs_platform][GC_SPIN ][0] = KEY_LSHIFT; gamecontroldefault[gcs_platform][GC_SPIN ][0] = KEY_LSHIFT;
gamecontroldefault[gcs_platform][GC_SHIELD ][0] = KEY_LALT;
gamecontroldefault[gcs_platform][GC_FIRE ][0] = 's'; gamecontroldefault[gcs_platform][GC_FIRE ][0] = 's';
gamecontroldefault[gcs_platform][GC_FIRE ][1] = KEY_MOUSE1+0; gamecontroldefault[gcs_platform][GC_FIRE ][1] = KEY_MOUSE1+0;
gamecontroldefault[gcs_platform][GC_FIRENORMAL ][0] = 'w'; gamecontroldefault[gcs_platform][GC_FIRENORMAL ][0] = 'w';
...@@ -728,6 +728,9 @@ void G_DefineDefaultControls(void) ...@@ -728,6 +728,9 @@ void G_DefineDefaultControls(void)
gamecontroldefault[i][GC_WEPSLOT5 ][0] = '5'; gamecontroldefault[i][GC_WEPSLOT5 ][0] = '5';
gamecontroldefault[i][GC_WEPSLOT6 ][0] = '6'; gamecontroldefault[i][GC_WEPSLOT6 ][0] = '6';
gamecontroldefault[i][GC_WEPSLOT7 ][0] = '7'; gamecontroldefault[i][GC_WEPSLOT7 ][0] = '7';
gamecontroldefault[i][GC_WEPSLOT8 ][0] = '8';
gamecontroldefault[i][GC_WEPSLOT9 ][0] = '9';
gamecontroldefault[i][GC_WEPSLOT10 ][0] = '0';
gamecontroldefault[i][GC_TOSSFLAG ][0] = '\''; gamecontroldefault[i][GC_TOSSFLAG ][0] = '\'';
gamecontroldefault[i][GC_CAMTOGGLE ][0] = 'v'; gamecontroldefault[i][GC_CAMTOGGLE ][0] = 'v';
gamecontroldefault[i][GC_CAMRESET ][0] = 'r'; gamecontroldefault[i][GC_CAMRESET ][0] = 'r';
...@@ -743,34 +746,34 @@ void G_DefineDefaultControls(void) ...@@ -743,34 +746,34 @@ void G_DefineDefaultControls(void)
// Gamepad controls -- same for both schemes // Gamepad controls -- same for both schemes
gamecontroldefault[i][GC_JUMP ][1] = KEY_JOY1+0; // A gamecontroldefault[i][GC_JUMP ][1] = KEY_JOY1+0; // A
gamecontroldefault[i][GC_SPIN ][1] = KEY_JOY1+2; // X gamecontroldefault[i][GC_SPIN ][1] = KEY_JOY1+2; // X
gamecontroldefault[i][GC_SHIELD ][1] = KEY_JOY1+1; // B gamecontroldefault[i][GC_CUSTOM1 ][1] = KEY_JOY1+1; // B
gamecontroldefault[i][GC_CUSTOM1 ][1] = KEY_JOY1+3; // Y gamecontroldefault[i][GC_CUSTOM2 ][1] = KEY_JOY1+3; // Y
gamecontroldefault[i][GC_CUSTOM2 ][1] = KEY_JOY1+4; // LB
gamecontroldefault[i][GC_CENTERVIEW ][1] = KEY_JOY1+5; // RB
gamecontroldefault[i][GC_CUSTOM3 ][1] = KEY_JOY1+8; // Left Stick gamecontroldefault[i][GC_CUSTOM3 ][1] = KEY_JOY1+8; // Left Stick
gamecontroldefault[i][GC_CAMTOGGLE ][1] = KEY_JOY1+9; // Right Stick gamecontroldefault[i][GC_CAMTOGGLE ][1] = KEY_JOY1+4; // LB
gamecontroldefault[i][GC_SCORES ][1] = KEY_JOY1+6; // Back gamecontroldefault[i][GC_CENTERVIEW ][1] = KEY_JOY1+5; // RB
gamecontroldefault[i][GC_SCREENSHOT ][1] = KEY_JOY1+6; // Back
gamecontroldefault[i][GC_SYSTEMMENU ][0] = KEY_JOY1+7; // Start gamecontroldefault[i][GC_SYSTEMMENU ][0] = KEY_JOY1+7; // Start
gamecontroldefault[i][GC_VIEWPOINTNEXT][1] = KEY_HAT1+0; // D-Pad Up
gamecontroldefault[i][GC_TOSSFLAG ][1] = KEY_HAT1+1; // D-Pad Down
gamecontroldefault[i][GC_WEAPONPREV ][1] = KEY_HAT1+2; // D-Pad Left gamecontroldefault[i][GC_WEAPONPREV ][1] = KEY_HAT1+2; // D-Pad Left
gamecontroldefault[i][GC_WEAPONNEXT ][1] = KEY_HAT1+3; // D-Pad Right gamecontroldefault[i][GC_WEAPONNEXT ][1] = KEY_HAT1+3; // D-Pad Right
gamecontroldefault[i][GC_VIEWPOINTNEXT][1] = KEY_JOY1+9; // Right Stick
gamecontroldefault[i][GC_TOSSFLAG ][1] = KEY_HAT1+0; // D-Pad Up
gamecontroldefault[i][GC_SCORES ][1] = KEY_HAT1+1; // D-Pad Down
// Second player controls only have joypad defaults // Second player controls only have joypad defaults
gamecontrolbisdefault[i][GC_JUMP ][1] = KEY_2JOY1+0; // A gamecontrolbisdefault[i][GC_JUMP ][1] = KEY_2JOY1+0; // A
gamecontrolbisdefault[i][GC_SPIN ][1] = KEY_2JOY1+2; // X gamecontrolbisdefault[i][GC_SPIN ][1] = KEY_2JOY1+2; // X
gamecontrolbisdefault[i][GC_SHIELD ][1] = KEY_2JOY1+1; // B gamecontrolbisdefault[i][GC_CUSTOM1 ][1] = KEY_2JOY1+1; // B
gamecontrolbisdefault[i][GC_CUSTOM1 ][1] = KEY_2JOY1+3; // Y gamecontrolbisdefault[i][GC_CUSTOM2 ][1] = KEY_2JOY1+3; // Y
gamecontrolbisdefault[i][GC_CUSTOM2 ][1] = KEY_2JOY1+4; // LB
gamecontrolbisdefault[i][GC_CENTERVIEW ][1] = KEY_2JOY1+5; // RB
gamecontrolbisdefault[i][GC_CUSTOM3 ][1] = KEY_2JOY1+8; // Left Stick gamecontrolbisdefault[i][GC_CUSTOM3 ][1] = KEY_2JOY1+8; // Left Stick
gamecontrolbisdefault[i][GC_CAMTOGGLE ][1] = KEY_2JOY1+9; // Right Stick gamecontrolbisdefault[i][GC_CAMTOGGLE ][1] = KEY_2JOY1+4; // LB
//gamecontrolbisdefault[i][GC_SCORES ][1] = KEY_2JOY1+6; // Back gamecontrolbisdefault[i][GC_CENTERVIEW ][1] = KEY_2JOY1+5; // RB
gamecontrolbisdefault[i][GC_SCREENSHOT ][1] = KEY_2JOY1+6; // Back
//gamecontrolbisdefault[i][GC_SYSTEMMENU ][0] = KEY_2JOY1+7; // Start //gamecontrolbisdefault[i][GC_SYSTEMMENU ][0] = KEY_2JOY1+7; // Start
gamecontrolbisdefault[i][GC_VIEWPOINTNEXT][1] = KEY_2HAT1+0; // D-Pad Up
gamecontrolbisdefault[i][GC_TOSSFLAG ][1] = KEY_2HAT1+1; // D-Pad Down
gamecontrolbisdefault[i][GC_WEAPONPREV ][1] = KEY_2HAT1+2; // D-Pad Left gamecontrolbisdefault[i][GC_WEAPONPREV ][1] = KEY_2HAT1+2; // D-Pad Left
gamecontrolbisdefault[i][GC_WEAPONNEXT ][1] = KEY_2HAT1+3; // D-Pad Right gamecontrolbisdefault[i][GC_WEAPONNEXT ][1] = KEY_2HAT1+3; // D-Pad Right
gamecontrolbisdefault[i][GC_VIEWPOINTNEXT][1] = KEY_2JOY1+9; // Right Stick
gamecontrolbisdefault[i][GC_TOSSFLAG ][1] = KEY_2HAT1+0; // D-Pad Up
//gamecontrolbisdefault[i][GC_SCORES ][1] = KEY_2HAT1+1; // D-Pad Down
} }
} }
......
...@@ -74,7 +74,9 @@ typedef enum ...@@ -74,7 +74,9 @@ typedef enum
GC_WEPSLOT5, GC_WEPSLOT5,
GC_WEPSLOT6, GC_WEPSLOT6,
GC_WEPSLOT7, GC_WEPSLOT7,
GC_SHIELD, GC_WEPSLOT8,
GC_WEPSLOT9,
GC_WEPSLOT10,
GC_FIRE, GC_FIRE,
GC_FIRENORMAL, GC_FIRENORMAL,
GC_TOSSFLAG, GC_TOSSFLAG,
......
...@@ -566,7 +566,7 @@ static inline void HWR_SubsecPoly(INT32 num, poly_t *poly) ...@@ -566,7 +566,7 @@ static inline void HWR_SubsecPoly(INT32 num, poly_t *poly)
// the bsp divline have not enouth presition // the bsp divline have not enouth presition
// search for the segs source of this divline // search for the segs source of this divline
static inline void SearchDivline(node_t *bsp, fdivline_t *divline) static inline void SearchDivline(bspnode_t *bsp, fdivline_t *divline)
{ {
divline->x = FIXED_TO_FLOAT(bsp->x); divline->x = FIXED_TO_FLOAT(bsp->x);
divline->y = FIXED_TO_FLOAT(bsp->y); divline->y = FIXED_TO_FLOAT(bsp->y);
...@@ -607,7 +607,7 @@ static void loading_status(void) ...@@ -607,7 +607,7 @@ static void loading_status(void)
// poly : the convex polygon that encloses all child subsectors // poly : the convex polygon that encloses all child subsectors
static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *bbox) static void WalkBSPNode(INT32 bspnum, poly_t *poly, UINT16 *leafnode, fixed_t *bbox)
{ {
node_t *bsp; bspnode_t *bsp;
poly_t *backpoly, *frontpoly; poly_t *backpoly, *frontpoly;
fdivline_t fdivline; fdivline_t fdivline;
polyvertex_t *pt; polyvertex_t *pt;
......
...@@ -483,11 +483,14 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *grtex, GLMipmap_t ...@@ -483,11 +483,14 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *grtex, GLMipmap_t
realpatch = W_CachePatchNumPwad(wadnum, lumpnum, PU_PATCH); realpatch = W_CachePatchNumPwad(wadnum, lumpnum, PU_PATCH);
} }
if (realpatch != NULL)
{
HWR_DrawTexturePatchInCache(mipmap, blockwidth, blockheight, texture, patch, realpatch); HWR_DrawTexturePatchInCache(mipmap, blockwidth, blockheight, texture, patch, realpatch);
if (free_patch) if (free_patch)
Patch_Free(realpatch); Patch_Free(realpatch);
} }
}
//Hurdler: not efficient at all but I don't remember exactly how HWR_DrawPatchInCache works :( //Hurdler: not efficient at all but I don't remember exactly how HWR_DrawPatchInCache works :(
if (format2bpp(mipmap->format)==4) if (format2bpp(mipmap->format)==4)
{ {
......
...@@ -256,8 +256,8 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p ...@@ -256,8 +256,8 @@ void HWR_DrawStretchyFixedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t p
} }
// positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1
cx = -1 + (cx / (vid.width/2)); cx = -1.0f + (cx / (vid.width / 2.0f));
cy = 1 - (cy / (vid.height/2)); cy = 1.0f - (cy / (vid.height / 2.0f));
// fwidth and fheight are similar // fwidth and fheight are similar
fwidth /= vid.width / 2; fwidth /= vid.width / 2;
...@@ -598,43 +598,76 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, ...@@ -598,43 +598,76 @@ void HWR_DrawCroppedPatch(patch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Fills a box of pixels using a flat texture as a pattern // Fills a box of pixels using a flat texture as a pattern
// Fixed to properly align like the other draw functions -luigi budd
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
void HWR_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum) void HWR_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum)
{ {
FOutVector v[4]; FOutVector v[4];
const size_t len = W_LumpLength(flatlumpnum); const size_t len = W_LumpLength(flatlumpnum);
UINT16 flatflag = R_GetFlatSize(len) - 1; UINT16 flatflag = R_GetFlatSize(len);
double dflatsize = (double)(flatflag + 1); double dflatsize = (double)(flatflag);
// compilers are COOL!
float dup = (float)vid.dup;
float fx = (float)x * dup;
float fy = (float)y * dup;
float fw = (float)w * dup;
float fh = (float)h * dup;
/*
fx *= dup;
fy *= dup;
fw *= dup;
fh *= dup;
*/
if (fw <= 0 || fh <= 0)
return;
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * vid.dup) > 1.0E-36f)
{
fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 2;
}
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * vid.dup) > 1.0E-36f)
{
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 2;
}
if (fx >= vid.width || fy >= vid.height)
return;
fx = -1.0f + (fx / (vid.width / 2.0f));
fy = 1.0f - (fy / (vid.height / 2.0f));
fw /= vid.width / 2;
fh /= vid.height / 2;
// 3--2 // 3--2
// | /| // | /|
// |/ | // |/ |
// 0--1 // 0--1
v[0].x = v[3].x = (x - 160.0f)/160.0f; // position vertices
v[2].x = v[1].x = ((x+w) - 160.0f)/160.0f; v[0].x = v[3].x = fx;
v[0].y = v[1].y = -(y - 100.0f)/100.0f; v[2].x = v[1].x = fx + fw;
v[2].y = v[3].y = -((y+h) - 100.0f)/100.0f;
v[0].y = v[1].y = fy;
v[2].y = v[3].y = fy - fh;
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
v[0].s = v[3].s = (float)((x & flatflag)/dflatsize); // sides
v[2].s = v[1].s = (float)(v[0].s + w/dflatsize); v[0].s = v[3].s = (float)(flatflag/dflatsize) * 2;
v[0].t = v[1].t = (float)((y & flatflag)/dflatsize); v[2].s = v[1].s = (float)(v[0].s + w/dflatsize) * 2;
v[2].t = v[3].t = (float)(v[0].t + h/dflatsize);
HWR_GetRawFlat(flatlumpnum); // top/bottom
v[0].t = v[1].t = (float)(flatflag/dflatsize) * 2;
v[2].t = v[3].t = (float)(v[0].t + h/dflatsize) * 2;
//Hurdler: Boris, the same comment as above... but maybe for pics // needed to texture the poly
// it not a problem since they don't have any transparent pixel HWR_GetRawFlat(flatlumpnum);
// if I'm right !?
// BTW, I see we put 0 for PFs, and If I'm right, that
// means we take the previous PFs as default
// how can we be sure they are ok?
HWD.pfnDrawPolygon(NULL, v, 4, PF_NoDepthTest); //PF_Translucent); HWD.pfnDrawPolygon(NULL, v, 4, PF_NoDepthTest); //PF_Translucent);
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Fade down the screen so that the menu drawn on top of it looks brighter // Fade down the screen so that the menu drawn on top of it looks brighter
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -1140,10 +1173,12 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32 ...@@ -1140,10 +1173,12 @@ void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color, UINT32
void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
{ {
FOutVector v[4]; FOutVector v[4];
FBITFIELD flags;
FSurfaceInfo Surf; FSurfaceInfo Surf;
float fx, fy, fw, fh; float fx, fy, fw, fh;
RGBA_t *palette = HWR_GetTexturePalette(); RGBA_t *palette = HWR_GetTexturePalette();
UINT8 alphalevel = ((color & V_ALPHAMASK) >> V_ALPHASHIFT); UINT8 alphalevel = ((color & V_ALPHAMASK) >> V_ALPHASHIFT);
UINT8 blendmode = ((color & V_BLENDMASK) >> V_BLENDSHIFT);
UINT8 perplayershuffle = 0; UINT8 perplayershuffle = 0;
...@@ -1308,6 +1343,199 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) ...@@ -1308,6 +1343,199 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
Surf.PolyColor = palette[color&0xFF]; Surf.PolyColor = palette[color&0xFF];
flags = HWR_GetBlendModeFlag(blendmode+1)|PF_NoDepthTest|PF_NoTexture|PF_Modulated;
if (alphalevel)
{
if (alphalevel == 10) Surf.PolyColor.s.alpha = softwaretranstogl_lo[st_translucency]; // V_HUDTRANSHALF
else if (alphalevel == 11) Surf.PolyColor.s.alpha = softwaretranstogl[st_translucency]; // V_HUDTRANS
else if (alphalevel == 12) Surf.PolyColor.s.alpha = softwaretranstogl_hi[st_translucency]; // V_HUDTRANSDOUBLE
else Surf.PolyColor.s.alpha = softwaretranstogl[10-alphalevel];
}
HWD.pfnDrawPolygon(&Surf, v, 4,
flags);
}
// -----------------+
// HWR_DrawFixedFill: draw flat coloured rectangle, with no texture (with fixed point values !!)
// -----------------+
void HWR_DrawFixedFill(fixed_t x, fixed_t y, fixed_t w, fixed_t h, INT32 color)
{
FOutVector v[4];
FSurfaceInfo Surf;
FBITFIELD flags;
float fx = FIXED_TO_FLOAT(x);
float fy = FIXED_TO_FLOAT(y);
float fw = FIXED_TO_FLOAT(w);
float fh = FIXED_TO_FLOAT(h);
RGBA_t *palette = HWR_GetTexturePalette();
UINT8 alphalevel = ((color & V_ALPHAMASK) >> V_ALPHASHIFT);
UINT8 blendmode = ((color & V_BLENDMASK) >> V_BLENDSHIFT);
UINT8 perplayershuffle = 0;
// 3--2
// | /|
// |/ |
// 0--1
if (splitscreen && (color & V_PERPLAYER))
{
float adjusty = ((color & V_NOSCALESTART) ? vid.height : BASEVIDHEIGHT)/2.0f;
fh /= 1;
fy /= 2;
#ifdef QUADS
if (splitscreen > 1) // 3 or 4 players
{
float adjustx = ((color & V_NOSCALESTART) ? vid.height : BASEVIDHEIGHT)/2.0f;
fw /= 2;
fx /= 2;
if (stplyr == &players[displayplayer])
{
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
perplayershuffle |= 1;
if (!(color & (V_SNAPTOLEFT|V_SNAPTORIGHT)))
perplayershuffle |= 4;
color &= ~V_SNAPTOBOTTOM|V_SNAPTORIGHT;
}
else if (stplyr == &players[secondarydisplayplayer])
{
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
perplayershuffle |= 1;
if (!(color & (V_SNAPTOLEFT|V_SNAPTORIGHT)))
perplayershuffle |= 8;
fx += adjustx;
color &= ~V_SNAPTOBOTTOM|V_SNAPTOLEFT;
}
else if (stplyr == &players[thirddisplayplayer])
{
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
perplayershuffle |= 2;
if (!(color & (V_SNAPTOLEFT|V_SNAPTORIGHT)))
perplayershuffle |= 4;
fy += adjusty;
color &= ~V_SNAPTOTOP|V_SNAPTORIGHT;
}
else //if (stplyr == &players[fourthdisplayplayer])
{
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
perplayershuffle |= 2;
if (!(color & (V_SNAPTOLEFT|V_SNAPTORIGHT)))
perplayershuffle |= 8;
fx += adjustx;
fy += adjusty;
color &= ~V_SNAPTOTOP|V_SNAPTOLEFT;
}
}
else
#endif
// 2 players
{
if (stplyr == &players[displayplayer])
{
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
perplayershuffle |= 1;
color &= ~V_SNAPTOBOTTOM;
}
else //if (stplyr == &players[secondarydisplayplayer])
{
if (!(color & (V_SNAPTOTOP|V_SNAPTOBOTTOM)))
perplayershuffle |= 2;
fy += adjusty;
color &= ~V_SNAPTOTOP;
}
}
}
if (!(color & V_NOSCALESTART))
{
/*
if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT)
{
RGBA_t rgbaColour = palette[color&0xFF];
FRGBAFloat clearColour;
clearColour.red = (float)rgbaColour.s.red / 255;
clearColour.green = (float)rgbaColour.s.green / 255;
clearColour.blue = (float)rgbaColour.s.blue / 255;
clearColour.alpha = 1;
HWD.pfnClearBuffer(true, false, &clearColour);
return;
}
*/
fx *= vid.dup;
fy *= vid.dup;
fw *= vid.dup;
fh *= vid.dup;
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * vid.dup) > 1.0E-36f)
{
if (color & V_SNAPTORIGHT)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup));
else if (!(color & V_SNAPTOLEFT))
fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 2;
if (perplayershuffle & 4)
fx -= ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
else if (perplayershuffle & 8)
fx += ((float)vid.width - ((float)BASEVIDWIDTH * vid.dup)) / 4;
}
if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * vid.dup) > 1.0E-36f)
{
// same thing here
if (color & V_SNAPTOBOTTOM)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup));
else if (!(color & V_SNAPTOTOP))
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 2;
if (perplayershuffle & 1)
fy -= ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
else if (perplayershuffle & 2)
fy += ((float)vid.height - ((float)BASEVIDHEIGHT * vid.dup)) / 4;
}
}
if (fx >= vid.width || fy >= vid.height)
return;
if (fx < 0)
{
fw += fx;
fx = 0;
}
if (fy < 0)
{
fh += fy;
fy = 0;
}
if (fw <= 0 || fh <= 0)
return;
if (fx + fw > vid.width)
fw = (float)vid.width - fx;
if (fy + fh > vid.height)
fh = (float)vid.height - fy;
fx = -1.0f + (fx / (vid.width / 2.0f));
fy = 1.0f - (fy / (vid.height / 2.0f));
fw = fw / (vid.width / 2);
fh = fh / (vid.height / 2);
v[0].x = v[3].x = fx;
v[2].x = v[1].x = fx + fw;
v[0].y = v[1].y = fy;
v[2].y = v[3].y = fy - fh;
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
v[0].s = v[3].s = 0.0f;
v[2].s = v[1].s = 1.0f;
v[0].t = v[1].t = 0.0f;
v[2].t = v[3].t = 1.0f;
Surf.PolyColor = palette[color&0xFF];
flags = HWR_GetBlendModeFlag(blendmode+1)|PF_NoDepthTest|PF_NoTexture|PF_Modulated;
if (alphalevel) if (alphalevel)
{ {
if (alphalevel == 10) Surf.PolyColor.s.alpha = softwaretranstogl_lo[st_translucency]; // V_HUDTRANSHALF if (alphalevel == 10) Surf.PolyColor.s.alpha = softwaretranstogl_lo[st_translucency]; // V_HUDTRANSHALF
...@@ -1317,7 +1545,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) ...@@ -1317,7 +1545,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
} }
HWD.pfnDrawPolygon(&Surf, v, 4, HWD.pfnDrawPolygon(&Surf, v, 4,
PF_Modulated|PF_NoTexture|PF_NoDepthTest|PF_Translucent); flags);
} }
#ifdef HAVE_PNG #ifdef HAVE_PNG
......
...@@ -485,15 +485,6 @@ light_t *t_lspr[NUMSPRITES] = ...@@ -485,15 +485,6 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_SSWY &lspr[NOLIGHT], // SPR_SSWY
&lspr[NOLIGHT], // SPR_SSWR &lspr[NOLIGHT], // SPR_SSWR
&lspr[NOLIGHT], // SPR_SSWB &lspr[NOLIGHT], // SPR_SSWB
&lspr[NOLIGHT], // SPR_MPRY
&lspr[NOLIGHT], // SPR_MPRR
&lspr[NOLIGHT], // SPR_MPRB
&lspr[NOLIGHT], // SPR_MSWY
&lspr[NOLIGHT], // SPR_MSWR
&lspr[NOLIGHT], // SPR_MSWB
&lspr[NOLIGHT], // SPR_MDIY
&lspr[NOLIGHT], // SPR_MDIR
&lspr[NOLIGHT], // SPR_MDIB
&lspr[NOLIGHT], // SPR_BSTY &lspr[NOLIGHT], // SPR_BSTY
&lspr[NOLIGHT], // SPR_BSTR &lspr[NOLIGHT], // SPR_BSTR
...@@ -552,7 +543,6 @@ light_t *t_lspr[NUMSPRITES] = ...@@ -552,7 +543,6 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_BGOM &lspr[NOLIGHT], // SPR_BGOM
&lspr[REDBALL_L], // SPR_FFWR &lspr[REDBALL_L], // SPR_FFWR
&lspr[SMALLREDBALL_L], // SPR_FBLL &lspr[SMALLREDBALL_L], // SPR_FBLL
&lspr[NOLIGHT], // SPR_MKOP
&lspr[NOLIGHT], // SPR_SHLL &lspr[NOLIGHT], // SPR_SHLL
&lspr[REDBALL_L], // SPR_PUMA &lspr[REDBALL_L], // SPR_PUMA
&lspr[NOLIGHT], // SPR_HAMM &lspr[NOLIGHT], // SPR_HAMM
...@@ -623,22 +613,6 @@ light_t *t_lspr[NUMSPRITES] = ...@@ -623,22 +613,6 @@ light_t *t_lspr[NUMSPRITES] =
&lspr[NOLIGHT], // SPR_BRIR &lspr[NOLIGHT], // SPR_BRIR
&lspr[NOLIGHT], // SPR_BRIB &lspr[NOLIGHT], // SPR_BRIB
&lspr[NOLIGHT], // SPR_BRIY &lspr[NOLIGHT], // SPR_BRIY
&lspr[NOLIGHT], // SPR_MBRI
&lspr[NOLIGHT], // SPR_MBRS
&lspr[NOLIGHT], // SPR_MBRB
&lspr[NOLIGHT], // SPR_MBRC
&lspr[NOLIGHT], // SPR_MTRI
&lspr[NOLIGHT], // SPR_MARS
&lspr[NOLIGHT], // SPR_MRFL
&lspr[NOLIGHT], // SPR_MAUH
&lspr[NOLIGHT], // SPR_MBSA
&lspr[NOLIGHT], // SPR_MBSB
&lspr[NOLIGHT], // SPR_MBSC
&lspr[NOLIGHT], // SPR_MFRE
&lspr[NOLIGHT], // SPR_MFYE
&lspr[NOLIGHT], // SPR_MFBE
&lspr[NOLIGHT], // SPR_MFWD
&lspr[NOLIGHT], // SPR_MUS3
// Gravity Well Objects // Gravity Well Objects
&lspr[NOLIGHT], // SPR_GWLG &lspr[NOLIGHT], // SPR_GWLG
...@@ -1455,7 +1429,7 @@ static void HWR_SearchLightsInMobjs(void) ...@@ -1455,7 +1429,7 @@ static void HWR_SearchLightsInMobjs(void)
// search in the list of thinkers // search in the list of thinkers
for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next)
if (th->function.acp1 != (actionf_p1)P_RemoveThinkerDelayed) if (th->function != (actionf_p1)P_RemoveThinkerDelayed)
HWR_AddMobjLights((mobj_t *)th); HWR_AddMobjLights((mobj_t *)th);
} }
#endif #endif
......