From f072746216b59659b4e54566634f35b921bca52c Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 10 May 2025 23:42:30 +0200 Subject: [PATCH 01/35] unlock everything when using modkartdata save doesent make too much sense having to unlock everything again when playing mods --- src/g_game.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/g_game.c b/src/g_game.c index 3f36d9862..65c55b542 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -661,6 +661,17 @@ static void G_SetSaveGameModified(void) strcatbf(savegamename, srb2home, PATHSEP); G_LoadGameData(); + + // unlock EVERYTHING. + for (UINT8 i = 0; i < MAXUNLOCKABLES; i++) + { + if (!unlockables[i].conditionset) + continue; + if (!unlockables[i].unlocked) + { + unlockables[i].unlocked = true; + } + } } // for consistency among messages: this modifies the game and removes savemoddata. From 5b8f200e1a916c605d7ef93e67b73ccf86c19ef3 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 14 May 2025 23:18:20 -0400 Subject: [PATCH 02/35] Safeguard respawn next even more --- src/deh_tables.c | 3 +- src/k_kart.c | 100 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index f11c807fa..ed6fde1ee 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -294,8 +294,7 @@ const char *const PLAYERFLAG_LIST[] = { "\x01", "\x01", "\x01", - "\x01", - + "ATTACKDOWN", "SLIDING", NULL // stop loop here. diff --git a/src/k_kart.c b/src/k_kart.c index 2789a4577..edb4d359a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8730,44 +8730,98 @@ static void K_FudgeRespawn(player_t *player, const waypoint_t *const waypoint) void K_SetRespawnAtNextWaypoint(player_t * player) { - mobj_t *currentwaypoint; - mobj_t *safewaypoint; + mobj_t *currentwaypoint = NULL; + mobj_t *safewaypoint = NULL; angle_t respawnangle; + size_t i; - // Safety :P - if (!player->currentwaypoint || !player->nextwaypoint) + + if ((player != NULL) && (player->mo != NULL) && (P_MobjWasRemoved(player->mo) == false)) { - waypoint_t *oopisepoint = K_GetClosestWaypointToMobj(player->mo); + + // Safety :P + if (!player->currentwaypoint || !player->nextwaypoint) + { + waypoint_t *oopisepoint = K_GetBestWaypointForMobj(player->mo, NULL); + + if (!oopisepoint || !oopisepoint->mobj) + { + oopisepoint = K_GetClosestWaypointToMobj(player->mo); + } + + if ((oopisepoint->nextwaypoints != NULL) && (oopisepoint->numnextwaypoints > 0)) + { + for (i = 0; i < oopisepoint->numnextwaypoints; i++) + { + if (!K_GetWaypointIsEnabled(oopisepoint->nextwaypoints[i])) + { + // Waypoint is not enabled. + continue; + } + + if (K_GetWaypointIsShortcut(oopisepoint->nextwaypoints[i])) + { + // Respawning into offroad/tripwire path would suck. + continue; + } + + if (!K_GetWaypointIsSpawnpoint(oopisepoint->nextwaypoints[i])) + { + // We can't spawn at these anyway. + continue; + } + + if (!K_GetWaypointIsFinishline(oopisepoint->nextwaypoints[i])) + { + // Please don't spawn on the other side of the map please. + continue; + } + + if (!oopisepoint->nextwaypoints[i]->mobj) + { + // No mobj? No Dice. + continue; + } + + safewaypoint = oopisepoint->nextwaypoints[i]->mobj; + break; + } + } + + currentwaypoint = player->mo; + CONS_Debug(DBG_GAMELOGIC, M_GetText("Tried to respawn at invalid waypoint! Setting respawn to closest waypoint\n")); + } + else + { + currentwaypoint = player->currentwaypoint->mobj; + safewaypoint = player->nextwaypoint->mobj; + } // Better safe then sorry. - if (!oopisepoint) + if (!safewaypoint) { // Oh shit, oh fuck..... CONS_Alert(CONS_WARNING, M_GetText("Tried to respawn at invalid waypoint!\n")); return; } - currentwaypoint = player->mo; - safewaypoint = oopisepoint->mobj; - CONS_Debug(DBG_GAMELOGIC, M_GetText("Tried to respawn at invalid waypoint! Setting respawn to closest waypoint\n")); + respawnangle = R_PointToAngle2(currentwaypoint->x, currentwaypoint->y, safewaypoint->x, safewaypoint->y); + + player->pflags |= PF_TRUSTWAYPOINTS; + player->starposttime = player->realtime; + player->starpostz = (safewaypoint->spawnpoint->z + 15) >> FRACBITS; + player->starpostflip = (safewaypoint->flags2 & MF2_OBJECTFLIP); + player->starpostangle = respawnangle; + + // Then do x and y + player->starpostx = safewaypoint->x >> FRACBITS; + player->starposty = safewaypoint->y >> FRACBITS; } else { - currentwaypoint = player->currentwaypoint->mobj; - safewaypoint = player->nextwaypoint->mobj; + CONS_Alert(CONS_WARNING, M_GetText("Tried to respawn invalid player or player mobj!\n")); + return; } - - respawnangle = R_PointToAngle2(currentwaypoint->x, currentwaypoint->y, safewaypoint->x, safewaypoint->y); - - player->pflags |= PF_TRUSTWAYPOINTS; - player->starposttime = player->realtime; - player->starpostz = (safewaypoint->spawnpoint->z + 15) >> FRACBITS; - player->starpostflip = (safewaypoint->flags2 & MF2_OBJECTFLIP); - player->starpostangle = respawnangle; - - // Then do x and y - player->starpostx = safewaypoint->x >> FRACBITS; - player->starposty = safewaypoint->y >> FRACBITS; } static boolean K_MobjIsOnLine(mobj_t *const mobj) From 08408831bfc64d22e470aed0e186f97e5ca202a4 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 15 May 2025 11:38:43 -0400 Subject: [PATCH 03/35] the safeguardist of safeguards --- src/d_player.h | 5 ++- src/k_kart.c | 106 ++++++++++++++++++++++++++++++++++++++++--------- src/p_saveg.c | 8 ++++ src/p_user.c | 6 +-- 4 files changed, 102 insertions(+), 23 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 10bb48875..f2de78d0f 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -602,8 +602,9 @@ struct player_t UINT8 startboost; // (0 to 125) - Boost you get from start of race or respawn drop dash // Respawn - UINT8 dropdash; - UINT8 respawn; + UINT8 dropdash; // Gain a burst of speed when you drop while respawning + UINT8 respawn; // Timer given when you die. + UINT8 softlocktimer; // Tracks how fast you died after respawning. Use for softlock prevention. UINT16 flashing; UINT16 spinouttimer; // Spin-out from a banana peel or oil slick (was "pw_bananacam") diff --git a/src/k_kart.c b/src/k_kart.c index edb4d359a..02e2c5257 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2616,6 +2616,7 @@ static void K_RespawnChecker(player_t *player) player->mo->colorized = false; player->dropdash = 0; player->respawn = 0; + player->softlocktimer = 3*TICRATE; } } } @@ -7550,6 +7551,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->checkskip) player->checkskip--; + if (player->softlocktimer) + player->softlocktimer--; + if (player->bigwaypointgap && (player->bigwaypointgap > AUTORESPAWN_THRESHOLD || !P_PlayerInPain(player))) { player->bigwaypointgap--; @@ -8730,15 +8734,19 @@ static void K_FudgeRespawn(player_t *player, const waypoint_t *const waypoint) void K_SetRespawnAtNextWaypoint(player_t * player) { - mobj_t *currentwaypoint = NULL; - mobj_t *safewaypoint = NULL; + waypoint_t *currentwaypoint = NULL; + waypoint_t *safewaypoint = NULL; angle_t respawnangle; size_t i; + if (K_UsingLegacyCheckpoints()) + { + // Woah what are you doing... + return; + } if ((player != NULL) && (player->mo != NULL) && (P_MobjWasRemoved(player->mo) == false)) { - // Safety :P if (!player->currentwaypoint || !player->nextwaypoint) { @@ -8771,30 +8779,70 @@ void K_SetRespawnAtNextWaypoint(player_t * player) continue; } - if (!K_GetWaypointIsFinishline(oopisepoint->nextwaypoints[i])) - { - // Please don't spawn on the other side of the map please. - continue; - } - if (!oopisepoint->nextwaypoints[i]->mobj) { // No mobj? No Dice. continue; } - safewaypoint = oopisepoint->nextwaypoints[i]->mobj; + if (!K_SafeRespawnPosition(oopisepoint->nextwaypoints[i]->mobj)) + { + // This waypoint is not safe. + continue; + } + + if (K_GetWaypointIsFinishline(oopisepoint->nextwaypoints[i])) + { + // Please don't spawn over the line. + currentwaypoint = oopisepoint->nextwaypoints[i]; + break; + } + + safewaypoint = oopisepoint->nextwaypoints[i]; break; } } - currentwaypoint = player->mo; + if ((oopisepoint->prevwaypoints != NULL) && (oopisepoint->numprevwaypoints > 0)) + { + for (i = 0; i < oopisepoint->numprevwaypoints; i++) + { + if (!K_GetWaypointIsEnabled(oopisepoint->prevwaypoints[i])) + { + // Waypoint is not enabled. + continue; + } + + if (K_GetWaypointIsShortcut(oopisepoint->prevwaypoints[i])) + { + // Respawning into offroad/tripwire path would suck. + continue; + } + + if (!K_GetWaypointIsSpawnpoint(oopisepoint->prevwaypoints[i])) + { + // We can't spawn at these anyway. + continue; + } + + if (!oopisepoint->prevwaypoints[i]->mobj) + { + // No mobj? No Dice. + continue; + } + + currentwaypoint = oopisepoint->prevwaypoints[i]; + break; + } + } + + CONS_Debug(DBG_GAMELOGIC, M_GetText("Tried to respawn at invalid waypoint! Setting respawn to closest waypoint\n")); } else { - currentwaypoint = player->currentwaypoint->mobj; - safewaypoint = player->nextwaypoint->mobj; + currentwaypoint = player->currentwaypoint; + safewaypoint = player->nextwaypoint; } // Better safe then sorry. @@ -8805,17 +8853,39 @@ void K_SetRespawnAtNextWaypoint(player_t * player) return; } - respawnangle = R_PointToAngle2(currentwaypoint->x, currentwaypoint->y, safewaypoint->x, safewaypoint->y); + if (!currentwaypoint) + { + respawnangle = R_PointToAngle2(player->mo->x, player->mo->y, safewaypoint->mobj->x, safewaypoint->mobj->y); + } + else + { + respawnangle = R_PointToAngle2(currentwaypoint->mobj->x, currentwaypoint->mobj->y, safewaypoint->mobj->x, safewaypoint->mobj->y); + } + + if (K_GetWaypointIsFinishline(safewaypoint)) + { + // Please don't spawn after the line. + player->pflags |= PF_TRUSTWAYPOINTS; + player->starposttime = player->realtime; + player->starpostz = currentwaypoint->mobj->z >> FRACBITS; + player->starpostflip = (currentwaypoint->mobj->flags2 & MF2_OBJECTFLIP); + player->starpostangle = player->mo->angle; + + // Then do x and y + player->starpostx = currentwaypoint->mobj->x >> FRACBITS; + player->starposty = currentwaypoint->mobj->y >> FRACBITS; + return; + } player->pflags |= PF_TRUSTWAYPOINTS; player->starposttime = player->realtime; - player->starpostz = (safewaypoint->spawnpoint->z + 15) >> FRACBITS; - player->starpostflip = (safewaypoint->flags2 & MF2_OBJECTFLIP); + player->starpostz = safewaypoint->mobj->z >> FRACBITS; + player->starpostflip = (safewaypoint->mobj->flags2 & MF2_OBJECTFLIP); player->starpostangle = respawnangle; // Then do x and y - player->starpostx = safewaypoint->x >> FRACBITS; - player->starposty = safewaypoint->y >> FRACBITS; + player->starpostx = safewaypoint->mobj->x >> FRACBITS; + player->starposty = safewaypoint->mobj->y >> FRACBITS; } else { diff --git a/src/p_saveg.c b/src/p_saveg.c index 305ba5a57..e0b3b41bb 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -244,6 +244,10 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT32(save->p, players[i].airtime); WRITEUINT8(save->p, players[i].startboost); + WRITEUINT8(save->p, players[i].dropdash); + WRITEUINT8(save->p, players[i].respawn); + WRITEUINT8(save->p, players[i].softlocktimer); + WRITEUINT16(save->p, players[i].flashing); WRITEUINT16(save->p, players[i].spinouttimer); WRITEUINT8(save->p, players[i].spinouttype); @@ -567,6 +571,10 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].airtime = READUINT32(save->p); players[i].startboost = READUINT8(save->p); + players[i].dropdash = READUINT8(save->p); + players[i].respawn = READUINT8(save->p); + players[i].softlocktimer = READUINT8(save->p); + players[i].flashing = READUINT16(save->p); players[i].spinouttimer = READUINT16(save->p); players[i].spinouttype = READUINT8(save->p); diff --git a/src/p_user.c b/src/p_user.c index 60be74b7c..b3c51483a 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2504,9 +2504,9 @@ static void P_DeathThink(player_t *player) else player->karthud[khud_timeovercam] = 0; - // Set players next respawn point to the next waypoint - // If they die while still in respawn state for extra safety. - if (player->nextwaypoint && player->respawn > 0) + // If the player dies too fast or dies during respawn... + // Set players next respawn point to the next waypoint for extra safety. + if (player->softlocktimer > 0 || player->respawn > 0) { // Now a clean function! Neat, eh? K_SetRespawnAtNextWaypoint(player); From 378d887a5c16af26d10e0eb8e781fe7f57a3120c Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 15 May 2025 11:42:02 -0400 Subject: [PATCH 04/35] check for null pls --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 02e2c5257..df2a1ecf4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8862,7 +8862,7 @@ void K_SetRespawnAtNextWaypoint(player_t * player) respawnangle = R_PointToAngle2(currentwaypoint->mobj->x, currentwaypoint->mobj->y, safewaypoint->mobj->x, safewaypoint->mobj->y); } - if (K_GetWaypointIsFinishline(safewaypoint)) + if (currentwaypoint && K_GetWaypointIsFinishline(safewaypoint)) { // Please don't spawn after the line. player->pflags |= PF_TRUSTWAYPOINTS; From 4e42d1ac754904f778a123e4abeb8043985e76bd Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 15 May 2025 11:57:45 -0400 Subject: [PATCH 05/35] Ensure good respawn angle from fallback --- src/k_kart.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index df2a1ecf4..ea8959cfc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8794,7 +8794,7 @@ void K_SetRespawnAtNextWaypoint(player_t * player) if (K_GetWaypointIsFinishline(oopisepoint->nextwaypoints[i])) { // Please don't spawn over the line. - currentwaypoint = oopisepoint->nextwaypoints[i]; + safewaypoint = oopisepoint->nextwaypoints[i]; break; } @@ -8803,6 +8803,8 @@ void K_SetRespawnAtNextWaypoint(player_t * player) } } + oopisepoint = safewaypoint; + if ((oopisepoint->prevwaypoints != NULL) && (oopisepoint->numprevwaypoints > 0)) { for (i = 0; i < oopisepoint->numprevwaypoints; i++) From 3163dcf9c4afa17fd51fe92cb1a26daff2bcea6c Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 15 May 2025 14:35:46 -0400 Subject: [PATCH 06/35] Remove bird window shake sorry jartha --- src/d_main.cpp | 2 -- src/doomstat.h | 2 -- src/i_system.h | 2 -- src/p_local.h | 1 - src/p_tick.c | 2 -- src/p_user.c | 1 - src/r_main.cpp | 1 - src/sdl/i_system.cpp | 6 ------ src/sdl/i_video.cpp | 3 --- 9 files changed, 20 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 0a9b105d5..bc3a163f6 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -117,8 +117,6 @@ int SUBVERSION; // platform independant focus loss UINT8 window_notinfocus = false; -INT32 window_x; -INT32 window_y; // // DEMO LOOP diff --git a/src/doomstat.h b/src/doomstat.h index 1d2e0d785..26920a9f4 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -173,8 +173,6 @@ extern boolean digital_disabled; extern UINT8 paused; // Game paused? extern UINT8 window_notinfocus; // are we in focus? (backend independant -- handles auto pausing and display of "focus lost" message) -extern INT32 window_x; -extern INT32 window_y; extern boolean nodrawers; extern boolean noblit; diff --git a/src/i_system.h b/src/i_system.h index 028132178..3624fbb03 100644 --- a/src/i_system.h +++ b/src/i_system.h @@ -328,8 +328,6 @@ const char *I_ClipboardPaste(void); void I_RegisterSysCommands(void); -void I_CursedWindowMovement(int xd, int yd); - #ifdef __cplusplus } // extern "C" #endif diff --git a/src/p_local.h b/src/p_local.h index 6f6d64594..f7e4f8285 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -159,7 +159,6 @@ extern consvar_t cv_cam_speed[MAXSPLITSCREENPLAYERS], cv_cam_rotate[MAXSPLITSCRE extern consvar_t cv_tilting; extern consvar_t cv_actionmovie; -extern consvar_t cv_windowquake; extern fixed_t t_cam_dist[MAXSPLITSCREENPLAYERS], t_cam_height[MAXSPLITSCREENPLAYERS], t_cam_rotate[MAXSPLITSCREENPLAYERS]; diff --git a/src/p_tick.c b/src/p_tick.c index a845e5da7..47efc765a 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -862,8 +862,6 @@ void P_Ticker(boolean run) quake.x = M_RandomRange(-ir,ir); quake.y = M_RandomRange(-ir,ir); quake.z = M_RandomRange(-ir,ir); - if (cv_windowquake.value) - I_CursedWindowMovement(FixedInt(quake.x), FixedInt(quake.y)); --quake.time; } else diff --git a/src/p_user.c b/src/p_user.c index b3c51483a..1ca792ccf 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2644,7 +2644,6 @@ consvar_t cv_cam_rotate[MAXSPLITSCREENPLAYERS] = { consvar_t cv_tilting = CVAR_INIT ("tilting", "On", CV_SAVE, CV_OnOff, NULL); consvar_t cv_actionmovie = CVAR_INIT ("actionmovie", "On", CV_SAVE, CV_OnOff, NULL); -consvar_t cv_windowquake = CVAR_INIT ("windowquake", "Off", CV_SAVE, CV_OnOff, NULL); fixed_t t_cam_dist[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42}; fixed_t t_cam_height[MAXSPLITSCREENPLAYERS] = {-42,-42,-42,-42}; diff --git a/src/r_main.cpp b/src/r_main.cpp index 322c708b8..89f1a2276 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -1835,7 +1835,6 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_tilting); CV_RegisterVar(&cv_actionmovie); - CV_RegisterVar(&cv_windowquake); CV_RegisterVar(&cv_sloperoll); CV_RegisterVar(&cv_showhud); diff --git a/src/sdl/i_system.cpp b/src/sdl/i_system.cpp index 7f73ba17a..d26831bb1 100644 --- a/src/sdl/i_system.cpp +++ b/src/sdl/i_system.cpp @@ -1056,12 +1056,6 @@ INT32 I_GetKey (void) return rc; } -void -I_CursedWindowMovement (int xd, int yd) -{ - SDL_SetWindowPosition(window, window_x + xd, window_y + yd); -} - // // I_JoyScale // diff --git a/src/sdl/i_video.cpp b/src/sdl/i_video.cpp index 904e533f2..ee60a1068 100644 --- a/src/sdl/i_video.cpp +++ b/src/sdl/i_video.cpp @@ -600,9 +600,6 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt) break; case SDL_WINDOWEVENT_MAXIMIZED: break; - case SDL_WINDOWEVENT_MOVED: - window_x = evt.data1; - window_y = evt.data2; } if (FOCUSUNION == oldfocus) // No state change From 2eaaf088de54a38f741edcc1cc64ad690fd56984 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 15 May 2025 15:15:29 -0400 Subject: [PATCH 07/35] Bananas dont make you scream --- src/p_inter.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index edb5ad082..d9ff7d555 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2088,6 +2088,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player_t *player; boolean force = false; boolean spbpop = false; + boolean trapitem = false; if (objectplacing) return false; @@ -2360,7 +2361,25 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da P_PlayerRingBurst(player, ringburst); } - K_PlayPainSound(target, source); + if (inflictor) + { + switch(inflictor->type) + { + case MT_BANANA: + case MT_BANANA_SHIELD: + trapitem = true; + break; + + default: + break; + } + } + + if (!trapitem) + { + // Bananas don't make you scream. + K_PlayPainSound(target, source); + } if ((explosioncombo == true) || (cv_kartdebughuddrop.value && !modeattacking)) { From 61e7d86d7833bac49e7d53f58e025a34b8fd6f9a Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 15 May 2025 19:27:18 -0400 Subject: [PATCH 08/35] Instashield on Clash --- src/k_collide.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/k_collide.c b/src/k_collide.c index 447f5eb40..5aa6c2f5a 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -700,6 +700,8 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) if ((t1Condition == true || flameT1 == true) && (t2Condition == true || flameT2 == true)) { + K_DoInstashield(t1->player); + K_DoInstashield(t2->player); return false; } else if (t1Condition == true && t2Condition == false) From 9c164ce4384769ed4d37c73e0a62868535fb19a0 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 15 May 2025 20:56:51 -0400 Subject: [PATCH 09/35] Use CEP itemoddscale code for 32p shit later --- src/k_kart.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ea8959cfc..ff09aaf9e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -611,7 +611,13 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem) fixed_t K_ItemOddsScale(UINT8 numPlayers, boolean spbrush) { + // CEP: due to how baseplayer works, 17P+ lobbies will STILL have the disastrous odds of 0.22 prior, if not WORSE + // let's try adding another condition + const UINT8 basePlayer = 8; // The player count we design most of the game around. + const UINT8 vanillaMax = 17; // CEP: Maximum players in "vanilla" (non-30P) clients. + const UINT8 extPlayer = 24; // CEP: Cap for 17P+ so that odds don't get too muddled. + UINT8 playerCount = (spbrush ? 2 : numPlayers); fixed_t playerScaling = 0; @@ -627,8 +633,22 @@ fixed_t K_ItemOddsScale(UINT8 numPlayers, boolean spbrush) else if (playerCount > basePlayer) { // More than basePlayer: reduce odds slightly. - // 16P: x0.75 - playerScaling = (basePlayer - playerCount) * (FRACUNIT / 32); + + // CEP: 17P+ adjustments + if (playerCount < vanillaMax) + { + // Less than vanillaMax: Use standard calculations. + // 16P: x0.6 + playerScaling = (basePlayer - playerCount) * (FRACUNIT / 20); + + } + else if (playerCount > vanillaMax) + { + // More than vanillaMax: Increase odds to fit with the increased playercount + // 24P: x0.6 + // 30P: x0.45 + playerScaling = (basePlayer - min(extPlayer, playerCount)) * (FRACUNIT / 40); // adding a cap here to be sure + } } return playerScaling; From ab6962e05b765d45bf94b37ba059019892fff4af Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 15 May 2025 21:08:16 -0400 Subject: [PATCH 10/35] Update hash for 1st map patch --- src/d_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index bc3a163f6..79e4f9e97 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -81,7 +81,7 @@ #include // Put hashes here to get them out of header hell. -#define ASSET_HASH_MAIN_PK3 0x6be3d5a671916bcb +#define ASSET_HASH_MAIN_PK3 0x803483fc74253682 #define ASSET_HASH_SRB2_SRB 0xf3ec1ea4d0eca4a9 #define ASSET_HASH_GFX_KART 0xc91b0d43f5ba131f #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 From 575c6551ea52460bed0c6ab544f9f87a7df5dd56 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Fri, 16 May 2025 08:35:44 -0400 Subject: [PATCH 11/35] Add mappatch.pk3, Allow patches to remove existing mapthings. --- README.md | 4 ++-- src/d_main.cpp | 6 +++++- src/d_main.h | 8 +++++--- src/d_netfil.c | 7 ++++--- src/doomdata.h | 1 + src/p_setup.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 67 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 07fc8d83f..dfea1128c 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,8 @@ make -j$(nproc) ## How to install - Obtain an executable - Grab the assets from the [blankart-assets repo](https://codeberg.org/NepDisk/blankart-assets) -- Compile the pk3 by running buildmainpk3.bat on windows or buildmainpk3.sh on *nix. -- Copy the generated pk3 into the folder `out/` and your compiled executable into a folder with the [SRB2Kart 1.6 assets](https://github.com/STJr/Kart-Public/releases/download/v1.6/AssetsLinuxOnly.zip) (such as an existing install). +- Compile the pk3s by running buildall.bat on windows or buildall.sh on *nix. +- Copy the generated pk3s from the folder `out/` and your compiled executable into a folder with the [SRB2Kart 1.6 assets](https://github.com/STJr/Kart-Public/releases/download/v1.6/AssetsLinuxOnly.zip) (such as an existing install). # Disclaimer BlanKart is in no way affiliated with Kart Krew Dev or Sonic Team Jr. This is just a project meant for fun. If you have any issues report to us not them. diff --git a/src/d_main.cpp b/src/d_main.cpp index 79e4f9e97..9da56e004 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -81,12 +81,13 @@ #include // Put hashes here to get them out of header hell. -#define ASSET_HASH_MAIN_PK3 0x803483fc74253682 #define ASSET_HASH_SRB2_SRB 0xf3ec1ea4d0eca4a9 #define ASSET_HASH_GFX_KART 0xc91b0d43f5ba131f #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 +#define ASSET_HASH_MAIN_PK3 0x803483fc74253682 +#define ASSET_HASH_MAPPATCH_PK3 0x16726c0303d699fb #ifdef USE_PATCH_FILE #define ASSET_HASH_PATCH_PK3 0x0000000000000000 #endif @@ -1199,6 +1200,7 @@ static void IdentifyVersion(void) D_AddFile(startupiwads, va(pandf,srb2waddir,CHARSNAME)); D_AddFile(startupiwads, va(pandf,srb2waddir,MAPSNAME)); D_AddFile(startupiwads, va(pandf,srb2waddir,MAINNAME)); + D_AddFile(startupiwads, va(pandf,srb2waddir,MAPPATCHNAME)); #ifdef USE_PATCH_FILE D_AddFile(startupiwads, va(pandf,srb2waddir,PATCHNAME)); #endif @@ -1489,6 +1491,7 @@ void D_SRB2Main(void) W_VerifyFileHash(MAINWAD_CHARS, ASSET_HASH_CHARS_KART); W_VerifyFileHash(MAINWAD_MAPS, ASSET_HASH_MAPS_KART); W_VerifyFileHash(MAINWAD_MAIN, ASSET_HASH_MAIN_PK3); + W_VerifyFileHash(MAINWAD_MAPPATCH, ASSET_HASH_MAPPATCH_PK3); #ifdef USE_PATCH_FILE W_VerifyFileHash(MAINWAD_PATCH, ASSET_HASH_PATCH_PK3); #endif @@ -1500,6 +1503,7 @@ void D_SRB2Main(void) wadfiles[MAINWAD_CHARS]->compatmode = true; wadfiles[MAINWAD_MAPS]->compatmode = true; wadfiles[MAINWAD_MAIN]->compatmode = false; + wadfiles[MAINWAD_MAPPATCH]->compatmode = false; #ifdef USE_PATCH_FILE wadfiles[MAINWAD_PATCH]->compatmode = false; #endif diff --git a/src/d_main.h b/src/d_main.h index de7a9356f..69f5459b7 100644 --- a/src/d_main.h +++ b/src/d_main.h @@ -22,14 +22,15 @@ extern "C" { #endif // Store file nameres here for future reference else where. -#define MAINNAME "main.pk3" #define SRB2NAME "srb2.srb" +#define GRAPHICSNAME "gfx.kart" #define TEXTURESNAME "textures.kart" +#define CHARSNAME "chars.kart" #define MAPSNAME "maps.kart" +#define MAINNAME "main.pk3" +#define MAPPATCHNAME "mappatch.pk3" #define PATCHNAME "patch.pk3" #define MUSICNAME "music.kart" -#define CHARSNAME "chars.kart" -#define GRAPHICSNAME "gfx.kart" #define SOUNDSNAME "sounds.kart" typedef enum @@ -40,6 +41,7 @@ typedef enum MAINWAD_CHARS, MAINWAD_MAPS, MAINWAD_MAIN, + MAINWAD_MAPPATCH, #ifdef USE_PATCH_FILE MAINWAD_PATCH, #endif diff --git a/src/d_netfil.c b/src/d_netfil.c index f6ff1f830..d9d9be166 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -1402,18 +1402,19 @@ void PT_FileFragment(void) filename = va("%s", file->filename); nameonly(filename); - if (!strcmp(filename, MAINNAME) - || !strcmp(filename, SRB2NAME) + if (!strcmp(filename, SRB2NAME) || !strcmp(filename, GRAPHICSNAME) || !strcmp(filename, TEXTURESNAME) || !strcmp(filename, CHARSNAME) || !strcmp(filename, MAPSNAME) + || !strcmp(filename, MAINNAME) + || !strcmp(filename, MAPPATCHNAME) || !strcmp(filename, PATCHNAME) || !strcmp(filename, SOUNDSNAME) || !strcmp(filename, MUSICNAME) ) { - I_Error("Tried to download \"%s\"", filename); + I_Error("Tried to download base-game file: \"%s\"", filename); } filename = file->filename; diff --git a/src/doomdata.h b/src/doomdata.h index 2ce1f97ce..41377ed83 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -280,6 +280,7 @@ struct mapthing_t UINT8 layer; // FOF layer to spawn on, see P_GetMobjSpawnHeight mapUserProperties_t user; // UDMF user-defined custom properties. mobj_t *mobj; + boolean patch; }; #define ZSHIFT 4 diff --git a/src/p_setup.c b/src/p_setup.c index 127891d12..b029536ba 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -137,6 +137,7 @@ node_t *nodes; line_t *lines; side_t *sides; mapthing_t *mapthings; +static boolean basemaptyperemoval[4097]; sector_t *spawnsectors; line_t *spawnlines; side_t *spawnsides; @@ -815,6 +816,10 @@ static void P_SpawnMapThings(boolean spawnemblems) if (!spawnemblems && mt->type == mobjinfo[MT_EMBLEM].doomednum) continue; + // Don't spawn non-patch objects of this type if they are uneeded + if (mt->patch == false && basemaptyperemoval[mt->type] == true) + continue; + mt->mobj = NULL; if (mt->type == mobjinfo[MT_LOOPENDPOINT].doomednum) @@ -1413,6 +1418,7 @@ static void P_LoadThings(UINT8 *data) memset(mt->script_stringargs, 0x00, NUM_SCRIPT_STRINGARGS*sizeof(*mt->script_stringargs)); mt->pitch = mt->roll = 0; mt->layer = 0; + mt->patch = false; mt->type &= 4095; @@ -1545,6 +1551,39 @@ static boolean TextmapCount(size_t size, boolean patch) CONS_Alert(CONS_WARNING, "This map patch is not compatible with the current map (checksum: " HASHFMT "). The patch may not work.\n", maphash); } + // check for things to remove from the base map + if (patch) + { + tkn = M_TokenizerRead(0); + if (fastcmp(tkn, "basemaptyperemoval")) + { + tkn = M_TokenizerRead(0); + const char *typestr = tkn; + char *typetoken = strtok(typestr, " | "); + int i; + + // check for types separated by pipes + // e.g. 300|2001|2004 + while (typetoken != NULL) + { + i = atoi(typetoken); + + if (i && !(i > 4096 || i < 0)) + { + // Set type to removed. + basemaptyperemoval[i] = true; + CONS_Debug(DBG_SETUP,"Ignoring base mapthing type %d for patch\n", i); + } + else + { + CONS_Alert(CONS_ERROR, "Invalid mapthing type supplied for base mapthing removal.\n"); + } + + typetoken = strtok(NULL, " | "); + } + } + } + nummapthings = 0; if (!patch) { @@ -3294,7 +3333,14 @@ static void P_LoadTextmap(boolean patch) 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"); + if (!patch) + { + 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"); + } + else + { + CONS_Alert(CONS_NOTICE, "Patching current map.\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 @@ -3477,6 +3523,7 @@ static void P_LoadTextmap(boolean patch) memset(mt->script_stringargs, 0x00, NUM_SCRIPT_STRINGARGS*sizeof(*mt->script_stringargs)); mt->layer = 0; mt->mobj = NULL; + mt->patch = patch; K_UserPropertiesClear(&mt->user); @@ -8739,6 +8786,8 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) P_InitSlopes(); //Initialize slopes before the map loads. + memset(basemaptyperemoval, 0, 4097*sizeof(boolean)); + if (!P_LoadMapFromFile()) { TracyCZoneEnd(__zone); From bf4e879c82a6b17d755ec6815fb5a7d1a16bc6af Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 17 May 2025 07:27:02 -0400 Subject: [PATCH 12/35] Update hash --- src/d_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 9da56e004..bc2da83ff 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -86,7 +86,7 @@ #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 -#define ASSET_HASH_MAIN_PK3 0x803483fc74253682 +#define ASSET_HASH_MAIN_PK3 0x170fe375ef908e0c #define ASSET_HASH_MAPPATCH_PK3 0x16726c0303d699fb #ifdef USE_PATCH_FILE #define ASSET_HASH_PATCH_PK3 0x0000000000000000 From ff2f058972dc09633236e30b0ade93c137f574f8 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 17 May 2025 12:46:37 -0400 Subject: [PATCH 13/35] refactor giveitem and port other RR cheats. --- src/d_netcmd.c | 255 ++++++++++++++++++++++++++++++------------------- src/d_netcmd.h | 17 ++-- src/d_player.h | 1 + src/k_kart.c | 13 ++- src/m_cheat.c | 42 +++++++- src/m_cheat.h | 7 ++ src/p_saveg.c | 2 + 7 files changed, 225 insertions(+), 112 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index f0f6eea77..20eadd721 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -87,7 +87,6 @@ static void Got_ExitLevelcmd(UINT8 **cp, INT32 playernum); static void Got_SetupVotecmd(UINT8 **cp, INT32 playernum); static void Got_ModifyVotecmd(UINT8 **cp, INT32 playernum); static void Got_PickVotecmd(UINT8 **cp, INT32 playernum); -static void Got_GiveItemcmd(UINT8 **cp, INT32 playernum); static void Got_RequestAddfilecmd(UINT8 **cp, INT32 playernum); static void Got_Addfilecmd(UINT8 **cp, INT32 playernum); static void Got_Pause(UINT8 **cp, INT32 playernum); @@ -518,7 +517,6 @@ consvar_t cv_kartdebugamount = CVAR_INIT ("kartdebugamount", "1", CV_NETVAR|CV_C #else #define VALUE "No" #endif -consvar_t cv_kartallowgiveitem = CVAR_INIT ("kartallowgiveitem", VALUE, CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_YesNo, NULL); #undef VALUE consvar_t cv_kartdebugdistribution = CVAR_INIT ("kartdebugdistribution", "Off", CV_NETVAR|CV_CHEAT|CV_NOSHOWHELP, CV_OnOff, NULL); @@ -695,7 +693,6 @@ const char *netxcmdnames[MAXNETXCMD - 1] = "ACCEPTPARTYINVITE", // XD_ACCEPTPARTYINVITE "LEAVEPARTY", // XD_LEAVEPARTY "CANCELPARTYINVITE", // XD_CANCELPARTYINVITE - "GIVEITEM", // XD_GIVEITEM "ADDBOT", // XD_ADDBOT "DISCORD", // XD_DISCORD "PLAYSOUND", // XD_PLAYSOUND @@ -755,8 +752,6 @@ void D_RegisterServerCommands(void) RegisterNetXCmd(XD_MODIFYVOTE, Got_ModifyVotecmd); RegisterNetXCmd(XD_PICKVOTE, Got_PickVotecmd); - RegisterNetXCmd(XD_GIVEITEM, Got_GiveItemcmd); - RegisterNetXCmd(XD_SCHEDULETASK, Got_ScheduleTaskcmd); RegisterNetXCmd(XD_SCHEDULECLEAR, Got_ScheduleClearcmd); RegisterNetXCmd(XD_AUTOMATE, Got_Automatecmd); @@ -1193,15 +1188,18 @@ void D_RegisterClientCommands(void) COM_AddCommand("god", Command_CheatGod_f); COM_AddCommand("setrings", Command_Setrings_f); COM_AddCommand("setlives", Command_Setlives_f); + COM_AddCommand("setscore", Command_Setscore_f); COM_AddCommand("devmode", Command_Devmode_f); COM_AddCommand("savecheckpoint", Command_Savecheckpoint_f); COM_AddCommand("scale", Command_Scale_f); COM_AddCommand("gravflip", Command_Gravflip_f); COM_AddCommand("hurtme", Command_Hurtme_f); + COM_AddCommand("ateleport", Command_ATeleport_f); COM_AddCommand("teleport", Command_Teleport_f); COM_AddCommand("rteleport", Command_RTeleport_f); COM_AddCommand("skynum", Command_Skynum_f); COM_AddCommand("weather", Command_Weather_f); + COM_AddCommand("angle", Command_Angle_f); CV_RegisterVar(&cv_renderhitbox); CV_RegisterVar(&cv_showgremlins); @@ -2121,6 +2119,24 @@ void D_Cheat(INT32 playernum, INT32 cheat, ...) return; } + if (demo.playback && cheat == CHEAT_DEVMODE) + { + // There is no networking in demos, but devmode is + // too useful to be inaccessible! + // TODO: maybe allow everything, even though it would + // desync replays? May be useful for debugging. + va_start(ap, cheat); + cht_debug = va_arg(ap, UINT32); + va_end(ap); + return; + } + + // sanity check + if (demo.playback) + { + return; + } + WRITEUINT8(p, playernum); WRITEUINT8(p, cheat); @@ -2151,6 +2167,7 @@ void D_Cheat(INT32 playernum, INT32 cheat, ...) break; case CHEAT_RELATIVE_TELEPORT: + case CHEAT_TELEPORT: COPY(WRITEFIXED, fixed_t); COPY(WRITEFIXED, fixed_t); COPY(WRITEFIXED, fixed_t); @@ -2159,6 +2176,20 @@ void D_Cheat(INT32 playernum, INT32 cheat, ...) case CHEAT_DEVMODE: COPY(WRITEUINT32, UINT32); break; + + case CHEAT_GIVEITEM: + COPY(WRITESINT8, int); + COPY(WRITEUINT8, unsigned int); + break; + + case CHEAT_SCORE: + COPY(WRITEUINT32, UINT32); + break; + + case CHEAT_ANGLE: + COPY(WRITEANGLE, angle_t); + break; + } #undef COPY @@ -5547,34 +5578,6 @@ static void Got_PickVotecmd(UINT8 **cp, INT32 playernum) Y_SetupVoteFinish(pick, level); } -static void Got_GiveItemcmd(UINT8 **cp, INT32 playernum) -{ - int item; - int amt; - - item = READSINT8 (*cp); - amt = READUINT8 (*cp); - - if ( - ( netgame && ! cv_kartallowgiveitem.value ) || - ( item < KITEM_SAD || item >= NUMKARTITEMS ) - ) - { - CONS_Alert(CONS_WARNING, - M_GetText ("Illegal give item received from %s\n"), - player_names[playernum]); - if (server) - SendKick(playernum, KICK_MSG_CON_FAIL); - return; - } - - K_StripItems(&players[playernum]); - players[playernum].itemroulette = KROULETTE_DISABLED; - - players[playernum].itemtype = item; - players[playernum].itemamount = amt; -} - static void Got_ScheduleTaskcmd(UINT8 **cp, INT32 playernum) { char command[MAXTEXTCMD]; @@ -5704,10 +5707,12 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum) if (!P_MobjWasRemoved(player->mo)) { player->mo->flags ^= MF_NOCLIP; + player->noclip = true; if (!(player->mo->flags & MF_NOCLIP)) { status = "off"; + player->noclip = false; } } @@ -5801,7 +5806,8 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum) break; } - case CHEAT_RELATIVE_TELEPORT: { + case CHEAT_RELATIVE_TELEPORT: + case CHEAT_TELEPORT: { fixed_t x = READFIXED(*cp); fixed_t y = READFIXED(*cp); fixed_t z = READFIXED(*cp); @@ -5816,12 +5822,22 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum) if (!P_MobjWasRemoved(player->mo)) { P_MapStart(); - P_SetOrigin(player->mo, - player->mo->x + x, - player->mo->y + y, - player->mo->z + z); + if (cheat == CHEAT_RELATIVE_TELEPORT) + { + P_SetOrigin(player->mo, + player->mo->x + x, + player->mo->y + y, + player->mo->z + z); + } + else + { + P_SetOrigin(player->mo, x, y, z); + } P_MapEnd(); + player->pflags |= PF_TRUSTWAYPOINTS; + player->bigwaypointgap = 0; + S_StartSound(player->mo, sfx_mixup); } @@ -5829,7 +5845,10 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum) strlcpy(t[1], M_Ftrim(f[1]), sizeof t[1]); strlcpy(t[2], M_Ftrim(f[2]), sizeof t[2]); - CV_CheaterWarning(targetPlayer, va("relative teleport by %d%s, %d%s, %d%s", + CV_CheaterWarning(targetPlayer, va("%s %d%s, %d%s, %d%s", + cheat == CHEAT_RELATIVE_TELEPORT + ? "relative teleport by" + : "teleport to", (int)f[0], t[0], (int)f[1], t[1], (int)f[2], t[2])); break; } @@ -5841,6 +5860,54 @@ static void Got_Cheat(UINT8 **cp, INT32 playernum) break; } + case CHEAT_GIVEITEM: { + SINT8 item = READSINT8(*cp); + UINT8 amt = READUINT8(*cp); + + item = max(item, KITEM_SAD); + item = min(item, NUMKARTITEMS - 1); + + K_StripItems(player); + + // Cancel roulette if rolling + player->itemroulette = KROULETTE_DISABLED; + + player->itemtype = item; + player->itemamount = amt; + + if (amt == 0) + { + CV_CheaterWarning(playernum, "delete my items"); + } + else + { + // FIXME: we should have actual KITEM_ name array + const char *itemname = cv_kartdebugitem.PossibleValue[1 + item].strvalue; + + CV_CheaterWarning(playernum, va("give item %s x%d", itemname, amt)); + } + break; + } + + case CHEAT_SCORE: { + UINT32 score = READUINT32(*cp); + + player->roundscore = score; + + CV_CheaterWarning(targetPlayer, va("score = %u", score)); + break; + } + + case CHEAT_ANGLE: { + angle_t angle = READANGLE(*cp); + float anglef = FIXED_TO_FLOAT(AngleFixed(angle)); + + P_SetPlayerAngle(player, angle); + + CV_CheaterWarning(targetPlayer, va("angle = %d%s", (int)anglef, M_Ftrim(anglef))); + break; + } + case NUMBER_OF_CHEATS: break; } @@ -6080,77 +6147,73 @@ static void Command_Archivetest_f(void) } #endif -/** Give yourself an, optional quantity or one of, an item. - * - * \sa cv_kartallowgiveitem -*/ +/** Give yourself an, optional quantity or one of, an item.**/ + static void Command_KartGiveItem_f(void) { - char buf[2]; + UINT8 localplayer = g_localplayers[consoleplayer]; int ac; const char *name; - int item; + INT32 item; const char * str; int i; - /* Allow always in local games. */ - if (! netgame || cv_kartallowgiveitem.value) + ac = COM_Argc(); + if (ac < 2) { - ac = COM_Argc(); - if (ac < 2) - { - CONS_Printf( -"kartgiveitem [amount]: Give yourself an item\n" - ); - } - else - { - item = NUMKARTITEMS; - - name = COM_Argv(1); - - if (isdigit(*name) || *name == '-') - { - item = atoi(name); - } - else - { - for (i = 0; ( str = kartdebugitem_cons_t[i].strvalue ); ++i) - { - if (strcasecmp(name, str) == 0) - { - item = kartdebugitem_cons_t[i].value; - break; - } - } - } - - if (item < NUMKARTITEMS) - { - buf[0] = item; - - if (ac > 2) - buf[1] = atoi(COM_Argv(2)); - else - buf[1] = 1;/* default to one quantity */ - - SendNetXCmd(XD_GIVEITEM, buf, 2); - } - else - { - CONS_Alert(CONS_WARNING, - "No item matches '%s'\n", - name); - } - } + CONS_Printf( + "give [amount]: Give yourself an item\n" + ); } else { - CONS_Alert(CONS_NOTICE, - "The server does not allow this.\n"); + item = NUMKARTITEMS; + + name = COM_Argv(1); + + if (isdigit(*name) || *name == '-') + { + item = atoi(name); + } + else + { + /* first check exact match */ + if (!CV_CompleteValue(&cv_kartdebugitem, &name, &item)) + { + CONS_Printf("\x83" "Autocomplete:\n"); + + /* then do very loose partial matching */ + for (i = 0; ( str = kartdebugitem_cons_t[i].strvalue ); ++i) + { + if (strcasestr(str, name) != NULL) + { + CONS_Printf("\x83\t%s\n", str); + item = kartdebugitem_cons_t[i].value; + } + } + } + } + + if (item < NUMKARTITEMS) + { + INT32 amt; + + if (ac > 2) + amt = atoi(COM_Argv(2)); + else + amt = (item != KITEM_NONE);/* default to one quantity, or zero, if KITEM_NONE */ + + D_Cheat(localplayer, CHEAT_GIVEITEM, item, amt); + } + else + { + CONS_Alert(CONS_WARNING, + "No item matches '%s'\n", + name); + } } } diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 43761bd3b..e23549def 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -171,7 +171,7 @@ extern consvar_t cv_kartslipdash; extern consvar_t cv_votetime; -extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartallowgiveitem, cv_kartdebugdistribution, cv_kartdebughuddrop; +extern consvar_t cv_kartdebugitem, cv_kartdebugamount, cv_kartdebugdistribution, cv_kartdebughuddrop; extern consvar_t cv_kartdebugcheckpoint, cv_kartdebugnodes, cv_kartdebugcolorize, cv_kartdebugdirector; extern consvar_t cv_kartdebugwaypoints, cv_kartdebuglap,cv_kartdebugbotpredict; @@ -249,14 +249,13 @@ typedef enum XD_ACCEPTPARTYINVITE, // 29 XD_LEAVEPARTY, // 30 XD_CANCELPARTYINVITE, // 31 - XD_GIVEITEM, // 32 - XD_ADDBOT, // 33 - XD_DISCORD, // 34 - XD_PLAYSOUND, // 35 - XD_SCHEDULETASK, // 36 - XD_SCHEDULECLEAR, // 37 - XD_AUTOMATE, // 38 - XD_CHEAT, // 39 + XD_ADDBOT, // 32 + XD_DISCORD, // 33 + XD_PLAYSOUND, // 34 + XD_SCHEDULETASK, // 35 + XD_SCHEDULECLEAR, // 36 + XD_AUTOMATE, // 37 + XD_CHEAT, // 38 MAXNETXCMD } netxcmd_t; diff --git a/src/d_player.h b/src/d_player.h index f2de78d0f..73b6550d4 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -612,6 +612,7 @@ struct player_t UINT8 instashield; // Instashield no-damage animation timer UINT8 wipeoutslow; // Timer before you slowdown when getting wiped out UINT8 justbumped; // Prevent players from endlessly bumping into each other + boolean noclip; // Fix Grow breaking the "noclip" cheat. Also applies noclip as a bonus. SINT8 drift; // (-5 to 5) - Drifting Left or Right, plus a bigger counter = sharper turn fixed_t driftcharge; // Charge your drift so you can release a burst of speed diff --git a/src/k_kart.c b/src/k_kart.c index ff09aaf9e..d836564ca 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -261,7 +261,6 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartdebugitem); CV_RegisterVar(&cv_kartdebugamount); - CV_RegisterVar(&cv_kartallowgiveitem); CV_RegisterVar(&cv_kartdebugdistribution); CV_RegisterVar(&cv_kartdebughuddrop); CV_RegisterVar(&cv_kartdebugwaypoints); @@ -7801,7 +7800,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // If a Grow player or a sector crushes you, get flattened instead of being killed. if (player->squishedtimer <= 0) { - player->mo->flags &= ~MF_NOCLIP; + if (!player->noclip) + { + // le no clipping cheat. + player->mo->flags &= ~MF_NOCLIP; + } } else { @@ -7810,6 +7813,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->mo->momy = 0; } + if (player->noclip) + { + // Might as well make it apply this as well. + player->mo->flags |= MF_NOCLIP; + } + if ((player->mo->eflags & MFE_UNDERWATER) && player->curshield != KSHIELD_BUBBLE) { if (player->breathTimer < UINT16_MAX) diff --git a/src/m_cheat.c b/src/m_cheat.c index 9830ebcec..60e0bd807 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -354,7 +354,7 @@ void Command_RTeleport_f(void) FLOAT_TO_FIXED(x), FLOAT_TO_FIXED(y), FLOAT_TO_FIXED(z)); } -void Command_Teleport_f(void) +void Command_ATeleport_f(void) { fixed_t intx, inty, intz; size_t i; @@ -575,6 +575,25 @@ void Command_Teleport_f(void) P_MapEnd(); } +void Command_Teleport_f(void) +{ + float x = atof(COM_Argv(1)); + float y = atof(COM_Argv(2)); + float z = atof(COM_Argv(3)); + + REQUIRE_DEVMODE; + REQUIRE_INLEVEL; + + if (COM_Argc() != 4) + { + CONS_Printf(M_GetText("teleport : teleport to a location\n")); + return; + } + + D_Cheat(consoleplayer, CHEAT_TELEPORT, + FLOAT_TO_FIXED(x), FLOAT_TO_FIXED(y), FLOAT_TO_FIXED(z)); +} + void Command_Skynum_f(void) { REQUIRE_DEVMODE; @@ -782,8 +801,6 @@ void Command_Devmode_f(void) void Command_Setrings_f(void) { REQUIRE_INLEVEL; - REQUIRE_SINGLEPLAYER; - REQUIRE_PANDORA; D_Cheat(consoleplayer, CHEAT_RINGS, atoi(COM_Argv(1))); } @@ -791,12 +808,27 @@ void Command_Setrings_f(void) void Command_Setlives_f(void) { REQUIRE_INLEVEL; - REQUIRE_SINGLEPLAYER; - REQUIRE_PANDORA; D_Cheat(consoleplayer, CHEAT_LIVES, atoi(COM_Argv(1))); } +void Command_Setscore_f(void) +{ + REQUIRE_INLEVEL; + + D_Cheat(consoleplayer, CHEAT_SCORE, atoi(COM_Argv(1))); +} + +void Command_Angle_f(void) +{ + const float anglef = atof(COM_Argv(1)); + const angle_t angle = FixedAngle(FLOAT_TO_FIXED(anglef)); + + REQUIRE_INLEVEL; + + D_Cheat(consoleplayer, CHEAT_ANGLE, angle); +} + // // OBJECTPLACE (and related variables) // diff --git a/src/m_cheat.h b/src/m_cheat.h index c217d7f01..e795cad2a 100644 --- a/src/m_cheat.h +++ b/src/m_cheat.h @@ -33,7 +33,11 @@ typedef enum { CHEAT_FLIP, CHEAT_HURT, CHEAT_RELATIVE_TELEPORT, + CHEAT_TELEPORT, CHEAT_DEVMODE, + CHEAT_GIVEITEM, + CHEAT_SCORE, + CHEAT_ANGLE, NUMBER_OF_CHEATS } cheat_t; @@ -76,8 +80,11 @@ void Command_Gravflip_f(void); void Command_Hurtme_f(void); void Command_Teleport_f(void); void Command_RTeleport_f(void); +void Command_ATeleport_f(void); void Command_Skynum_f(void); void Command_Weather_f(void); +void Command_Angle_f(void); +void Command_Setscore_f(void); #ifdef _DEBUG void Command_CauseCfail_f(void); #endif diff --git a/src/p_saveg.c b/src/p_saveg.c index e0b3b41bb..94edc68fd 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -255,6 +255,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT8(save->p, players[i].instashield); WRITEUINT8(save->p, players[i].wipeoutslow); WRITEUINT8(save->p, players[i].justbumped); + WRITEUINT8(save->p, players[i].noclip); WRITESINT8(save->p, players[i].drift); WRITEFIXED(save->p, players[i].driftcharge); @@ -582,6 +583,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].instashield = READUINT8(save->p); players[i].wipeoutslow = READUINT8(save->p); players[i].justbumped = READUINT8(save->p); + players[i].noclip = READUINT8(save->p); players[i].drift = READSINT8(save->p); players[i].driftcharge = READFIXED(save->p); From e78877783e30b8e58094364f15779b4cc220836a Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 17 May 2025 16:27:09 -0400 Subject: [PATCH 14/35] Fix buffer overflow in HWR_InitModels Idk who did this --- src/hardware/hw_md2.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 172f9cf80..013b2fb39 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -494,7 +494,10 @@ void HWR_InitModels(void) size_t i; INT32 s; FILE *f; - char name[24], filename[32]; + char name[26], filename[32]; + // name[24] is used to check for names in the models.dat file that match with sprites or player skins + // sprite names are always 4 characters long, and names is for player skins can be up to 19 characters long + // PLAYERMODELPREFIX is 6 characters long float scale, offset; size_t prefixlen; From a3b6a13e95c8c2556d486327247f548076839268 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 17 May 2025 17:15:52 -0400 Subject: [PATCH 15/35] Fix retry softlock --- src/p_setup.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/p_setup.c b/src/p_setup.c index b029536ba..3e5f3b264 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -8366,6 +8366,8 @@ static void P_InitGametype(void) lastLowestLap = 0; spbplace = -1; + G_ClearRetryFlag(); + startedInFreePlay = false; { UINT8 nump = 0; From 39f507d2b530cbe76349546cd31ea1ff5bafbf44 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 17 May 2025 20:23:18 -0400 Subject: [PATCH 16/35] Make Ring drop on bumps consistent --- src/k_collide.c | 14 -------------- src/k_kart.c | 12 ++++++++++++ src/y_inter.c | 12 +++--------- 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 5aa6c2f5a..0298c0dff 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -770,20 +770,6 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) return true; } } - - // Ring Loss on bump. - t1Condition = ((t2->player->rings > 0) && (K_GetShieldFromPlayer(t2->player) == KSHIELD_NONE)); - t2Condition = ((t1->player->rings > 0) && (K_GetShieldFromPlayer(t1->player) == KSHIELD_NONE)); - - if (t1Condition == true) - { - P_PlayerRingBurst(t2->player, 1); - } - - if (t2Condition == true) - { - P_PlayerRingBurst(t1->player, 1); - } return false; } diff --git a/src/k_kart.c b/src/k_kart.c index d836564ca..74a93d535 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2050,6 +2050,12 @@ boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean sol mobj1->player->rmomy = mobj1->momy - mobj1->player->cmomy; mobj1->player->justbumped = bumptime; + // Moved here so it only fires once on bump. + if ((mobj1->player->rings > 0) && (K_GetShieldFromPlayer(mobj1->player) == KSHIELD_NONE)) + { + P_PlayerRingBurst(mobj1->player, 1); + } + if (mobj1->player->spinouttimer) { mobj1->player->wipeoutslow = wipeoutslowtime+1; @@ -2064,6 +2070,12 @@ boolean K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean sol mobj2->player->rmomy = mobj2->momy - mobj2->player->cmomy; mobj2->player->justbumped = bumptime; + // Moved here so it only fires once on bump. + if ((mobj2->player->rings > 0) && (K_GetShieldFromPlayer(mobj2->player) == KSHIELD_NONE)) + { + P_PlayerRingBurst(mobj2->player, 1); + } + if (mobj2->player->spinouttimer) { mobj2->player->wipeoutslow = wipeoutslowtime+1; diff --git a/src/y_inter.c b/src/y_inter.c index ff5fd17db..a1ee5c111 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -777,15 +777,9 @@ skiptallydrawer: break; } - //if ((intertic/TICRATE) & 1) // Make it obvious that scrambling is happening next round. (OR NOT, I GUESS) - //{ - /*if (cv_scrambleonchange.value && cv_teamscramble.value) - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, hilicol, M_GetText("Teams will be scrambled next round!"));*/ - - if (speedscramble != -1 && speedscramble != gamespeed) - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, hilicol|V_ALLOWLOWERCASE|V_SNAPTOBOTTOM, - va(M_GetText("Next race will be %s Speed!"), kartspeed_cons_t[1+speedscramble].strvalue)); - //} + if ((speedscramble != -1) && (speedscramble != gamespeed)) + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, hilicol|V_ALLOWLOWERCASE|V_SNAPTOBOTTOM, + va(M_GetText("Next race will be %s Speed!"), kartspeed_cons_t[1+speedscramble].strvalue)); } // From b9836e49253da502ed6930ba30b95c56e1ace20a Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 14:05:31 -0400 Subject: [PATCH 17/35] Add toggle for deadzone style The game now defaults to Kart style deadzone to remove that stiffness felt on shallower angles --- src/d_netcmd.c | 1 + src/g_game.c | 28 +++++++++++++++++++++++++++- src/g_game.h | 1 + src/r_main.cpp | 2 +- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 20eadd721..a5e1995a7 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1114,6 +1114,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_kickstartaccel[i]); CV_RegisterVar(&cv_shrinkme[i]); CV_RegisterVar(&cv_deadzone[i]); + CV_RegisterVar(&cv_deadzonestyle[i]); } // filesrch.c diff --git a/src/g_game.c b/src/g_game.c index 65c55b542..65e4c2a0f 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -447,6 +447,14 @@ consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("deadzone4", "0.25", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL) }; +static CV_PossibleValue_t deadzonestyle_cons_t[] = {{0, "Kart"}, {1, "RR"}, {0, NULL}}; +consvar_t cv_deadzonestyle[MAXSPLITSCREENPLAYERS] = { + CVAR_INIT ("deadzonestyle", "Kart", CV_SAVE, deadzonestyle_cons_t, NULL), + CVAR_INIT ("deadzonestyle2", "Kart", CV_SAVE, deadzonestyle_cons_t, NULL), + CVAR_INIT ("deadzonestyle3", "Kart", CV_SAVE, deadzonestyle_cons_t, NULL), + CVAR_INIT ("deadzonestyle4", "Kart", CV_SAVE, deadzonestyle_cons_t, NULL) +}; + // now automatically allocated in D_RegisterClientCommands // so that it doesn't have to be updated depending on the value of MAXPLAYERS char player_names[MAXPLAYERS][MAXPLAYERNAME+1]; @@ -950,9 +958,27 @@ static void G_HandleAxisDeadZone(UINT8 splitnum, joystickvector2_t *joystickvect { INT32 gamepadStyle = Joystick[splitnum].bGamepadStyle; fixed_t deadZone = cv_deadzone[splitnum].value; + boolean deadZoneStyle = cv_deadzonestyle[splitnum].value; // When gamepadstyle is "true" the values are just -1, 0, or 1. This is done in the interface code. - if (!gamepadStyle) + + // v1 style deadzone + // Deadzone doesn't scale so shallower angles are easier to hit. + if (!gamepadStyle && (deadZoneStyle == 0)) + { + joystickvector->xaxis = min(joystickvector->xaxis, JOYAXISRANGE); + joystickvector->xaxis = max(joystickvector->xaxis, -JOYAXISRANGE); + joystickvector->yaxis = min(joystickvector->yaxis, JOYAXISRANGE); + joystickvector->yaxis = max(joystickvector->yaxis, -JOYAXISRANGE); + + if (joystickvector->xaxis >= deadZone) + joystickvector->xaxis = 0; + if (joystickvector->yaxis <= deadZone) + joystickvector->yaxis = 0; + } + // RR style deadzone + // Dead zone scales so shallower angles are harder to hit but you have more range. + else if (!gamepadStyle && (deadZoneStyle == 1)) { // Get the total magnitude of the 2 axes INT32 magnitude = (joystickvector->xaxis * joystickvector->xaxis) + (joystickvector->yaxis * joystickvector->yaxis); diff --git a/src/g_game.h b/src/g_game.h index 16bab824a..8886f0984 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -79,6 +79,7 @@ extern consvar_t cv_invertmouse; extern consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_shrinkme[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS]; +extern consvar_t cv_deadzonestyle[MAXSPLITSCREENPLAYERS]; extern consvar_t cv_ghost_besttime, cv_ghost_bestlap, cv_ghost_last, cv_ghost_guest, cv_ghost_staff; diff --git a/src/r_main.cpp b/src/r_main.cpp index 89f1a2276..77191978b 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -170,7 +170,7 @@ consvar_t cv_flipcam[MAXSPLITSCREENPLAYERS] = { CVAR_INIT ("flipcam4", "Off", CV_CALL|CV_SAVE, CV_OnOff, weaponPrefChange4) }; -consvar_t cv_shadow = CVAR_INIT ("shadow", "On", CV_SAVE, CV_OnOff, NULL); +consvar_t cv_shadow = CVAR_INIT ("dropshadow", "On", CV_SAVE, CV_OnOff, NULL); consvar_t cv_skybox = CVAR_INIT ("skybox", "On", CV_SAVE, CV_OnOff, NULL); consvar_t cv_ffloorclip = CVAR_INIT ("ffloorclip", "On", CV_SAVE, CV_OnOff, NULL); consvar_t cv_allowmlook = CVAR_INIT ("allowmlook", "Yes", CV_NETVAR, CV_YesNo, NULL); From 91c4e0e7f07f3161c0a8ce97f1d237d9e62d154f Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 14:12:40 -0400 Subject: [PATCH 18/35] Use Neptune shadow scales Thanks Jon for the suggestion --- src/p_mobj.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 105 insertions(+), 11 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index af896a40e..0f3cb0911 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10596,11 +10596,10 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) thing->whiteshadow = ((thing->frame & FF_BRIGHTMASK) == FF_FULLBRIGHT); thing->shadowcolor = 15; + // Those have shadow by default switch (thing->type) { case MT_PLAYER: - thing->shadowscale = FRACUNIT; - break; case MT_SMALLMACE: case MT_BIGMACE: case MT_PUMA: @@ -10617,12 +10616,16 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_JAWZ_SHIELD: case MT_SSMINE: case MT_SSMINE_SHIELD: - case MT_LANDMINE: case MT_BALLHOG: case MT_SINK: + case MT_THUNDERSHIELD: case MT_ROCKETSNEAKER: case MT_SPB: - thing->shadowscale = 3*FRACUNIT/2; + case MT_ADVENTURESPIKEA: + case MT_ADVENTURESPIKEB: + case MT_ADVENTURESPIKEC: + case MT_CDUFO: + thing->shadowscale = 4*FRACUNIT/3; break; case MT_BANANA_SHIELD: thing->shadowscale = 12*FRACUNIT/5; @@ -10639,17 +10642,108 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) thing->shadowscale = 3*FRACUNIT/2; thing->whiteshadow = false; break; - case MT_THUNDERSHIELD: - case MT_BUBBLESHIELD: - case MT_BUBBLESHIELDTRAP: - case MT_FLAMESHIELD: + case MT_FLOATINGITEM: + thing->shadowscale = FRACUNIT/2; + break; + case MT_BLUEFRUIT: + case MT_ORANGEFRUIT: + case MT_REDFRUIT: + case MT_PINKFRUIT: + case MT_RANDOMAUDIENCE: + case MT_DOOD_BOX: + case MT_DOOD_BALLOON: + case MT_BLUECRAWLA: + case MT_REDCRAWLA: + case MT_GFZFISH: // Greenflower Fish + case MT_GOLDBUZZ: + case MT_REDBUZZ: + case MT_AQUABUZZ: // AquaBuzz for ATZ + case MT_JETTBOMBER: // Jetty-Syn Bomber + case MT_JETTGUNNER: // Jetty-Syn Gunner + case MT_CRAWLACOMMANDER: // Crawla Commander + case MT_DETON: // Deton + case MT_SKIM: // Skim mine dropper + case MT_TURRET: + case MT_POPUPTURRET: + case MT_SHARP: // Sharp + case MT_JETJAW: // Jet Jaw + case MT_SNAILER: // Snailer + case MT_VULTURE: // Vulture + case MT_POINTY: // Pointy + case MT_POINTYBALL: // Pointy Ball + case MT_ROBOHOOD: // Robo-Hood + case MT_FACESTABBER: // CastleBot FaceStabber + case MT_EGGGUARD: // Egg Guard + case MT_EGGSHIELD: // Egg Shield for Egg Guard + case MT_GSNAPPER: // Green Snapper + case MT_MINUS: // Minus + case MT_SPRINGSHELL: // Spring Shell + case MT_YELLOWSHELL: // Spring Shell (yellow) + case MT_UNIDUS: // Unidus + case MT_UNIBALL: // Unidus Ball + case MT_GOOMBA: + case MT_BLUEGOOMBA: + case MT_KOOPA: + case MT_MONOKUMA: + case MT_ARIDTOAD: + case MT_SRB1_CRAWLA: + case MT_SRB1_BAT: + case MT_SRB1_ROBOFISH: + case MT_SRB1_VOLCANOGUY: + case MT_SRB1_HOPPY: + case MT_SRB1_HOPPYWATER: + case MT_SRB1_HOPPYSKYLAB: + case MT_SRB1_MMZFLYING: + case MT_SRB1_UFO: + case MT_SRB1_GRAYBOT: + case MT_SRB1_ROBOTOPOLIS: + case MT_SRB1_RBZBUZZ: + case MT_SRB1_RBZSPIKES: + case MT_SRB1_METALSONIC: + case MT_SRB1_GOLDBOT: + case MT_SRB1_GENREX: + case MT_BOWLINGPIN: + case MT_EXPLODINGBARREL: + case MT_FROGGER: + case MT_ROBRA: + case MT_CHOMPER: + case MT_BUZZBOMBER: + case MT_GARGOYLE: + case MT_GBA_BOO: + case MT_FLYINGGARG: thing->shadowscale = FRACUNIT; break; case MT_RING: case MT_FLINGRING: - case MT_FLOATINGITEM: - case MT_BLUEBALL: - case MT_ITEMCAPSULE: + case MT_COIN: + case MT_FLINGCOIN: + case MT_REDTEAMRING: + case MT_BLUETEAMRING: + case MT_REDFLAG: + case MT_BLUEFLAG: + case MT_BOUNCERING: + case MT_AUTOMATICRING: + case MT_INFINITYRING: + case MT_RAILRING: + case MT_EXPLOSIONRING: + case MT_SCATTERRING: + case MT_GRENADERING: + case MT_BOUNCEPICKUP: + case MT_RAILPICKUP: + case MT_AUTOPICKUP: + case MT_EXPLODEPICKUP: + case MT_SCATTERPICKUP: + case MT_GRENADEPICKUP: + case MT_REDRING: + case MT_THROWNBOUNCE: + case MT_THROWNINFINITY: + case MT_THROWNAUTOMATIC: + case MT_THROWNSCATTER: + case MT_THROWNEXPLOSION: + case MT_THROWNGRENADE: + case MT_EMBLEM: + thing->shadowscale = 2*FRACUNIT/3; + break; default: if (thing->flags & (MF_ENEMY|MF_BOSS)) thing->shadowscale = FRACUNIT; From 5f2fd005f0c7c60b8ba6677e7aec3785e89ad40f Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 14:15:39 -0400 Subject: [PATCH 19/35] Revert rocketsneaker usage nerf --- src/k_kart.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 74a93d535..1cbddb76f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10154,10 +10154,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { K_DoSneaker(player, SNEAKERTYPE_ROCKETSNEAKER); K_PlayBoostTaunt(player->mo); - if (player->rocketsneakertimer <= 3*TICRATE) + player->rocketsneakertimer -= 2*TICRATE; + if (player->rocketsneakertimer < 1) player->rocketsneakertimer = 1; - else - player->rocketsneakertimer -= 3*TICRATE; player->botvars.itemconfirm = 0; } } From 4950069cd6b83de6c5e714c48eb8bdb0930f04bf Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 14:18:06 -0400 Subject: [PATCH 20/35] Fix other minor issues brought up Thanks again Jon --- src/k_kart.c | 2 +- src/p_inter.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 1cbddb76f..d71a74fd7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10061,7 +10061,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->itemflags &= ~IF_USERINGS; } - if (player && player->mo && player->mo->health > 0 && !player->spectator && !P_PlayerInPain(player) && player->respawn == 0 && !(player->exiting || mapreset) && leveltime > introtime) + if (player && player->mo && player->mo->health > 0 && !player->spectator && !P_PlayerInPain(player) && player->respawn == 0 && !(player->exiting || mapreset)) { // First, the really specific, finicky items that function without the item being directly in your item slot. { diff --git a/src/p_inter.c b/src/p_inter.c index d9ff7d555..5a816d52f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2156,6 +2156,12 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (player->pflags & PF_GODMODE) return false; + if (player->exiting) + { + K_DoInstashield(player); + return false; + } + if (!force) { // Player hits another player From 30eb87487bc9ab79f1cc04035c3f4270311dd882 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 14:19:33 -0400 Subject: [PATCH 21/35] Use negative here instead --- 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 65e4c2a0f..4fdb00648 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -971,7 +971,7 @@ static void G_HandleAxisDeadZone(UINT8 splitnum, joystickvector2_t *joystickvect joystickvector->yaxis = min(joystickvector->yaxis, JOYAXISRANGE); joystickvector->yaxis = max(joystickvector->yaxis, -JOYAXISRANGE); - if (joystickvector->xaxis >= deadZone) + if (joystickvector->xaxis <= -deadZone) joystickvector->xaxis = 0; if (joystickvector->yaxis <= deadZone) joystickvector->yaxis = 0; From f8443108a7b350633cc05d0c7f81ff732d2b1153 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 15:44:30 -0400 Subject: [PATCH 22/35] More various fixes --- src/g_game.c | 17 +++-------------- src/p_mobj.c | 6 +++++- src/p_setup.c | 30 ++++++++++++++++-------------- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 4fdb00648..dbdfdd6a1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -958,27 +958,16 @@ static void G_HandleAxisDeadZone(UINT8 splitnum, joystickvector2_t *joystickvect { INT32 gamepadStyle = Joystick[splitnum].bGamepadStyle; fixed_t deadZone = cv_deadzone[splitnum].value; - boolean deadZoneStyle = cv_deadzonestyle[splitnum].value; + SINT8 deadZoneStyle = cv_deadzonestyle[splitnum].value; // When gamepadstyle is "true" the values are just -1, 0, or 1. This is done in the interface code. - // v1 style deadzone + // v1 style deadzone == (deadZoneStyle == 0) // Deadzone doesn't scale so shallower angles are easier to hit. - if (!gamepadStyle && (deadZoneStyle == 0)) - { - joystickvector->xaxis = min(joystickvector->xaxis, JOYAXISRANGE); - joystickvector->xaxis = max(joystickvector->xaxis, -JOYAXISRANGE); - joystickvector->yaxis = min(joystickvector->yaxis, JOYAXISRANGE); - joystickvector->yaxis = max(joystickvector->yaxis, -JOYAXISRANGE); - if (joystickvector->xaxis <= -deadZone) - joystickvector->xaxis = 0; - if (joystickvector->yaxis <= deadZone) - joystickvector->yaxis = 0; - } // RR style deadzone // Dead zone scales so shallower angles are harder to hit but you have more range. - else if (!gamepadStyle && (deadZoneStyle == 1)) + if (!gamepadStyle && (deadZoneStyle == 1)) { // Get the total magnitude of the 2 axes INT32 magnitude = (joystickvector->xaxis * joystickvector->xaxis) + (joystickvector->yaxis * joystickvector->yaxis); diff --git a/src/p_mobj.c b/src/p_mobj.c index 0f3cb0911..38ebb2284 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10616,9 +10616,12 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_JAWZ_SHIELD: case MT_SSMINE: case MT_SSMINE_SHIELD: + case MT_LANDMINE: case MT_BALLHOG: case MT_SINK: case MT_THUNDERSHIELD: + case MT_BUBBLESHIELD: + case MT_FLAMESHIELD: case MT_ROCKETSNEAKER: case MT_SPB: case MT_ADVENTURESPIKEA: @@ -10643,6 +10646,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) thing->whiteshadow = false; break; case MT_FLOATINGITEM: + case MT_ITEMCAPSULE: thing->shadowscale = FRACUNIT/2; break; case MT_BLUEFRUIT: @@ -10742,7 +10746,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_THROWNEXPLOSION: case MT_THROWNGRENADE: case MT_EMBLEM: - thing->shadowscale = 2*FRACUNIT/3; + thing->shadowscale = FRACUNIT; break; default: if (thing->flags & (MF_ENEMY|MF_BOSS)) diff --git a/src/p_setup.c b/src/p_setup.c index 3e5f3b264..e42b7f1b8 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -137,7 +137,7 @@ node_t *nodes; line_t *lines; side_t *sides; mapthing_t *mapthings; -static boolean basemaptyperemoval[4097]; +static boolean basemaptyperemoval[65537]; sector_t *spawnsectors; line_t *spawnlines; side_t *spawnsides; @@ -1559,28 +1559,30 @@ static boolean TextmapCount(size_t size, boolean patch) { tkn = M_TokenizerRead(0); const char *typestr = tkn; - char *typetoken = strtok(typestr, " | "); - int i; + char *end; // check for types separated by pipes // e.g. 300|2001|2004 - while (typetoken != NULL) + do { - i = atoi(typetoken); + UINT16 types = strtoull(typestr, &end, 10); - if (i && !(i > 4096 || i < 0)) + if (types) { // Set type to removed. - basemaptyperemoval[i] = true; - CONS_Debug(DBG_SETUP,"Ignoring base mapthing type %d for patch\n", i); - } - else - { - CONS_Alert(CONS_ERROR, "Invalid mapthing type supplied for base mapthing removal.\n"); + basemaptyperemoval[types] = true; + CONS_Debug(DBG_SETUP,"Ignoring base mapthing type %d for patch\n", types); } - typetoken = strtok(NULL, " | "); + if (end == typestr || (*end && *end != '|')) + { + CONS_Alert(CONS_ERROR, "Invalid basemaptyperemoval string '%s'\n", tkn); + return false; + } + + typestr = end + 1; } + while (*end); } } @@ -8788,7 +8790,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) P_InitSlopes(); //Initialize slopes before the map loads. - memset(basemaptyperemoval, 0, 4097*sizeof(boolean)); + memset(basemaptyperemoval, 0, 65537*sizeof(boolean)); if (!P_LoadMapFromFile()) { From 99daf2efd8d189cd1d368d21d7d5c7164c368052 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 17:33:21 -0400 Subject: [PATCH 23/35] Use sneakerstacking sound cvar and use stacking helper func --- src/k_kart.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index d71a74fd7..958f177c3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3530,14 +3530,14 @@ static fixed_t diminish(fixed_t speedboost) void K_DoBoost(player_t *player, fixed_t speedboost, fixed_t accelboost, boolean stack, boolean visible) { - if (stack && stackingactive) + if (stack && K_StackingActive()) { player->boostinfo.stackspeedboost += speedboost; } player->boostinfo.nonstackspeedboost = max(player->boostinfo.nonstackspeedboost, speedboost); - if (cv_kartstacking_accelstack.value && stackingactive) + if (cv_kartstacking_accelstack.value && K_StackingActive()) { player->boostinfo.accelboost += accelboost; } @@ -3679,7 +3679,7 @@ static void K_GetKartBoostPower(player_t *player) finalgrade = player->boostinfo.grade; // value smoothing - if (stackingactive) + if (K_StackingActive()) { if (player->offroad && K_ApplyOffroad(player)) { @@ -5489,7 +5489,7 @@ static void K_SneakerPanelStackSound(player_t *player) const sfxenum_t smallsfx = sfx_cdfm40; sfxenum_t sfx = normalsfx; - if ((player->numsneakers > 0) && stackingactive) + if ((player->numsneakers > 0) && K_StackingActive() && cv_kartstacking_sneakerstacksound.value) { // Use a less annoying sound when stacking sneakers. sfx = smallsfx; From e9b79efe2dae44000dcce51a404a2561a4e3cb53 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 17:48:41 -0400 Subject: [PATCH 24/35] rename calc_arg_offset to match newest booststack --- src/d_netcmd.c | 2 +- src/d_netcmd.h | 2 +- src/k_kart.c | 4 ++-- src/k_kart.h | 3 +-- src/p_mobj.c | 8 ++++---- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a5e1995a7..e894a20dc 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -446,7 +446,7 @@ consvar_t cv_kartrings = CVAR_INIT ("kartrings", "No", CV_NETVAR|CV_CALL|CV_NOIN // Stacking related consvar_t cv_kartstacking = CVAR_INIT ("kartstacking", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartStacking_OnChange); -consvar_t cv_kartstacking_calc_arg_offset = CVAR_INIT ("kartstacking_calcargoffset", "0.32", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); +consvar_t cv_kartstacking_diminishparam = CVAR_INIT ("kartstacking_diminishparam", "0.32", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_maxvanillaboost = CVAR_INIT ("kartstacking_maxvanillaboost", "0.375", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_speedboostdropoff = CVAR_INIT ("kartstacking_speedboostdropoff", "0.01", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); consvar_t cv_kartstacking_speedboostdropoff_brake = CVAR_INIT ("kartstacking_speedboostdropoff_brake", "0.05", CV_NETVAR|CV_CHEAT|CV_FLOAT, CV_Unsigned, NULL); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index e23549def..4f32fed27 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -122,7 +122,7 @@ extern consvar_t cv_kartusepwrlv; extern consvar_t cv_kartrings; extern consvar_t cv_kartstacking; -extern consvar_t cv_kartstacking_calc_arg_offset; +extern consvar_t cv_kartstacking_diminishparam; extern consvar_t cv_kartstacking_maxvanillaboost; extern consvar_t cv_kartstacking_speedboostdropoff; extern consvar_t cv_kartstacking_speedboostdropoff_brake; diff --git a/src/k_kart.c b/src/k_kart.c index 958f177c3..33e7aff26 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -283,7 +283,7 @@ void K_RegisterKartStuff(void) // Stacking CV_RegisterVar(&cv_kartstacking); - CV_RegisterVar(&cv_kartstacking_calc_arg_offset); + CV_RegisterVar(&cv_kartstacking_diminishparam); CV_RegisterVar(&cv_kartstacking_speedboostdropoff); CV_RegisterVar(&cv_kartstacking_speedboostdropoff_brake); CV_RegisterVar(&cv_kartstacking_accelstack); @@ -3525,7 +3525,7 @@ static inline fixed_t K_GetSneakerBoostSpeed(void) static fixed_t diminish(fixed_t speedboost) { - return FixedSqrt(speedboost + CALC_ARG_OFFSET) - CALC_RET_OFFSET; + return FixedSqrt(speedboost + DIMINISHPARAM) - FixedSqrt(DIMINISHPARAM); } void K_DoBoost(player_t *player, fixed_t speedboost, fixed_t accelboost, boolean stack, boolean visible) diff --git a/src/k_kart.h b/src/k_kart.h index 068f12af5..827893f49 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -39,8 +39,7 @@ Make sure this matches the actual number of states // Precalculated constants for stacked boost diminishing // *Somewhat* matches old calc but doesn't use arrays, which makes it faster and more memory efficent -#define CALC_ARG_OFFSET K_RAGuard(cv_kartstacking_calc_arg_offset) -#define CALC_RET_OFFSET FixedSqrt(CALC_ARG_OFFSET) +#define DIMINISHPARAM K_RAGuard(cv_kartstacking_diminishparam) #define MAXVANILLABOOST K_RAGuard(cv_kartstacking_maxvanillaboost) #define SPEEDBOOSTDROPOFF K_RAGuard(cv_kartstacking_speedboostdropoff) #define SPEEDBOOSTDROPOFF_BRAKE K_RAGuard(cv_kartstacking_speedboostdropoff_brake) diff --git a/src/p_mobj.c b/src/p_mobj.c index 38ebb2284..908331875 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10619,9 +10619,6 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_LANDMINE: case MT_BALLHOG: case MT_SINK: - case MT_THUNDERSHIELD: - case MT_BUBBLESHIELD: - case MT_FLAMESHIELD: case MT_ROCKETSNEAKER: case MT_SPB: case MT_ADVENTURESPIKEA: @@ -10649,6 +10646,9 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_ITEMCAPSULE: thing->shadowscale = FRACUNIT/2; break; + case MT_THUNDERSHIELD: + case MT_BUBBLESHIELD: + case MT_FLAMESHIELD: case MT_BLUEFRUIT: case MT_ORANGEFRUIT: case MT_REDFRUIT: @@ -10746,7 +10746,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_THROWNEXPLOSION: case MT_THROWNGRENADE: case MT_EMBLEM: - thing->shadowscale = FRACUNIT; + thing->shadowscale = FRACUNIT/3; break; default: if (thing->flags & (MF_ENEMY|MF_BOSS)) From 1897f9d1e74a548753585759d3ea758b26cf9fd6 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 18:52:45 -0400 Subject: [PATCH 25/35] Fix weird stacking speed dropoff issue Thanks so much Indev! --- src/d_player.h | 1 + src/k_kart.c | 8 ++++---- src/p_saveg.c | 2 ++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 73b6550d4..a08cc392a 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -635,6 +635,7 @@ struct player_t fixed_t boostpower; // Base boost value, for offroad fixed_t speedboost; // Boost value smoothing for max speed + fixed_t prevspeedboost; // Max speed boost value from the last frame fixed_t accelboost; // Boost value smoothing for acceleration angle_t boostangle; // angle set when not spun out OR boosted to determine what direction you should keep going at if you're spun out and boosted. boostinfo_t boostinfo; // Stores values used for setting speed and accel boosts. diff --git a/src/k_kart.c b/src/k_kart.c index 33e7aff26..2f5c67dc8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3589,7 +3589,6 @@ static void K_GetKartBoostPower(player_t *player) fixed_t finalspeedboost = 0; fixed_t finalaccelboost = 0; UINT8 finalgrade = 0; - fixed_t prevspeedboost = player->speedboost; if (player->spinouttimer && player->wipeoutslow == 1) // Slow down after you've been bumped { @@ -3686,19 +3685,19 @@ static void K_GetKartBoostPower(player_t *player) player->speedboost = max(finalspeedboost, player->speedboost)/2; player->accelboost = max(finalaccelboost, player->accelboost)/2; } - else if (finalspeedboost >= prevspeedboost) + else if (finalspeedboost >= player->prevspeedboost) { player->speedboost = max(player->speedboost, finalspeedboost); player->accelboost = max(player->accelboost, finalaccelboost); } else if ((player->aizdriftstrat && abs((player->drift) < 5)) || (K_GetKartButtons(player) & BT_BRAKE)) { - player->speedboost = max(prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST)); + player->speedboost = max(player->prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST)); player->accelboost = finalaccelboost; } else { - player->speedboost = prevspeedboost - SPEEDBOOSTDROPOFF; + player->speedboost = max(player->speedboost + (finalspeedboost - player->speedboost) / (TICRATE/2), player->speedboost - SPEEDBOOSTDROPOFF); player->accelboost = finalaccelboost; } } @@ -3718,6 +3717,7 @@ static void K_GetKartBoostPower(player_t *player) player->numboosts = finalgrade; K_ClearBoost(player); + player->prevspeedboost = player->speedboost; } // Returns value based on being Grown or Shrunk otherwise returns FRACUNIT diff --git a/src/p_saveg.c b/src/p_saveg.c index 94edc68fd..2040d4e8c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -277,6 +277,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEFIXED(save->p, players[i].boostpower); WRITEFIXED(save->p, players[i].speedboost); + WRITEFIXED(save->p, players[i].prevspeedboost); WRITEFIXED(save->p, players[i].accelboost); WRITEANGLE(save->p, players[i].boostangle); WRITEUINT8(save->p, players[i].numsneakers); @@ -605,6 +606,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].boostpower = READFIXED(save->p); players[i].speedboost = READFIXED(save->p); + players[i].prevspeedboost = READFIXED(save->p); players[i].accelboost = READFIXED(save->p); players[i].boostangle = READANGLE(save->p); players[i].numsneakers = READUINT8(save->p); From 9179c6620cc689d1aaeebcbb3a27cdf6894a1d81 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 19:36:19 -0400 Subject: [PATCH 26/35] Remove air drifitng jitter It looked really strange since you aren't on the ground to jitter in the first place. --- src/k_kart.c | 54 +++++++++++++++++++--------------------------------- 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 2f5c67dc8..7ebf03433 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2790,47 +2790,33 @@ void K_KartMoveAnimation(player_t *player) if (onground == false) { // Only use certain frames in the air, to make it look like your tires are spinning fruitlessly! - - if (drift > 0) + if (turndir == -1) { - // Neutral drift - SetState(S_KART_DRIFT_L); + SetState(S_KART_FAST_R); } - else if (drift < 0) + else if (turndir == 1) { - // Neutral drift - SetState(S_KART_DRIFT_R); + SetState(S_KART_FAST_L); } else { - if (turndir == -1) + switch (player->glanceDir) { - SetState(S_KART_FAST_R); - } - else if (turndir == 1) - { - SetState(S_KART_FAST_L); - } - else - { - switch (player->glanceDir) - { - case -2: - SetState(S_KART_FAST_LOOK_R); - break; - case 2: - SetState(S_KART_FAST_LOOK_L); - break; - case -1: - SetState(S_KART_FAST_GLANCE_R); - break; - case 1: - SetState(S_KART_FAST_GLANCE_L); - break; - default: - SetState(S_KART_FAST); - break; - } + case -2: + SetState(S_KART_FAST_LOOK_R); + break; + case 2: + SetState(S_KART_FAST_LOOK_L); + break; + case -1: + SetState(S_KART_FAST_GLANCE_R); + break; + case 1: + SetState(S_KART_FAST_GLANCE_L); + break; + default: + SetState(S_KART_FAST); + break; } } From cab441bad4b1f333815786f67309237d597ab22e Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 19:58:50 -0400 Subject: [PATCH 27/35] Fix diagonal squares --- src/f_finale.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index fb747ecd0..f1f5c749b 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -976,7 +976,7 @@ static void F_DrawDiagCubes(void) for (j = -4; j < 5; j++) { //Up Cubes - V_DrawFill(-((credbgtimer % 128)+1)+(32*j)+32-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOBOTTOM|V_SNAPTORIGHT); + V_DrawFill(-((credbgtimer % 128)+1)+(32*j)+32-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOTOP|V_SNAPTOLEFT); V_DrawFill(-((credbgtimer % 128)+1)+(32*j)+32-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOTOP|V_SNAPTOLEFT); V_DrawFill(-((credbgtimer % 128)+1)+(32*j)-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOTOP|V_SNAPTOLEFT); V_DrawFill(-((credbgtimer % 128)+1)+(32*j)-32-20, ((credbgtimer % 128)+1)-(32*j), 32, 32, 31|V_SNAPTOTOP|V_SNAPTOLEFT); @@ -994,8 +994,9 @@ void F_BlanCreditDrawer(void) fixed_t y = (80< Date: Sun, 18 May 2025 21:02:29 -0400 Subject: [PATCH 28/35] Fix brakemod dropoff cvar not being registerd --- src/k_kart.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 7ebf03433..6781440ef 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -284,6 +284,7 @@ void K_RegisterKartStuff(void) // Stacking CV_RegisterVar(&cv_kartstacking); CV_RegisterVar(&cv_kartstacking_diminishparam); + CV_RegisterVar(&cv_kartstacking_maxvanillaboost); CV_RegisterVar(&cv_kartstacking_speedboostdropoff); CV_RegisterVar(&cv_kartstacking_speedboostdropoff_brake); CV_RegisterVar(&cv_kartstacking_accelstack); @@ -3671,16 +3672,16 @@ static void K_GetKartBoostPower(player_t *player) player->speedboost = max(finalspeedboost, player->speedboost)/2; player->accelboost = max(finalaccelboost, player->accelboost)/2; } - else if (finalspeedboost >= player->prevspeedboost) - { - player->speedboost = max(player->speedboost, finalspeedboost); - player->accelboost = max(player->accelboost, finalaccelboost); - } else if ((player->aizdriftstrat && abs((player->drift) < 5)) || (K_GetKartButtons(player) & BT_BRAKE)) { player->speedboost = max(player->prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST)); player->accelboost = finalaccelboost; } + else if (finalspeedboost >= player->prevspeedboost) + { + player->speedboost = max(player->speedboost, finalspeedboost); + player->accelboost = max(player->accelboost, finalaccelboost); + } else { player->speedboost = max(player->speedboost + (finalspeedboost - player->speedboost) / (TICRATE/2), player->speedboost - SPEEDBOOSTDROPOFF); @@ -10141,8 +10142,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_DoSneaker(player, SNEAKERTYPE_ROCKETSNEAKER); K_PlayBoostTaunt(player->mo); player->rocketsneakertimer -= 2*TICRATE; - if (player->rocketsneakertimer < 1) + if (player->rocketsneakertimer <= 2*TICRATE) player->rocketsneakertimer = 1; + else + player->rocketsneakertimer -= 2*TICRATE; player->botvars.itemconfirm = 0; } } From bafc9c3bd287b14d758c88a0ce5cd424a92189fe Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 21:19:11 -0400 Subject: [PATCH 29/35] Fix rocket sneakers --- src/k_kart.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 6781440ef..d4eaad886 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10141,7 +10141,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { K_DoSneaker(player, SNEAKERTYPE_ROCKETSNEAKER); K_PlayBoostTaunt(player->mo); - player->rocketsneakertimer -= 2*TICRATE; if (player->rocketsneakertimer <= 2*TICRATE) player->rocketsneakertimer = 1; else From 05f1e18084c7a775a147e491b90afd76b6d0ddce Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 23:28:32 -0400 Subject: [PATCH 30/35] Large Menu commit Ports 2.2's scrolling menu, port SRB2Kart Custom build Menucap cvar, register new menus --- src/d_clisrv.c | 30 ++-- src/d_main.cpp | 2 +- src/deh_tables.c | 1 + src/info/menus.h | 2 + src/k_kart.c | 2 +- src/m_menu.c | 357 +++++++++++++++++++++++++++++++++-------------- src/m_menu.h | 5 + 7 files changed, 281 insertions(+), 118 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 7a9b8cceb..13b6fa373 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -598,7 +598,7 @@ static inline void CL_DrawConnectionStatus(void) // Draw bottom box M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1); - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP, "Press ESC to abort"); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, MENUCAPS|V_YELLOWMAP, "Press ESC to abort"); for (i = 0; i < 16; ++i) V_DrawFill((BASEVIDWIDTH/2-128) + (i * 16), BASEVIDHEIGHT-24, 16, 8, palstart + ((animtime - i) & 15)); @@ -655,7 +655,7 @@ static inline void CL_DrawConnectionStatus(void) cltext = M_GetText("Connecting to server..."); break; } - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-16-24, V_YELLOWMAP, cltext); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-16-24, MENUCAPS|V_YELLOWMAP, cltext); } else { @@ -665,7 +665,7 @@ static inline void CL_DrawConnectionStatus(void) INT32 checkednum = 0; INT32 i; - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP, "Press ESC to abort"); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, MENUCAPS|V_YELLOWMAP, "Press ESC to abort"); //ima just count files here for (i = 0; i < fileneedednum; i++) @@ -673,7 +673,7 @@ static inline void CL_DrawConnectionStatus(void) checkednum++; // Loading progress - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP, "Checking server addons..."); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, MENUCAPS|V_YELLOWMAP, "Checking server addons..."); totalfileslength = (INT32)((checkednum/(double)(fileneedednum)) * 256); M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1); V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 111); @@ -687,7 +687,7 @@ static inline void CL_DrawConnectionStatus(void) INT32 loadcompletednum = 0; INT32 i; - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP, "Press ESC to abort"); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, MENUCAPS|V_YELLOWMAP, "Press ESC to abort"); //ima just count files here for (i = 0; i < fileneedednum; i++) @@ -695,12 +695,12 @@ static inline void CL_DrawConnectionStatus(void) loadcompletednum++; // Loading progress - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP, "Loading server addons..."); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, MENUCAPS|V_YELLOWMAP, "Loading server addons..."); totalfileslength = (INT32)((loadcompletednum/(double)(fileneedednum)) * 256); M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1); V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 111); V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 96); - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE, + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24, MENUCAPS|V_20TRANS|V_MONOSPACE, va(" %2u/%2u Files",loadcompletednum,fileneedednum)); } else if (lastfilenum != -1) @@ -714,7 +714,7 @@ static inline void CL_DrawConnectionStatus(void) // Draw the bottom box. M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-58-8, 32, 1); - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-14, V_YELLOWMAP, "Press ESC to abort"); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-14, MENUCAPS|V_YELLOWMAP, "Press ESC to abort"); Net_GetNetStat(); dldlength = (INT32)((file->currentsize/(double)file->totalsize) * 256); @@ -742,7 +742,7 @@ static inline void CL_DrawConnectionStatus(void) V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-30, 0, va(M_GetText("%s downloading"), ((cl_mode == CL_DOWNLOADHTTPFILES) ? "\x82""HTTP" : "\x85""Direct"))); - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-22, V_YELLOWMAP, + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-58-22, MENUCAPS|V_YELLOWMAP, va(M_GetText("\"%s\""), tempname)); V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-58, V_20TRANS|V_MONOSPACE, va(" %4uK/%4uK",fileneeded[lastfilenum].currentsize>>10,file->totalsize>>10)); @@ -756,20 +756,20 @@ static inline void CL_DrawConnectionStatus(void) else totaldldsize = downloadcompletedsize; - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-14, V_YELLOWMAP, "Overall Download Progress"); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-14, MENUCAPS|V_YELLOWMAP, "Overall Download Progress"); totalfileslength = (INT32)((totaldldsize/(double)totalfilesrequestedsize) * 256); M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1); V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 111); V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, totalfileslength, 8, 96); if (totalfilesrequestedsize>>20 >= 10) //display in MB if over 10MB - V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE, + V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, MENUCAPS|V_20TRANS|V_MONOSPACE, va(" %4uM/%4uM",totaldldsize>>20,totalfilesrequestedsize>>20)); else - V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE, + V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, MENUCAPS|V_20TRANS|V_MONOSPACE, va(" %4uK/%4uK",totaldldsize>>10,totalfilesrequestedsize>>10)); - V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE, + V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, MENUCAPS|V_20TRANS|V_MONOSPACE, va("%2u/%2u Files ",downloadcompletednum,totalfilesrequestednum)); } else @@ -780,12 +780,12 @@ static inline void CL_DrawConnectionStatus(void) //Draw bottom box M_DrawTextBox(BASEVIDWIDTH/2-128-8, BASEVIDHEIGHT-24-8, 32, 1); - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, V_YELLOWMAP, "Press ESC to abort"); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-24, MENUCAPS|V_YELLOWMAP, "Press ESC to abort"); for (i = 0; i < 16; ++i) V_DrawFill((BASEVIDWIDTH/2-128) + (i * 16), BASEVIDHEIGHT-24, 16, 8, palstart + ((animtime - i) & 15)); - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP, + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, MENUCAPS|V_YELLOWMAP, M_GetText("Waiting to download files...")); } } diff --git a/src/d_main.cpp b/src/d_main.cpp index bc2da83ff..457a25351 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -86,7 +86,7 @@ #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 -#define ASSET_HASH_MAIN_PK3 0x170fe375ef908e0c +#define ASSET_HASH_MAIN_PK3 0x4a0c65e774edb643 #define ASSET_HASH_MAPPATCH_PK3 0x16726c0303d699fb #ifdef USE_PATCH_FILE #define ASSET_HASH_PATCH_PK3 0x0000000000000000 diff --git a/src/deh_tables.c b/src/deh_tables.c index ed6fde1ee..2f72c1e56 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -725,6 +725,7 @@ struct menu_routine_s const MENU_ROUTINES[] = { struct menu_drawer_s const MENU_DRAWERS[] = { { "DRAWGENERICMENU", &M_DrawGenericMenu }, + { "DRAWGENERICSCROLLMENU", &M_DrawGenericScrollMenu }, { "DRAWCENTEREDMENU", &M_DrawCenteredMenu }, { "DRAWPAUSEMENU", &M_DrawPauseMenu }, { "DRAWCHECKLIST", &M_DrawChecklist }, diff --git a/src/info/menus.h b/src/info/menus.h index 83ac550b8..fd2e2ab3a 100644 --- a/src/info/menus.h +++ b/src/info/menus.h @@ -34,10 +34,12 @@ _(OP_OPENGL) _(OP_SOUND) _(SR_SOUNDTEST) +_(OP_SNDEFX) _(OP_HUD) _(OP_CHAT) _(OP_GAMEHUD) +_(OP_OFFSET) _(OP_CAMERA) _(OP_P1CAMERA) diff --git a/src/k_kart.c b/src/k_kart.c index d4eaad886..babf5b72c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3672,7 +3672,7 @@ static void K_GetKartBoostPower(player_t *player) player->speedboost = max(finalspeedboost, player->speedboost)/2; player->accelboost = max(finalaccelboost, player->accelboost)/2; } - else if ((player->aizdriftstrat && abs((player->drift) < 5)) || (K_GetKartButtons(player) & BT_BRAKE)) + else if (K_Sliptiding(player) || (K_GetKartButtons(player) & BT_BRAKE)) { player->speedboost = max(player->prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST)); player->accelboost = finalaccelboost; diff --git a/src/m_menu.c b/src/m_menu.c index 4d1c369db..7f4acd120 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -368,6 +368,8 @@ consvar_t cv_dummygpdifficulty = CVAR_INIT ("dummygpdifficulty", "Normal", CV_HI consvar_t cv_dummygpencore = CVAR_INIT ("dummygpencore", "Off", CV_HIDEN, CV_OnOff, NULL); consvar_t cv_dummygpcup = CVAR_INIT ("dummygpcup", "TEMP", CV_HIDEN, dummygpcup_cons_t, NULL); +consvar_t cv_menucaps = CVAR_INIT ("menucaps", "Off", CV_SAVE, CV_OnOff, NULL); + static tic_t playback_last_menu_interaction_leveltime = 0; // ========================================================================== @@ -1885,6 +1887,7 @@ void M_Init(void) quitmsg[QUIT3MSG6] = M_GetText("Aww, is Eggman's Nightclub too\ndifficult for you?\n\n(Press 'Y' to quit)"); CV_RegisterVar(&cv_serversort); + CV_RegisterVar(&cv_menucaps); } void M_InitCharacterTables(void) @@ -2054,8 +2057,8 @@ static void M_CentreText(INT32 y, const char *string) { INT32 x; //added : 02-02-98 : centre on 320, because V_DrawString centers on vid.width... - x = (BASEVIDWIDTH - V_StringWidth(string, V_OLDSPACING))>>1; - V_DrawString(x,y,V_OLDSPACING,string); + x = (BASEVIDWIDTH - V_StringWidth(string, MENUCAPS|V_OLDSPACING))>>1; + V_DrawString(x,y, MENUCAPS|V_OLDSPACING,string); } // @@ -2178,9 +2181,9 @@ void M_DrawGenericMenu(void) cursory = y; if ((currentMenu->menuitems[i].status & IT_DISPLAY)==IT_STRING) - V_DrawString(x, y, 0, currentMenu->menuitems[i].text); + V_DrawString(x, y, MENUCAPS, currentMenu->menuitems[i].text); else - V_DrawString(x, y, highlightflags, currentMenu->menuitems[i].text); + V_DrawString(x, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text); // Cvar specific handling switch (currentMenu->menuitems[i].status & IT_TYPE) @@ -2205,7 +2208,7 @@ void M_DrawGenericMenu(void) default: w = V_StringWidth(cv->string, 0); V_DrawString(BASEVIDWIDTH - x - w, y, - ((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags), cv->string); + ((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags)| MENUCAPS, cv->string); if (i == itemOn) { V_DrawCharacter(BASEVIDWIDTH - x - 10 - w - (skullAnimCounter/5), y, @@ -2220,7 +2223,7 @@ void M_DrawGenericMenu(void) y += STRINGHEIGHT; break; case IT_STRING2: - V_DrawString(x, y, 0, currentMenu->menuitems[i].text); + V_DrawString(x, y, MENUCAPS, currentMenu->menuitems[i].text); /* FALLTHRU */ case IT_DYLITLSPACE: y += SMALLLINEHEIGHT; @@ -2236,21 +2239,21 @@ void M_DrawGenericMenu(void) y = currentMenu->y+currentMenu->menuitems[i].alphaKey; /* FALLTHRU */ case IT_TRANSTEXT2: - V_DrawString(x, y, V_TRANSLUCENT, currentMenu->menuitems[i].text); + V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].text); y += SMALLLINEHEIGHT; break; case IT_QUESTIONMARKS: if (currentMenu->menuitems[i].alphaKey) y = currentMenu->y+currentMenu->menuitems[i].alphaKey; - V_DrawString(x, y, V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text)); + V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text)); y += SMALLLINEHEIGHT; break; case IT_HEADERTEXT: // draws 16 pixels to the left, in yellow text if (currentMenu->menuitems[i].alphaKey) y = currentMenu->y+currentMenu->menuitems[i].alphaKey; - V_DrawString(x-16, y, highlightflags, currentMenu->menuitems[i].text); + V_DrawString(x-16, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text); y += SMALLLINEHEIGHT; break; } @@ -2267,10 +2270,158 @@ void M_DrawGenericMenu(void) { V_DrawScaledPatch(currentMenu->x - 24, cursory, 0, W_CachePatchName("M_CURSOR", PU_CACHE)); - V_DrawString(currentMenu->x, cursory, highlightflags, currentMenu->menuitems[itemOn].text); + V_DrawString(currentMenu->x, cursory, MENUCAPS|highlightflags, currentMenu->menuitems[itemOn].text); } } +#define scrollareaheight 72 + +// note that alphakey is multiplied by 2 for scrolling menus to allow greater usage in UINT8 range. +void M_DrawGenericScrollMenu(void) +{ + INT32 x, y, i, max, bottom, tempcentery, cursory = 0; + + // DRAW MENU + x = currentMenu->x; + y = currentMenu->y; + + if (currentMenu->menuitems[currentMenu->numitems-1].alphaKey < scrollareaheight) + tempcentery = currentMenu->y; // Not tall enough to scroll, but this thinker is used in case it becomes so + else if ((currentMenu->menuitems[itemOn].alphaKey*2 - currentMenu->menuitems[0].alphaKey*2) <= scrollareaheight) + tempcentery = currentMenu->y - currentMenu->menuitems[0].alphaKey*2; + else if ((currentMenu->menuitems[currentMenu->numitems-1].alphaKey*2 - currentMenu->menuitems[itemOn].alphaKey*2) <= scrollareaheight) + tempcentery = currentMenu->y - currentMenu->menuitems[currentMenu->numitems-1].alphaKey*2 + 2*scrollareaheight; + else + tempcentery = currentMenu->y - currentMenu->menuitems[itemOn].alphaKey*2 + scrollareaheight; + + for (i = 0; i < currentMenu->numitems; i++) + { + if (currentMenu->menuitems[i].status != IT_DISABLED && currentMenu->menuitems[i].alphaKey*2 + tempcentery >= currentMenu->y) + break; + } + + for (bottom = currentMenu->numitems; bottom > 0; bottom--) + { + if (currentMenu->menuitems[bottom-1].status != IT_DISABLED) + break; + } + + for (max = bottom; max > 0; max--) + { + if (currentMenu->menuitems[max-1].status != IT_DISABLED && currentMenu->menuitems[max-1].alphaKey*2 + tempcentery <= (currentMenu->y + 2*scrollareaheight)) + break; + } + + if (i) + V_DrawString(currentMenu->x - 20, currentMenu->y - (skullAnimCounter/5), highlightflags, "\x1A"); // up arrow + if (max != bottom) + V_DrawString(currentMenu->x - 20, currentMenu->y + 2*scrollareaheight + (skullAnimCounter/5), highlightflags, "\x1B"); // down arrow + + // draw title (or big pic) + M_DrawMenuTitle(); + + for (; i < max; i++) + { + y = currentMenu->menuitems[i].alphaKey*2 + tempcentery; + if (i == itemOn) + cursory = y; + switch (currentMenu->menuitems[i].status & IT_DISPLAY) + { + case IT_PATCH: + case IT_DYBIGSPACE: + case IT_BIGSLIDER: + case IT_STRING2: + case IT_DYLITLSPACE: + case IT_GRAYPATCH: + case IT_TRANSTEXT2: + // unsupported + break; + case IT_NOTHING: + break; + case IT_STRING: + case IT_WHITESTRING: + if (i != itemOn && (currentMenu->menuitems[i].status & IT_DISPLAY)==IT_STRING) + V_DrawString(x, y, MENUCAPS, currentMenu->menuitems[i].text); + else + V_DrawString(x, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text); + + // Cvar specific handling + switch (currentMenu->menuitems[i].status & IT_TYPE) + case IT_CVAR: + { + consvar_t *cv = currentMenu->menuitems[i].itemaction.cvar; + switch (currentMenu->menuitems[i].status & IT_CVARTYPE) + { + case IT_CV_SLIDER: + M_DrawSlider(x, y, cv, (i == itemOn)); + case IT_CV_NOPRINT: // color use this + case IT_CV_INVISSLIDER: // monitor toggles use this + break; + case IT_CV_STRING: +#if 1 + if (y + 12 > (currentMenu->y + 2*scrollareaheight)) + break; + M_DrawTextBox(x, y + 4, MAXSTRINGLENGTH, 1); + V_DrawString(x + 8, y + 12, V_ALLOWLOWERCASE, cv->string); + if (skullAnimCounter < 4 && i == itemOn) + V_DrawCharacter(x + 8 + V_StringWidth(cv->string, 0), y + 12, + '_' | 0x80, false); +#else // cool new string type stuff, not ready for limelight + if (i == itemOn) + { + V_DrawFill(x-2, y-1, MAXSTRINGLENGTH*8 + 4, 8+3, 159); + V_DrawString(x, y, V_ALLOWLOWERCASE, cv->string); + if (skullAnimCounter < 4) + V_DrawCharacter(x + V_StringWidth(cv->string, 0), y, '_' | 0x80, false); + } + else + V_DrawRightAlignedString(BASEVIDWIDTH - x, y, + highlightflags|V_ALLOWLOWERCASE, cv->string); +#endif + break; + default: + V_DrawRightAlignedString(BASEVIDWIDTH - x, y, + ((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags)|MENUCAPS, cv->string); + if (i == itemOn) + { + V_DrawCharacter(BASEVIDWIDTH - x - 10 - V_StringWidth(cv->string, 0) - (skullAnimCounter/5), y, + '\x1C' | highlightflags, false); + V_DrawCharacter(BASEVIDWIDTH - x + 2 + (skullAnimCounter/5), y, + '\x1D' | highlightflags, false); + } + break; + } + break; + } + break; + case IT_TRANSTEXT: + switch (currentMenu->menuitems[i].status & IT_TYPE) + { + case IT_PAIR: + V_DrawString(x, y, + MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].patch); + V_DrawRightAlignedString(BASEVIDWIDTH - x, y, + V_TRANSLUCENT, currentMenu->menuitems[i].text); + break; + default: + V_DrawString(x, y, + MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].text); + } + break; + case IT_QUESTIONMARKS: + V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text)); + break; + case IT_HEADERTEXT: + V_DrawString(x-16, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text); + break; + } + } + + // DRAW THE SKULL CURSOR + V_DrawScaledPatch(currentMenu->x - 24, cursory, 0, + W_CachePatchName("M_CURSOR", PU_PATCH)); +} + void M_DrawPauseMenu(void) { #ifdef HAVE_DISCORDRPC @@ -2344,9 +2495,9 @@ void M_DrawCenteredMenu(void) cursory = y; if ((currentMenu->menuitems[i].status & IT_DISPLAY)==IT_STRING) - V_DrawCenteredString(x, y, 0, currentMenu->menuitems[i].text); + V_DrawCenteredString(x, y, MENUCAPS, currentMenu->menuitems[i].text); else - V_DrawCenteredString(x, y, highlightflags, currentMenu->menuitems[i].text); + V_DrawCenteredString(x, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].text); // Cvar specific handling switch(currentMenu->menuitems[i].status & IT_TYPE) @@ -2368,8 +2519,8 @@ void M_DrawCenteredMenu(void) y += 16; break; default: - V_DrawString(BASEVIDWIDTH - x - V_StringWidth(cv->string, 0), y, - ((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags), cv->string); + V_DrawString(BASEVIDWIDTH - x - V_StringWidth(cv->string, MENUCAPS), y, + ((cv->flags & CV_CHEAT) && !CV_IsSetToDefault(cv) ? warningflags : highlightflags)|MENUCAPS, cv->string); break; } break; @@ -2377,7 +2528,7 @@ void M_DrawCenteredMenu(void) y += STRINGHEIGHT; break; case IT_STRING2: - V_DrawCenteredString(x, y, 0, currentMenu->menuitems[i].text); + V_DrawCenteredString(x, y, MENUCAPS, currentMenu->menuitems[i].text); /* FALLTHRU */ case IT_DYLITLSPACE: y += SMALLLINEHEIGHT; @@ -2386,7 +2537,7 @@ void M_DrawCenteredMenu(void) if (currentMenu->menuitems[i].alphaKey) y = currentMenu->y+currentMenu->menuitems[i].alphaKey; - V_DrawCenteredString(x, y, V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text)); + V_DrawCenteredString(x, y, MENUCAPS|V_TRANSLUCENT|V_OLDSPACING, M_CreateSecretMenuOption(currentMenu->menuitems[i].text)); y += SMALLLINEHEIGHT; break; case IT_GRAYPATCH: @@ -2400,7 +2551,7 @@ void M_DrawCenteredMenu(void) y = currentMenu->y+currentMenu->menuitems[i].alphaKey; /* FALLTHRU */ case IT_TRANSTEXT2: - V_DrawCenteredString(x, y, V_TRANSLUCENT, currentMenu->menuitems[i].text); + V_DrawCenteredString(x, y, MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].text); y += SMALLLINEHEIGHT; break; } @@ -2417,14 +2568,14 @@ void M_DrawCenteredMenu(void) { V_DrawScaledPatch(x - V_StringWidth(currentMenu->menuitems[itemOn].text, 0)/2 - 24, cursory, 0, W_CachePatchName("M_CURSOR", PU_CACHE)); - V_DrawCenteredString(x, cursory, highlightflags, currentMenu->menuitems[itemOn].text); + V_DrawCenteredString(x, cursory, MENUCAPS|highlightflags, currentMenu->menuitems[itemOn].text); } if (menustack[0] == MN_MAIN) { INT32 texty = vid.height - 10*vid.dupy; #define addtext(f, str) {\ -V_DrawThinString(vid.dupx, texty, V_NOSCALESTART|f, str);\ +V_DrawThinString(vid.dupx, texty, MENUCAPS|V_NOSCALESTART|f, str);\ texty -= 10*vid.dupy;\ } if (customversionstring[0] != '\0') @@ -2822,19 +2973,19 @@ void M_DrawImageDef(void) if (currentMenu->menuitems[itemOn].alphaKey) { - V_DrawString(2,BASEVIDHEIGHT-10, V_YELLOWMAP, va("%d", (itemOn<<1)-1)); // intentionally not highlightflags, unlike below - V_DrawRightAlignedString(BASEVIDWIDTH-2,BASEVIDHEIGHT-10, V_YELLOWMAP, va("%d", itemOn<<1)); // ditto + V_DrawString(2,BASEVIDHEIGHT-10, MENUCAPS|V_YELLOWMAP, va("%d", (itemOn<<1)-1)); // intentionally not highlightflags, unlike below + V_DrawRightAlignedString(BASEVIDWIDTH-2,BASEVIDHEIGHT-10, MENUCAPS|V_YELLOWMAP, va("%d", itemOn<<1)); // ditto } else { INT32 x = BASEVIDWIDTH>>1, y = (BASEVIDHEIGHT>>1) - 4; x += (itemOn ? 1 : -1)*((BASEVIDWIDTH>>2) + 10); - V_DrawCenteredString(x, y-10, highlightflags, "USE ARROW KEYS"); + V_DrawCenteredString(x, y-10, MENUCAPS|highlightflags, "Use arrow keys"); V_DrawCharacter(x - 10 - (skullAnimCounter/5), y, '\x1C' | highlightflags, false); // left arrow V_DrawCharacter(x + 2 + (skullAnimCounter/5), y, '\x1D' | highlightflags, false); // right arrow - V_DrawCenteredString(x, y+10, highlightflags, "TO LEAF THROUGH"); + V_DrawCenteredString(x, y+10, MENUCAPS|highlightflags, "to leaf through"); } } @@ -3108,9 +3259,9 @@ void M_DrawAddons(void) } if (Playing()) - V_DrawCenteredString(BASEVIDWIDTH/2, 5, warningflags, "Adding files mid-game may cause problems."); + V_DrawCenteredString(BASEVIDWIDTH/2, 5, MENUCAPS|warningflags, "Adding files mid-game may cause problems."); else - V_DrawCenteredString(BASEVIDWIDTH/2, 5, 0, (recommendedflags == V_SKYMAP ? LOCATIONSTRING2 : LOCATIONSTRING1)); + V_DrawCenteredString(BASEVIDWIDTH/2, 5, MENUCAPS, (recommendedflags == V_SKYMAP ? LOCATIONSTRING2 : LOCATIONSTRING1)); if (numwadfiles <= NUMMAINWADS) y = 0; @@ -3131,7 +3282,7 @@ void M_DrawAddons(void) hilicol = V_GetStringColormap(highlightflags)[0]; - V_DrawString(x-21, (y - 16) + (lsheadingheight - 12), highlightflags|V_ALLOWLOWERCASE, M_AddonsHeaderPath()); + V_DrawString(x-21, (y - 16) + (lsheadingheight - 12), MENUCAPS|highlightflags|V_ALLOWLOWERCASE, M_AddonsHeaderPath()); V_DrawFill(x-21, (y - 16) + (lsheadingheight - 3), MAXSTRINGLENGTH*8+6, 1, hilicol); V_DrawFill(x-21, (y - 16) + (lsheadingheight - 2), MAXSTRINGLENGTH*8+6, 1, 30); @@ -3170,7 +3321,7 @@ void M_DrawAddons(void) i = m - (2*numaddonsshown + 1); if (i != 0) - V_DrawString(19, y+4 - (skullAnimCounter/5), highlightflags, "\x1A"); + V_DrawString(19, y+4 - (skullAnimCounter/5), MENUCAPS|highlightflags, "\x1A"); if (skullAnimCounter < 4) flashcol = V_GetStringColormap(highlightflags); @@ -3209,7 +3360,7 @@ void M_DrawAddons(void) } if (m != (ssize_t)sizedirmenu) - V_DrawString(19, y-12 + (skullAnimCounter/5), highlightflags, "\x1B"); + V_DrawString(19, y-12 + (skullAnimCounter/5), MENUCAPS|highlightflags, "\x1B"); y = BASEVIDHEIGHT - currentMenu->y + 1; @@ -3621,11 +3772,11 @@ static void DrawReplayHutReplayInfo(void) switch (demolist[dir_on[menudepthleft]].type) { case MD_NOTLOADED: - V_DrawCenteredString(160, 40, V_SNAPTOTOP, "Loading replay information..."); + V_DrawCenteredString(160, 40, MENUCAPS|V_SNAPTOTOP, "Loading replay information..."); break; case MD_INVALID: - V_DrawCenteredString(160, 40, V_SNAPTOTOP|warningflags, "This replay cannot be played."); + V_DrawCenteredString(160, 40, MENUCAPS|V_SNAPTOTOP|warningflags, "This replay cannot be played."); break; case MD_SUBDIR: @@ -3662,7 +3813,7 @@ static void DrawReplayHutReplayInfo(void) x += 85; if (demolist[dir_on[menudepthleft]].map != NEXTMAP_INVALID) - V_DrawString(x, y, V_SNAPTOTOP, G_BuildMapTitle(demolist[dir_on[menudepthleft]].map+1)); + V_DrawString(x, y, MENUCAPS|V_SNAPTOTOP, G_BuildMapTitle(demolist[dir_on[menudepthleft]].map+1)); else V_DrawString(x, y, V_SNAPTOTOP|V_ALLOWLOWERCASE|V_TRANSLUCENT, "Level is not loaded."); @@ -3682,12 +3833,12 @@ static void DrawReplayHutReplayInfo(void) break; } - V_DrawThinString(x, y+29, V_SNAPTOTOP|highlightflags, "WINNER"); + V_DrawThinString(x, y+29, MENUCAPS|V_SNAPTOTOP|highlightflags, "Winner"); V_DrawString(x+38, y+30, V_SNAPTOTOP|V_ALLOWLOWERCASE, demolist[dir_on[menudepthleft]].standings[0].name); if (demolist[dir_on[menudepthleft]].gametype == GT_RACE) { - V_DrawThinString(x, y+39, V_SNAPTOTOP|highlightflags, "TIME"); + V_DrawThinString(x, y+39, MENUCAPS|V_SNAPTOTOP|highlightflags, "Time"); V_DrawRightAlignedString(x+84, y+40, V_SNAPTOTOP, va("%d'%02d\"%02d", G_TicsToMinutes(demolist[dir_on[menudepthleft]].standings[0].timeorscore, true), G_TicsToSeconds(demolist[dir_on[menudepthleft]].standings[0].timeorscore), @@ -3696,7 +3847,7 @@ static void DrawReplayHutReplayInfo(void) } else { - V_DrawThinString(x, y+39, V_SNAPTOTOP|highlightflags, "SCORE"); + V_DrawThinString(x, y+39, MENUCAPS|V_SNAPTOTOP|highlightflags, "Score"); V_DrawString(x+32, y+40, V_SNAPTOTOP, va("%d", demolist[dir_on[menudepthleft]].standings[0].timeorscore)); } @@ -3788,9 +3939,9 @@ void M_DrawReplayHut(void) cursory = localy; if ((currentMenu->menuitems[i].status & IT_DISPLAY)==IT_STRING) - V_DrawString(x, localy, V_SNAPTOTOP|V_SNAPTOLEFT, currentMenu->menuitems[i].text); + V_DrawString(x, localy, MENUCAPS|V_SNAPTOTOP|V_SNAPTOLEFT, currentMenu->menuitems[i].text); else - V_DrawString(x, localy, V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[i].text); + V_DrawString(x, localy, MENUCAPS|V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[i].text); } y += currentMenu->menuitems[replaylistitem].alphaKey; @@ -3861,7 +4012,7 @@ void M_DrawReplayHut(void) // Draw the cursor V_DrawScaledPatch(currentMenu->x - 24, cursory, V_SNAPTOTOP|V_SNAPTOLEFT, W_CachePatchName("M_CURSOR", PU_CACHE)); - V_DrawString(currentMenu->x, cursory, V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[itemOn].text); + V_DrawString(currentMenu->x, cursory, MENUCAPS|V_SNAPTOTOP|V_SNAPTOLEFT|highlightflags, currentMenu->menuitems[itemOn].text); // Now draw some replay info! V_DrawFill(10, 10, 300, 60, V_SNAPTOTOP|159); @@ -3886,11 +4037,11 @@ void M_DrawReplayStartMenu(void) patch_t *patch; UINT8 *colormap; - V_DrawRightAlignedString(BASEVIDWIDTH-100, STARTY + i*20, V_SNAPTOTOP|highlightflags, va("%2d", demolist[dir_on[menudepthleft]].standings[i].ranking)); + V_DrawRightAlignedString(BASEVIDWIDTH-100, STARTY + i*20, MENUCAPS|V_SNAPTOTOP|highlightflags, va("%2d", demolist[dir_on[menudepthleft]].standings[i].ranking)); V_DrawThinString(BASEVIDWIDTH-96, STARTY + i*20, V_SNAPTOTOP|V_ALLOWLOWERCASE, demolist[dir_on[menudepthleft]].standings[i].name); if (demolist[dir_on[menudepthleft]].standings[i].timeorscore == UINT32_MAX-1) - V_DrawThinString(BASEVIDWIDTH-92, STARTY + i*20 + 9, V_SNAPTOTOP, "NO CONTEST"); + V_DrawThinString(BASEVIDWIDTH-92, STARTY + i*20 + 9, MENUCAPS|V_SNAPTOTOP, "No Contest"); else if (demolist[dir_on[menudepthleft]].gametype == GT_RACE) V_DrawRightAlignedString(BASEVIDWIDTH-40, STARTY + i*20 + 9, V_SNAPTOTOP, va("%d'%02d\"%02d", G_TicsToMinutes(demolist[dir_on[menudepthleft]].standings[i].timeorscore, true), @@ -4584,7 +4735,7 @@ void M_DrawChecklist(void) ++line; secretname = M_CreateSecretMenuOption(unlockables[i].name); - V_DrawString(8, (line*8), (unlockables[i].unlocked ? recommendedflags : warningflags), (secret ? secretname : unlockables[i].name)); + V_DrawString(8, (line*8), (unlockables[i].unlocked ? recommendedflags : warningflags)|MENUCAPS, (secret ? secretname : unlockables[i].name)); if (conditionSets[unlockables[i].conditionset - 1].numconditions) { @@ -4678,7 +4829,7 @@ void M_DrawEmblemHints(void) break; } if (!j) - V_DrawCenteredString(160, 48, highlightflags, "No hidden medals on this map."); + V_DrawCenteredString(160, 48, MENUCAPS|highlightflags, "No hidden medals on this map."); M_DrawGenericMenu(); } @@ -4721,9 +4872,9 @@ void M_DrawSkyRoom(void) { y += currentMenu->y; - V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, y, highlightflags, cv_soundtest.string); + V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, y, MENUCAPS|highlightflags, cv_soundtest.string); if (cv_soundtest.value) - V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, y + 8, highlightflags, S_sfx[cv_soundtest.value].name); + V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, y + 8, MENUCAPS|highlightflags, S_sfx[cv_soundtest.value].name); if (i == itemOn) lengthstring = V_StringWidth(cv_soundtest.string, 0); @@ -5227,15 +5378,15 @@ static void M_DrawStatsMaps(void) besttime += mapheaderinfo[j]->mainrecord[preset]->time; } - V_DrawString(20, 42, highlightflags, "Combined time records:"); + V_DrawString(20, 42, MENUCAPS|highlightflags, "Combined time records:"); sprintf(beststr, "%i:%02i:%02i.%02i", G_TicsToHours(besttime), G_TicsToMinutes(besttime, false), G_TicsToSeconds(besttime), G_TicsToCentiseconds(besttime)); V_DrawRightAlignedString(BASEVIDWIDTH-16, 42, (mapsunfinished ? warningflags : 0), beststr); if (mapsunfinished) - V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, warningflags, va("(%d unfinished)", mapsunfinished)); + V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, MENUCAPS|warningflags, va("(%d unfinished)", mapsunfinished)); else - V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, recommendedflags, "(complete)"); + V_DrawRightAlignedString(BASEVIDWIDTH-16, 50, MENUCAPS|recommendedflags, "(complete)"); V_DrawString(32, 50, 0, va("x %d/%d", M_CountEmblems(), numemblems+numextraemblems)); V_DrawSmallScaledPatch(20, 50, 0, W_CachePatchName("GOTITA", PU_STATIC)); @@ -5253,8 +5404,8 @@ static void M_DrawStatsMaps(void) } else if (dotopname) { - V_DrawString(20, y, highlightflags, "LEVEL NAME"); - V_DrawString(256, y, highlightflags, "MEDALS"); + V_DrawString(20, y, MENUCAPS|highlightflags, "Level Name"); + V_DrawString(256, y, MENUCAPS|highlightflags, "Medals"); y += 8; dotopname = false; } @@ -5263,11 +5414,11 @@ static void M_DrawStatsMaps(void) M_DrawMapEmblems(mnum+1, 295, y); if (mapheaderinfo[mnum]->levelflags & LF_NOZONE) - V_DrawString(20, y, 0, va("%s %s", + V_DrawString(20, y, MENUCAPS, va("%s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->actnum)); else - V_DrawString(20, y, 0, va("%s %s %s", + V_DrawString(20, y, MENUCAPS, va("%s %s %s", mapheaderinfo[mnum]->lvlttl, (mapheaderinfo[mnum]->zonttl[0] ? mapheaderinfo[mnum]->zonttl : "Zone"), mapheaderinfo[mnum]->actnum)); @@ -5279,8 +5430,8 @@ static void M_DrawStatsMaps(void) } if (dotopname && !location) { - V_DrawString(20, y, highlightflags, "LEVEL NAME"); - V_DrawString(256, y, highlightflags, "MEDALS"); + V_DrawString(20, y, MENUCAPS|highlightflags, "Level Name"); + V_DrawString(256, y, MENUCAPS|highlightflags, "Medals"); y += 8; } else if (location) @@ -5330,16 +5481,16 @@ bottomarrow: #define DRAWTIMESTAT(y, title, field) { \ char timebuf[80]; \ - V_DrawString(20, (y), highlightflags, title); \ + V_DrawString(20, (y), MENUCAPS|highlightflags, title); \ tic_t timeval = kartstats.field; \ snprintf(timebuf, 80, "%02i:%02i:%02i", G_TicsToHours(timeval), G_TicsToMinutes(timeval, false), G_TicsToSeconds(timeval)); \ - V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), 0, timebuf); \ + V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), MENUCAPS, timebuf); \ } #define DRAWAMOUNTSTAT(y, title, field) { \ V_DrawString(20, (y), highlightflags, title); \ unsigned amountval = kartstats.field; \ - V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), 0, va("%u", amountval)); \ + V_DrawRightAlignedString(BASEVIDWIDTH-16, (y), MENUCAPS, va("%u", amountval)); \ } static void M_DrawStatsPlaytime(void) @@ -5349,12 +5500,12 @@ static void M_DrawStatsPlaytime(void) G_TicsToHours(kartstats.totalplaytime), G_TicsToMinutes(kartstats.totalplaytime, false), G_TicsToSeconds(kartstats.totalplaytime))); - V_DrawString(20, 62, highlightflags, "Total Matches:"); - V_DrawRightAlignedString(BASEVIDWIDTH-16, 62, 0, va("%i played", kartstats.matchesplayed)); + V_DrawString(20, 62, MENUCAPS|highlightflags, "Total Matches:"); + V_DrawRightAlignedString(BASEVIDWIDTH-16, 62, MENUCAPS, va("%i played", kartstats.matchesplayed)); - V_DrawString(20, 82, highlightflags, "Online Power Level:"); - V_DrawRightAlignedString(BASEVIDWIDTH-16, 92, 0, va("Race: %i", vspowerlevel[PWRLV_RACE])); - V_DrawRightAlignedString(BASEVIDWIDTH-16, 102, 0, va("Battle: %i", vspowerlevel[PWRLV_BATTLE])); + V_DrawString(20, 82, MENUCAPS|highlightflags, "Online Power Level:"); + V_DrawRightAlignedString(BASEVIDWIDTH-16, 92, MENUCAPS, va("Race: %i", vspowerlevel[PWRLV_RACE])); + V_DrawRightAlignedString(BASEVIDWIDTH-16, 102, MENUCAPS, va("Battle: %i", vspowerlevel[PWRLV_BATTLE])); // Nothing else to draw if (kartstats.vanilla) @@ -5391,7 +5542,7 @@ void M_DrawLevelStats(void) { M_DrawMenuTitle(); - V_DrawCenteredString(BASEVIDWIDTH/2, 28, highlightflags, statsPages[statsCurrentPage].title); + V_DrawCenteredString(BASEVIDWIDTH/2, 28, MENUCAPS|highlightflags, statsPages[statsCurrentPage].title); INT32 w = V_StringWidth(statsPages[statsCurrentPage].title, highlightflags); V_DrawCharacter(BASEVIDWIDTH/2 - w/2 - 10 - (skullAnimCounter/5), 28, @@ -5551,7 +5702,7 @@ static void M_DrawTimeAttackBackground(menuitem_t *item) INT16 x = currentMenu->x; INT16 y = currentMenu->y+item->alphaKey; consvar_t *ncv = item->itemaction.cvar; - V_DrawString(x, y, V_TRANSLUCENT, item->text); + V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT, item->text); if (item->status & IT_CV_STRING) { M_DrawTextBox(x + 32, y - 8, MAXPLAYERNAME, 1); @@ -5567,7 +5718,7 @@ static void M_DrawTimeAttackBackground(menuitem_t *item) soffset = 0; // Should see nothing but strings - V_DrawString(BASEVIDWIDTH - x - soffset - strw, y, highlightflags|V_TRANSLUCENT, str); + V_DrawString(BASEVIDWIDTH - x - soffset - strw, y, MENUCAPS|highlightflags|V_TRANSLUCENT, str); } } @@ -5605,7 +5756,7 @@ void M_DrawTimeAttackMenu(void) if (i == itemOn) cursory = y; - V_DrawString(x, y, (dispstatus == IT_WHITESTRING) ? highlightflags : 0 , currentMenu->menuitems[i].text); + V_DrawString(x, y, (dispstatus == IT_WHITESTRING) ? highlightflags : 0 | MENUCAPS, currentMenu->menuitems[i].text); // Cvar specific handling if ((currentMenu->menuitems[i].status & IT_TYPE) == IT_CVAR) @@ -5628,7 +5779,7 @@ void M_DrawTimeAttackMenu(void) soffset = 0; // Should see nothing but strings - V_DrawString(BASEVIDWIDTH - x - soffset - strw, y, highlightflags, str); + V_DrawString(BASEVIDWIDTH - x - soffset - strw, y, MENUCAPS|highlightflags, str); if (i == itemOn) { @@ -5658,7 +5809,7 @@ void M_DrawTimeAttackMenu(void) // DRAW THE SKULL CURSOR V_DrawScaledPatch(x - 24, cursory, 0, W_CachePatchName("M_CURSOR", PU_CACHE)); - V_DrawString(x, cursory, highlightflags, currentMenu->menuitems[itemOn].text); + V_DrawString(x, cursory, MENUCAPS|highlightflags, currentMenu->menuitems[itemOn].text); // Level record list if (cv_nextmap.value) @@ -5675,11 +5826,11 @@ void M_DrawTimeAttackMenu(void) if (levellistmode != LLM_ITEMBREAKER) { - V_DrawRightAlignedString(149, 80, highlightflags, "BEST LAP:"); + V_DrawRightAlignedString(149, 80, MENUCAPS|highlightflags, "Best Lap:"); K_drawKartTimestamp(lap, 19, 86, -1, 2); } - V_DrawRightAlignedString(292, 80, highlightflags, "BEST TIME:"); + V_DrawRightAlignedString(292, 80, MENUCAPS|highlightflags, "Best Time:"); K_drawKartTimestamp(time, 162, 86, cv_nextmap.value-1, 1); } @@ -5703,7 +5854,7 @@ void M_DrawTimeAttackMenu(void) mode = "Custom Mode"; } - V_DrawString(50, 104, V_6WIDTHSPACE, mode); + V_DrawString(50, 104, MENUCAPS|V_6WIDTHSPACE, mode); } // ALWAYS DRAW player name, level name, skin and color even when not on this menu! @@ -6231,8 +6382,8 @@ void M_Refresh(INT32 choice) // Display a little "please wait" message. M_DrawTextBox(52, BASEVIDHEIGHT/2-10, 25, 3); - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, 0, "Searching for servers..."); - V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2)+12, 0, "Please wait."); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, MENUCAPS, "Searching for servers..."); + V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2)+12, MENUCAPS, "Please wait."); I_OsPolling(); I_UpdateNoBlit(); if (rendermode == render_soft) @@ -6272,13 +6423,13 @@ void M_DrawConnectMenu(void) // Page num V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + M_GetItemY(MN_MP_CONNECT, "PAGE"), - highlightflags, va("%u of %d", serverlistpage+1, numPages)); + MENUCAPS|highlightflags, va("%u of %d", serverlistpage+1, numPages)); // Horizontal line! V_DrawFill(1, currentMenu->y+32, 318, 1, 0); if (serverlistcount <= 0) - V_DrawString(currentMenu->x,currentMenu->y+SERVERHEADERHEIGHT, 0, "No servers found"); + V_DrawString(currentMenu->x,currentMenu->y+SERVERHEADERHEIGHT, MENUCAPS, "No servers found"); else for (i = 0; i < min(serverlistcount - serverlistpage * serversperpage, serversperpage); i++) { @@ -6336,8 +6487,8 @@ void M_DrawConnectMenu(void) // Display a little "please wait" message. M_DrawTextBox(52, BASEVIDHEIGHT/2-10, 25, 3); - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, 0, message); - V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2)+12, 0, "Please wait."); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, MENUCAPS, message); + V_DrawCenteredString(BASEVIDWIDTH/2, (BASEVIDHEIGHT/2)+12, MENUCAPS, "Please wait."); } } @@ -6749,10 +6900,10 @@ void M_DrawMPMainMenu(void) Update the maxplayers label... #endif V_DrawRightAlignedString(BASEVIDWIDTH-x, y+M_GetItemY(MN_MP_MAIN, "STASRV"), - (M_IsItemOn(MN_MP_MAIN, "STASRV") ? highlightflags : 0), "(2-16 players)"); + (M_IsItemOn(MN_MP_MAIN, "STASRV") ? highlightflags : 0)|MENUCAPS, "(2-16 players)"); V_DrawRightAlignedString(BASEVIDWIDTH-x, y+M_GetItemY(MN_MP_MAIN, "OFLSRV"), - (M_IsItemOn(MN_MP_MAIN, "OFLSRV") ? highlightflags : 0), + (M_IsItemOn(MN_MP_MAIN, "OFLSRV") ? highlightflags : 0)|MENUCAPS, "(2-4 players)" ); @@ -6902,7 +7053,7 @@ static void M_ConnectIP(INT32 choice) // A little "please wait" message. M_DrawTextBox(56, BASEVIDHEIGHT/2-12, 24, 2); - V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, 0, "Connecting to server..."); + V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT/2, MENUCAPS, "Connecting to server..."); I_OsPolling(); I_UpdateNoBlit(); if (rendermode == render_soft) @@ -7090,10 +7241,10 @@ void M_DrawSetupMultiPlayerMenu(void) // SRB2Kart: draw the stat backer // labels - V_DrawThinString(statx+16, staty, V_6WIDTHSPACE|highlightflags, "Acceleration"); - V_DrawThinString(statx+91, staty, V_6WIDTHSPACE|highlightflags, "Max Speed"); - V_DrawThinString(statx, staty+12, V_6WIDTHSPACE|highlightflags, "Handling"); - V_DrawThinString(statx+7, staty+77, V_6WIDTHSPACE|highlightflags, "Weight"); + V_DrawThinString(statx+16, staty, MENUCAPS|V_6WIDTHSPACE|highlightflags, "Acceleration"); + V_DrawThinString(statx+91, staty, MENUCAPS|V_6WIDTHSPACE|highlightflags, "Max Speed"); + V_DrawThinString(statx, staty+12, MENUCAPS|V_6WIDTHSPACE|highlightflags, "Handling"); + V_DrawThinString(statx+7, staty+77, MENUCAPS|V_6WIDTHSPACE|highlightflags, "Weight"); // label arrows V_DrawFixedPatch((statx+64)<x, menudefs[MN_OP_JOYSTICKSET]->y+LINEHEIGHT*i-4, (i == compareval) ? V_GREENMAP : 0, joystickInfo[i]); + V_DrawString(menudefs[MN_OP_JOYSTICKSET]->x, menudefs[MN_OP_JOYSTICKSET]->y+LINEHEIGHT*i-4, ((i == compareval) ? V_GREENMAP : 0)|MENUCAPS, joystickInfo[i]); } } @@ -8071,6 +8222,7 @@ void M_Setup1PControlsMenu(INT32 choice) // Set proper gamepad options M_SetItemRoutine(MN_OP_CHANGECONTROLS, "SETJOY", M_Setup1PJoystickMenu); M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEADZ", &cv_deadzone[0]); + M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEAZS", &cv_deadzonestyle[0]); // Unhide P1-only controls M_SetItemStatus(MN_OP_CHANGECONTROLS, "TALK", IT_CONTROL); // Chat @@ -8104,6 +8256,7 @@ void M_Setup2PControlsMenu(INT32 choice) // Set proper gamepad options M_SetItemRoutine(MN_OP_CHANGECONTROLS, "SETJOY", M_Setup2PJoystickMenu); M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEADZ", &cv_deadzone[1]); + M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEAZS", &cv_deadzonestyle[1]); // Hide P1-only controls M_SetItemStatus(MN_OP_CHANGECONTROLS, "TALK", IT_GRAYEDOUT2); // Chat @@ -8137,6 +8290,7 @@ void M_Setup3PControlsMenu(INT32 choice) // Set proper gamepad options M_SetItemRoutine(MN_OP_CHANGECONTROLS, "SETJOY", M_Setup3PJoystickMenu); M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEADZ", &cv_deadzone[2]); + M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEAZS", &cv_deadzonestyle[2]); // Hide P1-only controls M_SetItemStatus(MN_OP_CHANGECONTROLS, "TALK", IT_GRAYEDOUT2); // Chat @@ -8170,6 +8324,7 @@ void M_Setup4PControlsMenu(INT32 choice) // Set proper gamepad options M_SetItemRoutine(MN_OP_CHANGECONTROLS, "SETJOY", M_Setup4PJoystickMenu); M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEADZ", &cv_deadzone[3]); + M_SetItemCvar(MN_OP_CHANGECONTROLS, "DEAZS", &cv_deadzonestyle[3]); // Hide P1-only controls M_SetItemStatus(MN_OP_CHANGECONTROLS, "TALK", IT_GRAYEDOUT2); // Chat @@ -8270,7 +8425,7 @@ void M_DrawControl(void) if (currentMenu->menuitems[i].status == IT_CONTROL) { - V_DrawString(x, y, ((i == itemOn) ? highlightflags : 0), currentMenu->menuitems[i].text); + V_DrawString(x, y, ((i == itemOn) ? highlightflags : 0)|MENUCAPS, currentMenu->menuitems[i].text); tmp[0] ='\0'; for (iter = 0; iter < MAXINPUTMAPPING; iter++) @@ -8291,15 +8446,15 @@ void M_DrawControl(void) (BASEVIDWIDTH-currentMenu->x, y, highlightflags, tmp); } /*else if (currentMenu->menuitems[i].status == IT_GRAYEDOUT2) - V_DrawString(x, y, V_TRANSLUCENT, currentMenu->menuitems[i].text);*/ + V_DrawString(x, y, MENUCAPS|V_TRANSLUCENT, currentMenu->menuitems[i].text);*/ else if ((currentMenu->menuitems[i].status == IT_HEADER) && (i != max-1)) - V_DrawString(13, y+6, highlightflags, currentMenu->menuitems[i].text); + V_DrawString(13, y+6, MENUCAPS|highlightflags, currentMenu->menuitems[i].text); else if (currentMenu->menuitems[i].status & IT_STRING) { - V_DrawString(x, y, ((i == itemOn) ? highlightflags : 0), currentMenu->menuitems[i].text); + V_DrawString(x, y, ((i == itemOn) ? highlightflags : 0)|MENUCAPS, currentMenu->menuitems[i].text); if (currentMenu->menuitems[i].status & IT_CVAR) { - V_DrawRightAlignedString(BASEVIDWIDTH-currentMenu->x, y, highlightflags, currentMenu->menuitems[i].itemaction.cvar->string); + V_DrawRightAlignedString(BASEVIDWIDTH-currentMenu->x, y, MENUCAPS|highlightflags, currentMenu->menuitems[i].itemaction.cvar->string); if (i == itemOn) { w = V_StringWidth(currentMenu->menuitems[i].itemaction.cvar->string, highlightflags); @@ -8316,7 +8471,7 @@ void M_DrawControl(void) if (!name) name = "?"; w = V_StringWidth(name, highlightflags); (w > BASEVIDWIDTH/2 - 4 ? V_DrawRightAlignedThinString : V_DrawRightAlignedString) - (BASEVIDWIDTH-currentMenu->x, y, highlightflags, name); + (BASEVIDWIDTH-currentMenu->x, y, MENUCAPS|highlightflags, name); } } @@ -8545,7 +8700,7 @@ void M_DrawVideoMenu(void) M_DrawGenericMenu(); V_DrawRightAlignedString(BASEVIDWIDTH - currentMenu->x, currentMenu->y + M_GetItemY(MN_OP_VIDEO, "SETMOD"), - (SCR_IsAspectCorrect(vid.width, vid.height) ? recommendedflags : highlightflags), + (SCR_IsAspectCorrect(vid.width, vid.height) ? recommendedflags : highlightflags)|MENUCAPS, va("%dx%d", vid.width, vid.height)); #ifdef HWRENDER @@ -8577,13 +8732,13 @@ void M_DrawHUDOptions(void) M_DrawGenericMenu(); x -= w0; - V_DrawString(x, y, highlightflags, str0); + V_DrawString(x, y, MENUCAPS|highlightflags, str0); x -= w1; - V_DrawString(x, y, warningflags, str1); + V_DrawString(x, y, MENUCAPS|warningflags, str1); x -= w2; - V_DrawString(x, y, highlightflags, str2); + V_DrawString(x, y, MENUCAPS|highlightflags, str2); x -= w3; - V_DrawString(x, y, recommendedflags, str3); + V_DrawString(x, y, MENUCAPS|recommendedflags, str3); V_DrawRightAlignedString(x, y, highlightflags, "("); } @@ -8596,17 +8751,17 @@ void M_DrawVideoMode(void) M_DrawMenuTitle(); V_DrawCenteredString(BASEVIDWIDTH/2, menudefs[MN_OP_VIDEOMODE]->y, - highlightflags, "Choose mode, reselect to change default"); + MENUCAPS|highlightflags, "Choose mode, reselect to change default"); row = 41; col = menudefs[MN_OP_VIDEOMODE]->y + 14; for (i = 0; i < vidm_nummodes; i++) { if (i == vidm_selected) - V_DrawString(row, col, highlightflags, modedescs[i].desc); + V_DrawString(row, col, MENUCAPS|highlightflags, modedescs[i].desc); // Show multiples of 320x200 as green. else - V_DrawString(row, col, (modedescs[i].goodratio) ? recommendedflags : 0, modedescs[i].desc); + V_DrawString(row, col, MENUCAPS|(modedescs[i].goodratio) ? recommendedflags : 0, modedescs[i].desc); col += 8; if ((i % vidm_column_size) == (vidm_column_size-1)) @@ -8644,11 +8799,11 @@ void M_DrawVideoMode(void) cv_scr_width.value, cv_scr_height.value)); V_DrawCenteredString(BASEVIDWIDTH/2, menudefs[MN_OP_VIDEOMODE]->y + 138, - recommendedflags, "Marked modes are recommended."); + MENUCAPS|recommendedflags, "Marked modes are recommended."); V_DrawCenteredString(BASEVIDWIDTH/2, menudefs[MN_OP_VIDEOMODE]->y + 146, - highlightflags, "Other modes may have visual errors."); + MENUCAPS|highlightflags, "Other modes may have visual errors."); V_DrawCenteredString(BASEVIDWIDTH/2, menudefs[MN_OP_VIDEOMODE]->y + 158, - highlightflags, "Larger modes may have performance issues."); + MENUCAPS|highlightflags, "Larger modes may have performance issues."); } // Draw the cursor for the VidMode menu @@ -8903,7 +9058,7 @@ void M_DrawMonitorToggles(void) if (shitsfree) shitsfree--; - V_DrawCenteredString(BASEVIDWIDTH/2, currentMenu->y, highlightflags, va("* %s *", currentMenu->menuitems[itemOn].text)); + V_DrawCenteredString(BASEVIDWIDTH/2, currentMenu->y, MENUCAPS|highlightflags, va("* %s *", currentMenu->menuitems[itemOn].text)); } void M_HandleMonitorToggles(INT32 choice) diff --git a/src/m_menu.h b/src/m_menu.h index de4512507..0e912b7e3 100644 --- a/src/m_menu.h +++ b/src/m_menu.h @@ -359,6 +359,7 @@ void M_HandleDiscordRequests(INT32 choice); #endif void M_DrawGenericMenu(void); +void M_DrawGenericScrollMenu(void); void M_DrawCenteredMenu(void); void M_DrawPauseMenu(void); void M_DrawChecklist(void); @@ -470,6 +471,10 @@ extern consvar_t cv_dummyrings, cv_dummylives; extern consvar_t cv_dummymenuplayer, cv_dummyteam, cv_dummyspectate, cv_dummyscramble; extern consvar_t cv_dummyattackingrings, cv_dummyattackingstacking, cv_dummyattackingchaining; extern consvar_t cv_dummyattackingslipdash, cv_dummyattackingpurpledrift; + +extern consvar_t cv_menucaps; +// allow menu text to be displayed in lowercase +#define MENUCAPS (!cv_menucaps.value ? V_ALLOWLOWERCASE : 0) extern CV_PossibleValue_t gametype_cons_t[]; extern char dummystaffname[22]; From bfa520f5a4e61b231e947d3ed2710d74247acb71 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 18 May 2025 23:58:51 -0400 Subject: [PATCH 31/35] Add Menucaps to kartstats menu --- src/m_menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 7f4acd120..22f32e05f 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -5495,8 +5495,8 @@ bottomarrow: static void M_DrawStatsPlaytime(void) { - V_DrawString(20, 42, highlightflags, "Total Play Time:"); - V_DrawCenteredString(BASEVIDWIDTH/2, 52, 0, va("%i hours, %i minutes, %i seconds", + V_DrawString(20, 42, MENUCAPS|highlightflags, "Total Play Time:"); + V_DrawCenteredString(BASEVIDWIDTH/2, 52, MENUCAPS, va("%i hours, %i minutes, %i seconds", G_TicsToHours(kartstats.totalplaytime), G_TicsToMinutes(kartstats.totalplaytime, false), G_TicsToSeconds(kartstats.totalplaytime))); From 62537cece1dfbc7472fabccc6a0634f28179b1e3 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 19 May 2025 00:12:55 -0400 Subject: [PATCH 32/35] Fix sneaker stacks sometimes sticking --- src/k_kart.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index babf5b72c..6068059f0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7538,14 +7538,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } if (player->sneakertimer) - { player->sneakertimer = K_ChainOrDeincrementTime(player, player->sneakertimer, 1, false); - if (player->sneakertimer <= 0) - { - player->mo->flags2 &= ~MF2_WATERRUN; - player->numsneakers = 0; - } + if (player->sneakertimer <= 0) + { + player->mo->flags2 &= ~MF2_WATERRUN; + player->numsneakers = 0; } if (player->realsneakertimer) From 7d67d7b03b94b6bd7446f347ade364de9417ebb0 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 19 May 2025 00:39:43 -0400 Subject: [PATCH 33/35] Disable the gainax until we have graphics for it. --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 6068059f0..5653b3105 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2745,7 +2745,7 @@ void K_KartMoveAnimation(player_t *player) gainaxstate = S_GAINAX_MID1; } - if (destGlanceDir && !(player->pflags & PF_GAINAX)) + /*if (destGlanceDir && !(player->pflags & PF_GAINAX)) { mobj_t *gainax = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_GAINAX); gainax->movedir = (destGlanceDir < 0) ? (ANGLE_270-ANG10) : (ANGLE_90+ANG10); @@ -2753,7 +2753,7 @@ void K_KartMoveAnimation(player_t *player) P_SetMobjState(gainax, gainaxstate); gainax->flags2 |= MF2_AMBUSH; player->pflags |= PF_GAINAX; - } + }*/ } else if (player->cmd.forwardmove < 0 && destGlanceDir == 0) { From 3c941ac6a44694ee524aa714df64a9fc9440ce59 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 19 May 2025 08:02:33 -0400 Subject: [PATCH 34/35] Remove OPUS As much as I would like it, Windows is garbage. Assets update coming soon --- README.md | 4 +--- src/d_main.cpp | 2 +- thirdparty/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dfea1128c..c3ca855fb 100644 --- a/README.md +++ b/README.md @@ -54,9 +54,7 @@ git clone https://codeberg.org/NepDisk/blankart.git cd blankart mkdir build cd build -cmake -G "MSYS Makefiles" ..ƒƒ -./_deps/sdl2_mixer-src/external/download.sh -cmake -G "MSYS Makefiles" ..ƒƒ +cmake -G "MSYS Makefiles" .. make -j$(nproc) ``` diff --git a/src/d_main.cpp b/src/d_main.cpp index 457a25351..e43ccf45a 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -86,7 +86,7 @@ #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 -#define ASSET_HASH_MAIN_PK3 0x4a0c65e774edb643 +#define ASSET_HASH_MAIN_PK3 0x7ec7eac23ac1dfdc #define ASSET_HASH_MAPPATCH_PK3 0x16726c0303d699fb #ifdef USE_PATCH_FILE #define ASSET_HASH_PATCH_PK3 0x0000000000000000 diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index b9a2e51d7..c4139f774 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -45,7 +45,7 @@ if(NOT "${SRB2_CONFIG_SYSTEM_LIBRARIES}") "SDL2MIXER_MP3 ON" "SDL2MIXER_MP3_DRMP3 ON" "SDL2MIXER_MIDI ON" - "SDL2MIXER_OPUS ON" + "SDL2MIXER_OPUS OFF" "SDL2MIXER_VORBIS STB" "SDL2MIXER_WAVE ON" ) From 83312b6e26920322e9ea79125a71e20812cb9507 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 19 May 2025 09:16:43 -0400 Subject: [PATCH 35/35] Fix TA menu menucaps --- 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 22f32e05f..520a203e1 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -5756,7 +5756,7 @@ void M_DrawTimeAttackMenu(void) if (i == itemOn) cursory = y; - V_DrawString(x, y, (dispstatus == IT_WHITESTRING) ? highlightflags : 0 | MENUCAPS, currentMenu->menuitems[i].text); + V_DrawString(x, y, ((dispstatus == IT_WHITESTRING) ? highlightflags : 0) | MENUCAPS, currentMenu->menuitems[i].text); // Cvar specific handling if ((currentMenu->menuitems[i].status & IT_TYPE) == IT_CVAR)