From b58ca4ea7b44dc2c150047d0db3a5d73012de67e Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 30 Nov 2025 18:25:03 -0500 Subject: [PATCH 01/13] Fix compile warning --- src/sdl/i_system.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sdl/i_system.cpp b/src/sdl/i_system.cpp index fd33b0f89..342125e28 100644 --- a/src/sdl/i_system.cpp +++ b/src/sdl/i_system.cpp @@ -2125,7 +2125,7 @@ FUNCIERROR void ATTRNORETURN I_Error(const char *error, ...) W_Shutdown(); #if defined (PARANOIA) || defined (DEVELOP) - *(INT32 *)0 = 4; //Alam: Debug! + *(volatile INT32 *)0 = 4; //Alam: Debug! #endif exit(-1); From ccd509866a1527861414890362275960014366af Mon Sep 17 00:00:00 2001 From: yamamama Date: Mon, 1 Dec 2025 00:04:30 -0500 Subject: [PATCH 02/13] Separate gravity scale multiplier, make Alt. Shrink use the standard mapobjectscale for gravity --- src/p_mobj.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 9cc9bcf61..01a7d73d6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1112,6 +1112,7 @@ static void P_PlayerFlip(mobj_t *mo) fixed_t P_GetMobjGravity(mobj_t *mo) { fixed_t gravityadd = 0; + fixed_t gravitymul = FRACUNIT; sector_t *gravsector = NULL; // Custom gravity boolean goopgravity = false; boolean wasflip; @@ -1119,6 +1120,8 @@ fixed_t P_GetMobjGravity(mobj_t *mo) I_Assert(mo != NULL); I_Assert(!P_MobjWasRemoved(mo)); + gravitymul = mo->scale; + wasflip = (mo->eflags & MFE_VERTICALFLIP) != 0; mo->eflags &= ~MFE_VERTICALFLIP; @@ -1179,6 +1182,11 @@ fixed_t P_GetMobjGravity(mobj_t *mo) { gravityadd = 0; } + + if (K_IsAltShrunk(mo->player)) + { + gravitymul = mapobjectscale; + } } else { @@ -1263,7 +1271,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) if (goopgravity) gravityadd = -gravityadd/5; - gravityadd = FixedMul(gravityadd, mo->scale); + gravityadd = FixedMul(gravityadd, gravitymul); return gravityadd; } From 98efad8ce36931aa125b244f0c12d7aa425f337a Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 1 Dec 2025 08:54:21 -0500 Subject: [PATCH 03/13] Do we want this by default? --- src/d_netcmd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 1657adea4..771716a7a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -605,8 +605,7 @@ static CV_PossibleValue_t bubble_defense_damagerate_cons_t[] = {{0, "MIN"}, {FRA consvar_t cv_kartbubble_defense_damagerate = CVAR_INIT ("kartbubble_defense_damagerate", "1.0", CV_NETVAR|CV_FLOAT, bubble_defense_damagerate_cons_t, NULL); consvar_t cv_kartbubble_boost_allow = CVAR_INIT ("kartbubble_boost_allow", "On", CV_NETVAR, CV_OnOff, NULL); consvar_t cv_kartflame_fastfuel = CVAR_INIT ("kartflame_fastfuel", "Off", CV_NETVAR, CV_OnOff, NULL); -// we want this to be default now apparently -consvar_t cv_kartflame_offroadburn = CVAR_INIT ("kartflame_offroadburn", "On", CV_NETVAR, CV_OnOff, NULL); +consvar_t cv_kartflame_offroadburn = CVAR_INIT ("kartflame_offroadburn", "Off", CV_NETVAR, CV_OnOff, NULL); // "Arrow Bullet": above a certain speed threshold, an aura in the shape of the Shrink arrow // covers you, signaling protection from (most) items and players. From 75c48c6c87b84db5287d37efa524f545c19ebffb Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 1 Dec 2025 10:04:44 -0500 Subject: [PATCH 04/13] Revert "Do we want this by default?" This reverts commit 98efad8ce36931aa125b244f0c12d7aa425f337a. --- src/d_netcmd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 771716a7a..1657adea4 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -605,7 +605,8 @@ static CV_PossibleValue_t bubble_defense_damagerate_cons_t[] = {{0, "MIN"}, {FRA consvar_t cv_kartbubble_defense_damagerate = CVAR_INIT ("kartbubble_defense_damagerate", "1.0", CV_NETVAR|CV_FLOAT, bubble_defense_damagerate_cons_t, NULL); consvar_t cv_kartbubble_boost_allow = CVAR_INIT ("kartbubble_boost_allow", "On", CV_NETVAR, CV_OnOff, NULL); consvar_t cv_kartflame_fastfuel = CVAR_INIT ("kartflame_fastfuel", "Off", CV_NETVAR, CV_OnOff, NULL); -consvar_t cv_kartflame_offroadburn = CVAR_INIT ("kartflame_offroadburn", "Off", CV_NETVAR, CV_OnOff, NULL); +// we want this to be default now apparently +consvar_t cv_kartflame_offroadburn = CVAR_INIT ("kartflame_offroadburn", "On", CV_NETVAR, CV_OnOff, NULL); // "Arrow Bullet": above a certain speed threshold, an aura in the shape of the Shrink arrow // covers you, signaling protection from (most) items and players. From 8128e9a2a102071c6511f62598793e6a8df329cf Mon Sep 17 00:00:00 2001 From: yamamama Date: Mon, 1 Dec 2025 10:13:02 -0500 Subject: [PATCH 05/13] Expose flipover constants to Lua --- src/deh_tables.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index a898e4449..7e3e49015 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1727,5 +1727,15 @@ struct int_const_s const INT_CONST[] = { {"PICKUPITEM_EGGMAN", PICKUPITEM_EGGMAN}, {"PICKUPITEM_FLOATING", PICKUPITEM_FLOATING}, + // k_kart: Flipover + {"FLIPOVERTICS", FLIPOVERTICS}, + {"FLIPOVERHALFTICS", FLIPOVERHALFTICS}, + {"FLIPOVER_90DEGTIME", FLIPOVER_90DEGTIME}, + {"FLIPOVER_360DEGTIME", FLIPOVER_360DEGTIME}, + {"FLIPOVERLIMIT", FLIPOVERLIMIT}, + {"FLIPOVERANG", FLIPOVERANG}, + {"FLIPOVERSPEED", FLIPOVERSPEED}, + {"FLIPOVERHEIGHT", FLIPOVERHEIGHT}, + {NULL,0} }; From 1aa2549699f2893fe9331042be0711eefb1ac502 Mon Sep 17 00:00:00 2001 From: yamamama Date: Mon, 1 Dec 2025 10:14:59 -0500 Subject: [PATCH 06/13] Forgot one --- src/deh_tables.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index 7e3e49015..90b6b6706 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1728,6 +1728,7 @@ struct int_const_s const INT_CONST[] = { {"PICKUPITEM_FLOATING", PICKUPITEM_FLOATING}, // k_kart: Flipover + {"FLIPOVERDIST", FLIPOVERDIST}, {"FLIPOVERTICS", FLIPOVERTICS}, {"FLIPOVERHALFTICS", FLIPOVERHALFTICS}, {"FLIPOVER_90DEGTIME", FLIPOVER_90DEGTIME}, From 40d792fce9a8bf14bd4fef3f72290846f7da1b9d Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 1 Dec 2025 10:24:22 -0500 Subject: [PATCH 07/13] Expose most constants in k_kart.h Have fun Lua modders! --- src/deh_tables.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/k_kart.h | 5 ++--- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 90b6b6706..657d818e9 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1727,6 +1727,25 @@ struct int_const_s const INT_CONST[] = { {"PICKUPITEM_EGGMAN", PICKUPITEM_EGGMAN}, {"PICKUPITEM_FLOATING", PICKUPITEM_FLOATING}, + // kart_fullturn + {"KART_FULLTURN", KART_FULLTURN}, + + // invin constants + {"KART_NUMINVSPARKLESANIM", KART_NUMINVSPARKLESANIM}, + {"BASEINVINTIME", BASEINVINTIME}, + {"MININVINTIME", MININVINTIME}, + + // grow/shrink scale + {"GROW_SCALE", GROW_SCALE}, + {"SHRINK_SCALE", SHRINK_SCALE}, + + // auto respawn + {"AUTORESPAWN_TIME", AUTORESPAWN_TIME}, + {"AUTORESPAWN_THRESHOLD", AUTORESPAWN_THRESHOLD}, + + // flameshield + {"FLAMESTOREMAX", FLAMESTOREMAX}, + // k_kart: Flipover {"FLIPOVERDIST", FLIPOVERDIST}, {"FLIPOVERTICS", FLIPOVERTICS}, @@ -1738,5 +1757,29 @@ struct int_const_s const INT_CONST[] = { {"FLIPOVERSPEED", FLIPOVERSPEED}, {"FLIPOVERHEIGHT", FLIPOVERHEIGHT}, + // bubbleshield + //{"MAXBUBBLEHEALTH", MAXBUBBLEHEALTH}, + //{"BUBBLEBUMPCHIP", BUBBLEBUMPCHIP}, + //{"BUBBLEITMDAMAGE", BUBBLEITMDAMAGE}, + {"BUBBLEMINWEIGHT", BUBBLEMINWEIGHT}, + + // ring visual/audio stuff + {"MAXRINGVOLUME", MAXRINGVOLUME}, + {"MAXRINGTRANSPARENCY", MAXRINGTRANSPARENCY}, + {"MINRINGVOLUME", MINRINGVOLUME}, + {"MINRINGTRANSPARENCY", MINRINGTRANSPARENCY}, + {"RINGVOLUMECOLLECTPENALTY", RINGVOLUMECOLLECTPENALTY}, + {"RINGTRANSPARENCYCOLLECTPENALTY", RINGTRANSPARENCYCOLLECTPENALTY}, + {"RINGVOLUMEUSEPENALTY", RINGVOLUMEUSEPENALTY}, + {"RINGTRANSPARENCYUSEPENALTY", RINGTRANSPARENCYUSEPENALTY}, + {"RINGVOLUMEREGEN", RINGVOLUMEREGEN}, + {"RINGTRANSPARENCYREGEN", RINGTRANSPARENCYREGEN}, + + // bumpsparktype_t + {"BUMPSPARK_NONE", BUMPSPARK_NONE}, + {"BUMPSPARK_NOCHARGE", BUMPSPARK_NOCHARGE}, + {"BUMPSPARK_RESET100", BUMPSPARK_RESET100}, + {"BUMPSPARK_ALL", BUMPSPARK_ALL}, + {NULL,0} }; diff --git a/src/k_kart.h b/src/k_kart.h index 1892b0342..de666f39a 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -28,13 +28,12 @@ If states are ever added or removed Make sure this matches the actual number of states */ #define KART_NUMINVSPARKLESANIM 12 +#define BASEINVINTIME (10 * TICRATE) +#define MININVINTIME (7 * TICRATE) #define GROW_SCALE ((3*FRACUNIT)/2) #define SHRINK_SCALE ((6*FRACUNIT)/8) -#define BASEINVINTIME (10 * TICRATE) -#define MININVINTIME (7 * TICRATE) - #define AUTORESPAWN_TIME (TICRATE/2) #define AUTORESPAWN_THRESHOLD (TICRATE/4) From 420c756a938e284f02f991d8f3d3d25139712796 Mon Sep 17 00:00:00 2001 From: yamamama Date: Mon, 1 Dec 2025 13:25:43 -0500 Subject: [PATCH 08/13] Actually check if Alt. Shrink's active for Arrow Bullet --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index bc7fea8d1..efa62e407 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8954,6 +8954,9 @@ boolean K_AltShrinkArrowBulletCondition(player_t *player) if (!player) return false; // NULL player means there's no way we can BE an arrow bullet. + if (!K_IsAltShrunk(player)) // Not Alt. Shrunk! + return false; + // Only if you're at or above the threshold percentage! return (K_GetSpeedPercentage(player) >= cv_kartaltshrink_arrowbulletthres.value); } From e7fc5226ec166190d9f45b7f9e0c4ab928b728ae Mon Sep 17 00:00:00 2001 From: minenice55 Date: Mon, 1 Dec 2025 13:41:03 -0500 Subject: [PATCH 09/13] expose K_IsMissileOrKartItem --- src/lua_baselib.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 44c561de9..9dc6f5217 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4506,6 +4506,17 @@ static int lib_kMomentum3D(lua_State *L) return 1; } +static int lib_kMissileOrKartItem(lua_State *L) +{ + mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + + if (!mo) + return LUA_ErrInvalid(L, "mobj_t"); + + lua_pushboolean(L, K_IsMissileOrKartItem(mo)); + return 1; +} + static int lib_kAddNewScoreboardMod(lua_State *L) { const char *modname = luaL_checkstring(L, 1); @@ -5522,6 +5533,9 @@ static luaL_Reg lib[] = { {"K_PlayerCanPunt", lib_kPlayerCanPunt}, {"K_Momentum3D", lib_kMomentum3D}, + // kart stuff that's in other places for some reason + {"K_IsMissileOrKartItem", lib_kMissileOrKartItem}, + // k_hud {"K_AddNewScoreboardMod", lib_kAddNewScoreboardMod}, {"K_SetScoreboardModStatus", lib_kSetScoreboardModStatus}, From ad712cfe91931e9715c36a6422b1ee2fbb0e7c81 Mon Sep 17 00:00:00 2001 From: Alug Date: Mon, 1 Dec 2025 18:02:59 +0100 Subject: [PATCH 10/13] dont force awayview when in freecam --- src/r_main.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/r_main.cpp b/src/r_main.cpp index f857dcb2e..2805e54c3 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -1216,7 +1216,8 @@ static void R_SetupAimingFrame(int s) player_t *player = &players[displayplayers[s]]; camera_t *thiscam = &camera[s]; - if (player->awayviewtics) + if (player->awayviewtics && player->awayviewmobj + && thiscam && !thiscam->freecam) // dont force this if we wanna freecam! { newview->aim = player->awayviewaiming; newview->angle = player->awayviewmobj->angle; @@ -1265,10 +1266,10 @@ void R_SetupFrame(int s, boolean skybox) R_SetupAimingFrame(s); - if (player->awayviewtics) + if (player->awayviewtics && player->awayviewmobj // cut-away view stuff + && thiscam && !thiscam->freecam) // dont force this when we wanna freecam! { - // cut-away view stuff - r_viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN + r_viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN whos altview man? I_Assert(r_viewmobj != NULL); newview->x = r_viewmobj->x; @@ -1476,7 +1477,7 @@ static void R_PortalFrame(portal_t *portal) } } -static void Mask_Pre (maskcount_t* m) +static void Mask_Pre(maskcount_t* m) { m->drawsegs[0] = ds_p - drawsegs; m->vissprites[0] = visspritecount; @@ -1486,7 +1487,7 @@ static void Mask_Pre (maskcount_t* m) m->viewsector = viewsector; } -static void Mask_Post (maskcount_t* m) +static void Mask_Post(maskcount_t* m) { m->drawsegs[1] = ds_p - drawsegs; m->vissprites[1] = visspritecount; From 83db0b1025af012648d57e495bb5bd8755db0bc3 Mon Sep 17 00:00:00 2001 From: Indev Date: Mon, 1 Dec 2025 21:08:14 +0300 Subject: [PATCH 11/13] Expose cameras to lua outside of hud hooks --- src/lua_hudlib.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index fa0eee598..1a9202f57 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -152,7 +152,8 @@ enum cameraf { camera_momz, camera_pan, camera_pitch, - camera_pnum + camera_pnum, + camera_freecam, }; @@ -174,6 +175,7 @@ static const char *const camera_opt[] = { "pan", "pitch", "pnum", + "freecam", NULL}; enum hudpatch { @@ -332,10 +334,43 @@ static int camera_get(lua_State *L) case camera_pnum: lua_pushinteger(L, camnum); break; + case camera_freecam: + lua_pushboolean(L, cam->freecam); + break; } return 1; } +static int lib_getCamera(lua_State *L) +{ + // No cameras on dedicated + if (dedicated) + return 0; + + if (lua_type(L, 2) == LUA_TNUMBER) + { + int i = lua_tonumber(L, 2); + + if (i < 0 || i > splitscreen) + return 0; + + LUA_PushUserdata(L, &camera[i], META_CAMERA); + return 1; + } + + return 0; +} + +static int lib_lenCamera(lua_State *L) +{ + if (dedicated) + lua_pushinteger(L, 0); + else + lua_pushinteger(L, splitscreen+1); // splitscreen == 0 -> 1 active camera, splitscreen == 1 -> 2 cameras and so on + + return 1; +} + // // lib_draw // @@ -1671,6 +1706,16 @@ int LUA_HudLib(lua_State *L) lua_setfield(L, -2, "__index"); lua_pop(L,1); + lua_newuserdata(L, 0); + lua_createtable(L, 0, 2); + lua_pushcfunction(L, lib_getCamera); + lua_setfield(L, -2, "__index"); + + lua_pushcfunction(L, lib_lenCamera); + lua_setfield(L, -2, "__len"); + lua_setmetatable(L, -2); + lua_setglobal(L, "cameras"); + luaL_register(L, "hud", lib_hud); return 0; } From c3dfa0b40eddb30cd5bee76d0a992bf4ddb669ef Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 1 Dec 2025 14:02:03 -0500 Subject: [PATCH 12/13] players[p] -> player --- src/g_demo.c | 80 +++++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/src/g_demo.c b/src/g_demo.c index 710d42e36..5531f7e6d 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -1157,6 +1157,8 @@ void G_ReadDemoExtraData(void) demobuf.p = G_ReadRawExtraData(&extra, demobuf.p, demo.version); p = extra.playernum; + player_t *player = &players[p]; + if (p == DW_END) break; @@ -1181,42 +1183,42 @@ void G_ReadDemoExtraData(void) G_AddPlayer(extra.playernum, extra.playernum); } - players[p].bot = extra.joindata.bot; - if (players[p].bot) + player->bot = extra.joindata.bot; + if (player->bot) { - players[p].botvars.difficulty = extra.joindata.difficulty; - players[p].botvars.diffincrease = extra.joindata.diffincrease; // needed to avoid having to duplicate logic - players[p].botvars.rival = extra.joindata.rival; + player->botvars.difficulty = extra.joindata.difficulty; + player->botvars.diffincrease = extra.joindata.diffincrease; // needed to avoid having to duplicate logic + player->botvars.rival = extra.joindata.rival; } } if (extra.flags & DXD_PLAYSTATE) { switch (extra.playstate) { case DXD_PST_PLAYING: - if (players[p].spectator == true) + if (player->spectator == true) { - if (players[p].bot) + if (player->bot) { - players[p].spectator = false; + player->spectator = false; } else { - players[p].pflags |= PF_WANTSTOJOIN; + player->pflags |= PF_WANTSTOJOIN; } } //CONS_Printf("player %s is despectating on tic %d\n", player_names[p], leveltime); break; case DXD_PST_SPECTATING: - if (players[p].spectator) + if (player->spectator) { - players[p].pflags &= ~PF_WANTSTOJOIN; + player->pflags &= ~PF_WANTSTOJOIN; } else { - if (players[p].mo) + if (player->mo) { - P_DamageMobj(players[p].mo, NULL, NULL, 1, DMG_SPECTATOR); + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPECTATOR); } P_SetPlayerSpectator(p); } @@ -1244,11 +1246,11 @@ void G_ReadDemoExtraData(void) // Skin SetPlayerSkin(p, extra.skinname); - if (stricmp(skins[players[p].skin].name, extra.skinname) != 0) + if (stricmp(skins[player->skin].name, extra.skinname) != 0) FindClosestSkinForStats(p, extra.kartspeed, extra.kartweight); - players[p].kartspeed = extra.kartspeed; - players[p].kartweight = extra.kartweight; + player->kartspeed = extra.kartspeed; + player->kartweight = extra.kartweight; } if (extra.flags & DXD_COLOR) { @@ -1256,9 +1258,9 @@ void G_ReadDemoExtraData(void) for (i = 0; i < numskincolors; i++) if (!stricmp(skincolors[i].name, extra.colorname)) // SRB2kart { - players[p].skincolor = i; - if (players[p].mo) - players[p].mo->color = i; + player->skincolor = i; + if (player->mo) + player->mo->color = i; break; } } @@ -1271,16 +1273,16 @@ void G_ReadDemoExtraData(void) for (i = 0; i < numskincolors +2; i++) // +2 because of Match and Opposite if (!stricmp(Followercolor_cons_t[i].strvalue, extra.followercolor)) { - players[p].followercolor = i; + player->followercolor = i; break; } } if (extra.flags & DXD_RESPAWN) { - if (players[p].mo) + if (player->mo) { // Is this how this should work..? - P_DamageMobj(players[p].mo, NULL, NULL, 1, DMG_INSTAKILL); + P_DamageMobj(player->mo, NULL, NULL, 1, DMG_INSTAKILL); } } if (extra.flags & DXD_WEAPONPREF) @@ -3758,36 +3760,38 @@ void G_DoPlayDemo(char *defdemoname) { demoplayer_t *plr = &header.playerdata[pnum]; UINT8 p = plr->playernum; + player_t *player = &players[p]; + if (!playeringame[displayplayers[0]] || players[displayplayers[0]].spectator) displayplayers[0] = consoleplayer = serverplayer = p; G_AddPlayer(p, p); - players[p].spectator = !!(plr->flags & DEMO_SPECTATOR); + player->spectator = !!(plr->flags & DEMO_SPECTATOR); if (plr->flags & DEMO_KICKSTART) - players[p].pflags |= PF_KICKSTARTACCEL; + player->pflags |= PF_KICKSTARTACCEL; else - players[p].pflags &= ~PF_KICKSTARTACCEL; + player->pflags &= ~PF_KICKSTARTACCEL; if (plr->flags & DEMO_SHRINKME) - players[p].pflags |= PF_SHRINKME; + player->pflags |= PF_SHRINKME; else - players[p].pflags &= ~PF_SHRINKME; + player->pflags &= ~PF_SHRINKME; - K_UpdateShrinkCheat(&players[p]); + K_UpdateShrinkCheat(player); - if ((players[p].bot = !!(plr->flags & DEMO_BOT)) == true) + if ((player->bot = !!(plr->flags & DEMO_BOT)) == true) { - players[p].botvars.difficulty = plr->bot.difficulty; - players[p].botvars.diffincrease = plr->bot.diffincrease; // needed to avoid having to duplicate logic - players[p].botvars.rival = plr->bot.rival; + player->botvars.difficulty = plr->bot.difficulty; + player->botvars.diffincrease = plr->bot.diffincrease; // needed to avoid having to duplicate logic + player->botvars.rival = plr->bot.rival; } // Name strcpy(player_names[p], plr->name); - /*if (players[p].spectator) + /*if (player->spectator) { CONS_Printf("player %s is spectator at start\n", player_names[p]); }*/ @@ -3799,7 +3803,7 @@ void G_DoPlayDemo(char *defdemoname) for (i = 0; i < numskincolors; i++) if (!stricmp(skincolors[i].name, plr->color)) // SRB2kart { - players[p].skincolor = i; + player->skincolor = i; break; } @@ -3810,23 +3814,23 @@ void G_DoPlayDemo(char *defdemoname) for (i = 0; i < numskincolors +2; i++) // +2 because of Match and Opposite if (!stricmp(Followercolor_cons_t[i].strvalue, plr->followercolor)) { - players[p].followercolor = i; + player->followercolor = i; break; } // Score, since Kart uses this to determine where you start on the map - players[p].score = plr->score; + player->score = plr->score; // Power Levels clientpowerlevels[p][gametype == GT_BATTLE ? PWRLV_BATTLE : PWRLV_RACE] = plr->powerlevel; // Kart stats (set later) - if (stricmp(skins[players[p].skin].name, plr->skin) != 0) + if (stricmp(skins[player->skin].name, plr->skin) != 0) FindClosestSkinForStats(p, plr->kartspeed, plr->kartweight); // Followitem - players[p].followitem = plr->followitem; + player->followitem = plr->followitem; } // end of player read (the 0xFF marker) From f4f3ff0fdbec44af621b2e7ba88613d50b38d089 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 1 Dec 2025 14:18:37 -0500 Subject: [PATCH 13/13] G_AdjustViewEx and fix freecam reset if demo player spectates based on https://github.com/Indev450/SRB2Kart-Saturn/commit/10c117f95fc681b0d369e12114455144526d9b23 --- src/d_clisrv.c | 2 +- src/g_demo.c | 4 ++-- src/g_game.c | 11 ++++++++--- src/g_game.h | 5 +++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index d9d686d9c..b3d6b1c6d 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2739,7 +2739,7 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason) LUA_InvalidatePlayer(&players[playernum]); // don't look through someone's view who isn't there - G_ResetViews(); + G_ResetViews(false); K_CheckBumpers(); P_CheckRacers(); diff --git a/src/g_demo.c b/src/g_demo.c index 5531f7e6d..ee0e02364 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -1230,7 +1230,7 @@ void G_ReadDemoExtraData(void) break; } - G_ResetViews(); + G_ResetViews(false); // dont reset our freecam pls thx! // maybe these are necessary? K_CheckBumpers(); @@ -2397,7 +2397,7 @@ void G_ConfirmRewind(tic_t rewindtime) displayplayers[2] = olddp3; displayplayers[3] = olddp4; R_ExecuteSetViewSize(); - G_ResetViews(); + G_ResetViews(true); for (i = splitscreen; i >= 0; i--) P_ResetCamera(&players[displayplayers[i]], &camera[i]); diff --git a/src/g_game.c b/src/g_game.c index 2efc2721a..005bc954e 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2316,11 +2316,16 @@ void G_FixCamera(UINT8 view) // Increment a viewpoint by offset from the current player. A negative value // decrements. // -void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive) +void G_AdjustViewEx(UINT8 viewnum, INT32 offset, boolean onlyactive, boolean resetfreecam) { INT32 *displayplayerp, oldview; displayplayerp = &displayplayers[viewnum-1]; oldview = (*displayplayerp); + + // turn off the freecam + if (resetfreecam) + camera[viewnum-1].freecam = false; + G_ResetView(viewnum, ( (*displayplayerp) + offset ), onlyactive); // If no other view could be found, go back to what we had. @@ -2333,7 +2338,7 @@ void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive) // Ensures all viewpoints are valid // Also demotes splitscreen down to one player. // -void G_ResetViews(void) +void G_ResetViews(boolean resetfreecam) { UINT8 splits; UINT8 viewd; @@ -2357,7 +2362,7 @@ void G_ResetViews(void) */ for (viewd = 1; viewd <= splits; ++viewd) { - G_AdjustView(viewd, 0, false); + G_AdjustViewEx(viewd, 0, false, resetfreecam); } } diff --git a/src/g_game.h b/src/g_game.h index 4cebfe969..6a42a0fee 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -226,9 +226,10 @@ INT32 G_FindView(INT32 startview, UINT8 viewnum, boolean onlyactive, boolean rev INT32 G_CountPlayersPotentiallyViewable(boolean active); void G_FixCamera(UINT8 view); -void G_ResetViews(void); +void G_ResetViews(boolean resetfreecam); void G_ResetView(UINT8 viewnum, INT32 playernum, boolean onlyactive); -void G_AdjustView(UINT8 viewnum, INT32 offset, boolean onlyactive); +void G_AdjustViewEx(UINT8 viewnum, INT32 offset, boolean onlyactive, boolean resetfreecam); +#define G_AdjustView(v,o,oa) G_AdjustViewEx(v,o,oa, true) void G_AddPlayer(INT32 playernum, INT32 console);