From 68ad3a1c627ac47ba2a19fe0b0d2ec38b443d3af Mon Sep 17 00:00:00 2001 From: spherallic Date: Fri, 1 Sep 2023 02:53:08 +0200 Subject: [PATCH 001/139] STJr intro tweaks: - Disable initial fade from startup screen - Add half-second pauses at the start and end --- src/d_main.c | 4 ++-- src/f_finale.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 24c70843a..6e17af258 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -297,8 +297,8 @@ void D_ProcessEvents(void) // added comment : there is a wipe eatch change of the gamestate gamestate_t wipegamestate = GS_LEVEL; // -1: Default; 0-n: Wipe index; INT16_MAX: do not wipe -INT16 wipetypepre = -1; -INT16 wipetypepost = -1; +INT16 wipetypepre = INT16_MAX; +INT16 wipetypepost = INT16_MAX; static void D_Display(void) { diff --git a/src/f_finale.c b/src/f_finale.c index 11ea909e9..c592c69bb 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -312,7 +312,7 @@ const char *introtext[NUMINTROSCENES]; static tic_t introscenetime[NUMINTROSCENES] = { - 5*TICRATE, // STJr Presents + 6*TICRATE, // STJr Presents 11*TICRATE + (TICRATE/2), // Two months had passed since... 15*TICRATE + (TICRATE/2), // As it was about to drain the rings... 14*TICRATE, // What Sonic, Tails, and Knuckles... @@ -622,15 +622,15 @@ void F_IntroDrawer(void) { V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - if (intro_curtime < TICRATE-5) // Make the text shine! + if (intro_curtime > TICRATE-17 && intro_curtime < 2*TICRATE-22) // Make the text shine! { - sprintf(stjrintro, "STJRI%03u", intro_curtime-1); + sprintf(stjrintro, "STJRI%03u", intro_curtime-19); } - else if (intro_curtime >= TICRATE-6 && intro_curtime < 2*TICRATE-20) // Pause on black screen for just a second + else if (intro_curtime >= 2*TICRATE-23 && intro_curtime < 2*TICRATE-3) // Pause on black screen for just a second { return; } - else if (intro_curtime == 2*TICRATE-19) + else if (intro_curtime == 2*TICRATE-2) { // Fade in the text // The text fade out is automatically handled when switching to a new intro scene @@ -949,7 +949,7 @@ void F_IntroTicker(void) if (rendermode != render_none) { - if (intro_scenenum == 0 && intro_curtime == 2*TICRATE-19) + if (intro_scenenum == 0 && intro_curtime == 2*TICRATE-2) { S_ChangeMusicInternal("_stjr", false); From 75c270d546583e1a6421f911561b76edb06069cc Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sat, 10 Feb 2024 18:55:10 +0100 Subject: [PATCH 002/139] Expose PF_SHIELDDOWN to Lua --- src/deh_tables.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index fa86518e2..1f8cebed6 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4483,6 +4483,8 @@ const char *const PLAYERFLAG_LIST[] = { "CANCARRY", // Can carry? "FINISHED", + "SHIELDDOWN", // Shield has been pressed. + NULL // stop loop here. }; From 07678311d1d84ee942bb69ab57eb430ec2523848 Mon Sep 17 00:00:00 2001 From: SSNTails Date: Thu, 15 Feb 2024 08:39:23 -0500 Subject: [PATCH 003/139] Missiles fired by player will not hit bots --- src/p_map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 7887c117d..dba8cc5cf 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1278,8 +1278,8 @@ static unsigned PIT_DoCheckThing(mobj_t *thing) if (tmthing->type != MT_SHELL && tmthing->target && tmthing->target->type == thing->type) { - // Don't hit same species as originator. - if (thing == tmthing->target) + // Don't hit yourself, and if a player, don't hit bots + if (thing == tmthing->target || (thing->player && thing->player->bot)) return CHECKTHING_IGNORE; if (thing->type != MT_PLAYER) From 2db0dc3ad983c2c4c2fd75ddc09ed1fa94701cfc Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 15 Feb 2024 10:32:21 -0500 Subject: [PATCH 004/139] Zwip-Zwap's suggestion of checking for coop and types of bots --- src/p_map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_map.c b/src/p_map.c index dba8cc5cf..0c976d5b0 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1279,7 +1279,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing) if (tmthing->type != MT_SHELL && tmthing->target && tmthing->target->type == thing->type) { // Don't hit yourself, and if a player, don't hit bots - if (thing == tmthing->target || (thing->player && thing->player->bot)) + if (thing == tmthing->target || (thing->player && gametype == GT_COOP && (thing->player->bot == BOT_2PAI || thing->player->bot == BOT_2PHUMAN))) return CHECKTHING_IGNORE; if (thing->type != MT_PLAYER) From 398b5a1840d93b67d9d6c862098896466e2e2289 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 15 Feb 2024 23:00:35 -0500 Subject: [PATCH 005/139] P_PlayerCanHurtPlayer() --- src/p_inter.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/p_local.h | 1 + src/p_map.c | 2 +- 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index 82169bc54..afcdd5217 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3279,6 +3279,67 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN return true; } +// +// P_PlayerCanHurtPlayer +// +// Is it permissible for a player to hurt another player? +// This should be the definitive global function to determine if pain is allowed. :) +// +boolean P_PlayerCanHurtPlayer(player_t *target, mobj_t *inflictor, player_t *source, UINT8 damagetype) +{ + if (!(damagetype & DMG_CANHURTSELF)) + { + // You can't kill yourself, idiot... + if (source == target) + return false; + + // In COOP/RACE, you can't hurt other players unless cv_friendlyfire is on + if (!(cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE)) && (gametyperules & GTR_FRIENDLY)) + return false; + } + + // Tag handling + if (G_TagGametype()) + { + // If flashing or invulnerable, ignore the tag, + if (target->powers[pw_flashing] || target->powers[pw_invulnerability]) + return false; + + // Don't allow any damage before the round starts. + if (leveltime <= hidetime * TICRATE) + return false; + + // Ignore IT players shooting each other, unless friendlyfire is on. + if ((target->pflags & PF_TAGIT && !((cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE) || (damagetype & DMG_CANHURTSELF)) + && source->pflags & PF_TAGIT))) + return false; + + // Don't allow players on the same team to hurt one another, + // unless cv_friendlyfire is on. + if (!(cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE) || (damagetype & DMG_CANHURTSELF)) && (target->pflags & PF_TAGIT) == (source->pflags & PF_TAGIT)) + return false; + + if (inflictor->type == MT_LHRT) + return false; + + return true; + } + else if (damagetype & DMG_CANHURTSELF) + return true; + else if (G_GametypeHasTeams()) // CTF + Team Match + { + // Don't allow players on the same team to hurt one another, + // unless cv_friendlyfire is on. + if (!(cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE)) && target->ctfteam == source->ctfteam) + return false; + } + + if (inflictor->type == MT_LHRT) + return false; + + return true; +} + static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) { player_t *player = target->player; diff --git a/src/p_local.h b/src/p_local.h index 9644e7a24..d4b32b005 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -506,6 +506,7 @@ void P_RemoveShield(player_t *player); void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source); boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); +boolean P_PlayerCanHurtPlayer(player_t *target, mobj_t *inflictor, player_t *source, UINT8 damagetype); void P_PlayerRingBurst(player_t *player, INT32 num_rings); /// \todo better fit in p_user.c void P_PlayerWeaponPanelBurst(player_t *player); void P_PlayerWeaponAmmoBurst(player_t *player); diff --git a/src/p_map.c b/src/p_map.c index 0c976d5b0..cdd66a12d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1279,7 +1279,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing) if (tmthing->type != MT_SHELL && tmthing->target && tmthing->target->type == thing->type) { // Don't hit yourself, and if a player, don't hit bots - if (thing == tmthing->target || (thing->player && gametype == GT_COOP && (thing->player->bot == BOT_2PAI || thing->player->bot == BOT_2PHUMAN))) + if (thing->player && tmthing->target->player && !P_PlayerCanHurtPlayer(thing->player, tmthing, tmthing->target->player, 0)) return CHECKTHING_IGNORE; if (thing->type != MT_PLAYER) From 5e29cd84a2cd3b69dd793b3f006b3980052c138b Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 16 Feb 2024 11:46:37 -0500 Subject: [PATCH 006/139] Stash changes --- src/p_inter.c | 18 ++++++++++-------- src/p_local.h | 2 +- src/p_map.c | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index afcdd5217..77604208f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3280,13 +3280,21 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN } // -// P_PlayerCanHurtPlayer +// P_CanPlayerHurtPlayer // // Is it permissible for a player to hurt another player? // This should be the definitive global function to determine if pain is allowed. :) // -boolean P_PlayerCanHurtPlayer(player_t *target, mobj_t *inflictor, player_t *source, UINT8 damagetype) +boolean P_CanPlayerHurtPlayer(player_t *target, mobj_t *inflictor, player_t *source, UINT8 damagetype) { + I_Assert(target != NULL); + I_Assert(source != NULL); + I_Assert(inflictor != NULL); + + // MT_LHRT should return true here, because we want it to go through the 'damage' process + if (inflictor->type == MT_LHRT) + return true; + if (!(damagetype & DMG_CANHURTSELF)) { // You can't kill yourself, idiot... @@ -3319,9 +3327,6 @@ boolean P_PlayerCanHurtPlayer(player_t *target, mobj_t *inflictor, player_t *sou if (!(cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE) || (damagetype & DMG_CANHURTSELF)) && (target->pflags & PF_TAGIT) == (source->pflags & PF_TAGIT)) return false; - if (inflictor->type == MT_LHRT) - return false; - return true; } else if (damagetype & DMG_CANHURTSELF) @@ -3334,9 +3339,6 @@ boolean P_PlayerCanHurtPlayer(player_t *target, mobj_t *inflictor, player_t *sou return false; } - if (inflictor->type == MT_LHRT) - return false; - return true; } diff --git a/src/p_local.h b/src/p_local.h index d4b32b005..136b7df28 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -506,7 +506,7 @@ void P_RemoveShield(player_t *player); void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source); boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); -boolean P_PlayerCanHurtPlayer(player_t *target, mobj_t *inflictor, player_t *source, UINT8 damagetype); +boolean P_CanPlayerHurtPlayer(player_t *target, mobj_t *inflictor, player_t *source, UINT8 damagetype); void P_PlayerRingBurst(player_t *player, INT32 num_rings); /// \todo better fit in p_user.c void P_PlayerWeaponPanelBurst(player_t *player); void P_PlayerWeaponAmmoBurst(player_t *player); diff --git a/src/p_map.c b/src/p_map.c index cdd66a12d..b18f0d1c1 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1279,7 +1279,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing) if (tmthing->type != MT_SHELL && tmthing->target && tmthing->target->type == thing->type) { // Don't hit yourself, and if a player, don't hit bots - if (thing->player && tmthing->target->player && !P_PlayerCanHurtPlayer(thing->player, tmthing, tmthing->target->player, 0)) + if (thing->player && tmthing->target->player && !P_CanPlayerHurtPlayer(thing->player, tmthing, tmthing->target->player, 0)) return CHECKTHING_IGNORE; if (thing->type != MT_PLAYER) From dc625496d89ba310fe36a8335704d4fdab2fc7bb Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 16 Feb 2024 12:27:25 -0500 Subject: [PATCH 007/139] re-introduce the thing == tmthing->target check, so it applies to non-players --- src/p_map.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_map.c b/src/p_map.c index b18f0d1c1..d4083cfd7 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1279,7 +1279,8 @@ static unsigned PIT_DoCheckThing(mobj_t *thing) if (tmthing->type != MT_SHELL && tmthing->target && tmthing->target->type == thing->type) { // Don't hit yourself, and if a player, don't hit bots - if (thing->player && tmthing->target->player && !P_CanPlayerHurtPlayer(thing->player, tmthing, tmthing->target->player, 0)) + if (thing == tmthing->target + || (thing->player && tmthing->target->player && !P_CanPlayerHurtPlayer(thing->player, tmthing, tmthing->target->player, 0))) return CHECKTHING_IGNORE; if (thing->type != MT_PLAYER) From 487f4ef49fe7c8ff27614393cab85d7ba2d540e9 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sat, 17 Feb 2024 10:55:43 +0100 Subject: [PATCH 008/139] Fix addon loading issues with symlinks on Linux/*BSD --- src/filesrch.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/filesrch.c b/src/filesrch.c index 6429b6fa2..734a599b3 100644 --- a/src/filesrch.c +++ b/src/filesrch.c @@ -444,12 +444,11 @@ filestatus_t filesearch(char *filename, const char *startpath, const UINT8 *want strcpy(&searchpath[searchpathindex[depthleft]],dent->d_name); #if defined(__linux__) || defined(__FreeBSD__) - if (dent->d_type == DT_UNKNOWN) - if (lstat(searchpath,&fsstat) == 0 && S_ISDIR(fsstat.st_mode)) + if (dent->d_type == DT_UNKNOWN || dent->d_type == DT_LNK) + if (stat(searchpath,&fsstat) == 0 && S_ISDIR(fsstat.st_mode)) dent->d_type = DT_DIR; // Linux and FreeBSD has a special field for file type on dirent, so use that to speed up lookups. - // FIXME: should we also follow symlinks? if (dent->d_type == DT_DIR && depthleft) #else if (stat(searchpath,&fsstat) < 0) // do we want to follow symlinks? if not: change it to lstat From 9a75ef18c388b7e5d1aab13c201695944153945a Mon Sep 17 00:00:00 2001 From: Arthur Date: Sat, 17 Feb 2024 10:04:34 -0500 Subject: [PATCH 009/139] Sometimes simple is better..? --- src/p_inter.c | 63 --------------------------------------------------- src/p_local.h | 1 - src/p_map.c | 2 +- 3 files changed, 1 insertion(+), 65 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 77604208f..82169bc54 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3279,69 +3279,6 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN return true; } -// -// P_CanPlayerHurtPlayer -// -// Is it permissible for a player to hurt another player? -// This should be the definitive global function to determine if pain is allowed. :) -// -boolean P_CanPlayerHurtPlayer(player_t *target, mobj_t *inflictor, player_t *source, UINT8 damagetype) -{ - I_Assert(target != NULL); - I_Assert(source != NULL); - I_Assert(inflictor != NULL); - - // MT_LHRT should return true here, because we want it to go through the 'damage' process - if (inflictor->type == MT_LHRT) - return true; - - if (!(damagetype & DMG_CANHURTSELF)) - { - // You can't kill yourself, idiot... - if (source == target) - return false; - - // In COOP/RACE, you can't hurt other players unless cv_friendlyfire is on - if (!(cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE)) && (gametyperules & GTR_FRIENDLY)) - return false; - } - - // Tag handling - if (G_TagGametype()) - { - // If flashing or invulnerable, ignore the tag, - if (target->powers[pw_flashing] || target->powers[pw_invulnerability]) - return false; - - // Don't allow any damage before the round starts. - if (leveltime <= hidetime * TICRATE) - return false; - - // Ignore IT players shooting each other, unless friendlyfire is on. - if ((target->pflags & PF_TAGIT && !((cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE) || (damagetype & DMG_CANHURTSELF)) - && source->pflags & PF_TAGIT))) - return false; - - // Don't allow players on the same team to hurt one another, - // unless cv_friendlyfire is on. - if (!(cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE) || (damagetype & DMG_CANHURTSELF)) && (target->pflags & PF_TAGIT) == (source->pflags & PF_TAGIT)) - return false; - - return true; - } - else if (damagetype & DMG_CANHURTSELF) - return true; - else if (G_GametypeHasTeams()) // CTF + Team Match - { - // Don't allow players on the same team to hurt one another, - // unless cv_friendlyfire is on. - if (!(cv_friendlyfire.value || (gametyperules & GTR_FRIENDLYFIRE)) && target->ctfteam == source->ctfteam) - return false; - } - - return true; -} - static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype) { player_t *player = target->player; diff --git a/src/p_local.h b/src/p_local.h index 136b7df28..9644e7a24 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -506,7 +506,6 @@ void P_RemoveShield(player_t *player); void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source); boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); -boolean P_CanPlayerHurtPlayer(player_t *target, mobj_t *inflictor, player_t *source, UINT8 damagetype); void P_PlayerRingBurst(player_t *player, INT32 num_rings); /// \todo better fit in p_user.c void P_PlayerWeaponPanelBurst(player_t *player); void P_PlayerWeaponAmmoBurst(player_t *player); diff --git a/src/p_map.c b/src/p_map.c index d4083cfd7..32428208b 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1280,7 +1280,7 @@ static unsigned PIT_DoCheckThing(mobj_t *thing) { // Don't hit yourself, and if a player, don't hit bots if (thing == tmthing->target - || (thing->player && tmthing->target->player && !P_CanPlayerHurtPlayer(thing->player, tmthing, tmthing->target->player, 0))) + || (thing->player && tmthing->target->player && (thing->player->bot == BOT_2PAI || thing->player->bot == BOT_2PHUMAN))) return CHECKTHING_IGNORE; if (thing->type != MT_PLAYER) From ea218c2e68839f025661607e6e2ef02d2b230ae3 Mon Sep 17 00:00:00 2001 From: SSNTails Date: Wed, 21 Feb 2024 19:25:57 -0500 Subject: [PATCH 010/139] Can't have a radius of 0 here! --- src/p_map.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 7887c117d..76be8851b 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3964,23 +3964,25 @@ stairstep: mo->momy = tmymove; } + const fixed_t tmradius = mo->radius > 8 ? mo->radius : 8; + do { - if (tmxmove > mo->radius) { - newx = mo->x + mo->radius; - tmxmove -= mo->radius; - } else if (tmxmove < -mo->radius) { - newx = mo->x - mo->radius; - tmxmove += mo->radius; + if (tmxmove > tmradius) { + newx = mo->x + tmradius; + tmxmove -= tmradius; + } else if (tmxmove < -tmradius) { + newx = mo->x - tmradius; + tmxmove += tmradius; } else { newx = mo->x + tmxmove; tmxmove = 0; } - if (tmymove > mo->radius) { - newy = mo->y + mo->radius; - tmymove -= mo->radius; - } else if (tmymove < -mo->radius) { - newy = mo->y - mo->radius; - tmymove += mo->radius; + if (tmymove > tmradius) { + newy = mo->y + tmradius; + tmymove -= tmradius; + } else if (tmymove < -tmradius) { + newy = mo->y - tmradius; + tmymove += tmradius; } else { newy = mo->y + tmymove; tmymove = 0; From de8464cd2f8217e1cd1f50c195a185929e5071de Mon Sep 17 00:00:00 2001 From: MIDIMan Date: Sat, 24 Feb 2024 20:04:48 -0500 Subject: [PATCH 011/139] Add alpha support for mobjs --- src/hardware/hw_main.c | 15 ++++++++++++++- src/lua_mobjlib.c | 13 +++++++++++++ src/p_mobj.c | 4 ++++ src/p_mobj.h | 1 + src/p_saveg.c | 9 ++++++++- src/p_user.c | 1 + src/r_things.c | 18 ++++++++++++++++++ src/r_things.h | 1 + 8 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 5a0d997fa..40f17301b 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -2825,7 +2825,7 @@ static void HWR_DrawDropShadow(mobj_t *thing, fixed_t scale) } HWR_Lighting(&sSurf, 0, colormap); - sSurf.PolyColor.s.alpha = alpha; + sSurf.PolyColor.s.alpha = FixedMul(thing->alpha, alpha); if (HWR_UseShader()) { @@ -2999,11 +2999,16 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) // baseWallVerts is used to know the final shape to easily get the vertex // co-ordinates memcpy(wallVerts, baseWallVerts, sizeof(baseWallVerts)); + + UINT32 newalpha = spr->mobj->alpha; // if sprite has linkdraw, then dont write to z-buffer (by not using PF_Occlude) // this will result in sprites drawn afterwards to be drawn on top like intended when using linkdraw. if ((spr->mobj->flags2 & MF2_LINKDRAW) && spr->mobj->tracer) + { + newalpha = spr->mobj->tracer->alpha; occlusion = 0; + } else occlusion = PF_Occlude; @@ -3039,6 +3044,8 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) blend = HWR_GetBlendModeFlag(blendmode)|occlusion; if (!occlusion) use_linkdraw_hack = true; } + + Surf.PolyColor.s.alpha = FixedMul(newalpha, Surf.PolyColor.s.alpha); if (HWR_UseShader()) { @@ -3488,11 +3495,15 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) FBITFIELD blend = 0; FBITFIELD occlusion; boolean use_linkdraw_hack = false; + UINT32 newalpha = spr->mobj->alpha; // if sprite has linkdraw, then dont write to z-buffer (by not using PF_Occlude) // this will result in sprites drawn afterwards to be drawn on top like intended when using linkdraw. if ((spr->mobj->flags2 & MF2_LINKDRAW) && spr->mobj->tracer) + { occlusion = 0; + newalpha = spr->mobj->tracer->alpha; + } else occlusion = PF_Occlude; @@ -3528,6 +3539,8 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) blend = HWR_GetBlendModeFlag(blendmode)|occlusion; if (!occlusion) use_linkdraw_hack = true; } + + Surf.PolyColor.s.alpha = FixedMul(newalpha, Surf.PolyColor.s.alpha); if (spr->renderflags & RF_SHADOWEFFECTS) { diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 7fd16b32b..79d839677 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -69,6 +69,7 @@ enum mobj_e { mobj_color, mobj_translation, mobj_blendmode, + mobj_alpha, mobj_bnext, mobj_bprev, mobj_hnext, @@ -150,6 +151,7 @@ static const char *const mobj_opt[] = { "color", "translation", "blendmode", + "alpha", "bnext", "bprev", "hnext", @@ -354,6 +356,9 @@ static int mobj_get(lua_State *L) case mobj_blendmode: lua_pushinteger(L, mo->blendmode); break; + case mobj_alpha: + lua_pushinteger(L, mo->alpha); + break; case mobj_bnext: if (mo->blocknode && mo->blocknode->bnext) { LUA_PushUserdata(L, mo->blocknode->bnext->mobj, META_MOBJ); @@ -733,6 +738,14 @@ static int mobj_set(lua_State *L) mo->blendmode = blendmode; break; } + case mobj_alpha: + INT32 alpha = (INT32)luaL_checkinteger(L, 3); + if (alpha < 0) + alpha = 0; + else if (alpha > FRACUNIT) + alpha = FRACUNIT; + mo->alpha = alpha; + break; case mobj_bnext: return NOSETPOS; case mobj_bprev: diff --git a/src/p_mobj.c b/src/p_mobj.c index 8bc6abc54..72a4c1ddb 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10503,6 +10503,9 @@ void P_MobjThinker(mobj_t *mobj) mobj->frame &= ~FF_TRANSMASK; mobj->frame |= value << FF_TRANSSHIFT; + + // TODO: Consider replacing the above with the commented-out line of code below + //mobj->alpha = FixedDiv(mobj->fuse, mobj->info->damage); } break; default: @@ -10838,6 +10841,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type, ...) // Sprite rendering mobj->blendmode = AST_TRANSLUCENT; + mobj->alpha = FRACUNIT; mobj->spritexscale = mobj->spriteyscale = mobj->scale; mobj->spritexoffset = mobj->spriteyoffset = 0; mobj->floorspriteslope = NULL; diff --git a/src/p_mobj.h b/src/p_mobj.h index f833415ed..401071295 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -313,6 +313,7 @@ typedef struct mobj_s UINT32 renderflags; // render flags INT32 blendmode; // blend mode + UINT32 alpha; // alpha fixed_t spritexscale, spriteyscale; fixed_t spritexoffset, spriteyoffset; fixed_t old_spritexscale, old_spriteyscale; diff --git a/src/p_saveg.c b/src/p_saveg.c index 6c6548c56..c8b812a3e 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1742,7 +1742,8 @@ typedef enum MD2_DISPOFFSET = 1<<23, MD2_DRAWONLYFORPLAYER = 1<<24, MD2_DONTDRAWFORVIEWMOBJ = 1<<25, - MD2_TRANSLATION = 1<<26 + MD2_TRANSLATION = 1<<26, + MD2_ALPHA = 1<<27 } mobj_diff2_t; typedef enum @@ -1985,6 +1986,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) diff2 |= MD2_DONTDRAWFORVIEWMOBJ; if (mobj->dispoffset != mobj->info->dispoffset) diff2 |= MD2_DISPOFFSET; + if (mobj->alpha < FRACUNIT) + diff2 |= MD2_ALPHA; if (diff2 != 0) diff |= MD_MORE; @@ -2168,6 +2171,8 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) WRITEINT32(save_p, mobj->dispoffset); if (diff2 & MD2_TRANSLATION) WRITEUINT16(save_p, mobj->translation); + if (diff2 & MD2_ALPHA) + WRITEUINT32(save_p, mobj->alpha); WRITEUINT32(save_p, mobj->mobjnum); } @@ -3234,6 +3239,8 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->dispoffset = mobj->info->dispoffset; if (diff2 & MD2_TRANSLATION) mobj->translation = READUINT16(save_p); + if (diff2 & MD2_ALPHA) + mobj->alpha = READUINT32(save_p); if (diff & MD_REDFLAG) { diff --git a/src/p_user.c b/src/p_user.c index 9d0eed288..2f73db272 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2065,6 +2065,7 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ghost->renderflags = mobj->renderflags; ghost->blendmode = mobj->blendmode; + ghost->alpha = mobj->alpha; ghost->spritexscale = mobj->spritexscale; ghost->spriteyscale = mobj->spriteyscale; diff --git a/src/r_things.c b/src/r_things.c index 57078b4a6..a27a03e77 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -763,6 +763,14 @@ UINT8 *R_GetTranslationForThing(mobj_t *mobj, skincolornum_t color, UINT16 trans return NULL; } +transnum_t R_GetTransmapFromAlpha(UINT32 alpha, transnum_t transmap) +{ + INT32 value = 10 - transmap; + value = 10 - (FixedCeil(alpha * value)>>FRACBITS); + + return value; +} + // // R_DrawVisSprite // mfloorclip and mceilingclip should also be set. @@ -1268,6 +1276,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, floordiff = abs((isflipped ? interp.height : 0) + interp.z - groundz); trans = floordiff / (100*FRACUNIT) + 3; + trans = R_GetTransmapFromAlpha(thing->alpha, trans); if (trans >= 9) return; scalemul = FixedMul(FRACUNIT - floordiff/640, scale); @@ -1952,6 +1961,11 @@ static void R_ProjectSprite(mobj_t *thing) } else trans = 0; + + if ((oldthing->flags2 & MF2_LINKDRAW) && oldthing->tracer) + trans = R_GetTransmapFromAlpha(oldthing->tracer->alpha, trans); + else + trans = R_GetTransmapFromAlpha(oldthing->alpha, trans); // Check if this sprite needs to be rendered like a shadow shadowdraw = (!!(thing->renderflags & RF_SHADOWDRAW) && !(papersprite || splat)); @@ -3414,6 +3428,10 @@ boolean R_ThingVisible (mobj_t *thing) (thing->sprite == SPR_NULL) || // Don't draw null-sprites (thing->flags2 & MF2_DONTDRAW) || // Don't draw MF2_LINKDRAW objects (thing->drawonlyforplayer && thing->drawonlyforplayer != viewplayer) || // Don't draw other players' personal objects + //(thing->alpha == 0) || // Don't draw objects with an alpha of 0 + ((rendermode == render_soft && R_GetTransmapFromAlpha(thing->alpha, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT) >= 10) || + (rendermode == render_opengl && thing->alpha == 0)) || // TODO: Maybe rethink this + //(rendermode == render_soft && R_GetTransmapFromAlpha(thing->alpha, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT) >= 10) || (!P_MobjWasRemoved(r_viewmobj) && ( (r_viewmobj == thing) || // Don't draw first-person players or awayviewmobj objects (r_viewmobj->player && r_viewmobj->player->followmobj == thing) || // Don't draw first-person players' followmobj diff --git a/src/r_things.h b/src/r_things.h index 043b454b0..086dd8b55 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -90,6 +90,7 @@ boolean R_ThingIsFullDark (mobj_t *thing); boolean R_ThingIsFlashing (mobj_t *thing); UINT8 *R_GetTranslationForThing(mobj_t *mobj, skincolornum_t color, UINT16 translation); +transnum_t R_GetTransmapFromAlpha(UINT32 alpha, transnum_t transmap); void R_ThingOffsetOverlay (mobj_t *thing, fixed_t *outx, fixed_t *outy); From d168bbaff38dbf325e2a7311fda1ff6466473cdc Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sat, 24 Feb 2024 16:28:02 -0500 Subject: [PATCH 012/139] compiling SRB2 with OSXCROSS --- .gitlab-ci.yml | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 016ac951b..9d870dcd7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -764,3 +764,81 @@ Alpine 3 GCC Dedicated: - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" + +osxcross x86_64: + stage: build + + when: manual + + allow_failure: true + + artifacts: + name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-clang" + + variables: + OSXCROSS_HOST: x86_64-apple-darwin21.4 + LD: x86_64-apple-darwin21.4-ld + + script: + - - | + # apt_development + echo -e "\e[0Ksection_start:`date +%s`:macports_development[collapsed=true]\r\e[0KInstalling development packages" + - osxcross-macports install curl libopenmpt libsdl2_mixer + - | + # apt_development + echo -e "\e[0Ksection_end:`date +%s`:macports_development\r\e[0K" + + - - | + # make + echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KBuilding Makefiles" + - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -D CPM_USE_LOCAL_PACKAGES:BOOL=ON -D OPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -D SDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -D SRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -D SRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -D SRB2_USE_LIBGME:BOOL=OFF -G "Unix Makefiles" + - | + # make + echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" + + - - | + # make + echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2" + - make --directory=build.osxcross--keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 + - | + # make + echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" + +osxcross arm64: + stage: build + + when: manual + + allow_failure: true + + artifacts: + name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-clang" + + variables: + OSXCROSS_HOST: arm64-apple-darwin21.4 + LD: arm64-apple-darwin21.4-ld + + script: + - - | + # apt_development + echo -e "\e[0Ksection_start:`date +%s`:macports_development[collapsed=true]\r\e[0KInstalling development packages" + - osxcross-macports install --arm64 curl libopenmpt libsdl2_mixer + - | + # apt_development + echo -e "\e[0Ksection_end:`date +%s`:macports_development\r\e[0K" + + - - | + # make + echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KBuilding Makefiles" + - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -D CPM_USE_LOCAL_PACKAGES:BOOL=ON -D OPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -D SDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -D SRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -D SRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -D SRB2_USE_LIBGME:BOOL=OFF -G "Unix Makefiles" + - | + # make + echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" + + - - | + # make + echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2" + - make --directory=build.osxcross--keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 + - | + # make + echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" From 4190106f2e6c0933b850ca01810fa37aa6cccada Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sat, 24 Feb 2024 16:40:41 -0500 Subject: [PATCH 013/139] Gitlab CI: cmake create config.h, keep that as an artifact --- .gitlab-ci.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9d870dcd7..15892b24d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -533,7 +533,7 @@ Debian stable Clang: artifacts: paths: - "build.clang/bin/" - - "build.clang/src/comptime.h" + - "build.clang/src/config.h" expose_as: "clang" name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-clang" @@ -589,7 +589,7 @@ Debian testing Clang: artifacts: paths: - "build.clang/bin/" - - "build.clang/src/comptime.h" + - "build.clang/src/config.h" expose_as: "testing-clang" name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-testing-clang" @@ -773,6 +773,10 @@ osxcross x86_64: allow_failure: true artifacts: + paths: + - "build.osxcross/bin/" + - "build.osxcross/src/config.h" + expose_as: "Mac x86_64" name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-clang" variables: @@ -799,7 +803,7 @@ osxcross x86_64: - - | # make echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2" - - make --directory=build.osxcross--keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 + - make --directory=build.osxcross --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" @@ -812,6 +816,10 @@ osxcross arm64: allow_failure: true artifacts: + paths: + - "build.osxcross/bin/" + - "build.osxcross/src/config.h" + expose_as: "Mac arm64" name: "$CI_PROJECT_PATH_SLUG-$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA-clang" variables: @@ -838,7 +846,7 @@ osxcross arm64: - - | # make echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2" - - make --directory=build.osxcross--keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 + - make --directory=build.osxcross --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" From 1a8311d8edecb56956f62bc3d732c8cf7d718266 Mon Sep 17 00:00:00 2001 From: Alam Ed Arias Date: Sat, 24 Feb 2024 22:34:36 +0000 Subject: [PATCH 014/139] Update .gitlab-ci.yml file Do not fallback to Linux Makefile for Mac builds` Do not build with libgme, it needs to linked with C++ runtime library --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 15892b24d..d558e50ed 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -564,7 +564,7 @@ Debian stable Clang: - - | # cmake echo -e "\e[0Ksection_start:`date +%s`:cmake[collapsed=false]\r\e[0KBuilding Makefiles" - - cmake -B build.clang -D CPM_USE_LOCAL_PACKAGES:BOOL=ON -D SRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -D SRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -G "Unix Makefiles" + - cmake -B build.clang -DCPM_USE_LOCAL_PACKAGES:BOOL=ON -DSRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -DSRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -DSRB2_USE_LIBGME:BOOL=OFF -G "Unix Makefiles" - | # cmake echo -e "\e[0Ksection_end:`date +%s`:cmake\r\e[0K" @@ -572,7 +572,7 @@ Debian stable Clang: - - | # make echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2" - - make --directory=build.clang --keep-going || make --directory=src --keep-going + - make --directory=build.clang --keep-going || make --directory=build.clang --keep-going - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" @@ -795,7 +795,7 @@ osxcross x86_64: - - | # make echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KBuilding Makefiles" - - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -D CPM_USE_LOCAL_PACKAGES:BOOL=ON -D OPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -D SDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -D SRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -D SRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -D SRB2_USE_LIBGME:BOOL=OFF -G "Unix Makefiles" + - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -DCPM_USE_LOCAL_PACKAGES:BOOL=ON -DOPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -DSDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -DSRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -DSRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -DSRB2_USE_LIBGME:BOOL=OFF -G "Unix Makefiles" - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" @@ -803,7 +803,7 @@ osxcross x86_64: - - | # make echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2" - - make --directory=build.osxcross --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 + - make --directory=build.osxcross --keep-going || make --directory=build.osxcross --keep-going - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" @@ -838,7 +838,7 @@ osxcross arm64: - - | # make echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KBuilding Makefiles" - - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -D CPM_USE_LOCAL_PACKAGES:BOOL=ON -D OPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -D SDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -D SRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -D SRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -D SRB2_USE_LIBGME:BOOL=OFF -G "Unix Makefiles" + - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -DCPM_USE_LOCAL_PACKAGES:BOOL=ON -DOPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -DSDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -DSRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -DSRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -DSRB2_USE_LIBGME:BOOL=OFF -G "Unix Makefiles" - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" @@ -846,7 +846,7 @@ osxcross arm64: - - | # make echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KCompiling SRB2" - - make --directory=build.osxcross --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 || make --directory=src --keep-going CCACHE=1 ERRORMODE=1 NONX86=1 + - make --directory=build.osxcross --keep-going || make --directory=build.osxcross --keep-going - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" From 2ca791a2ad2d53926c03440afd1abb3a3b895dff Mon Sep 17 00:00:00 2001 From: Logan Aerl Arias Date: Sat, 24 Feb 2024 19:37:38 -0500 Subject: [PATCH 015/139] disable libgme by default --- CMakeLists.txt | 1 + src/CMakeLists.txt | 12 +++++++----- thirdparty/CMakeLists.txt | 4 +++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8803620e7..358e62cc4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,6 +70,7 @@ cmake_dependent_option( OFF ) option(SRB2_CONFIG_HWRENDER "Enable hardware render (OpenGL) support" ON) +option(SRB2_CONFIG_USE_GME "Enable GME playback support" OFF) option(SRB2_CONFIG_STATIC_OPENGL "Enable static linking GL (do not do this)" OFF) option(SRB2_CONFIG_ERRORMODE "Compile C code with warnings treated as errors." OFF) option(SRB2_CONFIG_DEBUGMODE "Compile with PARANOIA, ZDEBUG, RANGECHECK and PACKETDROP defined." OFF) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 160174080..1bdfc94f5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -173,11 +173,13 @@ if("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") target_compile_definitions(SRB2SDL2 PRIVATE -DMACOSX) endif() -target_link_libraries(SRB2SDL2 PRIVATE gme) -target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_GME) -if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") - # this sucks but gme doesn't use modern cmake to delineate public headers - target_include_directories(SRB2SDL2 PRIVATE "${libgme_SOURCE_DIR}") +if("${SRB2_CONFIG_USE_GME}") + target_link_libraries(SRB2SDL2 PRIVATE gme) + target_compile_definitions(SRB2SDL2 PRIVATE -DHAVE_GME) + if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") + # this sucks but gme doesn't use modern cmake to delineate public headers + target_include_directories(SRB2SDL2 PRIVATE "${libgme_SOURCE_DIR}") + endif() endif() target_link_libraries(SRB2SDL2 PRIVATE openmpt) diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index f33b3bf3f..19aa22c9b 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -18,4 +18,6 @@ if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") include("cpm-openmpt.cmake") endif() -include("cpm-libgme.cmake") +if("${SRB2_CONFIG_USE_GME}") + include("cpm-libgme.cmake") +endif() From eab8df9f35abe64a8423d63b355eddefda795e6e Mon Sep 17 00:00:00 2001 From: Logan Aerl Arias Date: Sun, 25 Feb 2024 00:52:40 +0000 Subject: [PATCH 016/139] auto build MacOSX binary for x86_64 --- .gitlab-ci.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d558e50ed..b21ce1b00 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -768,10 +768,6 @@ Alpine 3 GCC Dedicated: osxcross x86_64: stage: build - when: manual - - allow_failure: true - artifacts: paths: - "build.osxcross/bin/" @@ -795,7 +791,7 @@ osxcross x86_64: - - | # make echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KBuilding Makefiles" - - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -DCPM_USE_LOCAL_PACKAGES:BOOL=ON -DOPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -DSDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -DSRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -DSRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -DSRB2_USE_LIBGME:BOOL=OFF -G "Unix Makefiles" + - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -DCPM_USE_LOCAL_PACKAGES:BOOL=ON -DOPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -DSDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -DSRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -DSRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -DSRB2_CONFIG_USE_GME:BOOL=OFF -G "Unix Makefiles" - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" @@ -838,7 +834,7 @@ osxcross arm64: - - | # make echo -e "\e[0Ksection_start:`date +%s`:make[collapsed=false]\r\e[0KBuilding Makefiles" - - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -DCPM_USE_LOCAL_PACKAGES:BOOL=ON -DOPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -DSDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -DSRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -DSRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -DSRB2_USE_LIBGME:BOOL=OFF -G "Unix Makefiles" + - cmake -B build.osxcross --toolchain /osxcross/toolchain.cmake -DCPM_USE_LOCAL_PACKAGES:BOOL=ON -DOPENMPT_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/include" -DSDL2_INCLUDE_DIR:PATH="/osxcross/macports/pkgs/opt/local/lib" -DSRB2_CONFIG_ENABLE_TESTS:BOOL=OFF -DSRB2_CONFIG_SYSTEM_LIBRARIES:BOOL=ON -DSRB2_CONFIG_USE_GME:BOOL=OFF -G "Unix Makefiles" - | # make echo -e "\e[0Ksection_end:`date +%s`:make\r\e[0K" From 17e7aea311df6fead55921fa0ddacc72ca8eaf8a Mon Sep 17 00:00:00 2001 From: MIDIMan Date: Wed, 28 Feb 2024 14:41:17 -0500 Subject: [PATCH 017/139] Fix clang build error (hopefully) --- src/lua_mobjlib.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 79d839677..451ae6081 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -739,6 +739,7 @@ static int mobj_set(lua_State *L) break; } case mobj_alpha: + { INT32 alpha = (INT32)luaL_checkinteger(L, 3); if (alpha < 0) alpha = 0; @@ -746,6 +747,7 @@ static int mobj_set(lua_State *L) alpha = FRACUNIT; mo->alpha = alpha; break; + } case mobj_bnext: return NOSETPOS; case mobj_bprev: From d18a4cca1ebb6ada21cd691e7b9bffae016c8e52 Mon Sep 17 00:00:00 2001 From: MIDIMan Date: Fri, 1 Mar 2024 13:09:25 -0500 Subject: [PATCH 018/139] Clean up comments --- src/p_mobj.c | 4 +--- src/r_things.c | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index df08cb9be..15da6e616 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10493,6 +10493,7 @@ void P_MobjThinker(mobj_t *mobj) case MT_GRENADEPICKUP: if (mobj->health == 0) // Fading tile { + // TODO: Maybe use mobj->alpha instead of messing with frame flags INT32 value = mobj->info->damage/10; value = mobj->fuse/value; value = 10-value; @@ -10503,9 +10504,6 @@ void P_MobjThinker(mobj_t *mobj) mobj->frame &= ~FF_TRANSMASK; mobj->frame |= value << FF_TRANSSHIFT; - - // TODO: Consider replacing the above with the commented-out line of code below - //mobj->alpha = FixedDiv(mobj->fuse, mobj->info->damage); } break; default: diff --git a/src/r_things.c b/src/r_things.c index a27a03e77..defdc7aaa 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -3428,10 +3428,8 @@ boolean R_ThingVisible (mobj_t *thing) (thing->sprite == SPR_NULL) || // Don't draw null-sprites (thing->flags2 & MF2_DONTDRAW) || // Don't draw MF2_LINKDRAW objects (thing->drawonlyforplayer && thing->drawonlyforplayer != viewplayer) || // Don't draw other players' personal objects - //(thing->alpha == 0) || // Don't draw objects with an alpha of 0 ((rendermode == render_soft && R_GetTransmapFromAlpha(thing->alpha, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT) >= 10) || - (rendermode == render_opengl && thing->alpha == 0)) || // TODO: Maybe rethink this - //(rendermode == render_soft && R_GetTransmapFromAlpha(thing->alpha, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT) >= 10) || + (rendermode == render_opengl && thing->alpha == 0)) || (!P_MobjWasRemoved(r_viewmobj) && ( (r_viewmobj == thing) || // Don't draw first-person players or awayviewmobj objects (r_viewmobj->player && r_viewmobj->player->followmobj == thing) || // Don't draw first-person players' followmobj From a76544a3765d2bd9e69b420d60ff171bf76ac87b Mon Sep 17 00:00:00 2001 From: MIDIMan Date: Fri, 1 Mar 2024 16:29:39 -0500 Subject: [PATCH 019/139] Make alpha use fixed_t and add alpha field to precipmobj_t --- src/lua_mobjlib.c | 4 ++-- src/p_mobj.h | 3 ++- src/p_saveg.c | 6 +++--- src/r_things.c | 8 ++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 451ae6081..9a858c4b6 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -357,7 +357,7 @@ static int mobj_get(lua_State *L) lua_pushinteger(L, mo->blendmode); break; case mobj_alpha: - lua_pushinteger(L, mo->alpha); + lua_pushfixed(L, mo->alpha); break; case mobj_bnext: if (mo->blocknode && mo->blocknode->bnext) { @@ -740,7 +740,7 @@ static int mobj_set(lua_State *L) } case mobj_alpha: { - INT32 alpha = (INT32)luaL_checkinteger(L, 3); + fixed_t alpha = luaL_checkfixed(L, 3); if (alpha < 0) alpha = 0; else if (alpha > FRACUNIT) diff --git a/src/p_mobj.h b/src/p_mobj.h index 401071295..545f0847f 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -313,7 +313,7 @@ typedef struct mobj_s UINT32 renderflags; // render flags INT32 blendmode; // blend mode - UINT32 alpha; // alpha + fixed_t alpha; // alpha fixed_t spritexscale, spriteyscale; fixed_t spritexoffset, spriteyoffset; fixed_t old_spritexscale, old_spriteyscale; @@ -457,6 +457,7 @@ typedef struct precipmobj_s UINT32 renderflags; // render flags INT32 blendmode; // blend mode + fixed_t alpha; // alpha fixed_t spritexscale, spriteyscale; fixed_t spritexoffset, spriteyoffset; fixed_t old_spritexscale, old_spriteyscale; diff --git a/src/p_saveg.c b/src/p_saveg.c index 05cda779a..47f0b8297 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1745,7 +1745,7 @@ typedef enum MD2_DRAWONLYFORPLAYER = 1<<24, MD2_DONTDRAWFORVIEWMOBJ = 1<<25, MD2_TRANSLATION = 1<<26, - MD2_ALPHA = 1<<27 + MD2_ALPHA = 1<<27 } mobj_diff2_t; typedef enum @@ -2174,7 +2174,7 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) if (diff2 & MD2_TRANSLATION) WRITEUINT16(save_p, mobj->translation); if (diff2 & MD2_ALPHA) - WRITEUINT32(save_p, mobj->alpha); + WRITEFIXED(save_p, mobj->alpha); WRITEUINT32(save_p, mobj->mobjnum); } @@ -3242,7 +3242,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) if (diff2 & MD2_TRANSLATION) mobj->translation = READUINT16(save_p); if (diff2 & MD2_ALPHA) - mobj->alpha = READUINT32(save_p); + mobj->alpha = READFIXED(save_p); if (diff & MD_REDFLAG) { diff --git a/src/r_things.c b/src/r_things.c index defdc7aaa..843bf36ee 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1276,7 +1276,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, floordiff = abs((isflipped ? interp.height : 0) + interp.z - groundz); trans = floordiff / (100*FRACUNIT) + 3; - trans = R_GetTransmapFromAlpha(thing->alpha, trans); + trans = R_GetTransmapFromAlpha((UINT32)thing->alpha, trans); if (trans >= 9) return; scalemul = FixedMul(FRACUNIT - floordiff/640, scale); @@ -1963,9 +1963,9 @@ static void R_ProjectSprite(mobj_t *thing) trans = 0; if ((oldthing->flags2 & MF2_LINKDRAW) && oldthing->tracer) - trans = R_GetTransmapFromAlpha(oldthing->tracer->alpha, trans); + trans = R_GetTransmapFromAlpha((UINT32)oldthing->tracer->alpha, trans); else - trans = R_GetTransmapFromAlpha(oldthing->alpha, trans); + trans = R_GetTransmapFromAlpha((UINT32)oldthing->alpha, trans); // Check if this sprite needs to be rendered like a shadow shadowdraw = (!!(thing->renderflags & RF_SHADOWDRAW) && !(papersprite || splat)); @@ -3428,7 +3428,7 @@ boolean R_ThingVisible (mobj_t *thing) (thing->sprite == SPR_NULL) || // Don't draw null-sprites (thing->flags2 & MF2_DONTDRAW) || // Don't draw MF2_LINKDRAW objects (thing->drawonlyforplayer && thing->drawonlyforplayer != viewplayer) || // Don't draw other players' personal objects - ((rendermode == render_soft && R_GetTransmapFromAlpha(thing->alpha, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT) >= 10) || + ((rendermode == render_soft && R_GetTransmapFromAlpha((UINT32)thing->alpha, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT) >= 10) || (rendermode == render_opengl && thing->alpha == 0)) || (!P_MobjWasRemoved(r_viewmobj) && ( (r_viewmobj == thing) || // Don't draw first-person players or awayviewmobj objects From 509adc345409f321f54f5302aed007f19ccede86 Mon Sep 17 00:00:00 2001 From: MIDIMan Date: Sat, 2 Mar 2024 09:51:28 -0500 Subject: [PATCH 020/139] Change all remaining instances (hopefully) of UINT32 to fixed_t for alpha --- src/hardware/hw_main.c | 4 ++-- src/r_things.c | 10 +++++----- src/r_things.h | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 40f17301b..b58d58111 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3000,7 +3000,7 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) // co-ordinates memcpy(wallVerts, baseWallVerts, sizeof(baseWallVerts)); - UINT32 newalpha = spr->mobj->alpha; + fixed_t newalpha = spr->mobj->alpha; // if sprite has linkdraw, then dont write to z-buffer (by not using PF_Occlude) // this will result in sprites drawn afterwards to be drawn on top like intended when using linkdraw. @@ -3495,7 +3495,7 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) FBITFIELD blend = 0; FBITFIELD occlusion; boolean use_linkdraw_hack = false; - UINT32 newalpha = spr->mobj->alpha; + fixed_t newalpha = spr->mobj->alpha; // if sprite has linkdraw, then dont write to z-buffer (by not using PF_Occlude) // this will result in sprites drawn afterwards to be drawn on top like intended when using linkdraw. diff --git a/src/r_things.c b/src/r_things.c index 843bf36ee..cede03b80 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -763,7 +763,7 @@ UINT8 *R_GetTranslationForThing(mobj_t *mobj, skincolornum_t color, UINT16 trans return NULL; } -transnum_t R_GetTransmapFromAlpha(UINT32 alpha, transnum_t transmap) +transnum_t R_GetTransmapFromAlpha(fixed_t alpha, transnum_t transmap) { INT32 value = 10 - transmap; value = 10 - (FixedCeil(alpha * value)>>FRACBITS); @@ -1276,7 +1276,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, floordiff = abs((isflipped ? interp.height : 0) + interp.z - groundz); trans = floordiff / (100*FRACUNIT) + 3; - trans = R_GetTransmapFromAlpha((UINT32)thing->alpha, trans); + trans = R_GetTransmapFromAlpha(thing->alpha, trans); if (trans >= 9) return; scalemul = FixedMul(FRACUNIT - floordiff/640, scale); @@ -1963,9 +1963,9 @@ static void R_ProjectSprite(mobj_t *thing) trans = 0; if ((oldthing->flags2 & MF2_LINKDRAW) && oldthing->tracer) - trans = R_GetTransmapFromAlpha((UINT32)oldthing->tracer->alpha, trans); + trans = R_GetTransmapFromAlpha(oldthing->tracer->alpha, trans); else - trans = R_GetTransmapFromAlpha((UINT32)oldthing->alpha, trans); + trans = R_GetTransmapFromAlpha(oldthing->alpha, trans); // Check if this sprite needs to be rendered like a shadow shadowdraw = (!!(thing->renderflags & RF_SHADOWDRAW) && !(papersprite || splat)); @@ -3428,7 +3428,7 @@ boolean R_ThingVisible (mobj_t *thing) (thing->sprite == SPR_NULL) || // Don't draw null-sprites (thing->flags2 & MF2_DONTDRAW) || // Don't draw MF2_LINKDRAW objects (thing->drawonlyforplayer && thing->drawonlyforplayer != viewplayer) || // Don't draw other players' personal objects - ((rendermode == render_soft && R_GetTransmapFromAlpha((UINT32)thing->alpha, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT) >= 10) || + ((rendermode == render_soft && R_GetTransmapFromAlpha(thing->alpha, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT) >= 10) || (rendermode == render_opengl && thing->alpha == 0)) || (!P_MobjWasRemoved(r_viewmobj) && ( (r_viewmobj == thing) || // Don't draw first-person players or awayviewmobj objects diff --git a/src/r_things.h b/src/r_things.h index 086dd8b55..268e5562b 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -90,7 +90,7 @@ boolean R_ThingIsFullDark (mobj_t *thing); boolean R_ThingIsFlashing (mobj_t *thing); UINT8 *R_GetTranslationForThing(mobj_t *mobj, skincolornum_t color, UINT16 translation); -transnum_t R_GetTransmapFromAlpha(UINT32 alpha, transnum_t transmap); +transnum_t R_GetTransmapFromAlpha(fixed_t alpha, transnum_t transmap); void R_ThingOffsetOverlay (mobj_t *thing, fixed_t *outx, fixed_t *outy); From 02811b72f62e51a80a20c5816d2936e417cc7656 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Tue, 23 Jan 2024 22:43:25 +0100 Subject: [PATCH 021/139] Fix segfault when trying to spawn an MT_PLAYER from Lua --- src/lua_baselib.c | 4 ++-- src/p_local.h | 2 +- src/p_mobj.c | 18 ++++++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index e75a911ee..d6f125bbd 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -641,7 +641,7 @@ static int lib_pSpawnMobj(lua_State *L) NOHUD INLEVEL NOSPAWNNULL - LUA_PushUserdata(L, P_SpawnMobj(x, y, z, type), META_MOBJ); + LUA_PushUserdata(L, P_SpawnMobj(x, y, z, type, NULL), META_MOBJ); return 1; } @@ -657,7 +657,7 @@ static int lib_pSpawnMobjFromMobj(lua_State *L) NOSPAWNNULL if (!actor) return LUA_ErrInvalid(L, "mobj_t"); - LUA_PushUserdata(L, P_SpawnMobjFromMobj(actor, x, y, z, type), META_MOBJ); + LUA_PushUserdata(L, P_SpawnMobjFromMobj(actor, x, y, z, type, NULL), META_MOBJ); return 1; } diff --git a/src/p_local.h b/src/p_local.h index 0bcd6da1d..7e4741ffd 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -328,7 +328,7 @@ boolean P_CheckDeathPitCollide(mobj_t *mo); boolean P_CheckSolidLava(ffloor_t *rover); void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motype); -mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zofs, mobjtype_t type); +mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zofs, mobjtype_t type, ...); mobj_t *P_SpawnMissile(mobj_t *source, mobj_t *dest, mobjtype_t type); mobj_t *P_SpawnXYZMissile(mobj_t *source, mobj_t *dest, mobjtype_t type, fixed_t x, fixed_t y, fixed_t z); diff --git a/src/p_mobj.c b/src/p_mobj.c index 55be8e54f..c6f437c9a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -14420,15 +14420,29 @@ void P_FlashPal(player_t *pl, UINT16 type, UINT16 duration) // Spawns an object with offsets relative to the position of another object. // Scale, gravity flip, etc. is taken into account automatically. // -mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zofs, mobjtype_t type) +mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zofs, mobjtype_t type, ...) { + va_list args; mobj_t *newmobj; xofs = FixedMul(xofs, mobj->scale); yofs = FixedMul(yofs, mobj->scale); zofs = FixedMul(zofs, mobj->scale); - newmobj = P_SpawnMobj(mobj->x + xofs, mobj->y + yofs, mobj->z + zofs, type); + if (type == MT_PLAYER) + { + player_t *player; + // MT_PLAYER requires an additional parameter for the player, so pass that forth. + va_start(args, type); + player = va_arg(args, player_t *); + va_end(args); + newmobj = P_SpawnMobj(mobj->x + xofs, mobj->y + yofs, mobj->z + zofs, type, player); + } + else + { + newmobj = P_SpawnMobj(mobj->x + xofs, mobj->y + yofs, mobj->z + zofs, type); + } + if (!newmobj) return NULL; From 259997d121c0bc32cbcc062fc52507f381a21668 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Wed, 24 Jan 2024 17:11:04 +0100 Subject: [PATCH 022/139] Remove varargs from P_SpawnMobjFromMobj --- src/lua_baselib.c | 2 +- src/p_local.h | 2 +- src/p_mobj.c | 16 ++-------------- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index d6f125bbd..47ee3976d 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -657,7 +657,7 @@ static int lib_pSpawnMobjFromMobj(lua_State *L) NOSPAWNNULL if (!actor) return LUA_ErrInvalid(L, "mobj_t"); - LUA_PushUserdata(L, P_SpawnMobjFromMobj(actor, x, y, z, type, NULL), META_MOBJ); + LUA_PushUserdata(L, P_SpawnMobjFromMobj(actor, x, y, z, type), META_MOBJ); return 1; } diff --git a/src/p_local.h b/src/p_local.h index 7e4741ffd..0bcd6da1d 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -328,7 +328,7 @@ boolean P_CheckDeathPitCollide(mobj_t *mo); boolean P_CheckSolidLava(ffloor_t *rover); void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motype); -mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zofs, mobjtype_t type, ...); +mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zofs, mobjtype_t type); mobj_t *P_SpawnMissile(mobj_t *source, mobj_t *dest, mobjtype_t type); mobj_t *P_SpawnXYZMissile(mobj_t *source, mobj_t *dest, mobjtype_t type, fixed_t x, fixed_t y, fixed_t z); diff --git a/src/p_mobj.c b/src/p_mobj.c index c6f437c9a..3999c9476 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -14420,7 +14420,7 @@ void P_FlashPal(player_t *pl, UINT16 type, UINT16 duration) // Spawns an object with offsets relative to the position of another object. // Scale, gravity flip, etc. is taken into account automatically. // -mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zofs, mobjtype_t type, ...) +mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zofs, mobjtype_t type) { va_list args; mobj_t *newmobj; @@ -14429,19 +14429,7 @@ mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zo yofs = FixedMul(yofs, mobj->scale); zofs = FixedMul(zofs, mobj->scale); - if (type == MT_PLAYER) - { - player_t *player; - // MT_PLAYER requires an additional parameter for the player, so pass that forth. - va_start(args, type); - player = va_arg(args, player_t *); - va_end(args); - newmobj = P_SpawnMobj(mobj->x + xofs, mobj->y + yofs, mobj->z + zofs, type, player); - } - else - { - newmobj = P_SpawnMobj(mobj->x + xofs, mobj->y + yofs, mobj->z + zofs, type); - } + newmobj = P_SpawnMobj(mobj->x + xofs, mobj->y + yofs, mobj->z + zofs, type, NULL); if (!newmobj) return NULL; From b3aa23bc214e3aee7accca87d820c7943f012c13 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Wed, 24 Jan 2024 16:13:34 +0000 Subject: [PATCH 023/139] Remove unused variable --- src/p_mobj.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 3999c9476..4bed833fb 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -14422,7 +14422,6 @@ void P_FlashPal(player_t *pl, UINT16 type, UINT16 duration) // mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zofs, mobjtype_t type) { - va_list args; mobj_t *newmobj; xofs = FixedMul(xofs, mobj->scale); From 51e912e87be2dac061565bddeb1b0e56e867d71b Mon Sep 17 00:00:00 2001 From: Hanicef Date: Tue, 5 Mar 2024 18:29:07 +0100 Subject: [PATCH 024/139] Fix segfault when passing NULL as player --- src/p_mobj.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 4bed833fb..84884eef3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10886,7 +10886,8 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type, ...) // when spawning MT_PLAYER, set mobj->player before calling MobjSpawn hook to prevent P_RemoveMobj from succeeding on player mobj. va_start(args, type); mobj->player = va_arg(args, player_t *); - mobj->player->mo = mobj; + if (mobj->player) + mobj->player->mo = mobj; va_end(args); } From 7e3f6a28030bc62c4d464128a08de4eb21fbfbf0 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sun, 25 Feb 2024 19:05:16 +0100 Subject: [PATCH 025/139] Add variable to move idle players to spectators --- src/netcode/d_clisrv.c | 17 ++++++++++++++++- src/netcode/d_clisrv.h | 2 +- src/netcode/d_netcmd.c | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/netcode/d_clisrv.c b/src/netcode/d_clisrv.c index 2bf9d2dde..06c274f58 100644 --- a/src/netcode/d_clisrv.c +++ b/src/netcode/d_clisrv.c @@ -114,6 +114,7 @@ static CV_PossibleValue_t playbackspeed_cons_t[] = {{1, "MIN"}, {10, "MAX"}, {0, consvar_t cv_playbackspeed = CVAR_INIT ("playbackspeed", "1", 0, playbackspeed_cons_t, NULL); consvar_t cv_idletime = CVAR_INIT ("idletime", "0", CV_SAVE, CV_Unsigned, NULL); +consvar_t cv_idlespectate = CVAR_INIT ("idlespectate", "On", CV_SAVE, CV_OnOff, NULL); consvar_t cv_dedicatedidletime = CVAR_INIT ("dedicatedidletime", "10", CV_SAVE, CV_Unsigned, NULL); consvar_t cv_httpsource = CVAR_INIT ("http_source", "", CV_SAVE, NULL, NULL); @@ -1372,7 +1373,21 @@ static void IdleUpdate(void) if (players[i].lastinputtime > (tic_t)cv_idletime.value * TICRATE * 60) { players[i].lastinputtime = 0; - SendKick(i, KICK_MSG_IDLE | KICK_MSG_KEEP_BODY); + if (cv_idlespectate.value && G_GametypeHasSpectators()) + { + changeteam_union NetPacket; + UINT16 usvalue; + NetPacket.value.l = NetPacket.value.b = 0; + NetPacket.packet.newteam = 0; + NetPacket.packet.playernum = i; + NetPacket.packet.verification = true; // This signals that it's a server change + usvalue = SHORT(NetPacket.value.l|NetPacket.value.b); + SendNetXCmd(XD_TEAMCHANGE, &usvalue, sizeof(usvalue)); + } + else + { + SendKick(i, KICK_MSG_IDLE | KICK_MSG_KEEP_BODY); + } } } else diff --git a/src/netcode/d_clisrv.h b/src/netcode/d_clisrv.h index 5aac4693d..342173dff 100644 --- a/src/netcode/d_clisrv.h +++ b/src/netcode/d_clisrv.h @@ -73,7 +73,7 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; -extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_idletime, cv_dedicatedidletime; +extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_idletime, cv_idlespectate, cv_dedicatedidletime; extern consvar_t cv_httpsource; // Used in d_net, the only dependence diff --git a/src/netcode/d_netcmd.c b/src/netcode/d_netcmd.c index e073a863c..70a75714f 100644 --- a/src/netcode/d_netcmd.c +++ b/src/netcode/d_netcmd.c @@ -620,6 +620,7 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_blamecfail); CV_RegisterVar(&cv_dedicatedidletime); CV_RegisterVar(&cv_idletime); + CV_RegisterVar(&cv_idlespectate); CV_RegisterVar(&cv_httpsource); COM_AddCommand("ping", Command_Ping_f, COM_LUA); From 7d3c0ca3018edcdee2614e91173f8410413c5a08 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sun, 25 Feb 2024 19:16:12 +0100 Subject: [PATCH 026/139] Fix finished players getting kicked for idling --- src/netcode/d_clisrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/netcode/d_clisrv.c b/src/netcode/d_clisrv.c index 06c274f58..d46e75c3f 100644 --- a/src/netcode/d_clisrv.c +++ b/src/netcode/d_clisrv.c @@ -1363,7 +1363,7 @@ static void IdleUpdate(void) for (i = 1; i < MAXPLAYERS; i++) { - if (cv_idletime.value && playeringame[i] && playernode[i] != UINT8_MAX && !players[i].quittime && !players[i].spectator && !players[i].bot && !IsPlayerAdmin(i) && i != serverplayer && gamestate == GS_LEVEL) + if (cv_idletime.value && playeringame[i] && playernode[i] != UINT8_MAX && !players[i].quittime && !players[i].spectator && !players[i].bot && !IsPlayerAdmin(i) && i != serverplayer && gamestate == GS_LEVEL && !(players[i].pflags & PF_FINISHED)) { if (players[i].cmd.forwardmove || players[i].cmd.sidemove || players[i].cmd.buttons) players[i].lastinputtime = 0; From 8dce0e1a3f58c5f5d77cd227bc6f92ebfded5f0c Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 12 Mar 2024 17:29:08 +0100 Subject: [PATCH 027/139] Prevent white flash upon starting the game (in Software) --- src/d_main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/d_main.c b/src/d_main.c index 46e64267e..41c8e6336 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -749,6 +749,8 @@ void D_SRB2Loop(void) // hack to start on a nice clear console screen. COM_ImmedExecute("cls;version"); + // hack to prevent white flash upon initial window resize + V_DrawFill(0,0,BASEVIDWIDTH,BASEVIDHEIGHT,31); I_FinishUpdate(); // page flip or blit buffer /* From 01b017019b42dead468fe62ffed5c55cc8c8be3c Mon Sep 17 00:00:00 2001 From: Hanicef Date: Fri, 15 Mar 2024 21:35:28 +0100 Subject: [PATCH 028/139] Fix spectator list not compensating for non-green resolutions --- src/hu_stuff.c | 43 +++++-------------------------------------- 1 file changed, 5 insertions(+), 38 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 4e2f3d492..632c06585 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2458,53 +2458,20 @@ static inline void HU_DrawSpectatorTicker(void) { int i; int length = 0, height = 174; - int totallength = 0, templength = 0; + int totallength = 0; for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].spectator) totallength += (signed)strlen(player_names[i]) * 8 + 16; - length -= (leveltime % (totallength + BASEVIDWIDTH)); - length += BASEVIDWIDTH; + length -= (leveltime % (totallength + (vid.width / vid.dup))); + length += (vid.width / vid.dup); for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].spectator) { - char *pos; - char initial[MAXPLAYERNAME+1]; - char current[MAXPLAYERNAME+1]; - - strcpy(initial, player_names[i]); - pos = initial; - - if (length >= -((signed)strlen(player_names[i]) * 8 + 16) && length <= BASEVIDWIDTH) - { - if (length < 0) - { - UINT8 eatenchars = (UINT8)(abs(length) / 8 + 1); - - if (eatenchars <= strlen(initial)) - { - // Eat one letter off the left side, - // then compensate the drawing position. - pos += eatenchars; - strcpy(current, pos); - templength = length % 8 + 8; - } - else - { - strcpy(current, " "); - templength = length; - } - } - else - { - strcpy(current, initial); - templength = length; - } - - V_DrawString(templength, height + 8, V_TRANSLUCENT|V_ALLOWLOWERCASE, current); - } + if (length >= -((signed)strlen(player_names[i]) * 8 + 16) && length <= (vid.width / vid.dup)) + V_DrawString(length, height + 8, V_TRANSLUCENT|V_ALLOWLOWERCASE|V_SNAPTOLEFT, player_names[i]); length += (signed)strlen(player_names[i]) * 8 + 16; } From 8794e411bd57d9c5017ba38137770a586c558b06 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Wed, 20 Mar 2024 19:23:13 +0100 Subject: [PATCH 029/139] Don't traverse the entire HOME directory to find wads --- src/dedicated/i_system.c | 8 +++++++- src/sdl/i_system.c | 10 ++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/dedicated/i_system.c b/src/dedicated/i_system.c index 858dfaf20..b231080a8 100644 --- a/src/dedicated/i_system.c +++ b/src/dedicated/i_system.c @@ -1433,9 +1433,15 @@ static const char *locateWad(void) #ifndef NOHOME // find in $HOME - I_OutputMsg(",HOME"); + I_OutputMsg(",HOME/.srb2"); if ((envstr = I_GetEnv("HOME")) != NULL) + { + char *tmp = malloc(strlen(envstr) + sizeof("/.srb2")); + strcpy(tmp, envstr); + strcat(tmp, "/.srb2"); SEARCHWAD(envstr); + free(tmp); + } #endif // search paths diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 9f0fa0250..c6750ce74 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -3038,10 +3038,16 @@ static const char *locateWad(void) } #ifndef NOHOME - // find in $HOME - I_OutputMsg(",HOME"); + // find in $HOME/.srb2 + I_OutputMsg(",HOME/.srb2"); if ((envstr = I_GetEnv("HOME")) != NULL) + { + char *tmp = malloc(strlen(envstr) + sizeof("/.srb2")); + strcpy(tmp, envstr); + strcat(tmp, "/.srb2"); SEARCHWAD(envstr); + free(tmp); + } #endif // search paths From 10365e943aacd35d7b1052cdc4543556b94ee6f8 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Wed, 20 Mar 2024 20:44:17 +0100 Subject: [PATCH 030/139] Use DEFAULTDIR instead of hardcoding .srb2 --- src/dedicated/i_system.c | 6 +++--- src/sdl/i_system.c | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/dedicated/i_system.c b/src/dedicated/i_system.c index b231080a8..61b7a239a 100644 --- a/src/dedicated/i_system.c +++ b/src/dedicated/i_system.c @@ -1433,12 +1433,12 @@ static const char *locateWad(void) #ifndef NOHOME // find in $HOME - I_OutputMsg(",HOME/.srb2"); + I_OutputMsg(",HOME/" DEFAULTDIR); if ((envstr = I_GetEnv("HOME")) != NULL) { - char *tmp = malloc(strlen(envstr) + sizeof("/.srb2")); + char *tmp = malloc(strlen(envstr) + sizeof(DEFAULTDIR)); strcpy(tmp, envstr); - strcat(tmp, "/.srb2"); + strcat(tmp, DEFAULTDIR); SEARCHWAD(envstr); free(tmp); } diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index c6750ce74..64fcb2f2b 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -3038,13 +3038,13 @@ static const char *locateWad(void) } #ifndef NOHOME - // find in $HOME/.srb2 - I_OutputMsg(",HOME/.srb2"); + // find in $HOME + I_OutputMsg(",HOME/" DEFAULTDIR); if ((envstr = I_GetEnv("HOME")) != NULL) { - char *tmp = malloc(strlen(envstr) + sizeof("/.srb2")); + char *tmp = malloc(strlen(envstr) + sizeof(DEFAULTDIR)); strcpy(tmp, envstr); - strcat(tmp, "/.srb2"); + strcat(tmp, DEFAULTDIR); SEARCHWAD(envstr); free(tmp); } From d0dd329a8223c99ba84d70a59db3e977ca34e86e Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sat, 23 Mar 2024 13:01:21 +0100 Subject: [PATCH 031/139] Fix buffer overflow when loading addons through symlinks --- src/sdl/i_system.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 2d051888d..e151734f8 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2976,7 +2976,7 @@ static void pathonly(char *s) */ static const char *searchWad(const char *searchDir) { - static char tempsw[256] = ""; + static char tempsw[MAX_WADPATH] = ""; filestatus_t fstemp; strcpy(tempsw, WADKEYWORD1); From b2ff4e61674869b82d97b16ffcf7e9a13b506d39 Mon Sep 17 00:00:00 2001 From: katsy Date: Mon, 8 Apr 2024 00:07:51 -0500 Subject: [PATCH 032/139] Fix PlayerZMovement spam and infinite MFE_JUSTHITFLOOR when standing on a solid object --- src/p_mobj.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 9cdd2628d..ed7e25d40 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2245,7 +2245,7 @@ boolean P_ZMovement(mobj_t *mo) else if (!onground) P_SlopeLaunch(mo); } - + if (!mo->player && P_CheckDeathPitCollide(mo) && mo->health && !(mo->flags & MF_NOCLIPHEIGHT) && !(mo->flags2 & MF2_BOSSDEAD)) { @@ -2938,7 +2938,7 @@ boolean P_SceneryZMovement(mobj_t *mo) mo->eflags &= ~MFE_APPLYPMOMZ; } mo->z += mo->momz; - + if (!mo->player && P_CheckDeathPitCollide(mo) && mo->health && !(mo->flags & MF_NOCLIPHEIGHT) && !(mo->flags2 & MF2_BOSSDEAD)) { @@ -3781,7 +3781,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) // always do the gravity bit now, that's simpler // BUT CheckPosition only if wasn't done before. - if (!(mobj->eflags & MFE_ONGROUND) || mobj->momz + if (mobj->momz || ((mobj->eflags & MFE_VERTICALFLIP) && mobj->z + mobj->height != mobj->ceilingz) || (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z != mobj->floorz) || P_IsObjectInGoop(mobj)) @@ -3794,17 +3794,6 @@ static void P_PlayerMobjThinker(mobj_t *mobj) } else { -#if 0 // i don't know why this is here, it's causing a few undesired state glitches, and disabling it doesn't appear to negatively affect the game, but i don't want it gone permanently just in case some obscure bug crops up - if (!(mobj->player->powers[pw_carry] == CR_NIGHTSMODE)) // used for drilling - mobj->player->pflags &= ~PF_STARTJUMP; - mobj->player->pflags &= ~(PF_JUMPED|PF_NOJUMPDAMAGE); - if (mobj->player->secondjump || mobj->player->powers[pw_tailsfly]) - { - mobj->player->secondjump = 0; - mobj->player->powers[pw_tailsfly] = 0; - P_SetMobjState(mobj, S_PLAY_WALK); - } -#endif mobj->eflags &= ~MFE_JUSTHITFLOOR; } @@ -10730,7 +10719,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type, ...) // Set shadowscale here, before spawn hook so that Lua can change it mobj->shadowscale = P_DefaultMobjShadowScale(mobj); - + // A monitor can't respawn if we're not in multiplayer, // or if we're in co-op and it's score or a 1up if (mobj->flags & MF_MONITOR && (!(netgame || multiplayer) From 26da1e1e09574ed6cbc07fab924c3862f69fe036 Mon Sep 17 00:00:00 2001 From: VladDoc Date: Thu, 11 Apr 2024 22:36:12 +0300 Subject: [PATCH 033/139] Shaders with absent #version directive to compile on linux via prepending of said directive --- src/hardware/hw_shaders.c | 103 +++++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/src/hardware/hw_shaders.c b/src/hardware/hw_shaders.c index 36cbb5db9..32336d63f 100644 --- a/src/hardware/hw_shaders.c +++ b/src/hardware/hw_shaders.c @@ -448,6 +448,101 @@ void HWR_LoadAllCustomShaders(void) HWR_LoadCustomShadersFromFile(i, W_FileHasFolders(wadfiles[i])); } +static const char version_directives[][14] = { + "#version 330\n", + "#version 150\n", + "#version 140\n", + "#version 130\n", + "#version 120\n", + "#version 110\n", +}; + +static boolean HWR_VersionDirectiveExists(const char* source) +{ + return strncmp(source, "#version", 8) == 0; +} + +static char* HWR_PrependVersionDirective(const char* source, UINT32 version_index) +{ + const UINT32 version_len = sizeof(version_directives[version_index]) - 1; + const UINT32 source_len = strlen(source); + + char* result = Z_Malloc(source_len + version_len + 1, PU_STATIC, NULL); + + strcpy(result, version_directives[version_index]); + strcpy(result + version_len, source); + + return result; +} + +static void HWR_ReplaceVersionInplace(char* shader, UINT32 version_index) +{ + shader[9] = version_directives[version_index][9]; + shader[10] = version_directives[version_index][10]; + shader[11] = version_directives[version_index][11]; +} + +static boolean HWR_CheckVersionDirectives(const char* vert, const char* frag) +{ + return HWR_VersionDirectiveExists(vert) && HWR_VersionDirectiveExists(frag); +} + +static void HWR_TryToCompileShaderWithImplicitVersion(INT32 shader_index, INT32 shaderxlat_id) +{ + char* vert_shader = gl_shaders[shader_index].vertex; + char* frag_shader = gl_shaders[shader_index].fragment; + + boolean vert_shader_version_exists = HWR_VersionDirectiveExists(vert_shader); + boolean frag_shader_version_exists = HWR_VersionDirectiveExists(frag_shader); + + if(!vert_shader_version_exists) { + CONS_Alert(CONS_WARNING, "HWR_LoadCustomShadersFromFile: vertex shader '%s' is missing a #version directive\n", HWR_GetShaderName(shaderxlat_id)); + } + + if(!frag_shader_version_exists) { + CONS_Alert(CONS_WARNING, "HWR_LoadCustomShadersFromFile: fragment shader '%s' is missing a #version directive\n", HWR_GetShaderName(shaderxlat_id)); + } + + // try to compile as is + HWR_CompileShader(shader_index); + if (gl_shaders[shader_index].compiled) + return; + + // try each version directive + for(UINT32 i = 0; i < sizeof(version_directives) / sizeof(version_directives[0]); ++i) { + CONS_Alert(CONS_NOTICE, "HWR_TryToCompileShaderWithImplicitVersion: Trying %s\n", version_directives[i]); + + if(!vert_shader_version_exists) { + // first time reallocation would have to be made + if(i == 0) { + void* old = (void*)gl_shaders[shader_index].vertex; + vert_shader = gl_shaders[shader_index].vertex = HWR_PrependVersionDirective(vert_shader, i); + Z_Free(old); + } else { + HWR_ReplaceVersionInplace(vert_shader, i); + } + } + + if(!frag_shader_version_exists) { + if(i == 0) { + void* old = (void*)gl_shaders[shader_index].fragment; + frag_shader = gl_shaders[shader_index].fragment = HWR_PrependVersionDirective(frag_shader, i); + Z_Free(old); + } else { + HWR_ReplaceVersionInplace(frag_shader, i); + } + } + + HWR_CompileShader(shader_index); + if (gl_shaders[shader_index].compiled) { + CONS_Alert(CONS_NOTICE, "HWR_TryToCompileShaderWithImplicitVersion: Compiled with %s\n", + version_directives[i]); + CONS_Alert(CONS_WARNING, "Implicit GLSL version is used. Correct behavior is not guaranteed\n"); + return; + } + } +} + void HWR_LoadCustomShadersFromFile(UINT16 wadnum, boolean PK3) { UINT16 lump; @@ -610,7 +705,13 @@ skip_field: gl_shaders[shader_index].fragment = Z_StrDup(gl_shadersources[i].fragment); if (!gl_shaders[shader_index].vertex) gl_shaders[shader_index].vertex = Z_StrDup(gl_shadersources[i].vertex); - HWR_CompileShader(shader_index); + + if(!HWR_CheckVersionDirectives(gl_shaders[shader_index].vertex, gl_shaders[shader_index].fragment)) { + HWR_TryToCompileShaderWithImplicitVersion(shader_index, i); + } else { + HWR_CompileShader(shader_index); + } + if (!gl_shaders[shader_index].compiled) CONS_Alert(CONS_ERROR, "HWR_LoadCustomShadersFromFile: A compilation error occured for the %s shader in file %s. See the console messages above for more information.\n", shaderxlat[i].type, wadfiles[wadnum]->filename); } From fb437a3c72184584aa3cb33e009758e3b122ecc7 Mon Sep 17 00:00:00 2001 From: VladDoc Date: Fri, 12 Apr 2024 20:37:17 +0300 Subject: [PATCH 034/139] white space fix --- src/hardware/hw_shaders.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_shaders.c b/src/hardware/hw_shaders.c index 32336d63f..ee1e2acdf 100644 --- a/src/hardware/hw_shaders.c +++ b/src/hardware/hw_shaders.c @@ -468,11 +468,10 @@ static char* HWR_PrependVersionDirective(const char* source, UINT32 version_inde const UINT32 source_len = strlen(source); char* result = Z_Malloc(source_len + version_len + 1, PU_STATIC, NULL); - strcpy(result, version_directives[version_index]); - strcpy(result + version_len, source); + strcpy(result + version_len, source); - return result; + return result; } static void HWR_ReplaceVersionInplace(char* shader, UINT32 version_index) @@ -514,6 +513,7 @@ static void HWR_TryToCompileShaderWithImplicitVersion(INT32 shader_index, INT32 if(!vert_shader_version_exists) { // first time reallocation would have to be made + if(i == 0) { void* old = (void*)gl_shaders[shader_index].vertex; vert_shader = gl_shaders[shader_index].vertex = HWR_PrependVersionDirective(vert_shader, i); From 723b5662efe6b656d5b72f34a0ba7b4e926ba05d Mon Sep 17 00:00:00 2001 From: Zwip-Zwap Zapony Date: Thu, 18 Apr 2024 20:15:30 +0200 Subject: [PATCH 035/139] Fix CR_PLAYER/CR_PTERABYTE positioning --- src/p_user.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 7cd128cf0..b29b81271 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8812,6 +8812,8 @@ void P_MovePlayer(player_t *player) player->mo->height = P_GetPlayerSpinHeight(player); atspinheight = true; } + else if (player->powers[pw_carry] == CR_PLAYER || player->powers[pw_carry] == CR_PTERABYTE) // You're slightly shorter while being carried + player->mo->height = FixedDiv(P_GetPlayerHeight(player), FixedDiv(14*FRACUNIT,10*FRACUNIT)); else player->mo->height = P_GetPlayerHeight(player); @@ -12829,9 +12831,9 @@ void P_PlayerAfterThink(player_t *player) else { if (tails->player) - P_TryMove(player->mo, tails->x + P_ReturnThrustX(tails, tails->player->drawangle, 4*FRACUNIT), tails->y + P_ReturnThrustY(tails, tails->player->drawangle, 4*FRACUNIT), true); + P_TryMove(player->mo, tails->x + P_ReturnThrustX(tails, tails->player->drawangle, 4*tails->scale), tails->y + P_ReturnThrustY(tails, tails->player->drawangle, 4*tails->scale), true); else - P_TryMove(player->mo, tails->x + P_ReturnThrustX(tails, tails->angle, 4*FRACUNIT), tails->y + P_ReturnThrustY(tails, tails->angle, 4*FRACUNIT), true); + P_TryMove(player->mo, tails->x + P_ReturnThrustX(tails, tails->angle, 4*tails->scale), tails->y + P_ReturnThrustY(tails, tails->angle, 4*tails->scale), true); player->mo->momx = tails->momx; player->mo->momy = tails->momy; player->mo->momz = tails->momz; @@ -12845,7 +12847,7 @@ void P_PlayerAfterThink(player_t *player) P_SetPlayerAngle(player, player->mo->angle); } - if (P_AproxDistance(player->mo->x - tails->x, player->mo->y - tails->y) > player->mo->radius) + if (P_AproxDistance(player->mo->x - tails->x, player->mo->y - tails->y) > tails->radius) player->powers[pw_carry] = CR_NONE; if (player->powers[pw_carry] == CR_PLAYER) @@ -13066,7 +13068,7 @@ void P_PlayerAfterThink(player_t *player) player->mo->momy = ptera->momy; player->mo->momz = ptera->momz; - if (P_AproxDistance(player->mo->x - ptera->x - ptera->watertop, player->mo->y - ptera->y - ptera->waterbottom) > player->mo->radius) + if (P_AproxDistance(player->mo->x - ptera->x - ptera->watertop, player->mo->y - ptera->y - ptera->waterbottom) > ptera->radius) goto dropoff; ptera->watertop >>= 1; From df3b26878ac6e250768316a01ac8d8fe18484096 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 11 Feb 2024 05:33:20 -0800 Subject: [PATCH 036/139] Got_Luacmd: ensure lua stack is large enough for command arguments --- src/lua_consolelib.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/lua_consolelib.c b/src/lua_consolelib.c index 3783b8f7b..31d999440 100644 --- a/src/lua_consolelib.c +++ b/src/lua_consolelib.c @@ -30,6 +30,12 @@ return luaL_error(L, "HUD rendering code should not call this function!"); static consvar_t *this_cvar; +static void clear_lua_stack(void) +{ + if (gL) // check if Lua is actually turned on first, you dummmy -- Monster Iestyn 04/07/18 + lua_settop(gL, 0); // clear stack +} + void Got_Luacmd(UINT8 **cp, INT32 playernum) { UINT8 i, argc, flags; @@ -74,6 +80,13 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum) lua_remove(gL, -2); // pop command info table + if (!lua_checkstack(gL, argc)) // player + command arguments + { + clear_lua_stack(); + CONS_Alert(CONS_WARNING, "lua command stack overflow from %s (%d, need %d more)\n", player_names[playernum], lua_gettop(gL), argc); + return; + } + LUA_PushUserdata(gL, &players[playernum], META_PLAYER); for (i = 1; i < argc; i++) { @@ -85,8 +98,7 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum) deny: //must be hacked/buggy client - if (gL) // check if Lua is actually turned on first, you dummmy -- Monster Iestyn 04/07/18 - lua_settop(gL, 0); // clear stack + clear_lua_stack(); CONS_Alert(CONS_WARNING, M_GetText("Illegal lua command received from %s\n"), player_names[playernum]); if (server) From 388a72a89b9ea3fd6e4d3c3b2c7d14e1b7384975 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 11 Feb 2024 05:35:42 -0800 Subject: [PATCH 037/139] Got_Saycmd: copy message content into intermediate buffer This prevents modifying the original buffer at the cleanup step as well as potentially writing out of bounds. --- src/hu_stuff.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index e223d3208..180d31704 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -641,6 +641,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum) SINT8 target; UINT8 flags; const char *dispname; + char buf[HU_MAXMSGLEN + 1]; char *msg; boolean action = false; char *ptr; @@ -650,8 +651,8 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum) target = READSINT8(*p); flags = READUINT8(*p); - msg = (char *)*p; - SKIPSTRINGL(*p, HU_MAXMSGLEN + 1); + msg = buf; + READSTRINGL(*p, msg, HU_MAXMSGLEN + 1); if ((cv_mute.value || flags & (HU_CSAY|HU_SERVER_SAY)) && playernum != serverplayer && !(IsPlayerAdmin(playernum))) { From 73cf19038caf689404e52493d5cc4fc9b51e7bcb Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sun, 11 Feb 2024 15:10:51 -0600 Subject: [PATCH 038/139] Check Lua stack before pushing cons args Prevents a Lua stack overrun when executing absurd console commands for local-only lua commands. --- src/lua_consolelib.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lua_consolelib.c b/src/lua_consolelib.c index 31d999440..a1518a2fe 100644 --- a/src/lua_consolelib.c +++ b/src/lua_consolelib.c @@ -184,6 +184,11 @@ void COM_Lua_f(void) I_Assert(lua_isfunction(gL, -1)); lua_remove(gL, -2); // pop command info table + if (!lua_checkstack(gL, COM_Argc() + 1)) + { + CONS_Alert(CONS_WARNING, "lua command stack overflow (%d, need %s more)\n", lua_gettop(gL), sizeu1(COM_Argc() + 1)); + return; + } LUA_PushUserdata(gL, &players[playernum], META_PLAYER); for (i = 1; i < COM_Argc(); i++) lua_pushstring(gL, COM_Argv(i)); From 08ee6ca6b969179d05c7422d2d855d1f3bfb1890 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 11 Feb 2024 15:40:04 -0800 Subject: [PATCH 039/139] Got_Luacmd: always read netxcmd data, even if command is not executed --- src/lua_consolelib.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/lua_consolelib.c b/src/lua_consolelib.c index a1518a2fe..6010946ac 100644 --- a/src/lua_consolelib.c +++ b/src/lua_consolelib.c @@ -39,8 +39,18 @@ static void clear_lua_stack(void) void Got_Luacmd(UINT8 **cp, INT32 playernum) { UINT8 i, argc, flags; + const char *argv[256]; char buf[256]; + argc = READUINT8(*cp); + argv[0] = (const char*)*cp; + SKIPSTRINGN(*cp, 255); + for (i = 1; i < argc; i++) + { + argv[i] = (const char*)*cp; + SKIPSTRINGN(*cp, 255); + } + // don't use I_Assert here, goto the deny code below // to clean up and kick people who try nefarious exploits // like sending random junk lua commands to crash the server @@ -53,8 +63,7 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum) lua_getfield(gL, LUA_REGISTRYINDEX, "COM_Command"); // push COM_Command if (!lua_istable(gL, -1)) goto deny; - argc = READUINT8(*cp); - READSTRINGN(*cp, buf, 255); + strlcpy(buf, argv[0], 255); strlwr(buf); // must lowercase buffer lua_getfield(gL, -1, buf); // push command info table if (!lua_istable(gL, -1)) goto deny; @@ -90,7 +99,7 @@ void Got_Luacmd(UINT8 **cp, INT32 playernum) LUA_PushUserdata(gL, &players[playernum], META_PLAYER); for (i = 1; i < argc; i++) { - READSTRINGN(*cp, buf, 255); + strlcpy(buf, argv[i], 255); lua_pushstring(gL, buf); } LUA_Call(gL, (int)argc, 0, 1); // argc is 1-based, so this will cover the player we passed too. From df856aa823736124446a27ff48184c0b0f613053 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Tue, 7 May 2024 18:10:31 +0200 Subject: [PATCH 040/139] Do not access memory on misaligned addresses --- src/byteptr.h | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/src/byteptr.h b/src/byteptr.h index 8ab359c4c..4377fae57 100644 --- a/src/byteptr.h +++ b/src/byteptr.h @@ -11,9 +11,6 @@ /// \brief Macros to read/write from/to a UINT8 *, /// used for packet creation and such -#if defined (__alpha__) || defined (__arm__) || defined (__mips__) || defined (__ia64__) || defined (__clang__) -#define DEALIGNED -#endif #include "endian.h" @@ -21,7 +18,6 @@ // // Little-endian machines // -#ifdef DEALIGNED #define WRITEUINT8(p,b) do { UINT8 *p_tmp = (void *)p; const UINT8 tv = ( UINT8)(b); memcpy(p, &tv, sizeof( UINT8)); p_tmp++; p = (void *)p_tmp; } while (0) #define WRITESINT8(p,b) do { SINT8 *p_tmp = (void *)p; const SINT8 tv = ( UINT8)(b); memcpy(p, &tv, sizeof( UINT8)); p_tmp++; p = (void *)p_tmp; } while (0) #define WRITEINT16(p,b) do { INT16 *p_tmp = (void *)p; const INT16 tv = ( INT16)(b); memcpy(p, &tv, sizeof( INT16)); p_tmp++; p = (void *)p_tmp; } while (0) @@ -31,20 +27,8 @@ #define WRITECHAR(p,b) do { char *p_tmp = (void *)p; const char tv = ( char)(b); memcpy(p, &tv, sizeof( char)); p_tmp++; p = (void *)p_tmp; } while (0) #define WRITEFIXED(p,b) do { fixed_t *p_tmp = (void *)p; const fixed_t tv = (fixed_t)(b); memcpy(p, &tv, sizeof(fixed_t)); p_tmp++; p = (void *)p_tmp; } while (0) #define WRITEANGLE(p,b) do { angle_t *p_tmp = (void *)p; const angle_t tv = (angle_t)(b); memcpy(p, &tv, sizeof(angle_t)); p_tmp++; p = (void *)p_tmp; } while (0) -#else -#define WRITEUINT8(p,b) do { UINT8 *p_tmp = ( UINT8 *)p; *p_tmp = ( UINT8)(b); p_tmp++; p = (void *)p_tmp; } while (0) -#define WRITESINT8(p,b) do { SINT8 *p_tmp = ( SINT8 *)p; *p_tmp = ( SINT8)(b); p_tmp++; p = (void *)p_tmp; } while (0) -#define WRITEINT16(p,b) do { INT16 *p_tmp = ( INT16 *)p; *p_tmp = ( INT16)(b); p_tmp++; p = (void *)p_tmp; } while (0) -#define WRITEUINT16(p,b) do { UINT16 *p_tmp = ( UINT16 *)p; *p_tmp = ( UINT16)(b); p_tmp++; p = (void *)p_tmp; } while (0) -#define WRITEINT32(p,b) do { INT32 *p_tmp = ( INT32 *)p; *p_tmp = ( INT32)(b); p_tmp++; p = (void *)p_tmp; } while (0) -#define WRITEUINT32(p,b) do { UINT32 *p_tmp = ( UINT32 *)p; *p_tmp = ( UINT32)(b); p_tmp++; p = (void *)p_tmp; } while (0) -#define WRITECHAR(p,b) do { char *p_tmp = ( char *)p; *p_tmp = ( char)(b); p_tmp++; p = (void *)p_tmp; } while (0) -#define WRITEFIXED(p,b) do { fixed_t *p_tmp = (fixed_t *)p; *p_tmp = (fixed_t)(b); p_tmp++; p = (void *)p_tmp; } while (0) -#define WRITEANGLE(p,b) do { angle_t *p_tmp = (angle_t *)p; *p_tmp = (angle_t)(b); p_tmp++; p = (void *)p_tmp; } while (0) -#endif #ifdef __GNUC__ -#ifdef DEALIGNED #define READUINT8(p) ({ UINT8 *p_tmp = (void *)p; UINT8 b; memcpy(&b, p, sizeof( UINT8)); p_tmp++; p = (void *)p_tmp; b; }) #define READSINT8(p) ({ SINT8 *p_tmp = (void *)p; SINT8 b; memcpy(&b, p, sizeof( SINT8)); p_tmp++; p = (void *)p_tmp; b; }) #define READINT16(p) ({ INT16 *p_tmp = (void *)p; INT16 b; memcpy(&b, p, sizeof( INT16)); p_tmp++; p = (void *)p_tmp; b; }) @@ -55,17 +39,6 @@ #define READFIXED(p) ({ fixed_t *p_tmp = (void *)p; fixed_t b; memcpy(&b, p, sizeof(fixed_t)); p_tmp++; p = (void *)p_tmp; b; }) #define READANGLE(p) ({ angle_t *p_tmp = (void *)p; angle_t b; memcpy(&b, p, sizeof(angle_t)); p_tmp++; p = (void *)p_tmp; b; }) #else -#define READUINT8(p) ({ UINT8 *p_tmp = ( UINT8 *)p; UINT8 b = *p_tmp; p_tmp++; p = (void *)p_tmp; b; }) -#define READSINT8(p) ({ SINT8 *p_tmp = ( SINT8 *)p; SINT8 b = *p_tmp; p_tmp++; p = (void *)p_tmp; b; }) -#define READINT16(p) ({ INT16 *p_tmp = ( INT16 *)p; INT16 b = *p_tmp; p_tmp++; p = (void *)p_tmp; b; }) -#define READUINT16(p) ({ UINT16 *p_tmp = ( UINT16 *)p; UINT16 b = *p_tmp; p_tmp++; p = (void *)p_tmp; b; }) -#define READINT32(p) ({ INT32 *p_tmp = ( INT32 *)p; INT32 b = *p_tmp; p_tmp++; p = (void *)p_tmp; b; }) -#define READUINT32(p) ({ UINT32 *p_tmp = ( UINT32 *)p; UINT32 b = *p_tmp; p_tmp++; p = (void *)p_tmp; b; }) -#define READCHAR(p) ({ char *p_tmp = ( char *)p; char b = *p_tmp; p_tmp++; p = (void *)p_tmp; b; }) -#define READFIXED(p) ({ fixed_t *p_tmp = (fixed_t *)p; fixed_t b = *p_tmp; p_tmp++; p = (void *)p_tmp; b; }) -#define READANGLE(p) ({ angle_t *p_tmp = (angle_t *)p; angle_t b = *p_tmp; p_tmp++; p = (void *)p_tmp; b; }) -#endif -#else #define READUINT8(p) *(( UINT8 *)p)++ #define READSINT8(p) *(( SINT8 *)p)++ #define READINT16(p) *(( INT16 *)p)++ @@ -148,8 +121,6 @@ FUNCINLINE static ATTRINLINE UINT32 readulong(void *ptr) #define READANGLE(p) ({ angle_t *p_tmp = (angle_t *)p; angle_t b = readulong(p); p_tmp++; p = (void *)p_tmp; b; }) #endif //SRB2_BIG_ENDIAN -#undef DEALIGNED - #define WRITESTRINGN(p, s, n) { \ size_t tmp_i; \ \ From a19f843a3ecae75c2963918675c66c7dcae89d73 Mon Sep 17 00:00:00 2001 From: MIDIMan Date: Sun, 19 May 2024 22:21:09 -0400 Subject: [PATCH 041/139] Implement Lactozilla's suggestions and add 3D model support --- src/hardware/hw_md2.c | 7 +++++++ src/p_saveg.c | 2 +- src/r_things.c | 17 +++++++---------- src/r_things.h | 2 +- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 0bb8de851..d16700909 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1285,6 +1285,11 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) // Apparently people don't like jump frames like that, so back it goes //if (tics > durs) //durs = tics; + + // Make linkdraw objects use their tracer's alpha value + fixed_t newalpha = spr->mobj->alpha; + if ((spr->mobj->flags2 & MF2_LINKDRAW) && spr->mobj->tracer) + newalpha = spr->mobj->tracer->alpha; INT32 blendmode; if (spr->mobj->frame & FF_BLENDMASK) @@ -1299,6 +1304,8 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) Surf.PolyColor.s.alpha = (spr->mobj->flags2 & MF2_SHADOW) ? 0x40 : 0xff; Surf.PolyFlags = HWR_GetBlendModeFlag(blendmode); } + + Surf.PolyColor.s.alpha = FixedMul(newalpha, Surf.PolyColor.s.alpha); // don't forget to enable the depth test because we can't do this // like before: model polygons are not sorted diff --git a/src/p_saveg.c b/src/p_saveg.c index 1aed73784..219410bb6 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1990,7 +1990,7 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) diff2 |= MD2_DONTDRAWFORVIEWMOBJ; if (mobj->dispoffset != mobj->info->dispoffset) diff2 |= MD2_DISPOFFSET; - if (mobj->alpha < FRACUNIT) + if (mobj->alpha != FRACUNIT) diff2 |= MD2_ALPHA; if (diff2 != 0) diff --git a/src/r_things.c b/src/r_things.c index 41e1c144e..afa861832 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -992,12 +992,10 @@ UINT8 *R_GetTranslationForThing(mobj_t *mobj, skincolornum_t color, UINT16 trans return NULL; } -transnum_t R_GetTransmapFromAlpha(fixed_t alpha, transnum_t transmap) +// Based off of R_GetLinedefTransTable +transnum_t R_GetThingTransTable(fixed_t alpha, transnum_t transmap) { - INT32 value = 10 - transmap; - value = 10 - (FixedCeil(alpha * value)>>FRACBITS); - - return value; + return (20*(FRACUNIT - ((alpha * (10 - transmap))/10) - 1) + FRACUNIT) >> (FRACBITS+1); } // @@ -1505,7 +1503,7 @@ static void R_ProjectDropShadow(mobj_t *thing, vissprite_t *vis, fixed_t scale, floordiff = abs((isflipped ? interp.height : 0) + interp.z - groundz); trans = floordiff / (100*FRACUNIT) + 3; - trans = R_GetTransmapFromAlpha(thing->alpha, trans); + trans = R_GetThingTransTable(thing->alpha, trans); if (trans >= 9) return; scalemul = FixedMul(FRACUNIT - floordiff/640, scale); @@ -2194,9 +2192,9 @@ static void R_ProjectSprite(mobj_t *thing) trans = 0; if ((oldthing->flags2 & MF2_LINKDRAW) && oldthing->tracer) - trans = R_GetTransmapFromAlpha(oldthing->tracer->alpha, trans); + trans = R_GetThingTransTable(oldthing->tracer->alpha, trans); else - trans = R_GetTransmapFromAlpha(oldthing->alpha, trans); + trans = R_GetThingTransTable(oldthing->alpha, trans); // Check if this sprite needs to be rendered like a shadow shadowdraw = (!!(thing->renderflags & RF_SHADOWDRAW) && !(papersprite || splat)); @@ -3658,8 +3656,7 @@ boolean R_ThingVisible (mobj_t *thing) (thing->sprite == SPR_NULL) || // Don't draw null-sprites (thing->flags2 & MF2_DONTDRAW) || // Don't draw MF2_LINKDRAW objects (thing->drawonlyforplayer && thing->drawonlyforplayer != viewplayer) || // Don't draw other players' personal objects - ((rendermode == render_soft && R_GetTransmapFromAlpha(thing->alpha, (thing->frame & FF_TRANSMASK)>>FF_TRANSSHIFT) >= 10) || - (rendermode == render_opengl && thing->alpha == 0)) || + (!R_BlendLevelVisible(thing->blendmode, R_GetThingTransTable(thing->alpha, 0))) || (!P_MobjWasRemoved(r_viewmobj) && ( (r_viewmobj == thing) || // Don't draw first-person players or awayviewmobj objects (r_viewmobj->player && r_viewmobj->player->followmobj == thing) || // Don't draw first-person players' followmobj diff --git a/src/r_things.h b/src/r_things.h index 530898917..55ab71ec3 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -93,7 +93,7 @@ boolean R_ThingIsFullDark (mobj_t *thing); boolean R_ThingIsFlashing (mobj_t *thing); UINT8 *R_GetTranslationForThing(mobj_t *mobj, skincolornum_t color, UINT16 translation); -transnum_t R_GetTransmapFromAlpha(fixed_t alpha, transnum_t transmap); +transnum_t R_GetThingTransTable(fixed_t alpha, transnum_t transmap); void R_ThingOffsetOverlay (mobj_t *thing, fixed_t *outx, fixed_t *outy); From 68264e7288c4db5b5797d806bab7df8dc22a8d17 Mon Sep 17 00:00:00 2001 From: Refrag Date: Wed, 15 May 2024 20:03:04 +0200 Subject: [PATCH 042/139] Fix buffer overflow when setting a NETVAR string CVar There was a possible buffer overflow if you tried setting a console var that had the CV_NETVAR and that was of the string type. The overflow would happen if you were trying to set the console variable while in a multiplayer / netgame state. This commit just increases the size of buf to account for everything that needs to be written to it. --- src/command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command.c b/src/command.c index a46cc98bc..7947048ed 100644 --- a/src/command.c +++ b/src/command.c @@ -1992,7 +1992,7 @@ static void CV_SetCVar(consvar_t *var, const char *value, boolean stealth) if (var->flags & CV_NETVAR) { // send the value of the variable - UINT8 buf[128]; + UINT8 buf[512]; UINT8 *p = buf; // Loading from a config in a netgame? Set revert value. From c53da609b1d7eba57d460da8a3b7ac598ac25065 Mon Sep 17 00:00:00 2001 From: Zwip-Zwap Zapony Date: Tue, 28 May 2024 14:17:57 +0200 Subject: [PATCH 043/139] Shield button prompt for old configs --- src/m_menu.c | 37 +++++++++++++++++++++++++++++++++++++ src/m_menu.h | 1 + src/m_misc.c | 5 +++++ 3 files changed, 43 insertions(+) diff --git a/src/m_menu.c b/src/m_menu.c index 4d8ee17e8..86f8516b6 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -140,6 +140,7 @@ static char *char_notes = NULL; boolean menuactive = false; boolean fromlevelselect = false; +tic_t shieldbuttonprompt = 0; // Show a prompt about the new Shield button for old configs // TODO: 2.3: Remove typedef enum { @@ -3161,6 +3162,7 @@ static void Command_Manual_f(void) if (modeattacking) return; M_StartControlPanel(); + if (shieldbuttonprompt) return; // TODO: 2.3: Delete this line currentMenu = &MISC_HelpDef; itemOn = 0; } @@ -3340,6 +3342,7 @@ boolean M_Responder(event_t *ev) if (modeattacking) return true; M_StartControlPanel(); + if (shieldbuttonprompt) return true; // TODO: 2.3: Delete this line M_Options(0); // Uncomment the below if you want the menu to reset to the top each time like before. M_SetupNextMenu will fix it automatically. //OP_SoundOptionsDef.lastOn = 0; @@ -3350,6 +3353,7 @@ boolean M_Responder(event_t *ev) if (modeattacking) return true; M_StartControlPanel(); + if (shieldbuttonprompt) return true; // TODO: 2.3: Delete this line M_Options(0); M_VideoModeMenu(0); return true; @@ -3361,6 +3365,7 @@ boolean M_Responder(event_t *ev) if (modeattacking) return true; M_StartControlPanel(); + if (shieldbuttonprompt) return true; // TODO: 2.3: Delete this line M_Options(0); M_SetupNextMenu(&OP_MainDef); return true; @@ -3631,6 +3636,27 @@ void M_Drawer(void) } } +// Handle the "Do you want to assign Shield Ability now?" pop-up for old configs // TODO: 2.3: Remove +static void M_ShieldButtonResponse(INT32 ch) +{ + if (I_GetTime() <= shieldbuttonprompt) // Don't mash past the pop-up by accident! + { + stopstopmessage = true; + return; + } + + S_StartSound(NULL, sfx_menu1); + noFurtherInput = true; + shieldbuttonprompt = 0; + + if (ch == 'y' || ch == KEY_ENTER) + { + stopstopmessage = true; // Stop MessageDef from calling M_SetupNextMenu automatically + OP_ChangeControlsDef.lastOn = 8; // Highlight Shield Ability in the controls menu + M_Setup1PControlsMenu(ch); // Set up P1's controls menu and call M_SetupNextMenu + } +} + // // M_StartControlPanel // @@ -3662,6 +3688,17 @@ void M_StartControlPanel(void) currentMenu = &MainDef; itemOn = singleplr; M_UpdateItemOn(); + + if (shieldbuttonprompt) // For old configs, show a pop-up about the new Shield button // TODO: 2.3: Remove + { + S_StartSound(NULL, sfx_menu1); + shieldbuttonprompt = I_GetTime() + TICRATE; // Don't mash past the pop-up by accident! + + M_StartMessage(M_GetText("Welcome back! Since you last played,\nSpin has been split into separate\n\"Spin\" and \"Shield Ability\" controls." + "\n\nDo you want to \x82""assign Shield Ability now\x80""?" + "\n\n\nPress \x82""ENTER\x80"" or the \x83""A button\x80"" to accept\nPress \x82""ESC\x80"" or the \x85""B button\x80"" to skip\n"), + M_ShieldButtonResponse, MM_YESNO); + } } else if (modeattacking) { diff --git a/src/m_menu.h b/src/m_menu.h index 99a5b6de4..ea130a607 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -176,6 +176,7 @@ typedef struct extern menupres_t menupres[NUMMENUTYPES]; extern UINT32 prevMenuId; extern UINT32 activeMenuId; +extern tic_t shieldbuttonprompt; // Show a prompt about the new Shield button for old configs // TODO: 2.3: Remove void M_InitMenuPresTables(void); UINT8 M_GetYoungestChildMenu(void); diff --git a/src/m_misc.c b/src/m_misc.c index a60bbea98..ee810a031 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -560,6 +560,11 @@ void M_FirstLoadConfig(void) COM_BufInsertText(va("exec \"%s\"\n", configfile)); // no COM_BufExecute() needed; that does it right away + // For configs loaded at startup only, check for pre-Shield-button configs // TODO: 2.3: Remove + if (GETMAJOREXECVERSION(cv_execversion.value) < 55 // Pre-v2.2.14 configs + && cv_execversion.value != 25) // Make sure that the config exists, too + shieldbuttonprompt = 1; + // don't filter anymore vars and don't let this convsvar be changed COM_BufInsertText(va("%s \"%d\"\n", cv_execversion.name, EXECVERSION)); CV_ToggleExecVersion(false); From b1f15a35baf673ae970f606e6a46f7d4521e3f9b Mon Sep 17 00:00:00 2001 From: Zwip-Zwap Zapony Date: Tue, 28 May 2024 14:25:30 +0200 Subject: [PATCH 044/139] Use a three-option menu instead of a yes/no prompt --- src/m_menu.c | 249 ++++++++++++++++++++++++++++++++++++++++++++++----- src/m_menu.h | 2 +- src/m_misc.c | 2 +- 3 files changed, 227 insertions(+), 26 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 86f8516b6..a459abf41 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -140,7 +140,7 @@ static char *char_notes = NULL; boolean menuactive = false; boolean fromlevelselect = false; -tic_t shieldbuttonprompt = 0; // Show a prompt about the new Shield button for old configs // TODO: 2.3: Remove +tic_t shieldprompt_timer = 0; // Show a prompt about the new Shield button for old configs // TODO: 2.3: Remove typedef enum { @@ -3162,7 +3162,7 @@ static void Command_Manual_f(void) if (modeattacking) return; M_StartControlPanel(); - if (shieldbuttonprompt) return; // TODO: 2.3: Delete this line + if (shieldprompt_timer) return; // TODO: 2.3: Delete this line currentMenu = &MISC_HelpDef; itemOn = 0; } @@ -3342,7 +3342,7 @@ boolean M_Responder(event_t *ev) if (modeattacking) return true; M_StartControlPanel(); - if (shieldbuttonprompt) return true; // TODO: 2.3: Delete this line + if (shieldprompt_timer) return true; // TODO: 2.3: Delete this line M_Options(0); // Uncomment the below if you want the menu to reset to the top each time like before. M_SetupNextMenu will fix it automatically. //OP_SoundOptionsDef.lastOn = 0; @@ -3353,7 +3353,7 @@ boolean M_Responder(event_t *ev) if (modeattacking) return true; M_StartControlPanel(); - if (shieldbuttonprompt) return true; // TODO: 2.3: Delete this line + if (shieldprompt_timer) return true; // TODO: 2.3: Delete this line M_Options(0); M_VideoModeMenu(0); return true; @@ -3365,7 +3365,7 @@ boolean M_Responder(event_t *ev) if (modeattacking) return true; M_StartControlPanel(); - if (shieldbuttonprompt) return true; // TODO: 2.3: Delete this line + if (shieldprompt_timer) return true; // TODO: 2.3: Delete this line M_Options(0); M_SetupNextMenu(&OP_MainDef); return true; @@ -3636,27 +3636,230 @@ void M_Drawer(void) } } -// Handle the "Do you want to assign Shield Ability now?" pop-up for old configs // TODO: 2.3: Remove -static void M_ShieldButtonResponse(INT32 ch) +// Handle the "Do you want to assign Shield Ability now?" pop-up for old configs // TODO: 2.3: Remove this line... +static UINT8 shieldprompt_currentchoice = 0; // ...and this line... + +static void M_ShieldPromptUseDefaults(void) // ...and this function { - if (I_GetTime() <= shieldbuttonprompt) // Don't mash past the pop-up by accident! + // With a default config from v2.2.10 to v2.2.13, the B button will be set to Custom 1, + // and Controls per Key defaults to "One", so it will override the default Shield button. + // A default config from v2.2.0 to v2.2.9 has Next Weapon on B, so it suffers from this too. + + // So for "Use default Shield Ability buttons", we should update old configs to mitigate gamepad conflicts + // (even with "Several" Controls per Key!), and show a message with the default bindings + + for (setupcontrols = gamecontrol; true; setupcontrols = gamecontrolbis) // Do stuff for both P1 and P2 { - stopstopmessage = true; - return; + INT32 JOY1 = (setupcontrols == gamecontrol) ? KEY_JOY1 : KEY_2JOY1; // Is this for P1 or for P2? + + if ((setupcontrols[GC_CUSTOM1][0] == JOY1+1 || setupcontrols[GC_CUSTOM1][1] == JOY1+1) + && (setupcontrols[GC_CUSTOM2][0] == JOY1+3 || setupcontrols[GC_CUSTOM2][1] == JOY1+3) + && (setupcontrols[GC_CUSTOM3][0] == JOY1+8 || setupcontrols[GC_CUSTOM3][1] == JOY1+8)) + { + // If the player has v2.2.13's default gamepad Custom 1/2/3 buttons, + // shuffle Custom 1/2/3 around to make room for Shield Ability on B + UINT8 shield_slot = (setupcontrols[GC_SHIELD ][0] == KEY_NULL ) ? 0 : 1; + UINT8 custom1_slot = (setupcontrols[GC_CUSTOM1][0] == JOY1+1) ? 0 : 1; + UINT8 custom2_slot = (setupcontrols[GC_CUSTOM2][0] == JOY1+3) ? 0 : 1; + UINT8 custom3_slot = (setupcontrols[GC_CUSTOM3][0] == JOY1+8) ? 0 : 1; + + setupcontrols[GC_SHIELD ][shield_slot ] = JOY1+1; // Assign Shield Ability to B + setupcontrols[GC_CUSTOM1][custom1_slot] = JOY1+3; // Move Custom 1 from B to Y + setupcontrols[GC_CUSTOM2][custom2_slot] = JOY1+8; // Move Custom 2 from Y to LS + setupcontrols[GC_CUSTOM3][custom3_slot] = KEY_NULL; // Unassign Custom 3 from LS... + // (The alternative would be to check and update the ENTIRE gamepad layout. + // That'd be nice, but it would mess with people that are used to the old defaults.) + } + else if ((setupcontrols[GC_WEAPONNEXT][0] == JOY1+1 || setupcontrols[GC_WEAPONNEXT][1] == JOY1+1) + && (setupcontrols[GC_WEAPONPREV][0] == JOY1+2 || setupcontrols[GC_WEAPONPREV][1] == JOY1+2)) + { + // Or if the user has a default config from v2.2.0 to v2.2.9, + // the B button will be Next Weapon, and X will be Previous Weapon. + // It's "safe" to discard one of them, you just have to press X multiple times to select in the other direction + UINT8 shield_slot = (setupcontrols[GC_SHIELD ][0] == KEY_NULL ) ? 0 : 1; + UINT8 nweapon_slot = (setupcontrols[GC_WEAPONNEXT][0] == JOY1+1) ? 0 : 1; + UINT8 pweapon_slot = (setupcontrols[GC_WEAPONPREV][0] == JOY1+2) ? 0 : 1; + + setupcontrols[GC_SHIELD ][shield_slot ] = JOY1+1; // Assign Shield Ability to B + setupcontrols[GC_WEAPONNEXT][nweapon_slot] = JOY1+3; // Move Next Weapon from B to X + setupcontrols[GC_WEAPONPREV][pweapon_slot] = KEY_NULL; // Unassign Previous Weapon from X + } + + if (setupcontrols == gamecontrolbis) // If we've already updated both players, break out + break; } - S_StartSound(NULL, sfx_menu1); - noFurtherInput = true; - shieldbuttonprompt = 0; - if (ch == 'y' || ch == KEY_ENTER) + // Now, show a message about the default Shield Ability bindings + if ((gamecontrol[GC_SHIELD][0] == KEY_LALT && gamecontrol[GC_SHIELD][1] == KEY_JOY1+1) + || (gamecontrol[GC_SHIELD][0] == KEY_JOY1+1 && gamecontrol[GC_SHIELD][1] == KEY_LALT)) { - stopstopmessage = true; // Stop MessageDef from calling M_SetupNextMenu automatically - OP_ChangeControlsDef.lastOn = 8; // Highlight Shield Ability in the controls menu - M_Setup1PControlsMenu(ch); // Set up P1's controls menu and call M_SetupNextMenu + // Left Alt and the B button are both assigned + M_StartMessage(M_GetText("Shield Ability defaults to\nthe \x82""Left Alt\x80"" key on keyboard,\nand the \x85""B button\x80"" on gamepads." + "\n\nYou can always reassign it\nin the Options menu later." + "\n\n\nPress 'Enter' to continue\n"), + NULL, MM_NOTHING); + MessageDef.x = 43; // Change the pop-up message's background position/width + MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 27; + } + else if (gamecontrol[GC_SHIELD][0] == KEY_LALT || gamecontrol[GC_SHIELD][1] == KEY_LALT) + { + // Left Alt is assigned, but the B button isn't. + M_StartMessage(M_GetText("Shield Ability defaults to\nthe \x82""Left Alt\x80"" key on keyboard.\nThe \x85""B button\x80"" on gamepads was taken." + "\n\nYou can always reassign it\nin the Options menu later." + "\n\n\nPress 'Enter' to continue\n"), + NULL, MM_NOTHING); + MessageDef.x = 24; // Change the pop-up message's background position/width + MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 32; + } + else if (gamecontrol[GC_SHIELD][0] == KEY_JOY1+1 || gamecontrol[GC_SHIELD][1] == KEY_JOY1+1) + { + // The B button is assigned, but Left Alt isn't + M_StartMessage(M_GetText("Shield Ability defaults to\nthe \x85""B button\x80"" on gamepads.\nThe \x82""Left Alt\x80"" key on keyboard was taken." + "\n\nYou can always reassign it\nin the Options menu later." + "\n\n\nPress 'Enter' to continue\n"), + NULL, MM_NOTHING); + MessageDef.x = 8; // Change the pop-up message's background position/width + MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 36; + } + else if (gamecontrol[GC_SHIELD][0] == KEY_NULL && gamecontrol[GC_SHIELD][1] == KEY_NULL) + { + // Neither Left Alt nor the B button are assigned + M_StartMessage(M_GetText("Shield Ability is unassigned!\nThe \x82""Left Alt\x80"" key on keyboard and\nthe \x85""B button\x80"" on gamepads were taken." + "\n\nYou should assign Shield Ability\nin the Options menu later." + "\n\n\nPress 'Enter' to continue\n"), + NULL, MM_NOTHING); + MessageDef.x = 19; // Change the pop-up message's background position/width + MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 33; + } + else + { + // Neither Left Alt nor the B button are assigned... but something else is??? + // (This can technically happen if you edit your config or use setcontrol in the console before opening the menu) + char keystr[16+16+2+7+1]; // Two 16-char keys + two colour codes + "' and '" + null + + if (gamecontrol[GC_SHIELD][0] != KEY_NULL && gamecontrol[GC_SHIELD][1] != KEY_NULL) + STRBUFCPY(keystr, va("%s\x80""' and '\x82""%s", + G_KeyNumToName(gamecontrol[GC_SHIELD][0]), + G_KeyNumToName(gamecontrol[GC_SHIELD][1]))); + else if (gamecontrol[GC_SHIELD][0] != KEY_NULL) + STRBUFCPY(keystr, G_KeyNumToName(gamecontrol[GC_SHIELD][0])); + else //if (gamecontrol[GC_SHIELD][1] != KEY_NULL) + STRBUFCPY(keystr, G_KeyNumToName(gamecontrol[GC_SHIELD][1])); + + M_StartMessage(va("Shield Ability is assigned to\n'\x82""%s\x80""'." + "\n\nYou can always reassign it\nin the Options menu later." + "\n\n\nPress 'Enter' to continue\n", + keystr), NULL, MM_NOTHING); + MessageDef.x = 23; // Change the pop-up message's background position/width + MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 32; } } +static void M_HandleShieldPromptMenu(INT32 choice) // TODO: 2.3: Remove +{ + switch (choice) + { + case KEY_ESCAPE: + if (I_GetTime() <= shieldprompt_timer) // Don't mash past the pop-up by accident! + break; + + S_StartSound(NULL, sfx_menu1); + noFurtherInput = true; + shieldprompt_timer = 0; + M_ShieldPromptUseDefaults(); + break; + + case KEY_ENTER: + if (I_GetTime() <= shieldprompt_timer) // Don't mash past the pop-up by accident! + break; + + S_StartSound(NULL, sfx_menu1); + noFurtherInput = true; + shieldprompt_timer = 0; + + if (shieldprompt_currentchoice == 0) + { + OP_ChangeControlsDef.lastOn = 8; // Highlight Shield Ability in the controls menu + M_Setup1PControlsMenu(0); // Set up P1's controls menu and call M_SetupNextMenu + } + else if (shieldprompt_currentchoice == 1) // Copy the Spin buttons to the Shield buttons + { + CV_SetValue(&cv_controlperkey, 2); // Make sure that Controls per Key is "Several" + + gamecontrol [GC_SHIELD][0] = gamecontrol [GC_SPIN][0]; + gamecontrol [GC_SHIELD][1] = gamecontrol [GC_SPIN][1]; + gamecontrolbis[GC_SHIELD][0] = gamecontrolbis[GC_SPIN][0]; + gamecontrolbis[GC_SHIELD][1] = gamecontrolbis[GC_SPIN][1]; + CV_SetValue(&cv_shieldaxis, cv_spinaxis.value); + CV_SetValue(&cv_shieldaxis2, cv_spinaxis2.value); + + M_StartMessage(M_GetText("Spin and Shield Ability are now\nthe same button." + "\n\nYou can always reassign them\nin the Options menu later." + "\n\n\nPress 'Enter' to continue\n"), + NULL, MM_NOTHING); + MessageDef.x = 36; // Change the pop-up message's background position/width + MessageDef.lastOn = (MessageDef.lastOn & ~0xFF) | 29; + } + else + M_ShieldPromptUseDefaults(); + break; + + case KEY_UPARROW: + S_StartSound(NULL, sfx_menu1); + shieldprompt_currentchoice = (shieldprompt_currentchoice+2)%3; + break; + + case KEY_DOWNARROW: + S_StartSound(NULL, sfx_menu1); + shieldprompt_currentchoice = (shieldprompt_currentchoice+1)%3; + break; + } + + MessageDef.prevMenu = &MainDef; +} + +static void M_DrawShieldPromptMenu(void) // TODO: 2.3: Remove +{ + INT16 cursorx = (BASEVIDWIDTH/2) - 24; + + V_DrawFill(10-3, 68-3, 300+6, 40+6, 159); + // V_DrawCenteredString doesn't centre newlines, so we have to draw each line separately + V_DrawCenteredString(BASEVIDWIDTH/2, 68, V_ALLOWLOWERCASE, "Welcome back! Since you last played,"); + V_DrawCenteredString(BASEVIDWIDTH/2, 76, V_ALLOWLOWERCASE, "Spin has been split into separate"); + V_DrawCenteredString(BASEVIDWIDTH/2, 84, V_ALLOWLOWERCASE, "\"Spin\" and \"Shield Ability\" controls."); + + V_DrawCenteredString(BASEVIDWIDTH/2, 98, V_ALLOWLOWERCASE, "Do you want to assign Shield Ability now?"); + + + V_DrawCenteredString(BASEVIDWIDTH/2, 164, + (shieldprompt_currentchoice == 0) ? V_YELLOWMAP : 0, "Open Control Setup"); + V_DrawCenteredString(BASEVIDWIDTH/2, 172, + (shieldprompt_currentchoice == 1) ? V_YELLOWMAP : 0, "Keep the old behaviour"); + V_DrawCenteredString(BASEVIDWIDTH/2, 180, + (shieldprompt_currentchoice == 2) ? V_YELLOWMAP : 0, "Use default Shield Ability buttons"); + + switch (shieldprompt_currentchoice) + { + case 0: cursorx -= V_StringWidth("Open Control Setup", 0)/2; break; + case 1: cursorx -= V_StringWidth("Keep the old behaviour", 0)/2; break; + default: cursorx -= V_StringWidth("Use default Shield Ability buttons", 0)/2; break; + } + V_DrawScaledPatch(cursorx, 164 + (shieldprompt_currentchoice*8), 0, W_CachePatchName("M_CURSOR", PU_PATCH)); +} + +static menuitem_t OP_ShieldPromptMenu[] = {{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleShieldPromptMenu, 0}}; // TODO: 2.3: Remove + +menu_t OP_ShieldPromptDef = { // TODO: 2.3: Remove + MN_SPECIAL, + NULL, + 1, + &MainDef, + OP_ShieldPromptMenu, + M_DrawShieldPromptMenu, + 0, 0, 0, NULL +}; + // // M_StartControlPanel // @@ -3689,15 +3892,13 @@ void M_StartControlPanel(void) itemOn = singleplr; M_UpdateItemOn(); - if (shieldbuttonprompt) // For old configs, show a pop-up about the new Shield button // TODO: 2.3: Remove + if (shieldprompt_timer) // For old configs, show a pop-up about the new Shield button // TODO: 2.3: Remove { - S_StartSound(NULL, sfx_menu1); - shieldbuttonprompt = I_GetTime() + TICRATE; // Don't mash past the pop-up by accident! + S_StartSound(NULL, sfx_strpst); + noFurtherInput = true; + shieldprompt_timer = I_GetTime() + TICRATE; // Don't mash past the pop-up by accident! - M_StartMessage(M_GetText("Welcome back! Since you last played,\nSpin has been split into separate\n\"Spin\" and \"Shield Ability\" controls." - "\n\nDo you want to \x82""assign Shield Ability now\x80""?" - "\n\n\nPress \x82""ENTER\x80"" or the \x83""A button\x80"" to accept\nPress \x82""ESC\x80"" or the \x85""B button\x80"" to skip\n"), - M_ShieldButtonResponse, MM_YESNO); + M_SetupNextMenu(&OP_ShieldPromptDef); } } else if (modeattacking) diff --git a/src/m_menu.h b/src/m_menu.h index ea130a607..55c0b4060 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -176,7 +176,7 @@ typedef struct extern menupres_t menupres[NUMMENUTYPES]; extern UINT32 prevMenuId; extern UINT32 activeMenuId; -extern tic_t shieldbuttonprompt; // Show a prompt about the new Shield button for old configs // TODO: 2.3: Remove +extern tic_t shieldprompt_timer; // Show a prompt about the new Shield button for old configs // TODO: 2.3: Remove void M_InitMenuPresTables(void); UINT8 M_GetYoungestChildMenu(void); diff --git a/src/m_misc.c b/src/m_misc.c index ee810a031..724717aa6 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -563,7 +563,7 @@ void M_FirstLoadConfig(void) // For configs loaded at startup only, check for pre-Shield-button configs // TODO: 2.3: Remove if (GETMAJOREXECVERSION(cv_execversion.value) < 55 // Pre-v2.2.14 configs && cv_execversion.value != 25) // Make sure that the config exists, too - shieldbuttonprompt = 1; + shieldprompt_timer = 1; // don't filter anymore vars and don't let this convsvar be changed COM_BufInsertText(va("%s \"%d\"\n", cv_execversion.name, EXECVERSION)); From c0c1b8de90b94589e81d6c2d0565938e9042ed0a Mon Sep 17 00:00:00 2001 From: pastel Date: Sat, 1 Jun 2024 14:40:44 -0500 Subject: [PATCH 045/139] don't adjust texture coords of nonexistant gpatch --- src/hardware/hw_md2.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 0bb8de851..1c198a166 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1154,6 +1154,9 @@ static void adjustTextureCoords(model_t *model, patch_t *patch) int i; GLPatch_t *gpatch = ((GLPatch_t *)patch->hardware); + if (!gpatch) + return; + for (i = 0; i < model->numMeshes; i++) { int j; From dd5f030b160eade4a97779574f209f679a0f31ad Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Sun, 2 Jun 2024 20:45:00 -0300 Subject: [PATCH 046/139] Use palette index 255 for transparency --- src/hardware/hw_cache.c | 40 ++++++- src/hardware/hw_glob.h | 2 +- src/hardware/hw_main.c | 19 ++-- src/hardware/r_opengl/r_opengl.c | 37 ++++++- src/r_defs.h | 2 + src/r_draw.h | 2 + src/r_draw8.c | 183 +++++++++++++++++++++++++++++++ src/r_segs.c | 144 +++++++++++++++++++++--- src/r_textures.c | 39 +++++-- src/r_textures.h | 1 + src/screen.c | 4 + src/screen.h | 4 + 12 files changed, 440 insertions(+), 37 deletions(-) diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c index 56f5416cf..0022897d6 100644 --- a/src/hardware/hw_cache.c +++ b/src/hardware/hw_cache.c @@ -756,7 +756,7 @@ static void GetMapTexture(INT32 tex, GLMapTexture_t *grtex, GLMipmap_t *mipmap) Z_ChangeTag(mipmap->data, PU_HWRCACHE_UNLOCKED); } -GLMapTexture_t *HWR_GetTexture(INT32 tex) +GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean chromakeyed) { if (tex < 0 || tex >= (signed)gl_numtextures) { @@ -769,7 +769,43 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex) GLMapTexture_t *grtex = &gl_textures[tex]; - GetMapTexture(tex, grtex, &grtex->mipmap); + GLMipmap_t *grMipmap = &grtex->mipmap; + GLMipmap_t *originalMipmap = grMipmap; + + if (!originalMipmap->data && !originalMipmap->downloaded) + HWR_GenerateTexture(tex, grtex, originalMipmap); + + // If chroma-keyed, create or use a different mipmap for the variant + if (chromakeyed && !textures[tex]->transparency && originalMipmap->data) + { + // Allocate it if it wasn't already + if (!originalMipmap->nextcolormap) + { + GLMipmap_t *newMipmap = calloc(1, sizeof (*grMipmap)); + if (newMipmap == NULL) + I_Error("%s: Out of memory", "HWR_GetLevelFlat"); + + newMipmap->flags = TF_WRAPXY | TF_CHROMAKEYED; + newMipmap->width = (UINT16)textures[tex]->width; + newMipmap->height = (UINT16)textures[tex]->height; + newMipmap->format = textureformat; + originalMipmap->nextcolormap = newMipmap; + } + + // Upload and bind the variant texture instead of the original one + grMipmap = originalMipmap->nextcolormap; + + // Use the original texture's pixel data + // It can just be a pointer to it, since the r_opengl backend deals with the pixels + // that are supposed to be transparent. + grMipmap->data = originalMipmap->data; + } + + if (!grMipmap->downloaded) + HWD.pfnSetTexture(grMipmap); + HWR_SetCurrentTexture(grMipmap); + + Z_ChangeTag(grMipmap->data, PU_HWRCACHE_UNLOCKED); return grtex; } diff --git a/src/hardware/hw_glob.h b/src/hardware/hw_glob.h index 807c70989..5678cd593 100644 --- a/src/hardware/hw_glob.h +++ b/src/hardware/hw_glob.h @@ -120,7 +120,7 @@ void HWR_GetPatch(patch_t *patch); void HWR_GetMappedPatch(patch_t *patch, const UINT8 *colormap); void HWR_GetFadeMask(lumpnum_t fademasklumpnum); -GLMapTexture_t *HWR_GetTexture(INT32 tex); +GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean chromakeyed); void HWR_GetLevelFlat(levelflat_t *levelflat, boolean chromakeyed); void HWR_GetRawFlat(lumpnum_t flatlumpnum); diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 68681295e..91b2e2c50 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -951,7 +951,7 @@ static void HWR_RenderMidtexture(INT32 gl_midtexture, float cliplow, float cliph else repeats = 1; - GLMapTexture_t *grTex = HWR_GetTexture(gl_midtexture); + GLMapTexture_t *grTex = HWR_GetTexture(gl_midtexture, true); float xscale = FixedToFloat(gl_sidedef->scalex_mid); float yscale = FixedToFloat(gl_sidedef->scaley_mid); @@ -1210,7 +1210,7 @@ static void HWR_ProcessSeg(void) // check TOP TEXTURE if ((worldhighslope < worldtopslope || worldhigh < worldtop) && gl_toptexture) { - grTex = HWR_GetTexture(gl_toptexture); + grTex = HWR_GetTexture(gl_toptexture, false); xscale = FixedToFloat(abs(gl_sidedef->scalex_top)); yscale = FixedToFloat(abs(gl_sidedef->scaley_top)); @@ -1300,7 +1300,7 @@ static void HWR_ProcessSeg(void) // check BOTTOM TEXTURE if ((worldlowslope > worldbottomslope || worldlow > worldbottom) && gl_bottomtexture) { - grTex = HWR_GetTexture(gl_bottomtexture); + grTex = HWR_GetTexture(gl_bottomtexture, false); xscale = FixedToFloat(abs(gl_sidedef->scalex_bottom)); yscale = FixedToFloat(abs(gl_sidedef->scaley_bottom)); @@ -1414,7 +1414,7 @@ static void HWR_ProcessSeg(void) // Single sided line... Deal only with the middletexture (if one exists) if (gl_midtexture && gl_linedef->special != SPECIAL_HORIZON_LINE) // (Ignore horizon line for OGL) { - grTex = HWR_GetTexture(gl_midtexture); + grTex = HWR_GetTexture(gl_midtexture, false); xscale = FixedToFloat(gl_sidedef->scalex_mid); yscale = FixedToFloat(gl_sidedef->scaley_mid); @@ -1588,7 +1588,7 @@ static void HWR_ProcessSeg(void) // -- Monster Iestyn 26/06/18 fixed_t texturevpeg = side->rowoffset + side->offsety_mid; - grTex = HWR_GetTexture(texnum); + grTex = HWR_GetTexture(texnum, true); xscale = FixedToFloat(side->scalex_mid); yscale = FixedToFloat(side->scaley_mid); @@ -1745,7 +1745,7 @@ static void HWR_ProcessSeg(void) // -- Monster Iestyn 26/06/18 fixed_t texturevpeg = side->rowoffset + side->offsety_mid; - grTex = HWR_GetTexture(texnum); + grTex = HWR_GetTexture(texnum, true); xscale = FixedToFloat(side->scalex_mid); yscale = FixedToFloat(side->scaley_mid); @@ -4086,7 +4086,7 @@ static void HWR_CreateDrawNodes(void) else if (sortnode[sortindex[i]].wall) { if (!(sortnode[sortindex[i]].wall->blend & PF_NoTexture)) - HWR_GetTexture(sortnode[sortindex[i]].wall->texnum); + HWR_GetTexture(sortnode[sortindex[i]].wall->texnum, true); HWR_RenderWall(sortnode[sortindex[i]].wall->wallVerts, &sortnode[sortindex[i]].wall->Surf, sortnode[sortindex[i]].wall->blend, sortnode[sortindex[i]].wall->fogwall, sortnode[sortindex[i]].wall->lightlevel, sortnode[sortindex[i]].wall->wallcolormap); } @@ -5066,6 +5066,8 @@ static void HWR_DrawSkyBackground(player_t *player) HWD.pfnSetBlend(PF_Translucent|PF_NoDepthTest|PF_Modulated); + HWR_GetTexture(texturetranslation[skytexture], false); + if (cv_glskydome.value) { FTransform dometransform; @@ -5081,8 +5083,6 @@ static void HWR_DrawSkyBackground(player_t *player) HWR_SetTransformAiming(&dometransform, player, false); dometransform.angley = (float)((viewangle-ANGLE_270)>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES); - HWR_GetTexture(texturetranslation[skytexture]); - if (gl_sky.texture != texturetranslation[skytexture]) { HWR_ClearSkyDome(); @@ -5102,7 +5102,6 @@ static void HWR_DrawSkyBackground(player_t *player) float aspectratio; float angleturn; - HWR_GetTexture(texturetranslation[skytexture]); aspectratio = (float)vid.width/(float)vid.height; //Hurdler: the sky is the only texture who need 4.0f instead of 1.0 diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 75a92c2fb..fa6b48b4f 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -1556,8 +1556,41 @@ EXPORT void HWRAPI(UpdateTexture) (GLMipmap_t *pTexInfo) } else if (pTexInfo->format == GL_TEXFMT_RGBA) { - // Directly upload the texture data without any kind of conversion. - ptex = pImgData; + if (pTexInfo->flags & TF_CHROMAKEYED) + { + RGBA_t *color = (RGBA_t *)pTexInfo->data; + + AllocTextureBuffer(pTexInfo); + ptex = tex = textureBuffer; + + for (j = 0; j < h; j++) + { + for (i = 0; i < w; i++) + { + if (color->rgba == myPaletteData[HWR_PATCHES_CHROMAKEY_COLORINDEX].rgba) + { + tex[w*j+i].s.red = 0; + tex[w*j+i].s.green = 0; + tex[w*j+i].s.blue = 0; + tex[w*j+i].s.alpha = 0; + pTexInfo->flags |= TF_TRANSPARENT; // there is a hole in it + } + else + { + tex[w*j+i].s.red = color->s.red; + tex[w*j+i].s.green = color->s.green; + tex[w*j+i].s.blue = color->s.blue; + tex[w*j+i].s.alpha = color->s.alpha; + } + color++; + } + } + } + else + { + // Directly upload the texture data without any kind of conversion. + ptex = pImgData; + } } else if (pTexInfo->format == GL_TEXFMT_ALPHA_INTENSITY_88) { diff --git a/src/r_defs.h b/src/r_defs.h index da4dd2d70..a363d99ff 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -60,6 +60,8 @@ typedef UINT8 lighttable_t; #define CMF_FADEFULLBRIGHTSPRITES 1 #define CMF_FOG 4 +#define TEXTURE_255_IS_TRANSPARENT + // ExtraColormap type. Use for extra_colormaps from now on. typedef struct extracolormap_s { diff --git a/src/r_draw.h b/src/r_draw.h index 77588d7de..6a6ab2db1 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -154,9 +154,11 @@ void R_VideoErase(size_t ofs, INT32 count); void R_DrawColumn_8(void); void R_DrawColumnClamped_8(void); +void R_Draw2sMultiPatchColumn_8(void); void R_DrawShadeColumn_8(void); void R_DrawTranslucentColumn_8(void); void R_DrawTranslucentColumnClamped_8(void); +void R_Draw2sMultiPatchTranslucentColumn_8(void); void R_DrawDropShadowColumn_8(void); void R_DrawTranslatedColumn_8(void); void R_DrawTranslatedTranslucentColumn_8(void); diff --git a/src/r_draw8.c b/src/r_draw8.c index 735127f88..2011e4640 100644 --- a/src/r_draw8.c +++ b/src/r_draw8.c @@ -192,6 +192,189 @@ void R_DrawColumnClamped_8(void) } } +void R_Draw2sMultiPatchColumn_8(void) +{ + INT32 count; + register UINT8 *dest; + register fixed_t frac; + fixed_t fracstep; + + count = dc_yh - dc_yl; + + if (count < 0) // Zero length, column does not exceed a pixel. + return; + +#ifdef RANGECHECK + if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height) + return; +#endif + + // Framebuffer destination address. + dest = &topleft[dc_yl*vid.width + dc_x]; + + count++; + + // Determine scaling, which is the only mapping to be done. + fracstep = dc_iscale; + frac = dc_texturemid + FixedMul((dc_yl << FRACBITS) - centeryfrac, fracstep); + + // Inner loop that does the actual texture mapping, e.g. a DDA-like scaling. + // This is as fast as it gets. + { + register const UINT8 *source = dc_source; + register const lighttable_t *colormap = dc_colormap; + register INT32 heightmask = dc_texheight-1; + register UINT8 val; + if (dc_texheight & heightmask) // not a power of 2 -- killough + { + heightmask++; + heightmask <<= FRACBITS; + + if (frac < 0) + while ((frac += heightmask) < 0); + else + while (frac >= heightmask) + frac -= heightmask; + + do + { + // Re-map color indices from wall texture column + // using a lighting/special effects LUT. + // heightmask is the Tutti-Frutti fix + val = source[frac>>FRACBITS]; + + if (val != TRANSPARENTPIXEL) + *dest = colormap[val]; + + dest += vid.width; + + // Avoid overflow. + if (fracstep > 0x7FFFFFFF - frac) + frac += fracstep - heightmask; + else + frac += fracstep; + + while (frac >= heightmask) + frac -= heightmask; + } while (--count); + } + else + { + while ((count -= 2) >= 0) // texture height is a power of 2 + { + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + *dest = colormap[val]; + dest += vid.width; + frac += fracstep; + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + *dest = colormap[val]; + dest += vid.width; + frac += fracstep; + } + if (count & 1) + { + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + *dest = colormap[val]; + } + } + } +} + +void R_Draw2sMultiPatchTranslucentColumn_8(void) +{ + INT32 count; + register UINT8 *dest; + register fixed_t frac; + fixed_t fracstep; + + count = dc_yh - dc_yl; + + if (count < 0) // Zero length, column does not exceed a pixel. + return; + +#ifdef RANGECHECK + if ((unsigned)dc_x >= (unsigned)vid.width || dc_yl < 0 || dc_yh >= vid.height) + return; +#endif + + // Framebuffer destination address. + dest = &topleft[dc_yl*vid.width + dc_x]; + + count++; + + // Determine scaling, which is the only mapping to be done. + fracstep = dc_iscale; + frac = dc_texturemid + FixedMul((dc_yl << FRACBITS) - centeryfrac, fracstep); + + // Inner loop that does the actual texture mapping, e.g. a DDA-like scaling. + // This is as fast as it gets. + { + register const UINT8 *source = dc_source; + register const UINT8 *transmap = dc_transmap; + register const lighttable_t *colormap = dc_colormap; + register INT32 heightmask = dc_texheight-1; + register UINT8 val; + if (dc_texheight & heightmask) // not a power of 2 -- killough + { + heightmask++; + heightmask <<= FRACBITS; + + if (frac < 0) + while ((frac += heightmask) < 0); + else + while (frac >= heightmask) + frac -= heightmask; + + do + { + // Re-map color indices from wall texture column + // using a lighting/special effects LUT. + // heightmask is the Tutti-Frutti fix + val = source[frac>>FRACBITS]; + + if (val != TRANSPARENTPIXEL) + *dest = *(transmap + (colormap[val]<<8) + (*dest)); + + dest += vid.width; + + // Avoid overflow. + if (fracstep > 0x7FFFFFFF - frac) + frac += fracstep - heightmask; + else + frac += fracstep; + + while (frac >= heightmask) + frac -= heightmask; + } while (--count); + } + else + { + while ((count -= 2) >= 0) // texture height is a power of 2 + { + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + *dest = *(transmap + (colormap[val]<<8) + (*dest)); + dest += vid.width; + frac += fracstep; + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + *dest = *(transmap + (colormap[val]<<8) + (*dest)); + dest += vid.width; + frac += fracstep; + } + if (count & 1) + { + val = source[(frac>>FRACBITS) & heightmask]; + if (val != TRANSPARENTPIXEL) + *dest = *(transmap + (colormap[val]<<8) + (*dest)); + } + } + } +} + /** \brief The R_DrawShadeColumn_8 function Experiment to make software go faster. Taken from the Boom source */ diff --git a/src/r_segs.c b/src/r_segs.c index 75c95aa93..8e9368baf 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -94,6 +94,98 @@ transnum_t R_GetLinedefTransTable(fixed_t alpha) return (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1); } +// If we have a multi-patch texture on a 2sided wall (rare) then we draw +// it using R_DrawColumn, else we draw it using R_DrawMaskedColumn, this +// way we don't have to store extra post_t info with each column for +// multi-patch textures. They are not normally needed as multi-patch +// textures don't have holes in it. At least not for now. +static void R_Render2sidedMultiPatchColumn(column_t *column, unsigned lengthcol) +{ + INT32 topscreen, bottomscreen; + + post_t *post = &column->posts[0]; + if (!post->length) + return; + + topscreen = sprtopscreen; + bottomscreen = topscreen + spryscale * lengthcol; + + dc_yl = (sprtopscreen+FRACUNIT-1)>>FRACBITS; + dc_yh = (bottomscreen-1)>>FRACBITS; + + if (windowtop != INT32_MAX && windowbottom != INT32_MAX) + { + dc_yl = ((windowtop + FRACUNIT)>>FRACBITS); + dc_yh = (windowbottom - 1)>>FRACBITS; + } + + if (dc_yh >= mfloorclip[dc_x]) + dc_yh = mfloorclip[dc_x] - 1; + if (dc_yl <= mceilingclip[dc_x]) + dc_yl = mceilingclip[dc_x] + 1; + + if (dc_yl >= vid.height || dc_yh < 0) + return; + + if (dc_yl <= dc_yh && dc_yh < vid.height && dc_yh > 0) + { + dc_source = column->pixels + post->data_offset; + dc_postlength = post->length; + + if (colfunc == colfuncs[BASEDRAWFUNC]) + (colfuncs[COLDRAWFUNC_TWOSMULTIPATCH])(); + else if (colfunc == colfuncs[COLDRAWFUNC_FUZZY]) + (colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS])(); + else + colfunc(); + } +} + +static void R_RenderFlipped2sidedMultiPatchColumn(column_t *column, unsigned lengthcol) +{ + INT32 topscreen, bottomscreen; + + void (*localcolfunc)(void); + + post_t *post = &column->posts[0]; + if (!post->length) + return; + + topscreen = sprtopscreen; + bottomscreen = topscreen + spryscale * lengthcol; + + dc_yl = (sprtopscreen+FRACUNIT-1)>>FRACBITS; + dc_yh = (bottomscreen-1)>>FRACBITS; + + if (windowtop != INT32_MAX && windowbottom != INT32_MAX) + { + dc_yl = ((windowtop + FRACUNIT)>>FRACBITS); + dc_yh = (windowbottom - 1)>>FRACBITS; + } + + if (dc_yh >= mfloorclip[dc_x]) + dc_yh = mfloorclip[dc_x] - 1; + if (dc_yl <= mceilingclip[dc_x]) + dc_yl = mceilingclip[dc_x] + 1; + + if (dc_yl >= vid.height || dc_yh < 0) + return; + + if (dc_yl <= dc_yh && dc_yh < vid.height && dc_yh > 0) + { + dc_postlength = post->length; + + if (colfunc == colfuncs[BASEDRAWFUNC]) + localcolfunc = colfuncs[COLDRAWFUNC_TWOSMULTIPATCH]; + else if (colfunc == colfuncs[COLDRAWFUNC_FUZZY]) + localcolfunc = colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS]; + else + localcolfunc = colfunc; + + R_DrawFlippedPost(column->pixels + post->data_offset, post->length, localcolfunc); + } +} + void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) { size_t pindex; @@ -181,7 +273,16 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) // Texture must be cached R_CheckTextureCache(texnum); - if (vertflip) // vertically flipped? + // handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures + // are not stored per-column with post info in SRB2 + if (!textures[texnum]->transparency) + { + if (vertflip) // vertically flipped? + colfunc_2s = R_RenderFlipped2sidedMultiPatchColumn; + else + colfunc_2s = R_Render2sidedMultiPatchColumn; + } + else if (vertflip) // vertically flipped? colfunc_2s = R_DrawFlippedMaskedColumn; else colfunc_2s = R_DrawMaskedColumn; // render the usual 2sided single-patch packed texture @@ -811,7 +912,16 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) // Texture must be cached R_CheckTextureCache(texnum); - if (vertflip) // vertically flipped? + // handle case where multipatch texture is drawn on a 2sided wall, multi-patch textures + // are not stored per-column with post info in SRB2 + if (!textures[texnum]->transparency) + { + if (vertflip) // vertically flipped? + colfunc_2s = R_RenderFlipped2sidedMultiPatchColumn; + else + colfunc_2s = R_Render2sidedMultiPatchColumn; + } + else if (vertflip) // vertically flipped? colfunc_2s = R_DrawRepeatFlippedMaskedColumn; else colfunc_2s = R_DrawRepeatMaskedColumn; @@ -894,21 +1004,25 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) { dc_iscale = 0xffffffffu / (unsigned)spryscale; - // Column has a single post and it matches the texture height, use regular column drawers - if (col->num_posts == 1 && col->posts[0].topdelta == 0 && col->posts[0].length == (unsigned)dc_texheight) + // Skip if texture is multipatch + if (textures[texnum]->transparency) { - if (fuzzy) - colfunc = colfuncs[COLDRAWFUNC_FUZZY]; + // Column has a single post and it matches the texture height, use regular column drawers + if (col->num_posts == 1 && col->posts[0].topdelta == 0 && col->posts[0].length == (unsigned)dc_texheight) + { + if (fuzzy) + colfunc = colfuncs[COLDRAWFUNC_FUZZY]; + else + colfunc = colfuncs[BASEDRAWFUNC]; + } else - colfunc = colfuncs[BASEDRAWFUNC]; - } - else - { - // Otherwise use column drawers with extra checks - if (fuzzy) - colfunc = R_DrawTranslucentColumnClamped_8; - else - colfunc = R_DrawColumnClamped_8; + { + // Otherwise use column drawers with extra checks + if (fuzzy) + colfunc = colfuncs[COLDRAWFUNC_CLAMPEDTRANS]; + else + colfunc = colfuncs[COLDRAWFUNC_CLAMPED]; + } } } diff --git a/src/r_textures.c b/src/r_textures.c index 5d3fe24db..6e01d5641 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -147,9 +147,9 @@ static void R_DrawFlippedColumnInCache(column_t *column, UINT8 *cache, texpatch_ if (count > 0) { - for (; dest < cache + position + count; --source, is_opaque++) + for (; dest < cache + position + count; --source, dest++, is_opaque++) { - *dest++ = *source; + *dest = *source; *is_opaque = true; } } @@ -295,7 +295,6 @@ UINT8 *R_GenerateTexture(size_t texnum) UINT16 lumpnum = patch->lump; UINT8 *pdata; softwarepatch_t *realpatch; - boolean holey = false; #ifndef NO_PNG_LUMPS UINT8 header[PNG_HEADER_SIZE]; @@ -310,9 +309,11 @@ UINT8 *R_GenerateTexture(size_t texnum) pdata = W_CacheLumpNumPwad(wadnum, lumpnum, PU_CACHE); realpatch = (softwarepatch_t *)pdata; + texture->transparency = false; + // Check the patch for holes. if (texture->width > SHORT(realpatch->width) || texture->height > SHORT(realpatch->height)) - holey = true; + texture->transparency = true; else { UINT8 *colofs = (UINT8 *)realpatch->columnofs; @@ -332,12 +333,12 @@ UINT8 *R_GenerateTexture(size_t texnum) col = (doompost_t *)((UINT8 *)col + col->length + 4); } if (y < texture->height) - holey = true; // this texture is HOLEy! D: + texture->transparency = true; // this texture is HOLEy! D: } } // If the patch uses transparency, we have to save it this way. - if (holey) + if (texture->transparency) { texture->flip = patch->flip; @@ -378,6 +379,15 @@ UINT8 *R_GenerateTexture(size_t texnum) temp_columns = Z_Calloc(sizeof(column_t) * texture->width, PU_STATIC, NULL); temp_block = Z_Calloc(total_pixels, PU_STATIC, NULL); +#ifdef TEXTURE_255_IS_TRANSPARENT + texture->transparency = false; + + // Transparency hack + memset(temp_block, TRANSPARENTPIXEL, total_pixels); +#else + texture->transparency = true; +#endif + for (x = 0; x < texture->width; x++) { column_t *column = &temp_columns[x]; @@ -474,13 +484,27 @@ UINT8 *R_GenerateTexture(size_t texnum) // Now write the columns column_posts = Z_Calloc(sizeof(unsigned) * texture->width, PU_STATIC, NULL); +#ifdef TEXTURE_255_IS_TRANSPARENT + total_posts = texture->width; + temp_posts = Z_Realloc(temp_posts, sizeof(post_t) * total_posts, PU_CACHE, NULL); +#endif + for (x = 0; x < texture->width; x++) { post_t *post = NULL; - boolean was_opaque = false; column_t *column = &temp_columns[x]; +#ifdef TEXTURE_255_IS_TRANSPARENT + post = &temp_posts[x]; + post->topdelta = 0; + post->length = texture->height; + post->data_offset = 0; + column_posts[x] = x; + column->num_posts = 1; +#else + boolean was_opaque = false; + column_posts[x] = (unsigned)-1; for (INT32 y = 0; y < texture->height; y++) @@ -510,6 +534,7 @@ UINT8 *R_GenerateTexture(size_t texnum) post->length++; } +#endif } blocksize = (sizeof(column_t) * texture->width) + (sizeof(post_t) * total_posts) + (sizeof(UINT8) * total_pixels); diff --git a/src/r_textures.h b/src/r_textures.h index eb68ec09f..7e1588851 100644 --- a/src/r_textures.h +++ b/src/r_textures.h @@ -54,6 +54,7 @@ typedef struct char name[8]; UINT32 hash; UINT8 type; // TEXTURETYPE_* + boolean transparency; INT16 width, height; UINT8 flip; // 1 = flipx, 2 = flipy, 3 = both void *flat; // The texture, as a flat. diff --git a/src/screen.c b/src/screen.c index 9a82a1561..014a20117 100644 --- a/src/screen.c +++ b/src/screen.c @@ -112,6 +112,10 @@ void SCR_SetDrawFuncs(void) colfuncs[COLDRAWFUNC_SHADE] = R_DrawShadeColumn_8; colfuncs[COLDRAWFUNC_SHADOWED] = R_DrawColumnShadowed_8; colfuncs[COLDRAWFUNC_TRANSTRANS] = R_DrawTranslatedTranslucentColumn_8; + colfuncs[COLDRAWFUNC_CLAMPED] = R_DrawColumnClamped_8; + colfuncs[COLDRAWFUNC_CLAMPEDTRANS] = R_DrawTranslucentColumnClamped_8; + colfuncs[COLDRAWFUNC_TWOSMULTIPATCH] = R_Draw2sMultiPatchColumn_8; + colfuncs[COLDRAWFUNC_TWOSMULTIPATCHTRANS] = R_Draw2sMultiPatchTranslucentColumn_8; colfuncs[COLDRAWFUNC_FOG] = R_DrawFogColumn_8; spanfuncs[SPANDRAWFUNC_TRANS] = R_DrawTranslucentSpan_8; diff --git a/src/screen.h b/src/screen.h index 8b952e553..e23e8cbd6 100644 --- a/src/screen.h +++ b/src/screen.h @@ -97,6 +97,10 @@ enum COLDRAWFUNC_SHADE, COLDRAWFUNC_SHADOWED, COLDRAWFUNC_TRANSTRANS, + COLDRAWFUNC_CLAMPED, + COLDRAWFUNC_CLAMPEDTRANS, + COLDRAWFUNC_TWOSMULTIPATCH, + COLDRAWFUNC_TWOSMULTIPATCHTRANS, COLDRAWFUNC_FOG, COLDRAWFUNC_MAX From bd641c38575d2c469d9b1190436fede539d387e0 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Sun, 2 Jun 2024 21:40:14 -0300 Subject: [PATCH 047/139] Fix #1263 --- src/lua_baselib.c | 6 ++++-- src/lua_libs.h | 5 +++-- src/lua_skinlib.c | 53 +++++++++++++++++++++++++++++++++++------------ src/r_skins.c | 8 +++++++ src/r_skins.h | 3 +++ 5 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index f6b8f462b..dd3653a82 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -184,8 +184,10 @@ static const struct { {META_SKIN, "skin_t"}, {META_POWERS, "player_t.powers"}, {META_SOUNDSID, "skin_t.soundsid"}, - {META_SKINSPRITES, "skin_t.sprites"}, - {META_SKINSPRITESLIST, "skin_t.sprites[]"}, + + {META_SKINSPRITES, "skin_t.skinsprites"}, + {META_SKINSPRITESLIST, "skin_t.skinsprites[]"}, + {META_SKINSPRITESCOMPAT, "skin_t.sprites"}, // TODO: 2.3: Delete {META_VERTEX, "vertex_t"}, {META_LINE, "line_t"}, diff --git a/src/lua_libs.h b/src/lua_libs.h index a90d8ac7f..90c7bba7c 100644 --- a/src/lua_libs.h +++ b/src/lua_libs.h @@ -42,8 +42,9 @@ extern boolean ignoregameinputs; #define META_SKIN "SKIN_T*" #define META_POWERS "PLAYER_T*POWERS" #define META_SOUNDSID "SKIN_T*SOUNDSID" -#define META_SKINSPRITES "SKIN_T*SPRITES" -#define META_SKINSPRITESLIST "SKIN_T*SPRITES[]" +#define META_SKINSPRITES "SKIN_T*SKINSPRITES" +#define META_SKINSPRITESLIST "SKIN_T*SKINSPRITES[]" +#define META_SKINSPRITESCOMPAT "SKIN_T*SPRITES" // TODO: 2.3: Delete #define META_VERTEX "VERTEX_T*" #define META_LINE "LINE_T*" diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index 24d948a67..a00661884 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -54,7 +54,8 @@ enum skin { skin_contspeed, skin_contangle, skin_soundsid, - skin_sprites, + skin_sprites, // TODO: 2.3: Delete + skin_skinsprites, skin_supersprites, skin_natkcolor }; @@ -95,7 +96,8 @@ static const char *const skin_opt[] = { "contspeed", "contangle", "soundsid", - "sprites", + "sprites", // TODO: 2.3: Delete + "skinsprites", "supersprites", "natkcolor", NULL}; @@ -219,7 +221,10 @@ static int skin_get(lua_State *L) case skin_soundsid: LUA_PushUserdata(L, skin->soundsid, META_SOUNDSID); break; - case skin_sprites: + case skin_sprites: // TODO: 2.3: Delete + LUA_PushUserdata(L, skin->sprites_compat, META_SKINSPRITESCOMPAT); + break; + case skin_skinsprites: LUA_PushUserdata(L, skin->sprites, META_SKINSPRITES); break; case skin_supersprites: @@ -338,15 +343,7 @@ static int soundsid_num(lua_State *L) return 1; } -enum spritesopt { - numframes = 0 -}; - -static const char *const sprites_opt[] = { - "numframes", - NULL}; - -// skin.sprites[i] -> sprites[i] +// skin.skinsprites[i] -> sprites[i] static int lib_getSkinSprite(lua_State *L) { spritedef_t *sksprites = *(spritedef_t **)luaL_checkudata(L, 1, META_SKINSPRITES); @@ -359,13 +356,42 @@ static int lib_getSkinSprite(lua_State *L) return 1; } -// #skin.sprites -> NUMPLAYERSPRITES +// #skin.skinsprites -> NUMPLAYERSPRITES static int lib_numSkinsSprites(lua_State *L) { lua_pushinteger(L, NUMPLAYERSPRITES); return 1; } +// TODO: 2.3: Delete +// skin.sprites[i] -> sprites[i] +static int lib_getSkinSpriteCompat(lua_State *L) +{ + spritedef_t *sksprites = *(spritedef_t **)luaL_checkudata(L, 1, META_SKINSPRITESCOMPAT); + playersprite_t i = luaL_checkinteger(L, 2); + + if (i < 0 || i >= NUMPLAYERSPRITES*2) + return luaL_error(L, "skin sprites index %d out of range (0 - %d)", i, (NUMPLAYERSPRITES*2)-1); + + LUA_PushUserdata(L, &sksprites[i], META_SKINSPRITESLIST); + return 1; +} + +// #skin.sprites -> NUMPLAYERSPRITES*2 +static int lib_numSkinsSpritesCompat(lua_State *L) +{ + lua_pushinteger(L, NUMPLAYERSPRITES*2); + return 1; +} + +enum spritesopt { + numframes = 0 +}; + +static const char *const sprites_opt[] = { + "numframes", + NULL}; + static int sprite_get(lua_State *L) { spritedef_t *sprite = *(spritedef_t **)luaL_checkudata(L, 1, META_SKINSPRITESLIST); @@ -387,6 +413,7 @@ int LUA_SkinLib(lua_State *L) LUA_RegisterUserdataMetatable(L, META_SOUNDSID, soundsid_get, NULL, soundsid_num); LUA_RegisterUserdataMetatable(L, META_SKINSPRITES, lib_getSkinSprite, NULL, lib_numSkinsSprites); LUA_RegisterUserdataMetatable(L, META_SKINSPRITESLIST, sprite_get, NULL, NULL); + LUA_RegisterUserdataMetatable(L, META_SKINSPRITESCOMPAT, lib_getSkinSpriteCompat, NULL, lib_numSkinsSpritesCompat); skin_fields_ref = Lua_CreateFieldTable(L, skin_opt); diff --git a/src/r_skins.c b/src/r_skins.c index cd7d60b53..a341ee80f 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -636,6 +636,14 @@ static void R_LoadSkinSprites(UINT16 wadnum, UINT16 *lump, UINT16 *lastlump, ski if (skin->sprites[0].numframes == 0) CONS_Alert(CONS_ERROR, M_GetText("No frames found for sprite SPR2_%s\n"), spr2names[0]); + + // TODO: 2.3: Delete + memcpy(&skin->sprites_compat[start_spr2], + &skin->sprites[start_spr2], + sizeof(spritedef_t) * (free_spr2 - start_spr2)); + memcpy(&skin->sprites_compat[start_spr2 + NUMPLAYERSPRITES], + &skin->super.sprites[start_spr2], + sizeof(spritedef_t) * (free_spr2 - start_spr2)); } // returns whether found appropriate property diff --git a/src/r_skins.h b/src/r_skins.h index 1f2c57472..5122b53a6 100644 --- a/src/r_skins.h +++ b/src/r_skins.h @@ -88,6 +88,9 @@ typedef struct spritedef_t sprites[NUMPLAYERSPRITES]; spriteinfo_t sprinfo[NUMPLAYERSPRITES]; } super; + + // TODO: 2.3: Delete + spritedef_t sprites_compat[NUMPLAYERSPRITES * 2]; } skin_t; /// Externs From cb09b9055639aed4f1d34736467954385d70cb42 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Sun, 2 Jun 2024 21:45:36 -0300 Subject: [PATCH 048/139] Add missing comments --- src/lua_skinlib.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index a00661884..26f4011d3 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -377,6 +377,7 @@ static int lib_getSkinSpriteCompat(lua_State *L) return 1; } +// TODO: 2.3: Delete // #skin.sprites -> NUMPLAYERSPRITES*2 static int lib_numSkinsSpritesCompat(lua_State *L) { @@ -413,7 +414,7 @@ int LUA_SkinLib(lua_State *L) LUA_RegisterUserdataMetatable(L, META_SOUNDSID, soundsid_get, NULL, soundsid_num); LUA_RegisterUserdataMetatable(L, META_SKINSPRITES, lib_getSkinSprite, NULL, lib_numSkinsSprites); LUA_RegisterUserdataMetatable(L, META_SKINSPRITESLIST, sprite_get, NULL, NULL); - LUA_RegisterUserdataMetatable(L, META_SKINSPRITESCOMPAT, lib_getSkinSpriteCompat, NULL, lib_numSkinsSpritesCompat); + LUA_RegisterUserdataMetatable(L, META_SKINSPRITESCOMPAT, lib_getSkinSpriteCompat, NULL, lib_numSkinsSpritesCompat); // TODO: 2.3: Delete skin_fields_ref = Lua_CreateFieldTable(L, skin_opt); From b89aaf709e875f82b66c874351cf485f1608c5e8 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Mon, 3 Jun 2024 00:14:33 -0300 Subject: [PATCH 049/139] Generate the TF_CHROMAKEYED texture in hw_cache.c --- src/hardware/hw_cache.c | 55 +++++++++++--------------------- src/hardware/r_opengl/r_opengl.c | 37 ++------------------- 2 files changed, 21 insertions(+), 71 deletions(-) diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c index 0022897d6..203f78799 100644 --- a/src/hardware/hw_cache.c +++ b/src/hardware/hw_cache.c @@ -450,15 +450,10 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *grtex, GLMipmap_t texture = textures[texnum]; - mipmap->flags = TF_WRAPXY; - mipmap->width = (UINT16)texture->width; - mipmap->height = (UINT16)texture->height; - mipmap->format = textureformat; - blockwidth = texture->width; blockheight = texture->height; - blocksize = (blockwidth * blockheight); - block = MakeBlock(&grtex->mipmap); + blocksize = blockwidth * blockheight; + block = MakeBlock(mipmap); // Composite the columns together. for (i = 0, patch = texture->patches; i < texture->patchcount; i++, patch++) @@ -488,7 +483,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLMapTexture_t *grtex, GLMipmap_t realpatch = W_CachePatchNumPwad(wadnum, lumpnum, PU_PATCH); } - HWR_DrawTexturePatchInCache(&grtex->mipmap, blockwidth, blockheight, texture, patch, realpatch); + HWR_DrawTexturePatchInCache(mipmap, blockwidth, blockheight, texture, patch, realpatch); if (free_patch) Patch_Free(realpatch); @@ -741,21 +736,6 @@ void HWR_LoadMapTextures(size_t pnumtextures) // -------------------------------------------------------------------------- // Make sure texture is downloaded and set it as the source // -------------------------------------------------------------------------- -static void GetMapTexture(INT32 tex, GLMapTexture_t *grtex, GLMipmap_t *mipmap) -{ - // Generate texture if missing from the cache - if (!mipmap->data && !mipmap->downloaded) - HWR_GenerateTexture(tex, grtex, mipmap); - - // If hardware does not have the texture, then call pfnSetTexture to upload it - if (!mipmap->downloaded) - HWD.pfnSetTexture(mipmap); - HWR_SetCurrentTexture(mipmap); - - // The system-memory data can be purged now. - Z_ChangeTag(mipmap->data, PU_HWRCACHE_UNLOCKED); -} - GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean chromakeyed) { if (tex < 0 || tex >= (signed)gl_numtextures) @@ -772,35 +752,38 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean chromakeyed) GLMipmap_t *grMipmap = &grtex->mipmap; GLMipmap_t *originalMipmap = grMipmap; - if (!originalMipmap->data && !originalMipmap->downloaded) - HWR_GenerateTexture(tex, grtex, originalMipmap); + if (!originalMipmap->downloaded) + { + originalMipmap->flags = TF_WRAPXY; + originalMipmap->width = (UINT16)textures[tex]->width; + originalMipmap->height = (UINT16)textures[tex]->height; + originalMipmap->format = textureformat; + } // If chroma-keyed, create or use a different mipmap for the variant - if (chromakeyed && !textures[tex]->transparency && originalMipmap->data) + if (chromakeyed && !textures[tex]->transparency) { // Allocate it if it wasn't already if (!originalMipmap->nextcolormap) { GLMipmap_t *newMipmap = calloc(1, sizeof (*grMipmap)); if (newMipmap == NULL) - I_Error("%s: Out of memory", "HWR_GetLevelFlat"); + I_Error("%s: Out of memory", "HWR_GetTexture"); - newMipmap->flags = TF_WRAPXY | TF_CHROMAKEYED; - newMipmap->width = (UINT16)textures[tex]->width; - newMipmap->height = (UINT16)textures[tex]->height; - newMipmap->format = textureformat; + newMipmap->flags = originalMipmap->flags | TF_CHROMAKEYED; + newMipmap->width = originalMipmap->width; + newMipmap->height = originalMipmap->height; + newMipmap->format = originalMipmap->format; originalMipmap->nextcolormap = newMipmap; } // Upload and bind the variant texture instead of the original one grMipmap = originalMipmap->nextcolormap; - - // Use the original texture's pixel data - // It can just be a pointer to it, since the r_opengl backend deals with the pixels - // that are supposed to be transparent. - grMipmap->data = originalMipmap->data; } + if (!grMipmap->data) + HWR_GenerateTexture(tex, grtex, grMipmap); + if (!grMipmap->downloaded) HWD.pfnSetTexture(grMipmap); HWR_SetCurrentTexture(grMipmap); diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index fa6b48b4f..75a92c2fb 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -1556,41 +1556,8 @@ EXPORT void HWRAPI(UpdateTexture) (GLMipmap_t *pTexInfo) } else if (pTexInfo->format == GL_TEXFMT_RGBA) { - if (pTexInfo->flags & TF_CHROMAKEYED) - { - RGBA_t *color = (RGBA_t *)pTexInfo->data; - - AllocTextureBuffer(pTexInfo); - ptex = tex = textureBuffer; - - for (j = 0; j < h; j++) - { - for (i = 0; i < w; i++) - { - if (color->rgba == myPaletteData[HWR_PATCHES_CHROMAKEY_COLORINDEX].rgba) - { - tex[w*j+i].s.red = 0; - tex[w*j+i].s.green = 0; - tex[w*j+i].s.blue = 0; - tex[w*j+i].s.alpha = 0; - pTexInfo->flags |= TF_TRANSPARENT; // there is a hole in it - } - else - { - tex[w*j+i].s.red = color->s.red; - tex[w*j+i].s.green = color->s.green; - tex[w*j+i].s.blue = color->s.blue; - tex[w*j+i].s.alpha = color->s.alpha; - } - color++; - } - } - } - else - { - // Directly upload the texture data without any kind of conversion. - ptex = pImgData; - } + // Directly upload the texture data without any kind of conversion. + ptex = pImgData; } else if (pTexInfo->format == GL_TEXFMT_ALPHA_INTENSITY_88) { From d0b420c76038df2dfdf512e24c6af80bc35fd546 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Mon, 3 Jun 2024 13:29:49 -0300 Subject: [PATCH 050/139] Prevent a memory leak --- src/hardware/hw_cache.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c index 203f78799..f282ca891 100644 --- a/src/hardware/hw_cache.c +++ b/src/hardware/hw_cache.c @@ -675,25 +675,24 @@ void HWR_InitMapTextures(void) gl_maptexturesloaded = false; } -static void DeleteTextureMipmap(GLMipmap_t *grMipmap) +static void DeleteTextureMipmap(GLMipmap_t *grMipmap, boolean delete_mipmap) { HWD.pfnDeleteTexture(grMipmap); - // Chroma-keyed textures do not own their texture data, so do not free it - if (!(grMipmap->flags & TF_CHROMAKEYED)) + if (delete_mipmap) Z_Free(grMipmap->data); } -static void FreeMapTexture(GLMapTexture_t *tex) +static void FreeMapTexture(GLMapTexture_t *tex, boolean delete_chromakeys) { if (tex->mipmap.nextcolormap) { - DeleteTextureMipmap(tex->mipmap.nextcolormap); + DeleteTextureMipmap(tex->mipmap.nextcolormap, delete_chromakeys); free(tex->mipmap.nextcolormap); tex->mipmap.nextcolormap = NULL; } - DeleteTextureMipmap(&tex->mipmap); + DeleteTextureMipmap(&tex->mipmap, true); } void HWR_FreeMapTextures(void) @@ -702,8 +701,8 @@ void HWR_FreeMapTextures(void) for (i = 0; i < gl_numtextures; i++) { - FreeMapTexture(&gl_textures[i]); - FreeMapTexture(&gl_flats[i]); + FreeMapTexture(&gl_textures[i], true); + FreeMapTexture(&gl_flats[i], false); } // now the heap don't have any 'user' pointing to our @@ -777,7 +776,7 @@ GLMapTexture_t *HWR_GetTexture(INT32 tex, boolean chromakeyed) originalMipmap->nextcolormap = newMipmap; } - // Upload and bind the variant texture instead of the original one + // Generate, upload and bind the variant texture instead of the original one grMipmap = originalMipmap->nextcolormap; } From f19ec6f676da79722b4c44a3c8b048ff97e6ecb7 Mon Sep 17 00:00:00 2001 From: SMS Alfredo Date: Mon, 3 Jun 2024 23:25:02 +0000 Subject: [PATCH 051/139] Fix shieldscale 0 bugs --- src/m_menu.c | 11 ++++++++--- src/p_mobj.c | 17 +++++++++++++++-- src/r_things.c | 4 ++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index e0c240fec..38165472e 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -10211,9 +10211,12 @@ void M_DrawNightsAttackMenu(void) color = skins[skinnumber]->prefcolor; angle_t fa = (FixedAngle(((FixedInt(ntsatkdrawtimer * 4)) % 360)<>ANGLETOFINESHIFT) & FINEMASK; + fixed_t scale = skins[skinnumber]->highresscale; + if (skins[skinnumber]->shieldscale) + scale = FixedDiv(scale, skins[skinnumber]->shieldscale); V_DrawFixedPatch(270<highresscale, skins[skinnumber]->shieldscale), + scale, (sprframe->flip & 1<<6) ? V_FLIP : 0, natksprite, R_GetTranslationColormap(TC_BLINK, color, GTC_CACHE)); @@ -12300,7 +12303,9 @@ static void M_DrawSetupMultiPlayerMenu(void) if (multi_frame >= sprdef->numframes) multi_frame = 0; - scale = FixedDiv(skins[setupm_fakeskin]->highresscale, skins[setupm_fakeskin]->shieldscale); + scale = skins[setupm_fakeskin]->highresscale; + if (skins[setupm_fakeskin]->shieldscale) + scale = FixedDiv(scale, skins[setupm_fakeskin]->shieldscale); #define chary (y+64) @@ -12333,7 +12338,7 @@ static void M_DrawSetupMultiPlayerMenu(void) V_DrawFixedPatch( x<highresscale, skins[setupm_fakeskin]->shieldscale), + scale, flags, patch, colormap); goto colordraw; diff --git a/src/p_mobj.c b/src/p_mobj.c index fbbae5a1e..4716042e3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6662,8 +6662,21 @@ static boolean P_ShieldLook(mobj_t *thing, shieldtype_t shield) thing->flags |= MF_NOCLIPHEIGHT; thing->eflags = (thing->eflags & ~MFE_VERTICALFLIP)|(thing->target->eflags & MFE_VERTICALFLIP); - P_SetScale(thing, FixedMul(thing->target->scale, thing->target->player->shieldscale), true); - thing->old_scale = FixedMul(thing->target->old_scale, thing->target->player->shieldscale); + //Set the shield's scale based on shieldscale, hide it if we're too small! + fixed_t scale = FixedMul(thing->target->scale, thing->target->player->shieldscale); + if (scale < 1) { + P_SetScale(thing, thing->target->scale, true); + thing->old_scale = thing->target->old_scale; + + thing->flags2 |= (MF2_DONTDRAW|MF2_JUSTATTACKED); //Hide and indicate we're hidden + } else { + P_SetScale(thing, scale, true); + thing->old_scale = FixedMul(thing->target->old_scale, thing->target->player->shieldscale); + + //Only unhide if we were hidden by the above code + if (thing->flags2 & MF2_JUSTATTACKED) + thing->flags2 &= ~(MF2_DONTDRAW|MF2_JUSTATTACKED); + } #define NewMH(mobj) mobj->height // Ugly mobj-height and player-height defines, for the sake of prettier code #define NewPH(player) P_GetPlayerHeight(player) diff --git a/src/r_things.c b/src/r_things.c index fb9757a9a..dc9cab997 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -1774,6 +1774,10 @@ static void R_ProjectSprite(mobj_t *thing) } this_scale = interp.scale; + + if (this_scale < 1) + return; + radius = interp.radius; // For drop shadows height = interp.height; // Ditto From 37270c871e39cef5cb3ee022f270921cd365d21f Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Tue, 4 Jun 2024 02:08:25 -0300 Subject: [PATCH 052/139] Raise TEXTMAP parser limits --- src/p_setup.c | 60 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index c4b4a35b3..e888ec5a5 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1554,11 +1554,41 @@ static void P_LoadThings(UINT8 *data) } // Stores positions for relevant map data spread through a TEXTMAP. -UINT32 mapthingsPos[UINT16_MAX]; -UINT32 linesPos[UINT16_MAX]; -UINT32 sidesPos[UINT16_MAX]; -UINT32 vertexesPos[UINT16_MAX]; -UINT32 sectorsPos[UINT16_MAX]; +typedef struct textmap_block_s +{ + UINT32 *pos; + size_t capacity; +} textmap_block_t; + +static textmap_block_t mapthingBlocks; +static textmap_block_t linedefBlocks; +static textmap_block_t sidedefBlocks; +static textmap_block_t vertexBlocks; +static textmap_block_t sectorBlocks; + +static void TextmapStorePos(textmap_block_t *blocks, size_t *count) +{ + size_t locCount = (*count) + 1; + + if (blocks->pos == NULL) + { + // Initial capacity (half of the former one.) + blocks->capacity = UINT16_MAX / 2; + + Z_Calloc(sizeof(blocks->pos) * blocks->capacity, PU_LEVEL, &blocks->pos); + } + else if (locCount >= blocks->capacity) + { + // If we hit the list's capacity, make space for 1024 more blocks + blocks->capacity += 1024; + + Z_Realloc(blocks->pos, sizeof(blocks->pos) * blocks->capacity, PU_LEVEL, &blocks->pos); + } + + blocks->pos[locCount - 1] = M_TokenizerGetEndPos(); + + (*count) = locCount; +} // Determine total amount of map data in TEXTMAP. static boolean TextmapCount(size_t size) @@ -1602,15 +1632,15 @@ static boolean TextmapCount(size_t size) brackets++; // Check for valid fields. else if (fastcmp(tkn, "thing")) - mapthingsPos[nummapthings++] = M_TokenizerGetEndPos(); + TextmapStorePos(&mapthingBlocks, &nummapthings); else if (fastcmp(tkn, "linedef")) - linesPos[numlines++] = M_TokenizerGetEndPos(); + TextmapStorePos(&linedefBlocks, &numlines); else if (fastcmp(tkn, "sidedef")) - sidesPos[numsides++] = M_TokenizerGetEndPos(); + TextmapStorePos(&sidedefBlocks, &numsides); else if (fastcmp(tkn, "vertex")) - vertexesPos[numvertexes++] = M_TokenizerGetEndPos(); + TextmapStorePos(&vertexBlocks, &numvertexes); else if (fastcmp(tkn, "sector")) - sectorsPos[numsectors++] = M_TokenizerGetEndPos(); + TextmapStorePos(§orBlocks, &numsectors); else CONS_Alert(CONS_NOTICE, "Unknown field '%s'.\n", tkn); } @@ -2944,7 +2974,7 @@ static void P_LoadTextmap(void) vt->floorzset = vt->ceilingzset = false; vt->floorz = vt->ceilingz = 0; - TextmapParse(vertexesPos[i], i, ParseTextmapVertexParameter); + TextmapParse(vertexBlocks.pos[i], i, ParseTextmapVertexParameter); if (vt->x == INT32_MAX) I_Error("P_LoadTextmap: vertex %s has no x value set!\n", sizeu1(i)); @@ -3001,7 +3031,7 @@ static void P_LoadTextmap(void) textmap_planefloor.defined = 0; textmap_planeceiling.defined = 0; - TextmapParse(sectorsPos[i], i, ParseTextmapSectorParameter); + TextmapParse(sectorBlocks.pos[i], i, ParseTextmapSectorParameter); P_InitializeSector(sc); if (textmap_colormap.used) @@ -3050,7 +3080,7 @@ static void P_LoadTextmap(void) ld->sidenum[0] = NO_SIDEDEF; ld->sidenum[1] = NO_SIDEDEF; - TextmapParse(linesPos[i], i, ParseTextmapLinedefParameter); + TextmapParse(linedefBlocks.pos[i], i, ParseTextmapLinedefParameter); if (!ld->v1) I_Error("P_LoadTextmap: linedef %s has no v1 value set!\n", sizeu1(i)); @@ -3077,7 +3107,7 @@ static void P_LoadTextmap(void) sd->sector = NULL; sd->repeatcnt = 0; - TextmapParse(sidesPos[i], i, ParseTextmapSidedefParameter); + TextmapParse(sidedefBlocks.pos[i], i, ParseTextmapSidedefParameter); if (!sd->sector) I_Error("P_LoadTextmap: sidedef %s has no sector value set!\n", sizeu1(i)); @@ -3101,7 +3131,7 @@ static void P_LoadTextmap(void) memset(mt->stringargs, 0x00, NUMMAPTHINGSTRINGARGS*sizeof(*mt->stringargs)); mt->mobj = NULL; - TextmapParse(mapthingsPos[i], i, ParseTextmapThingParameter); + TextmapParse(mapthingBlocks.pos[i], i, ParseTextmapThingParameter); } } From b16c4df31c779bccd518fa5103b73b1b6f778165 Mon Sep 17 00:00:00 2001 From: Refrag Date: Mon, 20 May 2024 10:40:55 +0200 Subject: [PATCH 053/139] Ensure the servername fits into MAXSERVERNAME before setting it This commit adds a verification before setting the servername console variable. We now check that it fits within the MAXSERVERNAME length and we cancel setting it if it doesn't. Letting the servername be more than MAXSERVERNAME could lead to crashes when trying to edit the server name from the menu so, we now avoid those. --- src/netcode/mserv.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/netcode/mserv.c b/src/netcode/mserv.c index 3acacd24c..74ee120f9 100644 --- a/src/netcode/mserv.c +++ b/src/netcode/mserv.c @@ -50,6 +50,8 @@ static void Command_Listserv_f(void); #endif/*MASTERSERVER*/ +static boolean ServerName_CanChange (const char*); + static void Update_parameters (void); static void MasterServer_OnChange(void); @@ -61,7 +63,7 @@ static CV_PossibleValue_t masterserver_update_rate_cons_t[] = { }; consvar_t cv_masterserver = CVAR_INIT ("masterserver", "https://ds.ms.srb2.org/MS/0", CV_SAVE|CV_CALL, NULL, MasterServer_OnChange); -consvar_t cv_servername = CVAR_INIT ("servername", "SRB2 server", CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT|CV_ALLOWLUA, NULL, Update_parameters); +consvar_t cv_servername = CVAR_INIT_WITH_CALLBACKS ("servername", "SRB2 server", CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT|CV_ALLOWLUA, NULL, Update_parameters, ServerName_CanChange); consvar_t cv_masterserver_update_rate = CVAR_INIT ("masterserver_update_rate", "15", CV_SAVE|CV_CALL|CV_NOINIT, masterserver_update_rate_cons_t, Update_parameters); @@ -497,6 +499,15 @@ Set_api (const char *api) #endif/*MASTERSERVER*/ +static boolean ServerName_CanChange(const char* newvalue) +{ + if (strlen(newvalue) < MAXSERVERNAME) + return true; + + CONS_Alert(CONS_NOTICE, "The server name must be shorter than %d characters\n", MAXSERVERNAME); + return false; +} + static void Update_parameters (void) { From b480f78c96a4e6c19fcd81a1d9fbdf71e64201f2 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Tue, 4 Jun 2024 18:34:38 -0300 Subject: [PATCH 054/139] Implement support for ZDoom GL2 nodes --- src/p_setup.c | 71 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index c4b4a35b3..3e327a549 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3419,13 +3419,13 @@ typedef enum { } nodetype_t; // Find out the BSP format. -static nodetype_t P_GetNodetype(const virtres_t *virt, UINT8 **nodedata) +static nodetype_t P_GetNodetype(const virtres_t *virt, UINT8 **nodedata, char signature[4 + 1]) { boolean supported[NUMNODETYPES] = {0}; nodetype_t nodetype = NT_UNSUPPORTED; - char signature[4 + 1]; *nodedata = NULL; + signature[0] = signature[4] = '\0'; if (udmf) { @@ -3434,7 +3434,7 @@ static nodetype_t P_GetNodetype(const virtres_t *virt, UINT8 **nodedata) if (virtznodes && virtznodes->size) { *nodedata = virtznodes->data; - supported[NT_XGLN] = supported[NT_XGL3] = true; + supported[NT_XGLN] = supported[NT_XGL2] = supported[NT_XGL3] = true; } } else @@ -3456,9 +3456,9 @@ static nodetype_t P_GetNodetype(const virtres_t *virt, UINT8 **nodedata) virtssectors = vres_Find(virt, "SSECTORS"); if (virtssectors && virtssectors->size) - { // Possibly GL nodes: NODES ignored, SSECTORS takes precedence as nodes lump, (It is confusing yeah) and has a signature. + { // Possibly GL nodes: NODES ignored, SSECTORS takes precedence as nodes lump (it is confusing, yeah), and has a signature. *nodedata = virtssectors->data; - supported[NT_XGLN] = supported[NT_ZGLN] = supported[NT_XGL3] = true; + supported[NT_XGLN] = supported[NT_ZGLN] = supported[NT_XGL2] = supported[NT_XGL3] = true; } else { // Possibly ZDoom extended nodes: SSECTORS is empty, NODES has a signature. @@ -3478,19 +3478,42 @@ static nodetype_t P_GetNodetype(const virtres_t *virt, UINT8 **nodedata) } M_Memcpy(signature, *nodedata, 4); - signature[4] = '\0'; (*nodedata) += 4; - if (!strcmp(signature, "XNOD")) - nodetype = NT_XNOD; - else if (!strcmp(signature, "ZNOD")) - nodetype = NT_ZNOD; - else if (!strcmp(signature, "XGLN")) - nodetype = NT_XGLN; - else if (!strcmp(signature, "ZGLN")) - nodetype = NT_ZGLN; - else if (!strcmp(signature, "XGL3")) - nodetype = NT_XGL3; + // Identify node format from its starting signature. + if (memcmp(&signature[1], "NOD", 3) == 0) // ZDoom extended nodes + { + if (signature[0] == 'X') + { + nodetype = NT_XNOD; // Uncompressed + } + else if (signature[0] == 'Z') + { + nodetype = NT_ZNOD; // Compressed + } + } + else if (memcmp(&signature[1], "GL", 2) == 0) // GL nodes + { + switch (signature[0]) + { + case 'X': // Uncompressed + switch (signature[3]) + { + case 'N': nodetype = NT_XGLN; break; // GL nodes + case '2': nodetype = NT_XGL2; break; // Version 2 GL nodes + case '3': nodetype = NT_XGL3; break; // Version 3 GL nodes + } + break; + case 'Z': // Compressed + switch (signature[3]) + { + case 'N': nodetype = NT_ZGLN; break; // GL nodes (compressed) + case '2': nodetype = NT_ZGL2; break; // Version 2 GL nodes (compressed) + case '3': nodetype = NT_ZGL3; break; // Version 3 GL nodes (compressed) + } + break; + } + } return supported[nodetype] ? nodetype : NT_UNSUPPORTED; } @@ -3560,6 +3583,7 @@ static boolean P_LoadExtendedSubsectorsAndSegs(UINT8 **data, nodetype_t nodetype switch (nodetype) { case NT_XGLN: + case NT_XGL2: case NT_XGL3: for (m = 0; m < (size_t)subsectors[i].numlines; m++, k++) { @@ -3571,7 +3595,7 @@ static boolean P_LoadExtendedSubsectorsAndSegs(UINT8 **data, nodetype_t nodetype READUINT32((*data)); // partner, can be ignored by software renderer - if (nodetype == NT_XGL3) + if (nodetype != NT_XGLN) { UINT32 linenum = READUINT32((*data)); if (linenum != 0xFFFFFFFF && linenum >= numlines) @@ -3682,8 +3706,9 @@ static void P_LoadExtendedNodes(UINT8 **data, nodetype_t nodetype) static void P_LoadMapBSP(const virtres_t *virt) { + char signature[4 + 1]; UINT8 *nodedata = NULL; - nodetype_t nodetype = P_GetNodetype(virt, &nodedata); + nodetype_t nodetype = P_GetNodetype(virt, &nodedata, signature); switch (nodetype) { @@ -3715,6 +3740,7 @@ static void P_LoadMapBSP(const virtres_t *virt) } case NT_XNOD: case NT_XGLN: + case NT_XGL2: case NT_XGL3: if (!P_LoadExtraVertices(&nodedata)) return; @@ -3723,10 +3749,13 @@ static void P_LoadMapBSP(const virtres_t *virt) P_LoadExtendedNodes(&nodedata, nodetype); break; default: - CONS_Alert(CONS_WARNING, "Unsupported BSP format detected.\n"); - return; + if (isprint(signature[0]) && isprint(signature[1]) && isprint(signature[2]) && isprint(signature[3])) + { + I_Error("Unsupported BSP format '%s' detected!\n", signature); + return; + } + I_Error("Unknown BSP format detected!\n"); } - return; } // Split from P_LoadBlockMap for convenience From 89dbfe32db3b77a4de25dbc65cfe076a39add10c Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Wed, 5 Jun 2024 15:40:50 -0300 Subject: [PATCH 055/139] Disable -Wpedantic --- src/sdl/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt index ee48fa2b1..99425108e 100644 --- a/src/sdl/CMakeLists.txt +++ b/src/sdl/CMakeLists.txt @@ -33,8 +33,6 @@ target_compile_options(SRB2SDL2 PRIVATE -Wall -Wno-trigraphs -W # Was controlled by RELAXWARNINGS - -pedantic - -Wpedantic -Wfloat-equal -Wundef -Wpointer-arith From a50d7f5db5876b5c9c7882b4f068d11e1fd2ed40 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Wed, 5 Jun 2024 17:01:48 -0300 Subject: [PATCH 056/139] Fix code that emits -Wcalloc-transposed-args warnings --- src/apng.c | 2 +- src/d_main.c | 2 +- src/deh_soc.c | 2 +- src/filesrch.c | 2 +- src/sdl/i_video.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/apng.c b/src/apng.c index 11d3ab9f5..cfb1473a4 100644 --- a/src/apng.c +++ b/src/apng.c @@ -71,7 +71,7 @@ apng_create_info_struct (png_structp pngp) { apng_infop ainfop; (void)pngp; - if (( ainfop = calloc(sizeof (apng_info),1) )) + if (( ainfop = calloc(1,sizeof (apng_info)) )) { apng_set_write_fn(pngp, ainfop, 0, 0, 0, 0, 0); apng_set_set_acTL_fn(pngp, ainfop, 0); diff --git a/src/d_main.c b/src/d_main.c index 2405b0136..3a3a0b26a 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1024,7 +1024,7 @@ void D_StartTitle(void) #define REALLOC_FILE_LIST \ if (list->files == NULL) \ { \ - list->files = calloc(sizeof(list->files), 2); \ + list->files = calloc(2, sizeof(list->files)); \ list->numfiles = 1; \ } \ else \ diff --git a/src/deh_soc.c b/src/deh_soc.c index dda3b2ef4..3759cc9c7 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -2791,7 +2791,7 @@ void readframe(MYFILE *f, INT32 num) size_t z; boolean found = false; size_t actionlen = strlen(word2) + 1; - char *actiontocompare = calloc(actionlen, 1); + char *actiontocompare = calloc(1, actionlen); strcpy(actiontocompare, word2); strupr(actiontocompare); diff --git a/src/filesrch.c b/src/filesrch.c index 3a729a9c8..ea19e00cd 100644 --- a/src/filesrch.c +++ b/src/filesrch.c @@ -1191,7 +1191,7 @@ boolean preparefilemenu(boolean samedepth) size_t i; if (filenamebuf == NULL) - filenamebuf = calloc(sizeof(char) * MAX_WADPATH, numwadfiles); + filenamebuf = calloc(numwadfiles, sizeof(char) * MAX_WADPATH); for (i = 0; i < numwadfiles; i++) { diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 249be61f6..10c866a1e 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1706,7 +1706,7 @@ static void Impl_VideoSetupBuffer(void) vid.direct = NULL; if (vid.buffer) free(vid.buffer); - vid.buffer = calloc(vid.rowbytes*vid.height, NUMSCREENS); + vid.buffer = calloc(NUMSCREENS, vid.rowbytes*vid.height); if (!vid.buffer) { I_Error("%s", M_GetText("Not enough memory for video buffer\n")); From 85376ebe25743a98c97994f8a658566f65898d68 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Wed, 5 Jun 2024 18:18:02 -0300 Subject: [PATCH 057/139] Fix #1153 --- src/p_setup.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index c4b4a35b3..b8fcf6b71 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3502,7 +3502,6 @@ static boolean P_LoadExtraVertices(UINT8 **data) UINT32 xtrvrtx = READUINT32((*data)); line_t* ld = lines; vertex_t *oldpos = vertexes; - ssize_t offset; size_t i; if (numvertexes != origvrtx) // If native vertex count doesn't match node original vertex count, bail out (broken data?). @@ -3517,12 +3516,11 @@ static boolean P_LoadExtraVertices(UINT8 **data) // If extra vertexes were generated, reallocate the vertex array and fix the pointers. numvertexes += xtrvrtx; vertexes = Z_Realloc(vertexes, numvertexes*sizeof(*vertexes), PU_LEVEL, NULL); - offset = (size_t)(vertexes - oldpos); for (i = 0, ld = lines; i < numlines; i++, ld++) { - ld->v1 += offset; - ld->v2 += offset; + ld->v1 = &vertexes[ld->v1 - oldpos]; + ld->v2 = &vertexes[ld->v2 - oldpos]; } // Read extra vertex data. From 7751c7f132ce508a47cda7f94cca70503fdb284e Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Wed, 5 Jun 2024 18:56:02 -0300 Subject: [PATCH 058/139] Fix code that generated warnings under Clang Fixed code that generated the following warnings under Clang: -Wdeprecated-non-prototype -Wsingle-bit-bitfield-constant-conversion warnings --- src/info.h | 538 ++++++++++++++++++++++++++------------------------- src/r_defs.h | 2 +- 2 files changed, 271 insertions(+), 269 deletions(-) diff --git a/src/info.h b/src/info.h index 0361f6428..f58aee07d 100644 --- a/src/info.h +++ b/src/info.h @@ -298,276 +298,278 @@ enum actionnum NUMACTIONS }; +struct mobj_s; + // IMPORTANT NOTE: If you add/remove from this list of action // functions, don't forget to update them in deh_tables.c! -void A_Explode(); -void A_Pain(); -void A_Fall(); -void A_MonitorPop(); -void A_GoldMonitorPop(); -void A_GoldMonitorRestore(); -void A_GoldMonitorSparkle(); -void A_Look(); -void A_Chase(); -void A_FaceStabChase(); -void A_FaceStabRev(); -void A_FaceStabHurl(); -void A_FaceStabMiss(); -void A_StatueBurst(); -void A_FaceTarget(); -void A_FaceTracer(); -void A_Scream(); -void A_BossDeath(); -void A_SetShadowScale(); -void A_ShadowScream(); // MARIA!!!!!! -void A_CustomPower(); // Use this for a custom power -void A_GiveWeapon(); // Gives the player weapon(s) -void A_RingBox(); // Obtained Ring Box Tails -void A_Invincibility(); // Obtained Invincibility Box -void A_SuperSneakers(); // Obtained Super Sneakers Box -void A_BunnyHop(); // have bunny hop tails -void A_BubbleSpawn(); // Randomly spawn bubbles -void A_FanBubbleSpawn(); -void A_BubbleRise(); // Bubbles float to surface -void A_BubbleCheck(); // Don't draw if not underwater -void A_AwardScore(); -void A_ExtraLife(); // Extra Life -void A_GiveShield(); // Obtained Shield -void A_GravityBox(); -void A_ScoreRise(); // Rise the score logo -void A_AttractChase(); // Ring Chase -void A_DropMine(); // Drop Mine from Skim or Jetty-Syn Bomber -void A_FishJump(); // Fish Jump -void A_ThrownRing(); // Sparkle trail for red ring -void A_SetSolidSteam(); -void A_UnsetSolidSteam(); -void A_SignSpin(); -void A_SignPlayer(); -void A_OverlayThink(); -void A_JetChase(); -void A_JetbThink(); // Jetty-Syn Bomber Thinker -void A_JetgThink(); // Jetty-Syn Gunner Thinker -void A_JetgShoot(); // Jetty-Syn Shoot Function -void A_ShootBullet(); // JetgShoot without reactiontime setting -void A_MinusDigging(); -void A_MinusPopup(); -void A_MinusCheck(); -void A_ChickenCheck(); -void A_MouseThink(); // Mouse Thinker -void A_DetonChase(); // Deton Chaser -void A_CapeChase(); // Fake little Super Sonic cape -void A_RotateSpikeBall(); // Spike ball rotation -void A_SlingAppear(); -void A_UnidusBall(); -void A_RockSpawn(); -void A_SetFuse(); -void A_CrawlaCommanderThink(); // Crawla Commander -void A_SmokeTrailer(); -void A_RingExplode(); -void A_OldRingExplode(); -void A_MixUp(); -void A_RecyclePowers(); -void A_BossScream(); -void A_Boss2TakeDamage(); -void A_GoopSplat(); -void A_Boss2PogoSFX(); -void A_Boss2PogoTarget(); -void A_EggmanBox(); -void A_TurretFire(); -void A_SuperTurretFire(); -void A_TurretStop(); -void A_JetJawRoam(); -void A_JetJawChomp(); -void A_PointyThink(); -void A_CheckBuddy(); -void A_HoodFire(); -void A_HoodThink(); -void A_HoodFall(); -void A_ArrowBonks(); -void A_SnailerThink(); -void A_SharpChase(); -void A_SharpSpin(); -void A_SharpDecel(); -void A_CrushstaceanWalk(); -void A_CrushstaceanPunch(); -void A_CrushclawAim(); -void A_CrushclawLaunch(); -void A_VultureVtol(); -void A_VultureCheck(); -void A_VultureHover(); -void A_VultureBlast(); -void A_VultureFly(); -void A_SkimChase(); -void A_SkullAttack(); -void A_LobShot(); -void A_FireShot(); -void A_SuperFireShot(); -void A_BossFireShot(); -void A_Boss7FireMissiles(); -void A_Boss1Laser(); -void A_FocusTarget(); -void A_Boss4Reverse(); -void A_Boss4SpeedUp(); -void A_Boss4Raise(); -void A_SparkFollow(); -void A_BuzzFly(); -void A_GuardChase(); -void A_EggShield(); -void A_SetReactionTime(); -void A_Boss1Spikeballs(); -void A_Boss3TakeDamage(); -void A_Boss3Path(); -void A_Boss3ShockThink(); -void A_Shockwave(); -void A_LinedefExecute(); -void A_LinedefExecuteFromArg(); -void A_PlaySeeSound(); -void A_PlayAttackSound(); -void A_PlayActiveSound(); -void A_1upThinker(); -void A_BossZoom(); //Unused -void A_Boss1Chase(); -void A_Boss2Chase(); -void A_Boss2Pogo(); -void A_Boss7Chase(); -void A_BossJetFume(); -void A_SpawnObjectAbsolute(); -void A_SpawnObjectRelative(); -void A_ChangeAngleRelative(); -void A_ChangeAngleAbsolute(); -void A_RollAngle(); -void A_ChangeRollAngleRelative(); -void A_ChangeRollAngleAbsolute(); -void A_PlaySound(); -void A_FindTarget(); -void A_FindTracer(); -void A_SetTics(); -void A_SetRandomTics(); -void A_ChangeColorRelative(); -void A_ChangeColorAbsolute(); -void A_Dye(); -void A_SetTranslation(); -void A_MoveRelative(); -void A_MoveAbsolute(); -void A_Thrust(); -void A_ZThrust(); -void A_SetTargetsTarget(); -void A_SetObjectFlags(); -void A_SetObjectFlags2(); -void A_RandomState(); -void A_RandomStateRange(); -void A_StateRangeByAngle(); -void A_StateRangeByParameter(); -void A_DualAction(); -void A_RemoteAction(); -void A_ToggleFlameJet(); -void A_OrbitNights(); -void A_GhostMe(); -void A_SetObjectState(); -void A_SetObjectTypeState(); -void A_KnockBack(); -void A_PushAway(); -void A_RingDrain(); -void A_SplitShot(); -void A_MissileSplit(); -void A_MultiShot(); -void A_InstaLoop(); -void A_Custom3DRotate(); -void A_SearchForPlayers(); -void A_CheckRandom(); -void A_CheckTargetRings(); -void A_CheckRings(); -void A_CheckTotalRings(); -void A_CheckHealth(); -void A_CheckRange(); -void A_CheckHeight(); -void A_CheckTrueRange(); -void A_CheckThingCount(); -void A_CheckAmbush(); -void A_CheckCustomValue(); -void A_CheckCusValMemo(); -void A_SetCustomValue(); -void A_UseCusValMemo(); -void A_RelayCustomValue(); -void A_CusValAction(); -void A_ForceStop(); -void A_ForceWin(); -void A_SpikeRetract(); -void A_InfoState(); -void A_Repeat(); -void A_SetScale(); -void A_RemoteDamage(); -void A_HomingChase(); -void A_TrapShot(); -void A_VileTarget(); -void A_VileAttack(); -void A_VileFire(); -void A_BrakChase(); -void A_BrakFireShot(); -void A_BrakLobShot(); -void A_NapalmScatter(); -void A_SpawnFreshCopy(); -void A_FlickySpawn(); -void A_FlickyCenter(); -void A_FlickyAim(); -void A_FlickyFly(); -void A_FlickySoar(); -void A_FlickyCoast(); -void A_FlickyHop(); -void A_FlickyFlounder(); -void A_FlickyCheck(); -void A_FlickyHeightCheck(); -void A_FlickyFlutter(); -void A_FlameParticle(); -void A_FadeOverlay(); -void A_Boss5Jump(); -void A_LightBeamReset(); -void A_MineExplode(); -void A_MineRange(); -void A_ConnectToGround(); -void A_SpawnParticleRelative(); -void A_MultiShotDist(); -void A_WhoCaresIfYourSonIsABee(); -void A_ParentTriesToSleep(); -void A_CryingToMomma(); -void A_CheckFlags2(); -void A_Boss5FindWaypoint(); -void A_DoNPCSkid(); -void A_DoNPCPain(); -void A_PrepareRepeat(); -void A_Boss5ExtraRepeat(); -void A_Boss5Calm(); -void A_Boss5CheckOnGround(); -void A_Boss5CheckFalling(); -void A_Boss5PinchShot(); -void A_Boss5MakeItRain(); -void A_Boss5MakeJunk(); -void A_LookForBetter(); -void A_Boss5BombExplode(); -void A_DustDevilThink(); -void A_TNTExplode(); -void A_DebrisRandom(); -void A_TrainCameo(); -void A_TrainCameo2(); -void A_CanarivoreGas(); -void A_KillSegments(); -void A_SnapperSpawn(); -void A_SnapperThinker(); -void A_SaloonDoorSpawn(); -void A_MinecartSparkThink(); -void A_ModuloToState(); -void A_LavafallRocks(); -void A_LavafallLava(); -void A_FallingLavaCheck(); -void A_FireShrink(); -void A_SpawnPterabytes(); -void A_PterabyteHover(); -void A_RolloutSpawn(); -void A_RolloutRock(); -void A_DragonbomberSpawn(); -void A_DragonWing(); -void A_DragonSegment(); -void A_ChangeHeight(); +void A_Explode(struct mobj_s *actor); +void A_Pain(struct mobj_s *actor); +void A_Fall(struct mobj_s *actor); +void A_MonitorPop(struct mobj_s *actor); +void A_GoldMonitorPop(struct mobj_s *actor); +void A_GoldMonitorRestore(struct mobj_s *actor); +void A_GoldMonitorSparkle(struct mobj_s *actor); +void A_Look(struct mobj_s *actor); +void A_Chase(struct mobj_s *actor); +void A_FaceStabChase(struct mobj_s *actor); +void A_FaceStabRev(struct mobj_s *actor); +void A_FaceStabHurl(struct mobj_s *actor); +void A_FaceStabMiss(struct mobj_s *actor); +void A_StatueBurst(struct mobj_s *actor); +void A_FaceTarget(struct mobj_s *actor); +void A_FaceTracer(struct mobj_s *actor); +void A_Scream(struct mobj_s *actor); +void A_BossDeath(struct mobj_s *actor); +void A_SetShadowScale(struct mobj_s *actor); +void A_ShadowScream(struct mobj_s *actor); // MARIA!!!!!! +void A_CustomPower(struct mobj_s *actor); // Use this for a custom power +void A_GiveWeapon(struct mobj_s *actor); // Gives the player weapon(s) +void A_RingBox(struct mobj_s *actor); // Obtained Ring Box Tails +void A_Invincibility(struct mobj_s *actor); // Obtained Invincibility Box +void A_SuperSneakers(struct mobj_s *actor); // Obtained Super Sneakers Box +void A_BunnyHop(struct mobj_s *actor); // have bunny hop tails +void A_BubbleSpawn(struct mobj_s *actor); // Randomly spawn bubbles +void A_FanBubbleSpawn(struct mobj_s *actor); +void A_BubbleRise(struct mobj_s *actor); // Bubbles float to surface +void A_BubbleCheck(struct mobj_s *actor); // Don't draw if not underwater +void A_AwardScore(struct mobj_s *actor); +void A_ExtraLife(struct mobj_s *actor); // Extra Life +void A_GiveShield(struct mobj_s *actor); // Obtained Shield +void A_GravityBox(struct mobj_s *actor); +void A_ScoreRise(struct mobj_s *actor); // Rise the score logo +void A_AttractChase(struct mobj_s *actor); // Ring Chase +void A_DropMine(struct mobj_s *actor); // Drop Mine from Skim or Jetty-Syn Bomber +void A_FishJump(struct mobj_s *actor); // Fish Jump +void A_ThrownRing(struct mobj_s *actor); // Sparkle trail for red ring +void A_SetSolidSteam(struct mobj_s *actor); +void A_UnsetSolidSteam(struct mobj_s *actor); +void A_SignSpin(struct mobj_s *actor); +void A_SignPlayer(struct mobj_s *actor); +void A_OverlayThink(struct mobj_s *actor); +void A_JetChase(struct mobj_s *actor); +void A_JetbThink(struct mobj_s *actor); // Jetty-Syn Bomber Thinker +void A_JetgThink(struct mobj_s *actor); // Jetty-Syn Gunner Thinker +void A_JetgShoot(struct mobj_s *actor); // Jetty-Syn Shoot Function +void A_ShootBullet(struct mobj_s *actor); // JetgShoot without reactiontime setting +void A_MinusDigging(struct mobj_s *actor); +void A_MinusPopup(struct mobj_s *actor); +void A_MinusCheck(struct mobj_s *actor); +void A_ChickenCheck(struct mobj_s *actor); +void A_MouseThink(struct mobj_s *actor); // Mouse Thinker +void A_DetonChase(struct mobj_s *actor); // Deton Chaser +void A_CapeChase(struct mobj_s *actor); // Fake little Super Sonic cape +void A_RotateSpikeBall(struct mobj_s *actor); // Spike ball rotation +void A_SlingAppear(struct mobj_s *actor); +void A_UnidusBall(struct mobj_s *actor); +void A_RockSpawn(struct mobj_s *actor); +void A_SetFuse(struct mobj_s *actor); +void A_CrawlaCommanderThink(struct mobj_s *actor); // Crawla Commander +void A_SmokeTrailer(struct mobj_s *actor); +void A_RingExplode(struct mobj_s *actor); +void A_OldRingExplode(struct mobj_s *actor); +void A_MixUp(struct mobj_s *actor); +void A_RecyclePowers(struct mobj_s *actor); +void A_BossScream(struct mobj_s *actor); +void A_Boss2TakeDamage(struct mobj_s *actor); +void A_GoopSplat(struct mobj_s *actor); +void A_Boss2PogoSFX(struct mobj_s *actor); +void A_Boss2PogoTarget(struct mobj_s *actor); +void A_EggmanBox(struct mobj_s *actor); +void A_TurretFire(struct mobj_s *actor); +void A_SuperTurretFire(struct mobj_s *actor); +void A_TurretStop(struct mobj_s *actor); +void A_JetJawRoam(struct mobj_s *actor); +void A_JetJawChomp(struct mobj_s *actor); +void A_PointyThink(struct mobj_s *actor); +void A_CheckBuddy(struct mobj_s *actor); +void A_HoodFire(struct mobj_s *actor); +void A_HoodThink(struct mobj_s *actor); +void A_HoodFall(struct mobj_s *actor); +void A_ArrowBonks(struct mobj_s *actor); +void A_SnailerThink(struct mobj_s *actor); +void A_SharpChase(struct mobj_s *actor); +void A_SharpSpin(struct mobj_s *actor); +void A_SharpDecel(struct mobj_s *actor); +void A_CrushstaceanWalk(struct mobj_s *actor); +void A_CrushstaceanPunch(struct mobj_s *actor); +void A_CrushclawAim(struct mobj_s *actor); +void A_CrushclawLaunch(struct mobj_s *actor); +void A_VultureVtol(struct mobj_s *actor); +void A_VultureCheck(struct mobj_s *actor); +void A_VultureHover(struct mobj_s *actor); +void A_VultureBlast(struct mobj_s *actor); +void A_VultureFly(struct mobj_s *actor); +void A_SkimChase(struct mobj_s *actor); +void A_SkullAttack(struct mobj_s *actor); +void A_LobShot(struct mobj_s *actor); +void A_FireShot(struct mobj_s *actor); +void A_SuperFireShot(struct mobj_s *actor); +void A_BossFireShot(struct mobj_s *actor); +void A_Boss7FireMissiles(struct mobj_s *actor); +void A_Boss1Laser(struct mobj_s *actor); +void A_FocusTarget(struct mobj_s *actor); +void A_Boss4Reverse(struct mobj_s *actor); +void A_Boss4SpeedUp(struct mobj_s *actor); +void A_Boss4Raise(struct mobj_s *actor); +void A_SparkFollow(struct mobj_s *actor); +void A_BuzzFly(struct mobj_s *actor); +void A_GuardChase(struct mobj_s *actor); +void A_EggShield(struct mobj_s *actor); +void A_SetReactionTime(struct mobj_s *actor); +void A_Boss1Spikeballs(struct mobj_s *actor); +void A_Boss3TakeDamage(struct mobj_s *actor); +void A_Boss3Path(struct mobj_s *actor); +void A_Boss3ShockThink(struct mobj_s *actor); +void A_Shockwave(struct mobj_s *actor); +void A_LinedefExecute(struct mobj_s *actor); +void A_LinedefExecuteFromArg(struct mobj_s *actor); +void A_PlaySeeSound(struct mobj_s *actor); +void A_PlayAttackSound(struct mobj_s *actor); +void A_PlayActiveSound(struct mobj_s *actor); +void A_1upThinker(struct mobj_s *actor); +void A_BossZoom(struct mobj_s *actor); //Unused +void A_Boss1Chase(struct mobj_s *actor); +void A_Boss2Chase(struct mobj_s *actor); +void A_Boss2Pogo(struct mobj_s *actor); +void A_Boss7Chase(struct mobj_s *actor); +void A_BossJetFume(struct mobj_s *actor); +void A_SpawnObjectAbsolute(struct mobj_s *actor); +void A_SpawnObjectRelative(struct mobj_s *actor); +void A_ChangeAngleRelative(struct mobj_s *actor); +void A_ChangeAngleAbsolute(struct mobj_s *actor); +void A_RollAngle(struct mobj_s *actor); +void A_ChangeRollAngleRelative(struct mobj_s *actor); +void A_ChangeRollAngleAbsolute(struct mobj_s *actor); +void A_PlaySound(struct mobj_s *actor); +void A_FindTarget(struct mobj_s *actor); +void A_FindTracer(struct mobj_s *actor); +void A_SetTics(struct mobj_s *actor); +void A_SetRandomTics(struct mobj_s *actor); +void A_ChangeColorRelative(struct mobj_s *actor); +void A_ChangeColorAbsolute(struct mobj_s *actor); +void A_Dye(struct mobj_s *actor); +void A_SetTranslation(struct mobj_s *actor); +void A_MoveRelative(struct mobj_s *actor); +void A_MoveAbsolute(struct mobj_s *actor); +void A_Thrust(struct mobj_s *actor); +void A_ZThrust(struct mobj_s *actor); +void A_SetTargetsTarget(struct mobj_s *actor); +void A_SetObjectFlags(struct mobj_s *actor); +void A_SetObjectFlags2(struct mobj_s *actor); +void A_RandomState(struct mobj_s *actor); +void A_RandomStateRange(struct mobj_s *actor); +void A_StateRangeByAngle(struct mobj_s *actor); +void A_StateRangeByParameter(struct mobj_s *actor); +void A_DualAction(struct mobj_s *actor); +void A_RemoteAction(struct mobj_s *actor); +void A_ToggleFlameJet(struct mobj_s *actor); +void A_OrbitNights(struct mobj_s *actor); +void A_GhostMe(struct mobj_s *actor); +void A_SetObjectState(struct mobj_s *actor); +void A_SetObjectTypeState(struct mobj_s *actor); +void A_KnockBack(struct mobj_s *actor); +void A_PushAway(struct mobj_s *actor); +void A_RingDrain(struct mobj_s *actor); +void A_SplitShot(struct mobj_s *actor); +void A_MissileSplit(struct mobj_s *actor); +void A_MultiShot(struct mobj_s *actor); +void A_InstaLoop(struct mobj_s *actor); +void A_Custom3DRotate(struct mobj_s *actor); +void A_SearchForPlayers(struct mobj_s *actor); +void A_CheckRandom(struct mobj_s *actor); +void A_CheckTargetRings(struct mobj_s *actor); +void A_CheckRings(struct mobj_s *actor); +void A_CheckTotalRings(struct mobj_s *actor); +void A_CheckHealth(struct mobj_s *actor); +void A_CheckRange(struct mobj_s *actor); +void A_CheckHeight(struct mobj_s *actor); +void A_CheckTrueRange(struct mobj_s *actor); +void A_CheckThingCount(struct mobj_s *actor); +void A_CheckAmbush(struct mobj_s *actor); +void A_CheckCustomValue(struct mobj_s *actor); +void A_CheckCusValMemo(struct mobj_s *actor); +void A_SetCustomValue(struct mobj_s *actor); +void A_UseCusValMemo(struct mobj_s *actor); +void A_RelayCustomValue(struct mobj_s *actor); +void A_CusValAction(struct mobj_s *actor); +void A_ForceStop(struct mobj_s *actor); +void A_ForceWin(struct mobj_s *actor); +void A_SpikeRetract(struct mobj_s *actor); +void A_InfoState(struct mobj_s *actor); +void A_Repeat(struct mobj_s *actor); +void A_SetScale(struct mobj_s *actor); +void A_RemoteDamage(struct mobj_s *actor); +void A_HomingChase(struct mobj_s *actor); +void A_TrapShot(struct mobj_s *actor); +void A_VileTarget(struct mobj_s *actor); +void A_VileAttack(struct mobj_s *actor); +void A_VileFire(struct mobj_s *actor); +void A_BrakChase(struct mobj_s *actor); +void A_BrakFireShot(struct mobj_s *actor); +void A_BrakLobShot(struct mobj_s *actor); +void A_NapalmScatter(struct mobj_s *actor); +void A_SpawnFreshCopy(struct mobj_s *actor); +void A_FlickySpawn(struct mobj_s *actor); +void A_FlickyCenter(struct mobj_s *actor); +void A_FlickyAim(struct mobj_s *actor); +void A_FlickyFly(struct mobj_s *actor); +void A_FlickySoar(struct mobj_s *actor); +void A_FlickyCoast(struct mobj_s *actor); +void A_FlickyHop(struct mobj_s *actor); +void A_FlickyFlounder(struct mobj_s *actor); +void A_FlickyCheck(struct mobj_s *actor); +void A_FlickyHeightCheck(struct mobj_s *actor); +void A_FlickyFlutter(struct mobj_s *actor); +void A_FlameParticle(struct mobj_s *actor); +void A_FadeOverlay(struct mobj_s *actor); +void A_Boss5Jump(struct mobj_s *actor); +void A_LightBeamReset(struct mobj_s *actor); +void A_MineExplode(struct mobj_s *actor); +void A_MineRange(struct mobj_s *actor); +void A_ConnectToGround(struct mobj_s *actor); +void A_SpawnParticleRelative(struct mobj_s *actor); +void A_MultiShotDist(struct mobj_s *actor); +void A_WhoCaresIfYourSonIsABee(struct mobj_s *actor); +void A_ParentTriesToSleep(struct mobj_s *actor); +void A_CryingToMomma(struct mobj_s *actor); +void A_CheckFlags2(struct mobj_s *actor); +void A_Boss5FindWaypoint(struct mobj_s *actor); +void A_DoNPCSkid(struct mobj_s *actor); +void A_DoNPCPain(struct mobj_s *actor); +void A_PrepareRepeat(struct mobj_s *actor); +void A_Boss5ExtraRepeat(struct mobj_s *actor); +void A_Boss5Calm(struct mobj_s *actor); +void A_Boss5CheckOnGround(struct mobj_s *actor); +void A_Boss5CheckFalling(struct mobj_s *actor); +void A_Boss5PinchShot(struct mobj_s *actor); +void A_Boss5MakeItRain(struct mobj_s *actor); +void A_Boss5MakeJunk(struct mobj_s *actor); +void A_LookForBetter(struct mobj_s *actor); +void A_Boss5BombExplode(struct mobj_s *actor); +void A_DustDevilThink(struct mobj_s *actor); +void A_TNTExplode(struct mobj_s *actor); +void A_DebrisRandom(struct mobj_s *actor); +void A_TrainCameo(struct mobj_s *actor); +void A_TrainCameo2(struct mobj_s *actor); +void A_CanarivoreGas(struct mobj_s *actor); +void A_KillSegments(struct mobj_s *actor); +void A_SnapperSpawn(struct mobj_s *actor); +void A_SnapperThinker(struct mobj_s *actor); +void A_SaloonDoorSpawn(struct mobj_s *actor); +void A_MinecartSparkThink(struct mobj_s *actor); +void A_ModuloToState(struct mobj_s *actor); +void A_LavafallRocks(struct mobj_s *actor); +void A_LavafallLava(struct mobj_s *actor); +void A_FallingLavaCheck(struct mobj_s *actor); +void A_FireShrink(struct mobj_s *actor); +void A_SpawnPterabytes(struct mobj_s *actor); +void A_PterabyteHover(struct mobj_s *actor); +void A_RolloutSpawn(struct mobj_s *actor); +void A_RolloutRock(struct mobj_s *actor); +void A_DragonbomberSpawn(struct mobj_s *actor); +void A_DragonWing(struct mobj_s *actor); +void A_DragonSegment(struct mobj_s *actor); +void A_ChangeHeight(struct mobj_s *actor); extern int actionsoverridden[NUMACTIONS][MAX_ACTION_RECURSION]; diff --git a/src/r_defs.h b/src/r_defs.h index 7a6f518ee..54d43e824 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -358,7 +358,7 @@ typedef struct pslope_s double dzdelta; - boolean moved : 1; + boolean moved; UINT8 flags; // Slope options } pslope_t; From 4065860ddda41435092a3137a8ebe48796b5913c Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Wed, 5 Jun 2024 18:57:48 -0300 Subject: [PATCH 059/139] Delete duplicated prototypes --- src/p_enemy.c | 270 -------------------------------------------------- 1 file changed, 270 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 59934aa40..e1b21e295 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -54,276 +54,6 @@ static dirtype_t diags[] = DI_NORTHWEST, DI_NORTHEAST, DI_SOUTHWEST, DI_SOUTHEAST }; -//Real Prototypes to A_* -void A_Fall(mobj_t *actor); -void A_Look(mobj_t *actor); -void A_Chase(mobj_t *actor); -void A_FaceStabChase(mobj_t *actor); -void A_FaceStabRev(mobj_t *actor); -void A_FaceStabHurl(mobj_t *actor); -void A_FaceStabMiss(mobj_t *actor); -void A_StatueBurst(mobj_t *actor); -void A_JetJawRoam(mobj_t *actor); -void A_JetJawChomp(mobj_t *actor); -void A_PointyThink(mobj_t *actor); -void A_CheckBuddy(mobj_t *actor); -void A_HoodFire(mobj_t *actor); -void A_HoodThink(mobj_t *actor); -void A_HoodFall(mobj_t *actor); -void A_ArrowBonks(mobj_t *actor); -void A_SnailerThink(mobj_t *actor); -void A_SharpChase(mobj_t *actor); -void A_SharpSpin(mobj_t *actor); -void A_SharpDecel(mobj_t *actor); -void A_CrushstaceanWalk(mobj_t *actor); -void A_CrushstaceanPunch(mobj_t *actor); -void A_CrushclawAim(mobj_t *actor); -void A_CrushclawLaunch(mobj_t *actor); -void A_VultureVtol(mobj_t *actor); -void A_VultureCheck(mobj_t *actor); -void A_VultureHover(mobj_t *actor); -void A_VultureBlast(mobj_t *actor); -void A_VultureFly(mobj_t *actor); -void A_SkimChase(mobj_t *actor); -void A_FaceTarget(mobj_t *actor); -void A_FaceTracer(mobj_t *actor); -void A_LobShot(mobj_t *actor); -void A_FireShot(mobj_t *actor); -void A_SuperFireShot(mobj_t *actor); -void A_BossFireShot(mobj_t *actor); -void A_Boss7FireMissiles(mobj_t *actor); -void A_Boss1Laser(mobj_t *actor); -void A_FocusTarget(mobj_t *actor); -void A_Boss4Reverse(mobj_t *actor); -void A_Boss4SpeedUp(mobj_t *actor); -void A_Boss4Raise(mobj_t *actor); -void A_SkullAttack(mobj_t *actor); -void A_BossZoom(mobj_t *actor); -void A_BossScream(mobj_t *actor); -void A_Scream(mobj_t *actor); -void A_Pain(mobj_t *actor); -void A_1upThinker(mobj_t *actor); -void A_MonitorPop(mobj_t *actor); -void A_GoldMonitorPop(mobj_t *actor); -void A_GoldMonitorRestore(mobj_t *actor); -void A_GoldMonitorSparkle(mobj_t *actor); -void A_Explode(mobj_t *actor); -void A_BossDeath(mobj_t *actor); -void A_SetShadowScale(mobj_t *actor); -void A_ShadowScream(mobj_t *actor); -void A_CustomPower(mobj_t *actor); -void A_GiveWeapon(mobj_t *actor); -void A_RingBox(mobj_t *actor); -void A_Invincibility(mobj_t *actor); -void A_SuperSneakers(mobj_t *actor); -void A_AwardScore(mobj_t *actor); -void A_ExtraLife(mobj_t *actor); -void A_GiveShield(mobj_t *actor); -void A_GravityBox(mobj_t *actor); -void A_ScoreRise(mobj_t *actor); -void A_BunnyHop(mobj_t *actor); -void A_BubbleSpawn(mobj_t *actor); -void A_FanBubbleSpawn(mobj_t *actor); -void A_BubbleRise(mobj_t *actor); -void A_BubbleCheck(mobj_t *actor); -void A_AttractChase(mobj_t *actor); -void A_DropMine(mobj_t *actor); -void A_FishJump(mobj_t *actor); -void A_ThrownRing(mobj_t *actor); -void A_SetSolidSteam(mobj_t *actor); -void A_UnsetSolidSteam(mobj_t *actor); -void A_SignSpin(mobj_t *actor); -void A_SignPlayer(mobj_t *actor); -void A_OverlayThink(mobj_t *actor); -void A_JetChase(mobj_t *actor); -void A_JetbThink(mobj_t *actor); -void A_JetgShoot(mobj_t *actor); -void A_JetgThink(mobj_t *actor); -void A_ShootBullet(mobj_t *actor); -void A_MinusDigging(mobj_t *actor); -void A_MinusPopup(mobj_t *actor); -void A_MinusCheck(mobj_t *actor); -void A_ChickenCheck(mobj_t *actor); -void A_MouseThink(mobj_t *actor); -void A_DetonChase(mobj_t *actor); -void A_CapeChase(mobj_t *actor); -void A_RotateSpikeBall(mobj_t *actor); -void A_SlingAppear(mobj_t *actor); -void A_UnidusBall(mobj_t *actor); -void A_RockSpawn(mobj_t *actor); -void A_SetFuse(mobj_t *actor); -void A_CrawlaCommanderThink(mobj_t *actor); -void A_RingExplode(mobj_t *actor); -void A_OldRingExplode(mobj_t *actor); -void A_MixUp(mobj_t *actor); -void A_RecyclePowers(mobj_t *actor); -void A_Boss2TakeDamage(mobj_t *actor); -void A_Boss7Chase(mobj_t *actor); -void A_GoopSplat(mobj_t *actor); -void A_Boss2PogoSFX(mobj_t *actor); -void A_Boss2PogoTarget(mobj_t *actor); -void A_EggmanBox(mobj_t *actor); -void A_TurretFire(mobj_t *actor); -void A_SuperTurretFire(mobj_t *actor); -void A_TurretStop(mobj_t *actor); -void A_SparkFollow(mobj_t *actor); -void A_BuzzFly(mobj_t *actor); -void A_GuardChase(mobj_t *actor); -void A_EggShield(mobj_t *actor); -void A_SetReactionTime(mobj_t *actor); -void A_Boss1Spikeballs(mobj_t *actor); -void A_Boss3TakeDamage(mobj_t *actor); -void A_Boss3Path(mobj_t *actor); -void A_Boss3ShockThink(mobj_t *actor); -void A_Shockwave(mobj_t *actor); -void A_LinedefExecute(mobj_t *actor); -void A_LinedefExecuteFromArg(mobj_t *actor); -void A_PlaySeeSound(mobj_t *actor); -void A_PlayAttackSound(mobj_t *actor); -void A_PlayActiveSound(mobj_t *actor); -void A_SmokeTrailer(mobj_t *actor); -void A_SpawnObjectAbsolute(mobj_t *actor); -void A_SpawnObjectRelative(mobj_t *actor); -void A_ChangeAngleRelative(mobj_t *actor); -void A_ChangeAngleAbsolute(mobj_t *actor); -void A_RollAngle(mobj_t *actor); -void A_ChangeRollAngleRelative(mobj_t *actor); -void A_ChangeRollAngleAbsolute(mobj_t *actor); -void A_PlaySound(mobj_t *actor); -void A_FindTarget(mobj_t *actor); -void A_FindTracer(mobj_t *actor); -void A_SetTics(mobj_t *actor); -void A_SetRandomTics(mobj_t *actor); -void A_ChangeColorRelative(mobj_t *actor); -void A_ChangeColorAbsolute(mobj_t *actor); -void A_Dye(mobj_t *actor); -void A_SetTranslation(mobj_t *actor); -void A_MoveRelative(mobj_t *actor); -void A_MoveAbsolute(mobj_t *actor); -void A_Thrust(mobj_t *actor); -void A_ZThrust(mobj_t *actor); -void A_SetTargetsTarget(mobj_t *actor); -void A_SetObjectFlags(mobj_t *actor); -void A_SetObjectFlags2(mobj_t *actor); -void A_RandomState(mobj_t *actor); -void A_RandomStateRange(mobj_t *actor); -void A_StateRangeByAngle(mobj_t *actor); -void A_StateRangeByParameter(mobj_t *actor); -void A_DualAction(mobj_t *actor); -void A_RemoteAction(mobj_t *actor); -void A_ToggleFlameJet(mobj_t *actor); -void A_OrbitNights(mobj_t *actor); -void A_GhostMe(mobj_t *actor); -void A_SetObjectState(mobj_t *actor); -void A_SetObjectTypeState(mobj_t *actor); -void A_KnockBack(mobj_t *actor); -void A_PushAway(mobj_t *actor); -void A_RingDrain(mobj_t *actor); -void A_SplitShot(mobj_t *actor); -void A_MissileSplit(mobj_t *actor); -void A_MultiShot(mobj_t *actor); -void A_InstaLoop(mobj_t *actor); -void A_Custom3DRotate(mobj_t *actor); -void A_SearchForPlayers(mobj_t *actor); -void A_CheckRandom(mobj_t *actor); -void A_CheckTargetRings(mobj_t *actor); -void A_CheckRings(mobj_t *actor); -void A_CheckTotalRings(mobj_t *actor); -void A_CheckHealth(mobj_t *actor); -void A_CheckRange(mobj_t *actor); -void A_CheckHeight(mobj_t *actor); -void A_CheckTrueRange(mobj_t *actor); -void A_CheckThingCount(mobj_t *actor); -void A_CheckAmbush(mobj_t *actor); -void A_CheckCustomValue(mobj_t *actor); -void A_CheckCusValMemo(mobj_t *actor); -void A_SetCustomValue(mobj_t *actor); -void A_UseCusValMemo(mobj_t *actor); -void A_RelayCustomValue(mobj_t *actor); -void A_CusValAction(mobj_t *actor); -void A_ForceStop(mobj_t *actor); -void A_ForceWin(mobj_t *actor); -void A_SpikeRetract(mobj_t *actor); -void A_InfoState(mobj_t *actor); -void A_Repeat(mobj_t *actor); -void A_SetScale(mobj_t *actor); -void A_RemoteDamage(mobj_t *actor); -void A_HomingChase(mobj_t *actor); -void A_TrapShot(mobj_t *actor); -void A_Boss1Chase(mobj_t *actor); -void A_Boss2Chase(mobj_t *actor); -void A_Boss2Pogo(mobj_t *actor); -void A_BossJetFume(mobj_t *actor); -void A_VileTarget(mobj_t *actor); -void A_VileAttack(mobj_t *actor); -void A_VileFire(mobj_t *actor); -void A_BrakChase(mobj_t *actor); -void A_BrakFireShot(mobj_t *actor); -void A_BrakLobShot(mobj_t *actor); -void A_NapalmScatter(mobj_t *actor); -void A_SpawnFreshCopy(mobj_t *actor); -void A_FlickySpawn(mobj_t *actor); -void A_FlickyCenter(mobj_t *actor); -void A_FlickyAim(mobj_t *actor); -void A_FlickyFly(mobj_t *actor); -void A_FlickySoar(mobj_t *actor); -void A_FlickyCoast(mobj_t *actor); -void A_FlickyHop(mobj_t *actor); -void A_FlickyFlounder(mobj_t *actor); -void A_FlickyCheck(mobj_t *actor); -void A_FlickyHeightCheck(mobj_t *actor); -void A_FlickyFlutter(mobj_t *actor); -void A_FlameParticle(mobj_t *actor); -void A_FadeOverlay(mobj_t *actor); -void A_Boss5Jump(mobj_t *actor); -void A_LightBeamReset(mobj_t *actor); -void A_MineExplode(mobj_t *actor); -void A_MineRange(mobj_t *actor); -void A_ConnectToGround(mobj_t *actor); -void A_SpawnParticleRelative(mobj_t *actor); -void A_MultiShotDist(mobj_t *actor); -void A_WhoCaresIfYourSonIsABee(mobj_t *actor); -void A_ParentTriesToSleep(mobj_t *actor); -void A_CryingToMomma(mobj_t *actor); -void A_CheckFlags2(mobj_t *actor); -void A_Boss5FindWaypoint(mobj_t *actor); -void A_DoNPCSkid(mobj_t *actor); -void A_DoNPCPain(mobj_t *actor); -void A_PrepareRepeat(mobj_t *actor); -void A_Boss5ExtraRepeat(mobj_t *actor); -void A_Boss5Calm(mobj_t *actor); -void A_Boss5CheckOnGround(mobj_t *actor); -void A_Boss5CheckFalling(mobj_t *actor); -void A_Boss5PinchShot(mobj_t *actor); -void A_Boss5MakeItRain(mobj_t *actor); -void A_Boss5MakeJunk(mobj_t *actor); -void A_LookForBetter(mobj_t *actor); -void A_Boss5BombExplode(mobj_t *actor); -void A_DustDevilThink(mobj_t *actor); -void A_TNTExplode(mobj_t *actor); -void A_DebrisRandom(mobj_t *actor); -void A_TrainCameo(mobj_t *actor); -void A_TrainCameo2(mobj_t *actor); -void A_CanarivoreGas(mobj_t *actor); -void A_KillSegments(mobj_t *actor); -void A_SnapperSpawn(mobj_t *actor); -void A_SnapperThinker(mobj_t *actor); -void A_SaloonDoorSpawn(mobj_t *actor); -void A_MinecartSparkThink(mobj_t *actor); -void A_ModuloToState(mobj_t *actor); -void A_LavafallRocks(mobj_t *actor); -void A_LavafallLava(mobj_t *actor); -void A_FallingLavaCheck(mobj_t *actor); -void A_FireShrink(mobj_t *actor); -void A_SpawnPterabytes(mobj_t *actor); -void A_PterabyteHover(mobj_t *actor); -void A_RolloutSpawn(mobj_t *actor); -void A_RolloutRock(mobj_t *actor); -void A_DragonbomberSpawn(mobj_t *actor); -void A_DragonWing(mobj_t *actor); -void A_DragonSegment(mobj_t *actor); -void A_ChangeHeight(mobj_t *actor); - //for p_enemy.c // From 1718361123c75b65df59457a208a4efcc4888c5f Mon Sep 17 00:00:00 2001 From: Hanicef Date: Fri, 7 Jun 2024 12:40:23 +0200 Subject: [PATCH 060/139] Fix segfault when setting forceskin to None --- src/command.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/command.c b/src/command.c index 7947048ed..e0156274e 100644 --- a/src/command.c +++ b/src/command.c @@ -2065,11 +2065,10 @@ static void CV_SetValueMaybeStealth(consvar_t *var, INT32 value, boolean stealth if (var == &cv_forceskin) // Special handling. { const char *tmpskin = NULL; - if ((value < 0) || (value >= numskins)) - ; - else + if (value >= 0 && value < numskins) tmpskin = skins[value]->name; - memcpy(val, tmpskin, SKINNAMESIZE); + if (tmpskin) + memcpy(val, tmpskin, SKINNAMESIZE); } else sprintf(val, "%d", value); From 5f7389142e4cd4005f0f1bbe0704a8969dc8f73f Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Fri, 7 Jun 2024 19:08:22 -0300 Subject: [PATCH 061/139] Interpolate renderer-specific slope vectors --- src/m_vector.c | 26 ++++++++++++++++++++++++++ src/m_vector.h | 4 ++++ src/r_fps.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- src/r_fps.h | 3 +++ 4 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/m_vector.c b/src/m_vector.c index 3132a869d..1b04f8ae1 100644 --- a/src/m_vector.c +++ b/src/m_vector.c @@ -21,6 +21,32 @@ void DVector3_Load(dvector3_t *vec, double x, double y, double z) vec->z = z; } +void DVector3_Copy(dvector3_t *a_o, const dvector3_t *a_i) +{ + memcpy(a_o, a_i, sizeof(dvector3_t)); +} + +void DVector3_Add(const dvector3_t *a_i, const dvector3_t *a_c, dvector3_t *a_o) +{ + a_o->x = a_i->x + a_c->x; + a_o->y = a_i->y + a_c->y; + a_o->z = a_i->z + a_c->z; +} + +void DVector3_Subtract(const dvector3_t *a_i, const dvector3_t *a_c, dvector3_t *a_o) +{ + a_o->x = a_i->x - a_c->x; + a_o->y = a_i->y - a_c->y; + a_o->z = a_i->z - a_c->z; +} + +void DVector3_Multiply(const dvector3_t *a_i, double a_c, dvector3_t *a_o) +{ + a_o->x = a_i->x * a_c; + a_o->y = a_i->y * a_c; + a_o->z = a_i->z * a_c; +} + double DVector3_Magnitude(const dvector3_t *a_normal) { double xs = a_normal->x * a_normal->x; diff --git a/src/m_vector.h b/src/m_vector.h index 55669be03..1395744f2 100644 --- a/src/m_vector.h +++ b/src/m_vector.h @@ -19,6 +19,10 @@ typedef struct } dvector3_t; void DVector3_Load(dvector3_t *vec, double x, double y, double z); +void DVector3_Copy(dvector3_t *a_o, const dvector3_t *a_i); +void DVector3_Add(const dvector3_t *a_i, const dvector3_t *a_c, dvector3_t *a_o); +void DVector3_Subtract(const dvector3_t *a_i, const dvector3_t *a_c, dvector3_t *a_o); +void DVector3_Multiply(const dvector3_t *a_i, double a_c, dvector3_t *a_o); double DVector3_Magnitude(const dvector3_t *a_normal); double DVector3_Normalize(dvector3_t *a_normal); void DVector3_Negate(dvector3_t *a_o); diff --git a/src/r_fps.c b/src/r_fps.c index 0773f228d..7f1f2bb30 100644 --- a/src/r_fps.c +++ b/src/r_fps.c @@ -120,6 +120,19 @@ static vector3_t *R_LerpVector3(const vector3_t *from, const vector3_t *to, fixe return out; } +static double R_LerpDouble(double from, double to, double frac) +{ + return from + (frac * (to - from)); +} + +static dvector3_t *R_LerpDVector3(const dvector3_t *from, const dvector3_t *to, double frac, dvector3_t *out) +{ + DVector3_Subtract(to, from, out); + DVector3_Multiply(out, frac, out); + DVector3_Add(from, out, out); + return out; +} + // recalc necessary stuff for mouseaiming // slopes are already calculated for the full possible view (which is 4*viewheight). // 18/08/18: (No it's actually 16*viewheight, thanks Jimita for finding this out) @@ -497,6 +510,14 @@ void R_CreateInterpolator_DynSlope(thinker_t *thinker, pslope_t *slope) FV2_Copy(&interp->dynslope.bakd, &slope->d); interp->dynslope.oldzdelta = interp->dynslope.bakzdelta = slope->zdelta; + + DVector3_Copy(&interp->dynslope.oldorigin, &slope->dorigin); + DVector3_Copy(&interp->dynslope.bakorigin, &slope->dorigin); + + DVector3_Copy(&interp->dynslope.oldnormdir, &slope->dnormdir); + DVector3_Copy(&interp->dynslope.baknormdir, &slope->dnormdir); + + interp->dynslope.olddzdelta = interp->dynslope.bakdzdelta = slope->dzdelta; } void R_InitializeLevelInterpolators(void) @@ -561,6 +582,21 @@ static void UpdateLevelInterpolatorState(levelinterpolator_t *interp) FV3_Copy(&interp->dynslope.bako, &interp->dynslope.slope->o); FV2_Copy(&interp->dynslope.bakd, &interp->dynslope.slope->d); interp->dynslope.bakzdelta = interp->dynslope.slope->zdelta; + + DVector3_Copy(&interp->dynslope.oldorigin, &interp->dynslope.bakorigin); + DVector3_Copy(&interp->dynslope.oldnormdir, &interp->dynslope.baknormdir); + interp->dynslope.olddzdelta = interp->dynslope.bakdzdelta; + + if (interp->dynslope.slope->moved) + { + P_CalculateSlopeVectors(interp->dynslope.slope); + + interp->dynslope.slope->moved = false; + } + + DVector3_Copy(&interp->dynslope.bakorigin, &interp->dynslope.slope->dorigin); + DVector3_Copy(&interp->dynslope.baknormdir, &interp->dynslope.slope->dnormdir); + interp->dynslope.bakdzdelta = interp->dynslope.slope->dzdelta; break; } } @@ -646,7 +682,13 @@ void R_ApplyLevelInterpolators(fixed_t frac) R_LerpVector3(&interp->dynslope.oldo, &interp->dynslope.bako, frac, &interp->dynslope.slope->o); R_LerpVector2(&interp->dynslope.oldd, &interp->dynslope.bakd, frac, &interp->dynslope.slope->d); interp->dynslope.slope->zdelta = R_LerpFixed(interp->dynslope.oldzdelta, interp->dynslope.bakzdelta, frac); - interp->dynslope.slope->moved = true; + if (rendermode == render_soft) + { + double dfrac = FixedToDouble(frac); + R_LerpDVector3(&interp->dynslope.oldorigin, &interp->dynslope.bakorigin, dfrac, &interp->dynslope.slope->dorigin); + R_LerpDVector3(&interp->dynslope.oldnormdir, &interp->dynslope.baknormdir, dfrac, &interp->dynslope.slope->dnormdir); + interp->dynslope.slope->dzdelta = R_LerpDouble(interp->dynslope.olddzdelta, interp->dynslope.bakdzdelta, dfrac); + } break; } } @@ -704,6 +746,10 @@ void R_RestoreLevelInterpolators(void) FV3_Copy(&interp->dynslope.slope->o, &interp->dynslope.bako); FV2_Copy(&interp->dynslope.slope->d, &interp->dynslope.bakd); interp->dynslope.slope->zdelta = interp->dynslope.bakzdelta; + + DVector3_Copy(&interp->dynslope.slope->dorigin, &interp->dynslope.bakorigin); + DVector3_Copy(&interp->dynslope.slope->dnormdir, &interp->dynslope.baknormdir); + interp->dynslope.slope->dzdelta = interp->dynslope.bakdzdelta; break; } } diff --git a/src/r_fps.h b/src/r_fps.h index cd40b0a9a..33224a83a 100644 --- a/src/r_fps.h +++ b/src/r_fps.h @@ -115,6 +115,9 @@ typedef struct levelinterpolator_s { vector3_t oldo, bako; vector2_t oldd, bakd; fixed_t oldzdelta, bakzdelta; + dvector3_t oldorigin, bakorigin; + dvector3_t oldnormdir, baknormdir; + double olddzdelta, bakdzdelta; } dynslope; }; } levelinterpolator_t; From cae93e310825a1b61ca32ed5a6e146c00ad36a66 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sat, 8 Jun 2024 13:25:28 +0200 Subject: [PATCH 062/139] Fix crash if a packet fails to reach the client --- src/netcode/i_tcp.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/netcode/i_tcp.c b/src/netcode/i_tcp.c index 6a50f440b..b9247834a 100644 --- a/src/netcode/i_tcp.c +++ b/src/netcode/i_tcp.c @@ -87,6 +87,10 @@ #undef EHOSTUNREACH #endif #define EHOSTUNREACH WSAEHOSTUNREACH + #ifdef ENETUNREACH + #undef ENETUNREACH + #endif + #define ENETUNREACH WSAENETUNREACH #ifndef IOC_VENDOR #define IOC_VENDOR 0x18000000 #endif @@ -681,7 +685,6 @@ static inline ssize_t SOCK_SendToAddr(SOCKET_TYPE socket, mysockaddr_t *sockaddr socklen_t d6 = (socklen_t)sizeof(struct sockaddr_in6); #endif socklen_t d, da = (socklen_t)sizeof(mysockaddr_t); - ssize_t status; switch (sockaddr->any.sa_family) { @@ -692,14 +695,11 @@ static inline ssize_t SOCK_SendToAddr(SOCKET_TYPE socket, mysockaddr_t *sockaddr default: d = da; break; } - status = sendto(socket, (char *)&doomcom->data, doomcom->datalength, 0, &sockaddr->any, d); - if (status == -1) - { - CONS_Alert(CONS_WARNING, "Unable to send packet to %s: %s\n", SOCK_AddrToStr(sockaddr), strerror(errno)); - } - return status; + return sendto(socket, (char *)&doomcom->data, doomcom->datalength, 0, &sockaddr->any, d); } +#define ALLOWEDERROR(x) ((x) == ECONNREFUSED || (x) == EWOULDBLOCK || (x) == EHOSTUNREACH || (x) == ENETUNREACH) + static void SOCK_Send(void) { ssize_t c = ERRSOCKET; @@ -714,19 +714,25 @@ static void SOCK_Send(void) for (size_t j = 0; j < broadcastaddresses; j++) { if (myfamily[i] == broadcastaddress[j].any.sa_family) - SOCK_SendToAddr(mysockets[i], &broadcastaddress[j]); + { + c = SOCK_SendToAddr(mysockets[i], &broadcastaddress[j]); + if (c == ERRSOCKET && !ALLOWEDERROR(errno)) + break; + } } } - return; } else if (nodesocket[doomcom->remotenode] == (SOCKET_TYPE)ERRSOCKET) { for (size_t i = 0; i < mysocketses; i++) { if (myfamily[i] == clientaddress[doomcom->remotenode].any.sa_family) - SOCK_SendToAddr(mysockets[i], &clientaddress[doomcom->remotenode]); + { + c = SOCK_SendToAddr(mysockets[i], &clientaddress[doomcom->remotenode]); + if (c == ERRSOCKET && !ALLOWEDERROR(errno)) + break; + } } - return; } else { @@ -736,12 +742,14 @@ static void SOCK_Send(void) if (c == ERRSOCKET) { int e = errno; // save error code so it can't be modified later - if (e != ECONNREFUSED && e != EWOULDBLOCK && e != EHOSTUNREACH) + if (!ALLOWEDERROR(e)) I_Error("SOCK_Send, error sending to node %d (%s) #%u: %s", doomcom->remotenode, SOCK_GetNodeAddress(doomcom->remotenode), e, strerror(e)); } } +#undef ALLOWEDERROR + static void SOCK_FreeNodenum(INT32 numnode) { // can't disconnect from self :) From 650f7a52a7796c485082eba7d21585daf46efb57 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Sun, 9 Jun 2024 01:54:02 -0300 Subject: [PATCH 063/139] Check if snake minigame is active before mapping joystick events --- src/snake.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/snake.c b/src/snake.c index 2349d5fdb..4219d5b8f 100644 --- a/src/snake.c +++ b/src/snake.c @@ -582,7 +582,7 @@ boolean Snake_JoyGrabber(void *opaque, event_t *ev) { snake_t *snake = opaque; - if (ev->type == ev_joystick && ev->key == 0) + if (snake != NULL && ev->type == ev_joystick && ev->key == 0) { snake->joyevents[snake->joyeventcount] = ev; snake->joyeventcount++; From 60eb9fdb447439d74b4bd6ff1e00833c40aab7a8 Mon Sep 17 00:00:00 2001 From: Blur Date: Sun, 9 Jun 2024 16:33:24 -0500 Subject: [PATCH 064/139] Prevent bots from taking slot 0 with lua. --- src/lua_baselib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 6d2c8661e..304c866c9 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -3878,7 +3878,7 @@ static int lib_gAddPlayer(lua_State *L) player_t *newplayer; SINT8 skinnum = 0, bot; - for (i = 0; i < MAXPLAYERS; i++) + for (i = 1; i < MAXPLAYERS; i++) { if (!playeringame[i]) break; From 28dfe91b4f778a92eaed8314150e720ec297334a Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 12 Jun 2024 14:25:45 +0200 Subject: [PATCH 065/139] Per-wall lighting --- src/hardware/hw_main.c | 39 ++++++++++++++++++++----- src/lua_maplib.c | 64 ++++++++++++++++++++++++++++++++++++++++++ src/p_saveg.c | 24 +++++++++++++++- src/p_setup.c | 12 ++++++++ src/r_defs.h | 5 ++++ src/r_segs.c | 45 +++++++++++++++++++++-------- 6 files changed, 170 insertions(+), 19 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 831c8d7c4..3abcef4a3 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -309,6 +309,30 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, angle_t dir, fixed_t delta) return (FUINT)finallight; } +static FUINT HWR_SideLightLevel(side_t *side, UINT8 base_lightlevel) +{ + return side->light + + ((side->lightabsolute) ? 0 : base_lightlevel); +} + +static FUINT HWR_TopLightLevel(side_t *side, UINT8 base_lightlevel) +{ + return side->light_top + + ((side->lightabsolute_top) ? 0 : HWR_SideLightLevel(side, base_lightlevel)); +} + +static FUINT HWR_MidLightLevel(side_t *side, UINT8 base_lightlevel) +{ + return side->light_mid + + ((side->lightabsolute_mid) ? 0 : HWR_SideLightLevel(side, base_lightlevel)); +} + +static FUINT HWR_BottomLightLevel(side_t *side, UINT8 base_lightlevel) +{ + return side->light_bottom + + ((side->lightabsolute_bottom) ? 0 : HWR_SideLightLevel(side, base_lightlevel)); +} + // ========================================================================== // FLOOR/CEILING GENERATION FROM SUBSECTORS // ========================================================================== @@ -705,8 +729,9 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, fixed_t v2x = FloatToFixed(wallVerts[1].x); fixed_t v2y = FloatToFixed(wallVerts[1].z); + FUINT lightnum = HWR_SideLightLevel(gl_sidedef, sector->lightlevel); const UINT8 alpha = Surf->PolyColor.s.alpha; - FUINT lightnum = HWR_CalcWallLight(sector->lightlevel, v1x, v1y, v2x, v2y); + lightnum = HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y); extracolormap_t *colormap = NULL; if (!r_renderwalls) @@ -750,13 +775,13 @@ static void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, { if (pfloor && (pfloor->fofflags & FOF_FOG)) { - lightnum = pfloor->master->frontsector->lightlevel; + lightnum = HWR_SideLightLevel(gl_sidedef, pfloor->master->frontsector->lightlevel); colormap = pfloor->master->frontsector->extra_colormap; lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y); } else { - lightnum = *list[i].lightlevel; + lightnum = HWR_SideLightLevel(gl_sidedef, *list[i].lightlevel); colormap = *list[i].extra_colormap; lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, v1x, v1y, v2x, v2y); } @@ -1167,7 +1192,7 @@ static void HWR_ProcessSeg(void) float cliplow = (float)gl_curline->offset; float cliphigh = cliplow + (gl_curline->flength * FRACUNIT); - FUINT lightnum = gl_frontsector->lightlevel; + FUINT lightnum = HWR_SideLightLevel(gl_sidedef, gl_frontsector->lightlevel); extracolormap_t *colormap = gl_frontsector->extra_colormap; lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y); @@ -1628,11 +1653,11 @@ static void HWR_ProcessSeg(void) { blendmode = PF_Fog|PF_NoTexture; - lightnum = rover->master->frontsector->lightlevel; + lightnum = HWR_SideLightLevel(gl_sidedef, rover->master->frontsector->lightlevel); colormap = rover->master->frontsector->extra_colormap; lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y); - Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel, rover->master->frontsector->extra_colormap); + Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(HWR_SideLightLevel(gl_sidedef, rover->master->frontsector->lightlevel), rover->master->frontsector->extra_colormap); if (gl_frontsector->numlights) HWR_SplitWall(gl_frontsector, wallVerts, 0, &Surf, rover->fofflags, rover, blendmode); @@ -1785,7 +1810,7 @@ static void HWR_ProcessSeg(void) { blendmode = PF_Fog|PF_NoTexture; - lightnum = rover->master->frontsector->lightlevel; + lightnum = HWR_SideLightLevel(gl_sidedef, rover->master->frontsector->lightlevel); colormap = rover->master->frontsector->extra_colormap; lightnum = colormap ? lightnum : HWR_CalcWallLight(lightnum, vs.x, vs.y, ve.x, ve.y); diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 6b489f22b..2afebadf4 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -213,6 +213,14 @@ enum side_e { side_sector, side_special, side_repeatcnt, + side_light, + side_light_top, + side_light_mid, + side_light_bottom, + side_lightabsolute, + side_lightabsolute_top, + side_lightabsolute_mid, + side_lightabsolute_bottom, side_text }; @@ -241,6 +249,14 @@ static const char *const side_opt[] = { "sector", "special", "repeatcnt", + "light", + "light_top", + "light_mid", + "light_bottom", + "lightabsolute", + "lightabsolute_top", + "lightabsolute_mid", + "lightabsolute_bottom", "text", NULL}; @@ -1311,6 +1327,30 @@ static int side_get(lua_State *L) case side_repeatcnt: lua_pushinteger(L, side->repeatcnt); return 1; + case side_light: + lua_pushinteger(L, side->light); + return 1; + case side_light_top: + lua_pushinteger(L, side->light_top); + return 1; + case side_light_mid: + lua_pushinteger(L, side->light_mid); + return 1; + case side_light_bottom: + lua_pushinteger(L, side->light_bottom); + return 1; + case side_lightabsolute: + lua_pushboolean(L, side->lightabsolute); + return 1; + case side_lightabsolute_top: + lua_pushboolean(L, side->lightabsolute_top); + return 1; + case side_lightabsolute_mid: + lua_pushboolean(L, side->lightabsolute_mid); + return 1; + case side_lightabsolute_bottom: + lua_pushboolean(L, side->lightabsolute_bottom); + return 1; // TODO: 2.3: Delete case side_text: { @@ -1413,6 +1453,30 @@ static int side_set(lua_State *L) case side_repeatcnt: side->repeatcnt = luaL_checkinteger(L, 3); break; + case side_light: + side->repeatcnt = luaL_checkinteger(L, 3); + break; + case side_light_top: + side->repeatcnt = luaL_checkinteger(L, 3); + break; + case side_light_mid: + side->repeatcnt = luaL_checkinteger(L, 3); + break; + case side_light_bottom: + side->repeatcnt = luaL_checkinteger(L, 3); + break; + case side_lightabsolute: + side->lightabsolute = luaL_checkboolean(L, 3); + break; + case side_lightabsolute_top: + side->lightabsolute_top = luaL_checkboolean(L, 3); + break; + case side_lightabsolute_mid: + side->lightabsolute_mid = luaL_checkboolean(L, 3); + break; + case side_lightabsolute_bottom: + side->lightabsolute_bottom = luaL_checkboolean(L, 3); + break; } return 0; } diff --git a/src/p_saveg.c b/src/p_saveg.c index 5e4d6d076..ab3552673 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -919,7 +919,11 @@ enum LD_SDMIDLIGHT = 1<<19, LD_SDBOTLIGHT = 1<<20, LD_SDREPEATCNT = 1<<21, - LD_SDFLAGS = 1<<22 + LD_SDFLAGS = 1<<22, + LD_SDLIGHTABS = 1<<23, + LD_SDTOPLIGHTABS = 1<<24, + LD_SDMIDLIGHTABS = 1<<25, + LD_SDBOTLIGHTABS = 1<<26 }; static boolean P_AreArgsEqual(const line_t *li, const line_t *spawnli) @@ -1393,6 +1397,16 @@ static UINT32 GetSideDiff(const side_t *si, const side_t *spawnsi) diff |= LD_SDBOTSCALEY; if (si->repeatcnt != spawnsi->repeatcnt) diff |= LD_SDREPEATCNT; + if (si->light != spawnsi->light) + diff |= LD_SDLIGHT; + if (si->light_top != spawnsi->light_top) + diff |= LD_SDTOPLIGHT; + if (si->light_mid != spawnsi->light_mid) + diff |= LD_SDMIDLIGHT; + if (si->light_bottom != spawnsi->light_bottom) + diff |= LD_SDBOTLIGHT; + if (si->lightabsolute != spawnsi->lightabsolute) + diff |= LD_SDLIGHTABS; return diff; } @@ -1436,6 +1450,10 @@ static void ArchiveSide(const side_t *si, UINT32 diff) WRITEFIXED(save_p, si->scaley_bottom); if (diff & LD_SDREPEATCNT) WRITEINT16(save_p, si->repeatcnt); + if (diff & LD_SDLIGHT) + WRITEINT16(save_p, si->light); + if (diff & LD_SDLIGHTABS) + WRITEINT16(save_p, si->lightabsolute); } static void ArchiveLines(void) @@ -1576,6 +1594,10 @@ static void UnArchiveSide(side_t *si) si->scaley_bottom = READFIXED(save_p); if (diff & LD_SDREPEATCNT) si->repeatcnt = READINT16(save_p); + if (diff & LD_SDLIGHT) + si->light = READINT16(save_p); + if (diff & LD_SDLIGHTABS) + si->lightabsolute = READINT16(save_p); } static void UnArchiveLines(void) diff --git a/src/p_setup.c b/src/p_setup.c index e9bd69dc5..8819d11cb 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1367,6 +1367,9 @@ static void P_LoadSidedefs(UINT8 *data) sd->scalex_top = sd->scalex_mid = sd->scalex_bottom = FRACUNIT; sd->scaley_top = sd->scaley_mid = sd->scaley_bottom = FRACUNIT; + sd->light = sd->light_top = sd->light_mid = sd->light_bottom = 0; + sd->lightabsolute = sd->lightabsolute_top = sd->lightabsolute_mid = sd->lightabsolute_bottom = false; + P_SetSidedefSector(i, (UINT16)SHORT(msd->sector)); // Special info stored in texture fields! @@ -1977,6 +1980,10 @@ static void ParseTextmapSidedefParameter(UINT32 i, const char *param, const char P_SetSidedefSector(i, atol(val)); else if (fastcmp(param, "repeatcnt")) sides[i].repeatcnt = atol(val); + else if (fastcmp(param, "light")) + sides[i].light = atol(val); + else if (fastcmp(param, "lightabsolute") && fastcmp("true", val)) + sides[i].lightabsolute = true; } static void ParseTextmapLinedefParameter(UINT32 i, const char *param, const char *val) @@ -2704,6 +2711,10 @@ static void P_WriteTextmap(void) fprintf(f, "texturemiddle = \"%.*s\";\n", 8, textures[wsides[i].midtexture]->name); if (wsides[i].repeatcnt != 0) fprintf(f, "repeatcnt = %d;\n", wsides[i].repeatcnt); + if (wsides[i].light != 0) + fprintf(f, "light = %d;\n", wsides[i].light); + if (wsides[i].lightabsolute != 0) + fprintf(f, "lightabsolute = %d;\n", wsides[i].lightabsolute); fprintf(f, "}\n"); fprintf(f, "\n"); } @@ -3106,6 +3117,7 @@ static void P_LoadTextmap(void) sd->bottomtexture = R_TextureNumForName("-"); sd->sector = NULL; sd->repeatcnt = 0; + sd->light = sd->lightabsolute = 0; TextmapParse(sidedefBlocks.pos[i], i, ParseTextmapSidedefParameter); diff --git a/src/r_defs.h b/src/r_defs.h index 54d43e824..17f94bc1b 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -631,6 +631,11 @@ typedef struct fixed_t scalex_top, scalex_mid, scalex_bottom; fixed_t scaley_top, scaley_mid, scaley_bottom; + // per-wall lighting for UDMF + // TODO: implement per-texture lighting + INT16 light, light_top, light_mid, light_bottom; + boolean lightabsolute, lightabsolute_top, lightabsolute_mid, lightabsolute_bottom; + // Texture indices. // We do not maintain names here. INT32 toptexture, bottomtexture, midtexture; diff --git a/src/r_segs.c b/src/r_segs.c index 75c95aa93..ba6e0cc0d 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -94,6 +94,30 @@ transnum_t R_GetLinedefTransTable(fixed_t alpha) return (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1); } +static INT16 R_SideLightLevel(side_t *side, UINT8 base_lightlevel) +{ + return side->light + + ((side->lightabsolute) ? 0 : base_lightlevel); +} + +static INT16 R_TopLightLevel(side_t *side, UINT8 base_lightlevel) +{ + return side->light_top + + ((side->lightabsolute_top) ? 0 : R_SideLightLevel(side, base_lightlevel)); +} + +static INT16 R_MidLightLevel(side_t *side, UINT8 base_lightlevel) +{ + return side->light_mid + + ((side->lightabsolute_mid) ? 0 : R_SideLightLevel(side, base_lightlevel)); +} + +static INT16 R_BottomLightLevel(side_t *side, UINT8 base_lightlevel) +{ + return side->light_bottom + + ((side->lightabsolute_bottom) ? 0 : R_SideLightLevel(side, base_lightlevel)); +} + void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) { size_t pindex; @@ -223,7 +247,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) if ((colfunc != colfuncs[COLDRAWFUNC_FUZZY]) || (rlight->flags & FOF_FOG) || (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG))) - lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT); + lightnum = R_SideLightLevel(curline->sidedef, rlight->lightlevel) >> LIGHTSEGSHIFT; else lightnum = LIGHTLEVELS - 1; @@ -241,7 +265,7 @@ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) { if ((colfunc != colfuncs[COLDRAWFUNC_FUZZY]) || (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG))) - lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT); + lightnum = R_SideLightLevel(curline->sidedef, frontsector->lightlevel) >> LIGHTSEGSHIFT; else lightnum = LIGHTLEVELS - 1; @@ -697,9 +721,9 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) // Check if the current light effects the colormap/lightlevel if (pfloor->fofflags & FOF_FOG) - rlight->lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT); + rlight->lightnum = R_SideLightLevel(curline->sidedef, pfloor->master->frontsector->lightlevel) >> LIGHTSEGSHIFT; else - rlight->lightnum = (rlight->lightlevel >> LIGHTSEGSHIFT); + rlight->lightnum = R_SideLightLevel(curline->sidedef, rlight->lightlevel) >> LIGHTSEGSHIFT; if (pfloor->fofflags & FOF_FOG || rlight->flags & FOF_FOG || (rlight->extra_colormap && (rlight->extra_colormap->flags & CMF_FOG))) ; @@ -717,18 +741,17 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) { // Get correct light level! if ((frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG))) - lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT); + lightnum = R_SideLightLevel(curline->sidedef, frontsector->lightlevel) >> LIGHTSEGSHIFT; else if (fog) - lightnum = (pfloor->master->frontsector->lightlevel >> LIGHTSEGSHIFT); + lightnum = R_SideLightLevel(curline->sidedef, pfloor->master->frontsector->lightlevel) >> LIGHTSEGSHIFT; else if (fuzzy) lightnum = LIGHTLEVELS-1; else - lightnum = R_FakeFlat(frontsector, &tempsec, &templight, &templight, false) - ->lightlevel >> LIGHTSEGSHIFT; + lightnum = R_SideLightLevel(curline->sidedef, R_FakeFlat(frontsector, &tempsec, &templight, &templight, false)->lightlevel) >> LIGHTSEGSHIFT; if (pfloor->fofflags & FOF_FOG || (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG))); else if (curline->v1->y == curline->v2->y) - lightnum--; + lightnum--; else if (curline->v1->x == curline->v2->x) lightnum++; @@ -1353,7 +1376,7 @@ static void R_RenderSegLoop (void) for (i = 0; i < dc_numlights; i++) { INT32 lightnum; - lightnum = (dc_lightlist[i].lightlevel >> LIGHTSEGSHIFT); + lightnum = R_SideLightLevel(curline->sidedef, dc_lightlist[i].lightlevel) >> LIGHTSEGSHIFT; if (dc_lightlist[i].extra_colormap) ; @@ -2540,7 +2563,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) // use different light tables // for horizontal / vertical / diagonal // OPTIMIZE: get rid of LIGHTSEGSHIFT globally - lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT); + lightnum = R_SideLightLevel(curline->sidedef, frontsector->lightlevel) >> LIGHTSEGSHIFT; if (curline->v1->y == curline->v2->y) lightnum--; From 5302f0ce594e0ba85a5fba2c56ee47c938ebb604 Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 12 Jun 2024 14:32:20 +0200 Subject: [PATCH 066/139] Enable wall brightness in UZB config --- extras/conf/udb/Includes/SRB222_common.cfg | 2 +- extras/conf/udb/Includes/SRB222_misc.cfg | 24 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/extras/conf/udb/Includes/SRB222_common.cfg b/extras/conf/udb/Includes/SRB222_common.cfg index 90c85cdea..e5cafead4 100644 --- a/extras/conf/udb/Includes/SRB222_common.cfg +++ b/extras/conf/udb/Includes/SRB222_common.cfg @@ -115,7 +115,7 @@ mapformat_udmf // Enables setting distinct brightness for floor, ceiling, and walls distinctfloorandceilingbrightness = true; - distinctwallbrightness = false; + distinctwallbrightness = true; // Enables setting distinct brightness for upper, middle, and lower sidedef parts distinctsidedefpartbrightness = false; diff --git a/extras/conf/udb/Includes/SRB222_misc.cfg b/extras/conf/udb/Includes/SRB222_misc.cfg index 37b01d7dd..c37c29ce0 100644 --- a/extras/conf/udb/Includes/SRB222_misc.cfg +++ b/extras/conf/udb/Includes/SRB222_misc.cfg @@ -280,18 +280,18 @@ universalfields default = ""; } - //light - //{ - // type = 0; - // default = 0; - //} - // - //lightabsolute - //{ - // type = 3; - // default = false; - //} - // + light + { + type = 0; + default = 0; + } + + lightabsolute + { + type = 3; + default = false; + } + //light_top //{ // type = 0; From e7dc0506d51279674a221d8e01b51d88be57438e Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 12 Jun 2024 15:38:52 +0200 Subject: [PATCH 067/139] Fix tedious mistakes, comment out unused functions --- src/hardware/hw_main.c | 2 ++ src/lua_maplib.c | 8 ++++---- src/p_saveg.c | 34 ++++++++++++++++++++++++++++++++-- src/p_setup.c | 31 ++++++++++++++++++++++++++++--- src/r_segs.c | 2 ++ 5 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 3abcef4a3..4e651891d 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -315,6 +315,7 @@ static FUINT HWR_SideLightLevel(side_t *side, UINT8 base_lightlevel) ((side->lightabsolute) ? 0 : base_lightlevel); } +/* TODO: implement per-texture lighting static FUINT HWR_TopLightLevel(side_t *side, UINT8 base_lightlevel) { return side->light_top + @@ -332,6 +333,7 @@ static FUINT HWR_BottomLightLevel(side_t *side, UINT8 base_lightlevel) return side->light_bottom + ((side->lightabsolute_bottom) ? 0 : HWR_SideLightLevel(side, base_lightlevel)); } +*/ // ========================================================================== // FLOOR/CEILING GENERATION FROM SUBSECTORS diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 2afebadf4..9985e5631 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1454,16 +1454,16 @@ static int side_set(lua_State *L) side->repeatcnt = luaL_checkinteger(L, 3); break; case side_light: - side->repeatcnt = luaL_checkinteger(L, 3); + side->light = luaL_checkinteger(L, 3); break; case side_light_top: - side->repeatcnt = luaL_checkinteger(L, 3); + side->light_top = luaL_checkinteger(L, 3); break; case side_light_mid: - side->repeatcnt = luaL_checkinteger(L, 3); + side->light_mid = luaL_checkinteger(L, 3); break; case side_light_bottom: - side->repeatcnt = luaL_checkinteger(L, 3); + side->light_bottom = luaL_checkinteger(L, 3); break; case side_lightabsolute: side->lightabsolute = luaL_checkboolean(L, 3); diff --git a/src/p_saveg.c b/src/p_saveg.c index ab3552673..8e511e350 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1407,6 +1407,12 @@ static UINT32 GetSideDiff(const side_t *si, const side_t *spawnsi) diff |= LD_SDBOTLIGHT; if (si->lightabsolute != spawnsi->lightabsolute) diff |= LD_SDLIGHTABS; + if (si->lightabsolute_top != spawnsi->lightabsolute_top) + diff |= LD_SDTOPLIGHTABS; + if (si->lightabsolute_mid != spawnsi->lightabsolute_mid) + diff |= LD_SDMIDLIGHTABS; + if (si->lightabsolute_bottom != spawnsi->lightabsolute_bottom) + diff |= LD_SDBOTLIGHTABS; return diff; } @@ -1452,8 +1458,20 @@ static void ArchiveSide(const side_t *si, UINT32 diff) WRITEINT16(save_p, si->repeatcnt); if (diff & LD_SDLIGHT) WRITEINT16(save_p, si->light); + if (diff & LD_SDTOPLIGHT) + WRITEINT16(save_p, si->light_top); + if (diff & LD_SDMIDLIGHT) + WRITEINT16(save_p, si->light_mid); + if (diff & LD_SDBOTLIGHT) + WRITEINT16(save_p, si->light_bottom); if (diff & LD_SDLIGHTABS) - WRITEINT16(save_p, si->lightabsolute); + WRITEUINT8(save_p, si->lightabsolute); + if (diff & LD_SDTOPLIGHTABS) + WRITEUINT8(save_p, si->lightabsolute_top); + if (diff & LD_SDMIDLIGHTABS) + WRITEUINT8(save_p, si->lightabsolute_mid); + if (diff & LD_SDBOTLIGHTABS) + WRITEUINT8(save_p, si->lightabsolute_bottom); } static void ArchiveLines(void) @@ -1596,8 +1614,20 @@ static void UnArchiveSide(side_t *si) si->repeatcnt = READINT16(save_p); if (diff & LD_SDLIGHT) si->light = READINT16(save_p); + if (diff & LD_SDTOPLIGHT) + si->light_top = READINT16(save_p); + if (diff & LD_SDMIDLIGHT) + si->light_mid = READINT16(save_p); + if (diff & LD_SDBOTLIGHT) + si->light_bottom = READINT16(save_p); if (diff & LD_SDLIGHTABS) - si->lightabsolute = READINT16(save_p); + si->lightabsolute = READUINT8(save_p); + if (diff & LD_SDTOPLIGHTABS) + si->lightabsolute_top = READUINT8(save_p); + if (diff & LD_SDMIDLIGHTABS) + si->lightabsolute_mid = READUINT8(save_p); + if (diff & LD_SDBOTLIGHTABS) + si->lightabsolute_bottom = READUINT8(save_p); } static void UnArchiveLines(void) diff --git a/src/p_setup.c b/src/p_setup.c index 8819d11cb..b5ed485d8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1982,8 +1982,20 @@ static void ParseTextmapSidedefParameter(UINT32 i, const char *param, const char sides[i].repeatcnt = atol(val); else if (fastcmp(param, "light")) sides[i].light = atol(val); + else if (fastcmp(param, "light_top")) + sides[i].light_top = atol(val); + else if (fastcmp(param, "light_mid")) + sides[i].light_mid = atol(val); + else if (fastcmp(param, "light_bottom")) + sides[i].light_bottom = atol(val); else if (fastcmp(param, "lightabsolute") && fastcmp("true", val)) sides[i].lightabsolute = true; + else if (fastcmp(param, "lightabsolute_top") && fastcmp("true", val)) + sides[i].lightabsolute_top = true; + else if (fastcmp(param, "lightabsolute_mid") && fastcmp("true", val)) + sides[i].lightabsolute_mid = true; + else if (fastcmp(param, "lightabsolute_bottom") && fastcmp("true", val)) + sides[i].lightabsolute_bottom = true; } static void ParseTextmapLinedefParameter(UINT32 i, const char *param, const char *val) @@ -2713,8 +2725,20 @@ static void P_WriteTextmap(void) fprintf(f, "repeatcnt = %d;\n", wsides[i].repeatcnt); if (wsides[i].light != 0) fprintf(f, "light = %d;\n", wsides[i].light); - if (wsides[i].lightabsolute != 0) - fprintf(f, "lightabsolute = %d;\n", wsides[i].lightabsolute); + if (wsides[i].light_top != 0) + fprintf(f, "light_top = %d;\n", wsides[i].light_top); + if (wsides[i].light_mid != 0) + fprintf(f, "light_mid = %d;\n", wsides[i].light_mid); + if (wsides[i].light_bottom != 0) + fprintf(f, "light_bottom = %d;\n", wsides[i].light_bottom); + if (wsides[i].lightabsolute) + fprintf(f, "lightabsolute = true;\n"); + if (wsides[i].lightabsolute_top) + fprintf(f, "lightabsolute_top = true;\n"); + if (wsides[i].lightabsolute_mid) + fprintf(f, "lightabsolute_mid = true;\n"); + if (wsides[i].lightabsolute_bottom) + fprintf(f, "lightabsolute_bottom = true;\n"); fprintf(f, "}\n"); fprintf(f, "\n"); } @@ -3117,7 +3141,8 @@ static void P_LoadTextmap(void) sd->bottomtexture = R_TextureNumForName("-"); sd->sector = NULL; sd->repeatcnt = 0; - sd->light = sd->lightabsolute = 0; + sd->light = sd->light_top = sd->light_mid = sd->light_bottom = 0; + sd->lightabsolute = sd->lightabsolute_top = sd->lightabsolute_mid = sd->lightabsolute_bottom = false; TextmapParse(sidedefBlocks.pos[i], i, ParseTextmapSidedefParameter); diff --git a/src/r_segs.c b/src/r_segs.c index ba6e0cc0d..51487d242 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -100,6 +100,7 @@ static INT16 R_SideLightLevel(side_t *side, UINT8 base_lightlevel) ((side->lightabsolute) ? 0 : base_lightlevel); } +/* TODO: implement per-texture lighting static INT16 R_TopLightLevel(side_t *side, UINT8 base_lightlevel) { return side->light_top + @@ -117,6 +118,7 @@ static INT16 R_BottomLightLevel(side_t *side, UINT8 base_lightlevel) return side->light_bottom + ((side->lightabsolute_bottom) ? 0 : R_SideLightLevel(side, base_lightlevel)); } +*/ void R_RenderMaskedSegRange(drawseg_t *ds, INT32 x1, INT32 x2) { From 616e90e87658d386f65ef1d77d34b3ceaf417b51 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sun, 16 Jun 2024 14:34:22 +0200 Subject: [PATCH 068/139] Allow passing player names to moderation commands --- src/netcode/d_netcmd.c | 44 ++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/netcode/d_netcmd.c b/src/netcode/d_netcmd.c index f7b98c4db..5b077817f 100644 --- a/src/netcode/d_netcmd.c +++ b/src/netcode/d_netcmd.c @@ -2510,11 +2510,11 @@ static void MutePlayer(boolean mute) if (COM_Argc() < 2) { - CONS_Printf(M_GetText("muteplayer : mute a player\n")); + CONS_Printf(M_GetText("muteplayer : mute a player\n")); return; } - data[0] = atoi(COM_Argv(1)); + data[0] = nametonum(COM_Argv(1)); if (data[0] >= MAXPLAYERS || !playeringame[data[0]]) { CONS_Alert(CONS_NOTICE, M_GetText("There is no player %u!\n"), (unsigned int)data[0]); @@ -2603,11 +2603,11 @@ static void Command_ServerTeamChange_f(void) if (COM_Argc() < 3) { if (G_TagGametype()) - CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "it, notit, playing, or spectator"); + CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "it, notit, playing, or spectator"); else if (G_GametypeHasTeams()) - CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "red, blue or spectator"); + CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "red, blue or spectator"); else if (G_GametypeHasSpectators()) - CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "spectator or playing"); + CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "spectator or playing"); else CONS_Alert(CONS_NOTICE, M_GetText("This command cannot be used in this gametype.\n")); return; @@ -2655,19 +2655,19 @@ static void Command_ServerTeamChange_f(void) if (error) { if (G_TagGametype()) - CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "it, notit, playing, or spectator"); + CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "it, notit, playing, or spectator"); else if (G_GametypeHasTeams()) - CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "red, blue or spectator"); + CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "red, blue or spectator"); else if (G_GametypeHasSpectators()) - CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "spectator or playing"); + CONS_Printf(M_GetText("serverchangeteam : switch player to a new team (%s)\n"), "spectator or playing"); return; } - NetPacket.packet.playernum = atoi(COM_Argv(1)); + NetPacket.packet.playernum = nametonum(COM_Argv(1)); - if (!playeringame[NetPacket.packet.playernum]) + if (NetPacket.packet.playernum == -1 || !playeringame[NetPacket.packet.playernum]) { - CONS_Alert(CONS_NOTICE, M_GetText("There is no player %d!\n"), NetPacket.packet.playernum); + CONS_Alert(CONS_NOTICE, M_GetText("There is no player %s!\n"), COM_Argv(1)); return; } @@ -3106,13 +3106,16 @@ static void Command_Verify_f(void) if (COM_Argc() != 2) { - CONS_Printf(M_GetText("promote : give admin privileges to a player\n")); + CONS_Printf(M_GetText("promote : give admin privileges to a player\n")); return; } - strlcpy(buf, COM_Argv(1), sizeof (buf)); - - playernum = atoi(buf); + playernum = nametonum(COM_Argv(1)); + if (playernum == -1) + { + CONS_Alert(CONS_NOTICE, M_GetText("There is no player %s!\n"), COM_Argv(1)); + return; + } temp = buf; @@ -3156,13 +3159,16 @@ static void Command_RemoveAdmin_f(void) if (COM_Argc() != 2) { - CONS_Printf(M_GetText("demote : remove admin privileges from a player\n")); + CONS_Printf(M_GetText("demote : remove admin privileges from a player\n")); return; } - strlcpy(buf, COM_Argv(1), sizeof(buf)); - - playernum = atoi(buf); + playernum = nametonum(COM_Argv(1)); + if (playernum == -1) + { + CONS_Alert(CONS_NOTICE, M_GetText("There is no player %s!\n"), COM_Argv(1)); + return; + } temp = buf; From 926487eb8f58e14807b7e25cf7d13e09365101a1 Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 19 Jun 2024 10:22:26 +0200 Subject: [PATCH 069/139] Add light and lightabsolute to UDMF specification --- doc/specs/udmf_srb2.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/specs/udmf_srb2.txt b/doc/specs/udmf_srb2.txt index d6d71a0d5..eaa3a8a97 100644 --- a/doc/specs/udmf_srb2.txt +++ b/doc/specs/udmf_srb2.txt @@ -1,5 +1,5 @@ =============================================================================== -Universal Doom Map Format Sonic Robo Blast 2 extensions v1.0 19.02.2024 +Universal Doom Map Format Sonic Robo Blast 2 extensions v1.0 19.06.2024 Copyright (c) 2024 Sonic Team Junior uses Universal Doom Map Format Specification v1.1 as a template, @@ -143,6 +143,9 @@ Sonic Robo Blast 2 defines the following standardized fields: offsetx_bottom = ; // X offset for lower texture. Default = 0.0. offsety_bottom = ; // Y offset for lower texture. Default = 0.0. + light = ; // Light level, relative to 'sector' light level. Default = 0. + lightabsolute = ; // true = 'light' is an absolute value, ignoring 'sector' light level. + comment = ; // A comment. Implementors should attach no special // semantic meaning to this field. } From 4f33b71ef1992b3e5f2261103a74a21a184ba096 Mon Sep 17 00:00:00 2001 From: spherallic Date: Mon, 24 Jun 2024 21:48:36 +0200 Subject: [PATCH 070/139] Fix FOF side transparency/blending in Software --- src/r_segs.c | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/r_segs.c b/src/r_segs.c index 8e9368baf..303de8880 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1004,25 +1004,21 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor) { dc_iscale = 0xffffffffu / (unsigned)spryscale; - // Skip if texture is multipatch - if (textures[texnum]->transparency) + // Column has a single post and it matches the texture height, use regular column drawers + if (col->num_posts == 1 && col->posts[0].topdelta == 0 && col->posts[0].length == (unsigned)dc_texheight) { - // Column has a single post and it matches the texture height, use regular column drawers - if (col->num_posts == 1 && col->posts[0].topdelta == 0 && col->posts[0].length == (unsigned)dc_texheight) - { - if (fuzzy) - colfunc = colfuncs[COLDRAWFUNC_FUZZY]; - else - colfunc = colfuncs[BASEDRAWFUNC]; - } + if (fuzzy) + colfunc = colfuncs[COLDRAWFUNC_FUZZY]; else - { - // Otherwise use column drawers with extra checks - if (fuzzy) - colfunc = colfuncs[COLDRAWFUNC_CLAMPEDTRANS]; - else - colfunc = colfuncs[COLDRAWFUNC_CLAMPED]; - } + colfunc = colfuncs[BASEDRAWFUNC]; + } + else + { + // Otherwise use column drawers with extra checks + if (fuzzy) + colfunc = colfuncs[COLDRAWFUNC_CLAMPEDTRANS]; + else + colfunc = colfuncs[COLDRAWFUNC_CLAMPED]; } } From d47a95e9ba4cfbd51f8011a99ba25cbee9513093 Mon Sep 17 00:00:00 2001 From: spherallic Date: Mon, 24 Jun 2024 23:51:03 +0200 Subject: [PATCH 071/139] Fix #1230 --- src/p_user.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_user.c b/src/p_user.c index ff7c02bcc..ea68f9443 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -976,6 +976,9 @@ pflags_t P_GetJumpFlags(player_t *player) // boolean P_PlayerInPain(player_t *player) { + if (P_MobjWasRemoved(player->mo)) + return false; + // no silly, sliding isn't pain if (!(player->pflags & PF_SLIDING) && player->mo->state == &states[player->mo->info->painstate] && player->powers[pw_flashing]) return true; From 2eebd4df29f41e2d26eab772b94fbc97fb08678c Mon Sep 17 00:00:00 2001 From: spherallic Date: Mon, 24 Jun 2024 23:51:47 +0200 Subject: [PATCH 072/139] Fix #1146 --- src/m_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index c4fccb372..7d4049df2 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -8610,7 +8610,7 @@ static void M_DrawLoadGameData(void) if (savegameinfo[savetodraw].lives == -42) col = 26; else if (savegameinfo[savetodraw].botskin == 3) // & knuckles - col = 105; + col = 106; else if (savegameinfo[savetodraw].botskin) // tailsbot or custom col = 134; else From e0f666d30bacc1f362857a63fcedf4b3d2ca8aa1 Mon Sep 17 00:00:00 2001 From: Henry3230 <2703436416@qq.com> Date: Mon, 24 Jun 2024 22:28:16 +0000 Subject: [PATCH 073/139] MobjDamage hook tweaks for special stages --- src/p_inter.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/p_inter.c b/src/p_inter.c index e73cd1fce..cbd56183d 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3786,6 +3786,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (player->powers[pw_carry] == CR_NIGHTSMODE) // NiGHTS damage handling { + if (player->powers[pw_flashing]) + return false; if (!force) { if (source == target) @@ -3803,6 +3805,10 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (G_IsSpecialStage(gamemap) && !(damagetype & DMG_DEATHMASK)) { + if (player->powers[pw_flashing]) + return false; + if (LUA_HookMobjDamage(target, inflictor, source, damage, damagetype)) + return true; P_SpecialStageDamage(player, inflictor, source); return true; } From 90195e61052094e9319a16ac06d7656e0f9a75be Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Mon, 20 May 2024 17:55:33 -0400 Subject: [PATCH 074/139] W_GetTexPatchLumpNum uses W_CheckNumForPatchName Absolutely never allow a flat --- src/r_textures.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_textures.c b/src/r_textures.c index 6e01d5641..b61ddb86f 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -1179,7 +1179,7 @@ static lumpnum_t W_GetTexPatchLumpNum(const char *name) if (lump == LUMPERROR) { // Use whatever else you can find. - return W_GetNumForName(name); + return W_CheckNumForPatchName(name); } return lump; From a78b957ceb41be93059a24e9a21b23810d100c7d Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Wed, 22 May 2024 01:32:21 -0400 Subject: [PATCH 075/139] -warp/+map is not a cheat for dedicated servers It already is not a cheat for listen servers. Fixes dedicated servers not being able to save. --- src/d_main.c | 2 +- src/m_cond.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/d_main.c b/src/d_main.c index 3a3a0b26a..bad78c530 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1535,7 +1535,7 @@ void D_SRB2Main(void) I_Error("Cannot find a map remotely named '%s'\n", word); else { - if (!M_CheckParm("-server")) + if (!(M_CheckParm("-server") || dedicated)) G_SetUsedCheats(true); autostart = true; } diff --git a/src/m_cond.c b/src/m_cond.c index 5a5913297..fa6cda223 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -494,6 +494,12 @@ UINT8 M_MapLocked(INT32 mapnum, gamedata_t *data) UINT8 M_CampaignWarpIsCheat(INT32 gt, INT32 mapnum, gamedata_t *data) { + if (dedicated) + { + // See M_MapLocked; don't make dedicated servers annoying. + return false; + } + if (M_MapLocked(mapnum, data) == true) { // Warping to locked maps is definitely always a cheat From cd5a6ddeb417c015046fefc2122a3c9b232392a9 Mon Sep 17 00:00:00 2001 From: sphere Date: Tue, 25 Jun 2024 12:17:40 +0000 Subject: [PATCH 076/139] Revert "Merge branch 'quick-intro' into 'next'" This reverts merge request !2132 --- src/d_main.c | 6 ++---- src/f_finale.c | 12 ++++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index e287d5c38..bad78c530 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -298,8 +298,8 @@ void D_ProcessEvents(void) // added comment : there is a wipe eatch change of the gamestate gamestate_t wipegamestate = GS_LEVEL; // -1: Default; 0-n: Wipe index; INT16_MAX: do not wipe -INT16 wipetypepre = INT16_MAX; -INT16 wipetypepost = INT16_MAX; +INT16 wipetypepre = -1; +INT16 wipetypepost = -1; static void D_Display(void) { @@ -749,8 +749,6 @@ void D_SRB2Loop(void) // hack to start on a nice clear console screen. COM_ImmedExecute("cls;version"); - // hack to prevent white flash upon initial window resize - V_DrawFill(0,0,BASEVIDWIDTH,BASEVIDHEIGHT,31); I_FinishUpdate(); // page flip or blit buffer /* diff --git a/src/f_finale.c b/src/f_finale.c index 5fb901e0d..810af4e82 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -313,7 +313,7 @@ const char *introtext[NUMINTROSCENES]; static tic_t introscenetime[NUMINTROSCENES] = { - 6*TICRATE, // STJr Presents + 5*TICRATE, // STJr Presents 10*TICRATE + (TICRATE/2), // Two months had passed since... 12*TICRATE + ((TICRATE/4) * 3), // As it was about to drain the rings... 12*TICRATE + (TICRATE/4), // What Sonic, Tails, and Knuckles... @@ -623,15 +623,15 @@ void F_IntroDrawer(void) { V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - if (intro_curtime > TICRATE-17 && intro_curtime < 2*TICRATE-22) // Make the text shine! + if (intro_curtime < TICRATE-5) // Make the text shine! { - sprintf(stjrintro, "STJRI%03u", intro_curtime-19); + sprintf(stjrintro, "STJRI%03u", intro_curtime-1); } - else if (intro_curtime >= 2*TICRATE-23 && intro_curtime < 2*TICRATE-3) // Pause on black screen for just a second + else if (intro_curtime >= TICRATE-6 && intro_curtime < 2*TICRATE-20) // Pause on black screen for just a second { return; } - else if (intro_curtime == 2*TICRATE-2) + else if (intro_curtime == 2*TICRATE-19) { // Fade in the text // The text fade out is automatically handled when switching to a new intro scene @@ -950,7 +950,7 @@ void F_IntroTicker(void) if (rendermode != render_none) { - if (intro_scenenum == 0 && intro_curtime == 2*TICRATE-2) + if (intro_scenenum == 0 && intro_curtime == 2*TICRATE-19) { S_ChangeMusicInternal("_stjr", false); From be1a9e3f5dc73de04f1ba8f3608059627b62337a Mon Sep 17 00:00:00 2001 From: spherallic Date: Mon, 24 Jun 2024 14:52:51 +0200 Subject: [PATCH 077/139] Update asset hashes for 2.2.14 --- src/config.h.in | 5 +++-- src/doomdef.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/config.h.in b/src/config.h.in index 6d49a6989..1148cab2c 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -40,9 +40,10 @@ * Last updated 2023 / 05 / 02 - v2.2.11 - patch.pk3 & zones.pk3 * Last updated 2023 / 09 / 06 - v2.2.12 - patch.pk3 * Last updated 2023 / 09 / 09 - v2.2.13 - none + * Last updated 2024 / 06 / 24 - v2.2.14 - main assets */ -#define ASSET_HASH_SRB2_PK3 "ad911f29a28a18968ee5b2d11c2acb39" -#define ASSET_HASH_ZONES_PK3 "1c8adf8d079ecb87d00081f158acf3c7" +#define ASSET_HASH_SRB2_PK3 "9b8cf9510c56d442616086ca65ff93a7" +#define ASSET_HASH_ZONES_PK3 "b7db0245434ca3ad61935ee36403e966" #define ASSET_HASH_PLAYER_DTA "2e7aaae8a6b1b77d90ffe7606ceadb6c" #ifdef USE_PATCH_DTA #define ASSET_HASH_PATCH_PK3 "3c7b73f34af7e9a7bceb2d5260f76172" diff --git a/src/doomdef.h b/src/doomdef.h index 1b0e76314..aeae908da 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -168,7 +168,7 @@ extern char logfilename[1024]; // Does this version require an added patch file? // Comment or uncomment this as necessary. -#define USE_PATCH_DTA +//#define USE_PATCH_DTA // Enforce a limit of loaded WAD files. //#define ENFORCE_WAD_LIMIT From f822fd71341d168ea199d1e8742837fd7d728245 Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 25 Jun 2024 17:23:05 +0200 Subject: [PATCH 078/139] Enable OpenGL palette rendering by default --- src/hardware/hw_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 1ca288932..0e452ca48 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5698,7 +5698,7 @@ consvar_t cv_glbatching = CVAR_INIT ("gr_batching", "On", 0, CV_OnOff, NULL); static CV_PossibleValue_t glpalettedepth_cons_t[] = {{16, "16 bits"}, {24, "24 bits"}, {0, NULL}}; -consvar_t cv_glpaletterendering = CVAR_INIT ("gr_paletterendering", "Off", CV_SAVE|CV_CALL, CV_OnOff, CV_glpaletterendering_OnChange); +consvar_t cv_glpaletterendering = CVAR_INIT ("gr_paletterendering", "On", CV_SAVE|CV_CALL, CV_OnOff, CV_glpaletterendering_OnChange); consvar_t cv_glpalettedepth = CVAR_INIT ("gr_palettedepth", "16 bits", CV_SAVE|CV_CALL, glpalettedepth_cons_t, CV_glpalettedepth_OnChange); #define ONLY_IF_GL_LOADED if (vid.glstate != VID_GL_LIBRARY_LOADED) return; From 6f2d6e6b067b32498dde1cc8a0e23177123f4822 Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 25 Jun 2024 22:29:40 +0200 Subject: [PATCH 079/139] Support floor/ceiling light level on FOF planes --- src/hardware/hw_main.c | 30 ++++++++++++++++++++++-------- src/r_bsp.c | 27 +++++++++++++++++++-------- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 1ca288932..e9f791947 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -335,6 +335,17 @@ static FUINT HWR_BottomLightLevel(side_t *side, UINT8 base_lightlevel) } */ +static UINT8 HWR_FloorLightLevel(sector_t *sector, INT16 base_lightlevel) +{ + return max(0, min(255, sector->floorlightlevel + + ((sector->floorlightabsolute) ? 0 : base_lightlevel))); +} + +static UINT8 HWR_CeilingLightLevel(sector_t *sector, INT16 base_lightlevel) +{ + return max(0, min(255, sector->ceilinglightlevel + + ((sector->ceilinglightabsolute) ? 0 : base_lightlevel))); +} // ========================================================================== // FLOOR/CEILING GENERATION FROM SUBSECTORS // ========================================================================== @@ -2469,6 +2480,9 @@ static void HWR_Subsector(size_t num) rover; rover = rover->next) { fixed_t bottomCullHeight, topCullHeight, centerHeight; + + INT16 floorlight = HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel); + INT16 ceilinglight = HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel); if (!(rover->fofflags & FOF_EXISTS) || !(rover->fofflags & FOF_RENDERPLANES)) continue; @@ -2498,13 +2512,13 @@ static void HWR_Subsector(size_t num) UINT8 alpha; light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false); - alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap); + alpha = HWR_FogBlockAlpha(floorlight, rover->master->frontsector->extra_colormap); HWR_AddTransparentFloor(0, &extrasubsectors[num], false, *rover->bottomheight, - *gl_frontsector->lightlist[light].lightlevel, + floorlight, alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, false, rover->master->frontsector->extra_colormap); } @@ -2516,7 +2530,7 @@ static void HWR_Subsector(size_t num) &extrasubsectors[num], false, *rover->bottomheight, - *gl_frontsector->lightlist[light].lightlevel, + floorlight, max(0, min(rover->alpha, 255)), rover->master->frontsector, HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent), false, rover->fofflags & FOF_SPLAT, *gl_frontsector->lightlist[light].extra_colormap); @@ -2525,7 +2539,7 @@ static void HWR_Subsector(size_t num) { HWR_GetLevelFlat(&levelflats[*rover->bottompic], rover->fofflags & FOF_SPLAT); light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false); - HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, &levelflats[*rover->bottompic], + HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, floorlight, &levelflats[*rover->bottompic], rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap); } } @@ -2543,13 +2557,13 @@ static void HWR_Subsector(size_t num) UINT8 alpha; light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false); - alpha = HWR_FogBlockAlpha(*gl_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap); + alpha = HWR_FogBlockAlpha(ceilinglight, rover->master->frontsector->extra_colormap); HWR_AddTransparentFloor(0, &extrasubsectors[num], true, *rover->topheight, - *gl_frontsector->lightlist[light].lightlevel, + ceilinglight, alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, false, rover->master->frontsector->extra_colormap); } @@ -2561,7 +2575,7 @@ static void HWR_Subsector(size_t num) &extrasubsectors[num], true, *rover->topheight, - *gl_frontsector->lightlist[light].lightlevel, + ceilinglight, max(0, min(rover->alpha, 255)), rover->master->frontsector, HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent), false, rover->fofflags & FOF_SPLAT, *gl_frontsector->lightlist[light].extra_colormap); @@ -2570,7 +2584,7 @@ static void HWR_Subsector(size_t num) { HWR_GetLevelFlat(&levelflats[*rover->toppic], rover->fofflags & FOF_SPLAT); light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false); - HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, *gl_frontsector->lightlist[light].lightlevel, &levelflats[*rover->toppic], + HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, ceilinglight, &levelflats[*rover->toppic], rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap); } } diff --git a/src/r_bsp.c b/src/r_bsp.c index d606d7a27..373a170c9 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -230,6 +230,18 @@ static INT32 R_DoorClosed(void) && (backsector->floorheight <= frontsector->floorheight || curline->sidedef->bottomtexture); } +static UINT8 R_FloorLightLevel(sector_t *sector, INT16 base_lightlevel) +{ + return max(0, min(255, sector->floorlightlevel + + ((sector->floorlightabsolute) ? 0 : base_lightlevel))); +} + +static UINT8 R_CeilingLightLevel(sector_t *sector, INT16 base_lightlevel) +{ + return max(0, min(255, sector->ceilinglightlevel + + ((sector->ceilinglightabsolute) ? 0 : base_lightlevel))); +} + // // If player's view height is underneath fake floor, lower the // drawn ceiling to be just under the floor height, and replace @@ -312,11 +324,11 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel, tempsec->lightlevel = s->lightlevel; if (floorlightlevel) - *floorlightlevel = s->floorlightsec == -1 ? (s->floorlightabsolute ? s->floorlightlevel : max(0, min(255, s->lightlevel + s->floorlightlevel))) + *floorlightlevel = s->floorlightsec == -1 ? (s->floorlightabsolute ? s->floorlightlevel : max(0, min(255, s->lightlevel + s->floorlightlevel))) : sectors[s->floorlightsec].lightlevel; if (ceilinglightlevel) - *ceilinglightlevel = s->ceilinglightsec == -1 ? (s->ceilinglightabsolute ? s->ceilinglightlevel : max(0, min(255, s->lightlevel + s->ceilinglightlevel))) + *ceilinglightlevel = s->ceilinglightsec == -1 ? (s->ceilinglightabsolute ? s->ceilinglightlevel : max(0, min(255, s->lightlevel + s->ceilinglightlevel))) : sectors[s->ceilinglightsec].lightlevel; } else if (heightsec != -1 && viewz >= sectors[heightsec].ceilingheight @@ -356,11 +368,11 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel, tempsec->lightlevel = s->lightlevel; if (floorlightlevel) - *floorlightlevel = s->floorlightsec == -1 ? (s->floorlightabsolute ? s->floorlightlevel : max(0, min(255, s->lightlevel + s->floorlightlevel))) + *floorlightlevel = s->floorlightsec == -1 ? (s->floorlightabsolute ? s->floorlightlevel : max(0, min(255, s->lightlevel + s->floorlightlevel))) : sectors[s->floorlightsec].lightlevel; if (ceilinglightlevel) - *ceilinglightlevel = s->ceilinglightsec == -1 ? (s->ceilinglightabsolute ? s->ceilinglightlevel : max(0, min(255, s->lightlevel + s->ceilinglightlevel))) + *ceilinglightlevel = s->ceilinglightsec == -1 ? (s->ceilinglightabsolute ? s->ceilinglightlevel : max(0, min(255, s->lightlevel + s->ceilinglightlevel))) : sectors[s->ceilinglightsec].lightlevel; } sec = tempsec; @@ -968,11 +980,10 @@ static void R_Subsector(size_t num) && ((viewz < heightcheck && (rover->fofflags & FOF_BOTHPLANES || !(rover->fofflags & FOF_INVERTPLANES))) || (viewz > heightcheck && (rover->fofflags & FOF_BOTHPLANES || rover->fofflags & FOF_INVERTPLANES)))) { - light = R_GetPlaneLight(frontsector, planecenterz, - viewz < heightcheck); + light = R_GetPlaneLight(frontsector, planecenterz, viewz < heightcheck); ffloor[numffloors].plane = R_FindPlane(rover->master->frontsector, *rover->bottomheight, *rover->bottompic, - *frontsector->lightlist[light].lightlevel, *rover->bottomxoffs, *rover->bottomyoffs, + R_FloorLightLevel(rover->master->frontsector, *frontsector->lightlist[light].lightlevel), *rover->bottomxoffs, *rover->bottomyoffs, *rover->bottomxscale, *rover->bottomyscale, *rover->bottomangle, *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->b_slope, NULL); @@ -1002,7 +1013,7 @@ static void R_Subsector(size_t num) light = R_GetPlaneLight(frontsector, planecenterz, viewz < heightcheck); ffloor[numffloors].plane = R_FindPlane(rover->master->frontsector, *rover->topheight, *rover->toppic, - *frontsector->lightlist[light].lightlevel, *rover->topxoffs, *rover->topyoffs, + R_CeilingLightLevel(rover->master->frontsector, *frontsector->lightlist[light].lightlevel), *rover->topxoffs, *rover->topyoffs, *rover->topxscale, *rover->topyscale, *rover->topangle, *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->t_slope, NULL); From 12e5c3b9ce45dea5a823224fe0ecc7a4c2a14c61 Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 26 Jun 2024 13:31:15 +0200 Subject: [PATCH 080/139] Fix incorrect light level usage on overlapping FOFs in OpenGL --- src/hardware/hw_main.c | 29 ++++++++++++++--------------- src/r_bsp.c | 4 ++-- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index e9f791947..0ac0c2e7c 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -335,13 +335,13 @@ static FUINT HWR_BottomLightLevel(side_t *side, UINT8 base_lightlevel) } */ -static UINT8 HWR_FloorLightLevel(sector_t *sector, INT16 base_lightlevel) +static UINT8 HWR_FloorLightLevel(sector_t *sector, UINT8 base_lightlevel) { return max(0, min(255, sector->floorlightlevel + ((sector->floorlightabsolute) ? 0 : base_lightlevel))); } -static UINT8 HWR_CeilingLightLevel(sector_t *sector, INT16 base_lightlevel) +static UINT8 HWR_CeilingLightLevel(sector_t *sector, UINT8 base_lightlevel) { return max(0, min(255, sector->ceilinglightlevel + ((sector->ceilinglightabsolute) ? 0 : base_lightlevel))); @@ -2481,9 +2481,6 @@ static void HWR_Subsector(size_t num) { fixed_t bottomCullHeight, topCullHeight, centerHeight; - INT16 floorlight = HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel); - INT16 ceilinglight = HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel); - if (!(rover->fofflags & FOF_EXISTS) || !(rover->fofflags & FOF_RENDERPLANES)) continue; if (sub->validcount == validcount) @@ -2512,13 +2509,13 @@ static void HWR_Subsector(size_t num) UINT8 alpha; light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false); - alpha = HWR_FogBlockAlpha(floorlight, rover->master->frontsector->extra_colormap); + alpha = HWR_FogBlockAlpha(HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), rover->master->frontsector->extra_colormap); HWR_AddTransparentFloor(0, &extrasubsectors[num], false, *rover->bottomheight, - floorlight, + HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, false, rover->master->frontsector->extra_colormap); } @@ -2530,7 +2527,7 @@ static void HWR_Subsector(size_t num) &extrasubsectors[num], false, *rover->bottomheight, - floorlight, + HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), max(0, min(rover->alpha, 255)), rover->master->frontsector, HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent), false, rover->fofflags & FOF_SPLAT, *gl_frontsector->lightlist[light].extra_colormap); @@ -2539,8 +2536,9 @@ static void HWR_Subsector(size_t num) { HWR_GetLevelFlat(&levelflats[*rover->bottompic], rover->fofflags & FOF_SPLAT); light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < bottomCullHeight ? true : false); - HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, floorlight, &levelflats[*rover->bottompic], - rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap); + HWR_RenderPlane(sub, &extrasubsectors[num], false, *rover->bottomheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, + HWR_FloorLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), + &levelflats[*rover->bottompic], rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap); } } @@ -2557,13 +2555,13 @@ static void HWR_Subsector(size_t num) UINT8 alpha; light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false); - alpha = HWR_FogBlockAlpha(ceilinglight, rover->master->frontsector->extra_colormap); + alpha = HWR_FogBlockAlpha(HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), rover->master->frontsector->extra_colormap); HWR_AddTransparentFloor(0, &extrasubsectors[num], true, *rover->topheight, - ceilinglight, + HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, true, false, rover->master->frontsector->extra_colormap); } @@ -2575,7 +2573,7 @@ static void HWR_Subsector(size_t num) &extrasubsectors[num], true, *rover->topheight, - ceilinglight, + HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), max(0, min(rover->alpha, 255)), rover->master->frontsector, HWR_RippleBlend(gl_frontsector, rover, false) | (rover->blend ? HWR_GetBlendModeFlag(rover->blend) : PF_Translucent), false, rover->fofflags & FOF_SPLAT, *gl_frontsector->lightlist[light].extra_colormap); @@ -2584,8 +2582,9 @@ static void HWR_Subsector(size_t num) { HWR_GetLevelFlat(&levelflats[*rover->toppic], rover->fofflags & FOF_SPLAT); light = R_GetPlaneLight(gl_frontsector, centerHeight, viewz < topCullHeight ? true : false); - HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, ceilinglight, &levelflats[*rover->toppic], - rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap); + HWR_RenderPlane(sub, &extrasubsectors[num], true, *rover->topheight, HWR_RippleBlend(gl_frontsector, rover, false)|PF_Occlude, + HWR_CeilingLightLevel(rover->master->frontsector, *gl_frontsector->lightlist[light].lightlevel), + &levelflats[*rover->toppic], rover->master->frontsector, 255, *gl_frontsector->lightlist[light].extra_colormap); } } } diff --git a/src/r_bsp.c b/src/r_bsp.c index 373a170c9..4b4c81b88 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -230,13 +230,13 @@ static INT32 R_DoorClosed(void) && (backsector->floorheight <= frontsector->floorheight || curline->sidedef->bottomtexture); } -static UINT8 R_FloorLightLevel(sector_t *sector, INT16 base_lightlevel) +static UINT8 R_FloorLightLevel(sector_t *sector, UINT8 base_lightlevel) { return max(0, min(255, sector->floorlightlevel + ((sector->floorlightabsolute) ? 0 : base_lightlevel))); } -static UINT8 R_CeilingLightLevel(sector_t *sector, INT16 base_lightlevel) +static UINT8 R_CeilingLightLevel(sector_t *sector, UINT8 base_lightlevel) { return max(0, min(255, sector->ceilinglightlevel + ((sector->ceilinglightabsolute) ? 0 : base_lightlevel))); From 556ddcaa584565e8dd5a542af8392ecf33f1847c Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 26 Jun 2024 13:47:09 +0200 Subject: [PATCH 081/139] Make OpenGL transparent plane brightness consistent with Software again --- src/hardware/hw_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 0ac0c2e7c..7647084c4 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3946,7 +3946,7 @@ void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boo planeinfo[numplanes].isceiling = isceiling; planeinfo[numplanes].fixedheight = fixedheight; - planeinfo[numplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? 255 : lightlevel; + planeinfo[numplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255; planeinfo[numplanes].levelflat = levelflat; planeinfo[numplanes].xsub = xsub; planeinfo[numplanes].alpha = alpha; @@ -3978,7 +3978,7 @@ void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polyse polyplaneinfo[numpolyplanes].isceiling = isceiling; polyplaneinfo[numpolyplanes].fixedheight = fixedheight; - polyplaneinfo[numpolyplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? 255 : lightlevel; + polyplaneinfo[numpolyplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255; polyplaneinfo[numpolyplanes].levelflat = levelflat; polyplaneinfo[numpolyplanes].polysector = polysector; polyplaneinfo[numpolyplanes].alpha = alpha; From 66b5de4c01b584d75b25394f40e9e2ce0962ef8a Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 26 Jun 2024 16:27:58 +0200 Subject: [PATCH 082/139] Add TODO comments for future changes --- src/hardware/hw_main.c | 4 ++-- src/r_plane.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 7647084c4..c70b6dd01 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3946,7 +3946,7 @@ void HWR_AddTransparentFloor(levelflat_t *levelflat, extrasubsector_t *xsub, boo planeinfo[numplanes].isceiling = isceiling; planeinfo[numplanes].fixedheight = fixedheight; - planeinfo[numplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255; + planeinfo[numplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255; // TODO: 2.3: Make transparent FOF planes always use light level planeinfo[numplanes].levelflat = levelflat; planeinfo[numplanes].xsub = xsub; planeinfo[numplanes].alpha = alpha; @@ -3978,7 +3978,7 @@ void HWR_AddTransparentPolyobjectFloor(levelflat_t *levelflat, polyobj_t *polyse polyplaneinfo[numpolyplanes].isceiling = isceiling; polyplaneinfo[numpolyplanes].fixedheight = fixedheight; - polyplaneinfo[numpolyplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255; + polyplaneinfo[numpolyplanes].lightlevel = (planecolormap && (planecolormap->flags & CMF_FOG)) ? lightlevel : 255; // TODO: 2.3: Make transparent polyobject planes always use light level polyplaneinfo[numpolyplanes].levelflat = levelflat; polyplaneinfo[numpolyplanes].polysector = polysector; polyplaneinfo[numpolyplanes].alpha = alpha; diff --git a/src/r_plane.c b/src/r_plane.c index 33e3aac13..04272f8d3 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -910,7 +910,7 @@ void R_DrawSinglePlane(visplane_t *pl) if (pl->polyobj->translucency == 0 || (pl->extra_colormap && (pl->extra_colormap->flags & CMF_FOG))) light = (pl->lightlevel >> LIGHTSEGSHIFT); - else + else // TODO: 2.3: Make transparent polyobject planes always use light level light = LIGHTLEVELS-1; } else @@ -952,7 +952,7 @@ void R_DrawSinglePlane(visplane_t *pl) if ((spanfunctype == SPANDRAWFUNC_SPLAT) || (pl->extra_colormap && (pl->extra_colormap->flags & CMF_FOG))) light = (pl->lightlevel >> LIGHTSEGSHIFT); - else + else // TODO: 2.3: Make transparent FOF planes use light level instead of always being fullbright light = LIGHTLEVELS-1; } else if (pl->ffloor->fofflags & FOF_FOG) From e4642c278fccb85708455782cc9b3e1abf489025 Mon Sep 17 00:00:00 2001 From: spherallic Date: Wed, 26 Jun 2024 22:14:30 +0200 Subject: [PATCH 083/139] Fix a bug that !2382 introduced --- src/p_saveg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/p_saveg.c b/src/p_saveg.c index 84aaf0e36..da73dd8a0 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3297,6 +3297,8 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->translation = READUINT16(save_p); if (diff2 & MD2_ALPHA) mobj->alpha = READFIXED(save_p); + else + mobj->alpha = FRACUNIT; if (diff & MD_REDFLAG) { From 8ec4bce1bf041b00ae3fbf84ce7d9c686a854090 Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 27 Jun 2024 00:25:56 +0200 Subject: [PATCH 084/139] Rename idlespectate to idleaction for future expansion --- src/netcode/d_clisrv.c | 12 +++++++----- src/netcode/d_clisrv.h | 2 +- src/netcode/d_netcmd.c | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/netcode/d_clisrv.c b/src/netcode/d_clisrv.c index d46e75c3f..03668d0f0 100644 --- a/src/netcode/d_clisrv.c +++ b/src/netcode/d_clisrv.c @@ -113,9 +113,11 @@ consvar_t cv_blamecfail = CVAR_INIT ("blamecfail", "Off", CV_SAVE|CV_NETVAR, CV_ static CV_PossibleValue_t playbackspeed_cons_t[] = {{1, "MIN"}, {10, "MAX"}, {0, NULL}}; consvar_t cv_playbackspeed = CVAR_INIT ("playbackspeed", "1", 0, playbackspeed_cons_t, NULL); -consvar_t cv_idletime = CVAR_INIT ("idletime", "0", CV_SAVE, CV_Unsigned, NULL); -consvar_t cv_idlespectate = CVAR_INIT ("idlespectate", "On", CV_SAVE, CV_OnOff, NULL); -consvar_t cv_dedicatedidletime = CVAR_INIT ("dedicatedidletime", "10", CV_SAVE, CV_Unsigned, NULL); +consvar_t cv_dedicatedidletime = CVAR_INIT ("dedicatedidletime", "10", CV_SAVE|CV_NETVAR, CV_Unsigned, NULL); + +static CV_PossibleValue_t idleaction_cons_t[] = {{1, "Kick"}, {2, "Spectate"}, {0, NULL}}; +consvar_t cv_idleaction = CVAR_INIT ("idleaction", "Spectate", CV_SAVE|CV_NETVAR, idleaction_cons_t, NULL); +consvar_t cv_idletime = CVAR_INIT ("idletime", "3", CV_SAVE|CV_NETVAR, CV_Unsigned, NULL); consvar_t cv_httpsource = CVAR_INIT ("http_source", "", CV_SAVE, NULL, NULL); @@ -1373,7 +1375,7 @@ static void IdleUpdate(void) if (players[i].lastinputtime > (tic_t)cv_idletime.value * TICRATE * 60) { players[i].lastinputtime = 0; - if (cv_idlespectate.value && G_GametypeHasSpectators()) + if (cv_idleaction.value == 2 && G_GametypeHasSpectators()) { changeteam_union NetPacket; UINT16 usvalue; @@ -1384,7 +1386,7 @@ static void IdleUpdate(void) usvalue = SHORT(NetPacket.value.l|NetPacket.value.b); SendNetXCmd(XD_TEAMCHANGE, &usvalue, sizeof(usvalue)); } - else + else if (cv_idleaction.value == 1) { SendKick(i, KICK_MSG_IDLE | KICK_MSG_KEEP_BODY); } diff --git a/src/netcode/d_clisrv.h b/src/netcode/d_clisrv.h index 342173dff..86af61e9e 100644 --- a/src/netcode/d_clisrv.h +++ b/src/netcode/d_clisrv.h @@ -73,7 +73,7 @@ extern UINT32 realpingtable[MAXPLAYERS]; extern UINT32 playerpingtable[MAXPLAYERS]; extern tic_t servermaxping; -extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_idletime, cv_idlespectate, cv_dedicatedidletime; +extern consvar_t cv_netticbuffer, cv_resynchattempts, cv_blamecfail, cv_playbackspeed, cv_idletime, cv_idleaction, cv_dedicatedidletime; extern consvar_t cv_httpsource; // Used in d_net, the only dependence diff --git a/src/netcode/d_netcmd.c b/src/netcode/d_netcmd.c index 4134c633e..b0f872d86 100644 --- a/src/netcode/d_netcmd.c +++ b/src/netcode/d_netcmd.c @@ -620,7 +620,7 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_blamecfail); CV_RegisterVar(&cv_dedicatedidletime); CV_RegisterVar(&cv_idletime); - CV_RegisterVar(&cv_idlespectate); + CV_RegisterVar(&cv_idleaction); CV_RegisterVar(&cv_httpsource); COM_AddCommand("ping", Command_Ping_f, COM_LUA); From 05c97dbd5622cbd0e50c136a4fd8889dcbff10e5 Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 27 Jun 2024 10:48:59 +0200 Subject: [PATCH 085/139] Fix chat word wrapping by reintroducing some old hacks --- src/hu_stuff.c | 65 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 8489e4058..9f1d09d11 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -1218,27 +1218,36 @@ static void HU_drawMiniChat(void) INT32 charwidth = 4, charheight = 6; INT32 boxw = cv_chatwidth.value; INT32 dx = 0, dy = 0; + boolean prev_linereturn = false; if (!chat_nummsg_min) return; // needless to say it's useless to do anything if we don't have anything to draw. for (size_t i = chat_nummsg_min; i > 0; i--) { - char *msg = V_ChatWordWrap(chatx, boxw-charwidth, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i-1]); + char *msg = V_ChatWordWrap(0, boxw-charwidth, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE|V_MONOSPACE, chat_mini[i-1]); for(size_t j = 0; msg[j]; j++) // iterate through msg { if (msg[j] == '\n') // get back down. { - chatheight += charheight; - dx = 0; + if (!prev_linereturn) + { + chatheight += charheight; + dx = 0; + } + prev_linereturn = true; } else if (msg[j] >= FONTSTART) { + prev_linereturn = false; + dx += charwidth; - if (dx >= boxw) + + if (dx >= boxw-charwidth-2) { dx = 0; chatheight += charheight; + prev_linereturn = true; } } } @@ -1250,35 +1259,43 @@ static void HU_drawMiniChat(void) } y = chaty - (chatheight + charheight); + prev_linereturn = false; for (size_t i = 0; i < chat_nummsg_min; i++) // iterate through our hot messages { INT32 timer = ((cv_chattime.value*TICRATE)-chat_timers[i]) - cv_chattime.value*TICRATE+9; // see below... INT32 transflag = (timer >= 0 && timer <= 9) ? (timer*V_10TRANS) : 0; // you can make bad jokes out of this one. - char *msg = V_ChatWordWrap(chatx, boxw-charwidth, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i]); // get the current message, and word wrap it. + char *msg = V_ChatWordWrap(0, boxw-charwidth, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE|V_MONOSPACE, chat_mini[i]); // get the current message, and word wrap it. UINT8 *colormap = NULL; for(size_t j = 0; msg[j]; j++) // iterate through msg { if (msg[j] == '\n') // get back down. { - dy += charheight; - dx = 0; + if (!prev_linereturn) + { + dy += charheight; + dx = 0; + } + prev_linereturn = true; } else if (msg[j] & 0x80) // get colormap colormap = V_GetStringColormap(((msg[j] & 0x7f) << V_CHARCOLORSHIFT) & V_CHARCOLORMASK); else if (msg[j] >= FONTSTART) { + prev_linereturn = false; + if (cv_chatbacktint.value) // on request of wolfy V_DrawFillConsoleMap(x + dx + 2, y+dy, charwidth, charheight, 239|V_SNAPTOBOTTOM|V_SNAPTOLEFT); - V_DrawChatCharacter(x + dx + 2, y+dy, msg[j] |V_SNAPTOBOTTOM|V_SNAPTOLEFT|transflag, true, colormap); - + V_DrawChatCharacter(x + dx + 2, y+dy, msg[j] |V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_MONOSPACE|transflag, true, colormap); dx += charwidth; - if (dx >= boxw) + + if (dx >= boxw-charwidth-2) { dx = 0; dy += charheight; + prev_linereturn = true; } } } @@ -1303,6 +1320,7 @@ static void HU_drawChatLog(INT32 offset) UINT32 i = 0; INT32 chat_topy, chat_bottomy; boolean atbottom = false; + boolean prev_linereturn = false; // make sure that our scroll position isn't "illegal"; if (chat_scroll > chat_maxscroll) @@ -1335,27 +1353,38 @@ static void HU_drawChatLog(INT32 offset) for (i=0; i= FONTSTART) + else { - if ((y+dy+2 >= chat_topy) && (y+dy < (chat_bottomy))) - V_DrawChatCharacter(x + dx + 2, y+dy+2, msg[j] |V_SNAPTOBOTTOM|V_SNAPTOLEFT, true, colormap); + prev_linereturn = false; - dx += charwidth; - if (dx >= boxw-charwidth-2 && i= FONTSTART) + { + if ((y+dy+2 >= chat_topy) && (y+dy < (chat_bottomy))) + V_DrawChatCharacter(x + dx + 2, y+dy+2, msg[j] |V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_MONOSPACE, true, colormap); + + dx += charwidth; + } + + if (dx >= boxw-charwidth-2 && i < chat_nummsg_log) // end of message shouldn't count, nor should invisible characters!!!! { dx = 0; dy += charheight; + prev_linereturn = true; } } } From 8e7cce8b61aa8e3e2b3ec0db101646ef6a8fb9a6 Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 27 Jun 2024 17:16:03 +0200 Subject: [PATCH 086/139] Fix dynamic slope height changes not always being considered as "moved" --- src/p_slopes.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/p_slopes.c b/src/p_slopes.c index c2bacad9e..ce276a672 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -181,8 +181,8 @@ void T_DynamicSlopeLine (dynlineplanethink_t* th) { pslope_t* slope = th->slope; line_t* srcline = th->sourceline; - - fixed_t zdelta; + + fixed_t zdelta, oldoz = slope->o.z; switch(th->type) { case DP_FRONTFLOOR: @@ -209,7 +209,7 @@ void T_DynamicSlopeLine (dynlineplanethink_t* th) return; } - if (slope->zdelta != FixedDiv(zdelta, th->extent)) { + if (slope->zdelta != FixedDiv(zdelta, th->extent) || oldoz != slope->o.z) { slope->zdelta = FixedDiv(zdelta, th->extent); slope->zangle = R_PointToAngle2(0, 0, th->extent, -zdelta); slope->moved = true; From 32bbc48be5c9c0a13ca3a2822c1a68f738640b27 Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 27 Jun 2024 18:51:33 +0200 Subject: [PATCH 087/139] Fix light level issue with walls and FOF planes --- src/hardware/hw_main.c | 28 ++++++++++++++-------------- src/r_bsp.c | 4 ++-- src/r_segs.c | 24 ++++++++++++------------ 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index c70b6dd01..f395a8390 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -309,39 +309,39 @@ static FUINT HWR_CalcSlopeLight(FUINT lightnum, angle_t dir, fixed_t delta) return (FUINT)finallight; } -static FUINT HWR_SideLightLevel(side_t *side, UINT8 base_lightlevel) +static UINT8 HWR_SideLightLevel(side_t *side, INT16 base_lightlevel) { - return side->light + - ((side->lightabsolute) ? 0 : base_lightlevel); + return max(0, min(255, side->light + + ((side->lightabsolute) ? 0 : base_lightlevel))); } /* TODO: implement per-texture lighting -static FUINT HWR_TopLightLevel(side_t *side, UINT8 base_lightlevel) +static UINT8 HWR_TopLightLevel(side_t *side, INT16 base_lightlevel) { - return side->light_top + - ((side->lightabsolute_top) ? 0 : HWR_SideLightLevel(side, base_lightlevel)); + return max(0, min(255, side->light_top + + ((side->lightabsolute_top) ? 0 : HWR_SideLightLevel(side, base_lightlevel)))); } -static FUINT HWR_MidLightLevel(side_t *side, UINT8 base_lightlevel) +static UINT8 HWR_MidLightLevel(side_t *side, INT16 base_lightlevel) { - return side->light_mid + - ((side->lightabsolute_mid) ? 0 : HWR_SideLightLevel(side, base_lightlevel)); + return max(0, min(255, side->light_mid + + ((side->lightabsolute_mid) ? 0 : HWR_SideLightLevel(side, base_lightlevel)))); } -static FUINT HWR_BottomLightLevel(side_t *side, UINT8 base_lightlevel) +static UINT8 HWR_BottomLightLevel(side_t *side, INT16 base_lightlevel) { - return side->light_bottom + - ((side->lightabsolute_bottom) ? 0 : HWR_SideLightLevel(side, base_lightlevel)); + return max(0, min(255, side->light_bottom + + ((side->lightabsolute_bottom) ? 0 : HWR_SideLightLevel(side, base_lightlevel)))); } */ -static UINT8 HWR_FloorLightLevel(sector_t *sector, UINT8 base_lightlevel) +static UINT8 HWR_FloorLightLevel(sector_t *sector, INT16 base_lightlevel) { return max(0, min(255, sector->floorlightlevel + ((sector->floorlightabsolute) ? 0 : base_lightlevel))); } -static UINT8 HWR_CeilingLightLevel(sector_t *sector, UINT8 base_lightlevel) +static UINT8 HWR_CeilingLightLevel(sector_t *sector, INT16 base_lightlevel) { return max(0, min(255, sector->ceilinglightlevel + ((sector->ceilinglightabsolute) ? 0 : base_lightlevel))); diff --git a/src/r_bsp.c b/src/r_bsp.c index 4b4c81b88..373a170c9 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -230,13 +230,13 @@ static INT32 R_DoorClosed(void) && (backsector->floorheight <= frontsector->floorheight || curline->sidedef->bottomtexture); } -static UINT8 R_FloorLightLevel(sector_t *sector, UINT8 base_lightlevel) +static UINT8 R_FloorLightLevel(sector_t *sector, INT16 base_lightlevel) { return max(0, min(255, sector->floorlightlevel + ((sector->floorlightabsolute) ? 0 : base_lightlevel))); } -static UINT8 R_CeilingLightLevel(sector_t *sector, UINT8 base_lightlevel) +static UINT8 R_CeilingLightLevel(sector_t *sector, INT16 base_lightlevel) { return max(0, min(255, sector->ceilinglightlevel + ((sector->ceilinglightabsolute) ? 0 : base_lightlevel))); diff --git a/src/r_segs.c b/src/r_segs.c index 637e528fe..a8a065c9b 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -94,29 +94,29 @@ transnum_t R_GetLinedefTransTable(fixed_t alpha) return (20*(FRACUNIT - alpha - 1) + FRACUNIT) >> (FRACBITS+1); } -static INT16 R_SideLightLevel(side_t *side, UINT8 base_lightlevel) +static UINT8 R_SideLightLevel(side_t *side, INT16 base_lightlevel) { - return side->light + - ((side->lightabsolute) ? 0 : base_lightlevel); + return max(0, min(255, side->light + + ((side->lightabsolute) ? 0 : base_lightlevel))); } /* TODO: implement per-texture lighting -static INT16 R_TopLightLevel(side_t *side, UINT8 base_lightlevel) +static UINT8 R_TopLightLevel(side_t *side, INT16 base_lightlevel) { - return side->light_top + - ((side->lightabsolute_top) ? 0 : R_SideLightLevel(side, base_lightlevel)); + return max(0, min(255, side->light_top + + ((side->lightabsolute_top) ? 0 : R_SideLightLevel(side, base_lightlevel)))); } -static INT16 R_MidLightLevel(side_t *side, UINT8 base_lightlevel) +static UINT8 R_MidLightLevel(side_t *side, INT16 base_lightlevel) { - return side->light_mid + - ((side->lightabsolute_mid) ? 0 : R_SideLightLevel(side, base_lightlevel)); + return max(0, min(255, side->light_mid + + ((side->lightabsolute_mid) ? 0 : R_SideLightLevel(side, base_lightlevel)))); } -static INT16 R_BottomLightLevel(side_t *side, UINT8 base_lightlevel) +static UINT8 R_BottomLightLevel(side_t *side, INT16 base_lightlevel) { - return side->light_bottom + - ((side->lightabsolute_bottom) ? 0 : R_SideLightLevel(side, base_lightlevel)); + return max(0, min(255, side->light_bottom + + ((side->lightabsolute_bottom) ? 0 : R_SideLightLevel(side, base_lightlevel)))); } */ From ac739b40bf6cb065bcc9773ed9874475604df05c Mon Sep 17 00:00:00 2001 From: pastel Date: Thu, 27 Jun 2024 13:14:52 -0500 Subject: [PATCH 088/139] Fix trycameramove crash on dedicated server --- src/p_map.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_map.c b/src/p_map.c index b8584205b..b79f9d45c 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2502,6 +2502,9 @@ boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam) floatok = false; + if (dedicated) // this crashes so don't even try it + return false; + if (twodlevel || (thiscam == &camera && players[displayplayer].mo && (players[displayplayer].mo->flags2 & MF2_TWOD)) || (thiscam == &camera2 && players[secondarydisplayplayer].mo && (players[secondarydisplayplayer].mo->flags2 & MF2_TWOD))) From 746072c58bb74ab7cc20ac7ffc6f6f3ff002888d Mon Sep 17 00:00:00 2001 From: Hanicef Date: Thu, 27 Jun 2024 20:59:14 +0200 Subject: [PATCH 089/139] Remove unused low-level netcode stuff --- src/netcode/d_net.c | 27 +-------------------------- src/netcode/d_netfil.c | 1 - src/netcode/i_net.h | 20 -------------------- src/netcode/i_tcp.c | 2 -- 4 files changed, 1 insertion(+), 49 deletions(-) diff --git a/src/netcode/d_net.c b/src/netcode/d_net.c index b24409db1..4f21ca984 100644 --- a/src/netcode/d_net.c +++ b/src/netcode/d_net.c @@ -62,9 +62,6 @@ static doomdata_t reboundstore[MAXREBOUND]; static INT16 reboundsize[MAXREBOUND]; static INT32 rebound_head, rebound_tail; -/// \brief bandwith of netgame -INT32 net_bandwidth; - /// \brief max length per packet INT16 hardware_MAXPACKETLENGTH; @@ -1189,10 +1186,7 @@ void D_SetDoomcom(void) { if (doomcom) return; doomcom = Z_Calloc(sizeof (doomcom_t), PU_STATIC, NULL); - doomcom->id = DOOMCOM_ID; doomcom->numslots = doomcom->numnodes = 1; - doomcom->gametype = 0; - doomcom->consoleplayer = 0; doomcom->extratics = 0; } @@ -1217,7 +1211,6 @@ boolean D_CheckNetGame(void) I_NetMakeNodewPort = NULL; hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; - net_bandwidth = 30000; // I_InitNetwork sets doomcom and netgame // check and initialize the network driver multiplayer = false; @@ -1237,7 +1230,6 @@ boolean D_CheckNetGame(void) server = true; // WTF? server always true??? // no! The deault mode is server. Client is set elsewhere // when the client executes connect command. - doomcom->ticdup = 1; if (M_CheckParm("-extratic")) { @@ -1248,21 +1240,6 @@ boolean D_CheckNetGame(void) CONS_Printf(M_GetText("Set extratics to %d\n"), doomcom->extratics); } - if (M_CheckParm("-bandwidth")) - { - if (M_IsNextParm()) - { - net_bandwidth = atoi(M_GetNextParm()); - if (net_bandwidth < 1000) - net_bandwidth = 1000; - if (net_bandwidth > 100000) - hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; - CONS_Printf(M_GetText("Network bandwidth set to %d\n"), net_bandwidth); - } - else - I_Error("usage: -bandwidth "); - } - software_MAXPACKETLENGTH = hardware_MAXPACKETLENGTH; if (M_CheckParm("-packetsize")) { @@ -1282,8 +1259,6 @@ boolean D_CheckNetGame(void) if (netgame) multiplayer = true; - if (doomcom->id != DOOMCOM_ID) - I_Error("Doomcom buffer invalid!"); if (doomcom->numnodes > MAXNETNODES) I_Error("Too many nodes (%d), max:%d", doomcom->numnodes, MAXNETNODES); @@ -1293,7 +1268,7 @@ boolean D_CheckNetGame(void) if (M_CheckParm("-debugfile")) { char filename[21]; - INT32 k = doomcom->consoleplayer - 1; + INT32 k = consoleplayer - 1; if (M_IsNextParm()) k = atoi(M_GetNextParm()) - 1; while (!debugfile && k < MAXPLAYERS) diff --git a/src/netcode/d_netfil.c b/src/netcode/d_netfil.c index a8a10d475..adec1a0e4 100644 --- a/src/netcode/d_netfil.c +++ b/src/netcode/d_netfil.c @@ -1033,7 +1033,6 @@ void FileSendTicker(void) netbuffer->packettype = PT_FILEFRAGMENT; - // (((sendbytes-nowsentbyte)*TICRATE)/(I_GetTime()-starttime)<(UINT32)net_bandwidth) while (packetsent-- && filestosend != 0) { for (i = currentnode, j = 0; j < MAXNETNODES; diff --git a/src/netcode/i_net.h b/src/netcode/i_net.h index 09b842296..6ac4bfc87 100644 --- a/src/netcode/i_net.h +++ b/src/netcode/i_net.h @@ -32,7 +32,6 @@ #define INETPACKETLENGTH 1024 extern INT16 hardware_MAXPACKETLENGTH; -extern INT32 net_bandwidth; // in byte/s #if defined(_MSC_VER) #pragma pack(1) @@ -40,36 +39,17 @@ extern INT32 net_bandwidth; // in byte/s typedef struct { - /// Supposed to be DOOMCOM_ID - INT32 id; - - /// SRB2 executes an INT32 to execute commands. - INT16 intnum; - /// Communication between SRB2 and the driver. - /// Is CMD_SEND or CMD_GET. - INT16 command; /// Is dest for send, set by get (-1 = no packet). INT16 remotenode; - /// Number of bytes in doomdata to be sent INT16 datalength; /// Info common to all nodes. /// Console is always node 0. INT16 numnodes; - /// Flag: 1 = no duplication, 2-5 = dup for slow nets. - INT16 ticdup; /// Flag: 1 = send a backup tic in every packet. INT16 extratics; - /// kind of game - INT16 gametype; - /// Flag: -1 = new game, 0-5 = load savegame - INT16 savegame; - /// currect map - INT16 map; - /// Info specific to this node. - INT16 consoleplayer; /// Number of "slots": the highest player number in use plus one. INT16 numslots; diff --git a/src/netcode/i_tcp.c b/src/netcode/i_tcp.c index 6a50f440b..1eb63b6bf 100644 --- a/src/netcode/i_tcp.c +++ b/src/netcode/i_tcp.c @@ -1374,7 +1374,6 @@ boolean I_InitTcpNetwork(void) // FIXME: // ??? and now ? // server on a big modem ??? 4*isdn - net_bandwidth = 16000; hardware_MAXPACKETLENGTH = INETPACKETLENGTH; ret = true; @@ -1403,7 +1402,6 @@ boolean I_InitTcpNetwork(void) // so we're on a LAN COM_BufAddText("connect any\n"); - net_bandwidth = 800000; hardware_MAXPACKETLENGTH = MAXPACKETLENGTH; } } From f713f5fdebe841bdf08674984a392af095efd80c Mon Sep 17 00:00:00 2001 From: Hanicef Date: Fri, 28 Jun 2024 12:37:13 +0200 Subject: [PATCH 090/139] Don't traverse the entire HOME directory but for real this time --- src/dedicated/i_system.c | 14 ++++++++------ src/sdl/i_system.c | 13 ++++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/dedicated/i_system.c b/src/dedicated/i_system.c index 82dd51be0..1a1db8fb3 100644 --- a/src/dedicated/i_system.c +++ b/src/dedicated/i_system.c @@ -1390,8 +1390,8 @@ static const char *searchWad(const char *searchDir) #define CHECKWADPATH(ret) \ do { \ - I_OutputMsg(",%s", returnWadPath); \ - if (isWadPathOk(returnWadPath)) \ + I_OutputMsg(",%s", ret); \ + if (isWadPathOk(ret)) \ return ret; \ } while (0) @@ -1416,7 +1416,9 @@ static const char *locateWad(void) #ifndef NOCWD // examine current dir strcpy(returnWadPath, "."); - CHECKWADPATH(NULL); + I_OutputMsg(",%s", returnWadPath); + if (isWadPathOk(returnWadPath)) + return NULL; #endif #ifdef __APPLE__ @@ -1433,13 +1435,13 @@ static const char *locateWad(void) #ifndef NOHOME // find in $HOME - I_OutputMsg(",HOME/" DEFAULTDIR); if ((envstr = I_GetEnv("HOME")) != NULL) { - char *tmp = malloc(strlen(envstr) + sizeof(DEFAULTDIR)); + char *tmp = malloc(strlen(envstr) + 1 + sizeof(DEFAULTDIR)); strcpy(tmp, envstr); + strcat(tmp, "/"); strcat(tmp, DEFAULTDIR); - SEARCHWAD(envstr); + CHECKWADPATH(tmp); free(tmp); } #endif diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index e28fbd34a..9fe50a6a2 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -3003,8 +3003,8 @@ static const char *searchWad(const char *searchDir) #define CHECKWADPATH(ret) \ do { \ - I_OutputMsg(",%s", returnWadPath); \ - if (isWadPathOk(returnWadPath)) \ + I_OutputMsg(",%s", ret); \ + if (isWadPathOk(ret)) \ return ret; \ } while (0) @@ -3033,7 +3033,9 @@ static const char *locateWad(void) #ifndef NOCWD // examine current dir strcpy(returnWadPath, "."); - CHECKWADPATH(NULL); + I_OutputMsg(",%s", returnWadPath); + if (isWadPathOk(returnWadPath)) + return NULL; #endif #ifdef __APPLE__ @@ -3053,10 +3055,11 @@ static const char *locateWad(void) I_OutputMsg(",HOME/" DEFAULTDIR); if ((envstr = I_GetEnv("HOME")) != NULL) { - char *tmp = malloc(strlen(envstr) + sizeof(DEFAULTDIR)); + char *tmp = malloc(strlen(envstr) + 1 + sizeof(DEFAULTDIR)); strcpy(tmp, envstr); + strcat(tmp, "/"); strcat(tmp, DEFAULTDIR); - SEARCHWAD(envstr); + CHECKWADPATH(tmp); free(tmp); } #endif From 06949628cf21c15c1f50bb00d63037b472863682 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sun, 30 Jun 2024 11:24:07 +0200 Subject: [PATCH 091/139] Fix lastinputtime not incrementing if idletime is 0 --- src/netcode/d_clisrv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/netcode/d_clisrv.c b/src/netcode/d_clisrv.c index d46e75c3f..5fee506af 100644 --- a/src/netcode/d_clisrv.c +++ b/src/netcode/d_clisrv.c @@ -1361,16 +1361,16 @@ static void IdleUpdate(void) if (!server || !netgame) return; - for (i = 1; i < MAXPLAYERS; i++) + for (i = 0; i < MAXPLAYERS; i++) { - if (cv_idletime.value && playeringame[i] && playernode[i] != UINT8_MAX && !players[i].quittime && !players[i].spectator && !players[i].bot && !IsPlayerAdmin(i) && i != serverplayer && gamestate == GS_LEVEL && !(players[i].pflags & PF_FINISHED)) + if (playeringame[i] && playernode[i] != UINT8_MAX && !players[i].quittime && !players[i].spectator && !players[i].bot && gamestate == GS_LEVEL) { if (players[i].cmd.forwardmove || players[i].cmd.sidemove || players[i].cmd.buttons) players[i].lastinputtime = 0; else players[i].lastinputtime++; - if (players[i].lastinputtime > (tic_t)cv_idletime.value * TICRATE * 60) + if (cv_idletime.value && !IsPlayerAdmin(i) && i != serverplayer && !(players[i].pflags & PF_FINISHED) && players[i].lastinputtime > (tic_t)cv_idletime.value * TICRATE * 60) { players[i].lastinputtime = 0; if (cv_idlespectate.value && G_GametypeHasSpectators()) From 4ff127bc0e21f9cdc5592167818a5dc067106836 Mon Sep 17 00:00:00 2001 From: spherallic Date: Mon, 1 Jul 2024 12:46:51 +0200 Subject: [PATCH 092/139] Improve relative teleport interpolation --- src/p_spec.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 78cf46063..d4939669a 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2405,18 +2405,15 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) y = line->args[3] << FRACBITS; z = line->args[4] << FRACBITS; - P_UnsetThingPosition(mo); - mo->x += x; - mo->y += y; - mo->z += z; - P_SetThingPosition(mo); - + P_SetOrigin(mo, mo->x + x, mo->y + y, mo->z + z); + if (mo->player) { if (bot) // This might put poor Tails in a wall if he's too far behind! D: But okay, whatever! >:3 P_SetOrigin(bot, bot->x + x, bot->y + y, bot->z + z); if (splitscreen && mo->player == &players[secondarydisplayplayer] && camera2.chase) { + camera2.reset = true; camera2.x += x; camera2.y += y; camera2.z += z; @@ -2424,6 +2421,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) } else if (camera.chase && mo->player == &players[displayplayer]) { + camera.reset = true; camera.x += x; camera.y += y; camera.z += z; From e9e2f20de9ed000d8d3bf15fbbec4ba87faa1b54 Mon Sep 17 00:00:00 2001 From: pastel Date: Mon, 1 Jul 2024 14:14:05 +0000 Subject: [PATCH 093/139] Make files with missing skins tell you who the skin is (resolves #1071) --- src/m_menu.c | 19 ++++++++++++++++--- src/m_menu.h | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 38165472e..6ac0f15bf 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -8432,7 +8432,17 @@ static void M_DrawLoadGameData(void) if (savegameinfo[savetodraw].lives == -42) V_DrawRightAlignedThinString(x + 79, y, V_GRAYMAP, "NEW GAME"); else if (savegameinfo[savetodraw].lives == -666) - V_DrawRightAlignedThinString(x + 79, y, V_REDMAP, "CAN'T LOAD!"); + { + if (savegameinfo[savetodraw].continuescore == -62) + { + V_DrawRightAlignedThinString(x + 79, y, V_REDMAP, "ADDON NOT LOADED"); + V_DrawRightAlignedThinString(x + 79, y-10, V_REDMAP, savegameinfo[savetodraw].skinname); + } + else + { + V_DrawRightAlignedThinString(x + 79, y, V_REDMAP, "CAN'T LOAD!"); + } + } else if (savegameinfo[savetodraw].gamemap & 8192) V_DrawRightAlignedThinString(x + 79, y, V_GREENMAP, "CLEAR!"); else @@ -8665,6 +8675,7 @@ static void M_LoadSelect(INT32 choice) } #define VERSIONSIZE 16 +#define MISSING { savegameinfo[slot].continuescore = -62; savegameinfo[slot].lives = -666; Z_Free(savebuffer); return; } #define BADSAVE { savegameinfo[slot].lives = -666; Z_Free(savebuffer); return; } #define CHECKPOS if (sav_p >= end_p) BADSAVE // Reads the save file to list lives, level, player, etc. @@ -8761,10 +8772,11 @@ static void M_ReadSavegameInfo(UINT32 slot) CHECKPOS READSTRINGN(sav_p, ourSkinName, SKINNAMESIZE); savegameinfo[slot].skinnum = R_SkinAvailable(ourSkinName); + STRBUFCPY(savegameinfo[slot].skinname, ourSkinName); if (savegameinfo[slot].skinnum >= numskins || !R_SkinUsable(-1, savegameinfo[slot].skinnum)) - BADSAVE + MISSING CHECKPOS READSTRINGN(sav_p, botSkinName, SKINNAMESIZE); @@ -8772,7 +8784,7 @@ static void M_ReadSavegameInfo(UINT32 slot) if (savegameinfo[slot].botskin-1 >= numskins || !R_SkinUsable(-1, savegameinfo[slot].botskin-1)) - BADSAVE + MISSING } CHECKPOS @@ -8817,6 +8829,7 @@ static void M_ReadSavegameInfo(UINT32 slot) } #undef CHECKPOS #undef BADSAVE +#undef MISSING // // M_ReadSaveStrings diff --git a/src/m_menu.h b/src/m_menu.h index 99a5b6de4..1e3cadfbe 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -421,6 +421,7 @@ typedef struct { char levelname[32]; UINT8 skinnum; + char skinname [SKINNAMESIZE+1]; UINT8 botskin; UINT8 numemeralds; UINT8 numgameovers; From 88fa2eb7761a6eb174b78225c7d53842662761b1 Mon Sep 17 00:00:00 2001 From: spherallic Date: Mon, 1 Jul 2024 19:53:12 +0200 Subject: [PATCH 094/139] Set player height to skin height instead of default height in G_AddPlayer --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index bf369d111..5d6954b9b 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3352,7 +3352,7 @@ void G_AddPlayer(INT32 playernum) p->playerstate = PST_REBORN; - p->height = mobjinfo[MT_PLAYER].height; + p->height = skins[p->skin]->height; if (G_GametypeUsesLives() || ((netgame || multiplayer) && (gametyperules & GTR_FRIENDLY))) p->lives = cv_startinglives.value; From 51af830d3014a99831482121e2c71408fc95a46e Mon Sep 17 00:00:00 2001 From: pastel Date: Mon, 1 Jul 2024 17:20:33 -0500 Subject: [PATCH 095/139] Fix miniupnpc version 18+ --- src/netcode/i_tcp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/netcode/i_tcp.c b/src/netcode/i_tcp.c index 6a50f440b..24dfd7ec2 100644 --- a/src/netcode/i_tcp.c +++ b/src/netcode/i_tcp.c @@ -317,7 +317,11 @@ init_upnpc_once(struct upnpdata *upnpuserdata) I_OutputMsg(M_GetText("Found UPnP device:\n desc: %s\n st: %s\n"), dev->descURL, dev->st); +#if (MINIUPNPC_API_VERSION >= 18) + UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr), NULL, 0); +#else UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)); +#endif I_OutputMsg(M_GetText("Local LAN IP address: %s\n"), lanaddr); descXML = miniwget(dev->descURL, &descXMLsize, scope_id, &status_code); if (descXML) From f92f1f3527b8d389cb9dd61fb0a1a11ed4dc0435 Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 2 Jul 2024 02:43:34 +0200 Subject: [PATCH 096/139] Correct chat word wrapping further, clean up unused status bar dimensions --- src/d_main.c | 8 ++++---- src/hu_stuff.c | 8 ++++---- src/r_draw.c | 1 - src/screen.h | 4 ---- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index bad78c530..bf6c62ef2 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -679,13 +679,13 @@ static void D_Display(void) s[sizeof s - 1] = '\0'; snprintf(s, sizeof s - 1, "get %d b/s", getbps); - V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-ST_HEIGHT-40, V_YELLOWMAP, s); + V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-40, V_YELLOWMAP, s); snprintf(s, sizeof s - 1, "send %d b/s", sendbps); - V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-ST_HEIGHT-30, V_YELLOWMAP, s); + V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-30, V_YELLOWMAP, s); snprintf(s, sizeof s - 1, "GameMiss %.2f%%", gamelostpercent); - V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-ST_HEIGHT-20, V_YELLOWMAP, s); + V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-20, V_YELLOWMAP, s); snprintf(s, sizeof s - 1, "SysMiss %.2f%%", lostpercent); - V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-ST_HEIGHT-10, V_YELLOWMAP, s); + V_DrawRightAlignedString(BASEVIDWIDTH, BASEVIDHEIGHT-10, V_YELLOWMAP, s); } if (cv_perfstats.value) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 9f1d09d11..5a27968cc 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -29,7 +29,7 @@ #include "i_video.h" #include "i_system.h" -#include "st_stuff.h" // ST_HEIGHT +#include "st_stuff.h" #include "r_local.h" #include "keys.h" @@ -1225,7 +1225,7 @@ static void HU_drawMiniChat(void) for (size_t i = chat_nummsg_min; i > 0; i--) { - char *msg = V_ChatWordWrap(0, boxw-charwidth, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE|V_MONOSPACE, chat_mini[i-1]); + char *msg = V_ChatWordWrap(0, boxw-charwidth-2, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE|V_MONOSPACE, chat_mini[i-1]); for(size_t j = 0; msg[j]; j++) // iterate through msg { if (msg[j] == '\n') // get back down. @@ -1265,7 +1265,7 @@ static void HU_drawMiniChat(void) { INT32 timer = ((cv_chattime.value*TICRATE)-chat_timers[i]) - cv_chattime.value*TICRATE+9; // see below... INT32 transflag = (timer >= 0 && timer <= 9) ? (timer*V_10TRANS) : 0; // you can make bad jokes out of this one. - char *msg = V_ChatWordWrap(0, boxw-charwidth, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE|V_MONOSPACE, chat_mini[i]); // get the current message, and word wrap it. + char *msg = V_ChatWordWrap(0, boxw-charwidth-2, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE|V_MONOSPACE, chat_mini[i]); // get the current message, and word wrap it. UINT8 *colormap = NULL; for(size_t j = 0; msg[j]; j++) // iterate through msg @@ -1353,7 +1353,7 @@ static void HU_drawChatLog(INT32 offset) for (i=0; i Date: Tue, 2 Jul 2024 15:16:43 +0200 Subject: [PATCH 097/139] Change BETAVERSION to pre1 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index 8d8f8978e..2e8e52ddb 100644 --- a/src/version.h +++ b/src/version.h @@ -12,4 +12,4 @@ #define MODVERSION 55 // Define this as a prerelease version suffix (pre#, RC#) -#define BETAVERSION "nightly" +#define BETAVERSION "pre1" From 1334c6bb3de7a081bbb1abd35b3c2147facfbf05 Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 2 Jul 2024 16:38:31 +0200 Subject: [PATCH 098/139] Update srb2.pk3 hash --- src/config.h.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.h.in b/src/config.h.in index 1148cab2c..63a175cbd 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -40,9 +40,9 @@ * Last updated 2023 / 05 / 02 - v2.2.11 - patch.pk3 & zones.pk3 * Last updated 2023 / 09 / 06 - v2.2.12 - patch.pk3 * Last updated 2023 / 09 / 09 - v2.2.13 - none - * Last updated 2024 / 06 / 24 - v2.2.14 - main assets + * Last updated 2024 / 07 / 02 - v2.2.14 - main assets */ -#define ASSET_HASH_SRB2_PK3 "9b8cf9510c56d442616086ca65ff93a7" +#define ASSET_HASH_SRB2_PK3 "b528b081a30f56aecf1040985474ff78" #define ASSET_HASH_ZONES_PK3 "b7db0245434ca3ad61935ee36403e966" #define ASSET_HASH_PLAYER_DTA "2e7aaae8a6b1b77d90ffe7606ceadb6c" #ifdef USE_PATCH_DTA From 5d15c65f15592857a5a28ac08d02eaabf1844f7e Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 2 Jul 2024 21:51:43 +0200 Subject: [PATCH 099/139] Update srb2.pk3 asset hash again --- src/config.h.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.h.in b/src/config.h.in index 63a175cbd..6870d1352 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -42,7 +42,7 @@ * Last updated 2023 / 09 / 09 - v2.2.13 - none * Last updated 2024 / 07 / 02 - v2.2.14 - main assets */ -#define ASSET_HASH_SRB2_PK3 "b528b081a30f56aecf1040985474ff78" +#define ASSET_HASH_SRB2_PK3 "dcf62cabd247e87074ed57336f7a5969" #define ASSET_HASH_ZONES_PK3 "b7db0245434ca3ad61935ee36403e966" #define ASSET_HASH_PLAYER_DTA "2e7aaae8a6b1b77d90ffe7606ceadb6c" #ifdef USE_PATCH_DTA From 01a368632e3d1515a5da925461886ab142b153d0 Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 2 Jul 2024 21:52:17 +0200 Subject: [PATCH 100/139] Correct line spacing on title card font --- src/hu_stuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 5a27968cc..caf13a445 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -204,7 +204,7 @@ void HU_LoadGraphics(void) HU_SetFontProperties(&hu_font, 0, 4, 8, 12); HU_SetFontProperties(&tny_font, 0, 2, 4, 12); HU_SetFontProperties(&cred_font, 0, 16, 16, 16); - HU_SetFontProperties(<_font, 0, 16, 20, 20); + HU_SetFontProperties(<_font, 0, 16, 20, 16); HU_SetFontProperties(&ntb_font, 2, 4, 20, 21); HU_SetFontProperties(&nto_font, 0, 4, 20, 21); From 64aefe7322db8b5b181298c44c60527a112e6138 Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 4 Jul 2024 12:42:16 +0200 Subject: [PATCH 101/139] Remove OpenGL-only fake contrast cvars --- src/hardware/hw_main.c | 91 ++++-------------------------------------- src/hardware/hw_main.h | 2 - 2 files changed, 7 insertions(+), 86 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 36e80f378..599c39132 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -226,87 +226,17 @@ UINT8 HWR_FogBlockAlpha(INT32 light, extracolormap_t *colormap) // Let's see if return surfcolor.s.alpha; } -static FUINT HWR_CalcWallLight(FUINT lightnum, fixed_t v1x, fixed_t v1y, fixed_t v2x, fixed_t v2y) +static FUINT HWR_CalcWallLight(FUINT lightnum, fixed_t v1x, fixed_t v1y, fixed_t v2x, fixed_t v2y) // TODO: improve "fake contrast" system { INT16 finallight = lightnum; + const UINT8 contrast = 8; - if (cv_glfakecontrast.value != 0) - { - const UINT8 contrast = 8; - fixed_t extralight = 0; + if (v1y == v2y) + finallight -= contrast; + else if (v1x == v2x) + finallight += contrast; - if (cv_glfakecontrast.value == 2) // Smooth setting - { - extralight = (-(contrast<> FRACBITS; - } - else - { - if (v1y == v2y) - extralight = -contrast; - else if (v1x == v2x) - extralight = contrast; - } - - if (extralight != 0) - { - finallight += extralight; - - if (finallight < 0) - finallight = 0; - if (finallight > 255) - finallight = 255; - } - } - - return (FUINT)finallight; -} - -static FUINT HWR_CalcSlopeLight(FUINT lightnum, angle_t dir, fixed_t delta) -{ - INT16 finallight = lightnum; - - if (cv_glfakecontrast.value != 0 && cv_glslopecontrast.value != 0) - { - const UINT8 contrast = 8; - fixed_t extralight = 0; - - if (cv_glfakecontrast.value == 2) // Smooth setting - { - fixed_t dirmul = abs(FixedDiv(AngleFixed(dir) - (180<> FRACBITS; - } - else - { - dir = ((dir + ANGLE_45) / ANGLE_90) * ANGLE_90; - - if (dir == ANGLE_180) - extralight = -contrast; - else if (dir == 0) - extralight = contrast; - - if (delta >= FRACUNIT/2) - extralight *= 2; - } - - if (extralight != 0) - { - finallight += extralight; - - if (finallight < 0) - finallight = 0; - if (finallight > 255) - finallight = 255; - } - } - - return (FUINT)finallight; + return (FUINT)max(0, min(255, finallight)); } static UINT8 HWR_SideLightLevel(side_t *side, INT16 base_lightlevel) @@ -498,9 +428,6 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool for (i = 0, v3d = planeVerts; i < (INT32)nrPlaneVerts; i++,v3d++,pv++) SETUP3DVERT(v3d, pv->x, pv->y); - if (slope) - lightlevel = HWR_CalcSlopeLight(lightlevel, R_PointToAngle2(0, 0, slope->normal.x, slope->normal.y), abs(slope->zdelta)); - HWR_Lighting(&Surf, lightlevel, planecolormap); if (PolyFlags & (PF_Translucent|PF_Fog|PF_Additive|PF_Subtractive|PF_ReverseSubtract|PF_Multiplicative|PF_Environment)) @@ -5665,7 +5592,6 @@ void HWR_LoadLevel(void) static CV_PossibleValue_t glshaders_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Ignore custom shaders"}, {0, NULL}}; static CV_PossibleValue_t glmodelinterpolation_cons_t[] = {{0, "Off"}, {1, "Sometimes"}, {2, "Always"}, {0, NULL}}; -static CV_PossibleValue_t glfakecontrast_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Smooth"}, {0, NULL}}; static CV_PossibleValue_t glshearing_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "Third-person"}, {0, NULL}}; static void CV_glfiltermode_OnChange(void); @@ -5699,8 +5625,6 @@ consvar_t cv_glmodellighting = CVAR_INIT ("gr_modellighting", "Off", CV_SAVE|CV_ consvar_t cv_glshearing = CVAR_INIT ("gr_shearing", "Off", CV_SAVE, glshearing_cons_t, NULL); consvar_t cv_glspritebillboarding = CVAR_INIT ("gr_spritebillboarding", "Off", CV_SAVE, CV_OnOff, NULL); consvar_t cv_glskydome = CVAR_INIT ("gr_skydome", "On", CV_SAVE, CV_OnOff, NULL); -consvar_t cv_glfakecontrast = CVAR_INIT ("gr_fakecontrast", "Smooth", CV_SAVE, glfakecontrast_cons_t, NULL); -consvar_t cv_glslopecontrast = CVAR_INIT ("gr_slopecontrast", "Off", CV_SAVE, CV_OnOff, NULL); consvar_t cv_glfiltermode = CVAR_INIT ("gr_filtermode", "Nearest", CV_SAVE|CV_CALL, glfiltermode_cons_t, CV_glfiltermode_OnChange); consvar_t cv_glanisotropicmode = CVAR_INIT ("gr_anisotropicmode", "1", CV_SAVE|CV_CALL, glanisotropicmode_cons_t, CV_glanisotropic_OnChange); @@ -5782,7 +5706,6 @@ void HWR_AddCommands(void) CV_RegisterVar(&cv_glskydome); CV_RegisterVar(&cv_glspritebillboarding); - CV_RegisterVar(&cv_glfakecontrast); CV_RegisterVar(&cv_glshearing); CV_RegisterVar(&cv_glshaders); diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index ea610a48b..2492bf6c8 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -91,8 +91,6 @@ extern consvar_t cv_glsolvetjoin; extern consvar_t cv_glshearing; extern consvar_t cv_glspritebillboarding; extern consvar_t cv_glskydome; -extern consvar_t cv_glfakecontrast; -extern consvar_t cv_glslopecontrast; extern consvar_t cv_glbatching; extern consvar_t cv_glpaletterendering; extern consvar_t cv_glpalettedepth; From 39d3b1cbd523c92e25ed0d00b3a87f45025f15c7 Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 4 Jul 2024 22:54:07 +0200 Subject: [PATCH 102/139] Update srb2.pk3 hash yet again --- src/config.h.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.h.in b/src/config.h.in index 6870d1352..9aa4f6da5 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -40,9 +40,9 @@ * Last updated 2023 / 05 / 02 - v2.2.11 - patch.pk3 & zones.pk3 * Last updated 2023 / 09 / 06 - v2.2.12 - patch.pk3 * Last updated 2023 / 09 / 09 - v2.2.13 - none - * Last updated 2024 / 07 / 02 - v2.2.14 - main assets + * Last updated 2024 / 07 / 04 - v2.2.14 - main assets */ -#define ASSET_HASH_SRB2_PK3 "dcf62cabd247e87074ed57336f7a5969" +#define ASSET_HASH_SRB2_PK3 "4ef6f57eefdf263288cae12084791cd2" #define ASSET_HASH_ZONES_PK3 "b7db0245434ca3ad61935ee36403e966" #define ASSET_HASH_PLAYER_DTA "2e7aaae8a6b1b77d90ffe7606ceadb6c" #ifdef USE_PATCH_DTA From 4557ce0253801b70802c59419012abcc43cc9bf7 Mon Sep 17 00:00:00 2001 From: spherallic Date: Fri, 5 Jul 2024 22:42:14 +0200 Subject: [PATCH 103/139] NiGHTS mode: move timer and closed caption positions --- src/screen.c | 6 ++---- src/st_stuff.c | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/screen.c b/src/screen.c index 014a20117..191c8638a 100644 --- a/src/screen.c +++ b/src/screen.c @@ -493,11 +493,9 @@ void SCR_ClosedCaptions(void) basey -= 42; else if (splitscreen) basey -= 8; - else if ((modeattacking == ATTACKING_NIGHTS) - || (!(maptol & TOL_NIGHTS) - && LUA_HudEnabled(hud_powerups) + else if (LUA_HudEnabled(hud_powerups) && ((cv_powerupdisplay.value == 2) // "Always" - || (cv_powerupdisplay.value == 1 && !camera.chase)))) // "First-person only" + || (cv_powerupdisplay.value == 1 && !camera.chase))) // "First-person only" basey -= 16; } diff --git a/src/st_stuff.c b/src/st_stuff.c index e088a448c..6a83e99ea 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -2078,24 +2078,25 @@ static void ST_drawNiGHTSHUD(void) if (!stplyr->exiting && !oldspecialstage && LUA_HudEnabled(hud_nightsscore)) ST_DrawNightsOverlayNum(304<marescore, nightsnum, SKINCOLOR_AZURE); - // TODO give this its own section for Lua + // TODO: give this its own section for Lua + // TODO: on multi-mare maps, show time & grade for each completed mare if (!stplyr->exiting && LUA_HudEnabled(hud_nightsscore)) { if (modeattacking == ATTACKING_NIGHTS) { INT32 maretime = max(stplyr->realtime - stplyr->marebegunat, 0); -#define VFLAGS V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_PERPLAYER|V_HUDTRANS - V_DrawScaledPatch(BASEVIDWIDTH-22, BASEVIDHEIGHT-20, VFLAGS, W_CachePatchName("NGRTIMER", PU_HUDGFX)); - V_DrawPaddedTallNum(BASEVIDWIDTH-22, BASEVIDHEIGHT-20, VFLAGS, G_TicsToCentiseconds(maretime), 2); - V_DrawScaledPatch(BASEVIDWIDTH-46, BASEVIDHEIGHT-20, VFLAGS, sboperiod); +#define VFLAGS V_SNAPTOTOP|V_SNAPTORIGHT|V_PERPLAYER|V_HUDTRANS + V_DrawScaledPatch(BASEVIDWIDTH-16, 40, VFLAGS, W_CachePatchName("NGRTIMER", PU_HUDGFX)); + V_DrawPaddedTallNum(BASEVIDWIDTH-16, 40, VFLAGS, G_TicsToCentiseconds(maretime), 2); + V_DrawScaledPatch(BASEVIDWIDTH-40, 40, VFLAGS, sboperiod); if (maretime < 60*TICRATE) - V_DrawTallNum(BASEVIDWIDTH-46, BASEVIDHEIGHT-20, VFLAGS, G_TicsToSeconds(maretime)); + V_DrawTallNum(BASEVIDWIDTH-40, 40, VFLAGS, G_TicsToSeconds(maretime)); else { - V_DrawPaddedTallNum(BASEVIDWIDTH-46, BASEVIDHEIGHT-20, VFLAGS, G_TicsToSeconds(maretime), 2); - V_DrawScaledPatch(BASEVIDWIDTH-70, BASEVIDHEIGHT-20, VFLAGS, sbocolon); - V_DrawTallNum(BASEVIDWIDTH-70, BASEVIDHEIGHT-20, VFLAGS, G_TicsToMinutes(maretime, true)); + V_DrawPaddedTallNum(BASEVIDWIDTH-40, 40, VFLAGS, G_TicsToSeconds(maretime), 2); + V_DrawScaledPatch(BASEVIDWIDTH-64, 40, VFLAGS, sbocolon); + V_DrawTallNum(BASEVIDWIDTH-64, 40, VFLAGS, G_TicsToMinutes(maretime, true)); } #undef VFLAGS } From 792b80cddb411e3ef7839beb33717403acd58f09 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sun, 7 Jul 2024 17:02:48 +0200 Subject: [PATCH 104/139] Lift savebuffer limits --- src/g_game.c | 242 ++- src/lua_script.c | 281 ++-- src/lua_script.h | 5 +- src/netcode/d_netcmd.c | 24 +- src/netcode/gamestate.c | 81 +- src/p_mobj.h | 2 + src/p_saveg.c | 3543 +++++++++++++++++++++------------------ src/p_saveg.h | 50 +- 8 files changed, 2240 insertions(+), 1988 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 5d6954b9b..5466b483a 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -256,8 +256,6 @@ boolean precache = true; // if true, load all graphics at start INT16 prevmap, nextmap; -static UINT8 *savebuffer; - // Analog Control static void UserAnalog_OnChange(void); static void UserAnalog2_OnChange(void); @@ -4396,7 +4394,7 @@ void G_LoadGameSettings(void) // Loads the main data file, which stores information such as emblems found, etc. void G_LoadGameData(gamedata_t *data) { - size_t length; + save_t savebuffer; INT32 i, j; UINT32 versionID; @@ -4438,18 +4436,18 @@ void G_LoadGameData(gamedata_t *data) return; } - length = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &savebuffer); - if (!length) + savebuffer.size = FIL_ReadFile(va(pandf, srb2home, gamedatafilename), &savebuffer.buf); + if (!savebuffer.size) { // No gamedata. We can save a new one. data->loaded = true; return; } - save_p = savebuffer; + savebuffer.pos = 0; // Version check - versionID = READUINT32(save_p); + versionID = P_ReadUINT32(&savebuffer); if (versionID != GAMEDATA_ID #ifdef COMPAT_GAMEDATA_ID // backwards compat behavior && versionID != COMPAT_GAMEDATA_ID @@ -4460,8 +4458,7 @@ void G_LoadGameData(gamedata_t *data) if (strcmp(srb2home,".")) gdfolder = srb2home; - Z_Free(savebuffer); - save_p = NULL; + Z_Free(savebuffer.buf); I_Error("Game data is from another version of SRB2.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder); } @@ -4473,14 +4470,14 @@ void G_LoadGameData(gamedata_t *data) } #endif - data->totalplaytime = READUINT32(save_p); + data->totalplaytime = P_ReadUINT32(&savebuffer); #ifdef COMPAT_GAMEDATA_ID if (versionID == COMPAT_GAMEDATA_ID) { // We'll temporarily use the old condition when loading an older file. // The proper mod-specific hash will get saved in afterwards. - boolean modded = READUINT8(save_p); + boolean modded = P_ReadUINT8(&savebuffer); if (modded && !savemoddata) { @@ -4500,13 +4497,13 @@ void G_LoadGameData(gamedata_t *data) strcpy(currentfilename, gamedatafilename); STRBUFCPY(backupfilename, strcat(currentfilename, bak)); - FIL_WriteFile(va(pandf, srb2home, backupfilename), savebuffer, length); + FIL_WriteFile(va(pandf, srb2home, backupfilename), &savebuffer.buf, savebuffer.size); } else #endif { // Quick & dirty hash for what mod this save file is for. - UINT32 modID = READUINT32(save_p); + UINT32 modID = P_ReadUINT32(&savebuffer); UINT32 expectedID = quickncasehash(timeattackfolder, sizeof timeattackfolder); if (modID != expectedID) @@ -4518,50 +4515,50 @@ void G_LoadGameData(gamedata_t *data) // TODO put another cipher on these things? meh, I don't care... for (i = 0; i < NUMMAPS; i++) - if ((data->mapvisited[i] = READUINT8(save_p)) > MV_MAX) + if ((data->mapvisited[i] = P_ReadUINT8(&savebuffer)) > MV_MAX) goto datacorrupt; // To save space, use one bit per collected/achieved/unlocked flag for (i = 0; i < max_emblems;) { - rtemp = READUINT8(save_p); + rtemp = P_ReadUINT8(&savebuffer); for (j = 0; j < 8 && j+i < max_emblems; ++j) data->collected[j+i] = ((rtemp >> j) & 1); i += j; } for (i = 0; i < max_extraemblems;) { - rtemp = READUINT8(save_p); + rtemp = P_ReadUINT8(&savebuffer); for (j = 0; j < 8 && j+i < max_extraemblems; ++j) data->extraCollected[j+i] = ((rtemp >> j) & 1); i += j; } for (i = 0; i < max_unlockables;) { - rtemp = READUINT8(save_p); + rtemp = P_ReadUINT8(&savebuffer); for (j = 0; j < 8 && j+i < max_unlockables; ++j) data->unlocked[j+i] = ((rtemp >> j) & 1); i += j; } for (i = 0; i < max_conditionsets;) { - rtemp = READUINT8(save_p); + rtemp = P_ReadUINT8(&savebuffer); for (j = 0; j < 8 && j+i < max_conditionsets; ++j) data->achieved[j+i] = ((rtemp >> j) & 1); i += j; } - data->timesBeaten = READUINT32(save_p); - data->timesBeatenWithEmeralds = READUINT32(save_p); - data->timesBeatenUltimate = READUINT32(save_p); + data->timesBeaten = P_ReadUINT32(&savebuffer); + data->timesBeatenWithEmeralds = P_ReadUINT32(&savebuffer); + data->timesBeatenUltimate = P_ReadUINT32(&savebuffer); // Main records for (i = 0; i < NUMMAPS; ++i) { - recscore = READUINT32(save_p); - rectime = (tic_t)READUINT32(save_p); - recrings = READUINT16(save_p); - save_p++; // compat + recscore = P_ReadUINT32(&savebuffer); + rectime = (tic_t)P_ReadUINT32(&savebuffer); + recrings = P_ReadUINT16(&savebuffer); + P_ReadUINT8(&savebuffer); // compat if (recrings > 10000 || recscore > MAXSCORE) goto datacorrupt; @@ -4578,16 +4575,16 @@ void G_LoadGameData(gamedata_t *data) // Nights records for (i = 0; i < NUMMAPS; ++i) { - if ((recmares = READUINT8(save_p)) == 0) + if ((recmares = P_ReadUINT8(&savebuffer)) == 0) continue; G_AllocNightsRecordData((INT16)i, data); for (curmare = 0; curmare < (recmares+1); ++curmare) { - data->nightsrecords[i]->score[curmare] = READUINT32(save_p); - data->nightsrecords[i]->grade[curmare] = READUINT8(save_p); - data->nightsrecords[i]->time[curmare] = (tic_t)READUINT32(save_p); + data->nightsrecords[i]->score[curmare] = P_ReadUINT32(&savebuffer); + data->nightsrecords[i]->grade[curmare] = P_ReadUINT8(&savebuffer); + data->nightsrecords[i]->time[curmare] = (tic_t)P_ReadUINT32(&savebuffer); if (data->nightsrecords[i]->grade[curmare] > GRADE_S) { @@ -4599,8 +4596,7 @@ void G_LoadGameData(gamedata_t *data) } // done - Z_Free(savebuffer); - save_p = NULL; + Z_Free(savebuffer.buf); // Don't consider loaded until it's a success! // It used to do this much earlier, but this would cause the gamedata to @@ -4621,8 +4617,7 @@ void G_LoadGameData(gamedata_t *data) if (strcmp(srb2home,".")) gdfolder = srb2home; - Z_Free(savebuffer); - save_p = NULL; + Z_Free(savebuffer.buf); I_Error("Corrupt game data file.\nDelete %s(maybe in %s) and try again.", gamedatafilename, gdfolder); } @@ -4632,9 +4627,8 @@ void G_LoadGameData(gamedata_t *data) // Saves the main data file, which stores information such as emblems found, etc. void G_SaveGameData(gamedata_t *data) { - UINT8 *data_p; + save_t savebuffer; - size_t length; INT32 i, j; UINT8 btemp; @@ -4646,30 +4640,31 @@ void G_SaveGameData(gamedata_t *data) if (!data->loaded) return; // If never loaded (-nodata), don't save - data_p = savebuffer = (UINT8 *)malloc(GAMEDATASIZE); - if (!data_p) + savebuffer.size = GAMEDATASIZE; + savebuffer.buf = (UINT8 *)malloc(savebuffer.size); + if (!savebuffer.buf) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); return; } + savebuffer.pos = 0; if (usedCheats) { - free(savebuffer); - savebuffer = NULL; + free(savebuffer.buf); return; } // Version test - WRITEUINT32(data_p, GAMEDATA_ID); + P_WriteUINT32(&savebuffer, GAMEDATA_ID); - WRITEUINT32(data_p, data->totalplaytime); + P_WriteUINT32(&savebuffer, data->totalplaytime); - WRITEUINT32(data_p, quickncasehash(timeattackfolder, sizeof timeattackfolder)); + P_WriteUINT32(&savebuffer, quickncasehash(timeattackfolder, sizeof timeattackfolder)); // TODO put another cipher on these things? meh, I don't care... for (i = 0; i < NUMMAPS; i++) - WRITEUINT8(data_p, (data->mapvisited[i] & MV_MAX)); + P_WriteUINT8(&savebuffer, (data->mapvisited[i] & MV_MAX)); // To save space, use one bit per collected/achieved/unlocked flag for (i = 0; i < MAXEMBLEMS;) @@ -4677,7 +4672,7 @@ void G_SaveGameData(gamedata_t *data) btemp = 0; for (j = 0; j < 8 && j+i < MAXEMBLEMS; ++j) btemp |= (data->collected[j+i] << j); - WRITEUINT8(data_p, btemp); + P_WriteUINT8(&savebuffer, btemp); i += j; } for (i = 0; i < MAXEXTRAEMBLEMS;) @@ -4685,7 +4680,7 @@ void G_SaveGameData(gamedata_t *data) btemp = 0; for (j = 0; j < 8 && j+i < MAXEXTRAEMBLEMS; ++j) btemp |= (data->extraCollected[j+i] << j); - WRITEUINT8(data_p, btemp); + P_WriteUINT8(&savebuffer, btemp); i += j; } for (i = 0; i < MAXUNLOCKABLES;) @@ -4693,7 +4688,7 @@ void G_SaveGameData(gamedata_t *data) btemp = 0; for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) btemp |= (data->unlocked[j+i] << j); - WRITEUINT8(data_p, btemp); + P_WriteUINT8(&savebuffer, btemp); i += j; } for (i = 0; i < MAXCONDITIONSETS;) @@ -4701,30 +4696,30 @@ void G_SaveGameData(gamedata_t *data) btemp = 0; for (j = 0; j < 8 && j+i < MAXCONDITIONSETS; ++j) btemp |= (data->achieved[j+i] << j); - WRITEUINT8(data_p, btemp); + P_WriteUINT8(&savebuffer, btemp); i += j; } - WRITEUINT32(data_p, data->timesBeaten); - WRITEUINT32(data_p, data->timesBeatenWithEmeralds); - WRITEUINT32(data_p, data->timesBeatenUltimate); + P_WriteUINT32(&savebuffer, data->timesBeaten); + P_WriteUINT32(&savebuffer, data->timesBeatenWithEmeralds); + P_WriteUINT32(&savebuffer, data->timesBeatenUltimate); // Main records for (i = 0; i < NUMMAPS; i++) { if (data->mainrecords[i]) { - WRITEUINT32(data_p, data->mainrecords[i]->score); - WRITEUINT32(data_p, data->mainrecords[i]->time); - WRITEUINT16(data_p, data->mainrecords[i]->rings); + P_WriteUINT32(&savebuffer, data->mainrecords[i]->score); + P_WriteUINT32(&savebuffer, data->mainrecords[i]->time); + P_WriteUINT16(&savebuffer, data->mainrecords[i]->rings); } else { - WRITEUINT32(data_p, 0); - WRITEUINT32(data_p, 0); - WRITEUINT16(data_p, 0); + P_WriteUINT32(&savebuffer, 0); + P_WriteUINT32(&savebuffer, 0); + P_WriteUINT16(&savebuffer, 0); } - WRITEUINT8(data_p, 0); // compat + P_WriteUINT8(&savebuffer, 0); // compat } // NiGHTS records @@ -4732,25 +4727,22 @@ void G_SaveGameData(gamedata_t *data) { if (!data->nightsrecords[i] || !data->nightsrecords[i]->nummares) { - WRITEUINT8(data_p, 0); + P_WriteUINT8(&savebuffer, 0); continue; } - WRITEUINT8(data_p, data->nightsrecords[i]->nummares); + P_WriteUINT8(&savebuffer, data->nightsrecords[i]->nummares); for (curmare = 0; curmare < (data->nightsrecords[i]->nummares + 1); ++curmare) { - WRITEUINT32(data_p, data->nightsrecords[i]->score[curmare]); - WRITEUINT8(data_p, data->nightsrecords[i]->grade[curmare]); - WRITEUINT32(data_p, data->nightsrecords[i]->time[curmare]); + P_WriteUINT32(&savebuffer, data->nightsrecords[i]->score[curmare]); + P_WriteUINT8(&savebuffer, data->nightsrecords[i]->grade[curmare]); + P_WriteUINT32(&savebuffer, data->nightsrecords[i]->time[curmare]); } } - length = data_p - savebuffer; - - FIL_WriteFile(va(pandf, srb2home, gamedatafilename), savebuffer, length); - free(savebuffer); - savebuffer = NULL; + FIL_WriteFile(va(pandf, srb2home, gamedatafilename), savebuffer.buf, savebuffer.pos); + free(savebuffer.buf); } #define VERSIONSIZE 16 @@ -4761,7 +4753,7 @@ void G_SaveGameData(gamedata_t *data) // void G_LoadGame(UINT32 slot, INT16 mapoverride) { - size_t length; + save_t savebuffer; char vcheck[VERSIONSIZE]; char savename[255]; @@ -4778,18 +4770,18 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) else sprintf(savename, savegamename, slot); - length = FIL_ReadFile(savename, &savebuffer); - if (!length) + savebuffer.size = FIL_ReadFile(savename, &savebuffer.buf); + if (!savebuffer.size) { CONS_Printf(M_GetText("Couldn't read file %s\n"), savename); return; } - save_p = savebuffer; + savebuffer.pos = 0; memset(vcheck, 0, sizeof (vcheck)); sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION); - if (strcmp((const char *)save_p, (const char *)vcheck)) + if (strcmp((const char *)&savebuffer.buf[savebuffer.pos], (const char *)vcheck)) { #ifdef SAVEGAME_OTHERVERSIONS M_StartMessage(M_GetText("Save game from different version.\nYou can load this savegame, but\nsaving afterwards will be disabled.\n\nDo you want to continue anyway?\n\n(Press 'Y' to confirm)\n"), @@ -4799,15 +4791,14 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) M_ClearMenus(true); // so ESC backs out to title M_StartMessage(M_GetText("Save game from different version\n\nPress ESC\n"), NULL, MM_NOTHING); Command_ExitGame_f(); - Z_Free(savebuffer); - save_p = savebuffer = NULL; + Z_Free(savebuffer.buf); // no cheating! memset(&savedata, 0, sizeof(savedata)); #endif return; // bad version } - save_p += VERSIONSIZE; + savebuffer.pos += VERSIONSIZE; // if (demoplayback) // reset game engine // G_StopDemo(); @@ -4816,13 +4807,12 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) // automapactive = false; // dearchive all the modifications - if (!P_LoadGame(mapoverride)) + if (!P_LoadGame(&savebuffer, mapoverride)) { M_ClearMenus(true); // so ESC backs out to title M_StartMessage(M_GetText("Savegame file corrupted\n\nPress ESC\n"), NULL, MM_NOTHING); Command_ExitGame_f(); - Z_Free(savebuffer); - save_p = savebuffer = NULL; + Z_Free(savebuffer.buf); // no cheating! memset(&savedata, 0, sizeof(savedata)); @@ -4830,13 +4820,12 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) } if (marathonmode) { - marathontime = READUINT32(save_p); - marathonmode |= READUINT8(save_p); + marathontime = P_ReadUINT32(&savebuffer); + marathonmode |= P_ReadUINT8(&savebuffer); } // done - Z_Free(savebuffer); - save_p = savebuffer = NULL; + Z_Free(savebuffer.buf); displayplayer = consoleplayer; multiplayer = splitscreen = false; @@ -4854,6 +4843,7 @@ void G_LoadGame(UINT32 slot, INT16 mapoverride) // void G_SaveGame(UINT32 slot, INT16 mapnum) { + save_t savebuffer; boolean saved; char savename[256] = ""; const char *backup; @@ -4867,33 +4857,32 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) gameaction = ga_nothing; { char name[VERSIONSIZE]; - size_t length; - save_p = savebuffer = (UINT8 *)malloc(SAVEGAMESIZE); - if (!save_p) + savebuffer.size = SAVEGAMESIZE; + savebuffer.buf = (UINT8 *)malloc(savebuffer.size); + if (!savebuffer.buf) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for saving game data\n")); return; } + savebuffer.pos = 0; memset(name, 0, sizeof (name)); sprintf(name, (marathonmode ? "back-up %d" : "version %d"), VERSION); - WRITEMEM(save_p, name, VERSIONSIZE); + P_WriteMem(&savebuffer, name, VERSIONSIZE); - P_SaveGame(mapnum); + P_SaveGame(&savebuffer, mapnum); if (marathonmode) { UINT32 writetime = marathontime; if (!(marathonmode & MA_INGAME)) writetime += TICRATE*5; // live event backup penalty because we don't know how long it takes to get to the next map - WRITEUINT32(save_p, writetime); - WRITEUINT8(save_p, (marathonmode & ~MA_INIT)); + P_WriteUINT32(&savebuffer, writetime); + P_WriteUINT8(&savebuffer, (marathonmode & ~MA_INIT)); } - length = save_p - savebuffer; - saved = FIL_WriteFile(backup, savebuffer, length); - free(savebuffer); - save_p = savebuffer = NULL; + saved = FIL_WriteFile(backup, savebuffer.buf, savebuffer.pos); + free(savebuffer.buf); } gameaction = ga_nothing; @@ -4905,11 +4894,10 @@ void G_SaveGame(UINT32 slot, INT16 mapnum) } #define BADSAVE goto cleanup; -#define CHECKPOS if (save_p >= end_p) BADSAVE void G_SaveGameOver(UINT32 slot, boolean modifylives) { + save_t savebuffer; boolean saved = false; - size_t length; char vcheck[VERSIONSIZE]; char savename[255]; const char *backup; @@ -4920,42 +4908,38 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) sprintf(savename, savegamename, slot); backup = va("%s",savename); - length = FIL_ReadFile(savename, &savebuffer); - if (!length) + savebuffer.size = FIL_ReadFile(savename, &savebuffer.buf); + if (!savebuffer.size) { CONS_Printf(M_GetText("Couldn't read file %s\n"), savename); return; } + savebuffer.pos = 0; + { char temp[sizeof(timeattackfolder)]; - UINT8 *end_p = savebuffer + length; UINT8 *lives_p; SINT8 pllives; #ifdef NEWSKINSAVES INT16 backwardsCompat = 0; #endif - save_p = savebuffer; // Version check memset(vcheck, 0, sizeof (vcheck)); sprintf(vcheck, (marathonmode ? "back-up %d" : "version %d"), VERSION); - if (strcmp((const char *)save_p, (const char *)vcheck)) BADSAVE - save_p += VERSIONSIZE; + if (strcmp((const char *)&savebuffer.buf[savebuffer.pos], (const char *)vcheck)) BADSAVE + savebuffer.pos += VERSIONSIZE; // P_UnArchiveMisc() - (void)READINT16(save_p); - CHECKPOS - (void)READUINT16(save_p); // emeralds - CHECKPOS - READSTRINGN(save_p, temp, sizeof(temp)); // mod it belongs to + (void)P_ReadINT16(&savebuffer); + (void)P_ReadUINT16(&savebuffer); // emeralds + P_ReadStringN(&savebuffer, temp, sizeof(temp)); // mod it belongs to if (strcmp(temp, timeattackfolder)) BADSAVE // P_UnArchivePlayer() - CHECKPOS #ifdef NEWSKINSAVES - backwardsCompat = READUINT16(save_p); - CHECKPOS + backwardsCompat = P_ReadUINT16(&savebuffer); if (backwardsCompat == NEWSKINSAVES) // New save, read skin names #endif @@ -4963,47 +4947,37 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) char ourSkinName[SKINNAMESIZE+1]; char botSkinName[SKINNAMESIZE+1]; - READSTRINGN(save_p, ourSkinName, SKINNAMESIZE); - CHECKPOS + P_ReadStringN(&savebuffer, ourSkinName, SKINNAMESIZE); - READSTRINGN(save_p, botSkinName, SKINNAMESIZE); - CHECKPOS + P_ReadStringN(&savebuffer, botSkinName, SKINNAMESIZE); } - WRITEUINT8(save_p, numgameovers); - CHECKPOS + P_WriteUINT8(&savebuffer, numgameovers); - lives_p = save_p; - pllives = READSINT8(save_p); // lives - CHECKPOS + lives_p = &savebuffer.buf[savebuffer.pos]; + pllives = P_ReadSINT8(&savebuffer); // lives if (modifylives && pllives < startinglivesbalance[numgameovers]) { - pllives = startinglivesbalance[numgameovers]; - WRITESINT8(lives_p, pllives); + *lives_p = startinglivesbalance[numgameovers]; } - (void)READINT32(save_p); // Score - CHECKPOS - (void)READINT32(save_p); // continues + (void)P_ReadINT32(&savebuffer); // Score + (void)P_ReadINT32(&savebuffer); // continues // File end marker check - CHECKPOS - switch (READUINT8(save_p)) + switch (P_ReadUINT8(&savebuffer)) { case 0xb7: { UINT8 i, banksinuse; - CHECKPOS - banksinuse = READUINT8(save_p); - CHECKPOS + banksinuse = P_ReadUINT8(&savebuffer); if (banksinuse > NUM_LUABANKS) BADSAVE for (i = 0; i < banksinuse; i++) { - (void)READINT32(save_p); - CHECKPOS + (void)P_ReadINT32(&savebuffer); } - if (READUINT8(save_p) != 0x1d) + if (P_ReadUINT8(&savebuffer) != 0x1d) BADSAVE } case 0x1d: @@ -5013,7 +4987,7 @@ void G_SaveGameOver(UINT32 slot, boolean modifylives) } // done - saved = FIL_WriteFile(backup, savebuffer, length); + saved = FIL_WriteFile(backup, savebuffer.buf, savebuffer.size); } cleanup: @@ -5021,11 +4995,9 @@ cleanup: CONS_Printf(M_GetText("Game saved.\n")); else if (!saved) CONS_Alert(CONS_ERROR, M_GetText("Error while writing to %s for save slot %u, base: %s\n"), backup, slot, (marathonmode ? liveeventbackup : savegamename)); - Z_Free(savebuffer); - save_p = savebuffer = NULL; + Z_Free(savebuffer.buf); } -#undef CHECKPOS #undef BADSAVE // diff --git a/src/lua_script.c b/src/lua_script.c index 057899555..51808977f 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -1098,7 +1098,7 @@ static UINT8 GetUserdataArchType(int index) return ARCH_NULL; } -static UINT8 ArchiveValue(int TABLESINDEX, int myindex) +static UINT8 ArchiveValue(save_t *save_p, int TABLESINDEX, int myindex) { if (myindex < 0) myindex = lua_gettop(gL)+1+myindex; @@ -1106,34 +1106,34 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { case LUA_TNONE: case LUA_TNIL: - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); break; // This might be a problem. D: case LUA_TLIGHTUSERDATA: case LUA_TTHREAD: case LUA_TFUNCTION: - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); return 2; case LUA_TBOOLEAN: - WRITEUINT8(save_p, lua_toboolean(gL, myindex) ? ARCH_TRUE : ARCH_FALSE); + P_WriteUINT8(save_p, lua_toboolean(gL, myindex) ? ARCH_TRUE : ARCH_FALSE); break; case LUA_TNUMBER: { lua_Integer number = lua_tointeger(gL, myindex); if (number >= INT8_MIN && number <= INT8_MAX) { - WRITEUINT8(save_p, ARCH_INT8); - WRITESINT8(save_p, number); + P_WriteUINT8(save_p, ARCH_INT8); + P_WriteSINT8(save_p, number); } else if (number >= INT16_MIN && number <= INT16_MAX) { - WRITEUINT8(save_p, ARCH_INT16); - WRITEINT16(save_p, number); + P_WriteUINT8(save_p, ARCH_INT16); + P_WriteINT16(save_p, number); } else { - WRITEUINT8(save_p, ARCH_INT32); - WRITEFIXED(save_p, number); + P_WriteUINT8(save_p, ARCH_INT32); + P_WriteFixed(save_p, number); } break; } @@ -1144,23 +1144,23 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) UINT32 i = 0; // if you're wondering why we're writing a string to save_p this way, // it turns out that Lua can have embedded zeros ('\0') in the strings, - // so we can't use WRITESTRING as that cuts off when it finds a '\0'. + // so we can't use P_WriteString as that cuts off when it finds a '\0'. // Saving the size of the string also allows us to get the size of the string on the other end, // fixing the awful crashes previously encountered for reading strings longer than 1024 // (yes I know that's kind of a stupid thing to care about, but it'd be evil to trim or ignore them?) // -- Monster Iestyn 05/08/18 if (len < 255) { - WRITEUINT8(save_p, ARCH_SMALLSTRING); - WRITEUINT8(save_p, len); // save size of string + P_WriteUINT8(save_p, ARCH_SMALLSTRING); + P_WriteUINT8(save_p, len); // save size of string } else { - WRITEUINT8(save_p, ARCH_LARGESTRING); - WRITEUINT32(save_p, len); // save size of string + P_WriteUINT8(save_p, ARCH_LARGESTRING); + P_WriteUINT32(save_p, len); // save size of string } while (i < len) - WRITECHAR(save_p, s[i++]); // write chars individually, including the embedded zeros + P_WriteChar(save_p, s[i++]); // write chars individually, including the embedded zeros break; } case LUA_TTABLE: @@ -1186,13 +1186,13 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) if (t == 0) { CONS_Alert(CONS_ERROR, "Too many tables to archive!\n"); - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); return 0; } } - WRITEUINT8(save_p, ARCH_TABLE); - WRITEUINT16(save_p, t); + P_WriteUINT8(save_p, ARCH_TABLE); + P_WriteUINT16(save_p, t); if (!found) { @@ -1208,25 +1208,25 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) case ARCH_MOBJINFO: { mobjinfo_t *info = *((mobjinfo_t **)lua_touserdata(gL, myindex)); - WRITEUINT8(save_p, ARCH_MOBJINFO); - WRITEUINT16(save_p, info - mobjinfo); + P_WriteUINT8(save_p, ARCH_MOBJINFO); + P_WriteUINT16(save_p, info - mobjinfo); break; } case ARCH_STATE: { state_t *state = *((state_t **)lua_touserdata(gL, myindex)); - WRITEUINT8(save_p, ARCH_STATE); - WRITEUINT16(save_p, state - states); + P_WriteUINT8(save_p, ARCH_STATE); + P_WriteUINT16(save_p, state - states); break; } case ARCH_MOBJ: { mobj_t *mobj = *((mobj_t **)lua_touserdata(gL, myindex)); if (!mobj) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_MOBJ); - WRITEUINT32(save_p, mobj->mobjnum); + P_WriteUINT8(save_p, ARCH_MOBJ); + P_WriteUINT32(save_p, mobj->mobjnum); } break; } @@ -1234,10 +1234,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { player_t *player = *((player_t **)lua_touserdata(gL, myindex)); if (!player) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_PLAYER); - WRITEUINT8(save_p, player - players); + P_WriteUINT8(save_p, ARCH_PLAYER); + P_WriteUINT8(save_p, player - players); } break; } @@ -1245,10 +1245,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { mapthing_t *mapthing = *((mapthing_t **)lua_touserdata(gL, myindex)); if (!mapthing) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_MAPTHING); - WRITEUINT16(save_p, mapthing - mapthings); + P_WriteUINT8(save_p, ARCH_MAPTHING); + P_WriteUINT16(save_p, mapthing - mapthings); } break; } @@ -1256,10 +1256,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { vertex_t *vertex = *((vertex_t **)lua_touserdata(gL, myindex)); if (!vertex) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_VERTEX); - WRITEUINT16(save_p, vertex - vertexes); + P_WriteUINT8(save_p, ARCH_VERTEX); + P_WriteUINT16(save_p, vertex - vertexes); } break; } @@ -1267,10 +1267,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { line_t *line = *((line_t **)lua_touserdata(gL, myindex)); if (!line) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_LINE); - WRITEUINT16(save_p, line - lines); + P_WriteUINT8(save_p, ARCH_LINE); + P_WriteUINT16(save_p, line - lines); } break; } @@ -1278,10 +1278,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { side_t *side = *((side_t **)lua_touserdata(gL, myindex)); if (!side) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_SIDE); - WRITEUINT16(save_p, side - sides); + P_WriteUINT8(save_p, ARCH_SIDE); + P_WriteUINT16(save_p, side - sides); } break; } @@ -1289,10 +1289,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { subsector_t *subsector = *((subsector_t **)lua_touserdata(gL, myindex)); if (!subsector) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_SUBSECTOR); - WRITEUINT16(save_p, subsector - subsectors); + P_WriteUINT8(save_p, ARCH_SUBSECTOR); + P_WriteUINT16(save_p, subsector - subsectors); } break; } @@ -1300,10 +1300,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { sector_t *sector = *((sector_t **)lua_touserdata(gL, myindex)); if (!sector) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_SECTOR); - WRITEUINT16(save_p, sector - sectors); + P_WriteUINT8(save_p, ARCH_SECTOR); + P_WriteUINT16(save_p, sector - sectors); } break; } @@ -1312,10 +1312,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { seg_t *seg = *((seg_t **)lua_touserdata(gL, myindex)); if (!seg) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_SEG); - WRITEUINT16(save_p, seg - segs); + P_WriteUINT8(save_p, ARCH_SEG); + P_WriteUINT16(save_p, seg - segs); } break; } @@ -1323,10 +1323,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { node_t *node = *((node_t **)lua_touserdata(gL, myindex)); if (!node) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_NODE); - WRITEUINT16(save_p, node - nodes); + P_WriteUINT8(save_p, ARCH_NODE); + P_WriteUINT16(save_p, node - nodes); } break; } @@ -1335,16 +1335,16 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { ffloor_t *rover = *((ffloor_t **)lua_touserdata(gL, myindex)); if (!rover) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { UINT16 i = P_GetFFloorID(rover); if (i == UINT16_MAX) // invalid ID - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_FFLOOR); - WRITEUINT16(save_p, rover->target - sectors); - WRITEUINT16(save_p, i); + P_WriteUINT8(save_p, ARCH_FFLOOR); + P_WriteUINT16(save_p, rover->target - sectors); + P_WriteUINT16(save_p, i); } } break; @@ -1353,10 +1353,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { polyobj_t *polyobj = *((polyobj_t **)lua_touserdata(gL, myindex)); if (!polyobj) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_POLYOBJ); - WRITEUINT16(save_p, polyobj-PolyObjects); + P_WriteUINT8(save_p, ARCH_POLYOBJ); + P_WriteUINT16(save_p, polyobj-PolyObjects); } break; } @@ -1364,10 +1364,10 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { pslope_t *slope = *((pslope_t **)lua_touserdata(gL, myindex)); if (!slope) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_SLOPE); - WRITEUINT16(save_p, slope->id); + P_WriteUINT8(save_p, ARCH_SLOPE); + P_WriteUINT16(save_p, slope->id); } break; } @@ -1375,36 +1375,36 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) { mapheader_t *header = *((mapheader_t **)lua_touserdata(gL, myindex)); if (!header) - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); else { - WRITEUINT8(save_p, ARCH_MAPHEADER); - WRITEUINT16(save_p, header - *mapheaderinfo); + P_WriteUINT8(save_p, ARCH_MAPHEADER); + P_WriteUINT16(save_p, header - *mapheaderinfo); } break; } case ARCH_SKINCOLOR: { skincolor_t *info = *((skincolor_t **)lua_touserdata(gL, myindex)); - WRITEUINT8(save_p, ARCH_SKINCOLOR); - WRITEUINT16(save_p, info - skincolors); + P_WriteUINT8(save_p, ARCH_SKINCOLOR); + P_WriteUINT16(save_p, info - skincolors); break; } case ARCH_MOUSE: { mouse_t *m = *((mouse_t **)lua_touserdata(gL, myindex)); - WRITEUINT8(save_p, ARCH_MOUSE); - WRITEUINT8(save_p, m == &mouse ? 1 : 2); + P_WriteUINT8(save_p, ARCH_MOUSE); + P_WriteUINT8(save_p, m == &mouse ? 1 : 2); break; } case ARCH_SKIN: { skin_t *skin = *((skin_t **)lua_touserdata(gL, myindex)); - WRITEUINT8(save_p, ARCH_SKIN); - WRITEUINT8(save_p, skin->skinnum); // UINT8 because MAXSKINS must be <= 256 + P_WriteUINT8(save_p, ARCH_SKIN); + P_WriteUINT8(save_p, skin->skinnum); // UINT8 because MAXSKINS must be <= 256 break; } default: - WRITEUINT8(save_p, ARCH_NULL); + P_WriteUINT8(save_p, ARCH_NULL); return 2; } break; @@ -1412,14 +1412,14 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) return 0; } -static void ArchiveExtVars(void *pointer, const char *ptype) +static void ArchiveExtVars(save_t *save_p, void *pointer, const char *ptype) { int TABLESINDEX; UINT16 i; if (!gL) { if (fastcmp(ptype,"player")) // players must always be included, even if no vars - WRITEUINT16(save_p, 0); + P_WriteUINT16(save_p, 0); return; } @@ -1435,7 +1435,7 @@ static void ArchiveExtVars(void *pointer, const char *ptype) { // no extra values table lua_pop(gL, 1); if (fastcmp(ptype,"player")) // players must always be included, even if no vars - WRITEUINT16(save_p, 0); + P_WriteUINT16(save_p, 0); return; } @@ -1447,20 +1447,20 @@ static void ArchiveExtVars(void *pointer, const char *ptype) if (i == 0) { if (fastcmp(ptype,"player")) // always include players even if they have no extra variables - WRITEUINT16(save_p, 0); + P_WriteUINT16(save_p, 0); lua_pop(gL, 1); return; } if (fastcmp(ptype,"mobj")) // mobjs must write their mobjnum as a header - WRITEUINT32(save_p, ((mobj_t *)pointer)->mobjnum); - WRITEUINT16(save_p, i); + P_WriteUINT32(save_p, ((mobj_t *)pointer)->mobjnum); + P_WriteUINT16(save_p, i); lua_pushnil(gL); while (lua_next(gL, -2)) { I_Assert(lua_type(gL, -2) == LUA_TSTRING); - WRITESTRING(save_p, lua_tostring(gL, -2)); - if (ArchiveValue(TABLESINDEX, -1) == 2) + P_WriteString(save_p, lua_tostring(gL, -2)); + if (ArchiveValue(save_p, TABLESINDEX, -1) == 2) CONS_Alert(CONS_ERROR, "Type of value for %s entry '%s' (%s) could not be archived!\n", ptype, lua_tostring(gL, -2), luaL_typename(gL, -1)); lua_pop(gL, 1); } @@ -1468,16 +1468,19 @@ static void ArchiveExtVars(void *pointer, const char *ptype) lua_pop(gL, 1); } +// FIXME: remove and pass as local variable +static save_t *lua_save_p; + static int NetArchive(lua_State *L) { int TABLESINDEX = lua_upvalueindex(1); int i, n = lua_gettop(L); for (i = 1; i <= n; i++) - ArchiveValue(TABLESINDEX, i); + ArchiveValue(lua_save_p, TABLESINDEX, i); return n; } -static void ArchiveTables(void) +static void ArchiveTables(save_t *save_p) { int TABLESINDEX; UINT16 i, n; @@ -1496,14 +1499,14 @@ static void ArchiveTables(void) while (lua_next(gL, -2)) { // Write key - e = ArchiveValue(TABLESINDEX, -2); // key should be either a number or a string, ArchiveValue can handle this. + e = ArchiveValue(save_p, TABLESINDEX, -2); // key should be either a number or a string, ArchiveValue can handle this. if (e == 1) n++; // the table contained a new table we'll have to archive. :( else if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise) CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -2), luaL_typename(gL, -2), i); // Write value - e = ArchiveValue(TABLESINDEX, -1); + e = ArchiveValue(save_p, TABLESINDEX, -1); if (e == 1) n++; // the table contained a new table we'll have to archive. :( else if (e == 2) // invalid value type @@ -1511,7 +1514,7 @@ static void ArchiveTables(void) lua_pop(gL, 1); } - WRITEUINT8(save_p, ARCH_TEND); + P_WriteUINT8(save_p, ARCH_TEND); // Write metatable ID if (lua_getmetatable(gL, -1)) @@ -1520,19 +1523,19 @@ static void ArchiveTables(void) lua_getfield(gL, LUA_REGISTRYINDEX, LREG_METATABLES); lua_pushvalue(gL, -2); lua_gettable(gL, -2); - WRITEUINT16(save_p, lua_isnil(gL, -1) ? 0 : lua_tointeger(gL, -1)); + P_WriteUINT16(save_p, lua_isnil(gL, -1) ? 0 : lua_tointeger(gL, -1)); lua_pop(gL, 3); } else - WRITEUINT16(save_p, 0); + P_WriteUINT16(save_p, 0); lua_pop(gL, 1); } } -static UINT8 UnArchiveValue(int TABLESINDEX) +static UINT8 UnArchiveValue(save_t *save_p, int TABLESINDEX) { - UINT8 type = READUINT8(save_p); + UINT8 type = P_ReadUINT8(save_p); switch (type) { case ARCH_NULL: @@ -1545,13 +1548,13 @@ static UINT8 UnArchiveValue(int TABLESINDEX) lua_pushboolean(gL, false); break; case ARCH_INT8: - lua_pushinteger(gL, READSINT8(save_p)); + lua_pushinteger(gL, P_ReadSINT8(save_p)); break; case ARCH_INT16: - lua_pushinteger(gL, READINT16(save_p)); + lua_pushinteger(gL, P_ReadINT16(save_p)); break; case ARCH_INT32: - lua_pushinteger(gL, READFIXED(save_p)); + lua_pushinteger(gL, P_ReadFixed(save_p)); break; case ARCH_SMALLSTRING: case ARCH_LARGESTRING: @@ -1562,23 +1565,23 @@ static UINT8 UnArchiveValue(int TABLESINDEX) // See my comments in the ArchiveValue function; // it's much the same for reading strings as writing them! - // (i.e. we can't use READSTRING either) + // (i.e. we can't use P_ReadString either) // -- Monster Iestyn 05/08/18 if (type == ARCH_SMALLSTRING) - len = READUINT8(save_p); // length of string, including embedded zeros + len = P_ReadUINT8(save_p); // length of string, including embedded zeros else - len = READUINT32(save_p); // length of string, including embedded zeros + len = P_ReadUINT32(save_p); // length of string, including embedded zeros value = malloc(len); // make temp buffer of size len // now read the actual string while (i < len) - value[i++] = READCHAR(save_p); // read chars individually, including the embedded zeros + value[i++] = P_ReadChar(save_p); // read chars individually, including the embedded zeros lua_pushlstring(gL, value, len); // push the string (note: this function supports embedded zeros) free(value); // free the buffer break; } case ARCH_TABLE: { - UINT16 tid = READUINT16(save_p); + UINT16 tid = P_ReadUINT16(save_p); lua_rawgeti(gL, TABLESINDEX, tid); if (lua_isnil(gL, -1)) { @@ -1591,69 +1594,69 @@ static UINT8 UnArchiveValue(int TABLESINDEX) break; } case ARCH_MOBJINFO: - LUA_PushUserdata(gL, &mobjinfo[READUINT16(save_p)], META_MOBJINFO); + LUA_PushUserdata(gL, &mobjinfo[P_ReadUINT16(save_p)], META_MOBJINFO); break; case ARCH_STATE: - LUA_PushUserdata(gL, &states[READUINT16(save_p)], META_STATE); + LUA_PushUserdata(gL, &states[P_ReadUINT16(save_p)], META_STATE); break; case ARCH_MOBJ: - LUA_PushUserdata(gL, P_FindNewPosition(READUINT32(save_p)), META_MOBJ); + LUA_PushUserdata(gL, P_FindNewPosition(P_ReadUINT32(save_p)), META_MOBJ); break; case ARCH_PLAYER: - LUA_PushUserdata(gL, &players[READUINT8(save_p)], META_PLAYER); + LUA_PushUserdata(gL, &players[P_ReadUINT8(save_p)], META_PLAYER); break; case ARCH_MAPTHING: - LUA_PushUserdata(gL, &mapthings[READUINT16(save_p)], META_MAPTHING); + LUA_PushUserdata(gL, &mapthings[P_ReadUINT16(save_p)], META_MAPTHING); break; case ARCH_VERTEX: - LUA_PushUserdata(gL, &vertexes[READUINT16(save_p)], META_VERTEX); + LUA_PushUserdata(gL, &vertexes[P_ReadUINT16(save_p)], META_VERTEX); break; case ARCH_LINE: - LUA_PushUserdata(gL, &lines[READUINT16(save_p)], META_LINE); + LUA_PushUserdata(gL, &lines[P_ReadUINT16(save_p)], META_LINE); break; case ARCH_SIDE: - LUA_PushUserdata(gL, &sides[READUINT16(save_p)], META_SIDE); + LUA_PushUserdata(gL, &sides[P_ReadUINT16(save_p)], META_SIDE); break; case ARCH_SUBSECTOR: - LUA_PushUserdata(gL, &subsectors[READUINT16(save_p)], META_SUBSECTOR); + LUA_PushUserdata(gL, &subsectors[P_ReadUINT16(save_p)], META_SUBSECTOR); break; case ARCH_SECTOR: - LUA_PushUserdata(gL, §ors[READUINT16(save_p)], META_SECTOR); + LUA_PushUserdata(gL, §ors[P_ReadUINT16(save_p)], META_SECTOR); break; #ifdef HAVE_LUA_SEGS case ARCH_SEG: - LUA_PushUserdata(gL, &segs[READUINT16(save_p)], META_SEG); + LUA_PushUserdata(gL, &segs[P_ReadUINT16(save_p)], META_SEG); break; case ARCH_NODE: - LUA_PushUserdata(gL, &nodes[READUINT16(save_p)], META_NODE); + LUA_PushUserdata(gL, &nodes[P_ReadUINT16(save_p)], META_NODE); break; #endif case ARCH_FFLOOR: { - sector_t *sector = §ors[READUINT16(save_p)]; - UINT16 id = READUINT16(save_p); + sector_t *sector = §ors[P_ReadUINT16(save_p)]; + UINT16 id = P_ReadUINT16(save_p); ffloor_t *rover = P_GetFFloorByID(sector, id); if (rover) LUA_PushUserdata(gL, rover, META_FFLOOR); break; } case ARCH_POLYOBJ: - LUA_PushUserdata(gL, &PolyObjects[READUINT16(save_p)], META_POLYOBJ); + LUA_PushUserdata(gL, &PolyObjects[P_ReadUINT16(save_p)], META_POLYOBJ); break; case ARCH_SLOPE: - LUA_PushUserdata(gL, P_SlopeById(READUINT16(save_p)), META_SLOPE); + LUA_PushUserdata(gL, P_SlopeById(P_ReadUINT16(save_p)), META_SLOPE); break; case ARCH_MAPHEADER: - LUA_PushUserdata(gL, mapheaderinfo[READUINT16(save_p)], META_MAPHEADER); + LUA_PushUserdata(gL, mapheaderinfo[P_ReadUINT16(save_p)], META_MAPHEADER); break; case ARCH_SKINCOLOR: - LUA_PushUserdata(gL, &skincolors[READUINT16(save_p)], META_SKINCOLOR); + LUA_PushUserdata(gL, &skincolors[P_ReadUINT16(save_p)], META_SKINCOLOR); break; case ARCH_MOUSE: - LUA_PushUserdata(gL, READUINT16(save_p) == 1 ? &mouse : &mouse2, META_MOUSE); + LUA_PushUserdata(gL, P_ReadUINT16(save_p) == 1 ? &mouse : &mouse2, META_MOUSE); break; case ARCH_SKIN: - LUA_PushUserdata(gL, skins[READUINT8(save_p)], META_SKIN); + LUA_PushUserdata(gL, skins[P_ReadUINT8(save_p)], META_SKIN); break; case ARCH_TEND: return 1; @@ -1661,10 +1664,10 @@ static UINT8 UnArchiveValue(int TABLESINDEX) return 0; } -static void UnArchiveExtVars(void *pointer) +static void UnArchiveExtVars(save_t *save_p, void *pointer) { int TABLESINDEX; - UINT16 field_count = READUINT16(save_p); + UINT16 field_count = P_ReadUINT16(save_p); UINT16 i; char field[1024]; @@ -1677,8 +1680,8 @@ static void UnArchiveExtVars(void *pointer) for (i = 0; i < field_count; i++) { - READSTRING(save_p, field); - UnArchiveValue(TABLESINDEX); + P_ReadString(save_p, field); + UnArchiveValue(save_p, TABLESINDEX); lua_setfield(gL, -2, field); } @@ -1695,11 +1698,11 @@ static int NetUnArchive(lua_State *L) int TABLESINDEX = lua_upvalueindex(1); int i, n = lua_gettop(L); for (i = 1; i <= n; i++) - UnArchiveValue(TABLESINDEX); + UnArchiveValue(lua_save_p, TABLESINDEX); return n; } -static void UnArchiveTables(void) +static void UnArchiveTables(save_t *save_p) { int TABLESINDEX; UINT16 i, n; @@ -1716,13 +1719,13 @@ static void UnArchiveTables(void) lua_rawgeti(gL, TABLESINDEX, i); while (true) { - UINT8 e = UnArchiveValue(TABLESINDEX); // read key + UINT8 e = UnArchiveValue(save_p, TABLESINDEX); // read key if (e == 1) // End of table break; else if (e == 2) // Key contains a new table n++; - if (UnArchiveValue(TABLESINDEX) == 2) // read value + if (UnArchiveValue(save_p, TABLESINDEX) == 2) // read value n++; if (lua_isnil(gL, -2)) // if key is nil (if a function etc was accidentally saved) @@ -1734,7 +1737,7 @@ static void UnArchiveTables(void) lua_rawset(gL, -3); } - metatableid = READUINT16(save_p); + metatableid = P_ReadUINT16(save_p); if (metatableid) { // setmetatable(table, registry.metatables[metatableid]) @@ -1758,7 +1761,7 @@ void LUA_Step(void) lua_gc(gL, LUA_GCSTEP, 1); } -void LUA_Archive(void) +void LUA_Archive(save_t *save_p) { INT32 i; thinker_t *th; @@ -1771,7 +1774,7 @@ void LUA_Archive(void) if (!playeringame[i] && i > 0) // dedicated servers... continue; // all players in game will be archived, even if they just add a 0. - ArchiveExtVars(&players[i], "player"); + ArchiveExtVars(save_p, &players[i], "player"); } for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) @@ -1781,19 +1784,20 @@ void LUA_Archive(void) // archive function will determine when to skip mobjs, // and write mobjnum in otherwise. - ArchiveExtVars(th, "mobj"); + ArchiveExtVars(save_p, th, "mobj"); } - WRITEUINT32(save_p, UINT32_MAX); // end of mobjs marker, replaces mobjnum. + P_WriteUINT32(save_p, UINT32_MAX); // end of mobjs marker, replaces mobjnum. + lua_save_p = save_p; LUA_HookNetArchive(NetArchive); // call the NetArchive hook in archive mode - ArchiveTables(); + ArchiveTables(save_p); if (gL) lua_pop(gL, 1); // pop tables } -void LUA_UnArchive(void) +void LUA_UnArchive(save_t *save_p) { UINT32 mobjnum; INT32 i; @@ -1806,23 +1810,24 @@ void LUA_UnArchive(void) { if (!playeringame[i] && i > 0) // dedicated servers... continue; - UnArchiveExtVars(&players[i]); + UnArchiveExtVars(save_p, &players[i]); } do { - mobjnum = READUINT32(save_p); // read a mobjnum + mobjnum = P_ReadUINT32(save_p); // read a mobjnum for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) { if (th->function.acp1 == (actionf_p1)P_RemoveThinkerDelayed) continue; if (((mobj_t *)th)->mobjnum != mobjnum) // find matching mobj continue; - UnArchiveExtVars(th); // apply variables + UnArchiveExtVars(save_p, th); // apply variables } } while(mobjnum != UINT32_MAX); // repeat until end of mobjs marker. + lua_save_p = save_p; LUA_HookNetArchive(NetUnArchive); // call the NetArchive hook in unarchive mode - UnArchiveTables(); + UnArchiveTables(save_p); if (gL) lua_pop(gL, 1); // pop tables diff --git a/src/lua_script.h b/src/lua_script.h index 45d2a37ff..968ef078d 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -13,6 +13,7 @@ #ifndef LUA_SCRIPT_H #define LUA_SCRIPT_H +#include "p_saveg.h" #include "m_fixed.h" #include "doomtype.h" #include "d_player.h" @@ -52,8 +53,8 @@ void LUA_DumpFile(const char *filename); #endif fixed_t LUA_EvalMath(const char *word); void LUA_Step(void); -void LUA_Archive(void); -void LUA_UnArchive(void); +void LUA_Archive(save_t *save_p); +void LUA_UnArchive(save_t *save_p); int LUA_PushGlobals(lua_State *L, const char *word); int LUA_CheckGlobals(lua_State *L, const char *word); void Got_Luacmd(UINT8 **cp, INT32 playernum); // lua_consolelib.c diff --git a/src/netcode/d_netcmd.c b/src/netcode/d_netcmd.c index 4134c633e..64feeeda3 100644 --- a/src/netcode/d_netcmd.c +++ b/src/netcode/d_netcmd.c @@ -4799,12 +4799,11 @@ static void Command_Togglemodified_f(void) modifiedgame = !modifiedgame; } -extern UINT8 *save_p; static void Command_Archivetest_f(void) { - UINT8 *buf; UINT32 i, wrote; thinker_t *th; + save_t savebuffer; if (gamestate != GS_LEVEL) { CONS_Printf("This command only works in-game, you dummy.\n"); @@ -4818,28 +4817,29 @@ static void Command_Archivetest_f(void) ((mobj_t *)th)->mobjnum = i++; // allocate buffer - buf = save_p = ZZ_Alloc(1024); + savebuffer.size = 1024; + savebuffer.buf = malloc(savebuffer.size); + savebuffer.pos = 0; // test archive CONS_Printf("LUA_Archive...\n"); - LUA_Archive(); - WRITEUINT8(save_p, 0x7F); - wrote = (UINT32)(save_p-buf); + LUA_Archive(&savebuffer); + P_WriteUINT8(&savebuffer, 0x7F); + wrote = savebuffer.pos; // clear Lua state, so we can really see what happens! CONS_Printf("Clearing state!\n"); LUA_ClearExtVars(); // test unarchive - save_p = buf; CONS_Printf("LUA_UnArchive...\n"); - LUA_UnArchive(); - i = READUINT8(save_p); - if (i != 0x7F || wrote != (UINT32)(save_p-buf)) - CONS_Printf("Savegame corrupted. (write %u, read %u)\n", wrote, (UINT32)(save_p-buf)); + LUA_UnArchive(&savebuffer); + i = P_ReadUINT8(&savebuffer); + if (i != 0x7F || wrote != (UINT32)(savebuffer.pos)) + CONS_Printf("Savegame corrupted. (write %u, read %u)\n", wrote, (UINT32)(savebuffer.pos)); // free buffer - Z_Free(buf); + free(savebuffer.buf); CONS_Printf("Done. No crash.\n"); } #endif diff --git a/src/netcode/gamestate.c b/src/netcode/gamestate.c index f36347c6d..fbc2b4ca7 100644 --- a/src/netcode/gamestate.c +++ b/src/netcode/gamestate.c @@ -54,30 +54,25 @@ boolean SV_ResendingSavegameToAnyone(void) void SV_SendSaveGame(INT32 node, boolean resending) { size_t length, compressedlen; - UINT8 *savebuffer; + save_t savebuffer; UINT8 *compressedsave; UINT8 *buffertosend; // first save it in a malloced buffer - savebuffer = (UINT8 *)malloc(SAVEGAMESIZE); - if (!savebuffer) + savebuffer.size = SAVEGAMESIZE; + savebuffer.buf = (UINT8 *)malloc(savebuffer.size); + if (!savebuffer.buf) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); return; } // Leave room for the uncompressed length. - save_p = savebuffer + sizeof(UINT32); + savebuffer.pos = sizeof(UINT32); - P_SaveNetGame(resending); + P_SaveNetGame(&savebuffer, resending); - length = save_p - savebuffer; - if (length > SAVEGAMESIZE) - { - free(savebuffer); - save_p = NULL; - I_Error("Savegame buffer overrun"); - } + length = savebuffer.pos; // Allocate space for compressed save: one byte fewer than for the // uncompressed data to ensure that the compression is worthwhile. @@ -89,11 +84,11 @@ void SV_SendSaveGame(INT32 node, boolean resending) } // Attempt to compress it. - if((compressedlen = lzf_compress(savebuffer + sizeof(UINT32), length - sizeof(UINT32), compressedsave + sizeof(UINT32), length - sizeof(UINT32) - 1))) + if((compressedlen = lzf_compress(savebuffer.buf + sizeof(UINT32), length - sizeof(UINT32), compressedsave + sizeof(UINT32), length - sizeof(UINT32) - 1))) { // Compressing succeeded; send compressed data - free(savebuffer); + free(savebuffer.buf); // State that we're compressed. buffertosend = compressedsave; @@ -107,12 +102,12 @@ void SV_SendSaveGame(INT32 node, boolean resending) free(compressedsave); // State that we're not compressed - buffertosend = savebuffer; - WRITEUINT32(savebuffer, 0); + buffertosend = savebuffer.buf; + savebuffer.pos = 0; + P_WriteUINT32(&savebuffer, 0); } AddRamToSendQueue(node, buffertosend, length, SF_RAM, 0); - save_p = NULL; // Remember when we started sending the savegame so we can handle timeouts netnodes[node].sendingsavegame = true; @@ -125,8 +120,7 @@ static consvar_t cv_dumpconsistency = CVAR_INIT ("dumpconsistency", "Off", CV_SA void SV_SavedGame(void) { - size_t length; - UINT8 *savebuffer; + save_t savebuffer; char tmpsave[256]; if (!cv_dumpconsistency.value) @@ -135,29 +129,22 @@ void SV_SavedGame(void) sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home); // first save it in a malloced buffer - save_p = savebuffer = (UINT8 *)malloc(SAVEGAMESIZE); - if (!save_p) + savebuffer.size = SAVEGAMESIZE; + savebuffer.buf = (UINT8 *)malloc(savebuffer.size); + if (!savebuffer.buf) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); return; } + savebuffer.pos = 0; - P_SaveNetGame(false); - - length = save_p - savebuffer; - if (length > SAVEGAMESIZE) - { - free(savebuffer); - save_p = NULL; - I_Error("Savegame buffer overrun"); - } + P_SaveNetGame(&savebuffer, false); // then save it! - if (!FIL_WriteFile(tmpsave, savebuffer, length)) + if (!FIL_WriteFile(tmpsave, savebuffer.buf, savebuffer.pos)) CONS_Printf(M_GetText("Didn't save %s for netgame"), tmpsave); - free(savebuffer); - save_p = NULL; + free(savebuffer.pos); } #undef TMPSAVENAME @@ -167,33 +154,34 @@ void SV_SavedGame(void) void CL_LoadReceivedSavegame(boolean reloading) { - UINT8 *savebuffer = NULL; - size_t length, decompressedlen; + save_t savebuffer; + size_t decompressedlen; char tmpsave[256]; FreeFileNeeded(); sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home); - length = FIL_ReadFile(tmpsave, &savebuffer); + savebuffer.size = FIL_ReadFile(tmpsave, &savebuffer.buf); + savebuffer.pos = 0; - CONS_Printf(M_GetText("Loading savegame length %s\n"), sizeu1(length)); - if (!length) + CONS_Printf(M_GetText("Loading savegame length %s\n"), sizeu1(savebuffer.size)); + if (!savebuffer.size) { I_Error("Can't read savegame sent"); return; } - save_p = savebuffer; - // Decompress saved game if necessary. - decompressedlen = READUINT32(save_p); + decompressedlen = P_ReadUINT32(&savebuffer); if(decompressedlen > 0) { UINT8 *decompressedbuffer = Z_Malloc(decompressedlen, PU_STATIC, NULL); - lzf_decompress(save_p, length - sizeof(UINT32), decompressedbuffer, decompressedlen); - Z_Free(savebuffer); - save_p = savebuffer = decompressedbuffer; + lzf_decompress(savebuffer.buf + sizeof(UINT32), savebuffer.size - sizeof(UINT32), decompressedbuffer, decompressedlen); + Z_Free(savebuffer.buf); + savebuffer.buf = decompressedbuffer; + savebuffer.size = decompressedlen; + savebuffer.pos = 0; } paused = false; @@ -203,7 +191,7 @@ void CL_LoadReceivedSavegame(boolean reloading) automapactive = false; // load a base level - if (P_LoadNetGame(reloading)) + if (P_LoadNetGame(&savebuffer, reloading)) { const UINT8 actnum = mapheaderinfo[gamemap-1]->actnum; CONS_Printf(M_GetText("Map is now \"%s"), G_BuildMapName(gamemap)); @@ -219,8 +207,7 @@ void CL_LoadReceivedSavegame(boolean reloading) } // done - Z_Free(savebuffer); - save_p = NULL; + Z_Free(savebuffer.buf); if (unlink(tmpsave) == -1) CONS_Alert(CONS_ERROR, M_GetText("Can't delete %s\n"), tmpsave); consistancy[gametic%BACKUPTICS] = Consistancy(); diff --git a/src/p_mobj.h b/src/p_mobj.h index f281410f6..4ebcc993a 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -539,6 +539,8 @@ boolean P_SceneryZMovement(mobj_t *mo); void P_PlayerZMovement(mobj_t *mo); void P_EmeraldManager(void); +mobj_t *P_FindNewPosition(UINT32 oldposition); + extern INT32 modulothing; #define MAXHUNTEMERALDS 64 diff --git a/src/p_saveg.c b/src/p_saveg.c index da73dd8a0..b40d7cbdd 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -37,7 +37,246 @@ #include "p_slopes.h" savedata_t savedata; -UINT8 *save_p; + +#define ALLOC_SIZE(p, z) \ + if ((p)->pos + (z) > (p)->size) \ + { \ + while ((p)->pos + (z) > (p)->size) \ + (p)->size <<= 1; \ + (p)->buf = realloc((p)->buf, (p)->size); \ + } + +void P_WriteUINT8(save_t *p, UINT8 v) +{ + ALLOC_SIZE(p, sizeof(v)); + memcpy(&p->buf[p->pos], &v, sizeof(v)); + p->pos += sizeof(v); +} + +void P_WriteSINT8(save_t *p, SINT8 v) +{ + ALLOC_SIZE(p, sizeof(v)); + memcpy(&p->buf[p->pos], &v, sizeof(v)); + p->pos += sizeof(v); +} + +void P_WriteUINT16(save_t *p, UINT16 v) +{ + ALLOC_SIZE(p, sizeof(v)); + memcpy(&p->buf[p->pos], &v, sizeof(v)); + p->pos += sizeof(v); +} + +void P_WriteINT16(save_t *p, INT16 v) +{ + ALLOC_SIZE(p, sizeof(v)); + memcpy(&p->buf[p->pos], &v, sizeof(v)); + p->pos += sizeof(v); +} + +void P_WriteUINT32(save_t *p, UINT32 v) +{ + ALLOC_SIZE(p, sizeof(v)); + memcpy(&p->buf[p->pos], &v, sizeof(v)); + p->pos += sizeof(v); +} + +void P_WriteINT32(save_t *p, INT32 v) +{ + ALLOC_SIZE(p, sizeof(v)); + memcpy(&p->buf[p->pos], &v, sizeof(v)); + p->pos += sizeof(v); +} + +void P_WriteChar(save_t *p, char v) +{ + ALLOC_SIZE(p, sizeof(v)); + memcpy(&p->buf[p->pos], &v, sizeof(v)); + p->pos += sizeof(v); +} + +void P_WriteFixed(save_t *p, fixed_t v) +{ + ALLOC_SIZE(p, sizeof(v)); + memcpy(&p->buf[p->pos], &v, sizeof(v)); + p->pos += sizeof(v); +} + +void P_WriteAngle(save_t *p, angle_t v) +{ + ALLOC_SIZE(p, sizeof(v)); + memcpy(&p->buf[p->pos], &v, sizeof(v)); + p->pos += sizeof(v); +} + +void P_WriteStringN(save_t *p, char const *s, size_t n) +{ + size_t i; + + for (i = 0; i < n && s[i] != '\0'; i++) + P_WriteChar(p, s[i]); + + if (i < n) + P_WriteChar(p, '\0'); +} + +void P_WriteStringL(save_t *p, char const *s, size_t n) +{ + size_t i; + + for (i = 0; i < n - 1 && s[i] != '\0'; i++) + P_WriteChar(p, s[i]); + + P_WriteChar(p, '\0'); +} + +void P_WriteString(save_t *p, char const *s) +{ + size_t i; + + for (i = 0; s[i] != '\0'; i++) + P_WriteChar(p, s[i]); + + P_WriteChar(p, '\0'); +} + +void P_WriteMem(save_t *p, void const *s, size_t n) +{ + ALLOC_SIZE(p, n); + memcpy(&p->buf[p->pos], s, n); + p->pos += n; +} + +void P_SkipStringN(save_t *p, size_t n) +{ + size_t i; + for (i = 0; p->pos < p->size && i < n && P_ReadChar(p) != '\0'; i++); +} + +void P_SkipStringL(save_t *p, size_t n) +{ + P_SkipStringN(p, n); +} + +void P_SkipString(save_t *p) +{ + P_SkipStringN(p, SIZE_MAX); +} + +UINT8 P_ReadUINT8(save_t *p) +{ + UINT8 v; + if (p->pos + sizeof(v) > p->size) + return 0; + memcpy(&v, &p->buf[p->pos], sizeof(v)); + p->pos += sizeof(v); + return v; +} + +SINT8 P_ReadSINT8(save_t *p) +{ + SINT8 v; + if (p->pos + sizeof(v) > p->size) + return 0; + memcpy(&v, &p->buf[p->pos], sizeof(v)); + p->pos += sizeof(v); + return v; +} + +UINT16 P_ReadUINT16(save_t *p) +{ + UINT16 v; + if (p->pos + sizeof(v) > p->size) + return 0; + memcpy(&v, &p->buf[p->pos], sizeof(v)); + p->pos += sizeof(v); + return v; +} + +INT16 P_ReadINT16(save_t *p) +{ + INT16 v; + if (p->pos + sizeof(v) > p->size) + return 0; + memcpy(&v, &p->buf[p->pos], sizeof(v)); + p->pos += sizeof(v); + return v; +} + +UINT32 P_ReadUINT32(save_t *p) +{ + UINT32 v; + if (p->pos + sizeof(v) > p->size) + return 0; + memcpy(&v, &p->buf[p->pos], sizeof(v)); + p->pos += sizeof(v); + return v; +} + +INT32 P_ReadINT32(save_t *p) +{ + INT32 v; + if (p->pos + sizeof(v) > p->size) + return 0; + memcpy(&v, &p->buf[p->pos], sizeof(v)); + p->pos += sizeof(v); + return v; +} + +char P_ReadChar(save_t *p) +{ + char v; + if (p->pos + sizeof(v) > p->size) + return 0; + memcpy(&v, &p->buf[p->pos], sizeof(v)); + p->pos += sizeof(v); + return v; +} + +fixed_t P_ReadFixed(save_t *p) +{ + fixed_t v; + if (p->pos + sizeof(v) > p->size) + return 0; + memcpy(&v, &p->buf[p->pos], sizeof(v)); + p->pos += sizeof(v); + return v; +} + +angle_t P_ReadAngle(save_t *p) +{ + angle_t v; + if (p->pos + sizeof(v) > p->size) + return 0; + memcpy(&v, &p->buf[p->pos], sizeof(v)); + p->pos += sizeof(v); + return v; +} + +void P_ReadStringN(save_t *p, char *s, size_t n) +{ + size_t i; + for (i = 0; p->pos < p->size && i < n && (s[i] = P_ReadChar(p)) != '\0'; i++); + s[i] = '\0'; +} + +void P_ReadStringL(save_t *p, char *s, size_t n) +{ + P_ReadStringN(p, s, n - 1); +} + +void P_ReadString(save_t *p, char *s) +{ + P_ReadStringN(p, s, SIZE_MAX); +} + +void P_ReadMem(save_t *p, void *s, size_t n) +{ + if (p->pos + n > p->size) + return; + memcpy(s, &p->buf[p->pos], n); + p->pos += n; +} // Block UINT32s to attempt to ensure that the correct data is // being sent and received @@ -62,7 +301,7 @@ typedef enum DRONE = 0x80, } player_saveflags; -static inline void P_ArchivePlayer(void) +static inline void P_ArchivePlayer(save_t *save_p) { const player_t *player = &players[consoleplayer]; SINT8 pllives = player->lives; @@ -72,32 +311,32 @@ static inline void P_ArchivePlayer(void) #ifdef NEWSKINSAVES // Write a specific value into the old skininfo location. // If we read something other than this, it's an older save file that used skin numbers. - WRITEUINT16(save_p, NEWSKINSAVES); + P_WriteUINT16(save_p, NEWSKINSAVES); #endif // Write skin names, so that loading skins in different orders // doesn't change who the save file is for! - WRITESTRINGN(save_p, skins[player->skin]->name, SKINNAMESIZE); + P_WriteStringN(save_p, skins[player->skin]->name, SKINNAMESIZE); if (botskin != 0) { - WRITESTRINGN(save_p, skins[botskin-1]->name, SKINNAMESIZE); + P_WriteStringN(save_p, skins[botskin-1]->name, SKINNAMESIZE); } else { - WRITESTRINGN(save_p, "\0", SKINNAMESIZE); + P_WriteStringN(save_p, "\0", SKINNAMESIZE); } - WRITEUINT8(save_p, numgameovers); - WRITESINT8(save_p, pllives); - WRITEUINT32(save_p, player->score); - WRITEINT32(save_p, player->continues); + P_WriteUINT8(save_p, numgameovers); + P_WriteSINT8(save_p, pllives); + P_WriteUINT32(save_p, player->score); + P_WriteINT32(save_p, player->continues); } -static inline void P_UnArchivePlayer(void) +static inline void P_UnArchivePlayer(save_t *save_p) { #ifdef NEWSKINSAVES - INT16 backwardsCompat = READUINT16(save_p); + INT16 backwardsCompat = P_ReadUINT16(save_p); if (backwardsCompat != NEWSKINSAVES) { @@ -111,30 +350,30 @@ static inline void P_UnArchivePlayer(void) char ourSkinName[SKINNAMESIZE+1]; char botSkinName[SKINNAMESIZE+1]; - READSTRINGN(save_p, ourSkinName, SKINNAMESIZE); + P_ReadStringN(save_p, ourSkinName, SKINNAMESIZE); savedata.skin = R_SkinAvailable(ourSkinName); - READSTRINGN(save_p, botSkinName, SKINNAMESIZE); + P_ReadStringN(save_p, botSkinName, SKINNAMESIZE); savedata.botskin = R_SkinAvailable(botSkinName) + 1; } - savedata.numgameovers = READUINT8(save_p); - savedata.lives = READSINT8(save_p); - savedata.score = READUINT32(save_p); - savedata.continues = READINT32(save_p); + savedata.numgameovers = P_ReadUINT8(save_p); + savedata.lives = P_ReadSINT8(save_p); + savedata.score = P_ReadUINT32(save_p); + savedata.continues = P_ReadINT32(save_p); } -static void P_NetArchivePlayers(void) +static void P_NetArchivePlayers(save_t *save_p) { INT32 i, j; UINT16 flags; // size_t q; - WRITEUINT32(save_p, ARCHIVEBLOCK_PLAYERS); + P_WriteUINT32(save_p, ARCHIVEBLOCK_PLAYERS); for (i = 0; i < MAXPLAYERS; i++) { - WRITESINT8(save_p, (SINT8)adminplayers[i]); + P_WriteSINT8(save_p, (SINT8)adminplayers[i]); if (!playeringame[i]) continue; @@ -143,142 +382,142 @@ static void P_NetArchivePlayers(void) // no longer send ticcmds - WRITESTRINGN(save_p, player_names[i], MAXPLAYERNAME); - WRITEINT16(save_p, players[i].angleturn); - WRITEINT16(save_p, players[i].oldrelangleturn); - WRITEANGLE(save_p, players[i].aiming); - WRITEANGLE(save_p, players[i].drawangle); - WRITEANGLE(save_p, players[i].viewrollangle); - WRITEANGLE(save_p, players[i].awayviewaiming); - WRITEINT32(save_p, players[i].awayviewtics); - WRITEINT16(save_p, players[i].rings); - WRITEINT16(save_p, players[i].spheres); + P_WriteStringN(save_p, player_names[i], MAXPLAYERNAME); + P_WriteINT16(save_p, players[i].angleturn); + P_WriteINT16(save_p, players[i].oldrelangleturn); + P_WriteAngle(save_p, players[i].aiming); + P_WriteAngle(save_p, players[i].drawangle); + P_WriteAngle(save_p, players[i].viewrollangle); + P_WriteAngle(save_p, players[i].awayviewaiming); + P_WriteINT32(save_p, players[i].awayviewtics); + P_WriteINT16(save_p, players[i].rings); + P_WriteINT16(save_p, players[i].spheres); - WRITESINT8(save_p, players[i].pity); - WRITEINT32(save_p, players[i].currentweapon); - WRITEINT32(save_p, players[i].ringweapons); + P_WriteSINT8(save_p, players[i].pity); + P_WriteINT32(save_p, players[i].currentweapon); + P_WriteINT32(save_p, players[i].ringweapons); - WRITEUINT16(save_p, players[i].ammoremoval); - WRITEUINT32(save_p, players[i].ammoremovaltimer); - WRITEINT32(save_p, players[i].ammoremovaltimer); + P_WriteUINT16(save_p, players[i].ammoremoval); + P_WriteUINT32(save_p, players[i].ammoremovaltimer); + P_WriteINT32(save_p, players[i].ammoremovaltimer); for (j = 0; j < NUMPOWERS; j++) - WRITEUINT16(save_p, players[i].powers[j]); + P_WriteUINT16(save_p, players[i].powers[j]); - WRITEUINT8(save_p, players[i].playerstate); - WRITEUINT32(save_p, players[i].pflags); - WRITEUINT8(save_p, players[i].panim); - WRITEUINT8(save_p, players[i].stronganim); - WRITEUINT8(save_p, players[i].spectator); - WRITEUINT8(save_p, players[i].muted); + P_WriteUINT8(save_p, players[i].playerstate); + P_WriteUINT32(save_p, players[i].pflags); + P_WriteUINT8(save_p, players[i].panim); + P_WriteUINT8(save_p, players[i].stronganim); + P_WriteUINT8(save_p, players[i].spectator); + P_WriteUINT8(save_p, players[i].muted); - WRITEUINT16(save_p, players[i].flashpal); - WRITEUINT16(save_p, players[i].flashcount); + P_WriteUINT16(save_p, players[i].flashpal); + P_WriteUINT16(save_p, players[i].flashcount); - WRITEUINT16(save_p, players[i].skincolor); - WRITEINT32(save_p, players[i].skin); - WRITEUINT32(save_p, players[i].availabilities); - WRITEUINT32(save_p, players[i].score); - WRITEUINT32(save_p, players[i].recordscore); - WRITEFIXED(save_p, players[i].dashspeed); - WRITESINT8(save_p, players[i].lives); - WRITESINT8(save_p, players[i].continues); - WRITESINT8(save_p, players[i].xtralife); - WRITEUINT8(save_p, players[i].gotcontinue); - WRITEFIXED(save_p, players[i].speed); - WRITEUINT8(save_p, players[i].secondjump); - WRITEUINT8(save_p, players[i].fly1); - WRITEUINT8(save_p, players[i].scoreadd); - WRITEUINT32(save_p, players[i].glidetime); - WRITEUINT8(save_p, players[i].climbing); - WRITEINT32(save_p, players[i].deadtimer); - WRITEUINT32(save_p, players[i].exiting); - WRITEUINT8(save_p, players[i].homing); - WRITEUINT32(save_p, players[i].dashmode); - WRITEUINT32(save_p, players[i].skidtime); + P_WriteUINT16(save_p, players[i].skincolor); + P_WriteINT32(save_p, players[i].skin); + P_WriteUINT32(save_p, players[i].availabilities); + P_WriteUINT32(save_p, players[i].score); + P_WriteUINT32(save_p, players[i].recordscore); + P_WriteFixed(save_p, players[i].dashspeed); + P_WriteSINT8(save_p, players[i].lives); + P_WriteSINT8(save_p, players[i].continues); + P_WriteSINT8(save_p, players[i].xtralife); + P_WriteUINT8(save_p, players[i].gotcontinue); + P_WriteFixed(save_p, players[i].speed); + P_WriteUINT8(save_p, players[i].secondjump); + P_WriteUINT8(save_p, players[i].fly1); + P_WriteUINT8(save_p, players[i].scoreadd); + P_WriteUINT32(save_p, players[i].glidetime); + P_WriteUINT8(save_p, players[i].climbing); + P_WriteINT32(save_p, players[i].deadtimer); + P_WriteUINT32(save_p, players[i].exiting); + P_WriteUINT8(save_p, players[i].homing); + P_WriteUINT32(save_p, players[i].dashmode); + P_WriteUINT32(save_p, players[i].skidtime); ////////// // Bots // ////////// - WRITEUINT8(save_p, players[i].bot); - WRITEUINT8(save_p, players[i].botmem.lastForward); - WRITEUINT8(save_p, players[i].botmem.lastBlocked); - WRITEUINT8(save_p, players[i].botmem.catchup_tics); - WRITEUINT8(save_p, players[i].botmem.thinkstate); - WRITEUINT8(save_p, players[i].removing); + P_WriteUINT8(save_p, players[i].bot); + P_WriteUINT8(save_p, players[i].botmem.lastForward); + P_WriteUINT8(save_p, players[i].botmem.lastBlocked); + P_WriteUINT8(save_p, players[i].botmem.catchup_tics); + P_WriteUINT8(save_p, players[i].botmem.thinkstate); + P_WriteUINT8(save_p, players[i].removing); - WRITEUINT8(save_p, players[i].blocked); - WRITEUINT16(save_p, players[i].lastbuttons); + P_WriteUINT8(save_p, players[i].blocked); + P_WriteUINT16(save_p, players[i].lastbuttons); //////////////////////////// // Conveyor Belt Movement // //////////////////////////// - WRITEFIXED(save_p, players[i].cmomx); // Conveyor momx - WRITEFIXED(save_p, players[i].cmomy); // Conveyor momy - WRITEFIXED(save_p, players[i].rmomx); // "Real" momx (momx - cmomx) - WRITEFIXED(save_p, players[i].rmomy); // "Real" momy (momy - cmomy) + P_WriteFixed(save_p, players[i].cmomx); // Conveyor momx + P_WriteFixed(save_p, players[i].cmomy); // Conveyor momy + P_WriteFixed(save_p, players[i].rmomx); // "Real" momx (momx - cmomx) + P_WriteFixed(save_p, players[i].rmomy); // "Real" momy (momy - cmomy) ///////////////////// // Race Mode Stuff // ///////////////////// - WRITEINT16(save_p, players[i].numboxes); - WRITEINT16(save_p, players[i].totalring); - WRITEUINT32(save_p, players[i].realtime); - WRITEUINT8(save_p, players[i].laps); + P_WriteINT16(save_p, players[i].numboxes); + P_WriteINT16(save_p, players[i].totalring); + P_WriteUINT32(save_p, players[i].realtime); + P_WriteUINT8(save_p, players[i].laps); //////////////////// // CTF Mode Stuff // //////////////////// - WRITEINT32(save_p, players[i].ctfteam); - WRITEUINT16(save_p, players[i].gotflag); + P_WriteINT32(save_p, players[i].ctfteam); + P_WriteUINT16(save_p, players[i].gotflag); - WRITEINT32(save_p, players[i].weapondelay); - WRITEINT32(save_p, players[i].tossdelay); + P_WriteINT32(save_p, players[i].weapondelay); + P_WriteINT32(save_p, players[i].tossdelay); - WRITEUINT32(save_p, players[i].starposttime); - WRITEINT16(save_p, players[i].starpostx); - WRITEINT16(save_p, players[i].starposty); - WRITEINT16(save_p, players[i].starpostz); - WRITEINT32(save_p, players[i].starpostnum); - WRITEANGLE(save_p, players[i].starpostangle); - WRITEFIXED(save_p, players[i].starpostscale); + P_WriteUINT32(save_p, players[i].starposttime); + P_WriteINT16(save_p, players[i].starpostx); + P_WriteINT16(save_p, players[i].starposty); + P_WriteINT16(save_p, players[i].starpostz); + P_WriteINT32(save_p, players[i].starpostnum); + P_WriteAngle(save_p, players[i].starpostangle); + P_WriteFixed(save_p, players[i].starpostscale); - WRITEANGLE(save_p, players[i].angle_pos); - WRITEANGLE(save_p, players[i].old_angle_pos); + P_WriteAngle(save_p, players[i].angle_pos); + P_WriteAngle(save_p, players[i].old_angle_pos); - WRITEINT32(save_p, players[i].flyangle); - WRITEUINT32(save_p, players[i].drilltimer); - WRITEINT32(save_p, players[i].linkcount); - WRITEUINT32(save_p, players[i].linktimer); - WRITEINT32(save_p, players[i].anotherflyangle); - WRITEUINT32(save_p, players[i].nightstime); - WRITEUINT32(save_p, players[i].bumpertime); - WRITEINT32(save_p, players[i].drillmeter); - WRITEUINT8(save_p, players[i].drilldelay); - WRITEUINT8(save_p, players[i].bonustime); - WRITEFIXED(save_p, players[i].oldscale); - WRITEUINT8(save_p, players[i].mare); - WRITEUINT8(save_p, players[i].marelap); - WRITEUINT8(save_p, players[i].marebonuslap); - WRITEUINT32(save_p, players[i].marebegunat); - WRITEUINT32(save_p, players[i].lastmaretime); - WRITEUINT32(save_p, players[i].startedtime); - WRITEUINT32(save_p, players[i].finishedtime); - WRITEUINT32(save_p, players[i].lapbegunat); - WRITEUINT32(save_p, players[i].lapstartedtime); - WRITEINT16(save_p, players[i].finishedspheres); - WRITEINT16(save_p, players[i].finishedrings); - WRITEUINT32(save_p, players[i].marescore); - WRITEUINT32(save_p, players[i].lastmarescore); - WRITEUINT32(save_p, players[i].totalmarescore); - WRITEUINT8(save_p, players[i].lastmare); - WRITEUINT8(save_p, players[i].lastmarelap); - WRITEUINT8(save_p, players[i].lastmarebonuslap); - WRITEUINT8(save_p, players[i].totalmarelap); - WRITEUINT8(save_p, players[i].totalmarebonuslap); - WRITEINT32(save_p, players[i].maxlink); - WRITEUINT8(save_p, players[i].texttimer); - WRITEUINT8(save_p, players[i].textvar); + P_WriteINT32(save_p, players[i].flyangle); + P_WriteUINT32(save_p, players[i].drilltimer); + P_WriteINT32(save_p, players[i].linkcount); + P_WriteUINT32(save_p, players[i].linktimer); + P_WriteINT32(save_p, players[i].anotherflyangle); + P_WriteUINT32(save_p, players[i].nightstime); + P_WriteUINT32(save_p, players[i].bumpertime); + P_WriteINT32(save_p, players[i].drillmeter); + P_WriteUINT8(save_p, players[i].drilldelay); + P_WriteUINT8(save_p, players[i].bonustime); + P_WriteFixed(save_p, players[i].oldscale); + P_WriteUINT8(save_p, players[i].mare); + P_WriteUINT8(save_p, players[i].marelap); + P_WriteUINT8(save_p, players[i].marebonuslap); + P_WriteUINT32(save_p, players[i].marebegunat); + P_WriteUINT32(save_p, players[i].lastmaretime); + P_WriteUINT32(save_p, players[i].startedtime); + P_WriteUINT32(save_p, players[i].finishedtime); + P_WriteUINT32(save_p, players[i].lapbegunat); + P_WriteUINT32(save_p, players[i].lapstartedtime); + P_WriteINT16(save_p, players[i].finishedspheres); + P_WriteINT16(save_p, players[i].finishedrings); + P_WriteUINT32(save_p, players[i].marescore); + P_WriteUINT32(save_p, players[i].lastmarescore); + P_WriteUINT32(save_p, players[i].totalmarescore); + P_WriteUINT8(save_p, players[i].lastmare); + P_WriteUINT8(save_p, players[i].lastmarelap); + P_WriteUINT8(save_p, players[i].lastmarebonuslap); + P_WriteUINT8(save_p, players[i].totalmarelap); + P_WriteUINT8(save_p, players[i].totalmarebonuslap); + P_WriteINT32(save_p, players[i].maxlink); + P_WriteUINT8(save_p, players[i].texttimer); + P_WriteUINT8(save_p, players[i].textvar); if (players[i].capsule) flags |= CAPSULE; @@ -298,73 +537,73 @@ static void P_NetArchivePlayers(void) if (players[i].drone) flags |= DRONE; - WRITEINT16(save_p, players[i].lastsidehit); - WRITEINT16(save_p, players[i].lastlinehit); + P_WriteINT16(save_p, players[i].lastsidehit); + P_WriteINT16(save_p, players[i].lastlinehit); - WRITEUINT32(save_p, players[i].losstime); + P_WriteUINT32(save_p, players[i].losstime); - WRITEUINT8(save_p, players[i].timeshit); + P_WriteUINT8(save_p, players[i].timeshit); - WRITEINT32(save_p, players[i].onconveyor); + P_WriteINT32(save_p, players[i].onconveyor); - WRITEUINT32(save_p, players[i].jointime); - WRITEUINT32(save_p, players[i].quittime); + P_WriteUINT32(save_p, players[i].jointime); + P_WriteUINT32(save_p, players[i].quittime); - WRITEUINT16(save_p, flags); + P_WriteUINT16(save_p, flags); if (flags & CAPSULE) - WRITEUINT32(save_p, players[i].capsule->mobjnum); + P_WriteUINT32(save_p, players[i].capsule->mobjnum); if (flags & FIRSTAXIS) - WRITEUINT32(save_p, players[i].axis1->mobjnum); + P_WriteUINT32(save_p, players[i].axis1->mobjnum); if (flags & SECONDAXIS) - WRITEUINT32(save_p, players[i].axis2->mobjnum); + P_WriteUINT32(save_p, players[i].axis2->mobjnum); if (flags & AWAYVIEW) - WRITEUINT32(save_p, players[i].awayviewmobj->mobjnum); + P_WriteUINT32(save_p, players[i].awayviewmobj->mobjnum); if (flags & FOLLOW) - WRITEUINT32(save_p, players[i].followmobj->mobjnum); + P_WriteUINT32(save_p, players[i].followmobj->mobjnum); if (flags & DRONE) - WRITEUINT32(save_p, players[i].drone->mobjnum); + P_WriteUINT32(save_p, players[i].drone->mobjnum); - WRITEFIXED(save_p, players[i].camerascale); - WRITEFIXED(save_p, players[i].shieldscale); + P_WriteFixed(save_p, players[i].camerascale); + P_WriteFixed(save_p, players[i].shieldscale); - WRITEUINT8(save_p, players[i].charability); - WRITEUINT8(save_p, players[i].charability2); - WRITEUINT32(save_p, players[i].charflags); - WRITEUINT32(save_p, (UINT32)players[i].thokitem); - WRITEUINT32(save_p, (UINT32)players[i].spinitem); - WRITEUINT32(save_p, (UINT32)players[i].revitem); - WRITEUINT32(save_p, (UINT32)players[i].followitem); - WRITEFIXED(save_p, players[i].actionspd); - WRITEFIXED(save_p, players[i].mindash); - WRITEFIXED(save_p, players[i].maxdash); - WRITEFIXED(save_p, players[i].normalspeed); - WRITEFIXED(save_p, players[i].runspeed); - WRITEUINT8(save_p, players[i].thrustfactor); - WRITEUINT8(save_p, players[i].accelstart); - WRITEUINT8(save_p, players[i].acceleration); - WRITEFIXED(save_p, players[i].jumpfactor); - WRITEFIXED(save_p, players[i].height); - WRITEFIXED(save_p, players[i].spinheight); + P_WriteUINT8(save_p, players[i].charability); + P_WriteUINT8(save_p, players[i].charability2); + P_WriteUINT32(save_p, players[i].charflags); + P_WriteUINT32(save_p, (UINT32)players[i].thokitem); + P_WriteUINT32(save_p, (UINT32)players[i].spinitem); + P_WriteUINT32(save_p, (UINT32)players[i].revitem); + P_WriteUINT32(save_p, (UINT32)players[i].followitem); + P_WriteFixed(save_p, players[i].actionspd); + P_WriteFixed(save_p, players[i].mindash); + P_WriteFixed(save_p, players[i].maxdash); + P_WriteFixed(save_p, players[i].normalspeed); + P_WriteFixed(save_p, players[i].runspeed); + P_WriteUINT8(save_p, players[i].thrustfactor); + P_WriteUINT8(save_p, players[i].accelstart); + P_WriteUINT8(save_p, players[i].acceleration); + P_WriteFixed(save_p, players[i].jumpfactor); + P_WriteFixed(save_p, players[i].height); + P_WriteFixed(save_p, players[i].spinheight); } } -static void P_NetUnArchivePlayers(void) +static void P_NetUnArchivePlayers(save_t *save_p) { INT32 i, j; UINT16 flags; - if (READUINT32(save_p) != ARCHIVEBLOCK_PLAYERS) + if (P_ReadUINT32(save_p) != ARCHIVEBLOCK_PLAYERS) I_Error("Bad $$$.sav at archive block Players"); for (i = 0; i < MAXPLAYERS; i++) { - adminplayers[i] = (INT32)READSINT8(save_p); + adminplayers[i] = (INT32)P_ReadSINT8(save_p); // Do NOT memset player struct to 0 // other areas may initialize data elsewhere @@ -374,198 +613,198 @@ static void P_NetUnArchivePlayers(void) // NOTE: sending tics should (hopefully) no longer be necessary - READSTRINGN(save_p, player_names[i], MAXPLAYERNAME); - players[i].angleturn = READINT16(save_p); - players[i].oldrelangleturn = READINT16(save_p); - players[i].aiming = READANGLE(save_p); - players[i].drawangle = READANGLE(save_p); - players[i].viewrollangle = READANGLE(save_p); - players[i].awayviewaiming = READANGLE(save_p); - players[i].awayviewtics = READINT32(save_p); - players[i].rings = READINT16(save_p); - players[i].spheres = READINT16(save_p); + P_ReadStringN(save_p, player_names[i], MAXPLAYERNAME); + players[i].angleturn = P_ReadINT16(save_p); + players[i].oldrelangleturn = P_ReadINT16(save_p); + players[i].aiming = P_ReadAngle(save_p); + players[i].drawangle = P_ReadAngle(save_p); + players[i].viewrollangle = P_ReadAngle(save_p); + players[i].awayviewaiming = P_ReadAngle(save_p); + players[i].awayviewtics = P_ReadINT32(save_p); + players[i].rings = P_ReadINT16(save_p); + players[i].spheres = P_ReadINT16(save_p); - players[i].pity = READSINT8(save_p); - players[i].currentweapon = READINT32(save_p); - players[i].ringweapons = READINT32(save_p); + players[i].pity = P_ReadSINT8(save_p); + players[i].currentweapon = P_ReadINT32(save_p); + players[i].ringweapons = P_ReadINT32(save_p); - players[i].ammoremoval = READUINT16(save_p); - players[i].ammoremovaltimer = READUINT32(save_p); - players[i].ammoremovalweapon = READINT32(save_p); + players[i].ammoremoval = P_ReadUINT16(save_p); + players[i].ammoremovaltimer = P_ReadUINT32(save_p); + players[i].ammoremovalweapon = P_ReadINT32(save_p); for (j = 0; j < NUMPOWERS; j++) - players[i].powers[j] = READUINT16(save_p); + players[i].powers[j] = P_ReadUINT16(save_p); - players[i].playerstate = READUINT8(save_p); - players[i].pflags = READUINT32(save_p); - players[i].panim = READUINT8(save_p); - players[i].stronganim = READUINT8(save_p); - players[i].spectator = READUINT8(save_p); - players[i].muted = READUINT8(save_p); + players[i].playerstate = P_ReadUINT8(save_p); + players[i].pflags = P_ReadUINT32(save_p); + players[i].panim = P_ReadUINT8(save_p); + players[i].stronganim = P_ReadUINT8(save_p); + players[i].spectator = P_ReadUINT8(save_p); + players[i].muted = P_ReadUINT8(save_p); - players[i].flashpal = READUINT16(save_p); - players[i].flashcount = READUINT16(save_p); + players[i].flashpal = P_ReadUINT16(save_p); + players[i].flashcount = P_ReadUINT16(save_p); - players[i].skincolor = READUINT16(save_p); - players[i].skin = READINT32(save_p); - players[i].availabilities = READUINT32(save_p); - players[i].score = READUINT32(save_p); - players[i].recordscore = READUINT32(save_p); - players[i].dashspeed = READFIXED(save_p); // dashing speed - players[i].lives = READSINT8(save_p); - players[i].continues = READSINT8(save_p); // continues that player has acquired - players[i].xtralife = READSINT8(save_p); // Ring Extra Life counter - players[i].gotcontinue = READUINT8(save_p); // got continue from stage - players[i].speed = READFIXED(save_p); // Player's speed (distance formula of MOMX and MOMY values) - players[i].secondjump = READUINT8(save_p); - players[i].fly1 = READUINT8(save_p); // Tails flying - players[i].scoreadd = READUINT8(save_p); // Used for multiple enemy attack bonus - players[i].glidetime = READUINT32(save_p); // Glide counter for thrust - players[i].climbing = READUINT8(save_p); // Climbing on the wall - players[i].deadtimer = READINT32(save_p); // End game if game over lasts too long - players[i].exiting = READUINT32(save_p); // Exitlevel timer - players[i].homing = READUINT8(save_p); // Are you homing? - players[i].dashmode = READUINT32(save_p); // counter for dashmode ability - players[i].skidtime = READUINT32(save_p); // Skid timer + players[i].skincolor = P_ReadUINT16(save_p); + players[i].skin = P_ReadINT32(save_p); + players[i].availabilities = P_ReadUINT32(save_p); + players[i].score = P_ReadUINT32(save_p); + players[i].recordscore = P_ReadUINT32(save_p); + players[i].dashspeed = P_ReadFixed(save_p); // dashing speed + players[i].lives = P_ReadSINT8(save_p); + players[i].continues = P_ReadSINT8(save_p); // continues that player has acquired + players[i].xtralife = P_ReadSINT8(save_p); // Ring Extra Life counter + players[i].gotcontinue = P_ReadUINT8(save_p); // got continue from stage + players[i].speed = P_ReadFixed(save_p); // Player's speed (distance formula of MOMX and MOMY values) + players[i].secondjump = P_ReadUINT8(save_p); + players[i].fly1 = P_ReadUINT8(save_p); // Tails flying + players[i].scoreadd = P_ReadUINT8(save_p); // Used for multiple enemy attack bonus + players[i].glidetime = P_ReadUINT32(save_p); // Glide counter for thrust + players[i].climbing = P_ReadUINT8(save_p); // Climbing on the wall + players[i].deadtimer = P_ReadINT32(save_p); // End game if game over lasts too long + players[i].exiting = P_ReadUINT32(save_p); // Exitlevel timer + players[i].homing = P_ReadUINT8(save_p); // Are you homing? + players[i].dashmode = P_ReadUINT32(save_p); // counter for dashmode ability + players[i].skidtime = P_ReadUINT32(save_p); // Skid timer ////////// // Bots // ////////// - players[i].bot = READUINT8(save_p); + players[i].bot = P_ReadUINT8(save_p); - players[i].botmem.lastForward = READUINT8(save_p); - players[i].botmem.lastBlocked = READUINT8(save_p); - players[i].botmem.catchup_tics = READUINT8(save_p); - players[i].botmem.thinkstate = READUINT8(save_p); - players[i].removing = READUINT8(save_p); + players[i].botmem.lastForward = P_ReadUINT8(save_p); + players[i].botmem.lastBlocked = P_ReadUINT8(save_p); + players[i].botmem.catchup_tics = P_ReadUINT8(save_p); + players[i].botmem.thinkstate = P_ReadUINT8(save_p); + players[i].removing = P_ReadUINT8(save_p); - players[i].blocked = READUINT8(save_p); - players[i].lastbuttons = READUINT16(save_p); + players[i].blocked = P_ReadUINT8(save_p); + players[i].lastbuttons = P_ReadUINT16(save_p); //////////////////////////// // Conveyor Belt Movement // //////////////////////////// - players[i].cmomx = READFIXED(save_p); // Conveyor momx - players[i].cmomy = READFIXED(save_p); // Conveyor momy - players[i].rmomx = READFIXED(save_p); // "Real" momx (momx - cmomx) - players[i].rmomy = READFIXED(save_p); // "Real" momy (momy - cmomy) + players[i].cmomx = P_ReadFixed(save_p); // Conveyor momx + players[i].cmomy = P_ReadFixed(save_p); // Conveyor momy + players[i].rmomx = P_ReadFixed(save_p); // "Real" momx (momx - cmomx) + players[i].rmomy = P_ReadFixed(save_p); // "Real" momy (momy - cmomy) ///////////////////// // Race Mode Stuff // ///////////////////// - players[i].numboxes = READINT16(save_p); // Number of item boxes obtained for Race Mode - players[i].totalring = READINT16(save_p); // Total number of rings obtained for Race Mode - players[i].realtime = READUINT32(save_p); // integer replacement for leveltime - players[i].laps = READUINT8(save_p); // Number of laps (optional) + players[i].numboxes = P_ReadINT16(save_p); // Number of item boxes obtained for Race Mode + players[i].totalring = P_ReadINT16(save_p); // Total number of rings obtained for Race Mode + players[i].realtime = P_ReadUINT32(save_p); // integer replacement for leveltime + players[i].laps = P_ReadUINT8(save_p); // Number of laps (optional) //////////////////// // CTF Mode Stuff // //////////////////// - players[i].ctfteam = READINT32(save_p); // 1 == Red, 2 == Blue - players[i].gotflag = READUINT16(save_p); // 1 == Red, 2 == Blue Do you have the flag? + players[i].ctfteam = P_ReadINT32(save_p); // 1 == Red, 2 == Blue + players[i].gotflag = P_ReadUINT16(save_p); // 1 == Red, 2 == Blue Do you have the flag? - players[i].weapondelay = READINT32(save_p); - players[i].tossdelay = READINT32(save_p); + players[i].weapondelay = P_ReadINT32(save_p); + players[i].tossdelay = P_ReadINT32(save_p); - players[i].starposttime = READUINT32(save_p); - players[i].starpostx = READINT16(save_p); - players[i].starposty = READINT16(save_p); - players[i].starpostz = READINT16(save_p); - players[i].starpostnum = READINT32(save_p); - players[i].starpostangle = READANGLE(save_p); - players[i].starpostscale = READFIXED(save_p); + players[i].starposttime = P_ReadUINT32(save_p); + players[i].starpostx = P_ReadINT16(save_p); + players[i].starposty = P_ReadINT16(save_p); + players[i].starpostz = P_ReadINT16(save_p); + players[i].starpostnum = P_ReadINT32(save_p); + players[i].starpostangle = P_ReadAngle(save_p); + players[i].starpostscale = P_ReadFixed(save_p); - players[i].angle_pos = READANGLE(save_p); - players[i].old_angle_pos = READANGLE(save_p); + players[i].angle_pos = P_ReadAngle(save_p); + players[i].old_angle_pos = P_ReadAngle(save_p); - players[i].flyangle = READINT32(save_p); - players[i].drilltimer = READUINT32(save_p); - players[i].linkcount = READINT32(save_p); - players[i].linktimer = READUINT32(save_p); - players[i].anotherflyangle = READINT32(save_p); - players[i].nightstime = READUINT32(save_p); - players[i].bumpertime = READUINT32(save_p); - players[i].drillmeter = READINT32(save_p); - players[i].drilldelay = READUINT8(save_p); - players[i].bonustime = (boolean)READUINT8(save_p); - players[i].oldscale = READFIXED(save_p); - players[i].mare = READUINT8(save_p); - players[i].marelap = READUINT8(save_p); - players[i].marebonuslap = READUINT8(save_p); - players[i].marebegunat = READUINT32(save_p); - players[i].lastmaretime = READUINT32(save_p); - players[i].startedtime = READUINT32(save_p); - players[i].finishedtime = READUINT32(save_p); - players[i].lapbegunat = READUINT32(save_p); - players[i].lapstartedtime = READUINT32(save_p); - players[i].finishedspheres = READINT16(save_p); - players[i].finishedrings = READINT16(save_p); - players[i].marescore = READUINT32(save_p); - players[i].lastmarescore = READUINT32(save_p); - players[i].totalmarescore = READUINT32(save_p); - players[i].lastmare = READUINT8(save_p); - players[i].lastmarelap = READUINT8(save_p); - players[i].lastmarebonuslap = READUINT8(save_p); - players[i].totalmarelap = READUINT8(save_p); - players[i].totalmarebonuslap = READUINT8(save_p); - players[i].maxlink = READINT32(save_p); - players[i].texttimer = READUINT8(save_p); - players[i].textvar = READUINT8(save_p); + players[i].flyangle = P_ReadINT32(save_p); + players[i].drilltimer = P_ReadUINT32(save_p); + players[i].linkcount = P_ReadINT32(save_p); + players[i].linktimer = P_ReadUINT32(save_p); + players[i].anotherflyangle = P_ReadINT32(save_p); + players[i].nightstime = P_ReadUINT32(save_p); + players[i].bumpertime = P_ReadUINT32(save_p); + players[i].drillmeter = P_ReadINT32(save_p); + players[i].drilldelay = P_ReadUINT8(save_p); + players[i].bonustime = (boolean)P_ReadUINT8(save_p); + players[i].oldscale = P_ReadFixed(save_p); + players[i].mare = P_ReadUINT8(save_p); + players[i].marelap = P_ReadUINT8(save_p); + players[i].marebonuslap = P_ReadUINT8(save_p); + players[i].marebegunat = P_ReadUINT32(save_p); + players[i].lastmaretime = P_ReadUINT32(save_p); + players[i].startedtime = P_ReadUINT32(save_p); + players[i].finishedtime = P_ReadUINT32(save_p); + players[i].lapbegunat = P_ReadUINT32(save_p); + players[i].lapstartedtime = P_ReadUINT32(save_p); + players[i].finishedspheres = P_ReadINT16(save_p); + players[i].finishedrings = P_ReadINT16(save_p); + players[i].marescore = P_ReadUINT32(save_p); + players[i].lastmarescore = P_ReadUINT32(save_p); + players[i].totalmarescore = P_ReadUINT32(save_p); + players[i].lastmare = P_ReadUINT8(save_p); + players[i].lastmarelap = P_ReadUINT8(save_p); + players[i].lastmarebonuslap = P_ReadUINT8(save_p); + players[i].totalmarelap = P_ReadUINT8(save_p); + players[i].totalmarebonuslap = P_ReadUINT8(save_p); + players[i].maxlink = P_ReadINT32(save_p); + players[i].texttimer = P_ReadUINT8(save_p); + players[i].textvar = P_ReadUINT8(save_p); - players[i].lastsidehit = READINT16(save_p); - players[i].lastlinehit = READINT16(save_p); + players[i].lastsidehit = P_ReadINT16(save_p); + players[i].lastlinehit = P_ReadINT16(save_p); - players[i].losstime = READUINT32(save_p); + players[i].losstime = P_ReadUINT32(save_p); - players[i].timeshit = READUINT8(save_p); + players[i].timeshit = P_ReadUINT8(save_p); - players[i].onconveyor = READINT32(save_p); + players[i].onconveyor = P_ReadINT32(save_p); - players[i].jointime = READUINT32(save_p); - players[i].quittime = READUINT32(save_p); + players[i].jointime = P_ReadUINT32(save_p); + players[i].quittime = P_ReadUINT32(save_p); - flags = READUINT16(save_p); + flags = P_ReadUINT16(save_p); if (flags & CAPSULE) - players[i].capsule = (mobj_t *)(size_t)READUINT32(save_p); + players[i].capsule = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (flags & FIRSTAXIS) - players[i].axis1 = (mobj_t *)(size_t)READUINT32(save_p); + players[i].axis1 = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (flags & SECONDAXIS) - players[i].axis2 = (mobj_t *)(size_t)READUINT32(save_p); + players[i].axis2 = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (flags & AWAYVIEW) - players[i].awayviewmobj = (mobj_t *)(size_t)READUINT32(save_p); + players[i].awayviewmobj = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (flags & FOLLOW) - players[i].followmobj = (mobj_t *)(size_t)READUINT32(save_p); + players[i].followmobj = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (flags & DRONE) - players[i].drone = (mobj_t *)(size_t)READUINT32(save_p); + players[i].drone = (mobj_t *)(size_t)P_ReadUINT32(save_p); - players[i].camerascale = READFIXED(save_p); - players[i].shieldscale = READFIXED(save_p); + players[i].camerascale = P_ReadFixed(save_p); + players[i].shieldscale = P_ReadFixed(save_p); //SetPlayerSkinByNum(i, players[i].skin); - players[i].charability = READUINT8(save_p); - players[i].charability2 = READUINT8(save_p); - players[i].charflags = READUINT32(save_p); - players[i].thokitem = (mobjtype_t)READUINT32(save_p); - players[i].spinitem = (mobjtype_t)READUINT32(save_p); - players[i].revitem = (mobjtype_t)READUINT32(save_p); - players[i].followitem = (mobjtype_t)READUINT32(save_p); - players[i].actionspd = READFIXED(save_p); - players[i].mindash = READFIXED(save_p); - players[i].maxdash = READFIXED(save_p); - players[i].normalspeed = READFIXED(save_p); - players[i].runspeed = READFIXED(save_p); - players[i].thrustfactor = READUINT8(save_p); - players[i].accelstart = READUINT8(save_p); - players[i].acceleration = READUINT8(save_p); - players[i].jumpfactor = READFIXED(save_p); - players[i].height = READFIXED(save_p); - players[i].spinheight = READFIXED(save_p); + players[i].charability = P_ReadUINT8(save_p); + players[i].charability2 = P_ReadUINT8(save_p); + players[i].charflags = P_ReadUINT32(save_p); + players[i].thokitem = (mobjtype_t)P_ReadUINT32(save_p); + players[i].spinitem = (mobjtype_t)P_ReadUINT32(save_p); + players[i].revitem = (mobjtype_t)P_ReadUINT32(save_p); + players[i].followitem = (mobjtype_t)P_ReadUINT32(save_p); + players[i].actionspd = P_ReadFixed(save_p); + players[i].mindash = P_ReadFixed(save_p); + players[i].maxdash = P_ReadFixed(save_p); + players[i].normalspeed = P_ReadFixed(save_p); + players[i].runspeed = P_ReadFixed(save_p); + players[i].thrustfactor = P_ReadUINT8(save_p); + players[i].accelstart = P_ReadUINT8(save_p); + players[i].acceleration = P_ReadUINT8(save_p); + players[i].jumpfactor = P_ReadFixed(save_p); + players[i].height = P_ReadFixed(save_p); + players[i].spinheight = P_ReadFixed(save_p); players[i].viewheight = 41*players[i].height/48; // scale cannot be factored in at this point } @@ -668,12 +907,12 @@ static void ClearNetColormaps(void) net_colormaps = NULL; } -static void P_NetArchiveColormaps(void) +static void P_NetArchiveColormaps(save_t *save_p) { // We save and then we clean up our colormap mess extracolormap_t *exc, *exc_next; UINT32 i = 0; - WRITEUINT32(save_p, num_net_colormaps); // save for safety + P_WriteUINT32(save_p, num_net_colormaps); // save for safety for (exc = net_colormaps; i < num_net_colormaps; i++, exc = exc_next) { @@ -682,15 +921,15 @@ static void P_NetArchiveColormaps(void) if (!exc) exc = R_CreateDefaultColormap(false); - WRITEUINT8(save_p, exc->fadestart); - WRITEUINT8(save_p, exc->fadeend); - WRITEUINT8(save_p, exc->flags); + P_WriteUINT8(save_p, exc->fadestart); + P_WriteUINT8(save_p, exc->fadeend); + P_WriteUINT8(save_p, exc->flags); - WRITEINT32(save_p, exc->rgba); - WRITEINT32(save_p, exc->fadergba); + P_WriteINT32(save_p, exc->rgba); + P_WriteINT32(save_p, exc->fadergba); #ifdef EXTRACOLORMAPLUMPS - WRITESTRINGN(save_p, exc->lumpname, 9); + P_WriteStringN(save_p, exc->lumpname, 9); #endif exc_next = exc->next; @@ -702,7 +941,7 @@ static void P_NetArchiveColormaps(void) net_colormaps = NULL; } -static void P_NetUnArchiveColormaps(void) +static void P_NetUnArchiveColormaps(save_t *save_p) { // When we reach this point, we already populated our list with // dummy colormaps. Now that we are loading the color data, @@ -710,7 +949,7 @@ static void P_NetUnArchiveColormaps(void) extracolormap_t *exc, *existing_exc, *exc_next = NULL; UINT32 i = 0; - num_net_colormaps = READUINT32(save_p); + num_net_colormaps = P_ReadUINT32(save_p); for (exc = net_colormaps; i < num_net_colormaps; i++, exc = exc_next) { @@ -720,15 +959,15 @@ static void P_NetUnArchiveColormaps(void) char lumpname[9]; #endif - fadestart = READUINT8(save_p); - fadeend = READUINT8(save_p); - flags = READUINT8(save_p); + fadestart = P_ReadUINT8(save_p); + fadeend = P_ReadUINT8(save_p); + flags = P_ReadUINT8(save_p); - rgba = READINT32(save_p); - fadergba = READINT32(save_p); + rgba = P_ReadINT32(save_p); + fadergba = P_ReadINT32(save_p); #ifdef EXTRACOLORMAPLUMPS - READSTRINGN(save_p, lumpname, 9); + P_ReadStringN(save_p, lumpname, 9); if (lumpname[0]) { @@ -804,29 +1043,29 @@ static void P_NetUnArchiveColormaps(void) net_colormaps = NULL; } -static void P_NetArchiveWaypoints(void) +static void P_NetArchiveWaypoints(save_t *save_p) { INT32 i, j; for (i = 0; i < NUMWAYPOINTSEQUENCES; i++) { - WRITEUINT16(save_p, numwaypoints[i]); + P_WriteUINT16(save_p, numwaypoints[i]); for (j = 0; j < numwaypoints[i]; j++) - WRITEUINT32(save_p, waypoints[i][j] ? waypoints[i][j]->mobjnum : 0); + P_WriteUINT32(save_p, waypoints[i][j] ? waypoints[i][j]->mobjnum : 0); } } -static void P_NetUnArchiveWaypoints(void) +static void P_NetUnArchiveWaypoints(save_t *save_p) { INT32 i, j; UINT32 mobjnum; for (i = 0; i < NUMWAYPOINTSEQUENCES; i++) { - numwaypoints[i] = READUINT16(save_p); + numwaypoints[i] = P_ReadUINT16(save_p); for (j = 0; j < numwaypoints[i]; j++) { - mobjnum = READUINT32(save_p); + mobjnum = P_ReadUINT32(save_p); waypoints[i][j] = (mobjnum == 0) ? NULL : P_FindNewPosition(mobjnum); } } @@ -973,7 +1212,7 @@ static boolean CheckFFloorDiff(const sector_t *ss) // Special case: save the stats of all modified ffloors along with their ffloor "number"s // we don't bother with ffloors that haven't changed, that would just add to savegame even more than is really needed -static void ArchiveFFloors(const sector_t *ss) +static void ArchiveFFloors(save_t *save_p, const sector_t *ss) { size_t j = 0; // ss->ffloors is saved as ffloor #0, ss->ffloors->next is #1, etc ffloor_t *rover; @@ -988,19 +1227,19 @@ static void ArchiveFFloors(const sector_t *ss) if (fflr_diff) { - WRITEUINT16(save_p, j); // save ffloor "number" - WRITEUINT8(save_p, fflr_diff); + P_WriteUINT16(save_p, j); // save ffloor "number" + P_WriteUINT8(save_p, fflr_diff); if (fflr_diff & FD_FLAGS) - WRITEUINT32(save_p, rover->fofflags); + P_WriteUINT32(save_p, rover->fofflags); if (fflr_diff & FD_ALPHA) - WRITEINT16(save_p, rover->alpha); + P_WriteINT16(save_p, rover->alpha); } j++; } - WRITEUINT16(save_p, 0xffff); + P_WriteUINT16(save_p, 0xffff); } -static void UnArchiveFFloors(const sector_t *ss) +static void UnArchiveFFloors(save_t *save_p, const sector_t *ss) { UINT16 j = 0; // number of current ffloor in loop UINT16 fflr_i; // saved ffloor "number" of next modified ffloor @@ -1011,7 +1250,7 @@ static void UnArchiveFFloors(const sector_t *ss) if (!rover) // it is assumed sectors[i].ffloors actually exists, but just in case... I_Error("Sector does not have any ffloors!"); - fflr_i = READUINT16(save_p); // get first modified ffloor's number ready + fflr_i = P_ReadUINT16(save_p); // get first modified ffloor's number ready for (;;) // for some reason the usual for (rover = x; ...) thing doesn't work here? { if (fflr_i == 0xffff) // end of modified ffloors list, let's stop already @@ -1026,21 +1265,21 @@ static void UnArchiveFFloors(const sector_t *ss) continue; } - fflr_diff = READUINT8(save_p); + fflr_diff = P_ReadUINT8(save_p); if (fflr_diff & FD_FLAGS) - rover->fofflags = READUINT32(save_p); + rover->fofflags = P_ReadUINT32(save_p); if (fflr_diff & FD_ALPHA) - rover->alpha = READINT16(save_p); + rover->alpha = P_ReadINT16(save_p); - fflr_i = READUINT16(save_p); // get next ffloor "number" ready + fflr_i = P_ReadUINT16(save_p); // get next ffloor "number" ready j++; rover = rover->next; } } -static void ArchiveSectors(void) +static void ArchiveSectors(save_t *save_p) { size_t i, j; const sector_t *ss = sectors; @@ -1134,102 +1373,102 @@ static void ArchiveSectors(void) if (diff) { - WRITEUINT32(save_p, i); - WRITEUINT8(save_p, diff); + P_WriteUINT32(save_p, i); + P_WriteUINT8(save_p, diff); if (diff & SD_DIFF2) - WRITEUINT8(save_p, diff2); + P_WriteUINT8(save_p, diff2); if (diff2 & SD_DIFF3) - WRITEUINT8(save_p, diff3); + P_WriteUINT8(save_p, diff3); if (diff3 & SD_DIFF4) - WRITEUINT8(save_p, diff4); + P_WriteUINT8(save_p, diff4); if (diff4 & SD_DIFF5) - WRITEUINT8(save_p, diff5); + P_WriteUINT8(save_p, diff5); if (diff & SD_FLOORHT) - WRITEFIXED(save_p, ss->floorheight); + P_WriteFixed(save_p, ss->floorheight); if (diff & SD_CEILHT) - WRITEFIXED(save_p, ss->ceilingheight); + P_WriteFixed(save_p, ss->ceilingheight); if (diff & SD_FLOORPIC) - WRITEMEM(save_p, levelflats[ss->floorpic].name, 8); + P_WriteMem(save_p, levelflats[ss->floorpic].name, 8); if (diff & SD_CEILPIC) - WRITEMEM(save_p, levelflats[ss->ceilingpic].name, 8); + P_WriteMem(save_p, levelflats[ss->ceilingpic].name, 8); if (diff & SD_LIGHT) - WRITEINT16(save_p, ss->lightlevel); + P_WriteINT16(save_p, ss->lightlevel); if (diff & SD_SPECIAL) - WRITEINT16(save_p, ss->special); + P_WriteINT16(save_p, ss->special); if (diff2 & SD_FXOFFS) - WRITEFIXED(save_p, ss->floorxoffset); + P_WriteFixed(save_p, ss->floorxoffset); if (diff2 & SD_FYOFFS) - WRITEFIXED(save_p, ss->flooryoffset); + P_WriteFixed(save_p, ss->flooryoffset); if (diff2 & SD_CXOFFS) - WRITEFIXED(save_p, ss->ceilingxoffset); + P_WriteFixed(save_p, ss->ceilingxoffset); if (diff2 & SD_CYOFFS) - WRITEFIXED(save_p, ss->ceilingyoffset); + P_WriteFixed(save_p, ss->ceilingyoffset); if (diff2 & SD_FLOORANG) - WRITEANGLE(save_p, ss->floorangle); + P_WriteAngle(save_p, ss->floorangle); if (diff2 & SD_CEILANG) - WRITEANGLE(save_p, ss->ceilingangle); + P_WriteAngle(save_p, ss->ceilingangle); if (diff2 & SD_TAG) { - WRITEUINT32(save_p, ss->tags.count); + P_WriteUINT32(save_p, ss->tags.count); for (j = 0; j < ss->tags.count; j++) - WRITEINT16(save_p, ss->tags.tags[j]); + P_WriteINT16(save_p, ss->tags.tags[j]); } if (diff3 & SD_COLORMAP) - WRITEUINT32(save_p, CheckAddNetColormapToList(ss->extra_colormap)); + P_WriteUINT32(save_p, CheckAddNetColormapToList(ss->extra_colormap)); // returns existing index if already added, or appends to net_colormaps and returns new index if (diff3 & SD_CRUMBLESTATE) - WRITEINT32(save_p, ss->crumblestate); + P_WriteINT32(save_p, ss->crumblestate); if (diff3 & SD_FLOORLIGHT) { - WRITEINT16(save_p, ss->floorlightlevel); - WRITEUINT8(save_p, ss->floorlightabsolute); + P_WriteINT16(save_p, ss->floorlightlevel); + P_WriteUINT8(save_p, ss->floorlightabsolute); } if (diff3 & SD_CEILLIGHT) { - WRITEINT16(save_p, ss->ceilinglightlevel); - WRITEUINT8(save_p, ss->ceilinglightabsolute); + P_WriteINT16(save_p, ss->ceilinglightlevel); + P_WriteUINT8(save_p, ss->ceilinglightabsolute); } if (diff3 & SD_FLAG) - WRITEUINT32(save_p, ss->flags); + P_WriteUINT32(save_p, ss->flags); if (diff3 & SD_SPECIALFLAG) - WRITEUINT32(save_p, ss->specialflags); + P_WriteUINT32(save_p, ss->specialflags); if (diff4 & SD_DAMAGETYPE) - WRITEUINT8(save_p, ss->damagetype); + P_WriteUINT8(save_p, ss->damagetype); if (diff4 & SD_TRIGGERTAG) - WRITEINT16(save_p, ss->triggertag); + P_WriteINT16(save_p, ss->triggertag); if (diff4 & SD_TRIGGERER) - WRITEUINT8(save_p, ss->triggerer); + P_WriteUINT8(save_p, ss->triggerer); if (diff4 & SD_FXSCALE) - WRITEFIXED(save_p, ss->floorxscale); + P_WriteFixed(save_p, ss->floorxscale); if (diff4 & SD_FYSCALE) - WRITEFIXED(save_p, ss->flooryscale); + P_WriteFixed(save_p, ss->flooryscale); if (diff4 & SD_CXSCALE) - WRITEFIXED(save_p, ss->ceilingxscale); + P_WriteFixed(save_p, ss->ceilingxscale); if (diff4 & SD_CYSCALE) - WRITEFIXED(save_p, ss->ceilingyscale); + P_WriteFixed(save_p, ss->ceilingyscale); if (diff5 & SD_GRAVITY) - WRITEFIXED(save_p, ss->gravity); + P_WriteFixed(save_p, ss->gravity); if (diff5 & SD_FLOORPORTAL) - WRITEUINT32(save_p, ss->portal_floor); + P_WriteUINT32(save_p, ss->portal_floor); if (diff5 & SD_CEILPORTAL) - WRITEUINT32(save_p, ss->portal_ceiling); + P_WriteUINT32(save_p, ss->portal_ceiling); if (diff & SD_FFLOORS) - ArchiveFFloors(ss); + ArchiveFFloors(save_p, ss); } } - WRITEUINT32(save_p, 0xffffffff); + P_WriteUINT32(save_p, 0xffffffff); } -static void UnArchiveSectors(void) +static void UnArchiveSectors(save_t *save_p) { UINT32 i; UINT16 j; UINT8 diff, diff2, diff3, diff4, diff5; for (;;) { - i = READUINT32(save_p); + i = P_ReadUINT32(save_p); if (i == 0xffffffff) break; @@ -1237,28 +1476,28 @@ static void UnArchiveSectors(void) if (i > numsectors) I_Error("Invalid sector number %u from server (expected end at %s)", i, sizeu1(numsectors)); - diff = READUINT8(save_p); + diff = P_ReadUINT8(save_p); if (diff & SD_DIFF2) - diff2 = READUINT8(save_p); + diff2 = P_ReadUINT8(save_p); else diff2 = 0; if (diff2 & SD_DIFF3) - diff3 = READUINT8(save_p); + diff3 = P_ReadUINT8(save_p); else diff3 = 0; if (diff3 & SD_DIFF4) - diff4 = READUINT8(save_p); + diff4 = P_ReadUINT8(save_p); else diff4 = 0; if (diff4 & SD_DIFF5) - diff5 = READUINT8(save_p); + diff5 = P_ReadUINT8(save_p); else diff5 = 0; if (diff & SD_FLOORHT) - sectors[i].floorheight = READFIXED(save_p); + sectors[i].floorheight = P_ReadFixed(save_p); if (diff & SD_CEILHT) - sectors[i].ceilingheight = READFIXED(save_p); + sectors[i].ceilingheight = P_ReadFixed(save_p); if (diff & SD_FLOORPIC) { sectors[i].floorpic = P_AddLevelFlatRuntime((char *)save_p); @@ -1270,25 +1509,25 @@ static void UnArchiveSectors(void) save_p += 8; } if (diff & SD_LIGHT) - sectors[i].lightlevel = READINT16(save_p); + sectors[i].lightlevel = P_ReadINT16(save_p); if (diff & SD_SPECIAL) - sectors[i].special = READINT16(save_p); + sectors[i].special = P_ReadINT16(save_p); if (diff2 & SD_FXOFFS) - sectors[i].floorxoffset = READFIXED(save_p); + sectors[i].floorxoffset = P_ReadFixed(save_p); if (diff2 & SD_FYOFFS) - sectors[i].flooryoffset = READFIXED(save_p); + sectors[i].flooryoffset = P_ReadFixed(save_p); if (diff2 & SD_CXOFFS) - sectors[i].ceilingxoffset = READFIXED(save_p); + sectors[i].ceilingxoffset = P_ReadFixed(save_p); if (diff2 & SD_CYOFFS) - sectors[i].ceilingyoffset = READFIXED(save_p); + sectors[i].ceilingyoffset = P_ReadFixed(save_p); if (diff2 & SD_FLOORANG) - sectors[i].floorangle = READANGLE(save_p); + sectors[i].floorangle = P_ReadAngle(save_p); if (diff2 & SD_CEILANG) - sectors[i].ceilingangle = READANGLE(save_p); + sectors[i].ceilingangle = P_ReadAngle(save_p); if (diff2 & SD_TAG) { - size_t ncount = READUINT32(save_p); + size_t ncount = P_ReadUINT32(save_p); // Remove entries from global lists. for (j = 0; j < sectors[i].tags.count; j++) @@ -1302,7 +1541,7 @@ static void UnArchiveSectors(void) } for (j = 0; j < ncount; j++) - sectors[i].tags.tags[j] = READINT16(save_p); + sectors[i].tags.tags[j] = P_ReadINT16(save_p); // Add new entries. for (j = 0; j < sectors[i].tags.count; j++) @@ -1311,49 +1550,49 @@ static void UnArchiveSectors(void) if (diff3 & SD_COLORMAP) - sectors[i].extra_colormap = GetNetColormapFromList(READUINT32(save_p)); + sectors[i].extra_colormap = GetNetColormapFromList(P_ReadUINT32(save_p)); if (diff3 & SD_CRUMBLESTATE) - sectors[i].crumblestate = READINT32(save_p); + sectors[i].crumblestate = P_ReadINT32(save_p); if (diff3 & SD_FLOORLIGHT) { - sectors[i].floorlightlevel = READINT16(save_p); - sectors[i].floorlightabsolute = READUINT8(save_p); + sectors[i].floorlightlevel = P_ReadINT16(save_p); + sectors[i].floorlightabsolute = P_ReadUINT8(save_p); } if (diff3 & SD_CEILLIGHT) { - sectors[i].ceilinglightlevel = READINT16(save_p); - sectors[i].ceilinglightabsolute = READUINT8(save_p); + sectors[i].ceilinglightlevel = P_ReadINT16(save_p); + sectors[i].ceilinglightabsolute = P_ReadUINT8(save_p); } if (diff3 & SD_FLAG) { - sectors[i].flags = READUINT32(save_p); + sectors[i].flags = P_ReadUINT32(save_p); CheckForReverseGravity |= (sectors[i].flags & MSF_GRAVITYFLIP); } if (diff3 & SD_SPECIALFLAG) - sectors[i].specialflags = READUINT32(save_p); + sectors[i].specialflags = P_ReadUINT32(save_p); if (diff4 & SD_DAMAGETYPE) - sectors[i].damagetype = READUINT8(save_p); + sectors[i].damagetype = P_ReadUINT8(save_p); if (diff4 & SD_TRIGGERTAG) - sectors[i].triggertag = READINT16(save_p); + sectors[i].triggertag = P_ReadINT16(save_p); if (diff4 & SD_TRIGGERER) - sectors[i].triggerer = READUINT8(save_p); + sectors[i].triggerer = P_ReadUINT8(save_p); if (diff4 & SD_FXSCALE) - sectors[i].floorxscale = READFIXED(save_p); + sectors[i].floorxscale = P_ReadFixed(save_p); if (diff4 & SD_FYSCALE) - sectors[i].flooryscale = READFIXED(save_p); + sectors[i].flooryscale = P_ReadFixed(save_p); if (diff4 & SD_CXSCALE) - sectors[i].ceilingxscale = READFIXED(save_p); + sectors[i].ceilingxscale = P_ReadFixed(save_p); if (diff4 & SD_CYSCALE) - sectors[i].ceilingyscale = READFIXED(save_p); + sectors[i].ceilingyscale = P_ReadFixed(save_p); if (diff5 & SD_GRAVITY) - sectors[i].gravity = READFIXED(save_p); + sectors[i].gravity = P_ReadFixed(save_p); if (diff5 & SD_FLOORPORTAL) - sectors[i].portal_floor = READUINT32(save_p); + sectors[i].portal_floor = P_ReadUINT32(save_p); if (diff5 & SD_CEILPORTAL) - sectors[i].portal_ceiling = READUINT32(save_p); + sectors[i].portal_ceiling = P_ReadUINT32(save_p); if (diff & SD_FFLOORS) - UnArchiveFFloors(§ors[i]); + UnArchiveFFloors(save_p, §ors[i]); } } @@ -1416,65 +1655,65 @@ static UINT32 GetSideDiff(const side_t *si, const side_t *spawnsi) return diff; } -static void ArchiveSide(const side_t *si, UINT32 diff) +static void ArchiveSide(save_t *save_p, const side_t *si, UINT32 diff) { - WRITEUINT32(save_p, diff); + P_WriteUINT32(save_p, diff); if (diff & LD_SDTEXOFFX) - WRITEFIXED(save_p, si->textureoffset); + P_WriteFixed(save_p, si->textureoffset); if (diff & LD_SDTEXOFFY) - WRITEFIXED(save_p, si->rowoffset); + P_WriteFixed(save_p, si->rowoffset); if (diff & LD_SDTOPTEX) - WRITEINT32(save_p, si->toptexture); + P_WriteINT32(save_p, si->toptexture); if (diff & LD_SDBOTTEX) - WRITEINT32(save_p, si->bottomtexture); + P_WriteINT32(save_p, si->bottomtexture); if (diff & LD_SDMIDTEX) - WRITEINT32(save_p, si->midtexture); + P_WriteINT32(save_p, si->midtexture); if (diff & LD_SDTOPOFFX) - WRITEFIXED(save_p, si->offsetx_top); + P_WriteFixed(save_p, si->offsetx_top); if (diff & LD_SDMIDOFFX) - WRITEFIXED(save_p, si->offsetx_mid); + P_WriteFixed(save_p, si->offsetx_mid); if (diff & LD_SDBOTOFFX) - WRITEFIXED(save_p, si->offsetx_bottom); + P_WriteFixed(save_p, si->offsetx_bottom); if (diff & LD_SDTOPOFFY) - WRITEFIXED(save_p, si->offsety_top); + P_WriteFixed(save_p, si->offsety_top); if (diff & LD_SDMIDOFFY) - WRITEFIXED(save_p, si->offsety_mid); + P_WriteFixed(save_p, si->offsety_mid); if (diff & LD_SDBOTOFFY) - WRITEFIXED(save_p, si->offsety_bottom); + P_WriteFixed(save_p, si->offsety_bottom); if (diff & LD_SDTOPSCALEX) - WRITEFIXED(save_p, si->scalex_top); + P_WriteFixed(save_p, si->scalex_top); if (diff & LD_SDMIDSCALEX) - WRITEFIXED(save_p, si->scalex_mid); + P_WriteFixed(save_p, si->scalex_mid); if (diff & LD_SDBOTSCALEX) - WRITEFIXED(save_p, si->scalex_bottom); + P_WriteFixed(save_p, si->scalex_bottom); if (diff & LD_SDTOPSCALEY) - WRITEFIXED(save_p, si->scaley_top); + P_WriteFixed(save_p, si->scaley_top); if (diff & LD_SDMIDSCALEY) - WRITEFIXED(save_p, si->scaley_mid); + P_WriteFixed(save_p, si->scaley_mid); if (diff & LD_SDBOTSCALEY) - WRITEFIXED(save_p, si->scaley_bottom); + P_WriteFixed(save_p, si->scaley_bottom); if (diff & LD_SDREPEATCNT) - WRITEINT16(save_p, si->repeatcnt); + P_WriteINT16(save_p, si->repeatcnt); if (diff & LD_SDLIGHT) - WRITEINT16(save_p, si->light); + P_WriteINT16(save_p, si->light); if (diff & LD_SDTOPLIGHT) - WRITEINT16(save_p, si->light_top); + P_WriteINT16(save_p, si->light_top); if (diff & LD_SDMIDLIGHT) - WRITEINT16(save_p, si->light_mid); + P_WriteINT16(save_p, si->light_mid); if (diff & LD_SDBOTLIGHT) - WRITEINT16(save_p, si->light_bottom); + P_WriteINT16(save_p, si->light_bottom); if (diff & LD_SDLIGHTABS) - WRITEUINT8(save_p, si->lightabsolute); + P_WriteUINT8(save_p, si->lightabsolute); if (diff & LD_SDTOPLIGHTABS) - WRITEUINT8(save_p, si->lightabsolute_top); + P_WriteUINT8(save_p, si->lightabsolute_top); if (diff & LD_SDMIDLIGHTABS) - WRITEUINT8(save_p, si->lightabsolute_mid); + P_WriteUINT8(save_p, si->lightabsolute_mid); if (diff & LD_SDBOTLIGHTABS) - WRITEUINT8(save_p, si->lightabsolute_bottom); + P_WriteUINT8(save_p, si->lightabsolute_bottom); } -static void ArchiveLines(void) +static void ArchiveLines(save_t *save_p) { size_t i; const line_t *li = lines; @@ -1524,21 +1763,21 @@ static void ArchiveLines(void) if (diff) { - WRITEUINT32(save_p, i); - WRITEUINT8(save_p, diff); + P_WriteUINT32(save_p, i); + P_WriteUINT8(save_p, diff); if (diff & LD_DIFF2) - WRITEUINT8(save_p, diff2); + P_WriteUINT8(save_p, diff2); if (diff & LD_FLAG) - WRITEINT16(save_p, li->flags); + P_WriteINT16(save_p, li->flags); if (diff & LD_SPECIAL) - WRITEINT16(save_p, li->special); + P_WriteINT16(save_p, li->special); if (diff & LD_CLLCOUNT) - WRITEINT16(save_p, li->callcount); + P_WriteINT16(save_p, li->callcount); if (diff & LD_ARGS) { UINT8 j; for (j = 0; j < NUMLINEARGS; j++) - WRITEINT32(save_p, li->args[j]); + P_WriteINT32(save_p, li->args[j]); } if (diff & LD_STRINGARGS) { @@ -1549,88 +1788,88 @@ static void ArchiveLines(void) if (!li->stringargs[j]) { - WRITEINT32(save_p, 0); + P_WriteINT32(save_p, 0); continue; } len = strlen(li->stringargs[j]); - WRITEINT32(save_p, len); + P_WriteINT32(save_p, len); for (k = 0; k < len; k++) - WRITECHAR(save_p, li->stringargs[j][k]); + P_WriteChar(save_p, li->stringargs[j][k]); } } if (diff & LD_SIDE1) - ArchiveSide(&sides[li->sidenum[0]], side1diff); + ArchiveSide(save_p, &sides[li->sidenum[0]], side1diff); if (diff & LD_SIDE2) - ArchiveSide(&sides[li->sidenum[1]], side2diff); + ArchiveSide(save_p, &sides[li->sidenum[1]], side2diff); if (diff2 & LD_EXECUTORDELAY) - WRITEINT32(save_p, li->executordelay); + P_WriteINT32(save_p, li->executordelay); if (diff2 & LD_TRANSFPORTAL) - WRITEUINT32(save_p, li->secportal); + P_WriteUINT32(save_p, li->secportal); } } - WRITEUINT32(save_p, 0xffffffff); + P_WriteUINT32(save_p, 0xffffffff); } -static void UnArchiveSide(side_t *si) +static void UnArchiveSide(save_t *save_p, side_t *si) { - UINT32 diff = READUINT32(save_p); + UINT32 diff = P_ReadUINT32(save_p); if (diff & LD_SDTEXOFFX) - si->textureoffset = READFIXED(save_p); + si->textureoffset = P_ReadFixed(save_p); if (diff & LD_SDTEXOFFY) - si->rowoffset = READFIXED(save_p); + si->rowoffset = P_ReadFixed(save_p); if (diff & LD_SDTOPTEX) - si->toptexture = READINT32(save_p); + si->toptexture = P_ReadINT32(save_p); if (diff & LD_SDBOTTEX) - si->bottomtexture = READINT32(save_p); + si->bottomtexture = P_ReadINT32(save_p); if (diff & LD_SDMIDTEX) - si->midtexture = READINT32(save_p); + si->midtexture = P_ReadINT32(save_p); if (diff & LD_SDTOPOFFX) - si->offsetx_top = READFIXED(save_p); + si->offsetx_top = P_ReadFixed(save_p); if (diff & LD_SDMIDOFFX) - si->offsetx_mid = READFIXED(save_p); + si->offsetx_mid = P_ReadFixed(save_p); if (diff & LD_SDBOTOFFX) - si->offsetx_bottom = READFIXED(save_p); + si->offsetx_bottom = P_ReadFixed(save_p); if (diff & LD_SDTOPOFFY) - si->offsety_top = READFIXED(save_p); + si->offsety_top = P_ReadFixed(save_p); if (diff & LD_SDMIDOFFY) - si->offsety_mid = READFIXED(save_p); + si->offsety_mid = P_ReadFixed(save_p); if (diff & LD_SDBOTOFFY) - si->offsety_bottom = READFIXED(save_p); + si->offsety_bottom = P_ReadFixed(save_p); if (diff & LD_SDTOPSCALEX) - si->scalex_top = READFIXED(save_p); + si->scalex_top = P_ReadFixed(save_p); if (diff & LD_SDMIDSCALEX) - si->scalex_mid = READFIXED(save_p); + si->scalex_mid = P_ReadFixed(save_p); if (diff & LD_SDBOTSCALEX) - si->scalex_bottom = READFIXED(save_p); + si->scalex_bottom = P_ReadFixed(save_p); if (diff & LD_SDTOPSCALEY) - si->scaley_top = READFIXED(save_p); + si->scaley_top = P_ReadFixed(save_p); if (diff & LD_SDMIDSCALEY) - si->scaley_mid = READFIXED(save_p); + si->scaley_mid = P_ReadFixed(save_p); if (diff & LD_SDBOTSCALEY) - si->scaley_bottom = READFIXED(save_p); + si->scaley_bottom = P_ReadFixed(save_p); if (diff & LD_SDREPEATCNT) - si->repeatcnt = READINT16(save_p); + si->repeatcnt = P_ReadINT16(save_p); if (diff & LD_SDLIGHT) - si->light = READINT16(save_p); + si->light = P_ReadINT16(save_p); if (diff & LD_SDTOPLIGHT) - si->light_top = READINT16(save_p); + si->light_top = P_ReadINT16(save_p); if (diff & LD_SDMIDLIGHT) - si->light_mid = READINT16(save_p); + si->light_mid = P_ReadINT16(save_p); if (diff & LD_SDBOTLIGHT) - si->light_bottom = READINT16(save_p); + si->light_bottom = P_ReadINT16(save_p); if (diff & LD_SDLIGHTABS) - si->lightabsolute = READUINT8(save_p); + si->lightabsolute = P_ReadUINT8(save_p); if (diff & LD_SDTOPLIGHTABS) - si->lightabsolute_top = READUINT8(save_p); + si->lightabsolute_top = P_ReadUINT8(save_p); if (diff & LD_SDMIDLIGHTABS) - si->lightabsolute_mid = READUINT8(save_p); + si->lightabsolute_mid = P_ReadUINT8(save_p); if (diff & LD_SDBOTLIGHTABS) - si->lightabsolute_bottom = READUINT8(save_p); + si->lightabsolute_bottom = P_ReadUINT8(save_p); } -static void UnArchiveLines(void) +static void UnArchiveLines(save_t *save_p) { UINT32 i; line_t *li; @@ -1638,38 +1877,38 @@ static void UnArchiveLines(void) for (;;) { - i = READUINT32(save_p); + i = P_ReadUINT32(save_p); if (i == 0xffffffff) break; if (i > numlines) I_Error("Invalid line number %u from server", i); - diff = READUINT8(save_p); + diff = P_ReadUINT8(save_p); if (diff & LD_DIFF2) - diff2 = READUINT8(save_p); + diff2 = P_ReadUINT8(save_p); else diff2 = 0; li = &lines[i]; if (diff & LD_FLAG) - li->flags = READINT16(save_p); + li->flags = P_ReadINT16(save_p); if (diff & LD_SPECIAL) - li->special = READINT16(save_p); + li->special = P_ReadINT16(save_p); if (diff & LD_CLLCOUNT) - li->callcount = READINT16(save_p); + li->callcount = P_ReadINT16(save_p); if (diff & LD_ARGS) { UINT8 j; for (j = 0; j < NUMLINEARGS; j++) - li->args[j] = READINT32(save_p); + li->args[j] = P_ReadINT32(save_p); } if (diff & LD_STRINGARGS) { UINT8 j; for (j = 0; j < NUMLINESTRINGARGS; j++) { - size_t len = READINT32(save_p); + size_t len = P_ReadINT32(save_p); size_t k; if (!len) @@ -1681,38 +1920,38 @@ static void UnArchiveLines(void) li->stringargs[j] = Z_Realloc(li->stringargs[j], len + 1, PU_LEVEL, NULL); for (k = 0; k < len; k++) - li->stringargs[j][k] = READCHAR(save_p); + li->stringargs[j][k] = P_ReadChar(save_p); li->stringargs[j][len] = '\0'; } } if (diff & LD_SIDE1) - UnArchiveSide(&sides[li->sidenum[0]]); + UnArchiveSide(save_p, &sides[li->sidenum[0]]); if (diff & LD_SIDE2) - UnArchiveSide(&sides[li->sidenum[1]]); + UnArchiveSide(save_p, &sides[li->sidenum[1]]); if (diff2 & LD_EXECUTORDELAY) - li->executordelay = READINT32(save_p); + li->executordelay = P_ReadINT32(save_p); if (diff2 & LD_TRANSFPORTAL) - li->secportal = READUINT32(save_p); + li->secportal = P_ReadUINT32(save_p); } } -static void P_NetArchiveWorld(void) +static void P_NetArchiveWorld(save_t *save_p) { // initialize colormap vars because paranoia ClearNetColormaps(); - WRITEUINT32(save_p, ARCHIVEBLOCK_WORLD); + P_WriteUINT32(save_p, ARCHIVEBLOCK_WORLD); - ArchiveSectors(); - ArchiveLines(); + ArchiveSectors(save_p); + ArchiveLines(save_p); R_ClearTextureNumCache(false); } -static void P_NetUnArchiveWorld(void) +static void P_NetUnArchiveWorld(save_t *save_p) { UINT16 i; - if (READUINT32(save_p) != ARCHIVEBLOCK_WORLD) + if (P_ReadUINT32(save_p) != ARCHIVEBLOCK_WORLD) I_Error("Bad $$$.sav at archive block World"); // initialize colormap vars because paranoia @@ -1726,8 +1965,8 @@ static void P_NetUnArchiveWorld(void) num_ffloors++; } - UnArchiveSectors(); - UnArchiveLines(); + UnArchiveSectors(save_p); + UnArchiveLines(save_p); } // @@ -1878,7 +2117,7 @@ static UINT32 SaveSlope(const pslope_t *slope) return 0xFFFFFFFF; } -static void SaveMobjThinker(const thinker_t *th, const UINT8 type) +static void SaveMobjThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const mobj_t *mobj = (const mobj_t *)th; UINT32 diff; @@ -2052,28 +2291,28 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) if (mobj->type == MT_HOOPCENTER) diff = MD_SPAWNPOINT; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, diff); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, diff); if (diff & MD_MORE) - WRITEUINT32(save_p, diff2); + P_WriteUINT32(save_p, diff2); // save pointer, at load time we will search this pointer to reinitilize pointers - WRITEUINT32(save_p, (size_t)mobj); + P_WriteUINT32(save_p, (size_t)mobj); - WRITEFIXED(save_p, mobj->z); // Force this so 3dfloor problems don't arise. - WRITEFIXED(save_p, mobj->floorz); - WRITEFIXED(save_p, mobj->ceilingz); + P_WriteFixed(save_p, mobj->z); // Force this so 3dfloor problems don't arise. + P_WriteFixed(save_p, mobj->floorz); + P_WriteFixed(save_p, mobj->ceilingz); if (diff2 & MD2_FLOORROVER) { - WRITEUINT32(save_p, SaveSector(mobj->floorrover->target)); - WRITEUINT16(save_p, P_GetFFloorID(mobj->floorrover)); + P_WriteUINT32(save_p, SaveSector(mobj->floorrover->target)); + P_WriteUINT16(save_p, P_GetFFloorID(mobj->floorrover)); } if (diff2 & MD2_CEILINGROVER) { - WRITEUINT32(save_p, SaveSector(mobj->ceilingrover->target)); - WRITEUINT16(save_p, P_GetFFloorID(mobj->ceilingrover)); + P_WriteUINT32(save_p, SaveSector(mobj->ceilingrover->target)); + P_WriteUINT16(save_p, P_GetFFloorID(mobj->ceilingrover)); } if (diff & MD_SPAWNPOINT) @@ -2082,649 +2321,649 @@ static void SaveMobjThinker(const thinker_t *th, const UINT8 type) for (z = 0; z < nummapthings; z++) if (&mapthings[z] == mobj->spawnpoint) - WRITEUINT16(save_p, z); + P_WriteUINT16(save_p, z); if (mobj->type == MT_HOOPCENTER) return; } if (diff & MD_TYPE) - WRITEUINT32(save_p, mobj->type); + P_WriteUINT32(save_p, mobj->type); if (diff & MD_POS) { - WRITEFIXED(save_p, mobj->x); - WRITEFIXED(save_p, mobj->y); - WRITEANGLE(save_p, mobj->angle); - WRITEANGLE(save_p, mobj->pitch); - WRITEANGLE(save_p, mobj->roll); + P_WriteFixed(save_p, mobj->x); + P_WriteFixed(save_p, mobj->y); + P_WriteAngle(save_p, mobj->angle); + P_WriteAngle(save_p, mobj->pitch); + P_WriteAngle(save_p, mobj->roll); } if (diff & MD_MOM) { - WRITEFIXED(save_p, mobj->momx); - WRITEFIXED(save_p, mobj->momy); - WRITEFIXED(save_p, mobj->momz); - WRITEFIXED(save_p, mobj->pmomz); + P_WriteFixed(save_p, mobj->momx); + P_WriteFixed(save_p, mobj->momy); + P_WriteFixed(save_p, mobj->momz); + P_WriteFixed(save_p, mobj->pmomz); } if (diff & MD_RADIUS) - WRITEFIXED(save_p, mobj->radius); + P_WriteFixed(save_p, mobj->radius); if (diff & MD_HEIGHT) - WRITEFIXED(save_p, mobj->height); + P_WriteFixed(save_p, mobj->height); if (diff & MD_FLAGS) - WRITEUINT32(save_p, mobj->flags); + P_WriteUINT32(save_p, mobj->flags); if (diff & MD_FLAGS2) - WRITEUINT32(save_p, mobj->flags2); + P_WriteUINT32(save_p, mobj->flags2); if (diff & MD_HEALTH) - WRITEINT32(save_p, mobj->health); + P_WriteINT32(save_p, mobj->health); if (diff & MD_RTIME) - WRITEINT32(save_p, mobj->reactiontime); + P_WriteINT32(save_p, mobj->reactiontime); if (diff & MD_STATE) - WRITEUINT16(save_p, mobj->state-states); + P_WriteUINT16(save_p, mobj->state-states); if (diff & MD_TICS) - WRITEINT32(save_p, mobj->tics); + P_WriteINT32(save_p, mobj->tics); if (diff & MD_SPRITE) { - WRITEUINT16(save_p, mobj->sprite); + P_WriteUINT16(save_p, mobj->sprite); if (mobj->sprite == SPR_PLAY) - WRITEUINT16(save_p, mobj->sprite2); + P_WriteUINT16(save_p, mobj->sprite2); } if (diff & MD_FRAME) { - WRITEUINT32(save_p, mobj->frame); - WRITEUINT16(save_p, mobj->anim_duration); + P_WriteUINT32(save_p, mobj->frame); + P_WriteUINT16(save_p, mobj->anim_duration); } if (diff & MD_EFLAGS) - WRITEUINT16(save_p, mobj->eflags); + P_WriteUINT16(save_p, mobj->eflags); if (diff & MD_PLAYER) - WRITEUINT8(save_p, mobj->player-players); + P_WriteUINT8(save_p, mobj->player-players); if (diff & MD_MOVEDIR) - WRITEANGLE(save_p, mobj->movedir); + P_WriteAngle(save_p, mobj->movedir); if (diff & MD_MOVECOUNT) - WRITEINT32(save_p, mobj->movecount); + P_WriteINT32(save_p, mobj->movecount); if (diff & MD_THRESHOLD) - WRITEINT32(save_p, mobj->threshold); + P_WriteINT32(save_p, mobj->threshold); if (diff & MD_LASTLOOK) - WRITEINT32(save_p, mobj->lastlook); + P_WriteINT32(save_p, mobj->lastlook); if (diff & MD_TARGET) - WRITEUINT32(save_p, mobj->target->mobjnum); + P_WriteUINT32(save_p, mobj->target->mobjnum); if (diff & MD_TRACER) - WRITEUINT32(save_p, mobj->tracer->mobjnum); + P_WriteUINT32(save_p, mobj->tracer->mobjnum); if (diff & MD_FRICTION) - WRITEFIXED(save_p, mobj->friction); + P_WriteFixed(save_p, mobj->friction); if (diff & MD_MOVEFACTOR) - WRITEFIXED(save_p, mobj->movefactor); + P_WriteFixed(save_p, mobj->movefactor); if (diff & MD_FUSE) - WRITEINT32(save_p, mobj->fuse); + P_WriteINT32(save_p, mobj->fuse); if (diff & MD_WATERTOP) - WRITEFIXED(save_p, mobj->watertop); + P_WriteFixed(save_p, mobj->watertop); if (diff & MD_WATERBOTTOM) - WRITEFIXED(save_p, mobj->waterbottom); + P_WriteFixed(save_p, mobj->waterbottom); if (diff & MD_SCALE) - WRITEFIXED(save_p, mobj->scale); + P_WriteFixed(save_p, mobj->scale); if (diff & MD_DSCALE) - WRITEFIXED(save_p, mobj->destscale); + P_WriteFixed(save_p, mobj->destscale); if (diff2 & MD2_SCALESPEED) - WRITEFIXED(save_p, mobj->scalespeed); + P_WriteFixed(save_p, mobj->scalespeed); if (diff2 & MD2_CUSVAL) - WRITEINT32(save_p, mobj->cusval); + P_WriteINT32(save_p, mobj->cusval); if (diff2 & MD2_CVMEM) - WRITEINT32(save_p, mobj->cvmem); + P_WriteINT32(save_p, mobj->cvmem); if (diff2 & MD2_SKIN) - WRITEUINT8(save_p, (UINT8)(((skin_t *)mobj->skin)->skinnum)); + P_WriteUINT8(save_p, (UINT8)(((skin_t *)mobj->skin)->skinnum)); if (diff2 & MD2_COLOR) - WRITEUINT16(save_p, mobj->color); + P_WriteUINT16(save_p, mobj->color); if (diff2 & MD2_EXTVAL1) - WRITEINT32(save_p, mobj->extravalue1); + P_WriteINT32(save_p, mobj->extravalue1); if (diff2 & MD2_EXTVAL2) - WRITEINT32(save_p, mobj->extravalue2); + P_WriteINT32(save_p, mobj->extravalue2); if (diff2 & MD2_HNEXT) - WRITEUINT32(save_p, mobj->hnext->mobjnum); + P_WriteUINT32(save_p, mobj->hnext->mobjnum); if (diff2 & MD2_HPREV) - WRITEUINT32(save_p, mobj->hprev->mobjnum); + P_WriteUINT32(save_p, mobj->hprev->mobjnum); if (diff2 & MD2_SLOPE) - WRITEUINT16(save_p, mobj->standingslope->id); + P_WriteUINT16(save_p, mobj->standingslope->id); if (diff2 & MD2_COLORIZED) - WRITEUINT8(save_p, mobj->colorized); + P_WriteUINT8(save_p, mobj->colorized); if (diff2 & MD2_MIRRORED) - WRITEUINT8(save_p, mobj->mirrored); + P_WriteUINT8(save_p, mobj->mirrored); if (diff2 & MD2_SPRITEROLL) - WRITEANGLE(save_p, mobj->spriteroll); + P_WriteAngle(save_p, mobj->spriteroll); if (diff2 & MD2_SHADOWSCALE) - WRITEFIXED(save_p, mobj->shadowscale); + P_WriteFixed(save_p, mobj->shadowscale); if (diff2 & MD2_RENDERFLAGS) - WRITEUINT32(save_p, mobj->renderflags); + P_WriteUINT32(save_p, mobj->renderflags); if (diff2 & MD2_BLENDMODE) - WRITEINT32(save_p, mobj->blendmode); + P_WriteINT32(save_p, mobj->blendmode); if (diff2 & MD2_SPRITEXSCALE) - WRITEFIXED(save_p, mobj->spritexscale); + P_WriteFixed(save_p, mobj->spritexscale); if (diff2 & MD2_SPRITEYSCALE) - WRITEFIXED(save_p, mobj->spriteyscale); + P_WriteFixed(save_p, mobj->spriteyscale); if (diff2 & MD2_SPRITEXOFFSET) - WRITEFIXED(save_p, mobj->spritexoffset); + P_WriteFixed(save_p, mobj->spritexoffset); if (diff2 & MD2_SPRITEYOFFSET) - WRITEFIXED(save_p, mobj->spriteyoffset); + P_WriteFixed(save_p, mobj->spriteyoffset); if (diff2 & MD2_FLOORSPRITESLOPE) { pslope_t *slope = mobj->floorspriteslope; - WRITEFIXED(save_p, slope->zdelta); - WRITEANGLE(save_p, slope->zangle); - WRITEANGLE(save_p, slope->xydirection); + P_WriteFixed(save_p, slope->zdelta); + P_WriteAngle(save_p, slope->zangle); + P_WriteAngle(save_p, slope->xydirection); - WRITEFIXED(save_p, slope->o.x); - WRITEFIXED(save_p, slope->o.y); - WRITEFIXED(save_p, slope->o.z); + P_WriteFixed(save_p, slope->o.x); + P_WriteFixed(save_p, slope->o.y); + P_WriteFixed(save_p, slope->o.z); - WRITEFIXED(save_p, slope->d.x); - WRITEFIXED(save_p, slope->d.y); + P_WriteFixed(save_p, slope->d.x); + P_WriteFixed(save_p, slope->d.y); - WRITEFIXED(save_p, slope->normal.x); - WRITEFIXED(save_p, slope->normal.y); - WRITEFIXED(save_p, slope->normal.z); + P_WriteFixed(save_p, slope->normal.x); + P_WriteFixed(save_p, slope->normal.y); + P_WriteFixed(save_p, slope->normal.z); } if (diff2 & MD2_DRAWONLYFORPLAYER) - WRITEUINT8(save_p, mobj->drawonlyforplayer-players); + P_WriteUINT8(save_p, mobj->drawonlyforplayer-players); if (diff2 & MD2_DONTDRAWFORVIEWMOBJ) - WRITEUINT32(save_p, mobj->dontdrawforviewmobj->mobjnum); + P_WriteUINT32(save_p, mobj->dontdrawforviewmobj->mobjnum); if (diff2 & MD2_DISPOFFSET) - WRITEINT32(save_p, mobj->dispoffset); + P_WriteINT32(save_p, mobj->dispoffset); if (diff2 & MD2_TRANSLATION) - WRITEUINT16(save_p, mobj->translation); + P_WriteUINT16(save_p, mobj->translation); if (diff2 & MD2_ALPHA) - WRITEFIXED(save_p, mobj->alpha); + P_WriteFixed(save_p, mobj->alpha); - WRITEUINT32(save_p, mobj->mobjnum); + P_WriteUINT32(save_p, mobj->mobjnum); } -static void SaveNoEnemiesThinker(const thinker_t *th, const UINT8 type) +static void SaveNoEnemiesThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const noenemies_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); } -static void SaveBounceCheeseThinker(const thinker_t *th, const UINT8 type) +static void SaveBounceCheeseThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const bouncecheese_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->distance); - WRITEFIXED(save_p, ht->floorwasheight); - WRITEFIXED(save_p, ht->ceilingwasheight); - WRITECHAR(save_p, ht->low); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteFixed(save_p, ht->speed); + P_WriteFixed(save_p, ht->distance); + P_WriteFixed(save_p, ht->floorwasheight); + P_WriteFixed(save_p, ht->ceilingwasheight); + P_WriteChar(save_p, ht->low); } -static void SaveContinuousFallThinker(const thinker_t *th, const UINT8 type) +static void SaveContinuousFallThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const continuousfall_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->speed); - WRITEINT32(save_p, ht->direction); - WRITEFIXED(save_p, ht->floorstartheight); - WRITEFIXED(save_p, ht->ceilingstartheight); - WRITEFIXED(save_p, ht->destheight); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteFixed(save_p, ht->speed); + P_WriteINT32(save_p, ht->direction); + P_WriteFixed(save_p, ht->floorstartheight); + P_WriteFixed(save_p, ht->ceilingstartheight); + P_WriteFixed(save_p, ht->destheight); } -static void SaveMarioBlockThinker(const thinker_t *th, const UINT8 type) +static void SaveMarioBlockThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const mariothink_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->speed); - WRITEINT32(save_p, ht->direction); - WRITEFIXED(save_p, ht->floorstartheight); - WRITEFIXED(save_p, ht->ceilingstartheight); - WRITEINT16(save_p, ht->tag); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteFixed(save_p, ht->speed); + P_WriteINT32(save_p, ht->direction); + P_WriteFixed(save_p, ht->floorstartheight); + P_WriteFixed(save_p, ht->ceilingstartheight); + P_WriteINT16(save_p, ht->tag); } -static void SaveMarioCheckThinker(const thinker_t *th, const UINT8 type) +static void SaveMarioCheckThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const mariocheck_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteUINT32(save_p, SaveSector(ht->sector)); } -static void SaveThwompThinker(const thinker_t *th, const UINT8 type) +static void SaveThwompThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const thwomp_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->crushspeed); - WRITEFIXED(save_p, ht->retractspeed); - WRITEINT32(save_p, ht->direction); - WRITEFIXED(save_p, ht->floorstartheight); - WRITEFIXED(save_p, ht->ceilingstartheight); - WRITEINT32(save_p, ht->delay); - WRITEINT16(save_p, ht->tag); - WRITEUINT16(save_p, ht->sound); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteFixed(save_p, ht->crushspeed); + P_WriteFixed(save_p, ht->retractspeed); + P_WriteINT32(save_p, ht->direction); + P_WriteFixed(save_p, ht->floorstartheight); + P_WriteFixed(save_p, ht->ceilingstartheight); + P_WriteINT32(save_p, ht->delay); + P_WriteINT16(save_p, ht->tag); + P_WriteUINT16(save_p, ht->sound); } -static void SaveFloatThinker(const thinker_t *th, const UINT8 type) +static void SaveFloatThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const floatthink_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT16(save_p, ht->tag); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteINT16(save_p, ht->tag); } -static void SaveEachTimeThinker(const thinker_t *th, const UINT8 type) +static void SaveEachTimeThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const eachtime_t *ht = (const void *)th; size_t i; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); for (i = 0; i < MAXPLAYERS; i++) { - WRITECHAR(save_p, ht->playersInArea[i]); + P_WriteChar(save_p, ht->playersInArea[i]); } - WRITECHAR(save_p, ht->triggerOnExit); + P_WriteChar(save_p, ht->triggerOnExit); } -static void SaveRaiseThinker(const thinker_t *th, const UINT8 type) +static void SaveRaiseThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const raise_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT16(save_p, ht->tag); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->ceilingbottom); - WRITEFIXED(save_p, ht->ceilingtop); - WRITEFIXED(save_p, ht->basespeed); - WRITEFIXED(save_p, ht->extraspeed); - WRITEUINT8(save_p, ht->shaketimer); - WRITEUINT8(save_p, ht->flags); + P_WriteUINT8(save_p, type); + P_WriteINT16(save_p, ht->tag); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteFixed(save_p, ht->ceilingbottom); + P_WriteFixed(save_p, ht->ceilingtop); + P_WriteFixed(save_p, ht->basespeed); + P_WriteFixed(save_p, ht->extraspeed); + P_WriteUINT8(save_p, ht->shaketimer); + P_WriteUINT8(save_p, ht->flags); } -static void SaveCeilingThinker(const thinker_t *th, const UINT8 type) +static void SaveCeilingThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const ceiling_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEFIXED(save_p, ht->bottomheight); - WRITEFIXED(save_p, ht->topheight); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->delay); - WRITEFIXED(save_p, ht->delaytimer); - WRITEUINT8(save_p, ht->crush); - WRITEINT32(save_p, ht->texture); - WRITEINT32(save_p, ht->direction); - WRITEINT16(save_p, ht->tag); - WRITEFIXED(save_p, ht->origspeed); - WRITEFIXED(save_p, ht->sourceline); + P_WriteUINT8(save_p, type); + P_WriteUINT8(save_p, ht->type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteFixed(save_p, ht->bottomheight); + P_WriteFixed(save_p, ht->topheight); + P_WriteFixed(save_p, ht->speed); + P_WriteFixed(save_p, ht->delay); + P_WriteFixed(save_p, ht->delaytimer); + P_WriteUINT8(save_p, ht->crush); + P_WriteINT32(save_p, ht->texture); + P_WriteINT32(save_p, ht->direction); + P_WriteINT16(save_p, ht->tag); + P_WriteFixed(save_p, ht->origspeed); + P_WriteFixed(save_p, ht->sourceline); } -static void SaveFloormoveThinker(const thinker_t *th, const UINT8 type) +static void SaveFloormoveThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const floormove_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEUINT8(save_p, ht->crush); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->direction); - WRITEINT32(save_p, ht->texture); - WRITEFIXED(save_p, ht->floordestheight); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->origspeed); - WRITEFIXED(save_p, ht->delay); - WRITEFIXED(save_p, ht->delaytimer); - WRITEINT16(save_p, ht->tag); - WRITEFIXED(save_p, ht->sourceline); + P_WriteUINT8(save_p, type); + P_WriteUINT8(save_p, ht->type); + P_WriteUINT8(save_p, ht->crush); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteINT32(save_p, ht->direction); + P_WriteINT32(save_p, ht->texture); + P_WriteFixed(save_p, ht->floordestheight); + P_WriteFixed(save_p, ht->speed); + P_WriteFixed(save_p, ht->origspeed); + P_WriteFixed(save_p, ht->delay); + P_WriteFixed(save_p, ht->delaytimer); + P_WriteINT16(save_p, ht->tag); + P_WriteFixed(save_p, ht->sourceline); } -static void SaveLightflashThinker(const thinker_t *th, const UINT8 type) +static void SaveLightflashThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const lightflash_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->maxlight); - WRITEINT32(save_p, ht->minlight); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteINT32(save_p, ht->maxlight); + P_WriteINT32(save_p, ht->minlight); } -static void SaveStrobeThinker(const thinker_t *th, const UINT8 type) +static void SaveStrobeThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const strobe_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->count); - WRITEINT16(save_p, ht->minlight); - WRITEINT16(save_p, ht->maxlight); - WRITEINT32(save_p, ht->darktime); - WRITEINT32(save_p, ht->brighttime); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteINT32(save_p, ht->count); + P_WriteINT16(save_p, ht->minlight); + P_WriteINT16(save_p, ht->maxlight); + P_WriteINT32(save_p, ht->darktime); + P_WriteINT32(save_p, ht->brighttime); } -static void SaveGlowThinker(const thinker_t *th, const UINT8 type) +static void SaveGlowThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const glow_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT16(save_p, ht->minlight); - WRITEINT16(save_p, ht->maxlight); - WRITEINT16(save_p, ht->direction); - WRITEINT16(save_p, ht->speed); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteINT16(save_p, ht->minlight); + P_WriteINT16(save_p, ht->maxlight); + P_WriteINT16(save_p, ht->direction); + P_WriteINT16(save_p, ht->speed); } -static inline void SaveFireflickerThinker(const thinker_t *th, const UINT8 type) +static inline void SaveFireflickerThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const fireflicker_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->count); - WRITEINT32(save_p, ht->resetcount); - WRITEINT16(save_p, ht->maxlight); - WRITEINT16(save_p, ht->minlight); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteINT32(save_p, ht->count); + P_WriteINT32(save_p, ht->resetcount); + P_WriteINT16(save_p, ht->maxlight); + P_WriteINT16(save_p, ht->minlight); } -static void SaveElevatorThinker(const thinker_t *th, const UINT8 type) +static void SaveElevatorThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const elevator_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEUINT32(save_p, SaveSector(ht->actionsector)); - WRITEINT32(save_p, ht->direction); - WRITEFIXED(save_p, ht->floordestheight); - WRITEFIXED(save_p, ht->ceilingdestheight); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->origspeed); - WRITEFIXED(save_p, ht->low); - WRITEFIXED(save_p, ht->high); - WRITEFIXED(save_p, ht->distance); - WRITEFIXED(save_p, ht->delay); - WRITEFIXED(save_p, ht->delaytimer); - WRITEFIXED(save_p, ht->floorwasheight); - WRITEFIXED(save_p, ht->ceilingwasheight); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteUINT8(save_p, type); + P_WriteUINT8(save_p, ht->type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteUINT32(save_p, SaveSector(ht->actionsector)); + P_WriteINT32(save_p, ht->direction); + P_WriteFixed(save_p, ht->floordestheight); + P_WriteFixed(save_p, ht->ceilingdestheight); + P_WriteFixed(save_p, ht->speed); + P_WriteFixed(save_p, ht->origspeed); + P_WriteFixed(save_p, ht->low); + P_WriteFixed(save_p, ht->high); + P_WriteFixed(save_p, ht->distance); + P_WriteFixed(save_p, ht->delay); + P_WriteFixed(save_p, ht->delaytimer); + P_WriteFixed(save_p, ht->floorwasheight); + P_WriteFixed(save_p, ht->ceilingwasheight); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); } -static void SaveCrumbleThinker(const thinker_t *th, const UINT8 type) +static void SaveCrumbleThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const crumble_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEUINT32(save_p, SaveSector(ht->actionsector)); - WRITEUINT32(save_p, SavePlayer(ht->player)); // was dummy - WRITEINT32(save_p, ht->direction); - WRITEINT32(save_p, ht->origalpha); - WRITEINT32(save_p, ht->timer); - WRITEFIXED(save_p, ht->speed); - WRITEFIXED(save_p, ht->floorwasheight); - WRITEFIXED(save_p, ht->ceilingwasheight); - WRITEUINT8(save_p, ht->flags); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteUINT32(save_p, SaveSector(ht->actionsector)); + P_WriteUINT32(save_p, SavePlayer(ht->player)); // was dummy + P_WriteINT32(save_p, ht->direction); + P_WriteINT32(save_p, ht->origalpha); + P_WriteINT32(save_p, ht->timer); + P_WriteFixed(save_p, ht->speed); + P_WriteFixed(save_p, ht->floorwasheight); + P_WriteFixed(save_p, ht->ceilingwasheight); + P_WriteUINT8(save_p, ht->flags); } -static inline void SaveScrollThinker(const thinker_t *th, const UINT8 type) +static inline void SaveScrollThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const scroll_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEFIXED(save_p, ht->dx); - WRITEFIXED(save_p, ht->dy); - WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->control); - WRITEFIXED(save_p, ht->last_height); - WRITEFIXED(save_p, ht->vdx); - WRITEFIXED(save_p, ht->vdy); - WRITEINT32(save_p, ht->accel); - WRITEINT32(save_p, ht->exclusive); - WRITEUINT8(save_p, ht->type); + P_WriteUINT8(save_p, type); + P_WriteFixed(save_p, ht->dx); + P_WriteFixed(save_p, ht->dy); + P_WriteINT32(save_p, ht->affectee); + P_WriteINT32(save_p, ht->control); + P_WriteFixed(save_p, ht->last_height); + P_WriteFixed(save_p, ht->vdx); + P_WriteFixed(save_p, ht->vdy); + P_WriteINT32(save_p, ht->accel); + P_WriteINT32(save_p, ht->exclusive); + P_WriteUINT8(save_p, ht->type); } -static inline void SaveFrictionThinker(const thinker_t *th, const UINT8 type) +static inline void SaveFrictionThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const friction_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->friction); - WRITEINT32(save_p, ht->movefactor); - WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->referrer); - WRITEUINT8(save_p, ht->roverfriction); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->friction); + P_WriteINT32(save_p, ht->movefactor); + P_WriteINT32(save_p, ht->affectee); + P_WriteINT32(save_p, ht->referrer); + P_WriteUINT8(save_p, ht->roverfriction); } -static inline void SavePusherThinker(const thinker_t *th, const UINT8 type) +static inline void SavePusherThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const pusher_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEFIXED(save_p, ht->x_mag); - WRITEFIXED(save_p, ht->y_mag); - WRITEFIXED(save_p, ht->z_mag); - WRITEINT32(save_p, ht->affectee); - WRITEUINT8(save_p, ht->roverpusher); - WRITEINT32(save_p, ht->referrer); - WRITEINT32(save_p, ht->exclusive); - WRITEINT32(save_p, ht->slider); + P_WriteUINT8(save_p, type); + P_WriteUINT8(save_p, ht->type); + P_WriteFixed(save_p, ht->x_mag); + P_WriteFixed(save_p, ht->y_mag); + P_WriteFixed(save_p, ht->z_mag); + P_WriteINT32(save_p, ht->affectee); + P_WriteUINT8(save_p, ht->roverpusher); + P_WriteINT32(save_p, ht->referrer); + P_WriteINT32(save_p, ht->exclusive); + P_WriteINT32(save_p, ht->slider); } -static void SaveLaserThinker(const thinker_t *th, const UINT8 type) +static void SaveLaserThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const laserthink_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT16(save_p, ht->tag); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEUINT8(save_p, ht->nobosses); + P_WriteUINT8(save_p, type); + P_WriteINT16(save_p, ht->tag); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteUINT8(save_p, ht->nobosses); } -static void SaveLightlevelThinker(const thinker_t *th, const UINT8 type) +static void SaveLightlevelThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const lightlevel_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT16(save_p, ht->sourcelevel); - WRITEINT16(save_p, ht->destlevel); - WRITEFIXED(save_p, ht->fixedcurlevel); - WRITEFIXED(save_p, ht->fixedpertic); - WRITEINT32(save_p, ht->timer); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteINT16(save_p, ht->sourcelevel); + P_WriteINT16(save_p, ht->destlevel); + P_WriteFixed(save_p, ht->fixedcurlevel); + P_WriteFixed(save_p, ht->fixedpertic); + P_WriteINT32(save_p, ht->timer); } -static void SaveExecutorThinker(const thinker_t *th, const UINT8 type) +static void SaveExecutorThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const executor_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveLine(ht->line)); - WRITEUINT32(save_p, SaveMobjnum(ht->caller)); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEINT32(save_p, ht->timer); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveLine(ht->line)); + P_WriteUINT32(save_p, SaveMobjnum(ht->caller)); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteINT32(save_p, ht->timer); } -static void SaveDisappearThinker(const thinker_t *th, const UINT8 type) +static void SaveDisappearThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const disappear_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, ht->appeartime); - WRITEUINT32(save_p, ht->disappeartime); - WRITEUINT32(save_p, ht->offset); - WRITEUINT32(save_p, ht->timer); - WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->sourceline); - WRITEINT32(save_p, ht->exists); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, ht->appeartime); + P_WriteUINT32(save_p, ht->disappeartime); + P_WriteUINT32(save_p, ht->offset); + P_WriteUINT32(save_p, ht->timer); + P_WriteINT32(save_p, ht->affectee); + P_WriteINT32(save_p, ht->sourceline); + P_WriteINT32(save_p, ht->exists); } -static void SaveFadeThinker(const thinker_t *th, const UINT8 type) +static void SaveFadeThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const fade_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, CheckAddNetColormapToList(ht->dest_exc)); - WRITEUINT32(save_p, ht->sectornum); - WRITEUINT32(save_p, ht->ffloornum); - WRITEINT32(save_p, ht->alpha); - WRITEINT16(save_p, ht->sourcevalue); - WRITEINT16(save_p, ht->destvalue); - WRITEINT16(save_p, ht->destlightlevel); - WRITEINT16(save_p, ht->speed); - WRITEUINT8(save_p, (UINT8)ht->ticbased); - WRITEINT32(save_p, ht->timer); - WRITEUINT8(save_p, ht->doexists); - WRITEUINT8(save_p, ht->dotranslucent); - WRITEUINT8(save_p, ht->dolighting); - WRITEUINT8(save_p, ht->docolormap); - WRITEUINT8(save_p, ht->docollision); - WRITEUINT8(save_p, ht->doghostfade); - WRITEUINT8(save_p, ht->exactalpha); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, CheckAddNetColormapToList(ht->dest_exc)); + P_WriteUINT32(save_p, ht->sectornum); + P_WriteUINT32(save_p, ht->ffloornum); + P_WriteINT32(save_p, ht->alpha); + P_WriteINT16(save_p, ht->sourcevalue); + P_WriteINT16(save_p, ht->destvalue); + P_WriteINT16(save_p, ht->destlightlevel); + P_WriteINT16(save_p, ht->speed); + P_WriteUINT8(save_p, (UINT8)ht->ticbased); + P_WriteINT32(save_p, ht->timer); + P_WriteUINT8(save_p, ht->doexists); + P_WriteUINT8(save_p, ht->dotranslucent); + P_WriteUINT8(save_p, ht->dolighting); + P_WriteUINT8(save_p, ht->docolormap); + P_WriteUINT8(save_p, ht->docollision); + P_WriteUINT8(save_p, ht->doghostfade); + P_WriteUINT8(save_p, ht->exactalpha); } -static void SaveFadeColormapThinker(const thinker_t *th, const UINT8 type) +static void SaveFadeColormapThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const fadecolormap_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSector(ht->sector)); - WRITEUINT32(save_p, CheckAddNetColormapToList(ht->source_exc)); - WRITEUINT32(save_p, CheckAddNetColormapToList(ht->dest_exc)); - WRITEUINT8(save_p, (UINT8)ht->ticbased); - WRITEINT32(save_p, ht->duration); - WRITEINT32(save_p, ht->timer); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveSector(ht->sector)); + P_WriteUINT32(save_p, CheckAddNetColormapToList(ht->source_exc)); + P_WriteUINT32(save_p, CheckAddNetColormapToList(ht->dest_exc)); + P_WriteUINT8(save_p, (UINT8)ht->ticbased); + P_WriteINT32(save_p, ht->duration); + P_WriteINT32(save_p, ht->timer); } -static void SavePlaneDisplaceThinker(const thinker_t *th, const UINT8 type) +static void SavePlaneDisplaceThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const planedisplace_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->affectee); - WRITEINT32(save_p, ht->control); - WRITEFIXED(save_p, ht->last_height); - WRITEFIXED(save_p, ht->speed); - WRITEUINT8(save_p, ht->type); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->affectee); + P_WriteINT32(save_p, ht->control); + P_WriteFixed(save_p, ht->last_height); + P_WriteFixed(save_p, ht->speed); + P_WriteUINT8(save_p, ht->type); } -static inline void SaveDynamicLineSlopeThinker(const thinker_t *th, const UINT8 type) +static inline void SaveDynamicLineSlopeThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const dynlineplanethink_t* ht = (const void*)th; - WRITEUINT8(save_p, type); - WRITEUINT8(save_p, ht->type); - WRITEUINT32(save_p, SaveSlope(ht->slope)); - WRITEUINT32(save_p, SaveLine(ht->sourceline)); - WRITEFIXED(save_p, ht->extent); + P_WriteUINT8(save_p, type); + P_WriteUINT8(save_p, ht->type); + P_WriteUINT32(save_p, SaveSlope(ht->slope)); + P_WriteUINT32(save_p, SaveLine(ht->sourceline)); + P_WriteFixed(save_p, ht->extent); } -static inline void SaveDynamicVertexSlopeThinker(const thinker_t *th, const UINT8 type) +static inline void SaveDynamicVertexSlopeThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { size_t i; const dynvertexplanethink_t* ht = (const void*)th; - WRITEUINT8(save_p, type); - WRITEUINT32(save_p, SaveSlope(ht->slope)); + P_WriteUINT8(save_p, type); + P_WriteUINT32(save_p, SaveSlope(ht->slope)); for (i = 0; i < 3; i++) - WRITEUINT32(save_p, SaveSector(ht->secs[i])); - WRITEMEM(save_p, ht->vex, sizeof(ht->vex)); - WRITEMEM(save_p, ht->origsecheights, sizeof(ht->origsecheights)); - WRITEMEM(save_p, ht->origvecheights, sizeof(ht->origvecheights)); - WRITEUINT8(save_p, ht->relative); + P_WriteUINT32(save_p, SaveSector(ht->secs[i])); + P_WriteMem(save_p, ht->vex, sizeof(ht->vex)); + P_WriteMem(save_p, ht->origsecheights, sizeof(ht->origsecheights)); + P_WriteMem(save_p, ht->origvecheights, sizeof(ht->origvecheights)); + P_WriteUINT8(save_p, ht->relative); } -static inline void SavePolyrotatetThinker(const thinker_t *th, const UINT8 type) +static inline void SavePolyrotatetThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const polyrotate_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->speed); - WRITEINT32(save_p, ht->distance); - WRITEUINT8(save_p, ht->turnobjs); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->polyObjNum); + P_WriteINT32(save_p, ht->speed); + P_WriteINT32(save_p, ht->distance); + P_WriteUINT8(save_p, ht->turnobjs); } -static void SavePolymoveThinker(const thinker_t *th, const UINT8 type) +static void SavePolymoveThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const polymove_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->speed); - WRITEFIXED(save_p, ht->momx); - WRITEFIXED(save_p, ht->momy); - WRITEINT32(save_p, ht->distance); - WRITEANGLE(save_p, ht->angle); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->polyObjNum); + P_WriteINT32(save_p, ht->speed); + P_WriteFixed(save_p, ht->momx); + P_WriteFixed(save_p, ht->momy); + P_WriteINT32(save_p, ht->distance); + P_WriteAngle(save_p, ht->angle); } -static void SavePolywaypointThinker(const thinker_t *th, UINT8 type) +static void SavePolywaypointThinker(save_t *save_p, const thinker_t *th, UINT8 type) { const polywaypoint_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->speed); - WRITEINT32(save_p, ht->sequence); - WRITEINT32(save_p, ht->pointnum); - WRITEINT32(save_p, ht->direction); - WRITEUINT8(save_p, ht->returnbehavior); - WRITEUINT8(save_p, ht->continuous); - WRITEUINT8(save_p, ht->stophere); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->polyObjNum); + P_WriteINT32(save_p, ht->speed); + P_WriteINT32(save_p, ht->sequence); + P_WriteINT32(save_p, ht->pointnum); + P_WriteINT32(save_p, ht->direction); + P_WriteUINT8(save_p, ht->returnbehavior); + P_WriteUINT8(save_p, ht->continuous); + P_WriteUINT8(save_p, ht->stophere); } -static void SavePolyslidedoorThinker(const thinker_t *th, const UINT8 type) +static void SavePolyslidedoorThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const polyslidedoor_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->delay); - WRITEINT32(save_p, ht->delayCount); - WRITEINT32(save_p, ht->initSpeed); - WRITEINT32(save_p, ht->speed); - WRITEINT32(save_p, ht->initDistance); - WRITEINT32(save_p, ht->distance); - WRITEUINT32(save_p, ht->initAngle); - WRITEUINT32(save_p, ht->angle); - WRITEUINT32(save_p, ht->revAngle); - WRITEFIXED(save_p, ht->momx); - WRITEFIXED(save_p, ht->momy); - WRITEUINT8(save_p, ht->closing); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->polyObjNum); + P_WriteINT32(save_p, ht->delay); + P_WriteINT32(save_p, ht->delayCount); + P_WriteINT32(save_p, ht->initSpeed); + P_WriteINT32(save_p, ht->speed); + P_WriteINT32(save_p, ht->initDistance); + P_WriteINT32(save_p, ht->distance); + P_WriteUINT32(save_p, ht->initAngle); + P_WriteUINT32(save_p, ht->angle); + P_WriteUINT32(save_p, ht->revAngle); + P_WriteFixed(save_p, ht->momx); + P_WriteFixed(save_p, ht->momy); + P_WriteUINT8(save_p, ht->closing); } -static void SavePolyswingdoorThinker(const thinker_t *th, const UINT8 type) +static void SavePolyswingdoorThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const polyswingdoor_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->delay); - WRITEINT32(save_p, ht->delayCount); - WRITEINT32(save_p, ht->initSpeed); - WRITEINT32(save_p, ht->speed); - WRITEINT32(save_p, ht->initDistance); - WRITEINT32(save_p, ht->distance); - WRITEUINT8(save_p, ht->closing); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->polyObjNum); + P_WriteINT32(save_p, ht->delay); + P_WriteINT32(save_p, ht->delayCount); + P_WriteINT32(save_p, ht->initSpeed); + P_WriteINT32(save_p, ht->speed); + P_WriteINT32(save_p, ht->initDistance); + P_WriteINT32(save_p, ht->distance); + P_WriteUINT8(save_p, ht->closing); } -static void SavePolydisplaceThinker(const thinker_t *th, const UINT8 type) +static void SavePolydisplaceThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const polydisplace_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEUINT32(save_p, SaveSector(ht->controlSector)); - WRITEFIXED(save_p, ht->dx); - WRITEFIXED(save_p, ht->dy); - WRITEFIXED(save_p, ht->oldHeights); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->polyObjNum); + P_WriteUINT32(save_p, SaveSector(ht->controlSector)); + P_WriteFixed(save_p, ht->dx); + P_WriteFixed(save_p, ht->dy); + P_WriteFixed(save_p, ht->oldHeights); } -static void SavePolyrotdisplaceThinker(const thinker_t *th, const UINT8 type) +static void SavePolyrotdisplaceThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const polyrotdisplace_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEUINT32(save_p, SaveSector(ht->controlSector)); - WRITEFIXED(save_p, ht->rotscale); - WRITEUINT8(save_p, ht->turnobjs); - WRITEFIXED(save_p, ht->oldHeights); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->polyObjNum); + P_WriteUINT32(save_p, SaveSector(ht->controlSector)); + P_WriteFixed(save_p, ht->rotscale); + P_WriteUINT8(save_p, ht->turnobjs); + P_WriteFixed(save_p, ht->oldHeights); } -static void SavePolyfadeThinker(const thinker_t *th, const UINT8 type) +static void SavePolyfadeThinker(save_t *save_p, const thinker_t *th, const UINT8 type) { const polyfade_t *ht = (const void *)th; - WRITEUINT8(save_p, type); - WRITEINT32(save_p, ht->polyObjNum); - WRITEINT32(save_p, ht->sourcevalue); - WRITEINT32(save_p, ht->destvalue); - WRITEUINT8(save_p, (UINT8)ht->docollision); - WRITEUINT8(save_p, (UINT8)ht->doghostfade); - WRITEUINT8(save_p, (UINT8)ht->ticbased); - WRITEINT32(save_p, ht->duration); - WRITEINT32(save_p, ht->timer); + P_WriteUINT8(save_p, type); + P_WriteINT32(save_p, ht->polyObjNum); + P_WriteINT32(save_p, ht->sourcevalue); + P_WriteINT32(save_p, ht->destvalue); + P_WriteUINT8(save_p, (UINT8)ht->docollision); + P_WriteUINT8(save_p, (UINT8)ht->doghostfade); + P_WriteUINT8(save_p, (UINT8)ht->ticbased); + P_WriteINT32(save_p, ht->duration); + P_WriteINT32(save_p, ht->timer); } -static void P_NetArchiveThinkers(void) +static void P_NetArchiveThinkers(save_t *save_p) { const thinker_t *th; UINT32 i; - WRITEUINT32(save_p, ARCHIVEBLOCK_THINKERS); + P_WriteUINT32(save_p, ARCHIVEBLOCK_THINKERS); for (i = 0; i < NUM_THINKERLISTS; i++) { @@ -2738,7 +2977,7 @@ static void P_NetArchiveThinkers(void) if (th->function.acp1 == (actionf_p1)P_MobjThinker) { - SaveMobjThinker(th, tc_mobj); + SaveMobjThinker(save_p, th, tc_mobj); continue; } #ifdef PARANOIA @@ -2746,202 +2985,202 @@ static void P_NetArchiveThinkers(void) #endif else if (th->function.acp1 == (actionf_p1)T_MoveCeiling) { - SaveCeilingThinker(th, tc_ceiling); + SaveCeilingThinker(save_p, th, tc_ceiling); continue; } else if (th->function.acp1 == (actionf_p1)T_CrushCeiling) { - SaveCeilingThinker(th, tc_crushceiling); + SaveCeilingThinker(save_p, th, tc_crushceiling); continue; } else if (th->function.acp1 == (actionf_p1)T_MoveFloor) { - SaveFloormoveThinker(th, tc_floor); + SaveFloormoveThinker(save_p, th, tc_floor); continue; } else if (th->function.acp1 == (actionf_p1)T_LightningFlash) { - SaveLightflashThinker(th, tc_flash); + SaveLightflashThinker(save_p, th, tc_flash); continue; } else if (th->function.acp1 == (actionf_p1)T_StrobeFlash) { - SaveStrobeThinker(th, tc_strobe); + SaveStrobeThinker(save_p, th, tc_strobe); continue; } else if (th->function.acp1 == (actionf_p1)T_Glow) { - SaveGlowThinker(th, tc_glow); + SaveGlowThinker(save_p, th, tc_glow); continue; } else if (th->function.acp1 == (actionf_p1)T_FireFlicker) { - SaveFireflickerThinker(th, tc_fireflicker); + SaveFireflickerThinker(save_p, th, tc_fireflicker); continue; } else if (th->function.acp1 == (actionf_p1)T_MoveElevator) { - SaveElevatorThinker(th, tc_elevator); + SaveElevatorThinker(save_p, th, tc_elevator); continue; } else if (th->function.acp1 == (actionf_p1)T_ContinuousFalling) { - SaveContinuousFallThinker(th, tc_continuousfalling); + SaveContinuousFallThinker(save_p, th, tc_continuousfalling); continue; } else if (th->function.acp1 == (actionf_p1)T_ThwompSector) { - SaveThwompThinker(th, tc_thwomp); + SaveThwompThinker(save_p, th, tc_thwomp); continue; } else if (th->function.acp1 == (actionf_p1)T_NoEnemiesSector) { - SaveNoEnemiesThinker(th, tc_noenemies); + SaveNoEnemiesThinker(save_p, th, tc_noenemies); continue; } else if (th->function.acp1 == (actionf_p1)T_EachTimeThinker) { - SaveEachTimeThinker(th, tc_eachtime); + SaveEachTimeThinker(save_p, th, tc_eachtime); continue; } else if (th->function.acp1 == (actionf_p1)T_RaiseSector) { - SaveRaiseThinker(th, tc_raisesector); + SaveRaiseThinker(save_p, th, tc_raisesector); continue; } else if (th->function.acp1 == (actionf_p1)T_CameraScanner) { - SaveElevatorThinker(th, tc_camerascanner); + SaveElevatorThinker(save_p, th, tc_camerascanner); continue; } else if (th->function.acp1 == (actionf_p1)T_Scroll) { - SaveScrollThinker(th, tc_scroll); + SaveScrollThinker(save_p, th, tc_scroll); continue; } else if (th->function.acp1 == (actionf_p1)T_Friction) { - SaveFrictionThinker(th, tc_friction); + SaveFrictionThinker(save_p, th, tc_friction); continue; } else if (th->function.acp1 == (actionf_p1)T_Pusher) { - SavePusherThinker(th, tc_pusher); + SavePusherThinker(save_p, th, tc_pusher); continue; } else if (th->function.acp1 == (actionf_p1)T_BounceCheese) { - SaveBounceCheeseThinker(th, tc_bouncecheese); + SaveBounceCheeseThinker(save_p, th, tc_bouncecheese); continue; } else if (th->function.acp1 == (actionf_p1)T_StartCrumble) { - SaveCrumbleThinker(th, tc_startcrumble); + SaveCrumbleThinker(save_p, th, tc_startcrumble); continue; } else if (th->function.acp1 == (actionf_p1)T_MarioBlock) { - SaveMarioBlockThinker(th, tc_marioblock); + SaveMarioBlockThinker(save_p, th, tc_marioblock); continue; } else if (th->function.acp1 == (actionf_p1)T_MarioBlockChecker) { - SaveMarioCheckThinker(th, tc_marioblockchecker); + SaveMarioCheckThinker(save_p, th, tc_marioblockchecker); continue; } else if (th->function.acp1 == (actionf_p1)T_FloatSector) { - SaveFloatThinker(th, tc_floatsector); + SaveFloatThinker(save_p, th, tc_floatsector); continue; } else if (th->function.acp1 == (actionf_p1)T_LaserFlash) { - SaveLaserThinker(th, tc_laserflash); + SaveLaserThinker(save_p, th, tc_laserflash); continue; } else if (th->function.acp1 == (actionf_p1)T_LightFade) { - SaveLightlevelThinker(th, tc_lightfade); + SaveLightlevelThinker(save_p, th, tc_lightfade); continue; } else if (th->function.acp1 == (actionf_p1)T_ExecutorDelay) { - SaveExecutorThinker(th, tc_executor); + SaveExecutorThinker(save_p, th, tc_executor); continue; } else if (th->function.acp1 == (actionf_p1)T_Disappear) { - SaveDisappearThinker(th, tc_disappear); + SaveDisappearThinker(save_p, th, tc_disappear); continue; } else if (th->function.acp1 == (actionf_p1)T_Fade) { - SaveFadeThinker(th, tc_fade); + SaveFadeThinker(save_p, th, tc_fade); continue; } else if (th->function.acp1 == (actionf_p1)T_FadeColormap) { - SaveFadeColormapThinker(th, tc_fadecolormap); + SaveFadeColormapThinker(save_p, th, tc_fadecolormap); continue; } else if (th->function.acp1 == (actionf_p1)T_PlaneDisplace) { - SavePlaneDisplaceThinker(th, tc_planedisplace); + SavePlaneDisplaceThinker(save_p, th, tc_planedisplace); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjRotate) { - SavePolyrotatetThinker(th, tc_polyrotate); + SavePolyrotatetThinker(save_p, th, tc_polyrotate); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjMove) { - SavePolymoveThinker(th, tc_polymove); + SavePolymoveThinker(save_p, th, tc_polymove); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjWaypoint) { - SavePolywaypointThinker(th, tc_polywaypoint); + SavePolywaypointThinker(save_p, th, tc_polywaypoint); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyDoorSlide) { - SavePolyslidedoorThinker(th, tc_polyslidedoor); + SavePolyslidedoorThinker(save_p, th, tc_polyslidedoor); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyDoorSwing) { - SavePolyswingdoorThinker(th, tc_polyswingdoor); + SavePolyswingdoorThinker(save_p, th, tc_polyswingdoor); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjFlag) { - SavePolymoveThinker(th, tc_polyflag); + SavePolymoveThinker(save_p, th, tc_polyflag); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjDisplace) { - SavePolydisplaceThinker(th, tc_polydisplace); + SavePolydisplaceThinker(save_p, th, tc_polydisplace); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjRotDisplace) { - SavePolyrotdisplaceThinker(th, tc_polyrotdisplace); + SavePolyrotdisplaceThinker(save_p, th, tc_polyrotdisplace); continue; } else if (th->function.acp1 == (actionf_p1)T_PolyObjFade) { - SavePolyfadeThinker(th, tc_polyfade); + SavePolyfadeThinker(save_p, th, tc_polyfade); continue; } else if (th->function.acp1 == (actionf_p1)T_DynamicSlopeLine) { - SaveDynamicLineSlopeThinker(th, tc_dynslopeline); + SaveDynamicLineSlopeThinker(save_p, th, tc_dynslopeline); continue; } else if (th->function.acp1 == (actionf_p1)T_DynamicSlopeVert) { - SaveDynamicVertexSlopeThinker(th, tc_dynslopevert); + SaveDynamicVertexSlopeThinker(save_p, th, tc_dynslopevert); continue; } #ifdef PARANOIA @@ -2952,7 +3191,7 @@ static void P_NetArchiveThinkers(void) CONS_Debug(DBG_NETPLAY, "%u thinkers saved in list %d\n", numsaved, i); - WRITEUINT8(save_p, tc_end); + P_WriteUINT8(save_p, tc_end); } } @@ -3016,7 +3255,7 @@ static inline pslope_t *LoadSlope(UINT32 slopeid) return NULL; } -static thinker_t* LoadMobjThinker(actionf_p1 thinker) +static thinker_t* LoadMobjThinker(save_t *save_p, actionf_p1 thinker) { thinker_t *next; mobj_t *mobj; @@ -3026,35 +3265,35 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) fixed_t z, floorz, ceilingz; ffloor_t *floorrover = NULL, *ceilingrover = NULL; - diff = READUINT32(save_p); + diff = P_ReadUINT32(save_p); if (diff & MD_MORE) - diff2 = READUINT32(save_p); + diff2 = P_ReadUINT32(save_p); else diff2 = 0; - next = (void *)(size_t)READUINT32(save_p); + next = (void *)(size_t)P_ReadUINT32(save_p); - z = READFIXED(save_p); // Force this so 3dfloor problems don't arise. - floorz = READFIXED(save_p); - ceilingz = READFIXED(save_p); + z = P_ReadFixed(save_p); // Force this so 3dfloor problems don't arise. + floorz = P_ReadFixed(save_p); + ceilingz = P_ReadFixed(save_p); if (diff2 & MD2_FLOORROVER) { - sector_t *sec = LoadSector(READUINT32(save_p)); - UINT16 id = READUINT16(save_p); + sector_t *sec = LoadSector(P_ReadUINT32(save_p)); + UINT16 id = P_ReadUINT16(save_p); floorrover = P_GetFFloorByID(sec, id); } if (diff2 & MD2_CEILINGROVER) { - sector_t *sec = LoadSector(READUINT32(save_p)); - UINT16 id = READUINT16(save_p); + sector_t *sec = LoadSector(P_ReadUINT32(save_p)); + UINT16 id = P_ReadUINT16(save_p); ceilingrover = P_GetFFloorByID(sec, id); } if (diff & MD_SPAWNPOINT) { - UINT16 spawnpointnum = READUINT16(save_p); + UINT16 spawnpointnum = P_ReadUINT16(save_p); if (mapthings[spawnpointnum].type == 1713) // NiGHTS Hoop special case { @@ -3080,7 +3319,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->ceilingrover = ceilingrover; if (diff & MD_TYPE) - mobj->type = READUINT32(save_p); + mobj->type = P_ReadUINT32(save_p); else { for (i = 0; i < NUMMOBJTYPES; i++) @@ -3099,11 +3338,11 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->info = &mobjinfo[mobj->type]; if (diff & MD_POS) { - mobj->x = READFIXED(save_p); - mobj->y = READFIXED(save_p); - mobj->angle = READANGLE(save_p); - mobj->pitch = READANGLE(save_p); - mobj->roll = READANGLE(save_p); + mobj->x = P_ReadFixed(save_p); + mobj->y = P_ReadFixed(save_p); + mobj->angle = P_ReadAngle(save_p); + mobj->pitch = P_ReadAngle(save_p); + mobj->roll = P_ReadAngle(save_p); } else { @@ -3115,47 +3354,47 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) } if (diff & MD_MOM) { - mobj->momx = READFIXED(save_p); - mobj->momy = READFIXED(save_p); - mobj->momz = READFIXED(save_p); - mobj->pmomz = READFIXED(save_p); + mobj->momx = P_ReadFixed(save_p); + mobj->momy = P_ReadFixed(save_p); + mobj->momz = P_ReadFixed(save_p); + mobj->pmomz = P_ReadFixed(save_p); } // otherwise they're zero, and the memset took care of it if (diff & MD_RADIUS) - mobj->radius = READFIXED(save_p); + mobj->radius = P_ReadFixed(save_p); else mobj->radius = mobj->info->radius; if (diff & MD_HEIGHT) - mobj->height = READFIXED(save_p); + mobj->height = P_ReadFixed(save_p); else mobj->height = mobj->info->height; if (diff & MD_FLAGS) - mobj->flags = READUINT32(save_p); + mobj->flags = P_ReadUINT32(save_p); else mobj->flags = mobj->info->flags; if (diff & MD_FLAGS2) - mobj->flags2 = READUINT32(save_p); + mobj->flags2 = P_ReadUINT32(save_p); if (diff & MD_HEALTH) - mobj->health = READINT32(save_p); + mobj->health = P_ReadINT32(save_p); else mobj->health = mobj->info->spawnhealth; if (diff & MD_RTIME) - mobj->reactiontime = READINT32(save_p); + mobj->reactiontime = P_ReadINT32(save_p); else mobj->reactiontime = mobj->info->reactiontime; if (diff & MD_STATE) - mobj->state = &states[READUINT16(save_p)]; + mobj->state = &states[P_ReadUINT16(save_p)]; else mobj->state = &states[mobj->info->spawnstate]; if (diff & MD_TICS) - mobj->tics = READINT32(save_p); + mobj->tics = P_ReadINT32(save_p); else mobj->tics = mobj->state->tics; if (diff & MD_SPRITE) { - mobj->sprite = READUINT16(save_p); + mobj->sprite = P_ReadUINT16(save_p); if (mobj->sprite == SPR_PLAY) - mobj->sprite2 = READUINT16(save_p); + mobj->sprite2 = P_ReadUINT16(save_p); } else { mobj->sprite = mobj->state->sprite; @@ -3164,8 +3403,8 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) } if (diff & MD_FRAME) { - mobj->frame = READUINT32(save_p); - mobj->anim_duration = READUINT16(save_p); + mobj->frame = P_ReadUINT32(save_p); + mobj->anim_duration = P_ReadUINT16(save_p); } else { @@ -3173,130 +3412,130 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) mobj->anim_duration = (UINT16)mobj->state->var2; } if (diff & MD_EFLAGS) - mobj->eflags = READUINT16(save_p); + mobj->eflags = P_ReadUINT16(save_p); if (diff & MD_PLAYER) { - i = READUINT8(save_p); + i = P_ReadUINT8(save_p); mobj->player = &players[i]; mobj->player->mo = mobj; } if (diff & MD_MOVEDIR) - mobj->movedir = READANGLE(save_p); + mobj->movedir = P_ReadAngle(save_p); if (diff & MD_MOVECOUNT) - mobj->movecount = READINT32(save_p); + mobj->movecount = P_ReadINT32(save_p); if (diff & MD_THRESHOLD) - mobj->threshold = READINT32(save_p); + mobj->threshold = P_ReadINT32(save_p); if (diff & MD_LASTLOOK) - mobj->lastlook = READINT32(save_p); + mobj->lastlook = P_ReadINT32(save_p); else mobj->lastlook = -1; if (diff & MD_TARGET) - mobj->target = (mobj_t *)(size_t)READUINT32(save_p); + mobj->target = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (diff & MD_TRACER) - mobj->tracer = (mobj_t *)(size_t)READUINT32(save_p); + mobj->tracer = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (diff & MD_FRICTION) - mobj->friction = READFIXED(save_p); + mobj->friction = P_ReadFixed(save_p); else mobj->friction = ORIG_FRICTION; if (diff & MD_MOVEFACTOR) - mobj->movefactor = READFIXED(save_p); + mobj->movefactor = P_ReadFixed(save_p); else mobj->movefactor = FRACUNIT; if (diff & MD_FUSE) - mobj->fuse = READINT32(save_p); + mobj->fuse = P_ReadINT32(save_p); if (diff & MD_WATERTOP) - mobj->watertop = READFIXED(save_p); + mobj->watertop = P_ReadFixed(save_p); if (diff & MD_WATERBOTTOM) - mobj->waterbottom = READFIXED(save_p); + mobj->waterbottom = P_ReadFixed(save_p); if (diff & MD_SCALE) - mobj->scale = READFIXED(save_p); + mobj->scale = P_ReadFixed(save_p); else mobj->scale = FRACUNIT; if (diff & MD_DSCALE) - mobj->destscale = READFIXED(save_p); + mobj->destscale = P_ReadFixed(save_p); else mobj->destscale = mobj->scale; if (diff2 & MD2_SCALESPEED) - mobj->scalespeed = READFIXED(save_p); + mobj->scalespeed = P_ReadFixed(save_p); else mobj->scalespeed = FRACUNIT/12; if (diff2 & MD2_CUSVAL) - mobj->cusval = READINT32(save_p); + mobj->cusval = P_ReadINT32(save_p); if (diff2 & MD2_CVMEM) - mobj->cvmem = READINT32(save_p); + mobj->cvmem = P_ReadINT32(save_p); if (diff2 & MD2_SKIN) - mobj->skin = skins[READUINT8(save_p)]; + mobj->skin = skins[P_ReadUINT8(save_p)]; if (diff2 & MD2_COLOR) - mobj->color = READUINT16(save_p); + mobj->color = P_ReadUINT16(save_p); if (diff2 & MD2_EXTVAL1) - mobj->extravalue1 = READINT32(save_p); + mobj->extravalue1 = P_ReadINT32(save_p); if (diff2 & MD2_EXTVAL2) - mobj->extravalue2 = READINT32(save_p); + mobj->extravalue2 = P_ReadINT32(save_p); if (diff2 & MD2_HNEXT) - mobj->hnext = (mobj_t *)(size_t)READUINT32(save_p); + mobj->hnext = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (diff2 & MD2_HPREV) - mobj->hprev = (mobj_t *)(size_t)READUINT32(save_p); + mobj->hprev = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (diff2 & MD2_SLOPE) - mobj->standingslope = P_SlopeById(READUINT16(save_p)); + mobj->standingslope = P_SlopeById(P_ReadUINT16(save_p)); if (diff2 & MD2_COLORIZED) - mobj->colorized = READUINT8(save_p); + mobj->colorized = P_ReadUINT8(save_p); if (diff2 & MD2_MIRRORED) - mobj->mirrored = READUINT8(save_p); + mobj->mirrored = P_ReadUINT8(save_p); if (diff2 & MD2_SPRITEROLL) - mobj->spriteroll = READANGLE(save_p); + mobj->spriteroll = P_ReadAngle(save_p); if (diff2 & MD2_SHADOWSCALE) - mobj->shadowscale = READFIXED(save_p); + mobj->shadowscale = P_ReadFixed(save_p); if (diff2 & MD2_RENDERFLAGS) - mobj->renderflags = READUINT32(save_p); + mobj->renderflags = P_ReadUINT32(save_p); if (diff2 & MD2_BLENDMODE) - mobj->blendmode = READINT32(save_p); + mobj->blendmode = P_ReadINT32(save_p); else mobj->blendmode = AST_TRANSLUCENT; if (diff2 & MD2_SPRITEXSCALE) - mobj->spritexscale = READFIXED(save_p); + mobj->spritexscale = P_ReadFixed(save_p); else mobj->spritexscale = FRACUNIT; if (diff2 & MD2_SPRITEYSCALE) - mobj->spriteyscale = READFIXED(save_p); + mobj->spriteyscale = P_ReadFixed(save_p); else mobj->spriteyscale = FRACUNIT; if (diff2 & MD2_SPRITEXOFFSET) - mobj->spritexoffset = READFIXED(save_p); + mobj->spritexoffset = P_ReadFixed(save_p); if (diff2 & MD2_SPRITEYOFFSET) - mobj->spriteyoffset = READFIXED(save_p); + mobj->spriteyoffset = P_ReadFixed(save_p); if (diff2 & MD2_FLOORSPRITESLOPE) { pslope_t *slope = (pslope_t *)P_CreateFloorSpriteSlope(mobj); - slope->zdelta = READFIXED(save_p); - slope->zangle = READANGLE(save_p); - slope->xydirection = READANGLE(save_p); + slope->zdelta = P_ReadFixed(save_p); + slope->zangle = P_ReadAngle(save_p); + slope->xydirection = P_ReadAngle(save_p); - slope->o.x = READFIXED(save_p); - slope->o.y = READFIXED(save_p); - slope->o.z = READFIXED(save_p); + slope->o.x = P_ReadFixed(save_p); + slope->o.y = P_ReadFixed(save_p); + slope->o.z = P_ReadFixed(save_p); - slope->d.x = READFIXED(save_p); - slope->d.y = READFIXED(save_p); + slope->d.x = P_ReadFixed(save_p); + slope->d.y = P_ReadFixed(save_p); - slope->normal.x = READFIXED(save_p); - slope->normal.y = READFIXED(save_p); - slope->normal.z = READFIXED(save_p); + slope->normal.x = P_ReadFixed(save_p); + slope->normal.y = P_ReadFixed(save_p); + slope->normal.z = P_ReadFixed(save_p); slope->moved = true; } if (diff2 & MD2_DRAWONLYFORPLAYER) - mobj->drawonlyforplayer = &players[READUINT8(save_p)]; + mobj->drawonlyforplayer = &players[P_ReadUINT8(save_p)]; if (diff2 & MD2_DONTDRAWFORVIEWMOBJ) - mobj->dontdrawforviewmobj = (mobj_t *)(size_t)READUINT32(save_p); + mobj->dontdrawforviewmobj = (mobj_t *)(size_t)P_ReadUINT32(save_p); if (diff2 & MD2_DISPOFFSET) - mobj->dispoffset = READINT32(save_p); + mobj->dispoffset = P_ReadINT32(save_p); else mobj->dispoffset = mobj->info->dispoffset; if (diff2 & MD2_TRANSLATION) - mobj->translation = READUINT16(save_p); + mobj->translation = P_ReadUINT16(save_p); if (diff2 & MD2_ALPHA) - mobj->alpha = READFIXED(save_p); + mobj->alpha = P_ReadFixed(save_p); else mobj->alpha = FRACUNIT; @@ -3314,7 +3553,7 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) // set sprev, snext, bprev, bnext, subsector P_SetThingPosition(mobj); - mobj->mobjnum = READUINT32(save_p); + mobj->mobjnum = P_ReadUINT32(save_p); if (mobj->player) { @@ -3343,25 +3582,25 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker) return &mobj->thinker; } -static thinker_t* LoadNoEnemiesThinker(actionf_p1 thinker) +static thinker_t* LoadNoEnemiesThinker(save_t *save_p, actionf_p1 thinker) { noenemies_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); return &ht->thinker; } -static thinker_t* LoadBounceCheeseThinker(actionf_p1 thinker) +static thinker_t* LoadBounceCheeseThinker(save_t *save_p, actionf_p1 thinker) { bouncecheese_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->speed = READFIXED(save_p); - ht->distance = READFIXED(save_p); - ht->floorwasheight = READFIXED(save_p); - ht->ceilingwasheight = READFIXED(save_p); - ht->low = READCHAR(save_p); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->speed = P_ReadFixed(save_p); + ht->distance = P_ReadFixed(save_p); + ht->floorwasheight = P_ReadFixed(save_p); + ht->ceilingwasheight = P_ReadFixed(save_p); + ht->low = P_ReadChar(save_p); if (ht->sector) ht->sector->ceilingdata = ht; @@ -3369,16 +3608,16 @@ static thinker_t* LoadBounceCheeseThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadContinuousFallThinker(actionf_p1 thinker) +static thinker_t* LoadContinuousFallThinker(save_t *save_p, actionf_p1 thinker) { continuousfall_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->speed = READFIXED(save_p); - ht->direction = READINT32(save_p); - ht->floorstartheight = READFIXED(save_p); - ht->ceilingstartheight = READFIXED(save_p); - ht->destheight = READFIXED(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->speed = P_ReadFixed(save_p); + ht->direction = P_ReadINT32(save_p); + ht->floorstartheight = P_ReadFixed(save_p); + ht->ceilingstartheight = P_ReadFixed(save_p); + ht->destheight = P_ReadFixed(save_p); if (ht->sector) { @@ -3389,16 +3628,16 @@ static thinker_t* LoadContinuousFallThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadMarioBlockThinker(actionf_p1 thinker) +static thinker_t* LoadMarioBlockThinker(save_t *save_p, actionf_p1 thinker) { mariothink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->speed = READFIXED(save_p); - ht->direction = READINT32(save_p); - ht->floorstartheight = READFIXED(save_p); - ht->ceilingstartheight = READFIXED(save_p); - ht->tag = READINT16(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->speed = P_ReadFixed(save_p); + ht->direction = P_ReadINT32(save_p); + ht->floorstartheight = P_ReadFixed(save_p); + ht->ceilingstartheight = P_ReadFixed(save_p); + ht->tag = P_ReadINT16(save_p); if (ht->sector) { @@ -3409,29 +3648,29 @@ static thinker_t* LoadMarioBlockThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadMarioCheckThinker(actionf_p1 thinker) +static thinker_t* LoadMarioCheckThinker(save_t *save_p, actionf_p1 thinker) { mariocheck_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); + ht->sector = LoadSector(P_ReadUINT32(save_p)); return &ht->thinker; } -static thinker_t* LoadThwompThinker(actionf_p1 thinker) +static thinker_t* LoadThwompThinker(save_t *save_p, actionf_p1 thinker) { thwomp_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->crushspeed = READFIXED(save_p); - ht->retractspeed = READFIXED(save_p); - ht->direction = READINT32(save_p); - ht->floorstartheight = READFIXED(save_p); - ht->ceilingstartheight = READFIXED(save_p); - ht->delay = READINT32(save_p); - ht->tag = READINT16(save_p); - ht->sound = READUINT16(save_p); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->crushspeed = P_ReadFixed(save_p); + ht->retractspeed = P_ReadFixed(save_p); + ht->direction = P_ReadINT32(save_p); + ht->floorstartheight = P_ReadFixed(save_p); + ht->ceilingstartheight = P_ReadFixed(save_p); + ht->delay = P_ReadINT32(save_p); + ht->tag = P_ReadINT16(save_p); + ht->sound = P_ReadUINT16(save_p); if (ht->sector) { @@ -3442,163 +3681,163 @@ static thinker_t* LoadThwompThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadFloatThinker(actionf_p1 thinker) +static thinker_t* LoadFloatThinker(save_t *save_p, actionf_p1 thinker) { floatthink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->tag = READINT16(save_p); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->tag = P_ReadINT16(save_p); return &ht->thinker; } -static thinker_t* LoadEachTimeThinker(actionf_p1 thinker) +static thinker_t* LoadEachTimeThinker(save_t *save_p, actionf_p1 thinker) { size_t i; eachtime_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); for (i = 0; i < MAXPLAYERS; i++) { - ht->playersInArea[i] = READCHAR(save_p); + ht->playersInArea[i] = P_ReadChar(save_p); } - ht->triggerOnExit = READCHAR(save_p); + ht->triggerOnExit = P_ReadChar(save_p); return &ht->thinker; } -static thinker_t* LoadRaiseThinker(actionf_p1 thinker) +static thinker_t* LoadRaiseThinker(save_t *save_p, actionf_p1 thinker) { raise_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->tag = READINT16(save_p); - ht->sector = LoadSector(READUINT32(save_p)); - ht->ceilingbottom = READFIXED(save_p); - ht->ceilingtop = READFIXED(save_p); - ht->basespeed = READFIXED(save_p); - ht->extraspeed = READFIXED(save_p); - ht->shaketimer = READUINT8(save_p); - ht->flags = READUINT8(save_p); + ht->tag = P_ReadINT16(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->ceilingbottom = P_ReadFixed(save_p); + ht->ceilingtop = P_ReadFixed(save_p); + ht->basespeed = P_ReadFixed(save_p); + ht->extraspeed = P_ReadFixed(save_p); + ht->shaketimer = P_ReadUINT8(save_p); + ht->flags = P_ReadUINT8(save_p); return &ht->thinker; } -static thinker_t* LoadCeilingThinker(actionf_p1 thinker) +static thinker_t* LoadCeilingThinker(save_t *save_p, actionf_p1 thinker) { ceiling_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->sector = LoadSector(READUINT32(save_p)); - ht->bottomheight = READFIXED(save_p); - ht->topheight = READFIXED(save_p); - ht->speed = READFIXED(save_p); - ht->delay = READFIXED(save_p); - ht->delaytimer = READFIXED(save_p); - ht->crush = READUINT8(save_p); - ht->texture = READINT32(save_p); - ht->direction = READINT32(save_p); - ht->tag = READINT16(save_p); - ht->origspeed = READFIXED(save_p); - ht->sourceline = READFIXED(save_p); + ht->type = P_ReadUINT8(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->bottomheight = P_ReadFixed(save_p); + ht->topheight = P_ReadFixed(save_p); + ht->speed = P_ReadFixed(save_p); + ht->delay = P_ReadFixed(save_p); + ht->delaytimer = P_ReadFixed(save_p); + ht->crush = P_ReadUINT8(save_p); + ht->texture = P_ReadINT32(save_p); + ht->direction = P_ReadINT32(save_p); + ht->tag = P_ReadINT16(save_p); + ht->origspeed = P_ReadFixed(save_p); + ht->sourceline = P_ReadFixed(save_p); if (ht->sector) ht->sector->ceilingdata = ht; return &ht->thinker; } -static thinker_t* LoadFloormoveThinker(actionf_p1 thinker) +static thinker_t* LoadFloormoveThinker(save_t *save_p, actionf_p1 thinker) { floormove_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->crush = READUINT8(save_p); - ht->sector = LoadSector(READUINT32(save_p)); - ht->direction = READINT32(save_p); - ht->texture = READINT32(save_p); - ht->floordestheight = READFIXED(save_p); - ht->speed = READFIXED(save_p); - ht->origspeed = READFIXED(save_p); - ht->delay = READFIXED(save_p); - ht->delaytimer = READFIXED(save_p); - ht->tag = READINT16(save_p); - ht->sourceline = READFIXED(save_p); + ht->type = P_ReadUINT8(save_p); + ht->crush = P_ReadUINT8(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->direction = P_ReadINT32(save_p); + ht->texture = P_ReadINT32(save_p); + ht->floordestheight = P_ReadFixed(save_p); + ht->speed = P_ReadFixed(save_p); + ht->origspeed = P_ReadFixed(save_p); + ht->delay = P_ReadFixed(save_p); + ht->delaytimer = P_ReadFixed(save_p); + ht->tag = P_ReadINT16(save_p); + ht->sourceline = P_ReadFixed(save_p); if (ht->sector) ht->sector->floordata = ht; return &ht->thinker; } -static thinker_t* LoadLightflashThinker(actionf_p1 thinker) +static thinker_t* LoadLightflashThinker(save_t *save_p, actionf_p1 thinker) { lightflash_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->maxlight = READINT32(save_p); - ht->minlight = READINT32(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->maxlight = P_ReadINT32(save_p); + ht->minlight = P_ReadINT32(save_p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static thinker_t* LoadStrobeThinker(actionf_p1 thinker) +static thinker_t* LoadStrobeThinker(save_t *save_p, actionf_p1 thinker) { strobe_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->count = READINT32(save_p); - ht->minlight = READINT16(save_p); - ht->maxlight = READINT16(save_p); - ht->darktime = READINT32(save_p); - ht->brighttime = READINT32(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->count = P_ReadINT32(save_p); + ht->minlight = P_ReadINT16(save_p); + ht->maxlight = P_ReadINT16(save_p); + ht->darktime = P_ReadINT32(save_p); + ht->brighttime = P_ReadINT32(save_p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static thinker_t* LoadGlowThinker(actionf_p1 thinker) +static thinker_t* LoadGlowThinker(save_t *save_p, actionf_p1 thinker) { glow_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->minlight = READINT16(save_p); - ht->maxlight = READINT16(save_p); - ht->direction = READINT16(save_p); - ht->speed = READINT16(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->minlight = P_ReadINT16(save_p); + ht->maxlight = P_ReadINT16(save_p); + ht->direction = P_ReadINT16(save_p); + ht->speed = P_ReadINT16(save_p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static thinker_t* LoadFireflickerThinker(actionf_p1 thinker) +static thinker_t* LoadFireflickerThinker(save_t *save_p, actionf_p1 thinker) { fireflicker_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->count = READINT32(save_p); - ht->resetcount = READINT32(save_p); - ht->maxlight = READINT16(save_p); - ht->minlight = READINT16(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->count = P_ReadINT32(save_p); + ht->resetcount = P_ReadINT32(save_p); + ht->maxlight = P_ReadINT16(save_p); + ht->minlight = P_ReadINT16(save_p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static thinker_t* LoadElevatorThinker(actionf_p1 thinker, boolean setplanedata) +static thinker_t* LoadElevatorThinker(save_t *save_p, actionf_p1 thinker, boolean setplanedata) { elevator_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->sector = LoadSector(READUINT32(save_p)); - ht->actionsector = LoadSector(READUINT32(save_p)); - ht->direction = READINT32(save_p); - ht->floordestheight = READFIXED(save_p); - ht->ceilingdestheight = READFIXED(save_p); - ht->speed = READFIXED(save_p); - ht->origspeed = READFIXED(save_p); - ht->low = READFIXED(save_p); - ht->high = READFIXED(save_p); - ht->distance = READFIXED(save_p); - ht->delay = READFIXED(save_p); - ht->delaytimer = READFIXED(save_p); - ht->floorwasheight = READFIXED(save_p); - ht->ceilingwasheight = READFIXED(save_p); - ht->sourceline = LoadLine(READUINT32(save_p)); + ht->type = P_ReadUINT8(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->actionsector = LoadSector(P_ReadUINT32(save_p)); + ht->direction = P_ReadINT32(save_p); + ht->floordestheight = P_ReadFixed(save_p); + ht->ceilingdestheight = P_ReadFixed(save_p); + ht->speed = P_ReadFixed(save_p); + ht->origspeed = P_ReadFixed(save_p); + ht->low = P_ReadFixed(save_p); + ht->high = P_ReadFixed(save_p); + ht->distance = P_ReadFixed(save_p); + ht->delay = P_ReadFixed(save_p); + ht->delaytimer = P_ReadFixed(save_p); + ht->floorwasheight = P_ReadFixed(save_p); + ht->ceilingwasheight = P_ReadFixed(save_p); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); if (ht->sector && setplanedata) { @@ -3609,21 +3848,21 @@ static thinker_t* LoadElevatorThinker(actionf_p1 thinker, boolean setplanedata) return &ht->thinker; } -static thinker_t* LoadCrumbleThinker(actionf_p1 thinker) +static thinker_t* LoadCrumbleThinker(save_t *save_p, actionf_p1 thinker) { crumble_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->actionsector = LoadSector(READUINT32(save_p)); - ht->player = LoadPlayer(READUINT32(save_p)); - ht->direction = READINT32(save_p); - ht->origalpha = READINT32(save_p); - ht->timer = READINT32(save_p); - ht->speed = READFIXED(save_p); - ht->floorwasheight = READFIXED(save_p); - ht->ceilingwasheight = READFIXED(save_p); - ht->flags = READUINT8(save_p); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->actionsector = LoadSector(P_ReadUINT32(save_p)); + ht->player = LoadPlayer(P_ReadUINT32(save_p)); + ht->direction = P_ReadINT32(save_p); + ht->origalpha = P_ReadINT32(save_p); + ht->timer = P_ReadINT32(save_p); + ht->speed = P_ReadFixed(save_p); + ht->floorwasheight = P_ReadFixed(save_p); + ht->ceilingwasheight = P_ReadFixed(save_p); + ht->flags = P_ReadUINT8(save_p); if (ht->sector) ht->sector->floordata = ht; @@ -3631,123 +3870,123 @@ static thinker_t* LoadCrumbleThinker(actionf_p1 thinker) return &ht->thinker; } -static thinker_t* LoadScrollThinker(actionf_p1 thinker) +static thinker_t* LoadScrollThinker(save_t *save_p, actionf_p1 thinker) { scroll_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->dx = READFIXED(save_p); - ht->dy = READFIXED(save_p); - ht->affectee = READINT32(save_p); - ht->control = READINT32(save_p); - ht->last_height = READFIXED(save_p); - ht->vdx = READFIXED(save_p); - ht->vdy = READFIXED(save_p); - ht->accel = READINT32(save_p); - ht->exclusive = READINT32(save_p); - ht->type = READUINT8(save_p); + ht->dx = P_ReadFixed(save_p); + ht->dy = P_ReadFixed(save_p); + ht->affectee = P_ReadINT32(save_p); + ht->control = P_ReadINT32(save_p); + ht->last_height = P_ReadFixed(save_p); + ht->vdx = P_ReadFixed(save_p); + ht->vdy = P_ReadFixed(save_p); + ht->accel = P_ReadINT32(save_p); + ht->exclusive = P_ReadINT32(save_p); + ht->type = P_ReadUINT8(save_p); return &ht->thinker; } -static inline thinker_t* LoadFrictionThinker(actionf_p1 thinker) +static inline thinker_t* LoadFrictionThinker(save_t *save_p, actionf_p1 thinker) { friction_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->friction = READINT32(save_p); - ht->movefactor = READINT32(save_p); - ht->affectee = READINT32(save_p); - ht->referrer = READINT32(save_p); - ht->roverfriction = READUINT8(save_p); + ht->friction = P_ReadINT32(save_p); + ht->movefactor = P_ReadINT32(save_p); + ht->affectee = P_ReadINT32(save_p); + ht->referrer = P_ReadINT32(save_p); + ht->roverfriction = P_ReadUINT8(save_p); return &ht->thinker; } -static thinker_t* LoadPusherThinker(actionf_p1 thinker) +static thinker_t* LoadPusherThinker(save_t *save_p, actionf_p1 thinker) { pusher_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->x_mag = READFIXED(save_p); - ht->y_mag = READFIXED(save_p); - ht->z_mag = READFIXED(save_p); - ht->affectee = READINT32(save_p); - ht->roverpusher = READUINT8(save_p); - ht->referrer = READINT32(save_p); - ht->exclusive = READINT32(save_p); - ht->slider = READINT32(save_p); + ht->type = P_ReadUINT8(save_p); + ht->x_mag = P_ReadFixed(save_p); + ht->y_mag = P_ReadFixed(save_p); + ht->z_mag = P_ReadFixed(save_p); + ht->affectee = P_ReadINT32(save_p); + ht->roverpusher = P_ReadUINT8(save_p); + ht->referrer = P_ReadINT32(save_p); + ht->exclusive = P_ReadINT32(save_p); + ht->slider = P_ReadINT32(save_p); return &ht->thinker; } -static inline thinker_t* LoadLaserThinker(actionf_p1 thinker) +static inline thinker_t* LoadLaserThinker(save_t *save_p, actionf_p1 thinker) { laserthink_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->tag = READINT16(save_p); - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->nobosses = READUINT8(save_p); + ht->tag = P_ReadINT16(save_p); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); + ht->nobosses = P_ReadUINT8(save_p); return &ht->thinker; } -static inline thinker_t* LoadLightlevelThinker(actionf_p1 thinker) +static inline thinker_t* LoadLightlevelThinker(save_t *save_p, actionf_p1 thinker) { lightlevel_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->sourcelevel = READINT16(save_p); - ht->destlevel = READINT16(save_p); - ht->fixedcurlevel = READFIXED(save_p); - ht->fixedpertic = READFIXED(save_p); - ht->timer = READINT32(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->sourcelevel = P_ReadINT16(save_p); + ht->destlevel = P_ReadINT16(save_p); + ht->fixedcurlevel = P_ReadFixed(save_p); + ht->fixedpertic = P_ReadFixed(save_p); + ht->timer = P_ReadINT32(save_p); if (ht->sector) ht->sector->lightingdata = ht; return &ht->thinker; } -static inline thinker_t* LoadExecutorThinker(actionf_p1 thinker) +static inline thinker_t* LoadExecutorThinker(save_t *save_p, actionf_p1 thinker) { executor_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->line = LoadLine(READUINT32(save_p)); - ht->caller = LoadMobj(READUINT32(save_p)); - ht->sector = LoadSector(READUINT32(save_p)); - ht->timer = READINT32(save_p); + ht->line = LoadLine(P_ReadUINT32(save_p)); + ht->caller = LoadMobj(P_ReadUINT32(save_p)); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->timer = P_ReadINT32(save_p); return &ht->thinker; } -static inline thinker_t* LoadDisappearThinker(actionf_p1 thinker) +static inline thinker_t* LoadDisappearThinker(save_t *save_p, actionf_p1 thinker) { disappear_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->appeartime = READUINT32(save_p); - ht->disappeartime = READUINT32(save_p); - ht->offset = READUINT32(save_p); - ht->timer = READUINT32(save_p); - ht->affectee = READINT32(save_p); - ht->sourceline = READINT32(save_p); - ht->exists = READINT32(save_p); + ht->appeartime = P_ReadUINT32(save_p); + ht->disappeartime = P_ReadUINT32(save_p); + ht->offset = P_ReadUINT32(save_p); + ht->timer = P_ReadUINT32(save_p); + ht->affectee = P_ReadINT32(save_p); + ht->sourceline = P_ReadINT32(save_p); + ht->exists = P_ReadINT32(save_p); return &ht->thinker; } -static inline thinker_t* LoadFadeThinker(actionf_p1 thinker) +static inline thinker_t* LoadFadeThinker(save_t *save_p, actionf_p1 thinker) { sector_t *ss; fade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->dest_exc = GetNetColormapFromList(READUINT32(save_p)); - ht->sectornum = READUINT32(save_p); - ht->ffloornum = READUINT32(save_p); - ht->alpha = READINT32(save_p); - ht->sourcevalue = READINT16(save_p); - ht->destvalue = READINT16(save_p); - ht->destlightlevel = READINT16(save_p); - ht->speed = READINT16(save_p); - ht->ticbased = (boolean)READUINT8(save_p); - ht->timer = READINT32(save_p); - ht->doexists = READUINT8(save_p); - ht->dotranslucent = READUINT8(save_p); - ht->dolighting = READUINT8(save_p); - ht->docolormap = READUINT8(save_p); - ht->docollision = READUINT8(save_p); - ht->doghostfade = READUINT8(save_p); - ht->exactalpha = READUINT8(save_p); + ht->dest_exc = GetNetColormapFromList(P_ReadUINT32(save_p)); + ht->sectornum = P_ReadUINT32(save_p); + ht->ffloornum = P_ReadUINT32(save_p); + ht->alpha = P_ReadINT32(save_p); + ht->sourcevalue = P_ReadINT16(save_p); + ht->destvalue = P_ReadINT16(save_p); + ht->destlightlevel = P_ReadINT16(save_p); + ht->speed = P_ReadINT16(save_p); + ht->ticbased = (boolean)P_ReadUINT8(save_p); + ht->timer = P_ReadINT32(save_p); + ht->doexists = P_ReadUINT8(save_p); + ht->dotranslucent = P_ReadUINT8(save_p); + ht->dolighting = P_ReadUINT8(save_p); + ht->docolormap = P_ReadUINT8(save_p); + ht->docollision = P_ReadUINT8(save_p); + ht->doghostfade = P_ReadUINT8(save_p); + ht->exactalpha = P_ReadUINT8(save_p); ss = LoadSector(ht->sectornum); if (ss) @@ -3768,176 +4007,176 @@ static inline thinker_t* LoadFadeThinker(actionf_p1 thinker) return &ht->thinker; } -static inline thinker_t* LoadFadeColormapThinker(actionf_p1 thinker) +static inline thinker_t* LoadFadeColormapThinker(save_t *save_p, actionf_p1 thinker) { fadecolormap_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->sector = LoadSector(READUINT32(save_p)); - ht->source_exc = GetNetColormapFromList(READUINT32(save_p)); - ht->dest_exc = GetNetColormapFromList(READUINT32(save_p)); - ht->ticbased = (boolean)READUINT8(save_p); - ht->duration = READINT32(save_p); - ht->timer = READINT32(save_p); + ht->sector = LoadSector(P_ReadUINT32(save_p)); + ht->source_exc = GetNetColormapFromList(P_ReadUINT32(save_p)); + ht->dest_exc = GetNetColormapFromList(P_ReadUINT32(save_p)); + ht->ticbased = (boolean)P_ReadUINT8(save_p); + ht->duration = P_ReadINT32(save_p); + ht->timer = P_ReadINT32(save_p); if (ht->sector) ht->sector->fadecolormapdata = ht; return &ht->thinker; } -static inline thinker_t* LoadPlaneDisplaceThinker(actionf_p1 thinker) +static inline thinker_t* LoadPlaneDisplaceThinker(save_t *save_p, actionf_p1 thinker) { planedisplace_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->affectee = READINT32(save_p); - ht->control = READINT32(save_p); - ht->last_height = READFIXED(save_p); - ht->speed = READFIXED(save_p); - ht->type = READUINT8(save_p); + ht->affectee = P_ReadINT32(save_p); + ht->control = P_ReadINT32(save_p); + ht->last_height = P_ReadFixed(save_p); + ht->speed = P_ReadFixed(save_p); + ht->type = P_ReadUINT8(save_p); return &ht->thinker; } -static inline thinker_t* LoadDynamicLineSlopeThinker(actionf_p1 thinker) +static inline thinker_t* LoadDynamicLineSlopeThinker(save_t *save_p, actionf_p1 thinker) { dynlineplanethink_t* ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->type = READUINT8(save_p); - ht->slope = LoadSlope(READUINT32(save_p)); - ht->sourceline = LoadLine(READUINT32(save_p)); - ht->extent = READFIXED(save_p); + ht->type = P_ReadUINT8(save_p); + ht->slope = LoadSlope(P_ReadUINT32(save_p)); + ht->sourceline = LoadLine(P_ReadUINT32(save_p)); + ht->extent = P_ReadFixed(save_p); return &ht->thinker; } -static inline thinker_t* LoadDynamicVertexSlopeThinker(actionf_p1 thinker) +static inline thinker_t* LoadDynamicVertexSlopeThinker(save_t *save_p, actionf_p1 thinker) { size_t i; dynvertexplanethink_t* ht = Z_Malloc(sizeof(*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->slope = LoadSlope(READUINT32(save_p)); + ht->slope = LoadSlope(P_ReadUINT32(save_p)); for (i = 0; i < 3; i++) - ht->secs[i] = LoadSector(READUINT32(save_p)); - READMEM(save_p, ht->vex, sizeof(ht->vex)); - READMEM(save_p, ht->origsecheights, sizeof(ht->origsecheights)); - READMEM(save_p, ht->origvecheights, sizeof(ht->origvecheights)); - ht->relative = READUINT8(save_p); + ht->secs[i] = LoadSector(P_ReadUINT32(save_p)); + P_ReadMem(save_p, ht->vex, sizeof(ht->vex)); + P_ReadMem(save_p, ht->origsecheights, sizeof(ht->origsecheights)); + P_ReadMem(save_p, ht->origvecheights, sizeof(ht->origvecheights)); + ht->relative = P_ReadUINT8(save_p); return &ht->thinker; } -static inline thinker_t* LoadPolyrotatetThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolyrotatetThinker(save_t *save_p, actionf_p1 thinker) { polyrotate_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->distance = READINT32(save_p); - ht->turnobjs = READUINT8(save_p); + ht->polyObjNum = P_ReadINT32(save_p); + ht->speed = P_ReadINT32(save_p); + ht->distance = P_ReadINT32(save_p); + ht->turnobjs = P_ReadUINT8(save_p); return &ht->thinker; } -static thinker_t* LoadPolymoveThinker(actionf_p1 thinker) +static thinker_t* LoadPolymoveThinker(save_t *save_p, actionf_p1 thinker) { polymove_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->momx = READFIXED(save_p); - ht->momy = READFIXED(save_p); - ht->distance = READINT32(save_p); - ht->angle = READANGLE(save_p); + ht->polyObjNum = P_ReadINT32(save_p); + ht->speed = P_ReadINT32(save_p); + ht->momx = P_ReadFixed(save_p); + ht->momy = P_ReadFixed(save_p); + ht->distance = P_ReadINT32(save_p); + ht->angle = P_ReadAngle(save_p); return &ht->thinker; } -static inline thinker_t* LoadPolywaypointThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolywaypointThinker(save_t *save_p, actionf_p1 thinker) { polywaypoint_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->sequence = READINT32(save_p); - ht->pointnum = READINT32(save_p); - ht->direction = READINT32(save_p); - ht->returnbehavior = READUINT8(save_p); - ht->continuous = READUINT8(save_p); - ht->stophere = READUINT8(save_p); + ht->polyObjNum = P_ReadINT32(save_p); + ht->speed = P_ReadINT32(save_p); + ht->sequence = P_ReadINT32(save_p); + ht->pointnum = P_ReadINT32(save_p); + ht->direction = P_ReadINT32(save_p); + ht->returnbehavior = P_ReadUINT8(save_p); + ht->continuous = P_ReadUINT8(save_p); + ht->stophere = P_ReadUINT8(save_p); return &ht->thinker; } -static inline thinker_t* LoadPolyslidedoorThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolyslidedoorThinker(save_t *save_p, actionf_p1 thinker) { polyslidedoor_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->delay = READINT32(save_p); - ht->delayCount = READINT32(save_p); - ht->initSpeed = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->initDistance = READINT32(save_p); - ht->distance = READINT32(save_p); - ht->initAngle = READUINT32(save_p); - ht->angle = READUINT32(save_p); - ht->revAngle = READUINT32(save_p); - ht->momx = READFIXED(save_p); - ht->momy = READFIXED(save_p); - ht->closing = READUINT8(save_p); + ht->polyObjNum = P_ReadINT32(save_p); + ht->delay = P_ReadINT32(save_p); + ht->delayCount = P_ReadINT32(save_p); + ht->initSpeed = P_ReadINT32(save_p); + ht->speed = P_ReadINT32(save_p); + ht->initDistance = P_ReadINT32(save_p); + ht->distance = P_ReadINT32(save_p); + ht->initAngle = P_ReadUINT32(save_p); + ht->angle = P_ReadUINT32(save_p); + ht->revAngle = P_ReadUINT32(save_p); + ht->momx = P_ReadFixed(save_p); + ht->momy = P_ReadFixed(save_p); + ht->closing = P_ReadUINT8(save_p); return &ht->thinker; } -static inline thinker_t* LoadPolyswingdoorThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolyswingdoorThinker(save_t *save_p, actionf_p1 thinker) { polyswingdoor_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->delay = READINT32(save_p); - ht->delayCount = READINT32(save_p); - ht->initSpeed = READINT32(save_p); - ht->speed = READINT32(save_p); - ht->initDistance = READINT32(save_p); - ht->distance = READINT32(save_p); - ht->closing = READUINT8(save_p); + ht->polyObjNum = P_ReadINT32(save_p); + ht->delay = P_ReadINT32(save_p); + ht->delayCount = P_ReadINT32(save_p); + ht->initSpeed = P_ReadINT32(save_p); + ht->speed = P_ReadINT32(save_p); + ht->initDistance = P_ReadINT32(save_p); + ht->distance = P_ReadINT32(save_p); + ht->closing = P_ReadUINT8(save_p); return &ht->thinker; } -static inline thinker_t* LoadPolydisplaceThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolydisplaceThinker(save_t *save_p, actionf_p1 thinker) { polydisplace_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->controlSector = LoadSector(READUINT32(save_p)); - ht->dx = READFIXED(save_p); - ht->dy = READFIXED(save_p); - ht->oldHeights = READFIXED(save_p); + ht->polyObjNum = P_ReadINT32(save_p); + ht->controlSector = LoadSector(P_ReadUINT32(save_p)); + ht->dx = P_ReadFixed(save_p); + ht->dy = P_ReadFixed(save_p); + ht->oldHeights = P_ReadFixed(save_p); return &ht->thinker; } -static inline thinker_t* LoadPolyrotdisplaceThinker(actionf_p1 thinker) +static inline thinker_t* LoadPolyrotdisplaceThinker(save_t *save_p, actionf_p1 thinker) { polyrotdisplace_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->controlSector = LoadSector(READUINT32(save_p)); - ht->rotscale = READFIXED(save_p); - ht->turnobjs = READUINT8(save_p); - ht->oldHeights = READFIXED(save_p); + ht->polyObjNum = P_ReadINT32(save_p); + ht->controlSector = LoadSector(P_ReadUINT32(save_p)); + ht->rotscale = P_ReadFixed(save_p); + ht->turnobjs = P_ReadUINT8(save_p); + ht->oldHeights = P_ReadFixed(save_p); return &ht->thinker; } -static thinker_t* LoadPolyfadeThinker(actionf_p1 thinker) +static thinker_t* LoadPolyfadeThinker(save_t *save_p, actionf_p1 thinker) { polyfade_t *ht = Z_Malloc(sizeof (*ht), PU_LEVSPEC, NULL); ht->thinker.function.acp1 = thinker; - ht->polyObjNum = READINT32(save_p); - ht->sourcevalue = READINT32(save_p); - ht->destvalue = READINT32(save_p); - ht->docollision = (boolean)READUINT8(save_p); - ht->doghostfade = (boolean)READUINT8(save_p); - ht->ticbased = (boolean)READUINT8(save_p); - ht->duration = READINT32(save_p); - ht->timer = READINT32(save_p); + ht->polyObjNum = P_ReadINT32(save_p); + ht->sourcevalue = P_ReadINT32(save_p); + ht->destvalue = P_ReadINT32(save_p); + ht->docollision = (boolean)P_ReadUINT8(save_p); + ht->doghostfade = (boolean)P_ReadUINT8(save_p); + ht->ticbased = (boolean)P_ReadUINT8(save_p); + ht->duration = P_ReadINT32(save_p); + ht->timer = P_ReadINT32(save_p); return &ht->thinker; } -static void P_NetUnArchiveThinkers(void) +static void P_NetUnArchiveThinkers(save_t *save_p) { thinker_t *currentthinker; thinker_t *next; @@ -3946,7 +4185,7 @@ static void P_NetUnArchiveThinkers(void) UINT32 i; UINT32 numloaded = 0; - if (READUINT32(save_p) != ARCHIVEBLOCK_THINKERS) + if (P_ReadUINT32(save_p) != ARCHIVEBLOCK_THINKERS) I_Error("Bad $$$.sav at archive block Thinkers"); // remove all the current thinkers @@ -3984,7 +4223,7 @@ static void P_NetUnArchiveThinkers(void) for (;;) { thinker_t* th = NULL; - tclass = READUINT8(save_p); + tclass = P_ReadUINT8(save_p); if (tclass == tc_end) break; // leave the saved thinker reading loop @@ -3993,167 +4232,167 @@ static void P_NetUnArchiveThinkers(void) switch (tclass) { case tc_mobj: - th = LoadMobjThinker((actionf_p1)P_MobjThinker); + th = LoadMobjThinker(save_p, (actionf_p1)P_MobjThinker); break; case tc_ceiling: - th = LoadCeilingThinker((actionf_p1)T_MoveCeiling); + th = LoadCeilingThinker(save_p, (actionf_p1)T_MoveCeiling); break; case tc_crushceiling: - th = LoadCeilingThinker((actionf_p1)T_CrushCeiling); + th = LoadCeilingThinker(save_p, (actionf_p1)T_CrushCeiling); break; case tc_floor: - th = LoadFloormoveThinker((actionf_p1)T_MoveFloor); + th = LoadFloormoveThinker(save_p, (actionf_p1)T_MoveFloor); break; case tc_flash: - th = LoadLightflashThinker((actionf_p1)T_LightningFlash); + th = LoadLightflashThinker(save_p, (actionf_p1)T_LightningFlash); break; case tc_strobe: - th = LoadStrobeThinker((actionf_p1)T_StrobeFlash); + th = LoadStrobeThinker(save_p, (actionf_p1)T_StrobeFlash); break; case tc_glow: - th = LoadGlowThinker((actionf_p1)T_Glow); + th = LoadGlowThinker(save_p, (actionf_p1)T_Glow); break; case tc_fireflicker: - th = LoadFireflickerThinker((actionf_p1)T_FireFlicker); + th = LoadFireflickerThinker(save_p, (actionf_p1)T_FireFlicker); break; case tc_elevator: - th = LoadElevatorThinker((actionf_p1)T_MoveElevator, true); + th = LoadElevatorThinker(save_p, (actionf_p1)T_MoveElevator, true); break; case tc_continuousfalling: - th = LoadContinuousFallThinker((actionf_p1)T_ContinuousFalling); + th = LoadContinuousFallThinker(save_p, (actionf_p1)T_ContinuousFalling); break; case tc_thwomp: - th = LoadThwompThinker((actionf_p1)T_ThwompSector); + th = LoadThwompThinker(save_p, (actionf_p1)T_ThwompSector); break; case tc_noenemies: - th = LoadNoEnemiesThinker((actionf_p1)T_NoEnemiesSector); + th = LoadNoEnemiesThinker(save_p, (actionf_p1)T_NoEnemiesSector); break; case tc_eachtime: - th = LoadEachTimeThinker((actionf_p1)T_EachTimeThinker); + th = LoadEachTimeThinker(save_p, (actionf_p1)T_EachTimeThinker); break; case tc_raisesector: - th = LoadRaiseThinker((actionf_p1)T_RaiseSector); + th = LoadRaiseThinker(save_p, (actionf_p1)T_RaiseSector); break; case tc_camerascanner: - th = LoadElevatorThinker((actionf_p1)T_CameraScanner, false); + th = LoadElevatorThinker(save_p, (actionf_p1)T_CameraScanner, false); break; case tc_bouncecheese: - th = LoadBounceCheeseThinker((actionf_p1)T_BounceCheese); + th = LoadBounceCheeseThinker(save_p, (actionf_p1)T_BounceCheese); break; case tc_startcrumble: - th = LoadCrumbleThinker((actionf_p1)T_StartCrumble); + th = LoadCrumbleThinker(save_p, (actionf_p1)T_StartCrumble); break; case tc_marioblock: - th = LoadMarioBlockThinker((actionf_p1)T_MarioBlock); + th = LoadMarioBlockThinker(save_p, (actionf_p1)T_MarioBlock); break; case tc_marioblockchecker: - th = LoadMarioCheckThinker((actionf_p1)T_MarioBlockChecker); + th = LoadMarioCheckThinker(save_p, (actionf_p1)T_MarioBlockChecker); break; case tc_floatsector: - th = LoadFloatThinker((actionf_p1)T_FloatSector); + th = LoadFloatThinker(save_p, (actionf_p1)T_FloatSector); break; case tc_laserflash: - th = LoadLaserThinker((actionf_p1)T_LaserFlash); + th = LoadLaserThinker(save_p, (actionf_p1)T_LaserFlash); break; case tc_lightfade: - th = LoadLightlevelThinker((actionf_p1)T_LightFade); + th = LoadLightlevelThinker(save_p, (actionf_p1)T_LightFade); break; case tc_executor: - th = LoadExecutorThinker((actionf_p1)T_ExecutorDelay); + th = LoadExecutorThinker(save_p, (actionf_p1)T_ExecutorDelay); restoreNum = true; break; case tc_disappear: - th = LoadDisappearThinker((actionf_p1)T_Disappear); + th = LoadDisappearThinker(save_p, (actionf_p1)T_Disappear); break; case tc_fade: - th = LoadFadeThinker((actionf_p1)T_Fade); + th = LoadFadeThinker(save_p, (actionf_p1)T_Fade); break; case tc_fadecolormap: - th = LoadFadeColormapThinker((actionf_p1)T_FadeColormap); + th = LoadFadeColormapThinker(save_p, (actionf_p1)T_FadeColormap); break; case tc_planedisplace: - th = LoadPlaneDisplaceThinker((actionf_p1)T_PlaneDisplace); + th = LoadPlaneDisplaceThinker(save_p, (actionf_p1)T_PlaneDisplace); break; case tc_polyrotate: - th = LoadPolyrotatetThinker((actionf_p1)T_PolyObjRotate); + th = LoadPolyrotatetThinker(save_p, (actionf_p1)T_PolyObjRotate); break; case tc_polymove: - th = LoadPolymoveThinker((actionf_p1)T_PolyObjMove); + th = LoadPolymoveThinker(save_p, (actionf_p1)T_PolyObjMove); break; case tc_polywaypoint: - th = LoadPolywaypointThinker((actionf_p1)T_PolyObjWaypoint); + th = LoadPolywaypointThinker(save_p, (actionf_p1)T_PolyObjWaypoint); break; case tc_polyslidedoor: - th = LoadPolyslidedoorThinker((actionf_p1)T_PolyDoorSlide); + th = LoadPolyslidedoorThinker(save_p, (actionf_p1)T_PolyDoorSlide); break; case tc_polyswingdoor: - th = LoadPolyswingdoorThinker((actionf_p1)T_PolyDoorSwing); + th = LoadPolyswingdoorThinker(save_p, (actionf_p1)T_PolyDoorSwing); break; case tc_polyflag: - th = LoadPolymoveThinker((actionf_p1)T_PolyObjFlag); + th = LoadPolymoveThinker(save_p, (actionf_p1)T_PolyObjFlag); break; case tc_polydisplace: - th = LoadPolydisplaceThinker((actionf_p1)T_PolyObjDisplace); + th = LoadPolydisplaceThinker(save_p, (actionf_p1)T_PolyObjDisplace); break; case tc_polyrotdisplace: - th = LoadPolyrotdisplaceThinker((actionf_p1)T_PolyObjRotDisplace); + th = LoadPolyrotdisplaceThinker(save_p, (actionf_p1)T_PolyObjRotDisplace); break; case tc_polyfade: - th = LoadPolyfadeThinker((actionf_p1)T_PolyObjFade); + th = LoadPolyfadeThinker(save_p, (actionf_p1)T_PolyObjFade); break; case tc_dynslopeline: - th = LoadDynamicLineSlopeThinker((actionf_p1)T_DynamicSlopeLine); + th = LoadDynamicLineSlopeThinker(save_p, (actionf_p1)T_DynamicSlopeLine); break; case tc_dynslopevert: - th = LoadDynamicVertexSlopeThinker((actionf_p1)T_DynamicSlopeVert); + th = LoadDynamicVertexSlopeThinker(save_p, (actionf_p1)T_DynamicSlopeVert); break; case tc_scroll: - th = LoadScrollThinker((actionf_p1)T_Scroll); + th = LoadScrollThinker(save_p, (actionf_p1)T_Scroll); break; case tc_friction: - th = LoadFrictionThinker((actionf_p1)T_Friction); + th = LoadFrictionThinker(save_p, (actionf_p1)T_Friction); break; case tc_pusher: - th = LoadPusherThinker((actionf_p1)T_Pusher); + th = LoadPusherThinker(save_p, (actionf_p1)T_Pusher); break; default: @@ -4193,29 +4432,29 @@ static void P_NetUnArchiveThinkers(void) #define PD_FLAGS 0x01 #define PD_TRANS 0x02 -static inline void P_ArchivePolyObj(polyobj_t *po) +static inline void P_ArchivePolyObj(save_t *save_p, polyobj_t *po) { UINT8 diff = 0; - WRITEINT32(save_p, po->id); - WRITEANGLE(save_p, po->angle); + P_WriteINT32(save_p, po->id); + P_WriteAngle(save_p, po->angle); - WRITEFIXED(save_p, po->spawnSpot.x); - WRITEFIXED(save_p, po->spawnSpot.y); + P_WriteFixed(save_p, po->spawnSpot.x); + P_WriteFixed(save_p, po->spawnSpot.y); if (po->flags != po->spawnflags) diff |= PD_FLAGS; if (po->translucency != po->spawntrans) diff |= PD_TRANS; - WRITEUINT8(save_p, diff); + P_WriteUINT8(save_p, diff); if (diff & PD_FLAGS) - WRITEINT32(save_p, po->flags); + P_WriteINT32(save_p, po->flags); if (diff & PD_TRANS) - WRITEINT32(save_p, po->translucency); + P_WriteINT32(save_p, po->translucency); } -static inline void P_UnArchivePolyObj(polyobj_t *po) +static inline void P_UnArchivePolyObj(save_t *save_p, polyobj_t *po) { INT32 id; UINT32 angle; @@ -4227,19 +4466,19 @@ static inline void P_UnArchivePolyObj(polyobj_t *po) // when they first start to run. po->thinker = NULL; - id = READINT32(save_p); + id = P_ReadINT32(save_p); - angle = READANGLE(save_p); + angle = P_ReadAngle(save_p); - x = READFIXED(save_p); - y = READFIXED(save_p); + x = P_ReadFixed(save_p); + y = P_ReadFixed(save_p); - diff = READUINT8(save_p); + diff = P_ReadUINT8(save_p); if (diff & PD_FLAGS) - po->flags = READINT32(save_p); + po->flags = P_ReadINT32(save_p); if (diff & PD_TRANS) - po->translucency = READINT32(save_p); + po->translucency = P_ReadINT32(save_p); // if the object is bad or isn't in the id hash, we can do nothing more // with it, so return now @@ -4250,33 +4489,33 @@ static inline void P_UnArchivePolyObj(polyobj_t *po) Polyobj_MoveOnLoad(po, angle, x, y); } -static inline void P_ArchivePolyObjects(void) +static inline void P_ArchivePolyObjects(save_t *save_p) { INT32 i; - WRITEUINT32(save_p, ARCHIVEBLOCK_POBJS); + P_WriteUINT32(save_p, ARCHIVEBLOCK_POBJS); // save number of polyobjects - WRITEINT32(save_p, numPolyObjects); + P_WriteINT32(save_p, numPolyObjects); for (i = 0; i < numPolyObjects; ++i) - P_ArchivePolyObj(&PolyObjects[i]); + P_ArchivePolyObj(save_p, &PolyObjects[i]); } -static inline void P_UnArchivePolyObjects(void) +static inline void P_UnArchivePolyObjects(save_t *save_p) { INT32 i, numSavedPolys; - if (READUINT32(save_p) != ARCHIVEBLOCK_POBJS) + if (P_ReadUINT32(save_p) != ARCHIVEBLOCK_POBJS) I_Error("Bad $$$.sav at archive block Pobjs"); - numSavedPolys = READINT32(save_p); + numSavedPolys = P_ReadINT32(save_p); if (numSavedPolys != numPolyObjects) I_Error("P_UnArchivePolyObjects: polyobj count inconsistency\n"); for (i = 0; i < numSavedPolys; ++i) - P_UnArchivePolyObj(&PolyObjects[i]); + P_UnArchivePolyObj(save_p, &PolyObjects[i]); } static inline void P_FinishMobjs(void) @@ -4394,11 +4633,11 @@ static void P_RelinkPointers(void) } } -static inline void P_NetArchiveSpecials(void) +static inline void P_NetArchiveSpecials(save_t *save_p) { size_t i, z; - WRITEUINT32(save_p, ARCHIVEBLOCK_SPECIALS); + P_WriteUINT32(save_p, ARCHIVEBLOCK_SPECIALS); // itemrespawn queue for deathmatch i = iquetail; @@ -4408,53 +4647,54 @@ static inline void P_NetArchiveSpecials(void) { if (&mapthings[z] == itemrespawnque[i]) { - WRITEUINT32(save_p, z); + P_WriteUINT32(save_p, z); break; } } - WRITEUINT32(save_p, itemrespawntime[i]); + P_WriteUINT32(save_p, itemrespawntime[i]); i = (i + 1) & (ITEMQUESIZE-1); } // end delimiter - WRITEUINT32(save_p, 0xffffffff); + P_WriteUINT32(save_p, 0xffffffff); // Sky number - WRITEINT32(save_p, globallevelskynum); + P_WriteINT32(save_p, globallevelskynum); // Current global weather type - WRITEUINT8(save_p, globalweather); + P_WriteUINT8(save_p, globalweather); if (metalplayback) // Is metal sonic running? { - WRITEUINT8(save_p, 0x01); - G_SaveMetal(&save_p); + UINT8 *p = &save_p->buf[save_p->pos+1]; + P_WriteUINT8(save_p, 0x01); + G_SaveMetal(&p); } else - WRITEUINT8(save_p, 0x00); + P_WriteUINT8(save_p, 0x00); } -static void P_NetUnArchiveSpecials(void) +static void P_NetUnArchiveSpecials(save_t *save_p) { size_t i; INT32 j; - if (READUINT32(save_p) != ARCHIVEBLOCK_SPECIALS) + if (P_ReadUINT32(save_p) != ARCHIVEBLOCK_SPECIALS) I_Error("Bad $$$.sav at archive block Specials"); // BP: added save itemrespawn queue for deathmatch iquetail = iquehead = 0; - while ((i = READUINT32(save_p)) != 0xffffffff) + while ((i = P_ReadUINT32(save_p)) != 0xffffffff) { itemrespawnque[iquehead] = &mapthings[i]; - itemrespawntime[iquehead++] = READINT32(save_p); + itemrespawntime[iquehead++] = P_ReadINT32(save_p); } - j = READINT32(save_p); + j = P_ReadINT32(save_p); if (j != globallevelskynum) P_SetupLevelSky(j, true); - globalweather = READUINT8(save_p); + globalweather = P_ReadUINT8(save_p); if (globalweather) { @@ -4469,14 +4709,17 @@ static void P_NetUnArchiveSpecials(void) P_SwitchWeather(globalweather); } - if (READUINT8(save_p) == 0x01) // metal sonic - G_LoadMetal(&save_p); + if (P_ReadUINT8(save_p) == 0x01) // metal sonic + { + UINT8 *p = &save_p->buf[save_p->pos]; + G_LoadMetal(&p); + } } // ======================================================================= // Misc // ======================================================================= -static inline void P_ArchiveMisc(INT16 mapnum) +static inline void P_ArchiveMisc(save_t *save_p, INT16 mapnum) { //lastmapsaved = mapnum; lastmaploaded = mapnum; @@ -4484,16 +4727,16 @@ static inline void P_ArchiveMisc(INT16 mapnum) if (gamecomplete) mapnum |= 8192; - WRITEINT16(save_p, mapnum); - WRITEUINT16(save_p, emeralds+357); - WRITESTRINGN(save_p, timeattackfolder, sizeof(timeattackfolder)); + P_WriteINT16(save_p, mapnum); + P_WriteUINT16(save_p, emeralds+357); + P_WriteStringN(save_p, timeattackfolder, sizeof(timeattackfolder)); } -static inline void P_UnArchiveSPGame(INT16 mapoverride) +static inline void P_UnArchiveSPGame(save_t *save_p, INT16 mapoverride) { char testname[sizeof(timeattackfolder)]; - gamemap = READINT16(save_p); + gamemap = P_ReadINT16(save_p); if (mapoverride != 0) { @@ -4514,9 +4757,9 @@ static inline void P_UnArchiveSPGame(INT16 mapoverride) tokenlist = 0; token = 0; - savedata.emeralds = READUINT16(save_p)-357; + savedata.emeralds = P_ReadUINT16(save_p)-357; - READSTRINGN(save_p, testname, sizeof(testname)); + P_ReadStringN(save_p, testname, sizeof(testname)); if (strcmp(testname, timeattackfolder)) { @@ -4530,100 +4773,100 @@ static inline void P_UnArchiveSPGame(INT16 mapoverride) playeringame[consoleplayer] = true; } -static void P_NetArchiveMisc(boolean resending) +static void P_NetArchiveMisc(save_t *save_p, boolean resending) { INT32 i; - WRITEUINT32(save_p, ARCHIVEBLOCK_MISC); + P_WriteUINT32(save_p, ARCHIVEBLOCK_MISC); if (resending) - WRITEUINT32(save_p, gametic); - WRITEINT16(save_p, gamemap); + P_WriteUINT32(save_p, gametic); + P_WriteINT16(save_p, gamemap); if (gamestate != GS_LEVEL) - WRITEINT16(save_p, GS_WAITINGPLAYERS); // nice hack to put people back into waitingplayers + P_WriteINT16(save_p, GS_WAITINGPLAYERS); // nice hack to put people back into waitingplayers else - WRITEINT16(save_p, gamestate); - WRITEINT16(save_p, gametype); + P_WriteINT16(save_p, gamestate); + P_WriteINT16(save_p, gametype); { UINT32 pig = 0; for (i = 0; i < MAXPLAYERS; i++) pig |= (playeringame[i] != 0)<totalplaytime); + P_WriteUINT32(save_p, data->totalplaytime); // TODO put another cipher on these things? meh, I don't care... for (i = 0; i < NUMMAPS; i++) - WRITEUINT8(save_p, (data->mapvisited[i] & MV_MAX)); + P_WriteUINT8(save_p, (data->mapvisited[i] & MV_MAX)); // To save space, use one bit per collected/achieved/unlocked flag for (i = 0; i < MAXEMBLEMS;) @@ -4742,7 +4985,7 @@ static inline void P_NetArchiveEmblems(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXEMBLEMS; ++j) btemp |= (data->collected[j+i] << j); - WRITEUINT8(save_p, btemp); + P_WriteUINT8(save_p, btemp); i += j; } for (i = 0; i < MAXEXTRAEMBLEMS;) @@ -4750,7 +4993,7 @@ static inline void P_NetArchiveEmblems(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXEXTRAEMBLEMS; ++j) btemp |= (data->extraCollected[j+i] << j); - WRITEUINT8(save_p, btemp); + P_WriteUINT8(save_p, btemp); i += j; } for (i = 0; i < MAXUNLOCKABLES;) @@ -4758,7 +5001,7 @@ static inline void P_NetArchiveEmblems(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) btemp |= (data->unlocked[j+i] << j); - WRITEUINT8(save_p, btemp); + P_WriteUINT8(save_p, btemp); i += j; } for (i = 0; i < MAXCONDITIONSETS;) @@ -4766,28 +5009,28 @@ static inline void P_NetArchiveEmblems(void) btemp = 0; for (j = 0; j < 8 && j+i < MAXCONDITIONSETS; ++j) btemp |= (data->achieved[j+i] << j); - WRITEUINT8(save_p, btemp); + P_WriteUINT8(save_p, btemp); i += j; } - WRITEUINT32(save_p, data->timesBeaten); - WRITEUINT32(save_p, data->timesBeatenWithEmeralds); - WRITEUINT32(save_p, data->timesBeatenUltimate); + P_WriteUINT32(save_p, data->timesBeaten); + P_WriteUINT32(save_p, data->timesBeatenWithEmeralds); + P_WriteUINT32(save_p, data->timesBeatenUltimate); // Main records for (i = 0; i < NUMMAPS; i++) { if (data->mainrecords[i]) { - WRITEUINT32(save_p, data->mainrecords[i]->score); - WRITEUINT32(save_p, data->mainrecords[i]->time); - WRITEUINT16(save_p, data->mainrecords[i]->rings); + P_WriteUINT32(save_p, data->mainrecords[i]->score); + P_WriteUINT32(save_p, data->mainrecords[i]->time); + P_WriteUINT16(save_p, data->mainrecords[i]->rings); } else { - WRITEUINT32(save_p, 0); - WRITEUINT32(save_p, 0); - WRITEUINT16(save_p, 0); + P_WriteUINT32(save_p, 0); + P_WriteUINT32(save_p, 0); + P_WriteUINT16(save_p, 0); } } @@ -4796,43 +5039,43 @@ static inline void P_NetArchiveEmblems(void) { if (!data->nightsrecords[i] || !data->nightsrecords[i]->nummares) { - WRITEUINT8(save_p, 0); + P_WriteUINT8(save_p, 0); continue; } - WRITEUINT8(save_p, data->nightsrecords[i]->nummares); + P_WriteUINT8(save_p, data->nightsrecords[i]->nummares); for (curmare = 0; curmare < (data->nightsrecords[i]->nummares + 1); ++curmare) { - WRITEUINT32(save_p, data->nightsrecords[i]->score[curmare]); - WRITEUINT8(save_p, data->nightsrecords[i]->grade[curmare]); - WRITEUINT32(save_p, data->nightsrecords[i]->time[curmare]); + P_WriteUINT32(save_p, data->nightsrecords[i]->score[curmare]); + P_WriteUINT8(save_p, data->nightsrecords[i]->grade[curmare]); + P_WriteUINT32(save_p, data->nightsrecords[i]->time[curmare]); } } // Mid-map stuff - WRITEUINT32(save_p, unlocktriggers); + P_WriteUINT32(save_p, unlocktriggers); for (i = 0; i < MAXPLAYERS; i++) { if (!ntemprecords[i].nummares) { - WRITEUINT8(save_p, 0); + P_WriteUINT8(save_p, 0); continue; } - WRITEUINT8(save_p, ntemprecords[i].nummares); + P_WriteUINT8(save_p, ntemprecords[i].nummares); for (curmare = 0; curmare < (ntemprecords[i].nummares + 1); ++curmare) { - WRITEUINT32(save_p, ntemprecords[i].score[curmare]); - WRITEUINT8(save_p, ntemprecords[i].grade[curmare]); - WRITEUINT32(save_p, ntemprecords[i].time[curmare]); + P_WriteUINT32(save_p, ntemprecords[i].score[curmare]); + P_WriteUINT8(save_p, ntemprecords[i].grade[curmare]); + P_WriteUINT32(save_p, ntemprecords[i].time[curmare]); } } } -static inline void P_NetUnArchiveEmblems(void) +static inline void P_NetUnArchiveEmblems(save_t *save_p) { gamedata_t *data = serverGamedata; INT32 i, j; @@ -4843,14 +5086,14 @@ static inline void P_NetUnArchiveEmblems(void) UINT8 recmares; INT32 curmare; - if (READUINT32(save_p) != ARCHIVEBLOCK_EMBLEMS) + if (P_ReadUINT32(save_p) != ARCHIVEBLOCK_EMBLEMS) I_Error("Bad $$$.sav at archive block Emblems"); - savemoddata = (boolean)READUINT8(save_p); // this one is actually necessary because savemoddata stays false otherwise for some reason. + savemoddata = (boolean)P_ReadUINT8(save_p); // this one is actually necessary because savemoddata stays false otherwise for some reason. - if (numemblems != READINT32(save_p)) + if (numemblems != P_ReadINT32(save_p)) I_Error("Bad $$$.sav dearchiving Emblems (numemblems mismatch)"); - if (numextraemblems != READINT32(save_p)) + if (numextraemblems != P_ReadINT32(save_p)) I_Error("Bad $$$.sav dearchiving Emblems (numextraemblems mismatch)"); // This shouldn't happen, but if something really fucked up happens and you transfer @@ -4865,53 +5108,53 @@ static inline void P_NetUnArchiveEmblems(void) // TODO: Optimize this to only read information about emblems, unlocks, etc. which actually exist // There is no need to go all the way up to MAXEMBLEMS when wads are guaranteed to be the same. - data->totalplaytime = READUINT32(save_p); + data->totalplaytime = P_ReadUINT32(save_p); // TODO put another cipher on these things? meh, I don't care... for (i = 0; i < NUMMAPS; i++) - if ((data->mapvisited[i] = READUINT8(save_p)) > MV_MAX) + if ((data->mapvisited[i] = P_ReadUINT8(save_p)) > MV_MAX) I_Error("Bad $$$.sav dearchiving Emblems (invalid visit flags)"); // To save space, use one bit per collected/achieved/unlocked flag for (i = 0; i < MAXEMBLEMS;) { - rtemp = READUINT8(save_p); + rtemp = P_ReadUINT8(save_p); for (j = 0; j < 8 && j+i < MAXEMBLEMS; ++j) data->collected[j+i] = ((rtemp >> j) & 1); i += j; } for (i = 0; i < MAXEXTRAEMBLEMS;) { - rtemp = READUINT8(save_p); + rtemp = P_ReadUINT8(save_p); for (j = 0; j < 8 && j+i < MAXEXTRAEMBLEMS; ++j) data->extraCollected[j+i] = ((rtemp >> j) & 1); i += j; } for (i = 0; i < MAXUNLOCKABLES;) { - rtemp = READUINT8(save_p); + rtemp = P_ReadUINT8(save_p); for (j = 0; j < 8 && j+i < MAXUNLOCKABLES; ++j) data->unlocked[j+i] = ((rtemp >> j) & 1); i += j; } for (i = 0; i < MAXCONDITIONSETS;) { - rtemp = READUINT8(save_p); + rtemp = P_ReadUINT8(save_p); for (j = 0; j < 8 && j+i < MAXCONDITIONSETS; ++j) data->achieved[j+i] = ((rtemp >> j) & 1); i += j; } - data->timesBeaten = READUINT32(save_p); - data->timesBeatenWithEmeralds = READUINT32(save_p); - data->timesBeatenUltimate = READUINT32(save_p); + data->timesBeaten = P_ReadUINT32(save_p); + data->timesBeatenWithEmeralds = P_ReadUINT32(save_p); + data->timesBeatenUltimate = P_ReadUINT32(save_p); // Main records for (i = 0; i < NUMMAPS; ++i) { - recscore = READUINT32(save_p); - rectime = (tic_t)READUINT32(save_p); - recrings = READUINT16(save_p); + recscore = P_ReadUINT32(save_p); + rectime = (tic_t)P_ReadUINT32(save_p); + recrings = P_ReadUINT16(save_p); if (recrings > 10000 || recscore > MAXSCORE) I_Error("Bad $$$.sav dearchiving Emblems (invalid score)"); @@ -4928,16 +5171,16 @@ static inline void P_NetUnArchiveEmblems(void) // Nights records for (i = 0; i < NUMMAPS; ++i) { - if ((recmares = READUINT8(save_p)) == 0) + if ((recmares = P_ReadUINT8(save_p)) == 0) continue; G_AllocNightsRecordData((INT16)i, data); for (curmare = 0; curmare < (recmares+1); ++curmare) { - data->nightsrecords[i]->score[curmare] = READUINT32(save_p); - data->nightsrecords[i]->grade[curmare] = READUINT8(save_p); - data->nightsrecords[i]->time[curmare] = (tic_t)READUINT32(save_p); + data->nightsrecords[i]->score[curmare] = P_ReadUINT32(save_p); + data->nightsrecords[i]->grade[curmare] = P_ReadUINT8(save_p); + data->nightsrecords[i]->time[curmare] = (tic_t)P_ReadUINT32(save_p); if (data->nightsrecords[i]->grade[curmare] > GRADE_S) { @@ -4949,18 +5192,18 @@ static inline void P_NetUnArchiveEmblems(void) } // Mid-map stuff - unlocktriggers = READUINT32(save_p); + unlocktriggers = P_ReadUINT32(save_p); for (i = 0; i < MAXPLAYERS; ++i) { - if ((recmares = READUINT8(save_p)) == 0) + if ((recmares = P_ReadUINT8(save_p)) == 0) continue; for (curmare = 0; curmare < (recmares+1); ++curmare) { - ntemprecords[i].score[curmare] = READUINT32(save_p); - ntemprecords[i].grade[curmare] = READUINT8(save_p); - ntemprecords[i].time[curmare] = (tic_t)READUINT32(save_p); + ntemprecords[i].score[curmare] = P_ReadUINT32(save_p); + ntemprecords[i].grade[curmare] = P_ReadUINT8(save_p); + ntemprecords[i].time[curmare] = (tic_t)P_ReadUINT32(save_p); if (ntemprecords[i].grade[curmare] > GRADE_S) { @@ -4972,37 +5215,37 @@ static inline void P_NetUnArchiveEmblems(void) } } -static void P_NetArchiveSectorPortals(void) +static void P_NetArchiveSectorPortals(save_t *save_p) { - WRITEUINT32(save_p, ARCHIVEBLOCK_SECPORTALS); + P_WriteUINT32(save_p, ARCHIVEBLOCK_SECPORTALS); - WRITEUINT32(save_p, secportalcount); + P_WriteUINT32(save_p, secportalcount); for (size_t i = 0; i < secportalcount; i++) { UINT8 type = secportals[i].type; - WRITEUINT8(save_p, type); - WRITEFIXED(save_p, secportals[i].origin.x); - WRITEFIXED(save_p, secportals[i].origin.y); + P_WriteUINT8(save_p, type); + P_WriteFixed(save_p, secportals[i].origin.x); + P_WriteFixed(save_p, secportals[i].origin.y); switch (type) { case SECPORTAL_LINE: - WRITEUINT32(save_p, SaveLine(secportals[i].line.start)); - WRITEUINT32(save_p, SaveLine(secportals[i].line.dest)); + P_WriteUINT32(save_p, SaveLine(secportals[i].line.start)); + P_WriteUINT32(save_p, SaveLine(secportals[i].line.dest)); break; case SECPORTAL_PLANE: case SECPORTAL_HORIZON: case SECPORTAL_FLOOR: case SECPORTAL_CEILING: - WRITEUINT32(save_p, SaveSector(secportals[i].sector)); + P_WriteUINT32(save_p, SaveSector(secportals[i].sector)); break; case SECPORTAL_OBJECT: if (secportals[i].mobj && !P_MobjWasRemoved(secportals[i].mobj)) SaveMobjnum(secportals[i].mobj); else - WRITEUINT32(save_p, 0); + P_WriteUINT32(save_p, 0); break; default: break; @@ -5010,15 +5253,15 @@ static void P_NetArchiveSectorPortals(void) } } -static void P_NetUnArchiveSectorPortals(void) +static void P_NetUnArchiveSectorPortals(save_t *save_p) { - if (READUINT32(save_p) != ARCHIVEBLOCK_SECPORTALS) + if (P_ReadUINT32(save_p) != ARCHIVEBLOCK_SECPORTALS) I_Error("Bad $$$.sav at archive block Secportals"); Z_Free(secportals); P_InitSectorPortals(); - UINT32 count = READUINT32(save_p); + UINT32 count = P_ReadUINT32(save_p); for (UINT32 i = 0; i < count; i++) { @@ -5026,24 +5269,24 @@ static void P_NetUnArchiveSectorPortals(void) sectorportal_t *secportal = &secportals[id]; - secportal->type = READUINT8(save_p); - secportal->origin.x = READFIXED(save_p); - secportal->origin.y = READFIXED(save_p); + secportal->type = P_ReadUINT8(save_p); + secportal->origin.x = P_ReadFixed(save_p); + secportal->origin.y = P_ReadFixed(save_p); switch (secportal->type) { case SECPORTAL_LINE: - secportal->line.start = LoadLine(READUINT32(save_p)); - secportal->line.dest = LoadLine(READUINT32(save_p)); + secportal->line.start = LoadLine(P_ReadUINT32(save_p)); + secportal->line.dest = LoadLine(P_ReadUINT32(save_p)); break; case SECPORTAL_PLANE: case SECPORTAL_HORIZON: case SECPORTAL_FLOOR: case SECPORTAL_CEILING: - secportal->sector = LoadSector(READUINT32(save_p)); + secportal->sector = LoadSector(P_ReadUINT32(save_p)); break; case SECPORTAL_OBJECT: - id = READUINT32(save_p); + id = P_ReadUINT32(save_p); secportal->mobj = (id == 0) ? NULL : P_FindNewPosition(id); break; default: @@ -5052,7 +5295,7 @@ static void P_NetUnArchiveSectorPortals(void) } } -static inline void P_ArchiveLuabanksAndConsistency(void) +static inline void P_ArchiveLuabanksAndConsistency(save_t *save_p) { UINT8 i, banksinuse = NUM_LUABANKS; @@ -5061,30 +5304,30 @@ static inline void P_ArchiveLuabanksAndConsistency(void) if (banksinuse) { - WRITEUINT8(save_p, 0xb7); // luabanks marker - WRITEUINT8(save_p, banksinuse); + P_WriteUINT8(save_p, 0xb7); // luabanks marker + P_WriteUINT8(save_p, banksinuse); for (i = 0; i < banksinuse; i++) - WRITEINT32(save_p, luabanks[i]); + P_WriteINT32(save_p, luabanks[i]); } - WRITEUINT8(save_p, 0x1d); // consistency marker + P_WriteUINT8(save_p, 0x1d); // consistency marker } -static inline boolean P_UnArchiveLuabanksAndConsistency(void) +static inline boolean P_UnArchiveLuabanksAndConsistency(save_t *save_p) { - switch (READUINT8(save_p)) + switch (P_ReadUINT8(save_p)) { case 0xb7: // luabanks marker { - UINT8 i, banksinuse = READUINT8(save_p); + UINT8 i, banksinuse = P_ReadUINT8(save_p); if (banksinuse > NUM_LUABANKS) { CONS_Alert(CONS_ERROR, M_GetText("Corrupt Luabanks! (Too many banks in use)\n")); return false; } for (i = 0; i < banksinuse; i++) - luabanks[i] = READINT32(save_p); - if (READUINT8(save_p) != 0x1d) // consistency marker + luabanks[i] = P_ReadINT32(save_p); + if (P_ReadUINT8(save_p) != 0x1d) // consistency marker { CONS_Alert(CONS_ERROR, M_GetText("Corrupt Luabanks! (Failed consistency check)\n")); return false; @@ -5100,22 +5343,24 @@ static inline boolean P_UnArchiveLuabanksAndConsistency(void) return true; } -void P_SaveGame(INT16 mapnum) +void P_SaveGame(save_t *save_p, INT16 mapnum) { - P_ArchiveMisc(mapnum); - P_ArchivePlayer(); - P_ArchiveLuabanksAndConsistency(); + P_ArchiveMisc(save_p, mapnum); + P_ArchivePlayer(save_p); + P_ArchiveLuabanksAndConsistency(save_p); } -void P_SaveNetGame(boolean resending) +void P_SaveNetGame(save_t *save_p, boolean resending) { thinker_t *th; mobj_t *mobj; INT32 i = 1; // don't start from 0, it'd be confused with a blank pointer otherwise - CV_SaveNetVars(&save_p); - P_NetArchiveMisc(resending); - P_NetArchiveEmblems(); + UINT8 *p = &save_p->buf[save_p->pos]; + CV_SaveNetVars(&p); + save_p->pos = p - save_p->buf; + P_NetArchiveMisc(save_p, resending); + P_NetArchiveEmblems(save_p); // Assign the mobjnumber for pointer tracking for (th = thlist[THINK_MOBJ].next; th != &thlist[THINK_MOBJ]; th = th->next) @@ -5129,32 +5374,32 @@ void P_SaveNetGame(boolean resending) mobj->mobjnum = i++; } - P_NetArchivePlayers(); + P_NetArchivePlayers(save_p); if (gamestate == GS_LEVEL) { - P_NetArchiveWorld(); - P_ArchivePolyObjects(); - P_NetArchiveThinkers(); - P_NetArchiveSpecials(); - P_NetArchiveColormaps(); - P_NetArchiveWaypoints(); - P_NetArchiveSectorPortals(); + P_NetArchiveWorld(save_p); + P_ArchivePolyObjects(save_p); + P_NetArchiveThinkers(save_p); + P_NetArchiveSpecials(save_p); + P_NetArchiveColormaps(save_p); + P_NetArchiveWaypoints(save_p); + P_NetArchiveSectorPortals(save_p); } - LUA_Archive(); + LUA_Archive(save_p); - P_ArchiveLuabanksAndConsistency(); + P_ArchiveLuabanksAndConsistency(save_p); } -boolean P_LoadGame(INT16 mapoverride) +boolean P_LoadGame(save_t *save_p, INT16 mapoverride) { if (gamestate == GS_INTERMISSION) Y_EndIntermission(); G_SetGamestate(GS_NULL); // should be changed in P_UnArchiveMisc - P_UnArchiveSPGame(mapoverride); - P_UnArchivePlayer(); + P_UnArchiveSPGame(save_p, mapoverride); + P_UnArchivePlayer(save_p); - if (!P_UnArchiveLuabanksAndConsistency()) + if (!P_UnArchiveLuabanksAndConsistency(save_p)) return false; // Only do this after confirming savegame is ok @@ -5164,26 +5409,28 @@ boolean P_LoadGame(INT16 mapoverride) return true; } -boolean P_LoadNetGame(boolean reloading) +boolean P_LoadNetGame(save_t *save_p, boolean reloading) { - CV_LoadNetVars(&save_p); - if (!P_NetUnArchiveMisc(reloading)) + UINT8 *p = &save_p->buf[save_p->pos]; + CV_LoadNetVars(&p); + save_p->pos = p - save_p->buf; + if (!P_NetUnArchiveMisc(save_p, reloading)) return false; - P_NetUnArchiveEmblems(); - P_NetUnArchivePlayers(); + P_NetUnArchiveEmblems(save_p); + P_NetUnArchivePlayers(save_p); if (gamestate == GS_LEVEL) { - P_NetUnArchiveWorld(); - P_UnArchivePolyObjects(); - P_NetUnArchiveThinkers(); - P_NetUnArchiveSpecials(); - P_NetUnArchiveColormaps(); - P_NetUnArchiveWaypoints(); - P_NetUnArchiveSectorPortals(); + P_NetUnArchiveWorld(save_p); + P_UnArchivePolyObjects(save_p); + P_NetUnArchiveThinkers(save_p); + P_NetUnArchiveSpecials(save_p); + P_NetUnArchiveColormaps(save_p); + P_NetUnArchiveWaypoints(save_p); + P_NetUnArchiveSectorPortals(save_p); P_RelinkPointers(); P_FinishMobjs(); } - LUA_UnArchive(); + LUA_UnArchive(save_p); // This is stupid and hacky, but maybe it'll work! P_SetRandSeed(P_GetInitSeed()); @@ -5194,5 +5441,5 @@ boolean P_LoadNetGame(boolean reloading) // precipitation when loading a netgame save. Instead, precip has to be spawned here. // This is done in P_NetUnArchiveSpecials now. - return P_UnArchiveLuabanksAndConsistency(); + return P_UnArchiveLuabanksAndConsistency(save_p); } diff --git a/src/p_saveg.h b/src/p_saveg.h index 545008e7e..8aa83c80f 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -18,17 +18,24 @@ #pragma interface #endif +#include "tables.h" + #define NEWSKINSAVES (INT16_MAX) // TODO: 2.3: Delete (Purely for backwards compatibility) // Persistent storage/archiving. // These are the load / save game routines. -void P_SaveGame(INT16 mapnum); -void P_SaveNetGame(boolean resending); -boolean P_LoadGame(INT16 mapoverride); -boolean P_LoadNetGame(boolean reloading); +typedef struct +{ + unsigned char *buf; + size_t size; + size_t pos; +} save_t; -mobj_t *P_FindNewPosition(UINT32 oldposition); +void P_SaveGame(save_t *save_p, INT16 mapnum); +void P_SaveNetGame(save_t *save_p, boolean resending); +boolean P_LoadGame(save_t *save_p, INT16 mapoverride); +boolean P_LoadNetGame(save_t *save_p, boolean reloading); typedef struct { @@ -42,6 +49,37 @@ typedef struct } savedata_t; extern savedata_t savedata; -extern UINT8 *save_p; + +void P_WriteUINT8(save_t *p, UINT8 v); +void P_WriteSINT8(save_t *p, SINT8 v); +void P_WriteUINT16(save_t *p, UINT16 v); +void P_WriteINT16(save_t *p, INT16 v); +void P_WriteUINT32(save_t *p, UINT32 v); +void P_WriteINT32(save_t *p, INT32 v); +void P_WriteChar(save_t *p, char v); +void P_WriteFixed(save_t *p, fixed_t v); +void P_WriteAngle(save_t *p, angle_t v); +void P_WriteStringN(save_t *p, char const *s, size_t n); +void P_WriteStringL(save_t *p, char const *s, size_t n); +void P_WriteString(save_t *p, char const *s); +void P_WriteMem(save_t *p, void const *s, size_t n); + +void P_SkipStringN(save_t *p, size_t n); +void P_SkipStringL(save_t *p, size_t n); +void P_SkipString(save_t *p); + +UINT8 P_ReadUINT8(save_t *p); +SINT8 P_ReadSINT8(save_t *p); +UINT16 P_ReadUINT16(save_t *p); +INT16 P_ReadINT16(save_t *p); +UINT32 P_ReadUINT32(save_t *p); +INT32 P_ReadINT32(save_t *p); +char P_ReadChar(save_t *p); +fixed_t P_ReadFixed(save_t *p); +angle_t P_ReadAngle(save_t *p); +void P_ReadStringN(save_t *p, char *s, size_t n); +void P_ReadStringL(save_t *p, char *s, size_t n); +void P_ReadString(save_t *p, char *s); +void P_ReadMem(save_t *p, void *s, size_t n); #endif From 0cf3ce91e963436fe18d39897773aab68e8e4897 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sun, 7 Jul 2024 21:31:46 +0200 Subject: [PATCH 105/139] Fix compilation warning --- src/p_saveg.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index b40d7cbdd..38af26fd6 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -790,10 +790,10 @@ static void P_NetUnArchivePlayers(save_t *save_p) players[i].charability = P_ReadUINT8(save_p); players[i].charability2 = P_ReadUINT8(save_p); players[i].charflags = P_ReadUINT32(save_p); - players[i].thokitem = (mobjtype_t)P_ReadUINT32(save_p); - players[i].spinitem = (mobjtype_t)P_ReadUINT32(save_p); - players[i].revitem = (mobjtype_t)P_ReadUINT32(save_p); - players[i].followitem = (mobjtype_t)P_ReadUINT32(save_p); + players[i].thokitem = P_ReadUINT32(save_p); + players[i].spinitem = P_ReadUINT32(save_p); + players[i].revitem = P_ReadUINT32(save_p); + players[i].followitem = P_ReadUINT32(save_p); players[i].actionspd = P_ReadFixed(save_p); players[i].mindash = P_ReadFixed(save_p); players[i].maxdash = P_ReadFixed(save_p); From 319610763e127bd689ef8bfadf589bb537ccae92 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Wed, 17 Jul 2024 23:22:56 -0300 Subject: [PATCH 106/139] Fix "Several patches used in Sol Sestancia 2 are broken" --- src/w_wad.c | 24 +++++++++++++++++++----- src/w_wad.h | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/w_wad.c b/src/w_wad.c index cc7cdc201..97208296a 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -1329,10 +1329,10 @@ UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlum /* SLADE is special and puts a single directory entry. Skip that. */ if (strlen(lump_p->fullname) == name_length) i++; - break; + return i; } } - return i; + return INT16_MAX; } // In a PK3 type of resource file, it looks for the next lumpinfo entry that doesn't share the specified pathfile. @@ -1350,6 +1350,17 @@ UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump) return i; } +// Returns 0 if the folder is not empty, 1 if it is empty, -1 if it doesn't exist +INT32 W_IsFolderEmpty(const char *name, UINT16 wad) +{ + UINT16 start = W_CheckNumForFolderStartPK3(name, wad, 0); + if (start == INT16_MAX) + return -1; + + // Unlike W_CheckNumForFolderStartPK3, W_CheckNumForFolderEndPK3 doesn't return INT16_MAX. + return W_CheckNumForFolderEndPK3(name, wad, start) <= start; +} + char *W_GetLumpFolderPathPK3(UINT16 wad, UINT16 lump) { const char *fullname = wadfiles[wad]->lumpinfo[lump].fullname; @@ -1692,7 +1703,7 @@ lumpnum_t W_GetNumForLongName(const char *name) // static UINT16 W_CheckNumForPatchNamePwad(const char *name, UINT16 wad, boolean longname) { - UINT16 i, start, end; + UINT16 i, start = INT16_MAX, end = INT16_MAX; static char uname[8 + 1] = { 0 }; UINT32 hash = 0; lumpinfo_t *lump_p; @@ -1714,8 +1725,11 @@ static UINT16 W_CheckNumForPatchNamePwad(const char *name, UINT16 wad, boolean l // TODO: cache namespace lump IDs if (W_FileHasFolders(wadfiles[wad])) { - start = W_CheckNumForFolderStartPK3("Flats/", wad, 0); - end = W_CheckNumForFolderEndPK3("Flats/", wad, start); + if (!W_IsFolderEmpty("Flats/", wad)) + { + start = W_CheckNumForFolderStartPK3("Flats/", wad, 0); + end = W_CheckNumForFolderEndPK3("Flats/", wad, start); + } } else { diff --git a/src/w_wad.h b/src/w_wad.h index 3dcb9b6e8..4fd7b2c00 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -180,6 +180,7 @@ UINT16 W_CheckNumForMarkerStartPwad(const char *name, UINT16 wad, UINT16 startlu UINT16 W_CheckNumForFullNamePK3(const char *name, UINT16 wad, UINT16 startlump); UINT16 W_CheckNumForFolderStartPK3(const char *name, UINT16 wad, UINT16 startlump); UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump); +INT32 W_IsFolderEmpty(const char *name, UINT16 wad); char *W_GetLumpFolderPathPK3(UINT16 wad, UINT16 lump); char *W_GetLumpFolderNamePK3(UINT16 wad, UINT16 lump); From 522b354b4989863342e2f6794fdfc4d4d2500e4b Mon Sep 17 00:00:00 2001 From: Hanicef Date: Mon, 22 Jul 2024 18:00:52 +0200 Subject: [PATCH 107/139] Lift ban limits --- src/netcode/i_tcp.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/netcode/i_tcp.c b/src/netcode/i_tcp.c index 24dfd7ec2..046c13d09 100644 --- a/src/netcode/i_tcp.c +++ b/src/netcode/i_tcp.c @@ -37,6 +37,7 @@ #endif #include "../doomdef.h" +#include "../z_zone.h" #ifdef USE_WINSOCK1 #include @@ -120,8 +121,6 @@ typedef union static boolean UPNP_support = true; #endif // HAVE_MINIUPNC -#define MAXBANS 100 - #include "../i_system.h" #include "i_net.h" #include "d_net.h" @@ -169,8 +168,8 @@ static mysockaddr_t clientaddress[MAXNETNODES+1]; static mysockaddr_t broadcastaddress[MAXNETNODES+1]; static size_t broadcastaddresses = 0; static boolean nodeconnected[MAXNETNODES+1]; -static mysockaddr_t banned[MAXBANS]; -static UINT8 bannedmask[MAXBANS]; +static mysockaddr_t *banned; +static UINT8 *bannedmask; static size_t numbans = 0; static boolean SOCK_bannednode[MAXNETNODES+1]; /// \note do we really need the +1? @@ -1253,9 +1252,9 @@ static boolean SOCK_Ban(INT32 node) { if (node > MAXNETNODES) return false; - if (numbans == MAXBANS) - return false; + banned = Z_Realloc(banned, sizeof(*banned) * (numbans+1), PU_STATIC, NULL); + bannedmask = Z_Realloc(bannedmask, sizeof(*bannedmask) * (numbans+1), PU_STATIC, NULL); M_Memcpy(&banned[numbans], &clientaddress[node], sizeof (mysockaddr_t)); if (banned[numbans].any.sa_family == AF_INET) { @@ -1278,7 +1277,7 @@ static boolean SOCK_SetBanAddress(const char *address, const char *mask) struct my_addrinfo *ai, *runp, hints; int gaie; - if (numbans == MAXBANS || !address) + if (!address) return false; memset(&hints, 0x00, sizeof(hints)); @@ -1293,8 +1292,10 @@ static boolean SOCK_SetBanAddress(const char *address, const char *mask) runp = ai; - while(runp != NULL && numbans != MAXBANS) + while(runp != NULL) { + banned = Z_Realloc(banned, sizeof(*banned) * (numbans+1), PU_STATIC, NULL); + bannedmask = Z_Realloc(bannedmask, sizeof(*bannedmask) * (numbans+1), PU_STATIC, NULL); memcpy(&banned[numbans], runp->ai_addr, runp->ai_addrlen); if (mask) @@ -1324,6 +1325,10 @@ static boolean SOCK_SetBanAddress(const char *address, const char *mask) static void SOCK_ClearBans(void) { numbans = 0; + Z_Free(banned); + banned = NULL; + Z_Free(bannedmask); + bannedmask = NULL; } boolean I_InitTcpNetwork(void) From a74fcf7c490ee2aab332f63368aaa8008061acd6 Mon Sep 17 00:00:00 2001 From: MIDIMan Date: Sat, 27 Jul 2024 22:37:12 -0400 Subject: [PATCH 108/139] Re-add player check(s) for MF_SPECIAL objects in PIT_DoCheckThing --- src/p_map.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index b79f9d45c..c742e2e85 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1465,13 +1465,13 @@ static unsigned PIT_DoCheckThing(mobj_t *thing) } // check for special pickup - if (thing->flags & MF_SPECIAL) + if (thing->flags & MF_SPECIAL && (tmthing->player || (tmthing->flags & MF_PUSHABLE))) // MF_PUSHABLE added for steam jets { P_TouchSpecialThing(thing, tmthing, true); // can remove thing return CHECKTHING_COLLIDE; } // check again for special pickup - if (tmthing->flags & MF_SPECIAL) + if (tmthing->flags & MF_SPECIAL && (thing->player || (thing->flags & MF_PUSHABLE))) // MF_PUSHABLE added for steam jets { P_TouchSpecialThing(tmthing, thing, true); // can remove thing return CHECKTHING_COLLIDE; From 8e337487eaa168afc053eaa07c3cd6f365df3174 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Fri, 2 Aug 2024 21:42:27 +0200 Subject: [PATCH 109/139] Fix players being unmuted after respawning --- src/g_game.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 5d6954b9b..7d5c396dc 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2624,6 +2624,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) boolean spectator; boolean outofcoop; boolean removing; + boolean muted; INT16 bot; SINT8 pity; INT16 rings; @@ -2641,6 +2642,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) spectator = players[player].spectator; outofcoop = players[player].outofcoop; removing = players[player].removing; + muted = players[player].muted; pflags = (players[player].pflags & (PF_FLIPCAM|PF_ANALOGMODE|PF_DIRECTIONCHAR|PF_AUTOBRAKE|PF_TAGIT|PF_GAMETYPEOVER)); playerangleturn = players[player].angleturn; oldrelangleturn = players[player].oldrelangleturn; @@ -2718,6 +2720,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) p->spectator = spectator; p->outofcoop = outofcoop; p->removing = removing; + p->muted = muted; p->angleturn = playerangleturn; p->oldrelangleturn = oldrelangleturn; From ef58615f42cb76d116ae634204ffcacb6e38eba2 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Fri, 9 Aug 2024 22:24:00 +0200 Subject: [PATCH 110/139] Fix input panel overdrawing the scoreboard --- src/st_stuff.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/st_stuff.c b/src/st_stuff.c index e088a448c..9f1fb6d88 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1042,6 +1042,9 @@ static void ST_drawInput(void) INT32 x = hudinfo[HUD_INPUT].x, y = hudinfo[HUD_INPUT].y; + if (hu_showscores) + return; + if (stplyr->powers[pw_carry] == CR_NIGHTSMODE) y += 8; else if (modeattacking || !LUA_HudEnabled(hud_lives)) From a9d7da600303499d0e41f1d8898d90464871d7bc Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 13 Aug 2024 14:43:24 +0200 Subject: [PATCH 111/139] Restore super transformation conditions --- src/lua_baselib.c | 3 +-- src/p_local.h | 2 +- src/p_user.c | 29 +++++++++-------------------- src/y_inter.c | 4 ++-- 4 files changed, 13 insertions(+), 25 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 304c866c9..2534c92ac 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1730,12 +1730,11 @@ static int lib_pResetCamera(lua_State *L) static int lib_pSuperReady(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); - boolean transform = (boolean)lua_opttrueboolean(L, 2); //HUDSAFE INLEVEL if (!player) return LUA_ErrInvalid(L, "player_t"); - lua_pushboolean(L, P_SuperReady(player, transform)); + lua_pushboolean(L, P_SuperReady(player)); return 1; } diff --git a/src/p_local.h b/src/p_local.h index 249c3cd4b..f2470f72d 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -203,7 +203,7 @@ mobj_t *P_LookForEnemies(player_t *player, boolean nonenemies, boolean bullet); void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius); void P_Earthquake(mobj_t *inflictor, mobj_t *source, fixed_t radius); boolean P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user -boolean P_SuperReady(player_t *player, boolean transform); +boolean P_SuperReady(player_t *player); void P_DoJump(player_t *player, boolean soundandstate, boolean allowflip); void P_DoSpinDashDust(player_t *player); #define P_AnalogMove(player) (P_ControlStyle(player) == CS_LMAOGALOG) diff --git a/src/p_user.c b/src/p_user.c index 3ee13aca9..c5ff5aa72 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4438,27 +4438,21 @@ static void P_DoSuperStuff(player_t *player) // // Returns true if player is ready to transform or detransform // -boolean P_SuperReady(player_t *player, boolean transform) +boolean P_SuperReady(player_t *player) { - if (!transform && - (player->powers[pw_super] < TICRATE*3/2 - || !G_CoopGametype())) // No turning back in competitive! - return false; - else if (transform - && (player->powers[pw_super] - || !ALL7EMERALDS(emeralds) - || !(player->rings >= 50))) - return false; - if (player->mo + && (player->rings >= 50) + && ALL7EMERALDS(emeralds) + && (player->charflags & SF_SUPER) + && (player->pflags & PF_JUMPED) + && !player->powers[pw_super] + && !player->powers[pw_invulnerability] + && !(player->powers[pw_shield] & SH_NOSTACK) && !player->powers[pw_tailsfly] && !player->powers[pw_carry] - && (player->charflags & SF_SUPER) && !P_PlayerInPain(player) && !player->climbing && !(player->pflags & (PF_JUMPSTASIS|PF_THOKKED|PF_STARTDASH|PF_GLIDING|PF_SLIDING|PF_SHIELDABILITY)) - && ((player->pflags & PF_JUMPED) || (P_IsObjectOnGround(player->mo) && (player->panim == PA_IDLE || player->panim == PA_EDGE - || player->panim == PA_WALK || player->panim == PA_RUN || (player->charflags & SF_DASHMODE && player->panim == PA_DASH)))) && !(maptol & TOL_NIGHTS)) return true; @@ -5318,8 +5312,7 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd, boolean spinshieldhac ; else if (cmd->buttons & BT_SPIN) { - if (spinshieldhack && !(player->pflags & PF_SPINDOWN) && P_SuperReady(player, true) - && !player->powers[pw_invulnerability] && !(player->powers[pw_shield] & SH_NOSTACK)) // These two checks are no longer in P_SuperReady + if (spinshieldhack && !(player->pflags & PF_SPINDOWN) && P_SuperReady(player)) { // If you're using two-button play, can turn Super and aren't already, // and you don't have a shield, then turn Super! @@ -8805,10 +8798,6 @@ void P_MovePlayer(player_t *player) // Transform into super if we can! if (P_SuperReady(player, true)) P_DoSuperTransformation(player, false); - - // Detransform from super if we can! - else if (P_SuperReady(player, false)) - P_DoSuperDetransformation(player); } } diff --git a/src/y_inter.c b/src/y_inter.c index 2add8645b..cbe71901d 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -579,9 +579,9 @@ void Y_IntermissionDrawer(void) { if (LUA_HudEnabled(hud_intermissiontitletext)) { - const char *ringtext = "\x82" "get 50 rings, then"; + const char *ringtext = "\x82" "50 rings, no shield"; const char *tut1text = "\x82" "press " "\x80" "shield"; - const char *tut2text = "\x82" "to transform"; + const char *tut2text = "\x82" "mid-" "\x80" "jump"; ttheight = 8; V_DrawLevelTitle(data.spec.passedx1 + xoffset1, ttheight, 0, data.spec.passed1); ttheight += V_LevelNameHeight(data.spec.passed3) + 2; From 417bd0b0001557a16b620f57ea9000f3328e4a06 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Sat, 24 Aug 2024 19:18:28 -0300 Subject: [PATCH 112/139] Fix #1258 --- src/g_game.c | 2 + src/st_stuff.c | 118 +++++++++++++++++++++++-------------------------- src/st_stuff.h | 2 +- 3 files changed, 58 insertions(+), 64 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 7d5c396dc..cc02f98e7 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1936,6 +1936,8 @@ void G_DoLoadLevel(boolean resetplayer) // void G_StartTitleCard(void) { + ST_stopTitleCard(); + // The title card has been disabled for this map. // Oh well. if (!G_IsTitleCardAvailable()) diff --git a/src/st_stuff.c b/src/st_stuff.c index 9f1fb6d88..b99f003da 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1258,6 +1258,8 @@ static void ST_drawInput(void) V_DrawThinString(x, y, hudinfo[HUD_INPUT].f|((leveltime & 4) ? V_YELLOWMAP : V_REDMAP), "BAD DEMO!!"); } +static boolean lt_active = false; + static patch_t *lt_patches[3]; static INT32 lt_scroll = 0; static INT32 lt_mom = 0; @@ -1306,6 +1308,7 @@ void ST_startTitleCard(void) ST_cacheLevelTitle(); // initialize HUD variables + lt_active = true; lt_ticker = lt_exitticker = lt_lasttic = 0; lt_endtime = 2*TICRATE + (10*NEWTICRATERATIO); lt_scroll = BASEVIDWIDTH * FRACUNIT; @@ -1314,21 +1317,11 @@ void ST_startTitleCard(void) } // -// What happens before drawing the title card. -// Which is just setting the HUD translucency. +// Stops the title card. // -void ST_preDrawTitleCard(void) +void ST_stopTitleCard(void) { - if (!G_IsTitleCardAvailable()) - return; - - if (lt_ticker >= (lt_endtime + TICRATE)) - return; - - if (!lt_exitticker) - st_translucency = 0; - else - st_translucency = max(0, min((INT32)lt_exitticker-4, cv_translucenthud.value)); + lt_active = false; } // @@ -1337,47 +1330,43 @@ void ST_preDrawTitleCard(void) // void ST_runTitleCard(void) { - boolean run = !(paused || P_AutoPause()); - - if (!G_IsTitleCardAvailable()) + if (!lt_active || ((paused || P_AutoPause()) && lt_ticker >= PRELEVELTIME)) return; - if (lt_ticker >= (lt_endtime + TICRATE)) - return; - - if (run || (lt_ticker < PRELEVELTIME)) + if (!lt_exitticker) { - // tick - lt_ticker++; - if (lt_ticker >= lt_endtime) - lt_exitticker++; - - // scroll to screen (level title) - if (!lt_exitticker) - { - if (abs(lt_scroll) > FRACUNIT) - lt_scroll -= (lt_scroll>>2); - else - lt_scroll = 0; - } - // scroll away from screen (level title) + if (abs(lt_scroll) > FRACUNIT) + lt_scroll -= (lt_scroll>>2); else + lt_scroll = 0; + + if (abs(lt_zigzag) > FRACUNIT) + lt_zigzag -= (lt_zigzag>>2); + else + lt_zigzag = 0; + } + else + { + lt_mom -= FRACUNIT*6; + + if (lt_scroll > -BASEVIDWIDTH * FRACUNIT * 2) { - lt_mom -= FRACUNIT*6; lt_scroll += lt_mom; } - // scroll to screen (zigzag) - if (!lt_exitticker) + if (lt_zigzag > -(lt_patches[1]->width)*FRACUNIT) { - if (abs(lt_zigzag) > FRACUNIT) - lt_zigzag -= (lt_zigzag>>2); - else - lt_zigzag = 0; - } - // scroll away from screen (zigzag) - else lt_zigzag += lt_mom; + } + } + + lt_ticker++; + lt_exitticker = max((signed)lt_ticker - (signed)lt_endtime, 0); + + if (lt_ticker >= (lt_endtime + TICRATE)) + { + lt_active = false; + return; } } @@ -1404,9 +1393,6 @@ void ST_drawTitleCard(void) colormap = R_GetTranslationColormap(TC_DEFAULT, colornum, GTC_CACHE); - if (!G_IsTitleCardAvailable()) - return; - if (!LUA_HudEnabled(hud_stagetitle)) goto luahook; @@ -1487,13 +1473,14 @@ void ST_preLevelTitleCardDrawer(void) // void ST_drawWipeTitleCard(void) { + if (!lt_active) + return; + stplyr = &players[consoleplayer]; - ST_preDrawTitleCard(); ST_drawTitleCard(); if (splitscreen) { stplyr = &players[secondarydisplayplayer]; - ST_preDrawTitleCard(); ST_drawTitleCard(); } } @@ -2704,24 +2691,14 @@ static boolean ST_doItemFinderIconsAndSound(void) return true; } +static boolean drawstagetitle = false; + // // Draw the status bar overlay, customisable: the user chooses which // kind of information to overlay // static void ST_overlayDrawer(void) { - // Decide whether to draw the stage title or not - boolean stagetitle = false; - - // Check for a valid level title - // If the HUD is enabled - // And, if Lua is running, if the HUD library has the stage title enabled - if (G_IsTitleCardAvailable() && *mapheaderinfo[gamemap-1]->lvlttl != '\0' && !(hu_showscores && (netgame || multiplayer))) - { - stagetitle = true; - ST_preDrawTitleCard(); - } - // hu_showscores = auto hide score/time/rings when tab rankings are shown if (!(hu_showscores && (netgame || multiplayer))) { @@ -2861,7 +2838,7 @@ static void ST_overlayDrawer(void) } // draw level title Tails - if (stagetitle && (!WipeInAction) && (!WipeStageTitle)) + if (drawstagetitle && !WipeInAction && !WipeStageTitle) ST_drawTitleCard(); if (!hu_showscores && (netgame || multiplayer) && LUA_HudEnabled(hud_textspectator)) @@ -2932,7 +2909,22 @@ void ST_Drawer(void) } } - st_translucency = cv_translucenthud.value; + // Decide whether to draw the stage title or not + if (lt_active) + { + drawstagetitle = !(hu_showscores && (netgame || multiplayer)); + + if (!lt_exitticker) + st_translucency = 0; + else + st_translucency = max(0, min((INT32)lt_exitticker-4, cv_translucenthud.value)); + } + else + { + st_translucency = cv_translucenthud.value; + + drawstagetitle = false; + } if (st_overlay) { diff --git a/src/st_stuff.h b/src/st_stuff.h index 6f6bac1fa..357930de0 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -49,9 +49,9 @@ void ST_doPaletteStuff(void); // title card void ST_startTitleCard(void); +void ST_stopTitleCard(void); void ST_runTitleCard(void); void ST_drawTitleCard(void); -void ST_preDrawTitleCard(void); void ST_preLevelTitleCardDrawer(void); void ST_drawWipeTitleCard(void); From 7061c307445a3a5bf11ddd97ffaebd1c25a8d9aa Mon Sep 17 00:00:00 2001 From: Hanicef Date: Sun, 25 Aug 2024 12:24:03 +0200 Subject: [PATCH 113/139] Pass save_t to NetVar save/load function --- src/command.c | 68 +++++++++++++++++++++-------------------- src/command.h | 9 +++--- src/g_demo.c | 25 +++++++++++++-- src/netcode/gamestate.c | 1 + src/p_saveg.c | 8 ++--- 5 files changed, 65 insertions(+), 46 deletions(-) diff --git a/src/command.c b/src/command.c index e0156274e..25eb83d19 100644 --- a/src/command.c +++ b/src/command.c @@ -1722,8 +1722,7 @@ badinput: static boolean serverloading = false; -static consvar_t * -ReadNetVar (UINT8 **p, char **return_value, boolean *return_stealth) +static consvar_t *ReadNetVar(save_t *p, char **return_value, boolean *return_stealth) { UINT16 netid; char *val; @@ -1731,10 +1730,10 @@ ReadNetVar (UINT8 **p, char **return_value, boolean *return_stealth) consvar_t *cvar; - netid = READUINT16 (*p); - val = (char *)*p; - SKIPSTRING (*p); - stealth = READUINT8 (*p); + netid = P_ReadUINT16(p); + val = (char *)&p->buf[p->pos]; + P_SkipString(p); + stealth = P_ReadUINT8(p); cvar = CV_FindNetVar(netid); @@ -1752,8 +1751,7 @@ ReadNetVar (UINT8 **p, char **return_value, boolean *return_stealth) } #ifdef OLD22DEMOCOMPAT -static consvar_t * -ReadOldDemoVar (UINT8 **p, char **return_value, boolean *return_stealth) +static consvar_t *ReadOldDemoVar(save_t *p, char **return_value, boolean *return_stealth) { UINT16 id; char *val; @@ -1761,10 +1759,10 @@ ReadOldDemoVar (UINT8 **p, char **return_value, boolean *return_stealth) old_demo_var_t *demovar; - id = READUINT16 (*p); - val = (char *)*p; - SKIPSTRING (*p); - stealth = READUINT8 (*p); + id = P_ReadUINT16(p); + val = (char *)&p->buf[p->pos]; + P_SkipString(p); + stealth = P_ReadUINT8(p); demovar = CV_FindOldDemoVar(id); @@ -1783,8 +1781,7 @@ ReadOldDemoVar (UINT8 **p, char **return_value, boolean *return_stealth) } #endif/*OLD22DEMOCOMPAT*/ -static consvar_t * -ReadDemoVar (UINT8 **p, char **return_value, boolean *return_stealth) +static consvar_t *ReadDemoVar(save_t *p, char **return_value, boolean *return_stealth) { char *name; char *val; @@ -1792,11 +1789,11 @@ ReadDemoVar (UINT8 **p, char **return_value, boolean *return_stealth) consvar_t *cvar; - name = (char *)*p; - SKIPSTRING (*p); - val = (char *)*p; - SKIPSTRING (*p); - stealth = READUINT8 (*p); + name = (char *)&p->buf[p->pos]; + P_SkipString(p); + val = (char *)&p->buf[p->pos]; + P_SkipString(p); + stealth = P_ReadUINT8(p); cvar = CV_FindVar(name); @@ -1826,41 +1823,46 @@ static void Got_NetVar(UINT8 **p, INT32 playernum) return; } - cvar = ReadNetVar(p, &svalue, &stealth); + save_t save_p; + save_p.buf = *p; + save_p.size = MAXTEXTCMD; + save_p.pos = 0; + cvar = ReadNetVar(&save_p, &svalue, &stealth); + *p = &save_p.buf[save_p.pos]; if (cvar) Setvalue(cvar, svalue, stealth); } -void CV_SaveVars(UINT8 **p, boolean in_demo) +void CV_SaveVars(save_t *p, boolean in_demo) { consvar_t *cvar; - UINT8 *count_p = *p; + UINT8 *count_p = &p->buf[p->pos]; UINT16 count = 0; // send only changed cvars ... // the client will reset all netvars to default before loading - WRITEUINT16(*p, 0x0000); + P_WriteUINT16(p, 0x0000); for (cvar = consvar_vars; cvar; cvar = cvar->next) if ((cvar->flags & CV_NETVAR) && !CV_IsSetToDefault(cvar)) { if (in_demo) { - WRITESTRING(*p, cvar->name); + P_WriteString(p, cvar->name); } else { - WRITEUINT16(*p, cvar->netid); + P_WriteUINT16(p, cvar->netid); } - WRITESTRING(*p, cvar->string); - WRITEUINT8(*p, false); + P_WriteString(p, cvar->string); + P_WriteUINT8(p, false); ++count; } WRITEUINT16(count_p, count); } -static void CV_LoadVars(UINT8 **p, - consvar_t *(*got)(UINT8 **p, char **ret_value, boolean *ret_stealth)) +static void CV_LoadVars(save_t *p, + consvar_t *(*got)(save_t *p, char **ret_value, boolean *ret_stealth)) { const boolean store = (client || demoplayback); @@ -1888,7 +1890,7 @@ static void CV_LoadVars(UINT8 **p, } } - count = READUINT16(*p); + count = P_ReadUINT16(p); while (count--) { cvar = (*got)(p, &val, &stealth); @@ -1921,19 +1923,19 @@ void CV_RevertNetVars(void) } } -void CV_LoadNetVars(UINT8 **p) +void CV_LoadNetVars(save_t *p) { CV_LoadVars(p, ReadNetVar); } #ifdef OLD22DEMOCOMPAT -void CV_LoadOldDemoVars(UINT8 **p) +void CV_LoadOldDemoVars(save_t *p) { CV_LoadVars(p, ReadOldDemoVar); } #endif -void CV_LoadDemoVars(UINT8 **p) +void CV_LoadDemoVars(save_t *p) { CV_LoadVars(p, ReadDemoVar); } diff --git a/src/command.h b/src/command.h index f0dc62418..368c2fb3f 100644 --- a/src/command.h +++ b/src/command.h @@ -15,6 +15,7 @@ #include #include "doomdef.h" +#include "p_saveg.h" //=================================== // Command buffer & command execution @@ -218,19 +219,19 @@ void CV_AddValue(consvar_t *var, INT32 increment); void CV_SaveVariables(FILE *f); // load/save gamesate (load and save option and for network join in game) -void CV_SaveVars(UINT8 **p, boolean in_demo); +void CV_SaveVars(save_t *p, boolean in_demo); #define CV_SaveNetVars(p) CV_SaveVars(p, false) -void CV_LoadNetVars(UINT8 **p); +void CV_LoadNetVars(save_t *p); // then revert after leaving a netgame void CV_RevertNetVars(void); #define CV_SaveDemoVars(p) CV_SaveVars(p, true) -void CV_LoadDemoVars(UINT8 **p); +void CV_LoadDemoVars(save_t *p); #ifdef OLD22DEMOCOMPAT -void CV_LoadOldDemoVars(UINT8 **p); +void CV_LoadOldDemoVars(save_t *p); #endif // reset cheat netvars after cheats is deactivated diff --git a/src/g_demo.c b/src/g_demo.c index cfa34fc7e..77f8f7b0d 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -1454,6 +1454,7 @@ void G_BeginRecording(void) char *filename; UINT16 totalfiles; UINT8 *m; + save_t savebuffer; if (demo_p) return; @@ -1603,7 +1604,11 @@ void G_BeginRecording(void) } // Save netvar data - CV_SaveDemoVars(&demo_p); + savebuffer.buf = demo_p; + savebuffer.size = demoend - demo_p; + savebuffer.pos = 0; + CV_SaveDemoVars(&savebuffer); + demo_p = &savebuffer.buf[savebuffer.pos]; memset(&oldcmd,0,sizeof(oldcmd)); memset(&oldghost,0,sizeof(oldghost)); @@ -2236,10 +2241,24 @@ void G_DoPlayDemo(char *defdemoname) // net var data #ifdef OLD22DEMOCOMPAT if (demoversion < 0x000d) - CV_LoadOldDemoVars(&demo_p); + { + save_t savebuffer; + savebuffer.buf = demo_p; + savebuffer.size = demoend - demo_p; + savebuffer.pos = 0; + CV_LoadOldDemoVars(&savebuffer); + demo_p = &savebuffer.buf[savebuffer.pos]; + } else #endif - CV_LoadDemoVars(&demo_p); + { + save_t savebuffer; + savebuffer.buf = demo_p; + savebuffer.size = demoend - demo_p; + savebuffer.pos = 0; + CV_LoadDemoVars(&savebuffer); + demo_p = &savebuffer.buf[savebuffer.pos]; + } // Sigh ... it's an empty demo. if (*demo_p == DEMOMARKER) diff --git a/src/netcode/gamestate.c b/src/netcode/gamestate.c index fbc2b4ca7..d38555245 100644 --- a/src/netcode/gamestate.c +++ b/src/netcode/gamestate.c @@ -80,6 +80,7 @@ void SV_SendSaveGame(INT32 node, boolean resending) if (!compressedsave) { CONS_Alert(CONS_ERROR, M_GetText("No more free memory for savegame\n")); + free(savebuffer.buf); return; } diff --git a/src/p_saveg.c b/src/p_saveg.c index 38af26fd6..95e729c66 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -5356,9 +5356,7 @@ void P_SaveNetGame(save_t *save_p, boolean resending) mobj_t *mobj; INT32 i = 1; // don't start from 0, it'd be confused with a blank pointer otherwise - UINT8 *p = &save_p->buf[save_p->pos]; - CV_SaveNetVars(&p); - save_p->pos = p - save_p->buf; + CV_SaveNetVars(save_p); P_NetArchiveMisc(save_p, resending); P_NetArchiveEmblems(save_p); @@ -5411,9 +5409,7 @@ boolean P_LoadGame(save_t *save_p, INT16 mapoverride) boolean P_LoadNetGame(save_t *save_p, boolean reloading) { - UINT8 *p = &save_p->buf[save_p->pos]; - CV_LoadNetVars(&p); - save_p->pos = p - save_p->buf; + CV_LoadNetVars(save_p); if (!P_NetUnArchiveMisc(save_p, reloading)) return false; P_NetUnArchiveEmblems(save_p); From 5c4b9bf8c75a813f7098fb35fc80dd776e708bd0 Mon Sep 17 00:00:00 2001 From: spherallic Date: Sun, 25 Aug 2024 21:59:52 +0200 Subject: [PATCH 114/139] Fix build error --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index c5ff5aa72..acd8a6f63 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8796,7 +8796,7 @@ void P_MovePlayer(player_t *player) if ((cmd->buttons & BT_SHIELD) && !(player->pflags & PF_SHIELDDOWN) && !spinshieldhack) { // Transform into super if we can! - if (P_SuperReady(player, true)) + if (P_SuperReady(player)) P_DoSuperTransformation(player, false); } } From b22a258e3aadb86b132bd115df2bc018380afb4f Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 29 Aug 2024 15:40:53 +0200 Subject: [PATCH 115/139] Use FF_SEMIBRIGHT for some more common objects --- src/info.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/info.c b/src/info.c index d66c24af8..b463c1790 100644 --- a/src/info.c +++ b/src/info.c @@ -1784,8 +1784,8 @@ state_t states[NUMSTATES] = {SPR_RING, FF_ANIMATE|FF_GLOBALANIM, -1, {NULL}, 23, 1, S_RING, 0}, // S_RING // Blue Sphere for special stages - {SPR_SPHR, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL, 0}, // S_BLUESPHERE - {SPR_SPHR, FF_FULLBRIGHT + {SPR_SPHR, FF_SEMIBRIGHT, -1, {NULL}, 0, 0, S_NULL, 0}, // S_BLUESPHERE + {SPR_SPHR, FF_SEMIBRIGHT #ifdef MANIASPHERES |FF_ANIMATE|FF_RANDOMANIM #endif @@ -1794,13 +1794,13 @@ state_t states[NUMSTATES] = // Bomb Sphere {SPR_SPHR, FF_FULLBRIGHT|3, 2, {NULL}, 0, 0, S_BOMBSPHERE2, 0}, // S_BOMBSPHERE1 - {SPR_SPHR, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_BOMBSPHERE3, 0}, // S_BOMBSPHERE2 - {SPR_SPHR, FF_FULLBRIGHT|5, 2, {NULL}, 0, 0, S_BOMBSPHERE4, 0}, // S_BOMBSPHERE3 - {SPR_SPHR, FF_FULLBRIGHT|4, 1, {NULL}, 0, 0, S_BOMBSPHERE1, 0}, // S_BOMBSPHERE4 + {SPR_SPHR, FF_SEMIBRIGHT|4, 1, {NULL}, 0, 0, S_BOMBSPHERE3, 0}, // S_BOMBSPHERE2 + {SPR_SPHR, FF_SEMIBRIGHT|5, 2, {NULL}, 0, 0, S_BOMBSPHERE4, 0}, // S_BOMBSPHERE3 + {SPR_SPHR, FF_SEMIBRIGHT|4, 1, {NULL}, 0, 0, S_BOMBSPHERE1, 0}, // S_BOMBSPHERE4 // NiGHTS Chip - {SPR_NCHP, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 15, 2, S_NULL, 0}, // S_NIGHTSCHIP - {SPR_NCHP, FF_FULLBRIGHT|FF_ANIMATE|16, -1, {NULL}, 15, 2, S_NULL, 0}, // S_NIGHTSCHIPBONUS + {SPR_NCHP, FF_SEMIBRIGHT|FF_ANIMATE, -1, {NULL}, 15, 2, S_NULL, 0}, // S_NIGHTSCHIP + {SPR_NCHP, FF_SEMIBRIGHT|FF_ANIMATE|16, -1, {NULL}, 15, 2, S_NULL, 0}, // S_NIGHTSCHIPBONUS // NiGHTS Star {SPR_NSTR, FF_ANIMATE, -1, {NULL}, 14, 2, S_NULL, 0}, // S_NIGHTSSTAR @@ -1858,9 +1858,9 @@ state_t states[NUMSTATES] = {SPR_CEMG, FF_FULLBRIGHT|6, -1, {NULL}, 0, 0, S_NULL, 0}, // S_CEMG7 // Emerald hunt shards - {SPR_SHRD, 0, -1, {NULL}, 0, 0, S_NULL, 0}, // S_SHRD1 - {SPR_SHRD, 1, -1, {NULL}, 0, 0, S_NULL, 0}, // S_SHRD2 - {SPR_SHRD, 2, -1, {NULL}, 0, 0, S_NULL, 0}, // S_SHRD3 + {SPR_SHRD, FF_SEMIBRIGHT, -1, {NULL}, 0, 0, S_NULL, 0}, // S_SHRD1 + {SPR_SHRD, FF_SEMIBRIGHT|1, -1, {NULL}, 0, 0, S_NULL, 0}, // S_SHRD2 + {SPR_SHRD, FF_SEMIBRIGHT|2, -1, {NULL}, 0, 0, S_NULL, 0}, // S_SHRD3 // Bubble Source {SPR_BBLS, 0, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES2, 0}, // S_BUBBLES1 From 9b5b2d31f0c94d6a731437c6d6a8dba3953f06d8 Mon Sep 17 00:00:00 2001 From: spherallic Date: Tue, 3 Sep 2024 23:57:16 +0200 Subject: [PATCH 116/139] Disable UDMF console notice --- src/p_setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index b5ed485d8..9a3c96790 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2995,7 +2995,7 @@ static void P_LoadTextmap(void) side_t *sd; mapthing_t *mt; - CONS_Alert(CONS_NOTICE, "UDMF support is still a work-in-progress; its specs and features are prone to change until it is fully implemented.\n"); + //CONS_Alert(CONS_NOTICE, "UDMF support is still a work-in-progress; its specs and features are prone to change until it is fully implemented.\n"); /// Given the UDMF specs, some fields are given a default value. /// If an element's field has a default value set, it is omitted From f54eab54f33fe1afb582f6cbc38eddd318f2a1f4 Mon Sep 17 00:00:00 2001 From: LJ Sonic Date: Thu, 5 Sep 2024 20:24:37 +0200 Subject: [PATCH 117/139] Fix mirrored long sprite rotations not working in Software --- src/r_things.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_things.c b/src/r_things.c index b32181670..36c35fde8 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -379,7 +379,7 @@ static void MirrorMissingRotations(void) UINT8 baserotation = GetOppositeRotation(rotation, frame->rotate); UINT32 lumpnum = frame->lumppat[baserotation - 1]; - R_InstallSpriteLump(WADFILENUM(lumpnum), LUMPNUM(lumpnum), frame->lumpid[baserotation], framenum, rotation, 1); + R_InstallSpriteLump(WADFILENUM(lumpnum), LUMPNUM(lumpnum), frame->lumpid[baserotation - 1], framenum, rotation, 1); } } } From 53db028bdb9041b9753dcabe9ecc9e97d2f4f5d9 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Fri, 6 Sep 2024 12:21:34 +0200 Subject: [PATCH 118/139] Synchronize rate limit variables and limit PlayerMsg hook --- src/hu_stuff.c | 10 ++++------ src/hu_stuff.h | 3 +++ src/p_saveg.c | 13 +++++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index caf13a445..a7d0aea74 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -587,8 +587,8 @@ static void Command_CSay_f(void) DoSayCommand(0, 1, HU_CSAY); } -static tic_t spam_tokens[MAXPLAYERS] = { 1 }; // fill the buffer with 1 so the motd can be sent. -static tic_t spam_tics[MAXPLAYERS]; +UINT8 spam_tokens[MAXPLAYERS] = { 1 }; // fill the buffer with 1 so the motd can be sent. +tic_t spam_tics[MAXPLAYERS]; /** Receives a message, processing an ::XD_SAY command. * \sa DoSayCommand @@ -649,14 +649,12 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum) else spam_tokens[playernum] -= 1; - // run the lua hook even if we were supposed to eat the msg, netgame consistency goes first. + if (spam_eatmsg) + return; // don't proceed if we were supposed to eat the message. if (LUA_HookPlayerMsg(playernum, target, flags, msg)) return; - if (spam_eatmsg) - return; // don't proceed if we were supposed to eat the message. - // If it's a CSAY, just CECHO and be done with it. if (flags & HU_CSAY) { diff --git a/src/hu_stuff.h b/src/hu_stuff.h index ca77ed930..07881ce1a 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -79,6 +79,9 @@ void HU_AddChatText(const char *text, boolean playsound); // set true when entering a chat message extern boolean chat_on; +extern UINT8 spam_tokens[MAXPLAYERS]; +extern tic_t spam_tics[MAXPLAYERS]; + extern patch_t *emeraldpics[3][8]; extern patch_t *rflagico; extern patch_t *bflagico; diff --git a/src/p_saveg.c b/src/p_saveg.c index da73dd8a0..c5ec57d01 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -35,6 +35,7 @@ #include "p_polyobj.h" #include "lua_script.h" #include "p_slopes.h" +#include "hu_stuff.h" savedata_t savedata; UINT8 *save_p; @@ -4611,6 +4612,12 @@ static void P_NetArchiveMisc(boolean resending) WRITEUINT8(save_p, 0x2f); else WRITEUINT8(save_p, 0x2e); + + for (i = 0; i < MAXPLAYERS; i++) + { + WRITEUINT8(save_p, spam_tokens[i]); + WRITEUINT32(save_p, spam_tics[i]); + } } static inline boolean P_NetUnArchiveMisc(boolean reloading) @@ -4708,6 +4715,12 @@ static inline boolean P_NetUnArchiveMisc(boolean reloading) if (READUINT8(save_p) == 0x2f) paused = true; + for (i = 0; i < MAXPLAYERS; i++) + { + spam_tokens[i] = READUINT8(save_p); + spam_tics[i] = READUINT32(save_p); + } + return true; } From cfb3b45ae4d8031a8c4a03cb7ebdd1fd476ad134 Mon Sep 17 00:00:00 2001 From: LJ Sonic Date: Fri, 6 Sep 2024 15:50:09 +0200 Subject: [PATCH 119/139] Refactor dedicated idling a little --- src/netcode/d_clisrv.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/netcode/d_clisrv.c b/src/netcode/d_clisrv.c index 5fee506af..dd4a25be2 100644 --- a/src/netcode/d_clisrv.c +++ b/src/netcode/d_clisrv.c @@ -1500,18 +1500,15 @@ void NetUpdate(void) { INT32 i; - for (i = 1; i < MAXNETNODES; ++i) + boolean empty = true; + for (i = 1; i < MAXNETNODES; i++) if (netnodes[i].ingame) { - if (dedicatedidle >= dedicatedidletime) - { - CONS_Printf("DEDICATED: Awakening from idle (Node %d detected...)\n", i); - dedicatedidle = 0; - } + empty = false; break; } - if (i == MAXNETNODES) + if (empty) { if (leveltime == 2) { @@ -1541,6 +1538,14 @@ void NetUpdate(void) dedicatedidle = dedicatedidletime; } } + else + { + if (dedicatedidle >= dedicatedidletime) + { + CONS_Printf("DEDICATED: Awakening from idle (Node detected...)\n"); + dedicatedidle = 0; + } + } } else { From ba8b1e084879cfd57894a4c1dd6b8f6ce5b55d3f Mon Sep 17 00:00:00 2001 From: LJ Sonic Date: Fri, 6 Sep 2024 15:51:57 +0200 Subject: [PATCH 120/139] Fix dedicated idling ignoring disconnected players --- src/netcode/d_clisrv.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/netcode/d_clisrv.c b/src/netcode/d_clisrv.c index dd4a25be2..d9b26e851 100644 --- a/src/netcode/d_clisrv.c +++ b/src/netcode/d_clisrv.c @@ -1501,8 +1501,8 @@ void NetUpdate(void) INT32 i; boolean empty = true; - for (i = 1; i < MAXNETNODES; i++) - if (netnodes[i].ingame) + for (i = 0; i < MAXPLAYERS; i++) + if (playeringame[i]) { empty = false; break; @@ -1542,7 +1542,7 @@ void NetUpdate(void) { if (dedicatedidle >= dedicatedidletime) { - CONS_Printf("DEDICATED: Awakening from idle (Node detected...)\n"); + CONS_Printf("DEDICATED: Awakening from idle (Player detected...)\n"); dedicatedidle = 0; } } From c69df42f6c3c35ede3b644b18506469c1eb00929 Mon Sep 17 00:00:00 2001 From: LJ Sonic Date: Fri, 6 Sep 2024 15:53:53 +0200 Subject: [PATCH 121/139] Fix dedicated idle timer not resetting when toggled --- src/netcode/d_clisrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/netcode/d_clisrv.c b/src/netcode/d_clisrv.c index d9b26e851..16405b982 100644 --- a/src/netcode/d_clisrv.c +++ b/src/netcode/d_clisrv.c @@ -1543,8 +1543,8 @@ void NetUpdate(void) if (dedicatedidle >= dedicatedidletime) { CONS_Printf("DEDICATED: Awakening from idle (Player detected...)\n"); - dedicatedidle = 0; } + dedicatedidle = 0; } } else From c09ec5933dbb79c8df5756aeaca332d944988507 Mon Sep 17 00:00:00 2001 From: LJ Sonic Date: Fri, 6 Sep 2024 16:09:30 +0200 Subject: [PATCH 122/139] Cleanup --- src/netcode/d_clisrv.c | 146 ++++++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 68 deletions(-) diff --git a/src/netcode/d_clisrv.c b/src/netcode/d_clisrv.c index 16405b982..99d1b4728 100644 --- a/src/netcode/d_clisrv.c +++ b/src/netcode/d_clisrv.c @@ -1414,6 +1414,83 @@ static void IdleUpdate(void) } } +static void DedicatedIdleUpdate(INT32 *realtics) +{ + const tic_t dedicatedidletime = cv_dedicatedidletime.value * TICRATE; + static tic_t dedicatedidletimeprev = 0; + static tic_t dedicatedidle = 0; + + if (!server || !dedicated || gamestate != GS_LEVEL) + return; + + if (dedicatedidletime > 0) + { + INT32 i; + + boolean empty = true; + for (i = 0; i < MAXPLAYERS; i++) + if (playeringame[i]) + { + empty = false; + break; + } + + if (empty) + { + if (leveltime == 2) + { + // On next tick... + dedicatedidle = dedicatedidletime - 1; + } + else if (dedicatedidle >= dedicatedidletime) + { + if (D_GetExistingTextcmd(gametic, 0) || D_GetExistingTextcmd(gametic + 1, 0)) + { + CONS_Printf("DEDICATED: Awakening from idle (Netxcmd detected...)\n"); + dedicatedidle = 0; + } + else + { + (*realtics) = 0; + } + } + else + { + dedicatedidle += (*realtics); + + if (dedicatedidle >= dedicatedidletime) + { + const char *idlereason = "at round start"; + if (leveltime > 3) + idlereason = va("for %d seconds", dedicatedidle/TICRATE); + + CONS_Printf("DEDICATED: No nodes %s, idling...\n", idlereason); + (*realtics) = 0; + dedicatedidle = dedicatedidletime; + } + } + } + else + { + if (dedicatedidle >= dedicatedidletime) + { + CONS_Printf("DEDICATED: Awakening from idle (Player detected...)\n"); + } + dedicatedidle = 0; + } + } + else + { + if (dedicatedidletimeprev > 0 && dedicatedidle >= dedicatedidletimeprev) + { + CONS_Printf("DEDICATED: Awakening from idle (Idle disabled...)\n"); + } + dedicatedidle = 0; + } + + dedicatedidletimeprev = dedicatedidletime; +} + // Handle timeouts to prevent definitive freezes from happenning static void HandleNodeTimeouts(void) { @@ -1490,74 +1567,7 @@ void NetUpdate(void) realtics = 5; } - if (server && dedicated && gamestate == GS_LEVEL) - { - const tic_t dedicatedidletime = cv_dedicatedidletime.value * TICRATE; - static tic_t dedicatedidletimeprev = 0; - static tic_t dedicatedidle = 0; - - if (dedicatedidletime > 0) - { - INT32 i; - - boolean empty = true; - for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i]) - { - empty = false; - break; - } - - if (empty) - { - if (leveltime == 2) - { - // On next tick... - dedicatedidle = dedicatedidletime-1; - } - else if (dedicatedidle >= dedicatedidletime) - { - if (D_GetExistingTextcmd(gametic, 0) || D_GetExistingTextcmd(gametic+1, 0)) - { - CONS_Printf("DEDICATED: Awakening from idle (Netxcmd detected...)\n"); - dedicatedidle = 0; - } - else - { - realtics = 0; - } - } - else if ((dedicatedidle += realtics) >= dedicatedidletime) - { - const char *idlereason = "at round start"; - if (leveltime > 3) - idlereason = va("for %d seconds", dedicatedidle/TICRATE); - - CONS_Printf("DEDICATED: No nodes %s, idling...\n", idlereason); - realtics = 0; - dedicatedidle = dedicatedidletime; - } - } - else - { - if (dedicatedidle >= dedicatedidletime) - { - CONS_Printf("DEDICATED: Awakening from idle (Player detected...)\n"); - } - dedicatedidle = 0; - } - } - else - { - if (dedicatedidletimeprev > 0 && dedicatedidle >= dedicatedidletimeprev) - { - CONS_Printf("DEDICATED: Awakening from idle (Idle disabled...)\n"); - } - dedicatedidle = 0; - } - - dedicatedidletimeprev = dedicatedidletime; - } + DedicatedIdleUpdate(&realtics); gametime = nowtime; From 46309370f07aebf59c93c4f88d16d76cdcc803de Mon Sep 17 00:00:00 2001 From: LJ Sonic Date: Fri, 6 Sep 2024 16:17:15 +0200 Subject: [PATCH 123/139] Say "players" instead of "nodes" --- src/netcode/d_clisrv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/netcode/d_clisrv.c b/src/netcode/d_clisrv.c index 99d1b4728..d34dbc4e0 100644 --- a/src/netcode/d_clisrv.c +++ b/src/netcode/d_clisrv.c @@ -1462,9 +1462,9 @@ static void DedicatedIdleUpdate(INT32 *realtics) { const char *idlereason = "at round start"; if (leveltime > 3) - idlereason = va("for %d seconds", dedicatedidle/TICRATE); + idlereason = va("for %d seconds", dedicatedidle / TICRATE); - CONS_Printf("DEDICATED: No nodes %s, idling...\n", idlereason); + CONS_Printf("DEDICATED: No players %s, idling...\n", idlereason); (*realtics) = 0; dedicatedidle = dedicatedidletime; } From 70383c24aaa80e7ba16005c75f61350742f9f661 Mon Sep 17 00:00:00 2001 From: spherallic Date: Thu, 12 Sep 2024 19:18:40 +0200 Subject: [PATCH 124/139] Fix -opengl parameter crash --- src/hardware/hw_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 599c39132..c14509c8a 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -5521,7 +5521,7 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player) // Can't have palette rendering if shaders are disabled. boolean HWR_ShouldUsePaletteRendering(void) { - return (cv_glpaletterendering.value && HWR_UseShader()); + return (pMasterPalette != NULL && cv_glpaletterendering.value && HWR_UseShader()); } // enable or disable palette rendering state depending on settings and availability From 8d49d5612a7d9e8ed46c6272b210f008c7b95994 Mon Sep 17 00:00:00 2001 From: pastel Date: Thu, 12 Sep 2024 18:03:32 +0000 Subject: [PATCH 125/139] update my username --- src/f_finale.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/f_finale.c b/src/f_finale.c index 810af4e82..c6c2f1fd1 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1065,12 +1065,12 @@ static const char *credits[] = { "Julio \"Chaos Zero 64\" Guir", "\"Hanicef\"", "\"Hannu_Hanhi\"", // For many OpenGL performance improvements! + "\"hazepastel\"", "Kepa \"Nev3r\" Iceta", "Thomas \"Shadow Hog\" Igoe", "Iestyn \"Monster Iestyn\" Jealous", "\"Kaito Sinclaire\"", "\"Kalaron\"", // Coded some of Sryder13's collection of OpenGL fixes, especially fog - "\"katsy\"", "Ronald \"Furyhunter\" Kinard", // The SDL2 port "\"Lat'\"", // SRB2-CHAT, the chat window from Kart "\"LZA\"", From 947fa0ca5c153af9ee8932be76a0938166591be5 Mon Sep 17 00:00:00 2001 From: LJ Sonic Date: Fri, 13 Sep 2024 18:40:17 +0200 Subject: [PATCH 126/139] Deprecate performance-sensitive type-agnostic mobj hooks --- src/lua_hooklib.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 54381e4ae..14781986e 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -498,6 +498,22 @@ static int call_string_hooks(Hook_State *hook) static int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type) { + if (mobj_type == MT_NULL && ( + hook->hook_type == MOBJ_HOOK(MobjThinker ) + || hook->hook_type == MOBJ_HOOK(MobjCollide ) + || hook->hook_type == MOBJ_HOOK(MobjLineCollide) + || hook->hook_type == MOBJ_HOOK(MobjMoveCollide) + || hook->hook_type == MOBJ_HOOK(MobjFuse ) + || hook->hook_type == MOBJ_HOOK(MobjThinker ) + || hook->hook_type == MOBJ_HOOK(BossThinker ) + || hook->hook_type == MOBJ_HOOK(MobjMoveBlocked) + || hook->hook_type == MOBJ_HOOK(FollowMobj ) + )) + LUA_UsageWarning(L, va( + "%s hooks not attached to a specific mobj type are deprecated and will be removed.", + mobjHookNames[hook->hook_type]) + ); + return call_mapped(hook, &mobjHookIds[mobj_type][hook->hook_type]); } @@ -751,7 +767,7 @@ static void hook_think_frame(int type) PS_SetThinkFrameHookInfo(hook_index, time_taken, ar.short_src); else if (type == 6) PS_SetPostThinkFrameHookInfo(hook_index, time_taken, ar.short_src); - + hook_index++; } } From 60852cab0e2a6bec29a2aa8e430bdc4d336dfd58 Mon Sep 17 00:00:00 2001 From: Hanicef Date: Tue, 17 Sep 2024 21:15:54 +0200 Subject: [PATCH 127/139] Fix command prompt issues on dedicated build on Windows --- src/dedicated/i_system.c | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/src/dedicated/i_system.c b/src/dedicated/i_system.c index 1a1db8fb3..e5e6aa2cd 100644 --- a/src/dedicated/i_system.c +++ b/src/dedicated/i_system.c @@ -999,20 +999,8 @@ static void I_GetConsoleEvents(void) static void I_StartupConsole(void) { HANDLE ci, co; - const INT32 ded = M_CheckParm("-dedicated"); - BOOL gotConsole = FALSE; - if (M_CheckParm("-console") || ded) - gotConsole = AllocConsole(); -#ifdef _DEBUG - else if (M_CheckParm("-noconsole") && !ded) -#else - else if (!M_CheckParm("-console") && !ded) -#endif - { - FreeConsole(); - gotConsole = FALSE; - } - + BOOL gotConsole = AllocConsole(); + consolevent = !M_CheckParm("-noconsole"); if (gotConsole) { SetConsoleTitleA("SRB2 Console"); @@ -1040,12 +1028,7 @@ static inline void I_ShutdownConsole(void){} static void I_GetConsoleEvents(void){} static inline void I_StartupConsole(void) { -#ifdef _DEBUG consolevent = !M_CheckParm("-noconsole"); -#else - consolevent = M_CheckParm("-console"); -#endif - framebuffer = M_CheckParm("-framebuffer"); if (framebuffer) From 77ab7e166eeacce7d60c5a3132e5be30fb7762a2 Mon Sep 17 00:00:00 2001 From: LJ Sonic Date: Thu, 19 Sep 2024 20:48:47 +0200 Subject: [PATCH 128/139] Fix L/R frames not being automatically mirrored --- src/r_things.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/r_things.c b/src/r_things.c index 36c35fde8..917e4e8b4 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -367,7 +367,7 @@ static void MirrorMissingRotations(void) { spriteframe_t *frame = &sprtemp[framenum]; - if (frame->rotate == SRF_NONE || !(frame->rotate & SRF_3DMASK)) + if (frame->rotate == SRF_NONE || !(frame->rotate & (SRF_3DMASK | SRF_2D))) continue; UINT8 numrotations = frame->rotate == SRF_3D ? 8 : 16; @@ -2198,7 +2198,7 @@ static void R_ProjectSprite(mobj_t *thing) } else trans = 0; - + if ((oldthing->flags2 & MF2_LINKDRAW) && oldthing->tracer) trans = R_GetThingTransTable(oldthing->tracer->alpha, trans); else From 1076e0328b6e156d6f99e80be2289a568e1cf327 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Sat, 21 Sep 2024 20:12:56 -0300 Subject: [PATCH 129/139] Updated copyrights to 2024 --- assets/README.txt | 2 +- assets/debian-template/copyright | 4 ++-- debian-template/copyright | 4 ++-- src/d_main.c | 2 +- src/win32/Srb2win.rc | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/assets/README.txt b/assets/README.txt index e384333ed..2c522966e 100644 --- a/assets/README.txt +++ b/assets/README.txt @@ -39,7 +39,7 @@ https://facebook.com/SonicRoboBlast2 COPYRIGHT AND DISCLAIMER -Design and content in Sonic Robo Blast 2 is copyright 1998-2023 by Sonic Team Jr. +Design and content in Sonic Robo Blast 2 is copyright 1998-2024 by Sonic Team Jr. All original material in this game is copyrighted by their respective owners, and no copyright infringement is intended. Sonic Team Jr. is in no way affiliated with SEGA or Sonic Team, and we do not claim ownership of any of SEGA's intellectual property used in SRB2. diff --git a/assets/debian-template/copyright b/assets/debian-template/copyright index cc47c453b..649e796fb 100644 --- a/assets/debian-template/copyright +++ b/assets/debian-template/copyright @@ -12,7 +12,7 @@ Upstream Author(s): Copyright: - Copyright (C) 1998-2018 by Sonic Team Junior + Copyright (C) 1998-2024 by Sonic Team Junior License: @@ -21,7 +21,7 @@ License: The Debian packaging is: Copyright (C) 2010 Callum Dickinson - Copyright (C) 2010-2018 by Sonic Team Junior + Copyright (C) 2010-2024 by Sonic Team Junior and is licensed under the GPL version 2, see "/usr/share/common-licenses/GPL-2". diff --git a/debian-template/copyright b/debian-template/copyright index cc47c453b..649e796fb 100644 --- a/debian-template/copyright +++ b/debian-template/copyright @@ -12,7 +12,7 @@ Upstream Author(s): Copyright: - Copyright (C) 1998-2018 by Sonic Team Junior + Copyright (C) 1998-2024 by Sonic Team Junior License: @@ -21,7 +21,7 @@ License: The Debian packaging is: Copyright (C) 2010 Callum Dickinson - Copyright (C) 2010-2018 by Sonic Team Junior + Copyright (C) 2010-2024 by Sonic Team Junior and is licensed under the GPL version 2, see "/usr/share/common-licenses/GPL-2". diff --git a/src/d_main.c b/src/d_main.c index bf6c62ef2..65100318b 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1250,7 +1250,7 @@ void D_SRB2Main(void) // Print GPL notice for our console users (Linux) CONS_Printf( "\n\nSonic Robo Blast 2\n" - "Copyright (C) 1998-2023 by Sonic Team Junior\n\n" + "Copyright (C) 1998-2024 by Sonic Team Junior\n\n" "This program comes with ABSOLUTELY NO WARRANTY.\n\n" "This is free software, and you are welcome to redistribute it\n" "and/or modify it under the terms of the GNU General Public License\n" diff --git a/src/win32/Srb2win.rc b/src/win32/Srb2win.rc index 46114f871..bbe61cb17 100644 --- a/src/win32/Srb2win.rc +++ b/src/win32/Srb2win.rc @@ -98,7 +98,7 @@ BEGIN VALUE "FileDescription", "Sonic Robo Blast 2\0" VALUE "FileVersion", VERSIONSTRING_RC VALUE "InternalName", "srb2\0" - VALUE "LegalCopyright", "Copyright 1998-2023 by Sonic Team Junior\0" + VALUE "LegalCopyright", "Copyright 1998-2024 by Sonic Team Junior\0" VALUE "LegalTrademarks", "Sonic the Hedgehog and related characters are trademarks of Sega.\0" VALUE "OriginalFilename", "srb2win.exe\0" VALUE "PrivateBuild", "\0" From e7b4beba20c49e0943be587e5792b6398d5642d1 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Sat, 21 Sep 2024 21:35:01 -0300 Subject: [PATCH 130/139] Update dates in copyright notices of all files modified in 2024 --- src/b_bot.c | 2 +- src/byteptr.h | 2 +- src/command.c | 2 +- src/command.h | 2 +- src/console.c | 2 +- src/console.h | 2 +- src/d_main.c | 2 +- src/d_player.h | 2 +- src/dedicated/i_system.c | 2 +- src/deh_lua.c | 2 +- src/deh_soc.c | 2 +- src/deh_tables.c | 2 +- src/deh_tables.h | 2 +- src/doomdef.h | 2 +- src/doomstat.h | 2 +- src/doomtype.h | 2 +- src/f_finale.c | 2 +- src/f_finale.h | 2 +- src/g_demo.c | 2 +- src/g_demo.h | 2 +- src/g_game.c | 2 +- src/g_game.h | 2 +- src/g_input.c | 2 +- src/hardware/hw_batching.c | 2 +- src/hardware/hw_batching.h | 2 +- src/hardware/hw_defs.h | 2 +- src/hardware/hw_draw.c | 2 +- src/hardware/hw_drv.h | 2 +- src/hardware/hw_glob.h | 2 +- src/hardware/hw_light.c | 2 +- src/hardware/hw_main.c | 2 +- src/hardware/hw_main.h | 2 +- src/hardware/hw_md2.c | 2 +- src/hardware/hw_shaders.c | 2 +- src/hardware/hw_shaders.h | 2 +- src/hu_stuff.c | 2 +- src/hu_stuff.h | 2 +- src/i_system.h | 2 +- src/i_video.h | 2 +- src/info.c | 2 +- src/info.h | 2 +- src/lua_baselib.c | 2 +- src/lua_colorlib.c | 4 ++-- src/lua_hook.h | 2 +- src/lua_hooklib.c | 2 +- src/lua_hud.h | 2 +- src/lua_hudlib.c | 2 +- src/lua_hudlib_drawlist.c | 2 +- src/lua_infolib.c | 2 +- src/lua_libs.h | 2 +- src/lua_maplib.c | 2 +- src/lua_mobjlib.c | 2 +- src/lua_playerlib.c | 2 +- src/lua_script.c | 2 +- src/lua_script.h | 2 +- src/lua_skinlib.c | 2 +- src/m_anigif.c | 2 +- src/m_cheat.c | 2 +- src/m_cheat.h | 2 +- src/m_cond.c | 2 +- src/m_fixed.c | 2 +- src/m_fixed.h | 2 +- src/m_menu.c | 2 +- src/m_menu.h | 2 +- src/m_misc.c | 2 +- src/m_misc.h | 2 +- src/m_tokenizer.c | 2 +- src/m_tokenizer.h | 2 +- src/netcode/commands.c | 2 +- src/netcode/d_net.c | 2 +- src/netcode/d_netcmd.h | 2 +- src/netcode/gamestate.c | 2 +- src/netcode/i_net.h | 2 +- src/netcode/i_tcp.c | 2 +- src/netcode/mserv.c | 2 +- src/p_enemy.c | 2 +- src/p_inter.c | 2 +- src/p_local.h | 2 +- src/p_map.c | 2 +- src/p_maputl.c | 2 +- src/p_maputl.h | 2 +- src/p_mobj.c | 2 +- src/p_mobj.h | 2 +- src/p_polyobj.c | 2 +- src/p_pspr.h | 2 +- src/p_saveg.c | 2 +- src/p_saveg.h | 2 +- src/p_setup.c | 2 +- src/p_setup.h | 2 +- src/p_slopes.c | 2 +- src/p_slopes.h | 2 +- src/p_spec.c | 2 +- src/p_spec.h | 2 +- src/p_tick.c | 2 +- src/p_user.c | 2 +- src/r_bsp.c | 2 +- src/r_data.c | 2 +- src/r_data.h | 2 +- src/r_defs.h | 2 +- src/r_draw.c | 2 +- src/r_draw.h | 2 +- src/r_draw8.c | 2 +- src/r_draw8_npo2.c | 2 +- src/r_fps.c | 2 +- src/r_fps.h | 2 +- src/r_main.c | 2 +- src/r_main.h | 2 +- src/r_patch.h | 2 +- src/r_picformats.c | 4 ++-- src/r_picformats.h | 4 ++-- src/r_plane.c | 2 +- src/r_segs.c | 2 +- src/r_skins.c | 2 +- src/r_skins.h | 2 +- src/r_sky.c | 2 +- src/r_splats.c | 2 +- src/r_textures.c | 2 +- src/r_textures.h | 2 +- src/r_things.c | 2 +- src/r_things.h | 2 +- src/r_translation.c | 2 +- src/r_translation.h | 2 +- src/s_sound.c | 2 +- src/s_sound.h | 2 +- src/screen.c | 2 +- src/screen.h | 2 +- src/st_stuff.c | 2 +- src/st_stuff.h | 2 +- src/string.c | 2 +- src/tables.c | 2 +- src/tables.h | 2 +- src/v_video.c | 2 +- src/v_video.h | 2 +- src/w_wad.c | 2 +- src/w_wad.h | 2 +- src/y_inter.c | 2 +- 136 files changed, 139 insertions(+), 139 deletions(-) diff --git a/src/b_bot.c b/src/b_bot.c index 6229cb1d6..97dcd1078 100644 --- a/src/b_bot.c +++ b/src/b_bot.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2007-2016 by John "JTE" Muniz. -// Copyright (C) 2011-2023 by Sonic Team Junior. +// Copyright (C) 2011-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/byteptr.h b/src/byteptr.h index 4377fae57..61cefd350 100644 --- a/src/byteptr.h +++ b/src/byteptr.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/command.c b/src/command.c index 25eb83d19..399714bd0 100644 --- a/src/command.c +++ b/src/command.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/command.h b/src/command.h index 368c2fb3f..c1ac7d486 100644 --- a/src/command.h +++ b/src/command.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/console.c b/src/console.c index 0c3eac4f7..50ecfec9c 100644 --- a/src/console.c +++ b/src/console.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/console.h b/src/console.h index 6ad1dba1e..2af01f1a3 100644 --- a/src/console.h +++ b/src/console.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/d_main.c b/src/d_main.c index 65100318b..a6a9385d2 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/d_player.h b/src/d_player.h index 95d2f609d..5f5bf53d6 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/dedicated/i_system.c b/src/dedicated/i_system.c index 1a1db8fb3..7949a8bd7 100644 --- a/src/dedicated/i_system.c +++ b/src/dedicated/i_system.c @@ -3,7 +3,7 @@ // // Copyright (C) 1993-1996 by id Software, Inc. // Portions Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 2014-2023 by Sonic Team Junior. +// Copyright (C) 2014-2024 by Sonic Team Junior. // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License diff --git a/src/deh_lua.c b/src/deh_lua.c index 64fb52fc7..e81a8c08e 100644 --- a/src/deh_lua.c +++ b/src/deh_lua.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/deh_soc.c b/src/deh_soc.c index 3759cc9c7..c0e646f60 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/deh_tables.c b/src/deh_tables.c index 15991a936..91163b206 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/deh_tables.h b/src/deh_tables.h index b6986adff..94af2fa52 100644 --- a/src/deh_tables.h +++ b/src/deh_tables.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/doomdef.h b/src/doomdef.h index 1b0e76314..c92e6dc37 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/doomstat.h b/src/doomstat.h index bde2bacc7..5246349de 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/doomtype.h b/src/doomtype.h index fa8616793..415669ac4 100644 --- a/src/doomtype.h +++ b/src/doomtype.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/f_finale.c b/src/f_finale.c index c6c2f1fd1..37e4ba070 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/f_finale.h b/src/f_finale.h index 4b777eb11..e12a81cc6 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/g_demo.c b/src/g_demo.c index 77f8f7b0d..b0e16adda 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/g_demo.h b/src/g_demo.h index 67f61f54d..d7c682871 100644 --- a/src/g_demo.h +++ b/src/g_demo.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/g_game.c b/src/g_game.c index 8170efdd4..d409bb2cf 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/g_game.h b/src/g_game.h index 0d5fc7e37..2680fa973 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/g_input.c b/src/g_input.c index 4a9692e88..3ba709978 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_batching.c b/src/hardware/hw_batching.c index b9ab2592d..7a57a7a12 100644 --- a/src/hardware/hw_batching.c +++ b/src/hardware/hw_batching.c @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2020-2023 by Sonic Team Junior. +// Copyright (C) 2020-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_batching.h b/src/hardware/hw_batching.h index df1a4c38b..4214ca410 100644 --- a/src/hardware/hw_batching.h +++ b/src/hardware/hw_batching.h @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2020-2023 by Sonic Team Junior. +// Copyright (C) 2020-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 7d06ceb60..77d7133b6 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c index ddce7d988..369f59ac2 100644 --- a/src/hardware/hw_draw.c +++ b/src/hardware/hw_draw.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_drv.h b/src/hardware/hw_drv.h index 45ee2933a..694cc1b8c 100644 --- a/src/hardware/hw_drv.h +++ b/src/hardware/hw_drv.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_glob.h b/src/hardware/hw_glob.h index 5678cd593..62fe8d0bd 100644 --- a/src/hardware/hw_glob.h +++ b/src/hardware/hw_glob.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_light.c b/src/hardware/hw_light.c index e7769edbd..1d2772dc4 100644 --- a/src/hardware/hw_light.c +++ b/src/hardware/hw_light.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index f395a8390..4741c6a46 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h index ea610a48b..2277c32f3 100644 --- a/src/hardware/hw_main.h +++ b/src/hardware/hw_main.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 2616d4085..426c014d2 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_shaders.c b/src/hardware/hw_shaders.c index ee1e2acdf..fde67375f 100644 --- a/src/hardware/hw_shaders.c +++ b/src/hardware/hw_shaders.c @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2021 by Sonic Team Junior. +// Copyright (C) 2021-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hardware/hw_shaders.h b/src/hardware/hw_shaders.h index bb0e6a232..38a2d9911 100644 --- a/src/hardware/hw_shaders.h +++ b/src/hardware/hw_shaders.h @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2021 by Sonic Team Junior. +// Copyright (C) 2021-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hu_stuff.c b/src/hu_stuff.c index a7d0aea74..9333a61d2 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/hu_stuff.h b/src/hu_stuff.h index 07881ce1a..2618d873b 100644 --- a/src/hu_stuff.h +++ b/src/hu_stuff.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/i_system.h b/src/i_system.h index f4d169113..5348caf4d 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/i_video.h b/src/i_video.h index 4b459e25b..f3bbc90b9 100644 --- a/src/i_video.h +++ b/src/i_video.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/info.c b/src/info.c index d66c24af8..a138db8a4 100644 --- a/src/info.c +++ b/src/info.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/info.h b/src/info.h index f58aee07d..ddbfc31b7 100644 --- a/src/info.h +++ b/src/info.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 304c866c9..19775eb8a 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_colorlib.c b/src/lua_colorlib.c index 3fab589b2..a8785f705 100644 --- a/src/lua_colorlib.c +++ b/src/lua_colorlib.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2021-2022 by "Lactozilla". -// Copyright (C) 2014-2023 by Sonic Team Junior. +// Copyright (C) 2021-2024 by "Lactozilla". +// Copyright (C) 2014-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_hook.h b/src/lua_hook.h index 17e0e99a0..90a11d05d 100644 --- a/src/lua_hook.h +++ b/src/lua_hook.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 14781986e..51ebe3938 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_hud.h b/src/lua_hud.h index 36ce230ed..ae938e28a 100644 --- a/src/lua_hud.h +++ b/src/lua_hud.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2014-2016 by John "JTE" Muniz. -// Copyright (C) 2014-2023 by Sonic Team Junior. +// Copyright (C) 2014-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index d6771f108..d2b3d9679 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2014-2016 by John "JTE" Muniz. -// Copyright (C) 2014-2023 by Sonic Team Junior. +// Copyright (C) 2014-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_hudlib_drawlist.c b/src/lua_hudlib_drawlist.c index cb58e628e..358d615cf 100644 --- a/src/lua_hudlib_drawlist.c +++ b/src/lua_hudlib_drawlist.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2014-2016 by John "JTE" Muniz. -// Copyright (C) 2014-2023 by Sonic Team Junior. +// Copyright (C) 2014-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_infolib.c b/src/lua_infolib.c index 511c20031..a65ee23eb 100644 --- a/src/lua_infolib.c +++ b/src/lua_infolib.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_libs.h b/src/lua_libs.h index 90c7bba7c..e1585f488 100644 --- a/src/lua_libs.h +++ b/src/lua_libs.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 9985e5631..c946b10ce 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index eadcbe33b..ebe995ea8 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 744a56f7f..37b42fde5 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_script.c b/src/lua_script.c index 51808977f..623d88673 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_script.h b/src/lua_script.h index 968ef078d..c5a5069ef 100644 --- a/src/lua_script.h +++ b/src/lua_script.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by John "JTE" Muniz. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/lua_skinlib.c b/src/lua_skinlib.c index 26f4011d3..0e8860804 100644 --- a/src/lua_skinlib.c +++ b/src/lua_skinlib.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2014-2016 by John "JTE" Muniz. -// Copyright (C) 2014-2023 by Sonic Team Junior. +// Copyright (C) 2014-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_anigif.c b/src/m_anigif.c index 6e6ec68aa..5ebc4892c 100644 --- a/src/m_anigif.c +++ b/src/m_anigif.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 2013-2016 by Matthew "Kaito Sinclaire" Walsh. // Copyright (C) 2013 by "Ninji". -// Copyright (C) 2013-2023 by Sonic Team Junior. +// Copyright (C) 2013-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_cheat.c b/src/m_cheat.c index 07f100717..2b32253fa 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_cheat.h b/src/m_cheat.h index 564c6da77..6bd1546f8 100644 --- a/src/m_cheat.h +++ b/src/m_cheat.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_cond.c b/src/m_cond.c index fa6cda223..418b2ff2b 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2012-2016 by Matthew "Kaito Sinclaire" Walsh. -// Copyright (C) 2012-2023 by Sonic Team Junior. +// Copyright (C) 2012-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_fixed.c b/src/m_fixed.c index 19c1e8091..ace05fd3b 100644 --- a/src/m_fixed.c +++ b/src/m_fixed.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // Copyright (C) 2009 by Stephen McGranahan. // // This program is free software distributed under the diff --git a/src/m_fixed.h b/src/m_fixed.h index f40c7b308..504b53a6e 100644 --- a/src/m_fixed.h +++ b/src/m_fixed.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_menu.c b/src/m_menu.c index 301c40075..2e4a42506 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3,7 +3,7 @@ // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. // Copyright (C) 2011-2016 by Matthew "Kaito Sinclaire" Walsh. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_menu.h b/src/m_menu.h index e76010c17..cfe811d0b 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -3,7 +3,7 @@ // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. // Copyright (C) 2011-2016 by Matthew "Kaito Sinclaire" Walsh. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_misc.c b/src/m_misc.c index 724717aa6..dda3ffc86 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_misc.h b/src/m_misc.h index 04ac66ca6..636810944 100644 --- a/src/m_misc.h +++ b/src/m_misc.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_tokenizer.c b/src/m_tokenizer.c index 8bb094cae..09f8915a5 100644 --- a/src/m_tokenizer.c +++ b/src/m_tokenizer.c @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2013-2023 by Sonic Team Junior. +// Copyright (C) 2013-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_tokenizer.h b/src/m_tokenizer.h index 7ee856b3c..4f03563a2 100644 --- a/src/m_tokenizer.h +++ b/src/m_tokenizer.h @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2013-2023 by Sonic Team Junior. +// Copyright (C) 2013-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/netcode/commands.c b/src/netcode/commands.c index f3bbc8a86..8d6dab06b 100644 --- a/src/netcode/commands.c +++ b/src/netcode/commands.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/netcode/d_net.c b/src/netcode/d_net.c index 4f21ca984..031336852 100644 --- a/src/netcode/d_net.c +++ b/src/netcode/d_net.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/netcode/d_netcmd.h b/src/netcode/d_netcmd.h index f92878a4e..c11575575 100644 --- a/src/netcode/d_netcmd.h +++ b/src/netcode/d_netcmd.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/netcode/gamestate.c b/src/netcode/gamestate.c index d38555245..967e23650 100644 --- a/src/netcode/gamestate.c +++ b/src/netcode/gamestate.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/netcode/i_net.h b/src/netcode/i_net.h index 6ac4bfc87..4fd317994 100644 --- a/src/netcode/i_net.h +++ b/src/netcode/i_net.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/netcode/i_tcp.c b/src/netcode/i_tcp.c index d9af91c04..ed1f5b4e7 100644 --- a/src/netcode/i_tcp.c +++ b/src/netcode/i_tcp.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/netcode/mserv.c b/src/netcode/mserv.c index 74ee120f9..78a395344 100644 --- a/src/netcode/mserv.c +++ b/src/netcode/mserv.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // Copyright (C) 2020-2023 by James R. // // This program is free software distributed under the diff --git a/src/p_enemy.c b/src/p_enemy.c index e1b21e295..2ae7276df 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_inter.c b/src/p_inter.c index cbd56183d..19ab5ead4 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_local.h b/src/p_local.h index 249c3cd4b..39856bffb 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_map.c b/src/p_map.c index c742e2e85..1116ae06a 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_maputl.c b/src/p_maputl.c index 200b89cff..f10a396a3 100644 --- a/src/p_maputl.c +++ b/src/p_maputl.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_maputl.h b/src/p_maputl.h index e894c08a2..67f7fd086 100644 --- a/src/p_maputl.h +++ b/src/p_maputl.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_mobj.c b/src/p_mobj.c index 1ec09ab85..b377ff82f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_mobj.h b/src/p_mobj.h index 4ebcc993a..4a8427669 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_polyobj.c b/src/p_polyobj.c index e779956e8..168fca61f 100644 --- a/src/p_polyobj.c +++ b/src/p_polyobj.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2006 by James Haley -// Copyright (C) 2006-2023 by Sonic Team Junior. +// Copyright (C) 2006-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_pspr.h b/src/p_pspr.h index 6510190f1..5e1c1e05e 100644 --- a/src/p_pspr.h +++ b/src/p_pspr.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_saveg.c b/src/p_saveg.c index 5c2228593..aad7351f0 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_saveg.h b/src/p_saveg.h index 8aa83c80f..05e82190a 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_setup.c b/src/p_setup.c index b5ed485d8..2524803ab 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_setup.h b/src/p_setup.h index da38d4c08..6b0218854 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_slopes.c b/src/p_slopes.c index ce276a672..7f070e2a1 100644 --- a/src/p_slopes.c +++ b/src/p_slopes.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2009 by Stephen McGranahan. -// Copyright (C) 2015-2023 by Sonic Team Junior. +// Copyright (C) 2015-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_slopes.h b/src/p_slopes.h index fdc07f67e..39b7ba56d 100644 --- a/src/p_slopes.h +++ b/src/p_slopes.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2009 by Stephen McGranahan. -// Copyright (C) 2015-2023 by Sonic Team Junior. +// Copyright (C) 2015-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_spec.c b/src/p_spec.c index d4939669a..6f3543161 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_spec.h b/src/p_spec.h index b9c3a2ca3..ba08781b6 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_tick.c b/src/p_tick.c index 56e0fd897..68de09138 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/p_user.c b/src/p_user.c index 3ee13aca9..a2bae228b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_bsp.c b/src/r_bsp.c index 373a170c9..ad27b9bf8 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_data.c b/src/r_data.c index 75ec0556d..e7200ecbd 100644 --- a/src/r_data.c +++ b/src/r_data.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_data.h b/src/r_data.h index 9340ed284..7c6ee19d5 100644 --- a/src/r_data.h +++ b/src/r_data.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_defs.h b/src/r_defs.h index 51cc08646..51fac21fa 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_draw.c b/src/r_draw.c index eca3f36b7..906398ec4 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_draw.h b/src/r_draw.h index 6a6ab2db1..00032e44f 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_draw8.c b/src/r_draw8.c index 2011e4640..220878f88 100644 --- a/src/r_draw8.c +++ b/src/r_draw8.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_draw8_npo2.c b/src/r_draw8_npo2.c index 1ed3a8fa4..6213ecbc5 100644 --- a/src/r_draw8_npo2.c +++ b/src/r_draw8_npo2.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_fps.c b/src/r_fps.c index 7f1f2bb30..71f6e59a7 100644 --- a/src/r_fps.c +++ b/src/r_fps.c @@ -3,7 +3,7 @@ // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. // Copyright (C) 1999-2000 by Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze, Andrey Budko (prboom) -// Copyright (C) 1999-2019 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_fps.h b/src/r_fps.h index 33224a83a..ce64d19be 100644 --- a/src/r_fps.h +++ b/src/r_fps.h @@ -3,7 +3,7 @@ // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. // Copyright (C) 1999-2000 by Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze, Andrey Budko (prboom) -// Copyright (C) 1999-2019 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_main.c b/src/r_main.c index 067b8abdb..50293341d 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_main.h b/src/r_main.h index 64a69fffe..af7086e83 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_patch.h b/src/r_patch.h index f1a018c03..6369fef9e 100644 --- a/src/r_patch.h +++ b/src/r_patch.h @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2020-2023 by Jaime "Lactozilla" Passos. +// Copyright (C) 2020-2024 by Jaime "Lactozilla" Passos. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_picformats.c b/src/r_picformats.c index d71657021..08cb663d4 100644 --- a/src/r_picformats.c +++ b/src/r_picformats.c @@ -2,8 +2,8 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 2005-2009 by Andrey "entryway" Budko. -// Copyright (C) 2018-2023 by Jaime "Lactozilla" Passos. -// Copyright (C) 2019-2023 by Sonic Team Junior. +// Copyright (C) 2018-2024 by Jaime "Lactozilla" Passos. +// Copyright (C) 2019-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_picformats.h b/src/r_picformats.h index 098f927a5..a928bbde5 100644 --- a/src/r_picformats.h +++ b/src/r_picformats.h @@ -1,8 +1,8 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. -// Copyright (C) 2018-2023 by Jaime "Lactozilla" Passos. -// Copyright (C) 2019-2023 by Sonic Team Junior. +// Copyright (C) 2018-2024 by Jaime "Lactozilla" Passos. +// Copyright (C) 2019-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_plane.c b/src/r_plane.c index 04272f8d3..380f39eab 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_segs.c b/src/r_segs.c index a8a065c9b..4939d1fc8 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_skins.c b/src/r_skins.c index a341ee80f..f364273e8 100644 --- a/src/r_skins.c +++ b/src/r_skins.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_skins.h b/src/r_skins.h index 5122b53a6..645fea540 100644 --- a/src/r_skins.h +++ b/src/r_skins.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_sky.c b/src/r_sky.c index 1b2c43d12..ad7262c6e 100644 --- a/src/r_sky.c +++ b/src/r_sky.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_splats.c b/src/r_splats.c index 027ccd720..813c4b243 100644 --- a/src/r_splats.c +++ b/src/r_splats.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_textures.c b/src/r_textures.c index b61ddb86f..bd22a2df1 100644 --- a/src/r_textures.c +++ b/src/r_textures.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_textures.h b/src/r_textures.h index 7e1588851..35db40d42 100644 --- a/src/r_textures.h +++ b/src/r_textures.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_things.c b/src/r_things.c index 917e4e8b4..432b5e10b 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_things.h b/src/r_things.h index 55ab71ec3..ae21d2404 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_translation.c b/src/r_translation.c index a53b30e9f..53bb0e6a0 100644 --- a/src/r_translation.c +++ b/src/r_translation.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2006 by Randy Heit. -// Copyright (C) 2023 by Sonic Team Junior. +// Copyright (C) 2023-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_translation.h b/src/r_translation.h index 1eb40233d..9cae1a647 100644 --- a/src/r_translation.h +++ b/src/r_translation.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2006 by Randy Heit. -// Copyright (C) 2023 by Sonic Team Junior. +// Copyright (C) 2023-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/s_sound.c b/src/s_sound.c index 32353a59c..0329c289e 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/s_sound.h b/src/s_sound.h index d64778fc3..589060c8c 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/screen.c b/src/screen.c index 014a20117..a2c1f04da 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/screen.h b/src/screen.h index 375b3e04e..6d45560c4 100644 --- a/src/screen.h +++ b/src/screen.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/st_stuff.c b/src/st_stuff.c index b99f003da..a44771e4b 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/st_stuff.h b/src/st_stuff.h index 357930de0..a2fb8a0ed 100644 --- a/src/st_stuff.h +++ b/src/st_stuff.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/string.c b/src/string.c index b24e12e6e..c5d95b224 100644 --- a/src/string.c +++ b/src/string.c @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 2006 by Graue. -// Copyright (C) 2006-2023 by Sonic Team Junior. +// Copyright (C) 2006-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/tables.c b/src/tables.c index d0fb428ba..8e9075be2 100644 --- a/src/tables.c +++ b/src/tables.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // Copyright (C) 2009 by Stephen McGranahan. // // This program is free software distributed under the diff --git a/src/tables.h b/src/tables.h index 65d7f7243..3c0dd2a81 100644 --- a/src/tables.h +++ b/src/tables.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/v_video.c b/src/v_video.c index 3beb435b5..42a4aaa00 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/v_video.h b/src/v_video.h index d37762466..bdab23e8a 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/w_wad.c b/src/w_wad.c index 97208296a..4a6900113 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/w_wad.h b/src/w_wad.h index 4fd7b2c00..5872ae50a 100644 --- a/src/w_wad.h +++ b/src/w_wad.h @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 1998-2000 by DooM Legacy Team. -// Copyright (C) 1999-2023 by Sonic Team Junior. +// Copyright (C) 1999-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/y_inter.c b/src/y_inter.c index 2add8645b..95a08a387 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2004-2023 by Sonic Team Junior. +// Copyright (C) 2004-2024 by Sonic Team Junior. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. From a050df102256ef30b74b36dd6b1d2fa36558ca62 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Sat, 21 Sep 2024 21:38:05 -0300 Subject: [PATCH 131/139] Update names --- src/lua_colorlib.c | 2 +- src/m_easing.c | 2 +- src/m_easing.h | 2 +- src/r_patch.c | 2 +- src/r_patch.h | 2 +- src/r_patchrotation.c | 2 +- src/r_patchrotation.h | 2 +- src/r_picformats.c | 2 +- src/r_picformats.h | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lua_colorlib.c b/src/lua_colorlib.c index a8785f705..9e679eb40 100644 --- a/src/lua_colorlib.c +++ b/src/lua_colorlib.c @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2021-2024 by "Lactozilla". +// Copyright (C) 2021-2024 by Lactozilla. // Copyright (C) 2014-2024 by Sonic Team Junior. // // This program is free software distributed under the diff --git a/src/m_easing.c b/src/m_easing.c index 48fe1efbc..60ca6e9b6 100644 --- a/src/m_easing.c +++ b/src/m_easing.c @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2020-2023 by Jaime "Lactozilla" Passos. +// Copyright (C) 2020-2023 by Lactozilla. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/m_easing.h b/src/m_easing.h index eaa5d6773..6884833af 100644 --- a/src/m_easing.h +++ b/src/m_easing.h @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2020-2023 by Jaime "Lactozilla" Passos. +// Copyright (C) 2020-2023 by Lactozilla. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_patch.c b/src/r_patch.c index a6a9dc2eb..19e66404f 100644 --- a/src/r_patch.c +++ b/src/r_patch.c @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2020-2023 by Jaime "Lactozilla" Passos. +// Copyright (C) 2020-2023 by Lactozilla. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_patch.h b/src/r_patch.h index 6369fef9e..ff76254e8 100644 --- a/src/r_patch.h +++ b/src/r_patch.h @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2020-2024 by Jaime "Lactozilla" Passos. +// Copyright (C) 2020-2024 by Lactozilla. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index b91069849..989665d74 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2020-2023 by Jaime "Lactozilla" Passos. +// Copyright (C) 2020-2023 by Lactozilla. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_patchrotation.h b/src/r_patchrotation.h index a239ac5fa..184d7ac13 100644 --- a/src/r_patchrotation.h +++ b/src/r_patchrotation.h @@ -1,6 +1,6 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- -// Copyright (C) 2020-2023 by Jaime "Lactozilla" Passos. +// Copyright (C) 2020-2023 by Lactozilla. // // This program is free software distributed under the // terms of the GNU General Public License, version 2. diff --git a/src/r_picformats.c b/src/r_picformats.c index 08cb663d4..a45c143b0 100644 --- a/src/r_picformats.c +++ b/src/r_picformats.c @@ -2,7 +2,7 @@ //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. // Copyright (C) 2005-2009 by Andrey "entryway" Budko. -// Copyright (C) 2018-2024 by Jaime "Lactozilla" Passos. +// Copyright (C) 2018-2024 by Lactozilla. // Copyright (C) 2019-2024 by Sonic Team Junior. // // This program is free software distributed under the diff --git a/src/r_picformats.h b/src/r_picformats.h index a928bbde5..123dda976 100644 --- a/src/r_picformats.h +++ b/src/r_picformats.h @@ -1,7 +1,7 @@ // SONIC ROBO BLAST 2 //----------------------------------------------------------------------------- // Copyright (C) 1993-1996 by id Software, Inc. -// Copyright (C) 2018-2024 by Jaime "Lactozilla" Passos. +// Copyright (C) 2018-2024 by Lactozilla. // Copyright (C) 2019-2024 by Sonic Team Junior. // // This program is free software distributed under the From 697509bd68642053fbd64d41119ad8b850329940 Mon Sep 17 00:00:00 2001 From: LJ Sonic Date: Tue, 24 Sep 2024 23:26:54 +0200 Subject: [PATCH 132/139] Fix global mobj hooks deprecation warning always triggering --- src/lua_hooklib.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c index 51ebe3938..1bf3caf65 100644 --- a/src/lua_hooklib.c +++ b/src/lua_hooklib.c @@ -498,7 +498,9 @@ static int call_string_hooks(Hook_State *hook) static int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type) { - if (mobj_type == MT_NULL && ( + int numCalls = call_mapped(hook, &mobjHookIds[mobj_type][hook->hook_type]); + + if (numCalls > 0 && mobj_type == MT_NULL && ( hook->hook_type == MOBJ_HOOK(MobjThinker ) || hook->hook_type == MOBJ_HOOK(MobjCollide ) || hook->hook_type == MOBJ_HOOK(MobjLineCollide) @@ -514,7 +516,7 @@ static int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type) mobjHookNames[hook->hook_type]) ); - return call_mapped(hook, &mobjHookIds[mobj_type][hook->hook_type]); + return numCalls; } static void call_hud_hooks From 209c545743376702e763cc385044f8a17ec51d21 Mon Sep 17 00:00:00 2001 From: UnmatchedBracket Date: Wed, 25 Sep 2024 13:44:22 -0600 Subject: [PATCH 133/139] fix quake epicenter for first person and awayviews --- src/r_main.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/r_main.c b/src/r_main.c index 50293341d..dcb69b662 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1152,8 +1152,14 @@ void R_SetupFrame(player_t *player) if (quake.epicenter) { // Calculate 3D distance from epicenter, using the camera. - fixed_t xydist = R_PointToDist2(thiscam->x, thiscam->y, quake.epicenter->x, quake.epicenter->y); - fixed_t dist = R_PointToDist2(0, thiscam->z, xydist, quake.epicenter->z); + fixed_t xydist, dist; + if (r_viewmobj == NULL) { + xydist = R_PointToDist2(thiscam->x, thiscam->y, quake.epicenter->x, quake.epicenter->y); + dist = R_PointToDist2(0, thiscam->z, xydist, quake.epicenter->z); + } else { + xydist = R_PointToDist2(r_viewmobj->x, r_viewmobj->y, quake.epicenter->x, quake.epicenter->y); + dist = R_PointToDist2(0, r_viewmobj->z, xydist, quake.epicenter->z); + } // More effect closer to epicenter, outside of radius = no effect if (!quake.radius || dist > quake.radius) From 491c77bd767ddfa81f47cd60e4ebd203ae5e5e3b Mon Sep 17 00:00:00 2001 From: Unmatched Bracket <2755-UnmatchedBracket@users.noreply.git.do.srb2.org> Date: Wed, 25 Sep 2024 20:40:34 +0000 Subject: [PATCH 134/139] [quake fixes] Use P_MobjWasRemoved instead of checking against NULL per Zapony's suggestion --- src/r_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_main.c b/src/r_main.c index dcb69b662..32e3138eb 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1153,7 +1153,7 @@ void R_SetupFrame(player_t *player) if (quake.epicenter) { // Calculate 3D distance from epicenter, using the camera. fixed_t xydist, dist; - if (r_viewmobj == NULL) { + if (P_MobjWasRemoved(r_viewmobj)) { xydist = R_PointToDist2(thiscam->x, thiscam->y, quake.epicenter->x, quake.epicenter->y); dist = R_PointToDist2(0, thiscam->z, xydist, quake.epicenter->z); } else { From 438de82c69185469ca86bf70c1ad3f291ceb198b Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Fri, 27 Sep 2024 19:47:54 -0300 Subject: [PATCH 135/139] Fix TRNSLATE lumps being recognized as valid sprite names --- src/r_things.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/r_things.c b/src/r_things.c index 432b5e10b..50855e2fc 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -279,6 +279,14 @@ static boolean GetFramesAndRotationsFromShortLumpName( *ret_rotation2 = R_Char2Rotation(name[7]); if (*ret_frame2 >= 64 || *ret_rotation2 == 255) return false; + + // TRNSLATE is a valid but extremely unlikely sprite name: + // * The sprite name is "TRNS" + // * The frame is L, rotation A; mirrored to frame T, rotation E + // In the very unfortunate event that TRNSLATE is found between sprite lumps, + // this name check prevents it from being added as a sprite, when it actually isn't. + if (memcmp(name, "TRNSLATE", 8) == 0) + return false; } else { From 6dbcd2ba19a103da615125190d154b5348bd8997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustaf=20Alh=C3=A4ll?= Date: Sun, 29 Sep 2024 21:40:17 +0200 Subject: [PATCH 136/139] Fix buffer overflow when registering a dedicated build server on MS --- src/dedicated/i_threads.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dedicated/i_threads.c b/src/dedicated/i_threads.c index 6902e23a5..55c0a069e 100644 --- a/src/dedicated/i_threads.c +++ b/src/dedicated/i_threads.c @@ -157,7 +157,7 @@ void I_wake_all_cond(I_cond *anchor) pthread_mutex_lock(&thread_lock); if (*anchor == NULL) { - *anchor = malloc(sizeof(pthread_t)); + *anchor = malloc(sizeof(pthread_cond_t)); pthread_cond_init(*anchor, NULL); } pthread_mutex_unlock(&thread_lock); From a71257308e8ccd005f9876d746f587aae435e962 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Tue, 1 Oct 2024 20:30:01 -0300 Subject: [PATCH 137/139] Disallow any directories named LongSprites/ --- src/w_wad.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/w_wad.c b/src/w_wad.c index 4a6900113..4a1d44548 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -2657,7 +2657,8 @@ static lumpchecklist_t folderblacklist[] = { {"Lua/", 4}, {"SOC/", 4}, - {"Sprites/", 8}, + {"Sprites/", 8}, + {"LongSprites/", 12}, {"Textures/", 9}, {"Patches/", 8}, {"Flats/", 6}, From c833d73e3225df5f27b6905383d3b8087c66a22a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustaf=20Alh=C3=A4ll?= Date: Sat, 5 Oct 2024 11:28:03 +0200 Subject: [PATCH 138/139] Fix potential segfault when flat images has changed on netcode --- src/p_saveg.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_saveg.c b/src/p_saveg.c index aad7351f0..d6f8d23c5 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1501,13 +1501,13 @@ static void UnArchiveSectors(save_t *save_p) sectors[i].ceilingheight = P_ReadFixed(save_p); if (diff & SD_FLOORPIC) { - sectors[i].floorpic = P_AddLevelFlatRuntime((char *)save_p); - save_p += 8; + sectors[i].floorpic = P_AddLevelFlatRuntime((char *)&save_p->buf[save_p->pos]); + save_p->pos += 8; } if (diff & SD_CEILPIC) { - sectors[i].ceilingpic = P_AddLevelFlatRuntime((char *)save_p); - save_p += 8; + sectors[i].ceilingpic = P_AddLevelFlatRuntime((char *)&save_p->buf[save_p->pos]); + save_p->pos += 8; } if (diff & SD_LIGHT) sectors[i].lightlevel = P_ReadINT16(save_p); From 8e66ed73ab2371e89a548344e4ad26139e7d5db2 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Wed, 16 Oct 2024 17:46:37 -0500 Subject: [PATCH 139/139] Add mac universal fuse build scripts --- scripts/arm64-osx-1015.cmake | 7 +++++++ scripts/make-macos-universal.sh | 25 +++++++++++++++++++++++++ scripts/x64-osx-1015.cmake | 7 +++++++ 3 files changed, 39 insertions(+) create mode 100644 scripts/arm64-osx-1015.cmake create mode 100755 scripts/make-macos-universal.sh create mode 100644 scripts/x64-osx-1015.cmake diff --git a/scripts/arm64-osx-1015.cmake b/scripts/arm64-osx-1015.cmake new file mode 100644 index 000000000..224430bc1 --- /dev/null +++ b/scripts/arm64-osx-1015.cmake @@ -0,0 +1,7 @@ +set(VCPKG_TARGET_ARCHITECTURE arm64) +set(VCPKG_OSX_DEPLOYMENT_TARGET 10.15) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Darwin) +set(VCPKG_OSX_ARCHITECTURES arm64) diff --git a/scripts/make-macos-universal.sh b/scripts/make-macos-universal.sh new file mode 100755 index 000000000..f1b17516c --- /dev/null +++ b/scripts/make-macos-universal.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Makes a fused macOS Universal app bundle in the arm64 release preset dir +# Only works if in master branch or in source tarball + +set -e + +rm -rf "build/ninja-x64_osx_vcpkg-release" +rm -rf "build/ninja-arm64_osx_vcpkg-release" +cmake --preset ninja-x64_osx_vcpkg-release -DVCPKG_OVERLAY_TRIPLETS=scripts/ -DVCPKG_TARGET_TRIPLET=x64-osx-1015 -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 "-DSRB2_SDL2_EXE_NAME=srb2" +cmake --build --preset ninja-x64_osx_vcpkg-release +cmake --preset ninja-arm64_osx_vcpkg-release -DVCPKG_OVERLAY_TRIPLETS=scripts/ -DVCPKG_TARGET_TRIPLET=arm64-osx-1015 -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 "-DSRB2_SDL2_EXE_NAME=srb2" +cmake --build --preset ninja-arm64_osx_vcpkg-release + +mkdir -p build/dist +rm -rf "build/dist/Sonic Robo Blast 2.app" "build/dist/srb2.app" + +cp -r build/ninja-arm64_osx_vcpkg-release/bin/srb2.app build/dist/ + +lipo -create \ + -output "build/dist/srb2.app/Contents/MacOS/srb2" \ + build/ninja-x64_osx_vcpkg-release/bin/srb2.app/Contents/MacOS/srb2 \ + build/ninja-arm64_osx_vcpkg-release/bin/srb2.app/Contents/MacOS/srb2 + +mv build/dist/srb2.app "build/dist/Sonic Robo Blast 2.app" diff --git a/scripts/x64-osx-1015.cmake b/scripts/x64-osx-1015.cmake new file mode 100644 index 000000000..5f0c7b66e --- /dev/null +++ b/scripts/x64-osx-1015.cmake @@ -0,0 +1,7 @@ +set(VCPKG_TARGET_ARCHITECTURE x64) +set(VCPKG_OSX_DEPLOYMENT_TARGET 10.15) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Darwin) +set(VCPKG_OSX_ARCHITECTURES x86_64)