Compare commits

...
52 Commits
Author SHA1 Message Date
alufolie91 9936f9c740 have Z_IsMobjValid2 print an error in console
if mobj pointer is invalid
the callee should handle the behavior
2026-10-02 18:23:29 +02:00
alufolie91 bee5c8e5ed add code to check for mobj pointer validity
as we use the pool allocator we may check if a mobj points into the address range of the level pool specific to mobj allocations (g_level_large_pool)
this may help in debugging stuff without the need to run things like ASAN or valgrind
2026-10-02 18:23:26 +02:00
alufolie91 4749d1a108 OpenGL: prefer GL_RGBA for fbo texture
as recommended per https://wikis.khronos.org/opengl/Common_Mistakes
2026-10-01 19:30:09 +02:00
alufolie91 36d13734f6 v10.1 2026-09-27 17:53:52 +02:00
alufolie91 3fc5f572bb fix CMake again............ 2026-09-27 17:35:05 +02:00
alufolie91 d65319a9fc fix "Modulative" blendmode in software
forgot to account it when the gamma correction stuff was ported
2026-09-27 17:15:42 +02:00
alufolie91 1d8b066a64 fix desynchs with vanilla on Sewer System
read the sectornode list stuff
this means we reuse old stale data in some cases, which also causes strange bugs with orbiting items in some cases, but thats what vanilla does and we HAVE to keep vanilla compat after all
i really hope this does not cause any fun impossible to debug crashes, but what can you do
2026-09-26 15:12:28 +02:00
alufolie91 e6033322c6 disable phobos in cmake
stupid copy paste error
2026-09-26 12:03:05 +02:00
alufolie91 d988876bca change version number for phobos
phobos is NOT vanilla compatible and is not meant to be
this should prevent the game be able to connect to vanilla servers hopefully
2026-09-26 11:57:33 +02:00
alufolie91 7e92482ced add orbit mobj check into K_MoveHeldObjects 2026-09-25 22:07:09 +02:00
alufolie91 fa753c3694 Revert "cleanup and make safer, orbit item handling in K_MoveHeldObjects"
This reverts commit 5e1ae2155f.
2026-09-25 22:03:03 +02:00
indev 58403cf4a5 Revert "Prevent orbit from being freed by using P_SetTarget in K_RepairOrbitChain"
This reverts commit 13241d1880.
2026-09-25 22:04:15 +03:00
indev 13241d1880 Prevent orbit from being freed by using P_SetTarget in K_RepairOrbitChain 2026-09-25 21:54:49 +03:00
alufolie91 91f016fd0c remove inline from P_TagDamage
not only this is basically unused its also quite huge
so no need to inline this at all
2026-09-25 20:34:49 +02:00
alufolie91 5e1ae2155f cleanup and make safer, orbit item handling in K_MoveHeldObjects
based on https://gitlab.com/kart-krew-dev/ring-racers/-/commit/4e9d2295c9da30888fea77825c276bac831aecb3
2026-09-25 20:32:31 +02:00
alufolie91 dd2a227529 mobj hnext/hprev list fixes for phobos build
too lazy to cherry pick so
https://gitlab.com/kart-krew-dev/ring-racers/-/commit/a392996a5437742d5b7a91d0fce9da49c3a8bd76
and
https://gitlab.com/kart-krew-dev/ring-racers/-/commit/8b5bd645ca5d8ef9269aa6ccf4375337bd0c1672

both of which might change behavior so phobos only
2026-09-25 19:03:46 +02:00
alufolie91 9521183eb3 cast this to boolean
no effective change just wanna be more explicit there
2026-09-23 19:17:13 +02:00
alufolie91 56bb20f4e1 cleanup controller menu stuff a little more 2026-09-23 18:31:49 +02:00
alufolie91 604fa7281b dont reset JoyInfo in I_InitJoystick
seems to fix wonky behavior when changing controllers per player
2026-09-23 18:24:44 +02:00
indev 2c9a82e2d3 20 2026-09-21 22:36:41 +03:00
alufolie91 4f7e296885 fun times with M_DoAssignJoystick
my tired ass forgor cv_usejoystick gets reassinged within this, so the cvar string also changes
2026-09-21 20:41:01 +02:00
indev c917708184 Actually change command name to useprefcolor, so its a bit more intuitive 2026-09-21 20:57:18 +03:00
indev 110e93f4ed Add command to change skin color to prefcolor 2026-09-21 20:53:44 +03:00
orbitalviolet a0d6d452a0 Fix regression #1507 2026-09-21 18:41:10 +02:00
alufolie91 7fb3f7a1aa YES THANKS MICHEALSOFT VERY COOL 2026-09-21 17:32:08 +02:00
Roberto Ierusalimschy 7e906074ec keep memory-error message in the global state, so that its use
does not depend on Lua internalizing strings to avoid a string
creation on memory errors
2026-09-21 17:14:21 +02:00
alufolie91 de35e086d3 use strnlen in W_CheckNumForNamePwad
we clamped this to a length of 8 eitherways
so might aswell just use strnlen which is safer in any case
2026-09-21 16:44:56 +02:00
alufolie91 295b35b23a cleanup p_mobj + more safety
big cleanups and more mobj checks
needs to be rechecked since its quite a lot
2026-09-21 16:38:54 +02:00
alufolie91 a5b6dad8f3 cleanup p_enemy + more safety
add a crapton of checks for removed mobjs
copy pasted from srb2 mainly
2026-09-21 16:37:40 +02:00
alufolie91 d024992144 clean up Command_connect 2026-09-21 16:34:33 +02:00
alufolie91 3df604e8b6 expand sector flags
include gravflip, heatwave, noclipcam and invertencore
is a bit cleaner
may also add the special flags at some point to clean things up a bit more
2026-09-21 16:33:21 +02:00
alufolie91 080f586c19 simplify W_CheckNumForNamePwad
pretty much what blankart does
avoids doing a bunch of string work
2026-09-21 16:31:18 +02:00
indev 0e62afd348 Count lua memory for total usage in memfree command 2026-09-21 17:24:43 +03:00
indev 648d3c439b Change lua to not use z_zone allocator 2026-09-21 17:24:43 +03:00
NepDisk 1dd3e90363 Make memdump show block tags 2026-09-21 16:22:22 +02:00
NepDisk c78c0d1657 Fix memory block not being moved to correct taglist with Z_ChangeTag
I didn't even notice this one at first, whoops! Also added proper checking to prevent this from happening again.
2026-09-21 16:22:01 +02:00
NepDisk 838d05eef7 Convert Z_Zone head into a list similar to thinkerlists
I was thinking to myself about how 2.1 and before did thinkers and how 2.2 made it into thinker lists and thought "wait isn't memory allocated similar to that?" and well here we are.
2026-09-21 16:21:40 +02:00
alufolie91 3c3e8dd986 use Z_TotalUsage for memory debug display 2026-09-19 21:09:20 +02:00
alufolie91 2d79ff9606 few more smoler style cleanups 2026-09-17 11:44:15 +02:00
alufolie91 70f4207e02 smol fix for pm´s in DoSayCommand
sending a pm might change the length of the string which we need to reconsider when sending the cmd
2026-09-17 11:40:52 +02:00
alufolie91 242754f811 disable flat precaching in opengl in encoremode
this appears to mess up remapping behavior in certain cases (ex. sneaker/spring panels)
since i cba looking into properly fixing this, ill just disable this for now
2026-09-12 16:53:26 +02:00
alufolie91 521544f6ba raise skinlimit to 1024 for phobos build
not thoroughly tested by me, so might still be incomplete
2026-09-03 19:34:56 +02:00
alufolie91 efc0681e01 make PHOBOS_BUILD a compile flag
pass PHOBOS_BUILD=1 to build
2026-09-03 19:30:55 +02:00
alufolie91 4c3fa7d826 raise numlap limit to 255 for phobos client
idk but this was wanted
2026-09-03 19:21:18 +02:00
alufolie91 ac87678708 rename COMPAT_VANILLA to PHOBOS_BUILD
have a distinct name for that build "Phobos", as a nod to Doom
also invert the flag, as it should make adding stuff less headachey
will make this a compiler flag later but too lazy atm
2026-09-03 18:47:45 +02:00
alufolie91 a6e5edabd2 fix M_TextInputSetString not null terminating in some cases
if input string is longer than the buffer this may never be null terminated properly
2026-09-02 15:05:43 +02:00
alufolie91 24e5b1d84b fix buffer overflow when opening "Advanced Color Options"
idk if this is the intended thing, but works fine
2026-09-02 14:40:49 +02:00
alufolie91 ade7db9004 fix replayhut exploding due to sega fishe
"sega_bass_fishin" is exactly 16 characters which caused stuff to not be terminated
2026-09-02 14:09:33 +02:00
indev 819b171d90 Do a full garbage collection after LUA_InvalidateLevel 2026-08-28 00:44:49 +03:00
GenericHeroGuy 882716e911 Make Valgrind builds usable when not running with Valgrind + cleanup 2026-08-24 11:34:55 +02:00
alufolie91 5644036d25 macrofy Z_CheckHeap errors
stuff was slightly ugly and unwieldy.
making it a macro also makes adding new errors less messy
2026-08-24 10:30:28 +02:00
alufolie91 de74c9251f make HWR_AddPolyObjectPlanes a little less ugly 2026-08-23 16:40:31 +02:00
54 changed files with 2566 additions and 1664 deletions

No files matched your search

+7
View File
@@ -257,6 +257,9 @@ set(SRB2_CONFIG_SATURNJOIN ON CACHE BOOL
set(SRB2_CONFIG_SCREENFBO ON CACHE BOOL
"Enable hardware renderer (OpenGL) FBO downsampling support")
set(SRB2_CONFIG_PHOBOS OFF CACHE BOOL
" Compile the Phobos client. Which contains things not compatible with vanilla, such as raised skinlimits, 32 player support, bugfixes, etc.")
if(${SRB2_CONFIG_DEDICATED})
set(SRB2_CONFIG_HAVE_GME NO)
set(SRB2_CONFIG_HAVE_OPENMPT NO)
@@ -583,6 +586,10 @@ if(${SRB2_CONFIG_SATURNJOIN})
add_definitions(-DDOSATURNJOIN)
endif()
if(${SRB2_CONFIG_PHOBOS})
add_definitions(-DPHOBOS_BUILD)
endif()
# Targets
# Compatibility flag with later versions of GCC
+4
View File
@@ -65,6 +65,10 @@
# DEBUGMODE=1 - Enable various debugging capabilities.
# Also disables optimizations.
#
# PHOBOS_BUILD=1 - Compile the Phobos client.
# Contains things not compatible with vanilla.
# such as raised skinlimits, 32 player support, bugfixes, etc.
#
# Development flags:
#
# VALGRIND=1 - Enable Valgrind memory debugging support.
+1
View File
@@ -9,6 +9,7 @@ passthru_opts+=\
HAVE_DISCORDRPC DEVELOP\
NOHOLEPUNCH\
HAVE_IPV6\
PHOBOS_BUILD\
# build with debugging information
ifdef DEBUGMODE
+2 -2
View File
@@ -55,8 +55,8 @@ struct lua_longjmp {
void luaD_seterrorobj (lua_State *L, int lerrcode, StkId oldtop) {
switch (lerrcode) {
case LUA_ERRMEM: {
setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG));
case LUA_ERRMEM: { /* memory error? */
setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */
break;
}
case LUA_ERRERR: {
-2
View File
@@ -13,8 +13,6 @@
#include "llimits.h"
#include "lua.h"
#define MEMERRMSG "not enough memory"
#define luaM_reallocv(L,b,on,n,e) \
((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \
+6 -1
View File
@@ -64,6 +64,9 @@ static void freestack (lua_State *L, lua_State *L1) {
}
#define MEMERRMSG "not enough memory"
/*
** open parts that may cause memory-allocation errors
*/
@@ -76,7 +79,9 @@ static void f_luaopen (lua_State *L, void *ud) {
luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */
luaT_init(L);
luaX_init(L);
luaS_fix(luaS_newliteral(L, MEMERRMSG));
/* pre-create memory-error message */
g->memerrmsg = luaS_newliteral(L, MEMERRMSG);
luaS_fix(g->memerrmsg); /* it should never be collected */
g->GCthreshold = 4*g->totalbytes;
}
+1
View File
@@ -88,6 +88,7 @@ typedef struct global_State {
lua_CFunction panic; /* to be called in unprotected errors */
TValue l_registry;
struct lua_State *mainthread;
TString *memerrmsg; /* memory-error message */
UpVal uvhead; /* head of double-linked list of all open upvalues */
struct Table *mt[NUM_TAGS]; /* metatables for basic types */
TString *tmname[TM_N]; /* array with tag-method names */
+9
View File
@@ -206,6 +206,15 @@ FUNCINLINE static ATTRINLINE UINT32 readulong(void *ptr)
p += n; \
} while (0)
#ifdef PHOBOS_BUILD
#define WRITESKIN(p,b) WRITEUINT16(p,b)
#define READSKIN(p) READUINT16(p)
#else
#define WRITESKIN(p,b) WRITEUINT8(p,b)
#define READSKIN(p) READUINT8(p)
#endif
#ifdef __cplusplus
} // extern "C"
#endif
+24
View File
@@ -149,6 +149,30 @@ void PoolAllocator::release()
allocated_blocks_ = 0;
}
bool PoolAllocator::ptrcheck(const void* p) const
{
const uintptr_t paddr = reinterpret_cast<uintptr_t>(p);
ChunkFooter* next = nullptr;
for (ChunkFooter* chunk = first_chunk_; chunk != nullptr; chunk = next)
{
const uintptr_t blockstart = reinterpret_cast<uintptr_t>(chunk->start);
const uintptr_t blockend = blockstart + blocks_ * block_size_;
//CONS_Printf("mobj ptr %lu, block start %lu end %lu\n", paddr, blockstart, blockend);
if (paddr >= blockstart && paddr < blockend)
{
return true;
}
next = chunk->next;
}
return false;
}
static LinearMemory g_frame_memory {4 * 1024 * 1024};
void* Z_Frame_Alloc(size_t size)
+1
View File
@@ -65,6 +65,7 @@ public:
constexpr size_t allocated_bytes() const noexcept { return allocated_blocks_ * block_size_; };
void release();
bool ptrcheck(const void* p) const;
};
} // namespace srb2
+66 -30
View File
@@ -1125,7 +1125,7 @@ static cl_mode_t cl_mode = CL_SEARCHING;
static UINT16 cl_lastcheckedfilecount = 0; // used for full file list
// Player name send/load
#ifndef PHOBOS_BUILD
static void CV_SavePlayerNames(UINT8 **p)
{
INT32 i = 0;
@@ -1161,6 +1161,7 @@ static void CV_LoadPlayerNames(UINT8 **p)
memcpy(player_names[i], tmp_name, MAXPLAYERNAME+1);
}
}
#endif
static void CL_DrawAddonTypes(void)
{
@@ -1772,7 +1773,7 @@ static void SV_SendPlayerInfo(INT32 node)
// doesent really matter what we put here lel
netbuffer->u.playerinfo[0].score = LONG(42069);
netbuffer->u.playerinfo[0].timeinserver = SHORT(42069);
netbuffer->u.playerinfo[0].skin = (UINT8)1; // no clue wtf skin 1 is, tails maybe?
netbuffer->u.playerinfo[0].skin = (skinnum_t)1; // no clue wtf skin 1 is, tails maybe?
netbuffer->u.playerinfo[0].data = 0;
@@ -1817,11 +1818,11 @@ static void SV_SendPlayerInfo(INT32 node)
netbuffer->u.playerinfo[i].score = LONG(players[i].score);
netbuffer->u.playerinfo[i].timeinserver = SHORT((UINT16)(players[i].jointime / TICRATE));
netbuffer->u.playerinfo[i].skin = (UINT8)players[i].skin;
netbuffer->u.playerinfo[i].skin = (skinnum_t)players[i].skin;
// Extra data
// Kart has extra skincolors, so we can't use this
//netbuffer->u.playerinfo[i].data = 0; //netbuffer->u.playerinfo[i].data = players[i].skincolor;
//netbuffer->u.playerinfo[i].data = 0;
// well why not, we only got like 100 of these?
netbuffer->u.playerinfo[i].data = players[i].skincolor;
@@ -1927,8 +1928,10 @@ static void SV_SendMapIcon(INT32 node)
*/
static boolean SV_SendServerConfig(INT32 node)
{
#ifndef PHOBOS_BUILD
INT32 i;
UINT8 *p, *op;
#endif
boolean waspacketsent;
doomdata_t *netbuffer = DOOMCOM_DATA(doomcom);
@@ -1946,6 +1949,7 @@ static boolean SV_SendServerConfig(INT32 node)
netbuffer->u.servercfg.gametype = (UINT8)gametype;
netbuffer->u.servercfg.modifiedgame = (UINT8)modifiedgame;
#ifndef PHOBOS_BUILD
// we fill these structs with FFs so that any players not in game get sent as 0xFFFF
// which is nice and easy for us to detect
memset(netbuffer->u.servercfg.playerskins, 0xFF, sizeof(netbuffer->u.servercfg.playerskins));
@@ -1961,6 +1965,7 @@ static boolean SV_SendServerConfig(INT32 node)
netbuffer->u.servercfg.playerskins[i] = (UINT8)players[i].skin;
netbuffer->u.servercfg.playercolor[i] = (UINT8)players[i].skincolor;
}
#endif
netbuffer->u.servercfg.maxplayer = (UINT8)(min((dedicated ? MAXPLAYERS-1 : MAXPLAYERS), cv_maxplayers.value));
netbuffer->u.servercfg.allownewplayer = cv_allownewplayer.value;
@@ -1968,12 +1973,16 @@ static boolean SV_SendServerConfig(INT32 node)
memcpy(netbuffer->u.servercfg.server_context, server_context, 8);
#ifdef PHOBOS_BUILD
const size_t len = sizeof(serverconfig_pak);
#else
op = p = netbuffer->u.servercfg.varlengthinputs;
CV_SavePlayerNames(&p);
CV_SaveNetVars(&p, false);
const size_t len = sizeof (serverconfig_pak) + (size_t)(p - op);
#endif
#ifdef DEBUGFILE
if (debugfile)
@@ -3338,6 +3347,7 @@ static void Command_connect(void)
return;
}
// StarManiaKG: allow us to join servers from anywhere at any time //
if (Playing() || demo.title || demo.playback)
{
if (demo.title || demo.playback)
@@ -3356,7 +3366,9 @@ static void Command_connect(void)
D_StartTitle();
}
else
{
M_ClearMenus(true); // close the menus
}
// modified game check: no longer handled
// we don't request a restart unless the filelist differs
@@ -3372,37 +3384,52 @@ static void Command_connect(void)
}
else
{
// used in menu to connect to a server in the list
if (netgame && fasticmp(COM_Argv(1), "node"))
// Get the server node.
if (netgame)
{
servernode = (SINT8)atoi(COM_Argv(2));
}
else if (netgame)
{
CONS_Printf(M_GetText("You cannot connect while in a game. End this game first.\n"));
return;
}
else if (I_NetOpenSocket)
{
I_NetOpenSocket();
netgame = true;
multiplayer = true;
if (fasticmp(COM_Argv(1), "any"))
servernode = BROADCASTADDR;
else if (I_NetMakeNodewPort && COM_Argc() >= 3)
servernode = I_NetMakeNodewPort(COM_Argv(1), COM_Argv(2));
else if (I_NetMakeNodewPort)
servernode = I_NetMakeNode(COM_Argv(1));
// used in menu to connect to a server in the list
if (fasticmp(COM_Argv(1), "node"))
{
servernode = (SINT8)atoi(COM_Argv(2));
}
else
{
CONS_Alert(CONS_ERROR, M_GetText("There is no server identification with this network driver\n"));
D_CloseConnection();
return;
D_QuitNetGame();
CL_Reset();
D_StartTitle();
}
}
else
CONS_Alert(CONS_ERROR, M_GetText("There is no network driver\n"));
{
// Standard behaviour
if (I_NetOpenSocket)
{
I_NetOpenSocket();
netgame = true;
multiplayer = true;
if (fasticmp(COM_Argv(1), "any"))
servernode = BROADCASTADDR;
else if (I_NetMakeNodewPort)
{
if (COM_Argc() >= 3) // address AND port
servernode = I_NetMakeNodewPort(COM_Argv(1), COM_Argv(2));
else // address only, or address:port
servernode = I_NetMakeNode(COM_Argv(1));
}
else
{
CONS_Alert(CONS_ERROR, M_GetText("There is no server identification with this network driver\n"));
D_CloseConnection();
return;
}
}
else
{
CONS_Alert(CONS_ERROR, M_GetText("There is no network driver\n"));
return;
}
}
// invalid address
if (servernode == -1)
@@ -3449,6 +3476,7 @@ static void ResetNode(INT32 node);
//
void CL_ClearPlayer(INT32 playernum)
{
// Handle mobj_t pointers.
if (players[playernum].mo)
{
// Don't leave a NiGHTS ghost!
@@ -3457,6 +3485,7 @@ void CL_ClearPlayer(INT32 playernum)
P_RemoveMobj(players[playernum].mo);
}
// Wipe the struct.
memset(&players[playernum], 0, sizeof(player_t));
}
@@ -5165,7 +5194,7 @@ static void PT_ServerInfo(SINT8 node)
const tic_t ticthen = (tic_t)LONG(netbuffer->u.serverinfo.time);
const tic_t ticdiff = (ticnow - ticthen)*1000/NEWTICRATE;
netbuffer->u.serverinfo.time = (tic_t)LONG(ticdiff);
netbuffer->u.serverinfo.servername[MAXSERVERNAME-1] = 0;
netbuffer->u.serverinfo.servername[MAXSERVERNAME-1] = '\0';
netbuffer->u.serverinfo.application
[sizeof netbuffer->u.serverinfo.application - 1] = '\0';
memcpy(servername, netbuffer->u.serverinfo.servername, MAXSERVERNAME);
@@ -5414,8 +5443,10 @@ static void PT_ServerRefuse(SINT8 node)
// Positive response of client join request
static void PT_ServerCFG(SINT8 node)
{
#ifndef PHOBOS_BUILD
INT32 j;
UINT8 *scp;
#endif
if (server && serverrunning && node != servernode)
{ // but wait I thought I'm the server?
@@ -5438,8 +5469,10 @@ static void PT_ServerCFG(SINT8 node)
if ((gametype = netbuffer->u.servercfg.gametype) >= NUMGAMETYPES)
I_Error("Bad gametype %d in cliserv!", gametype);
modifiedgame = netbuffer->u.servercfg.modifiedgame;
#ifndef PHOBOS_BUILD
for (j = 0; j < MAXPLAYERS; j++)
adminplayers[j] = netbuffer->u.servercfg.adminplayers[j];
#endif
memcpy(server_context, netbuffer->u.servercfg.server_context, 8);
}
@@ -5465,6 +5498,7 @@ static void PT_ServerCFG(SINT8 node)
SendSaturnInfo(node);
#endif
#ifndef PHOBOS_BUILD
memset(playeringame, 0, sizeof(playeringame));
for (j = 0; j < MAXPLAYERS; j++)
@@ -5481,6 +5515,7 @@ static void PT_ServerCFG(SINT8 node)
scp = netbuffer->u.servercfg.varlengthinputs;
CV_LoadPlayerNames(&scp);
scp += CV_LoadNetVars(scp);
#endif
/// \note Wait. What if a Lua script uses some global custom variables synched with the NetVars hook?
/// Shouldn't them be downloaded even at intermission time?
@@ -7238,6 +7273,7 @@ static void DedicatedIdleUpdate(INT32 *realtics)
{
CONS_Printf("DEDICATED: Awakening from idle (Player detected...)\n");
}
dedicatedidle = 0;
}
}
+8 -2
View File
@@ -339,13 +339,17 @@ typedef struct
UINT8 clientnode;
UINT8 gamestate;
#ifndef PHOBOS_BUILD
// 0xFF == not in game; else player skin num
UINT8 playerskins[MAXPLAYERS];
UINT8 playercolor[MAXPLAYERS];
#endif
UINT8 gametype;
UINT8 modifiedgame;
#ifndef PHOBOS_BUILD
SINT8 adminplayers[MAXPLAYERS]; // Needs to be signed
#endif
char server_context[8]; // Unique context id, generated at server startup.
@@ -354,7 +358,9 @@ typedef struct
boolean allownewplayer;
boolean discordinvites;
#ifndef PHOBOS_BUILD
UINT8 varlengthinputs[0]; // Playernames and netvars
#endif
} ATTRPACK serverconfig_pak;
typedef struct {
@@ -444,7 +450,7 @@ typedef struct
char name[MAXPLAYERNAME+1];
UINT8 address[4]; // sending another string would run us up against MAXPACKETLENGTH
UINT8 team;
UINT8 skin;
skinnum_t skin;
UINT8 data; // Color is first four bits, hasflag, isit and issuper have one bit each, the last is unused.
UINT32 score;
UINT16 timeinserver; // In seconds.
@@ -454,7 +460,7 @@ typedef struct
typedef struct
{
char name[MAXPLAYERNAME+1];
UINT8 skin;
skinnum_t skin;
UINT8 color;
UINT32 pflags;
UINT32 score;
+67 -4
View File
@@ -147,6 +147,11 @@ static void Command_Addfilelocal(void);
static void Command_Addfile(void);
static void Command_Addskins(void);
static void Command_GLocalSkin(void);
static void SetPrefcolor(int splitplayer);
static void Command_UsePrefcolor(void);
static void Command_UsePrefcolor2(void);
static void Command_UsePrefcolor3(void);
static void Command_UsePrefcolor4(void);
static void Command_ListWADS_f(void);
static void Command_LocateLump_f(void);
static void Command_ListDoomednums_f(void);
@@ -435,10 +440,18 @@ consvar_t cv_pointlimit = {"pointlimit", "0", CV_NETVAR|CV_CALL|CV_NOINIT, point
static CV_PossibleValue_t timelimit_cons_t[] = {{0, "MIN"}, {30, "MAX"}, {0, NULL}};
consvar_t cv_timelimit = {"timelimit", "0", CV_NETVAR|CV_CALL|CV_NOINIT, timelimit_cons_t,
TimeLimit_OnChange, 0, NULL, NULL, 0, 0, NULL};
#ifdef PHOBOS_BUILD
static CV_PossibleValue_t numlaps_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, NULL}};
#else
static CV_PossibleValue_t numlaps_cons_t[] = {{1, "MIN"}, {50, "MAX"}, {0, NULL}};
#endif
consvar_t cv_numlaps = {"numlaps", "3", CV_NETVAR|CV_CALL|CV_NOINIT, numlaps_cons_t,
NumLaps_OnChange, 0, NULL, NULL, 0, 0, NULL};
#ifdef PHOBOS_BUILD
static CV_PossibleValue_t basenumlaps_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, "Map default"}, {0, NULL}};
#else
static CV_PossibleValue_t basenumlaps_cons_t[] = {{1, "MIN"}, {50, "MAX"}, {0, "Map default"}, {0, NULL}};
#endif
consvar_t cv_basenumlaps = {"basenumlaps", "Map default", CV_NETVAR|CV_CALL|CV_CHEAT, basenumlaps_cons_t, BaseNumLaps_OnChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_forceskin = {"forceskin", "Off", CV_NETVAR|CV_CALL|CV_CHEAT, Forceskin_cons_t, ForceSkin_OnChange, 0, NULL, NULL, 0, 0, NULL};
@@ -858,6 +871,11 @@ void D_RegisterClientCommands(void)
COM_AddCommand("localskin", Command_GLocalSkin);
COM_AddCommand("useprefcolor", Command_UsePrefcolor);
COM_AddCommand("useprefcolor2", Command_UsePrefcolor2);
COM_AddCommand("useprefcolor3", Command_UsePrefcolor3);
COM_AddCommand("useprefcolor4", Command_UsePrefcolor4);
K_RegisterClientKartStuff(); // SRB2kart
CV_RegisterVar(&cv_screenshot_option);
@@ -1681,7 +1699,8 @@ static void SendNameAndColor(UINT8 splitplayer)
// Finally write out the complete packet and send it off.
WRITESTRINGN(p, playername->zstring, MAXPLAYERNAME);
WRITEUINT8(p, (UINT8)playercolor->value);
WRITEUINT8(p, (UINT8)playerskin->value);
WRITESKIN(p, (skinnum_t)playerskin->value);
SendNetXCmdForPlayer(splitplayer, XD_NAMEANDCOLOR, buf, p - buf);
}
@@ -1689,7 +1708,8 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
{
player_t *player;
char name[MAXPLAYERNAME+1] = {};
UINT8 color, skin;
UINT8 color;
skinnum_t skin;
#ifdef PARANOIA
if (playernum < 0 || playernum > MAXPLAYERS)
@@ -1711,7 +1731,7 @@ static void Got_NameAndColor(const UINT8 **cp, INT32 playernum)
READSTRINGN(*cp, name, MAXPLAYERNAME);
color = READUINT8(*cp);
skin = READUINT8(*cp);
skin = READSKIN(*cp);
// set name
if (player_name_changes[playernum] < MAXNAMECHANGES)
@@ -4324,6 +4344,49 @@ static void Command_GLocalSkin(void)
}
}
static void SetPrefcolor(int splitplayer)
{
// splitscreen
if (splitscreen < splitplayer)
return;
const INT32 pnum = P_GetLocalPlayerNumForNum(splitplayer);
player_t *player = &players[pnum];
consvar_t *colorvars[] = {&cv_playercolor, &cv_playercolor2, &cv_playercolor3, &cv_playercolor4};
consvar_t *playercolor = colorvars[splitplayer];
if (skins[player->skin].prefcolor)
{
CV_SetValue(playercolor, skins[player->skin].prefcolor);
CONS_Printf("Set color to %s%s\n", HU_SkinColorToConsoleColor(skins[player->skin].prefcolor), KartColor_Names[skins[player->skin].prefcolor]);
}
else
{
CONS_Printf("\x86Your skin has no prefcolor set\n");
}
}
static void Command_UsePrefcolor(void)
{
SetPrefcolor(0);
}
static void Command_UsePrefcolor2(void)
{
SetPrefcolor(1);
}
static void Command_UsePrefcolor3(void)
{
SetPrefcolor(2);
}
static void Command_UsePrefcolor4(void)
{
SetPrefcolor(3);
}
static void Got_RequestAddfilecmd(const UINT8 **cp, INT32 playernum)
{
char filename[241];
@@ -4371,7 +4434,7 @@ static void Got_RequestAddfilecmd(const UINT8 **cp, INT32 playernum)
else
snprintf(message, sizeof(message), M_GetText("Unknown error finding wad file (%s)\n"), filename);
CONS_Printf("%s",message);
CONS_Printf("%s", message);
for (j = 0; j < MAXPLAYERS; j++)
if (adminplayers[j])
+29 -14
View File
@@ -128,10 +128,24 @@ extern char logfilename[1024];
// most interface strings are ignored in development mode.
// we use comprevision and compbranch instead.
#else
#ifdef PHOBOS_BUILD
#define VERSION 1 // Game version
#define SUBVERSION 69 // more precise version number
#else
#define VERSION 1 // Game version
#define SUBVERSION 6 // more precise version number
#define VERSIONSTRING "Saturn v10"
#define VERSIONSTRINGW L"Saturn v10"
#endif
#ifdef PHOBOS_BUILD
#define CLIENTNAME "Phobos"
#define CLIENTNAMEW L"Phobos"
#else
#define CLIENTNAME "Saturn"
#define CLIENTNAMEW L"Saturn"
#endif
#define VERSIONSTRING CLIENTNAME " v10.1"
#define VERSIONSTRINGW CLIENTNAMEW L" v10.1"
#define SATURN_TESTING // comment out for saturn release builds!
@@ -602,11 +616,19 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
// None of these that are disabled in the normal build are guaranteed to work perfectly
// Compile them at your own risk!
// undefine to enable fixes and features that are not vanilla compatible
#define COMPAT_VANILLA
// if we build with 32 player (or more or less!) support we dont need to care about vanilla compat
#if MAXPLAYERS != 16
#undef COMPAT_VANILLA
#ifdef PHOBOS_BUILD
// we want 32 players yesss
#undef MAXPLAYERS
#define MAXPLAYERS 32
// raise skinlimit to 1024
#undef MAXSKINS
#define MAXSKINS 1024
// overwrite some of those
// when not compiling in vanilla compat mode
#define SATURNJOIN
#define SATURNPAK
#endif
//-- SATURN __
@@ -673,13 +695,6 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
#undef UPDATE_ALERT
#endif
// overwrite some of those
// when not compiling in vanilla compat mode
#ifndef COMPAT_VANILLA
#define SATURNJOIN
#define SATURNPAK
#endif
#ifdef __cplusplus
} // extern "C"
#endif
+6
View File
@@ -42,6 +42,12 @@ extern "C" {
#define INT64 int64_t
#define UINT64 uint64_t
#ifdef PHOBOS_BUILD
typedef uint16_t skinnum_t;
#else
typedef uint8_t skinnum_t;
#endif
#ifdef __APPLE_CC__
#define DEBUG_LOG
#define NOIPX
+3 -1
View File
@@ -2335,7 +2335,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
while (READUINT8(extrainfo_p) == DW_STANDING) // Assume standings are always first in the extrainfo
{
INT32 i;
char temp[16];
char temp[17];
pdemo->standings[count].ranking = READUINT8(extrainfo_p);
@@ -2345,6 +2345,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
// Skin
memcpy(temp, extrainfo_p, 16);
temp[16] = '\0';
extrainfo_p += 16;
pdemo->standings[count].skin = UINT8_MAX;
@@ -2359,6 +2360,7 @@ void G_LoadDemoInfo(menudemo_t *pdemo)
// Color
memcpy(temp, extrainfo_p, 16);
temp[16] = '\0';
extrainfo_p += 16;
for (i = 0; i < MAXSKINCOLORS; i++)
+2 -1
View File
@@ -82,7 +82,8 @@ typedef struct menudemo_s {
struct {
UINT8 ranking;
char name[17];
UINT8 skin, color;
skinnum_t skin;
UINT8 color;
UINT32 timeorscore;
} standings[MAXPLAYERS];
} menudemo_t;
+1 -1
View File
@@ -63,7 +63,7 @@ gameaction_t gameaction = 0;
gamestate_t gamestate = GS_NULL;
boolean botingame = false;
UINT8 botskin = 0;
skinnum_t botskin = 0;
UINT8 botcolor = 0;
// SRB2kart
+2 -1
View File
@@ -55,6 +55,7 @@ extern gamestate_t gamestate;
extern gameaction_t gameaction;
extern boolean botingame;
extern UINT8 botskin, botcolor;
extern skinnum_t botskin;
extern UINT8 botcolor;
#endif //__G_STATE__
+5 -5
View File
@@ -35,7 +35,7 @@ static int finalVertexArrayAllocSize = 65536;
// not gonna use this for now, just sort by color and change state when it changes
// later maybe when using vertex attributes if it's needed
static PolygonArrayEntry* polygonArray = NULL ;// contains the polygon data from DrawPolygon, waiting to be processed
static PolygonArrayEntry* polygonArray = NULL; // contains the polygon data from DrawPolygon, waiting to be processed
static PolygonArrayEntry **polygonArraySorted = NULL; // contains sorted pointers to polygonArray
static int polygonArraySize = 0;
static int polygonArrayAllocSize = 65536;
@@ -171,8 +171,8 @@ static int comparePolygons(const void *p1, const void *p2)
// special case with signedness to prevent overflowing
// FIXME: check for prediction slowdowns!
const int shader1 = poly1->hash & 0x80000000 ? -1 : poly1->shader;
const int shader2 = poly2->hash & 0x80000000 ? -1 : poly2->shader;
const int shader1 = (poly1->hash & 0x80000000) ? -1 : poly1->shader;
const int shader2 = (poly2->hash & 0x80000000) ? -1 : poly2->shader;
// skywalls and horizon lines must retain their order for horizon lines to work
if (shader1 == -1 && shader2 == -1)
@@ -214,8 +214,8 @@ static int comparePolygonsNoShaders(const void *p1, const void *p2)
const PolygonArrayEntry *poly1 = *(PolygonArrayEntry *const *)p1;
const PolygonArrayEntry *poly2 = *(PolygonArrayEntry *const *)p2;
const GLMipmap_t *texture1 = poly1->hash & 0x80000000 ? NULL : poly1->texture;
const GLMipmap_t *texture2 = poly2->hash & 0x80000000 ? NULL : poly2->texture;
const GLMipmap_t *texture1 = (poly1->hash & 0x80000000) ? NULL : poly1->texture;
const GLMipmap_t *texture2 = (poly2->hash & 0x80000000) ? NULL : poly2->texture;
// skywalls and horizon lines must retain their order for horizon lines to work
if (!texture1 && !texture2)
+19 -1
View File
@@ -624,13 +624,26 @@ static void HWR_PrecacheLevelFlats(void)
{
// lookup for flats that may´ve been already loaded
flatcheck flatpresent;
size_t i, j;
size_t i;
#if 0
size_t j;
#endif
INT32 k;
// this kinda messes up encore remapping behavior at times
// so just disable it for now ig
#ifdef GLENCORE
if (encoremap)
{
return;
}
#endif
flatcheck_init(&flatpresent);
flatcheck_reserve(&flatpresent, numlevelflats);
// special case for encore
#if 0
#ifdef GLENCORE
if (encoremap)
{
@@ -670,6 +683,7 @@ static void HWR_PrecacheLevelFlats(void)
}
}
else
#endif
#endif
{
// on non encore we have it simple
@@ -1315,6 +1329,7 @@ void HWR_SetPalette(RGBA_t *palette)
crushed_palette[i].s.blue = (UINT8)(fblue / 31.0f * 255.0f);
crushed_palette[i].s.alpha = 255;
}
GL_SetScreenPalette(crushed_palette);
}
else
@@ -1392,6 +1407,7 @@ void HWR_SetMapPalette(void)
I_Error("HWR_SetMapPalette: A programmer assumed palette lumps are at least 768 bytes long, but apparently this was a wrong assumption!\n");
RGB_data = (UINT8 *)(W_CacheLumpNum(lumpnum, PU_CACHE));
// we got the RGB palette now, but we need it in RGBA format.
for (i = 0; i < 256; i++)
{
@@ -1400,6 +1416,7 @@ void HWR_SetMapPalette(void)
RGBA_converted[i].s.blue = *(RGB_data++);
RGBA_converted[i].s.alpha = 255;
}
palette = RGBA_converted;
}
@@ -1407,6 +1424,7 @@ void HWR_SetMapPalette(void)
if (memcmp(mapPalette, palette, sizeof(mapPalette)))
{
memcpy(mapPalette, palette, sizeof(mapPalette));
// in palette rendering mode, this means that all rgba textures now have wrong colors
// and the lookup table is outdated
HWR_SetPaletteLookup(mapPalette);
+19 -15
View File
@@ -1236,7 +1236,7 @@ static void HWR_DrawSkyWall(FOutVector *wallVerts, FSurfaceInfo *Surf)
// Returns true if the midtexture is visible, and false if... it isn't...
static inline boolean HWR_BlendMidtextureSurface(FSurfaceInfo *pSurf)
{
FUINT blendmode = PF_Masked | PF_Translucent;
FUINT blendmode = PF_Masked;
pSurf->PolyColor.s.alpha = 0xFF;
@@ -2662,11 +2662,13 @@ static void HWR_AddPolyObjectPlanes(void)
polyobjsector = po_ptrs[i]->lines[0]->backsector; // the in-level polyobject sector
if (polyobjsector->floorheight <= gl_frontsector->ceilingheight
&& polyobjsector->floorheight >= gl_frontsector->floorheight
&& (viewz < polyobjsector->floorheight))
if (polyobjsector->floorheight <= gl_frontsector->ceilingheight &&
polyobjsector->floorheight >= gl_frontsector->floorheight &&
(viewz < polyobjsector->floorheight))
{
light = R_GetPlaneLight(gl_frontsector, polyobjsector->floorheight, true);
const INT16 llevel = (light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel);
extracolormap_t *colmap = (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap);
if (po_ptrs[i]->translucency > 0)
{
@@ -2674,22 +2676,24 @@ static void HWR_AddPolyObjectPlanes(void)
FBITFIELD blendmode;
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->floorpic].lumpnum, po_ptrs[i], false, polyobjsector->floorheight,
(light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), Surf.PolyColor.s.alpha, polyobjsector, blendmode, (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap));
llevel, Surf.PolyColor.s.alpha, polyobjsector, blendmode, colmap);
}
else
{
HWR_GetFlat(levelflats[polyobjsector->floorpic].lumpnum, R_NoEncore(polyobjsector, false));
HWR_RenderPolyObjectPlane(po_ptrs[i], false, polyobjsector->floorheight, PF_Occlude,
(light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), levelflats[polyobjsector->floorpic].lumpnum,
polyobjsector, 255, (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap));
llevel, levelflats[polyobjsector->floorpic].lumpnum,
polyobjsector, 255, colmap);
}
}
if (polyobjsector->ceilingheight >= gl_frontsector->floorheight
&& polyobjsector->ceilingheight <= gl_frontsector->ceilingheight
&& (viewz > polyobjsector->ceilingheight))
if (polyobjsector->ceilingheight >= gl_frontsector->floorheight &&
polyobjsector->ceilingheight <= gl_frontsector->ceilingheight &&
(viewz > polyobjsector->ceilingheight))
{
light = R_GetPlaneLight(gl_frontsector, polyobjsector->ceilingheight, true);
const INT16 llevel = (light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel);
extracolormap_t *colmap = (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap);
if (po_ptrs[i]->translucency > 0)
{
@@ -2697,14 +2701,14 @@ static void HWR_AddPolyObjectPlanes(void)
FBITFIELD blendmode;
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->ceilingpic].lumpnum, po_ptrs[i], true, polyobjsector->ceilingheight,
(light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), Surf.PolyColor.s.alpha, polyobjsector, blendmode, (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap));
llevel, Surf.PolyColor.s.alpha, polyobjsector, blendmode, colmap);
}
else
{
HWR_GetFlat(levelflats[polyobjsector->ceilingpic].lumpnum, R_NoEncore(polyobjsector, true));
HWR_RenderPolyObjectPlane(po_ptrs[i], true, polyobjsector->ceilingheight, PF_Occlude,
(light == -1 ? gl_frontsector->lightlevel : *gl_frontsector->lightlist[light].lightlevel), levelflats[polyobjsector->ceilingpic].lumpnum,
polyobjsector, 255, (light == -1 ? gl_frontsector->extra_colormap : gl_frontsector->lightlist[light].extra_colormap));
llevel, levelflats[polyobjsector->ceilingpic].lumpnum,
polyobjsector, 255, colmap);
}
}
}
@@ -3717,7 +3721,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
Surf.PolyColor.s.alpha = alpha;
HWR_ProcessPolygon(&Surf, wallVerts, 4, blend|PF_Modulated, shader, false); // sprite shader
HWR_ProcessPolygon(&Surf, wallVerts, 4, blend|PF_Modulated, shader, false);
top = bot;
endtop = endbot;
@@ -3744,7 +3748,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr, const boolean papersprite)
Surf.PolyColor.s.alpha = alpha;
HWR_ProcessPolygon(&Surf, wallVerts, 4, blend|PF_Modulated, shader, false); // sprite shader
HWR_ProcessPolygon(&Surf, wallVerts, 4, blend|PF_Modulated, shader, false);
}
// -----------------+
+2 -1
View File
@@ -1931,6 +1931,7 @@ static void GenerateMipmaps(INT32 w, INT32 h, RGBA_t *tex, INT32 maxLOD, UINT32
{
if (samplePoint[p].s.alpha == 0)
continue;
sumR += samplePoint[p].s.red;
sumG += samplePoint[p].s.green;
sumB += samplePoint[p].s.blue;
@@ -3282,7 +3283,7 @@ static void GL_Framebuffer_Generate(void)
{
pglGenTextures(1, &framebufferobject.tex);
pglBindTexture(GL_TEXTURE_2D, framebufferobject.tex);
pglTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screen_width, screen_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
pglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, screen_width, screen_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Clamp2D(GL_TEXTURE_WRAP_S);
+5 -8
View File
@@ -472,9 +472,7 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
strlcat(msg, COM_Argv(ix + usedargs), msgspace);
}
const size_t msglength = strlen(msg);
if (msglength > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
if (strlen(msg) > 4 && strnicmp(msg, "/pm", 3) == 0) // used /pm
{
// what we're gonna do now is check if the node exists
// with that logic, characters 4 and 5 are our numbers:
@@ -528,7 +526,7 @@ static void DoSayCommand(SINT8 target, size_t usedargs, UINT8 flags)
strlcpy(msg, newmsg, HU_MAXMSGLEN + 1);
}
SendNetXCmd(XD_SAY, buf, msglength + 1 + msg-buf);
SendNetXCmd(XD_SAY, buf, strlen(msg) + 1 + msg-buf);
}
/** Send a message to everyone.
@@ -779,12 +777,11 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
return;
}
const size_t msglength = strlen(msg);
//check for invalid characters (0x80 or above)
{
size_t i;
const size_t j = msglength;
const size_t j = strlen(msg);
for (i = 0; i < j; i++)
{
if (msg[i] & 0x80)
@@ -831,7 +828,7 @@ static void Got_Saycmd(const UINT8 **p, INT32 playernum)
}
// Handle "/me" actions, but only in messages to everyone.
if (target == 0 && msglength > 4 && strnicmp(msg, "/me ", 4) == 0)
if (target == 0 && strlen(msg) > 4 && strnicmp(msg, "/me ", 4) == 0)
{
msg += 4;
action = true;
+3 -3
View File
@@ -452,10 +452,10 @@ void A_SpawnFreshCopy(void *actor);
extern boolean actionsoverridden[NUMACTIONS];
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
#ifdef COMPAT_VANILLA
#define NUMMOBJFREESLOTS 1024
#else
#ifdef PHOBOS_BUILD
#define NUMMOBJFREESLOTS 4096 // should be sufficient
#else
#define NUMMOBJFREESLOTS 1024
#endif
#define NUMSPRITEFREESLOTS NUMMOBJFREESLOTS
#define NUMSTATEFREESLOTS (NUMMOBJFREESLOTS*8)
+32 -4
View File
@@ -4337,7 +4337,6 @@ static void K_DoShrink(player_t *user)
}
}
void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
{
if (mo->player && mo->player->spectator)
@@ -4400,8 +4399,7 @@ void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source)
mobj_t *cachenext;
killnext:
if (!banana)
if (P_MobjWasRemovedCompat(banana))
return;
cachenext = banana->hnext;
@@ -4440,10 +4438,21 @@ void K_UpdateHnextList(player_t *player, boolean clean)
nextwork = work->hnext;
if (!clean && (!work->movedir || work->movedir <= (UINT16)player->kartstuff[k_itemamount]))
{
continue;
}
P_RemoveMobj(work);
}
#ifdef PHOBOS_BUILD
if (P_MobjWasRemoved(player->mo->hnext))
{
// Like below, try to clean up the pointer if it's NULL.
// Maybe this was a cause of the shrink/eggbox fails?
P_SetTarget(&player->mo->hnext, NULL);
}
#endif
}
// For getting hit!
@@ -4508,7 +4517,9 @@ void K_DropHnextList(player_t *player)
}
dropwork = P_SpawnMobj(work->x, work->y, work->z, type);
P_SetTarget(&dropwork->target, player->mo);
dropwork->angle = work->angle;
dropwork->flags2 = work->flags2;
dropwork->flags |= MF_NOCLIPTHING;
@@ -4576,10 +4587,13 @@ void K_DropHnextList(player_t *player)
// we need this here too because this is done in afterthink - pointers are cleaned up at the START of each tic...
P_SetTarget(&player->mo->hnext, NULL);
player->kartstuff[k_bananadrag] = 0;
if (player->kartstuff[k_eggmanheld])
{
player->kartstuff[k_eggmanheld] = 0;
}
else if (player->kartstuff[k_itemheld]
&& (dropall || (--player->kartstuff[k_itemamount] <= 0)))
{
@@ -4880,7 +4894,9 @@ static void K_MoveHeldObjects(player_t *player)
player->kartstuff[k_bananadrag] = 0;
if (player->kartstuff[k_eggmanheld])
{
player->kartstuff[k_eggmanheld] = 0;
}
else if (player->kartstuff[k_itemheld])
{
player->kartstuff[k_itemamount] = player->kartstuff[k_itemheld] = 0;
@@ -4897,7 +4913,9 @@ static void K_MoveHeldObjects(player_t *player)
player->kartstuff[k_bananadrag] = 0;
if (player->kartstuff[k_eggmanheld])
{
player->kartstuff[k_eggmanheld] = 0;
}
else if (player->kartstuff[k_itemheld])
{
player->kartstuff[k_itemamount] = player->kartstuff[k_itemheld] = 0;
@@ -4913,7 +4931,12 @@ static void K_MoveHeldObjects(player_t *player)
case MT_JAWZ_SHIELD:
{
mobj_t *cur = player->mo->hnext;
fixed_t speed = ((8 - min(4, player->kartstuff[k_itemamount])) * cur->info->speed) / 7;
fixed_t speed = 0;
if (cur == NULL)
return;
speed = ((8 - min(4, player->kartstuff[k_itemamount])) * cur->info->speed) / 7;
player->kartstuff[k_bananadrag] = 0; // Just to make sure
@@ -4960,8 +4983,13 @@ static void K_MoveHeldObjects(player_t *player)
cur->flags &= ~MF_NOCLIPTHING;
if (!P_TryMove(cur, player->mo->x + cur->momx, player->mo->y + cur->momy, true))
{
P_SlideMove(cur, true);
if (P_MobjWasRemovedCompat(cur))
continue;
}
if (P_IsObjectOnGround(player->mo))
{
if (P_MobjFlip(cur) > 0)
+19 -10
View File
@@ -62,14 +62,6 @@ static lua_CFunction liblist[] = {
NULL
};
// Lua asks for memory using this.
static void *LUA_Alloc(void *ud, void *ptr, size_t osize, size_t nsize)
{
(void)ud;
(void)osize;
return Z_Realloc(ptr, nsize, PU_LUA, NULL);
}
// Panic function Lua calls when there's an unprotected error.
// This function cannot return. Lua would kill the application anyway if it did.
FUNCNORETURN static int LUA_Panic(lua_State *L)
@@ -197,7 +189,7 @@ void LUA_ClearState(void)
CONS_Printf(M_GetText("Pardon me while I initialize the Lua scripting interface...\n"));
// allocate state
L = lua_newstate(LUA_Alloc, NULL);
L = luaL_newstate();
lua_atpanic(L, LUA_Panic);
// open base libraries
@@ -373,7 +365,7 @@ void LUA_DumpFile(const char *filename)
static void createMathLibState(void)
{
mL = lua_newstate(LUA_Alloc, NULL);
mL = luaL_newstate();
lua_atpanic(mL, LUA_Panic);
// open only enum lib
@@ -623,6 +615,10 @@ void LUA_InvalidateLevel(void)
LUA_InvalidateUserdata(&slope->o);
LUA_InvalidateUserdata(&slope->d);
}
// We invalidated a lot of userdata objects, a lot of them probably ended up unreachable so they can be
// GC'd right away
lua_gc(gL, LUA_GCCOLLECT, 0);
}
void LUA_InvalidateMapthings(void)
@@ -1461,3 +1457,16 @@ int Lua_CreateFieldTable(lua_State *L, const char *const lst[])
return luaL_ref(L, LUA_REGISTRYINDEX);
}
size_t LUA_MemoryUsage(void)
{
size_t usage = 0;
if (gL)
usage += lua_gc(gL, LUA_GCCOUNT, 0);
if (mL)
usage += lua_gc(mL, LUA_GCCOUNT, 0);
return usage;
}
+3
View File
@@ -82,6 +82,9 @@ int Lua_optoption(lua_State *L, int narg, int def, int list_ref);
int Lua_CreateFieldTable(lua_State *L, const char *const lst[]);
void LUA_HookNetArchive(lua_CFunction archFunc, savebuffer_t *save);
// Returns lua memory usage in kbytes
size_t LUA_MemoryUsage(void);
// Console wrapper
void COM_Lua_f(void);
+120 -101
View File
@@ -6451,7 +6451,7 @@ static void M_ChooseTimeAttack(INT32 choice)
else
G_RecordDemo(nameofdemo);
G_DeferedInitNew(false, mapname, (UINT8)(cv_chooseskin.value-1), 0, false);
G_DeferedInitNew(false, mapname, (skinnum_t)(cv_chooseskin.value-1), 0, false);
}
static void M_HandleStaffReplay(INT32 choice)
@@ -7667,7 +7667,7 @@ static void M_DrawMPMainMenu(void)
{
char buf[28];
strlcpy(buf, setupm_ip, sizeof(buf));
V_DrawString(x+8,y+12, V_ALLOWLOWERCASE, buf);
V_DrawString(x+8, y+12, V_ALLOWLOWERCASE, buf);
}
else
M_DrawTextInputScroll(x+8, y+12, &setupm_input_ip, 0, SETUPM_IP_MAXSIZE);
@@ -7677,7 +7677,7 @@ static void M_DrawMPMainMenu(void)
#define iconwidth 32
#define spacingwidth 32
#define incrwidth (iconwidth + spacingwidth)
UINT8 i = 0, pskin, pcol;
UINT16 i = 0, pskin, pcol;
// player arrangement width, but there's also a chance i'm a furry, shhhhhh
const INT32 paw = iconwidth + 3*incrwidth;
INT32 trans = 0;
@@ -7930,16 +7930,16 @@ static void M_DrawSetupMultiPlayerMenu(void)
spritedef_t *sprdef;
spriteframe_t *sprframe;
patch_t *patch;
UINT8 frame;
UINT8 speed;
UINT8 weight;
UINT8 i;
UINT8 s, w;
UINT16 frame;
UINT16 speed;
UINT16 weight;
UINT16 i;
UINT16 s, w;
INT32 skinnum = 0;
INT32 statx, staty;
UINT32 speenframe;
INT32 sltw, actw, hetw;
UINT8 skintodisplay;
skinnum_t skintodisplay;
INT32 nameboxaddy = 0;
const UINT8 *flashcol = V_GetStringColormap(highlightflags);
@@ -7996,7 +7996,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
break;
case SKINMENUTYPE_2D:
skintodisplay = setupm_fakeskin;
skintodisplay = (skinnum_t)setupm_fakeskin;
if (setupm_skinlockedselect) //show the skin we are trying to select
skintodisplay = skinstats[setupm_skinxpos][setupm_skinypos][setupm_skinselect];
else if (skinstatscount[setupm_skinxpos][setupm_skinypos] && itemOn == 1)
@@ -8205,12 +8205,12 @@ static void M_DrawSetupMultiPlayerMenu(void)
case SKINMENUTYPE_EXTENDED:
for (s = 0; s < SKINGRIDNEWWIDTH*SKINGRIDNEWHEIGHT; s++)
{
INT32 x = ((s % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH) - 8) + 100 + SKINXSHIFT; //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + 10); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
INT32 calcs = s + (setupm_skinypos * SKINGRIDNEWWIDTH);
INT32 skinn;
patch_t *face;
UINT8 *cmap;
const INT32 x = ((s % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH) - 8) + 100 + SKINXSHIFT; //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
const INT32 y = ((s / SKINGRIDNEWWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2)) + 10); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
const INT32 calcs = s + (setupm_skinypos * SKINGRIDNEWWIDTH);
if (calcs < numskins)
skinn = skinsorted[calcs];
@@ -8231,10 +8231,10 @@ static void M_DrawSetupMultiPlayerMenu(void)
if (itemOn == 1) //has to be on skin select part
{
patch_t *cursor;
INT32 curx = (((setupm_skinselect % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH/2)) + SKINXSHIFT) + 20;
INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ 10);
const INT32 curx = (((setupm_skinselect % SKINGRIDNEWWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDNEWWIDTH/2)) + SKINXSHIFT) + 20;
const INT32 cury = (((setupm_skinselect / SKINGRIDNEWWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDNEWWIDTH/2))+ 10);
UINT8 cursorframe = (I_GetTime() / 4) % 7;
const UINT8 cursorframe = (I_GetTime() / 4) % 7;
cursor = (patch_t *)W_CachePatchName(va("K_CHILI%d", cursorframe + 1), PU_PATCH);
V_DrawFixedPatch((curx << FRACBITS) - (FRACUNIT), (cury << FRACBITS) - (FRACUNIT), FRACUNIT+(FRACUNIT>>3), 0, cursor, NULL);
}
@@ -8243,9 +8243,9 @@ static void M_DrawSetupMultiPlayerMenu(void)
case SKINMENUTYPE_GRID:
for (s = 0; s < SKINGRIDWIDTH*SKINGRIDHEIGHT; s++)
{
INT32 x = ((s % SKINGRIDWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDWIDTH) - 8) + 100 + SKINXSHIFT; //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
INT32 y = ((s / SKINGRIDWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDWIDTH/2))); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
INT32 calcs = s + (setupm_skinypos * SKINGRIDWIDTH);
const INT32 x = ((s % SKINGRIDWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDWIDTH) - 8) + 100 + SKINXSHIFT; //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
const INT32 y = ((s / SKINGRIDWIDTH) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDWIDTH/2))); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
const INT32 calcs = s + (setupm_skinypos * SKINGRIDWIDTH);
INT16 skinn;
patch_t *face;
UINT8 *cmap;
@@ -8269,36 +8269,44 @@ static void M_DrawSetupMultiPlayerMenu(void)
if (itemOn == 1) //has to be on skin select part
{
patch_t *cursor;
INT32 curx = (((setupm_skinselect % SKINGRIDWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDWIDTH/2)) + SKINXSHIFT) + 20;
INT32 cury = (((setupm_skinselect / SKINGRIDWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDWIDTH/2)));
const INT32 curx = (((setupm_skinselect % SKINGRIDWIDTH) * 18) + ((BASEVIDWIDTH / 2) - (18 * SKINGRIDWIDTH/2)) + SKINXSHIFT) + 20;
const INT32 cury = (((setupm_skinselect / SKINGRIDWIDTH) - setupm_skinypos) * 18) + ((BASEVIDHEIGHT / 2) - (18 * (SKINGRIDWIDTH/2)));
if (setupm_skinselect < numskins)
{
UINT8 *cmap = R_GetTranslationColormap(setupm_skinselect, setupm_fakecolor, GTC_MENUCACHE);
const UINT8 *cmap = R_GetTranslationColormap(setupm_skinselect, setupm_fakecolor, GTC_MENUCACHE);
cursor = facewantprefix[skinsorted[setupm_skinselect]];
V_DrawFixedPatch(((curx-8) << FRACBITS), ((cury-8) << FRACBITS), FRACUNIT, 0, cursor, cmap);
}
else
{
UINT8 cursorframe = (I_GetTime() / 4) % 7;
const UINT8 cursorframe = (I_GetTime() / 4) % 7;
cursor = (patch_t *)W_CachePatchName(va("K_CHILI%d", cursorframe + 1), PU_PATCH);
V_DrawFixedPatch((curx << FRACBITS) - (FRACUNIT), (cury << FRACBITS) - (FRACUNIT), FRACUNIT+(FRACUNIT>>3), 0, cursor, NULL);
}
}
{ // stat dot
INT32 selectedskin = (itemOn == 1 && setupm_skinselect < numskins ? skinsorted[setupm_skinselect] : setupm_fakeskin);
const INT32 selectedskin = (itemOn == 1 && setupm_skinselect < numskins ? skinsorted[setupm_skinselect] : setupm_fakeskin);
speed = skins[selectedskin].kartspeed;
weight = skins[selectedskin].kartweight;
statdot = (patch_t *)W_CachePatchName("K_SDOT1", PU_PATCH);
if (skullAnimCounter < 4) // SRB2Kart: we draw this dot later so that it's not covered if there's multiple skins with the same stats
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, flashcol);
else
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, NULL);
statdot = (patch_t *)W_CachePatchName("K_SDOT2", PU_PATCH); // coloured center
const INT32 x = (((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1);
const INT32 y = (((staty+71) + (weight*4))<<FRACBITS);
statdot = (patch_t *)W_CachePatchName("K_SDOT1", PU_PATCH);
if (skullAnimCounter < 4) // SRB2Kart: we draw this dot later so that it's not covered if there's multiple skins with the same stats
V_DrawFixedPatch(x, y, FRACUNIT>>1, 0, statdot, flashcol);
else
V_DrawFixedPatch(x, y, FRACUNIT>>1, 0, statdot, NULL);
if (setupm_fakecolor)
V_DrawFixedPatch((((statx+46) + (speed*4))<<FRACBITS) + (FRACUNIT>>1), (((staty+71) + (weight*4))<<FRACBITS), FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
{
statdot = (patch_t *)W_CachePatchName("K_SDOT2", PU_PATCH); // coloured center
V_DrawFixedPatch(x, y, FRACUNIT>>1, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
}
}
break;
case SKINMENUTYPE_2D:
@@ -8307,12 +8315,13 @@ static void M_DrawSetupMultiPlayerMenu(void)
{
for (w = 0; w < MAXSTAT; w++)
{
INT32 x = ((s * 18) + ((BASEVIDWIDTH / 2) - (18 * 4)) - 8 + SKINXSHIFT); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
INT32 y = ((w * 18) + ((BASEVIDHEIGHT / 2) - (18 * 4)) - 8); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
INT32 skinn;
patch_t *face;
UINT8 *cmap;
const INT32 x = ((s * 18) + ((BASEVIDWIDTH / 2) - (18 * 4)) - 8 + SKINXSHIFT); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
const INT32 y = ((w * 18) + ((BASEVIDHEIGHT / 2) - (18 * 4)) - 8); //BASEVIDWIDTH / 2 - ((icons + 1) * 24) - 4;
if (!skinstatscount[s][w])
{
V_DrawFill(x, y, 16, 16, 239);
@@ -8330,20 +8339,20 @@ static void M_DrawSetupMultiPlayerMenu(void)
if (itemOn == 1) //has to be on skin select part
{
patch_t *cursor;
INT32 curx = ((setupm_skinxpos * 18) + ((BASEVIDWIDTH / 2) - (18 * 4)) - 8 + SKINXSHIFT);
INT32 cury = ((setupm_skinypos * 18) + ((BASEVIDHEIGHT / 2) - (18 * 4)) - 8);
const INT32 curx = ((setupm_skinxpos * 18) + ((BASEVIDWIDTH / 2) - (18 * 4)) - 8 + SKINXSHIFT);
const INT32 cury = ((setupm_skinypos * 18) + ((BASEVIDHEIGHT / 2) - (18 * 4)) - 8);
if (skinstatscount[setupm_skinxpos][setupm_skinypos])
{
UINT8 *cmap = R_GetTranslationColormap(setupm_skinselect, setupm_fakecolor, GTC_MENUCACHE);
INT32 skinn = skinstats[setupm_skinxpos][setupm_skinypos][(I_GetTime() / TICRATE) % skinstatscount[setupm_skinxpos][setupm_skinypos]];
const UINT8 *cmap = R_GetTranslationColormap(setupm_skinselect, setupm_fakecolor, GTC_MENUCACHE);
const INT32 skinn = skinstats[setupm_skinxpos][setupm_skinypos][(I_GetTime() / TICRATE) % skinstatscount[setupm_skinxpos][setupm_skinypos]];
cursor = facewantprefix[skinn];
V_DrawFixedPatch(((curx-8) << FRACBITS), ((cury-8) << FRACBITS), FRACUNIT, 0, cursor, cmap);
}
else
{
UINT8 cursorframe = (I_GetTime() / 4) % 7;
const UINT8 cursorframe = (I_GetTime() / 4) % 7;
cursor = (patch_t *)W_CachePatchName(va("K_CHILI%d", cursorframe + 1), PU_PATCH);
V_DrawFixedPatch((curx << FRACBITS) - (FRACUNIT), (cury << FRACBITS) - (FRACUNIT), FRACUNIT+(FRACUNIT>>3), 0, cursor, NULL);
}
@@ -8351,18 +8360,26 @@ static void M_DrawSetupMultiPlayerMenu(void)
break;
#undef SKINXSHIFT
default:
speed = skins[setupm_fakeskin].kartspeed;
weight = skins[setupm_fakeskin].kartweight;
{
speed = skins[setupm_fakeskin].kartspeed;
weight = skins[setupm_fakeskin].kartweight;
statdot = (patch_t *)W_CachePatchName("K_SDOT1", PU_PATCH);
if (skullAnimCounter < 4) // SRB2Kart: we draw this dot later so that it's not covered if there's multiple skins with the same stats
V_DrawFixedPatch(((BASEVIDWIDTH - mx - 80) + ((speed-1)*8))<<FRACBITS, ((my+76) + ((weight-1)*8))<<FRACBITS, FRACUNIT, 0, statdot, flashcol);
else
V_DrawFixedPatch(((BASEVIDWIDTH - mx - 80) + ((speed-1)*8))<<FRACBITS, ((my+76) + ((weight-1)*8))<<FRACBITS, FRACUNIT, 0, statdot, NULL);
const INT32 x = ((BASEVIDWIDTH - mx - 80) + ((speed-1)*8))<<FRACBITS;
const INT32 y = ((my+76) + ((weight-1)*8))<<FRACBITS;
statdot = (patch_t *)W_CachePatchName("K_SDOT2", PU_PATCH); // coloured center
if (setupm_fakecolor)
V_DrawFixedPatch(((BASEVIDWIDTH - mx - 80) + ((speed-1)*8))<<FRACBITS, ((my+76) + ((weight-1)*8))<<FRACBITS, FRACUNIT, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
statdot = (patch_t *)W_CachePatchName("K_SDOT1", PU_PATCH);
if (skullAnimCounter < 4) // SRB2Kart: we draw this dot later so that it's not covered if there's multiple skins with the same stats
V_DrawFixedPatch(x, y, FRACUNIT, 0, statdot, flashcol);
else
V_DrawFixedPatch(x, y, FRACUNIT, 0, statdot, NULL);
if (setupm_fakecolor)
{
statdot = (patch_t *)W_CachePatchName("K_SDOT2", PU_PATCH); // coloured center
V_DrawFixedPatch(x, y, FRACUNIT, 0, statdot, R_GetTranslationColormap(0, setupm_fakecolor, GTC_MENUCACHE));
}
}
break;
}
@@ -8376,7 +8393,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
colwidth = colwidth - 10;
INT32 j = -colwidth;
INT16 col = setupm_fakecolor - colwidth;
INT32 col = setupm_fakecolor - colwidth;
INT32 x = mx;
INT32 cw = indexwidth;
UINT8 ch;
@@ -8389,10 +8406,13 @@ static void M_DrawSetupMultiPlayerMenu(void)
cw = charw;
else
cw = indexwidth;
for (ch = 0; ch < 16; ch++)
V_DrawFill(x, my+(cv_skinselectmenu.value?176:162)+ch, cw, 1, colortranslations[col][ch]);
if (++col >= MAXSKINCOLORS)
col -= MAXSKINCOLORS-1;
x += cw;
}
}
@@ -8404,7 +8424,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
{
const INT32 icons = 4;
INT32 k = -icons;
INT16 col = setupm_fakeskin - icons;
INT32 col = setupm_fakeskin - icons;
INT32 x = BASEVIDWIDTH/2 - ((icons+1)*24) - 4;
fixed_t scale = FRACUNIT/2;
INT32 offx = 8, offy = 8;
@@ -8420,6 +8440,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
if (col < 0)
col += numskins;
while (k <= icons)
{
if (!(k++))
@@ -8436,12 +8457,16 @@ static void M_DrawSetupMultiPlayerMenu(void)
offx = 8;
offy = 8;
}
colmap = R_GetTranslationColormap(col, setupm_fakecolor, GTC_MENUCACHE);
V_DrawFixedPatch((x+offx)<<FRACBITS, (my+28+offy)<<FRACBITS, FRACUNIT, 0, face, colmap);
if (scale == FRACUNIT) // bit of a hack
V_DrawFixedPatch((x+offx)<<FRACBITS, (my+28+offy)<<FRACBITS, FRACUNIT, 0, cursor, colmap);
if (++col >= numskins)
col -= numskins;
x += FixedMul(iconwidth<<FRACBITS, 3*scale/2)/FRACUNIT;
}
}
@@ -8467,7 +8492,7 @@ static void M_DrawSetupMultiPlayerMenu(void)
switch (cv_skinselectmenu.value)
{
case SKINMENUTYPE_2D:
skintodisplay = (UINT8)setupm_fakeskin;
skintodisplay = (skinnum_t)setupm_fakeskin;
if (setupm_skinlockedselect) // show the skin we are trying to select
skintodisplay = skinstats[setupm_skinxpos][setupm_skinypos][setupm_skinselect];
else if (skinstatscount[setupm_skinxpos][setupm_skinypos] && itemOn == 1)
@@ -8475,10 +8500,10 @@ static void M_DrawSetupMultiPlayerMenu(void)
break;
case SKINMENUTYPE_EXTENDED:
case SKINMENUTYPE_GRID:
skintodisplay = ((itemOn == 1 && (setupm_skinselect < numskins)) ? skinsorted[setupm_skinselect] : (UINT8)setupm_fakeskin);
skintodisplay = ((itemOn == 1 && (setupm_skinselect < numskins)) ? skinsorted[setupm_skinselect] : (skinnum_t)setupm_fakeskin);
break;
default:
skintodisplay = (UINT8)setupm_fakeskin;
skintodisplay = (skinnum_t)setupm_fakeskin;
break;
}
@@ -8582,6 +8607,7 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
}
else
M_NextOpt();
S_StartSound(NULL, sfx_menu1); // Tails
break;
}
@@ -8608,6 +8634,7 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
{
M_NextOpt();
}
S_StartSound(NULL, sfx_menu1);
}
else if (itemOn == 0)
@@ -8618,9 +8645,11 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
}
else
M_NextOpt();
S_StartSound(NULL, sfx_menu1); // Tails
break;
}
M_NextOpt();
S_StartSound(NULL, sfx_menu1); // Tails
break;
@@ -8638,6 +8667,7 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
}
else
M_PrevOpt();
S_StartSound(NULL, sfx_menu1); // Tails
break;
}
@@ -8656,6 +8686,7 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
{
M_PrevOpt();
}
S_StartSound(NULL, sfx_menu1);
}
else if (itemOn == 2)
@@ -8675,9 +8706,11 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
}
else
M_PrevOpt();
S_StartSound(NULL, sfx_menu1); // Tails
break;
}
M_PrevOpt();
S_StartSound(NULL, sfx_menu1); // Tails
break;
@@ -8696,6 +8729,7 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
setupm_skinselect--;
else
setupm_skinselect = SELECTEDSTATSCOUNT - 1;
S_StartSound(NULL, sfx_menu1);
}
else //player skin
@@ -8728,6 +8762,7 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
else if (cv_skinselectmenu.value == SKINMENUTYPE_EXTENDED)
setupm_skinypos = (((roundedskins/8) - SKINGRIDHEIGHT-2) > 0 ? (roundedskins/8) - SKINGRIDHEIGHT-2 : 0);
}
S_StartSound(NULL, sfx_menu1);
break;
}
@@ -8758,6 +8793,7 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
setupm_skinselect++;
else
setupm_skinselect = 0;
S_StartSound(NULL, sfx_menu1);
}
else //player skin
@@ -8792,6 +8828,7 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
setupm_skinselect = 0;
setupm_skinypos = 0;
}
S_StartSound(NULL, sfx_menu1);
break;
}
@@ -8814,12 +8851,14 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
setupm_skinlockedselect = false;
break;
}
exitmenu = true;
break;
case KEY_BACKSPACE:
if (cv_skinselectmenu.value)
BREAKWHENLOCKED
if (itemOn == 0)
{
M_TextInputHandle(&setupm_input, choice);
@@ -8849,6 +8888,7 @@ static void M_HandleSetupMultiPlayer(INT32 choice)
case KEY_DEL:
if (cv_skinselectmenu.value)
BREAKWHENLOCKED
if (itemOn == 0)
{
M_TextInputHandle(&setupm_input, choice);
@@ -9165,7 +9205,7 @@ static void M_DrawJoystick(void)
compareval4 = cv_usejoystick[3].value;
compareval3 = cv_usejoystick[2].value;
compareval2 = cv_usejoystick[1].value;
compareval = cv_usejoystick[0].value;
compareval = cv_usejoystick[0].value;
#endif
if ((setupcontrolplayer == 4 && (i == compareval4))
@@ -9204,14 +9244,13 @@ void M_SetupJoystickMenu(INT32 choice)
//
// Update cv_usejoystick.string here so that the user can
// properly change this value.
if (i == cv_usejoystick[0].value)
CV_SetValue(&cv_usejoystick[0], i);
if (i == cv_usejoystick[1].value)
CV_SetValue(&cv_usejoystick[1], i);
if (i == cv_usejoystick[2].value)
CV_SetValue(&cv_usejoystick[2], i);
if (i == cv_usejoystick[3].value)
CV_SetValue(&cv_usejoystick[3], i);
for (INT32 f = 0; f < MAXSPLITSCREENPLAYERS; f++)
{
if (i == cv_usejoystick[f].value)
{
CV_SetValue(&cv_usejoystick[f], i);
}
}
#endif
}
@@ -9250,9 +9289,11 @@ static void M_Setup4PJoystickMenu(INT32 choice)
static void M_DoAssignJoystick(UINT8 pnum, INT32 choice)
{
INT32 oldchoice, oldstringchoice;
const int joynum = atoi(cv_usejoystick[pnum].string);
oldchoice = oldstringchoice = joynum > numcontrollers ? joynum : cv_usejoystick[pnum].value;
#define joystrnum (atoi(cv_usejoystick[pnum].string))
#define joyoldchoice ((joystrnum > numcontrollers) ? joystrnum : cv_usejoystick[pnum].value)
oldchoice = oldstringchoice = joyoldchoice;
CV_SetValue(&cv_usejoystick[pnum], choice);
// Just in case last-minute changes were made to cv_usejoystick.value,
@@ -9262,59 +9303,37 @@ static void M_DoAssignJoystick(UINT8 pnum, INT32 choice)
{
CV_SetValue(&cv_usejoystick[pnum], cv_usejoystick[pnum].value);
if (oldchoice > numcontrollers) /* reset this so the comparison is valid*/
// reset this so the comparison is valid
if (oldchoice > numcontrollers)
oldchoice = cv_usejoystick[pnum].value;
if (oldchoice != choice)
{
if (choice && oldstringchoice > numcontrollers) // if we did not select "None", we likely selected a used device
CV_SetValue(&cv_usejoystick[pnum], (oldstringchoice > numcontrollers ? oldstringchoice : oldchoice));
{
CV_SetValue(&cv_usejoystick[pnum], ((oldstringchoice > numcontrollers) ? oldstringchoice : oldchoice));
}
if (oldstringchoice ==
(joynum > numcontrollers ? joynum : cv_usejoystick[pnum].value))
if (oldstringchoice == joyoldchoice)
{
M_StartMessage("This joystick is used by another\n"
"player. Reset the joystick\n"
"for that player first.\n\n"
"(Press a key)\n", NULL, MM_NOTHING);
}
}
}
#undef joystrnum
#undef joyoldchoice
}
#endif
static void M_AssignJoystick(INT32 choice)
{
#ifdef JOYSTICK_HOTPLUG
switch (setupcontrolplayer)
{
case 4:
M_DoAssignJoystick(3, choice);
break;
case 3:
M_DoAssignJoystick(2, choice);
break;
case 2:
M_DoAssignJoystick(1, choice);
break;
case 1:
M_DoAssignJoystick(0, choice);
break;
}
M_DoAssignJoystick((setupcontrolplayer-1), choice);
#else
switch (setupcontrolplayer)
{
case 4:
CV_SetValue(&cv_usejoystick[3], choice);
break;
case 3:
CV_SetValue(&cv_usejoystick[2], choice);
break;
case 2:
CV_SetValue(&cv_usejoystick[1], choice);
break;
case 1:
CV_SetValue(&cv_usejoystick[0], choice);
break;
}
CV_SetValue(&cv_usejoystick[(setupcontrolplayer-1)], choice);
#endif
}
@@ -9352,7 +9371,7 @@ static void M_SetupControlsMenu(UINT8 pnum)
{
// Hide P1-only controls
OP_AllControlsMenu[19].status = IT_GRAYEDOUT2; // Chat
OP_AllControlsMenu[10].status = IT_GRAYEDOUT2; // Rankings
OP_AllControlsMenu[20].status = IT_GRAYEDOUT2; // Rankings
OP_AllControlsMenu[21].status = IT_GRAYEDOUT2; // Pause
OP_AllControlsMenu[22].status = IT_GRAYEDOUT2; // Screenshot
OP_AllControlsMenu[23].status = IT_GRAYEDOUT2; // GIF
@@ -9364,7 +9383,7 @@ static void M_SetupControlsMenu(UINT8 pnum)
{
// Unhide P1-only controls
OP_AllControlsMenu[19].status = IT_CONTROL; // Chat
OP_AllControlsMenu[10].status = IT_CONTROL; // Rankings
OP_AllControlsMenu[20].status = IT_CONTROL; // Rankings
OP_AllControlsMenu[21].status = IT_CONTROL; // Pause
OP_AllControlsMenu[22].status = IT_CONTROL; // Screenshot
OP_AllControlsMenu[23].status = IT_CONTROL; // GIF
@@ -10060,7 +10079,7 @@ static void M_DrawColorMenu(void)
for (max = currentMenu->numitems; max > 0; max--)
{
if (currentMenu->menuitems[max].status != IT_DISABLED && currentMenu->menuitems[max-1].alphaKey*2 + tempcentery <= (currentMenu->y + 2*scrollareaheight))
if (currentMenu->menuitems[max-1].status != IT_DISABLED && currentMenu->menuitems[max-1].alphaKey*2 + tempcentery <= (currentMenu->y + 2*scrollareaheight))
break;
}
+2 -2
View File
@@ -230,8 +230,8 @@ typedef struct
char levelname[32];
UINT8 actnum;
UINT8 skincolor;
UINT8 skinnum;
UINT8 botskin;
skinnum_t skinnum;
skinnum_t botskin;
UINT8 botcolor;
UINT8 numemeralds;
INT32 lives;
+2 -2
View File
@@ -238,8 +238,8 @@ void M_TextInputClear(textinput_t *input)
void M_TextInputSetString(textinput_t *input, const char *c)
{
memset(input->buffer, 0, input->buffer_size);
strncpy(input->buffer, c, input->buffer_size);
strncpy(input->buffer, c, input->buffer_size-1);
input->buffer[input->buffer_size-1] = '\0';
input->cursor = input->select = input->length = strlen(input->buffer);
}
+710 -333
View File
File diff suppressed because it is too large. Load diff
+4 -1
View File
@@ -107,6 +107,9 @@ void P_DoNightsScore(player_t *player)
dummymo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z+player->mo->height/2, MT_NIGHTSCORE);
if (P_MobjWasRemovedCompat(dummymo))
return;
if (player->bot)
player = &players[consoleplayer];
@@ -2013,7 +2016,7 @@ static inline void P_NiGHTSDamage(mobj_t *target, mobj_t *source)
}
}
static inline boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage)
static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage)
{
player_t *player = target->player;
(void)damage; //unused parm
+4 -3
View File
@@ -295,10 +295,10 @@ FUNCINLINE static ATTRINLINE boolean P_MobjWasRemoved(const mobj_t *mobj)
// so can only check if its not NULL in vanilla compat mode
FUNCINLINE static ATTRINLINE boolean P_MobjWasRemovedCompat(const mobj_t *mobj)
{
#ifdef COMPAT_VANILLA
return (!mobj);
#else
#ifdef PHOBOS_BUILD
return P_MobjWasRemoved(mobj);
#else
return !mobj;
#endif
}
@@ -418,6 +418,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch);
void P_DelSeclist(msecnode_t *node);
void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y);
void P_Initsecnode(void);
void P_RadiusAttack(mobj_t *spot, mobj_t *source, fixed_t damagedist);
+36 -4
View File
@@ -2026,7 +2026,7 @@ static boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam)
mapcampointer = thiscam;
if (UNLIKELY(GETSECSPECIAL(newsec->special, 4) == 12))
if (newsec->flags & SF_NOCLIPCAMERA)
{ // Camera noclip on entire sector.
tmfloorz = tmdropoffz = thiscam->z;
tmceilingz = tmdrpoffceilz = thiscam->z + thiscam->height;
@@ -2068,7 +2068,7 @@ static boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam)
fixed_t topheight, bottomheight, midheight;
if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL)
|| UNLIKELY(GETSECSPECIAL(rover->master->frontsector->special, 4) == 12))
|| rover->master->frontsector->flags & SF_NOCLIPCAMERA)
continue;
topheight = P_CameraGetFOFTopZ(thiscam, newsec, rover, x, y, NULL);
@@ -2144,7 +2144,7 @@ static boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam)
// We're inside it! Yess...
polysec = po->lines[0]->backsector;
if (UNLIKELY(GETSECSPECIAL(polysec->special, 4) == 12))
if (polysec->flags & SF_NOCLIPCAMERA)
{ // Camera noclip polyobj.
plink = (polymaplink_t *)(plink->link.next);
continue;
@@ -3983,19 +3983,51 @@ boolean P_CheckSector(sector_t *sector, boolean crunch)
Lots of new Boom functions that work faster and add functionality.
*/
#ifndef PHOBOS_BUILD
static msecnode_t *headsecnode = NULL;
#endif
void P_Initsecnode(void)
{
#ifndef PHOBOS_BUILD
headsecnode = NULL;
#endif
}
// P_GetSecnode() retrieves a node from the freelist. The calling routine
// should make sure it sets all fields properly.
static msecnode_t *P_GetSecnode(void)
{
#ifdef PHOBOS_BUILD
return Z_LevelPoolCalloc(sizeof(msecnode_t));
#else
msecnode_t *node;
if (headsecnode)
{
// vanilla does not clear this
// so for compat reasons we also dont
// means we just reuse stale data which causes weird interactions with orbiting items in some cases
node = headsecnode;
headsecnode = headsecnode->m_thinglist_next;
}
else
node = Z_LevelPoolCalloc(sizeof(msecnode_t));
return node;
#endif
}
// P_PutSecnode() returns a node to the freelist.
static inline void P_PutSecnode(msecnode_t *node)
{
#ifdef PHOBOS_BUILD
Z_LevelPoolFree(node, sizeof(msecnode_t));
#else
node->m_thinglist_next = headsecnode;
headsecnode = node;
#endif
}
// P_AddSecnode() searches the current list to see if this sector is
+2 -2
View File
@@ -328,7 +328,7 @@ void P_CameraLineOpening(line_t *linedef)
{
fixed_t topheight, bottomheight, midheight;
if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || UNLIKELY(GETSECSPECIAL(rover->master->frontsector->special, 4) == 12))
if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || (rover->master->frontsector->flags & SF_NOCLIPCAMERA))
continue;
topheight = P_CameraGetFOFTopZ(mapcampointer, front, rover, tmx, tmy, linedef);
@@ -358,7 +358,7 @@ void P_CameraLineOpening(line_t *linedef)
{
fixed_t topheight, bottomheight, midheight;
if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || UNLIKELY(GETSECSPECIAL(rover->master->frontsector->special, 4) == 12))
if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_RENDERALL) || !(rover->flags & FF_EXISTS) || (rover->master->frontsector->flags & SF_NOCLIPCAMERA))
continue;
topheight = P_CameraGetFOFTopZ(mapcampointer, back, rover, tmx, tmy, linedef);
+1063 -871
View File
File diff suppressed because it is too large. Load diff
+31 -11
View File
@@ -69,7 +69,7 @@ FUNCINLINE static ATTRINLINE void P_ArchivePlayer(savebuffer_t *save)
pllives = 3; // has less than that.
WRITEUINT8(save->p, player->skincolor);
WRITEUINT8(save->p, player->skin);
WRITESKIN(save->p, player->skin);
WRITEUINT32(save->p, player->score);
WRITEINT32(save->p, pllives);
@@ -77,7 +77,7 @@ FUNCINLINE static ATTRINLINE void P_ArchivePlayer(savebuffer_t *save)
if (botskin)
{
WRITEUINT8(save->p, botskin);
WRITESKIN(save->p, botskin);
WRITEUINT8(save->p, botcolor);
}
}
@@ -88,7 +88,7 @@ FUNCINLINE static ATTRINLINE void P_ArchivePlayer(savebuffer_t *save)
FUNCINLINE static ATTRINLINE void P_UnArchivePlayer(savebuffer_t *save)
{
savedata.skincolor = READUINT8(save->p);
savedata.skin = READUINT8(save->p);
savedata.skin = READSKIN(save->p);
savedata.score = READINT32(save->p);
savedata.lives = READINT32(save->p);
@@ -96,9 +96,11 @@ FUNCINLINE static ATTRINLINE void P_UnArchivePlayer(savebuffer_t *save)
if (savedata.botcolor)
{
savedata.botskin = READUINT8(save->p);
savedata.botskin = READSKIN(save->p);
if (savedata.botskin-1 >= numskins)
savedata.botskin = 0;
savedata.botcolor = READUINT8(save->p);
}
else
@@ -117,7 +119,9 @@ static void P_NetArchivePlayers(savebuffer_t *save, boolean resending)
for (i = 0; i < MAXPLAYERS; i++)
{
#ifndef PHOBOS_BUILD
if (resending)
#endif
WRITESINT8(save->p, (SINT8)adminplayers[i]);
if (!playeringame[i])
@@ -127,7 +131,9 @@ static void P_NetArchivePlayers(savebuffer_t *save, boolean resending)
// no longer send ticcmds
#ifndef PHOBOS_BUILD
if (resending)
#endif
WRITESTRINGN(save->p, player_names[i], MAXPLAYERNAME);
const player_t *player = &players[i];
@@ -156,11 +162,16 @@ static void P_NetArchivePlayers(savebuffer_t *save, boolean resending)
WRITEUINT16(save->p, player->flashpal);
WRITEUINT16(save->p, player->flashcount);
#ifdef PHOBOS_BUILD
WRITEUINT8(save->p, player->skincolor);
WRITEINT32(save->p, player->skin);
#else
if (resending)
{
WRITEUINT8(save->p, player->skincolor);
WRITEINT32(save->p, player->skin);
}
#endif
WRITEUINT32(save->p, player->score);
WRITEFIXED(save->p, player->dashspeed);
@@ -309,7 +320,9 @@ static void P_NetUnArchivePlayers(savebuffer_t *save, boolean reloading)
for (i = 0; i < MAXPLAYERS; i++)
{
#ifndef PHOBOS_BUILD
if (reloading)
#endif
adminplayers[i] = (INT32)READSINT8(save->p);
// Do NOT memset player struct to 0
@@ -320,7 +333,9 @@ static void P_NetUnArchivePlayers(savebuffer_t *save, boolean reloading)
// NOTE: sending tics should (hopefully) no longer be necessary
#ifndef PHOBOS_BUILD
if (reloading)
#endif
READSTRINGN(save->p, player_names[i], MAXPLAYERNAME);
player_t *player = &players[i];
@@ -349,11 +364,16 @@ static void P_NetUnArchivePlayers(savebuffer_t *save, boolean reloading)
player->flashpal = READUINT16(save->p);
player->flashcount = READUINT16(save->p);
#ifdef PHOBOS_BUILD
player->skincolor = READUINT8(save->p);
player->skin = READINT32(save->p);
#else
if (reloading)
{
player->skincolor = READUINT8(save->p);
player->skin = READINT32(save->p);
}
#endif
player->score = READUINT32(save->p);
player->dashspeed = READFIXED(save->p); // dashing speed
@@ -1108,10 +1128,10 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
diff2 = 0;
// not the default but the most probable
#ifdef COMPAT_VANILLA
if (mobj->momx != 0 || mobj->momy != 0 || mobj->momz != 0)
#else
#ifdef PHOBOS_BUILD
if (mobj->momx != 0 || mobj->momy != 0 || mobj->momz != 0 || mobj->pmomz !=0)
#else
if (mobj->momx != 0 || mobj->momy != 0 || mobj->momz != 0)
#endif
diff |= MD_MOM;
if (mobj->radius != mobj->info->radius)
@@ -1240,7 +1260,7 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
WRITEFIXED(save->p, mobj->momx);
WRITEFIXED(save->p, mobj->momy);
WRITEFIXED(save->p, mobj->momz);
#ifndef COMPAT_VANILLA
#ifdef PHOBOS_BUILD
WRITEFIXED(save->p, mobj->pmomz);
#endif
}
@@ -1304,7 +1324,7 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8
if (diff2 & MD2_CVMEM)
WRITEINT32(save->p, mobj->cvmem);
if (diff2 & MD2_SKIN)
WRITEUINT8(save->p, (UINT8)((skin_t *)mobj->skin - skins));
WRITESKIN(save->p, (skinnum_t)((skin_t *)mobj->skin - skins));
if (diff2 & MD2_COLOR)
WRITEUINT8(save->p, mobj->color);
if (diff2 & MD2_EXTVAL1)
@@ -2062,7 +2082,7 @@ static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
mobj->momx = READFIXED(save->p);
mobj->momy = READFIXED(save->p);
mobj->momz = READFIXED(save->p);
#ifndef COMPAT_VANILLA
#ifdef PHOBOS_BUILD
mobj->pmomz = READFIXED(save->p);
#endif
} // otherwise they're zero, and the memset took care of it
@@ -2165,7 +2185,7 @@ static void LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
if (diff2 & MD2_CVMEM)
mobj->cvmem = READINT32(save->p);
if (diff2 & MD2_SKIN)
mobj->skin = &skins[READUINT8(save->p)];
mobj->skin = &skins[READSKIN(save->p)];
if (diff2 & MD2_COLOR)
mobj->color = READUINT8(save->p);
if (diff2 & MD2_EXTVAL1)
+2 -2
View File
@@ -24,8 +24,8 @@
typedef struct
{
UINT8 skincolor;
UINT8 skin;
UINT8 botskin;
skinnum_t skin;
skinnum_t botskin;
UINT8 botcolor;
INT32 score;
INT32 lives;
+8 -4
View File
@@ -2074,14 +2074,14 @@ static void P_LoadReject(UINT8 *data, size_t rejectsize)
if (rejectsize < neededsize)
{
CorruptMapWarning(va("P_LoadReject: REJECT is %s byte%s too small. REJECT might be invalid!\n", sizeu1(neededsize - rejectsize), (neededsize - rejectsize) == 1 ? "" : "s"));
#ifdef COMPAT_VANILLA
#ifdef PHOBOS_BUILD
rejectmatrix = NULL;
return;
#else
// we can pad this and somewhat prevent desyncs
// probs not cool if the reject is from a completely different map
// but whatever
allocsize = neededsize;
#else
rejectmatrix = NULL;
return;
#endif
}
@@ -3001,6 +3001,9 @@ boolean P_SetupLevel(boolean fromnetsave, boolean reloadinggamestate)
CON_Drawer(); // let the user know what we are going to do
I_FinishUpdate(); // page flip or blit buffer
// Initialize sector node list.
P_Initsecnode();
if (netgame || multiplayer)
cv_debug = botskin = 0;
@@ -3328,6 +3331,7 @@ static boolean P_CheckSoundReplacements(UINT16 wadnum, char *name, size_t i)
return false;
}
//
// P_CheckReplacMapReplacements
//
+19 -5
View File
@@ -3394,7 +3394,7 @@ void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *rovers
break;
case 12: // SRB2kart: Invert Encore Remap
break;
case 15: // no idea but keep it dont want anything to break
case 15: // also Invert Encore Remap....
break;
}
DoneSection2:
@@ -4604,7 +4604,7 @@ void P_UpdateSpecials(void)
// POINT LIMIT
P_CheckPointLimit();
#ifdef COMPAT_VANILLA
#ifndef PHOBOS_BUILD
// Dynamic slopeness
// we run this here only when not joined midrace
// for vanilla compat reasons :chaosleep:
@@ -5368,6 +5368,11 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
case 11: // Custom global gravity!
gravity = sector->floorheight/1000;
break;
case 12: // SRB2kart: Invert Encore Remap
case 15: // NOTE: vanilla kart checks only for this for some reason!
sector->flags |= SF_INVERTENCORE;
break;
}
// Process Section 4
@@ -5377,6 +5382,10 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
if (G_RaceGametype())
circuitmap = true;
break;
case 12: // Camera noclip
sector->flags |= SF_NOCLIPCAMERA;
break;
}
}
@@ -5461,11 +5470,11 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
sectors[s].gravity = &sectors[sec].floorheight; // This allows it to change in realtime!
if (lines[i].flags & ML_NOCLIMB)
sectors[s].verticalflip = true;
sectors[s].flags |= SF_GRAVITYFLIP;
else
sectors[s].verticalflip = false;
sectors[s].flags &= ~SF_GRAVITYFLIP;
CheckForReverseGravity = sectors[s].verticalflip;
CheckForReverseGravity = (boolean)(sectors[s].flags & SF_GRAVITYFLIP);
}
break;
@@ -5558,6 +5567,11 @@ void P_SpawnSpecials(INT32 fromnetsave, boolean reloadinggamestate)
sectors[s].cullheight = &lines[i]; // This allows it to change in realtime!
break;
case 13: // Heat wave effect
for (s = -1; (s = P_FindSectorFromLineTag(lines + i, s)) >= 0 ;)
sectors[s].flags |= SF_HEATWAVE;
break;
case 50: // Insta-Lower Sector
EV_DoFloor(&lines[i], instantLower);
break;
+1 -1
View File
@@ -651,7 +651,7 @@ void P_Ticker(boolean run)
if (run)
{
// Dynamic slopeness
#ifdef COMPAT_VANILLA
#ifndef PHOBOS_BUILD
if (midgamejoin) // only run here if we joined midgame to fix some desynchs
#endif
P_RunDynamicSlopes();
+7 -6
View File
@@ -1017,7 +1017,7 @@ boolean P_IsLocalPlayer(const player_t *player)
}
//
// P_IsLocalPlayer
// P_IsLocalPlayerNum
//
// Returns true if playernum is
// on the local machine.
@@ -3561,7 +3561,7 @@ static boolean P_CheckNoclipCameraPosition(player_t *player, camera_t *thiscam,
for (rover = newsubsec->sector->ffloors; rover; rover = rover->next)
{
fixed_t topheight, bottomheight;
if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || UNLIKELY(GETSECSPECIAL(rover->master->frontsector->special, 4) == 12))
if (!(rover->flags & FF_BLOCKOTHERS) || !(rover->flags & FF_EXISTS) || !(rover->flags & FF_RENDERALL) || (rover->master->frontsector->flags & SF_NOCLIPCAMERA))
continue;
topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL);
@@ -3626,7 +3626,7 @@ static boolean P_CheckNoclipCameraPosition(player_t *player, camera_t *thiscam,
// We're inside it! Yess...
polysec = po->lines[0]->backsector;
if (UNLIKELY(GETSECSPECIAL(polysec->special, 4) == 12))
if (polysec->flags & SF_NOCLIPCAMERA)
{ // Camera noclip polyobj.
plink = (polymaplink_t *)(plink->link.next);
continue;
@@ -3682,7 +3682,8 @@ static boolean P_CheckNoclipCameraPosition(player_t *player, camera_t *thiscam,
for (rover = newsubsec->sector->ffloors; rover; rover = rover->next)
{
fixed_t topheight, bottomheight;
if (UNLIKELY((rover->flags & FF_BLOCKOTHERS) && (rover->flags & FF_RENDERALL) && (rover->flags & FF_EXISTS) && GETSECSPECIAL(rover->master->frontsector->special, 4) == 12))
if ((rover->flags & FF_BLOCKOTHERS) && (rover->flags & FF_RENDERALL) && (rover->flags & FF_EXISTS) && (rover->master->frontsector->flags & SF_NOCLIPCAMERA))
{
topheight = P_CameraGetFOFTopZ(thiscam, newsubsec->sector, rover, midx, midy, NULL);
bottomheight = P_CameraGetFOFBottomZ(thiscam, newsubsec->sector, rover, midx, midy, NULL);
@@ -4262,7 +4263,7 @@ boolean P_SpectatorJoinGame(player_t *player)
static boolean P_CameraCheckHeatFirstperson(player_t *player, sector_t *sector, fixed_t pviewheight)
{
if (P_FindSpecialLineFromTag(13, sector->tag, -1) != -1)
if (sector->flags & SF_HEATWAVE)
return true;
if (sector->ffloors)
@@ -4280,7 +4281,7 @@ static boolean P_CameraCheckHeatFirstperson(player_t *player, sector_t *sector,
if (pviewheight <= P_GetFFloorBottomZAt(rover, player->mo->x, player->mo->y))
continue;
if (P_FindSpecialLineFromTag(13, rover->master->frontsector->tag, -1) != -1)
if (rover->master->frontsector->flags & SF_HEATWAVE)
return true;
}
}
+3 -4
View File
@@ -48,8 +48,7 @@ boolean g_walloffscreen = false;
boolean R_NoEncore(sector_t *sector, boolean ceiling)
{
const INT32 invspecial = GETSECSPECIAL(sector->special, 2);
boolean invertencore = (invspecial == 12 || invspecial == 15); // keeping this incase its used
const boolean invertEncore = (sector->flags & SF_INVERTENCORE);
#if 0 // perfect implementation
const INT32 sprnspecial = GETSECSPECIAL(sector->special, 3);
@@ -59,10 +58,10 @@ boolean R_NoEncore(sector_t *sector, boolean ceiling)
#endif
&& GETSECSPECIAL(sector->special, 4) != 6) // sneaker panel
{
return invertencore;
return invertEncore;
}
if (invertencore)
if (invertEncore)
{
return false;
}
+13 -5
View File
@@ -307,10 +307,19 @@ typedef struct pslope_s
typedef enum
{
SF_FLIPSPECIAL_FLOOR = 1,
SF_FLIPSPECIAL_CEILING = 2,
SF_FLIPSPECIAL_BOTH = 3,
SF_TRIGGERSPECIAL_TOUCH = 4,
// flipspecial - planes with effect
SF_FLIPSPECIAL_FLOOR = 1,
SF_FLIPSPECIAL_CEILING = 1<<1,
SF_FLIPSPECIAL_BOTH = (SF_FLIPSPECIAL_FLOOR|SF_FLIPSPECIAL_CEILING),
// triggerspecial - conditions under which plane touch causes effect
SF_TRIGGERSPECIAL_TOUCH = 1<<2,
SF_GRAVITYFLIP = 1<<3,
SF_HEATWAVE = 1<<4,
SF_NOCLIPCAMERA = 1<<5,
// invert encore color remap status
SF_INVERTENCORE = 1<<6,
} sectorflags_t;
//
@@ -391,7 +400,6 @@ typedef struct sector_s
// This points to the master's floorheight, so it can be changed in realtime!
fixed_t *gravity; // per-sector gravity
boolean verticalflip; // If gravity < 0, then allow flipped physics
sectorflags_t flags;
// Sprite culling feature
+10 -12
View File
@@ -174,15 +174,10 @@ static void BlendTab_Translucent(UINT8 *table, int style, UINT8 blendamt)
{
frontrgba = pGammaCorrectedPalette[fg];
#if 0 // perfect implementation
result.rgba = ASTBlendPixel(backrgba, frontrgba, style, 0xFF);
result.rgba = ASTBlendPixel(result, frontrgba, AST_TRANSLUCENT, blendamt);
table[((bg * 0x100) + fg)] = GetColorLUT(&transtab_lut, result.s.red, result.s.green, result.s.blue);
#else // performance scrabbler
result.rgba = ASTBlendPixel(backrgba, frontrgba, style, 0xFF);
result.rgba = ASTBlendPixel(result, frontrgba, AST_TRANSLUCENT, blendamt);
table[((bg * 0x100) + fg)] = GetColorLUT(&transtab_lut_corrected, result.s.red, result.s.green, result.s.blue); // pGammaCorrectedPalette
#endif
}
}
}
@@ -190,6 +185,7 @@ static void BlendTab_Translucent(UINT8 *table, int style, UINT8 blendamt)
static void BlendTab_Subtractive(UINT8 *table, int style, UINT8 blendamt)
{
INT16 bg, fg;
RGBA_t backrgba, frontrgba, result;
if (table == NULL)
I_Error("BlendTab_Subtractive: input table was NULL!");
@@ -202,11 +198,11 @@ static void BlendTab_Subtractive(UINT8 *table, int style, UINT8 blendamt)
for (bg = 0; bg < 0x100; bg++)
{
backrgba = pLocalPalette[bg]; // intentionally uses pLocalPalette
for (fg = 0; fg < 0x100; fg++)
{
RGBA_t backrgba = V_GetColor(bg);
RGBA_t frontrgba = V_GetColor(fg);
RGBA_t result;
frontrgba = pLocalPalette[fg];
result.rgba = ASTBlendPixel(backrgba, frontrgba, style, 0xFF);
result.s.red = std::max(0, result.s.red - blendamt);
@@ -221,17 +217,19 @@ static void BlendTab_Subtractive(UINT8 *table, int style, UINT8 blendamt)
static void BlendTab_Modulative(UINT8 *table)
{
INT16 bg, fg;
RGBA_t backrgba, frontrgba, result;
if (table == NULL)
I_Error("BlendTab_Modulative: input table was NULL!");
for (bg = 0; bg < 0x100; bg++)
{
backrgba = pGammaCorrectedPalette[bg];
for (fg = 0; fg < 0x100; fg++)
{
RGBA_t backrgba = V_GetColor(bg);
RGBA_t frontrgba = V_GetColor(fg);
RGBA_t result;
frontrgba = pGammaCorrectedPalette[fg];
result.rgba = ASTBlendPixel(backrgba, frontrgba, AST_MODULATE, 0);
table[((bg * 0x100) + fg)] = GetColorLUT(&transtab_lut_corrected, result.s.red, result.s.green, result.s.blue);
}
+6 -6
View File
@@ -42,8 +42,8 @@ INT32 numallskins = 0;
INT32 numlocalskins = 0;
skin_t skins[MAXSKINS];
UINT8 skinstats[9][9][MAXSKINS];
UINT8 skinstatscount[9][9] = {
skinnum_t skinstats[9][9][MAXSKINS];
skinnum_t skinstatscount[9][9] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
@@ -55,7 +55,7 @@ UINT8 skinstatscount[9][9] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0}
};
UINT8 skinsorted[MAXSKINS] = {};
skinnum_t skinsorted[MAXSKINS] = {};
skin_t localskins[MAXLOCALSKINS] = {};
skin_t allskins[MAXSKINS+MAXLOCALSKINS] = {};
@@ -398,8 +398,8 @@ static UINT16 W_CheckForSkinMarkerInPwad(UINT16 wadid, UINT16 startlump)
static int skinSortFunc(const void *a, const void *b) // tbh i have no clue what the naming conventions for local functions are
{
int diff = 0;
const UINT8 val_a = *(const UINT8 *)a;
const UINT8 val_b = *(const UINT8 *)b;
const skinnum_t val_a = *(const skinnum_t *)a;
const skinnum_t val_b = *(const skinnum_t *)b;
const skin_t *in1 = &skins[val_a];
const skin_t *in2 = &skins[val_b];
@@ -474,7 +474,7 @@ static int skinSortFunc(const void *a, const void *b) // tbh i have no clue what
void sortSkinGrid(void)
{
//CONS_Printf("Sorting skin list (%d)...\n", cv_skinselectgridsort.value);
qs22j(skinsorted, numskins, sizeof(UINT8), skinSortFunc);
qs22j(skinsorted, numskins, sizeof(skinnum_t), skinSortFunc);
}
//
+3 -3
View File
@@ -71,9 +71,9 @@ extern INT32 numskins;
extern INT32 numlocalskins;
extern INT32 numallskins;
extern skin_t skins[MAXSKINS];
extern UINT8 skinstats[9][9][MAXSKINS];
extern UINT8 skinstatscount[9][9];
extern UINT8 skinsorted[MAXSKINS];
extern skinnum_t skinstats[9][9][MAXSKINS];
extern skinnum_t skinstatscount[9][9];
extern skinnum_t skinsorted[MAXSKINS];
extern skin_t localskins[MAXLOCALSKINS];
extern skin_t allskins[MAXSKINS+MAXLOCALSKINS];
+3
View File
@@ -1021,6 +1021,8 @@ void I_InitJoystick(UINT8 index)
}
}
#if 0 // no dont do this
// reset everything just in case
JoyInfo[index].dev = NULL;
JoyInfo[index].oldjoy = -1;
#if (SDL_VERSION_ATLEAST(2,32,4))
@@ -1028,6 +1030,7 @@ void I_InitJoystick(UINT8 index)
#endif
JoyInfo[index].hasled = false;
JoyInfo[index].hasrumble = false;
#endif
if (cv_usejoystick[index].value)
newcontroller = SDL_GameControllerOpen(cv_usejoystick[index].value-1);
+2 -2
View File
@@ -410,7 +410,7 @@ static void ST_drawDebugInfo(void)
}
if (cv_debug & DBG_MEMORY)
V_DrawRightAlignedString(320, height, V_MONOSPACE, va("Heap used: %7sKB", sizeu1(Z_TagsUsage(0, INT32_MAX)>>10)));
V_DrawRightAlignedString(320, height, V_MONOSPACE, va("Heap used: %7sKB", sizeu1(Z_TotalUsage()>>10)));
}
static void ST_drawLevelTitle(void)
@@ -568,7 +568,7 @@ static void ST_overlayDrawer(void)
{
if (!(multiplayer && demo.playback))
{
if(!P_IsLocalPlayer(stplyr))
if (!P_IsLocalPlayer(stplyr))
{
/*char name[MAXPLAYERNAME+1];
// shorten the name if its more than twelve characters.
+8 -7
View File
@@ -396,6 +396,11 @@ FUNCINLINE static ATTRINLINE UINT32 W_HashLumpName(const char *name)
return FNV1a_HashLowercaseString(name);
}
FUNCINLINE static ATTRINLINE UINT32 W_HashLumpNameLen(const char *name, size_t len)
{
return FNV1a_QuickCaseHash(name, len);
}
/** Detect a file type.
* \todo Actually detect the wad/pkzip headers and whatnot, instead of just checking the extensions.
*/
@@ -1095,18 +1100,14 @@ const char *W_CheckNameForNum(lumpnum_t lumpnum)
UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump)
{
UINT16 i;
static char uname[8 + 1];
UINT32 hash;
size_t namelen;
if (!TestValidLump(wad, 0))
return INT16_MAX;
memset(uname, 0, sizeof(uname));
strncpy(uname, name, sizeof(uname)-1);
strupr(uname);
namelen = strlen(uname);
hash = W_HashLumpName(uname);
namelen = strnlen(name, 8); // :chaosleep:
hash = W_HashLumpNameLen(name, namelen);
//
// scan forward
@@ -1121,7 +1122,7 @@ UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump)
{
if (lump_p->namelength == namelen
&& lump_p->hash.name == hash
&& !memcmp(lump_p->name, uname, sizeof(uname) - 1))
&& !strncasecmp(lump_p->name, name, namelen))
return i;
}
}
+2
View File
@@ -256,6 +256,7 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32))
}
if (demo.recording && !rankingsmode)
{
G_WriteStanding(
data.pos[data.numplayers],
data.name[data.numplayers],
@@ -263,6 +264,7 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32))
*data.color[data.numplayers],
data.val[data.numplayers]
);
}
data.numplayers++;
}
+129 -146
View File
@@ -44,7 +44,6 @@
#ifdef HAVE_VALGRIND
#include "valgrind.h"
static boolean Z_calloc = false;
#include "memcheck.h"
#endif
#define ZONEID 0xa441d13d
@@ -76,7 +75,7 @@ typedef struct memblock_s
#define MEMBLOCK(x) (memblock_t *)((uintptr_t)(x) - ALIGNPAD - sizeof(memblock_t))
// both the head and tail of the zone memory block list
static memblock_t head;
static memblock_t headlist[NUM_PURGETAGS];
static constexpr size_t kLevelLargePoolBlockSize = sizeof(mobj_t);
static constexpr size_t kLevelMedPoolBlockSize = sizeof(precipmobj_t);
@@ -108,10 +107,14 @@ static void Command_Memdump_f(void);
void Z_Init(void)
{
size_t total, memfree;
size_t i;
memset(&head, 0x00, sizeof(head));
memset(&headlist, 0x00, sizeof(headlist));
head.next = head.prev = &head;
for (i = 0; i < NUM_PURGETAGS; i++)
{
headlist[i].next = headlist[i].prev = &headlist[i];
}
memfree = I_GetFreeMem(&total)>>20;
@@ -180,7 +183,7 @@ void Z_Free(void *ptr)
if (block->user != NULL)
*block->user = NULL;
#ifdef VALGRIND_DESTROY_MEMPOOL
#ifdef HAVE_VALGRIND
VALGRIND_DESTROY_MEMPOOL(block);
#endif
block->prev->next = block->next;
@@ -205,7 +208,7 @@ static void *xm(size_t size)
if (p == NULL)
{
// Oh crumbs: we're out of heap. Try purging the cache and reallocating.
Z_FreeTags(PU_PURGELEVEL, INT32_MAX);
Z_FreeTags(PU_PURGELEVEL, NUM_PURGETAGS-1);
p = malloc(padedsize);
if (p == NULL)
@@ -246,13 +249,9 @@ void *Z_Malloc(size_t size, INT32 tag, void *user)
ptr = MEMORY(block);
I_Assert((intptr_t)ptr % alignof (max_align_t) == 0);
#ifdef HAVE_VALGRIND
Z_calloc = false;
#endif
block->next = head.next;
block->prev = &head;
head.next = block;
block->next = headlist[tag].next;
block->prev = &headlist[tag];
headlist[tag].next = block;
block->next->prev = block;
block->tag = tag;
@@ -263,8 +262,9 @@ void *Z_Malloc(size_t size, INT32 tag, void *user)
#endif
block->size = size;
#ifdef VALGRIND_CREATE_MEMPOOL
#ifdef HAVE_VALGRIND
VALGRIND_CREATE_MEMPOOL(block, size, Z_calloc);
Z_calloc = false;
#endif
#ifdef PARANOIA
@@ -301,7 +301,8 @@ void *Z_Calloc2(size_t size, INT32 tag, void *user, const char *file, INT32 line
void *Z_Calloc(size_t size, INT32 tag, void *user)
#endif
{
#ifdef VALGRIND_MEMPOOL_ALLOC
#ifdef HAVE_VALGRIND
Z_calloc = true;
#endif
#ifdef ZDEBUG
@@ -414,6 +415,7 @@ void Z_FreeTags(INT32 lowtag, INT32 hightag)
#endif
{
memblock_t *block, *next;
INT32 i;
#ifdef ZDEBUG
Z_CheckHeap2(file, line);
@@ -430,11 +432,13 @@ void Z_FreeTags(INT32 lowtag, INT32 hightag)
g_level_tiny_pool.release();
}
for (block = head.next; block != &head; block = next)
for (i = lowtag; i <= hightag; i++)
{
next = block->next; // get link before freeing
if (block->tag >= lowtag && block->tag <= hightag)
for (block = headlist[i].next; block != &headlist[i]; block = next)
{
next = block->next; // get link before freeing
Z_Free(MEMORY(block));
}
}
}
@@ -447,18 +451,20 @@ void Z_FreeTags(INT32 lowtag, INT32 hightag)
void Z_IterateTags(INT32 lowtag, INT32 hightag, boolean (*iterfunc)(void *))
{
memblock_t *block, *next;
INT32 i;
if (!iterfunc)
I_Error("Z_IterateTags: no iterator function was given");
for (block = head.next; block != &head; block = next)
for (i = lowtag; i <= hightag; i++)
{
next = block->next; // get link before possibly freeing
if (block->tag >= lowtag && block->tag <= hightag)
for (block = headlist[i].next; block != &headlist[i]; block = next)
{
next = block->next; // get link before possibly freeing
void *mem = MEMORY(block);
boolean free = iterfunc(mem);
if (free)
Z_Free(mem);
}
@@ -489,7 +495,7 @@ void Z_CheckMemCleanup(void)
if (nextcleanup-- == 0)
{
nextcleanup = CLEANUPCOUNT;
Z_FreeTags(PU_PURGELEVEL, INT32_MAX);
Z_FreeTags(PU_PURGELEVEL, NUM_PURGETAGS-1);
}
}
@@ -507,124 +513,64 @@ void Z_CheckHeap(INT32 tag)
{
memblock_t *block;
UINT32 blocknumon = 0;
size_t j;
void *given;
#ifndef ZDEBUG
(void)tag;
#endif
for (block = head.next; block != &head; block = block->next)
#ifdef ZDEBUG
#define HeapError(msg) \
I_Error("Z_CheckHeap : %s:%d, block %u (owned by %s:%d) %s", \
file, line, blocknumon, block->ownerfile, block->ownerline, msg)
#else
#define HeapError(msg) \
I_Error("Z_CheckHeap : block %u (owned by %s:%d) %s", \
blocknumon, block->ownerfile, block->ownerline, msg)
#endif
for (j = 0; j < NUM_PURGETAGS; j++)
{
blocknumon++;
given = MEMORY(block);
for (block = headlist[j].next; block != &headlist[j]; block = block->next)
{
blocknumon++;
given = MEMORY(block);
#ifdef ZDEBUG2
CONS_Debug(DBG_MEMORY, "block %u owned by %s:%d\n",
blocknumon, block->ownerfile, block->ownerline);
CONS_Debug(DBG_MEMORY, "block %u owned by %s:%d\n",
blocknumon, block->ownerfile, block->ownerline);
#endif
#ifdef VALGRIND_MEMPOOL_EXISTS
if (!VALGRIND_MEMPOOL_EXISTS(block))
{
I_Error("Z_CheckHeap :"
#ifdef ZDEBUG
" %s %d"
#ifdef HAVE_VALGRIND
if (RUNNING_ON_VALGRIND && !VALGRIND_MEMPOOL_EXISTS(block))
{
HeapError(" should not exist");
}
#endif
" block %u"
#ifdef ZDEBUG
" (owned by %s:%d)"
#endif
" should not exist"
#ifdef ZDEBUG
, file, line
#endif
, blocknumon
#ifdef ZDEBUG
, block->ownerfile, block->ownerline
#endif
);
}
#endif
if (block->user != NULL && *(block->user) != given)
{
I_Error("Z_CheckHeap :"
#ifdef ZDEBUG
" %s %d"
#endif
" block %u"
#ifdef ZDEBUG
" (owned by %s:%d)"
#endif
" doesn't have a proper user"
#ifdef ZDEBUG
, file, line
#endif
, blocknumon
#ifdef ZDEBUG
, block->ownerfile, block->ownerline
#endif
);
}
if (block->next->prev != block)
{
I_Error("Z_CheckHeap :"
#ifdef ZDEBUG
" %s %d"
#endif
" block %u"
#ifdef ZDEBUG
" (owned by %s:%d)"
#endif
" lacks proper backlink"
#ifdef ZDEBUG
, file, line
#endif
, blocknumon
#ifdef ZDEBUG
, block->ownerfile, block->ownerline
#endif
);
}
if (block->prev->next != block)
{
I_Error("Z_CheckHeap :"
#ifdef ZDEBUG
" %s %d"
#endif
" block %u"
#ifdef ZDEBUG
" (owned by %s:%d)"
#endif
" lacks proper forward link"
#ifdef ZDEBUG
, file, line
#endif
, blocknumon
#ifdef ZDEBUG
, block->ownerfile, block->ownerline
#endif
);
}
if (block->user != NULL && *(block->user) != given)
{
HeapError(" doesn't have a proper user");
}
if (block->next->prev != block)
{
HeapError(" lacks proper backlink");
}
if (block->prev->next != block)
{
HeapError(" lacks proper forward link");
}
#ifdef PARANOIA
if (block->id != ZONEID)
{
I_Error("Z_CheckHeap :"
#ifdef ZDEBUG
" %s %d"
if (block->id != ZONEID)
{
HeapError(" has the wrong ID");
}
#endif
" block %u"
#ifdef ZDEBUG
" (owned by %s:%d)"
#endif
" have the wrong ID"
#ifdef ZDEBUG
, file, line
#endif
, blocknumon
#ifdef ZDEBUG
, block->ownerfile, block->ownerline
#endif
);
if (block->tag != j)
{
HeapError(va(" block is contained in the wrong headlist (got: %d expected: %s)", block->tag, sizeu1(j)));
}
}
#endif
}
}
@@ -653,13 +599,22 @@ void Z_ChangeTag(void *ptr, INT32 tag)
block = MEMBLOCK(ptr);
#ifdef PARANOIA
if (block->id != ZONEID) I_Error("Z_ChangeTag at %s:%d: wrong id", file, line);
if (block->id != ZONEID)
I_Error("Z_ChangeTag at %s:%d: wrong id", file, line);
#endif
if (tag >= PU_PURGELEVEL && block->user == NULL)
I_Error("Internal memory management error: "
"tried to make block purgable but it has no owner");
block->prev->next = block->next;
block->next->prev = block->prev;
block->next = headlist[tag].next;
block->prev = &headlist[tag];
headlist[tag].next = block;
block->next->prev = block;
block->tag = tag;
}
@@ -684,7 +639,8 @@ void Z_SetUser(void *ptr, void **newuser)
block = MEMBLOCK(ptr);
#ifdef PARANOIA
if (block->id != ZONEID) I_Error("Z_SetUser at %s:%d: wrong id", file, line);
if (block->id != ZONEID)
I_Error("Z_SetUser at %s:%d: wrong id", file, line);
#endif
if (block->tag >= PU_PURGELEVEL && newuser == NULL)
@@ -709,18 +665,21 @@ void Z_SetUser(void *ptr, void **newuser)
size_t Z_TagsUsage(INT32 lowtag, INT32 hightag)
{
size_t cnt = 0;
memblock_t *rover;
memblock_t *head; // why was this called rover before?????
INT32 i;
for (rover = head.next; rover != &head; rover = rover->next)
for (i = lowtag; i <= hightag; i++)
{
if (rover->tag < lowtag || rover->tag > hightag)
continue;
cnt += rover->size + sizeof(memblock_t);
for (head = headlist[i].next; head != &headlist[i]; head = head->next)
{
cnt += head->size + sizeof *head;
}
}
return cnt;
}
// -----------------------
// Miscellaneous functions
// -----------------------
@@ -734,8 +693,8 @@ static void Command_Memfree_f(void)
Z_CheckHeap(-1);
CONS_Printf("\x82%s", M_GetText("Memory Info\n"));
CONS_Printf(M_GetText("Total heap used : %7s KB\n"), sizeu1(Z_TotalUsage()>>10));
CONS_Printf(M_GetText("Lua : %7s KB\n"), sizeu1(Z_TagUsage(PU_LUA)>>10));
CONS_Printf(M_GetText("Total heap used : %7s KB\n"), sizeu1((Z_TotalUsage()>>10) + LUA_MemoryUsage()));
CONS_Printf(M_GetText("Lua : %7s KB\n"), sizeu1(LUA_MemoryUsage())); // No longer uses z_zone memory but for consistency keep it here
CONS_Printf(M_GetText("Static : %7s KB\n"), sizeu1(Z_TagUsage(PU_STATIC)>>10));
CONS_Printf(M_GetText("Static (sound) : %7s KB\n"), sizeu1(Z_TagUsage(PU_SOUND)>>10));
CONS_Printf(M_GetText("Static (music) : %7s KB\n"), sizeu1(Z_TagUsage(PU_MUSIC)>>10));
@@ -749,7 +708,7 @@ static void Command_Memfree_f(void)
CONS_Printf(M_GetText("Level (pooled) : %7s KB\n"), sizeu1(Z_LevelPoolUsage()>>10));
CONS_Printf(M_GetText("Special thinker : %7s KB\n"), sizeu1(Z_TagUsage(PU_LEVSPEC)>>10));
CONS_Printf(M_GetText("All purgable : %7s KB\n"),
sizeu1(Z_TagsUsage(PU_PURGELEVEL, INT32_MAX)>>10));
sizeu1(Z_TagsUsage(PU_PURGELEVEL, NUM_PURGETAGS-1)>>10));
#ifdef HWRENDER
if (rendermode == render_opengl)
@@ -778,21 +737,24 @@ static void Command_Memfree_f(void)
static void Command_Memdump_f(void)
{
memblock_t *block;
INT32 mintag = 0, maxtag = INT32_MAX;
INT32 mintag = 0, maxtag = NUM_PURGETAGS-1;
INT32 check;
INT32 i;
if ((i = COM_CheckParm("-min")))
mintag = atoi(COM_Argv(i + 1));
if ((check = COM_CheckParm("-min")))
mintag = atoi(COM_Argv(check + 1));
if ((i = COM_CheckParm("-max")))
maxtag = atoi(COM_Argv(i + 1));
if ((check = COM_CheckParm("-max")))
maxtag = atoi(COM_Argv(check + 1));
for (block = head.next; block != &head; block = block->next)
if (block->tag >= mintag && block->tag <= maxtag)
for (i = mintag; i <= maxtag; i++)
{
for (block = headlist[i].next; block != &headlist[i]; block = block->next)
{
const char *filename = strrchr(block->ownerfile, PATHSEP[0]);
CONS_Printf("[%3d] %s (%s) bytes @ %s:%d\n", block->tag, sizeu1(block->size + sizeof(memblock_t)), sizeu2(block->size), filename ? filename + 1 : block->ownerfile, block->ownerline);
CONS_Printf("[%3d] %s (%s) bytes @ %s:%d tag: %d (%d)\n", block->tag, sizeu1(block->size + sizeof(memblock_t)), sizeu2(block->size), filename ? filename + 1 : block->ownerfile, block->ownerline, block->tag, i);
}
}
}
#endif
@@ -842,6 +804,27 @@ void* Z_LevelPoolMalloc(size_t size)
return p;
}
boolean Z_IsMobjValid2(void *p, const char *file, INT32 line)
{
//(void)file;
//(void)line;
// mobj was removed
// no need to worry here
if (p == NULL)
return false;
// mobjs reside in the large pool
if (!g_level_large_pool.ptrcheck(p))
{
//I_Error("invalid mobj! at %s:%d", file, line);
CONS_Alert(CONS_ERROR, "invalid mobj! at %s:%d", file, line);
return false;
}
return true;
}
void* Z_LevelPoolCalloc(size_t size)
{
void* p = Z_LevelPoolMalloc(size);
+30 -25
View File
@@ -42,39 +42,42 @@ extern "C" {
enum
{
// Tags < PU_LEVEL are not purged until freed explicitly.
PU_STATIC = 1, // static entire execution time
PU_LUA = 2, // static entire execution time -- used by lua so it doesn't get caught in loops forever
PU_PERFSTATS = 3, // static between changes to ps_samplesize cvar
PU_STATIC = 0, // static entire execution time
PU_LUA, // static entire execution time -- used by lua so it doesn't get caught in loops forever
PU_PERFSTATS, // static between changes to ps_samplesize cvar
PU_SOUND = 11, // static while playing
PU_MUSIC = 12, // static while playing
PU_SOUND, // static while playing
PU_MUSIC, // static while playing
PU_PATCH = 14, // static entire execution time
PU_PATCH_LOWPRIORITY = 15, // lower priority patch, static until level exited
PU_PATCH_ROTATED = 16, // rotated patch, static entire execution time
PU_PATCH_DATA = 17, // patch data, lifetime depends on the patch that owns it
PU_SPRITE = 18, // sprite patch, static until WAD added
PU_HUDGFX = 19, // HUD patch, static until WAD added
PU_PATCH, // static entire execution time
PU_PATCH_LOWPRIORITY, // lower priority patch, static until level exited
PU_PATCH_ROTATED, // rotated patch, static until level exited or WAD added
PU_PATCH_DATA, // patch data, lifetime depends on the patch that owns it
PU_SPRITE, // sprite patch, static until WAD added
PU_HUDGFX, // HUD patch, static until WAD added
PU_HWRPATCHINFO = 21, // Hardware GLPatch_t struct for OpenGL texture cache
PU_HWRPATCHCOLMIPMAP = 22, // Hardware GLMipmap_t struct colormap variation of patch
PU_HWRMODELTEXTURE = 23, // Hardware model texture
PU_HWRPATCHINFO, // Hardware GLPatch_t struct for OpenGL texture cache
PU_HWRPATCHCOLMIPMAP, // Hardware GLMipmap_t struct colormap variation of patch
PU_HWRMODELTEXTURE, // Hardware model texture
PU_HWRCACHE = 48, // static until unlocked
PU_CACHE = 49, // static until unlocked
PU_HWRCACHE, // static until unlocked
PU_CACHE, // static until unlocked
// Tags s.t. PU_LEVEL <= tag < PU_PURGELEVEL are purged at level start
PU_LEVEL = 50, // static until level exited
PU_LEVSPEC = 51, // a special thinker in a level
PU_HWRPLANE = 52, // if ZPLANALLOC is enabled in hw_bsp.c, this is used to alloc polygons for OpenGL
PU_LEVEL, // static until level exited
PU_LEVSPEC, // a special thinker in a level
PU_HWRPLANE, // if ZPLANALLOC is enabled in hw_bsp.c, this is used to alloc polygons for OpenGL
// Tags >= PU_PURGELEVEL are purgable whenever needed
PU_PURGELEVEL = 100, // Note: this is never actually used as a tag
PU_CACHE_UNLOCKED = 101, // Note: unused
PU_HWRCACHE_UNLOCKED = 102, // 'unlocked' PU_HWRCACHE memory:
PU_PURGELEVEL, // Note: this is never actually used as a tag
PU_CACHE_UNLOCKED, // Note: unused
PU_HWRCACHE_UNLOCKED, // 'unlocked' PU_HWRCACHE memory:
// 'second-level' cache for graphics
// stored in hardware format and downloaded as needed
PU_HWRMODELTEXTURE_UNLOCKED = 103, // 'unlocked' PU_HWRMODELTEXTURE memory
// stored in hardware format and downloaded as needed
PU_HWRMODELTEXTURE_UNLOCKED, // 'unlocked' PU_HWRMODELTEXTURE memory
NUM_PURGETAGS
};
//
@@ -157,7 +160,7 @@ void Z_SetUser(void *ptr, void **newuser);
//
#define Z_TagUsage(tagnum) Z_TagsUsage(tagnum, tagnum)
size_t Z_TagsUsage(INT32 lowtag, INT32 hightag);
#define Z_TotalUsage() Z_TagsUsage(0, INT32_MAX)
#define Z_TotalUsage() Z_TagsUsage(0, NUM_PURGETAGS-1)
//
// Miscellaneous functions
@@ -170,6 +173,8 @@ char *Z_StrDup(const char *in);
size_t Z_LevelPoolUsage(void);
void *Z_LevelPoolMalloc(size_t size);
void *Z_LevelPoolCalloc(size_t size);
#define Z_IsMobjValid(p) Z_IsMobjValid2(p, __FILE__, __LINE__)
boolean Z_IsMobjValid2(void *p, const char *file, INT32 line);
void Z_LevelPoolFree(void *p, size_t size);
// for use with CLEANUP macro