From 077b34b37f61a7b24c703776691c576a8d11581b Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 10 Mar 2025 19:14:35 -0400 Subject: [PATCH 01/18] Make legacy waypoint helper and expose K_RingsActive and K_UsingLegacyCheckpoints to lua --- src/k_hud.c | 14 +++++++------- src/k_kart.c | 36 +++++++++++++++++++++++------------- src/k_kart.h | 1 + src/k_waypoint.cpp | 5 +++-- src/lua_baselib.c | 19 ++++++++++++++++++- src/p_inter.c | 4 ++-- src/p_setup.c | 2 +- src/p_spec.c | 2 +- 8 files changed, 56 insertions(+), 27 deletions(-) diff --git a/src/k_hud.c b/src/k_hud.c index 93d893b2d..53b25c167 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -4143,7 +4143,7 @@ static void K_drawDistributionDebugger(void) bestbumper = players[i].bumper; } - if (!(numbosswaypoints > 0)) + if (!(K_UsingLegacyCheckpoints())) { // lovely double loop...... for (i = 0; i < MAXPLAYERS; i++) @@ -4161,13 +4161,13 @@ static void K_drawDistributionDebugger(void) if (spbplace != -1 && stplyr->position == spbplace+1) { // SPB Rush Mode: It's 2nd place's job to catch-up items and make 1st place's job hell - if (!(numbosswaypoints > 0)) + if (!(K_UsingLegacyCheckpoints())) pdis = (3 * pdis) / 2; spbrush = true; } - if (!(numbosswaypoints > 0)) + if (!(K_UsingLegacyCheckpoints())) { pdis = K_ScaleItemDistance(pdis, pingame, spbrush); @@ -4179,7 +4179,7 @@ static void K_drawDistributionDebugger(void) } } - if (numbosswaypoints > 0) + if (K_UsingLegacyCheckpoints()) useodds = K_FindLegacyUseodds(stplyr, 0, pingame, bestbumper, spbrush, dontforcespb); else useodds = K_FindUseodds(stplyr, 0, pdis, bestbumper, spbrush); @@ -4207,7 +4207,7 @@ static void K_drawDistributionDebugger(void) - if (numbosswaypoints > 0) + if (K_UsingLegacyCheckpoints()) itemodds = K_KartGetLegacyItemOdds(useodds, i, 0, spbrush); else itemodds = K_KartGetItemOdds( @@ -4264,7 +4264,7 @@ static void K_drawDistributionDebugger(void) else V_DrawString(0, 0, V_SPLITSCREEN|V_HUDTRANS|V_SNAPTOTOP, va("USEODDS %d", useodds)); - if (numbosswaypoints > 0) + if (K_UsingLegacyCheckpoints()) V_DrawSmallString(70, 0, V_SPLITSCREEN|V_HUDTRANS|V_SNAPTOTOP, "Legacy Distance Mode"); } @@ -4274,7 +4274,7 @@ static void K_drawCheckpointDebugger(void) if (stplyr != &players[displayplayers[0]]) // only for p1 return; - if (numbosswaypoints > 0) + if (K_UsingLegacyCheckpoints()) { if (stplyr->starpostnum >= (numstarposts - (numstarposts/2))) V_DrawString(8, 184, 0, va("Checkpoint: %d / %d (Can finish)", stplyr->starpostnum, numstarposts)); diff --git a/src/k_kart.c b/src/k_kart.c index f08d74af3..3ad89e444 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1428,7 +1428,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) else if (!(player->itemroulette >= (TICRATE*3))) return; - if (!(numbosswaypoints > 0)) + if (!(K_UsingLegacyCheckpoints())) { for (i = 0; i < MAXPLAYERS; i++) { @@ -1455,12 +1455,12 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) if (spbplace != -1 && player->position == spbplace+1) { // SPB Rush Mode: It's 2nd place's job to catch-up items and make 1st place's job hell - if (!(numbosswaypoints > 0)) + if (!(K_UsingLegacyCheckpoints())) pdis = (3 * pdis) / 2; spbrush = true; } - if (!(numbosswaypoints > 0)) + if (!(K_UsingLegacyCheckpoints())) { pdis = K_ScaleItemDistance(pdis, pingame, spbrush); @@ -1583,7 +1583,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) } } - if (!(numbosswaypoints > 0)) + if (!(K_UsingLegacyCheckpoints())) { // SPECIAL CASE No. 6: // Force SPB onto 2nd if they get too far behind @@ -1609,7 +1609,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) // Split into another function for a debug function below // Use a legacy version for maps not using waypoints. - if (numbosswaypoints > 0) + if (K_UsingLegacyCheckpoints()) useodds = K_FindLegacyUseodds(player, mashed, pingame, bestbumper, spbrush, dontforcespb); else useodds = K_FindUseodds(player, mashed, pdis, bestbumper, spbrush); @@ -1628,7 +1628,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) for (i = 1; i < NUMKARTRESULTS; i++) { - if (numbosswaypoints > 0) + if (K_UsingLegacyCheckpoints()) { spawnchance[i] = (totalspawnchance += K_KartGetLegacyItemOdds(useodds, i, mashed, spbrush)); @@ -7073,7 +7073,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } // Start at lap 1 when using old checkpoint system just to be safe. - if ((numbosswaypoints > 0) && (player->laps == 0) && (numlaps > 0)) + if ((K_UsingLegacyCheckpoints()) && (player->laps == 0) && (numlaps > 0)) player->laps = 1; if (player->stealingtimer == 0 && player->stolentimer == 0 @@ -8238,9 +8238,9 @@ static void K_UpdatePlayerWaypoints(player_t *const player) // While the player was in the "bigwaypointgap" state, laps did not change from crossing finish lines. // So reset the lap back to normal, in case they were able to get behind the line. - player->laps = player->lastsafelap; - if (numbosswaypoints == 0) + if (!K_UsingLegacyCheckpoints()) { + player->laps = player->lastsafelap; player->starpostnum = player->lastsafestarpost; } } @@ -8874,10 +8874,9 @@ void K_UpdateAllPlayerPositions(void) if (player->respawn > 0 && player->lastsafelap != player->laps) { - player->laps = player->lastsafelap; - - if (numbosswaypoints == 0) + if (!K_UsingLegacyCheckpoints()) { + player->laps = player->lastsafelap; player->starpostnum = player->lastsafestarpost; } } @@ -8890,7 +8889,7 @@ void K_UpdateAllPlayerPositions(void) { if (playeringame[i] && players[i].mo && !P_MobjWasRemoved(players[i].mo)) { - if (numbosswaypoints > 0) + if (K_UsingLegacyCheckpoints()) K_KartLegacyUpdatePosition(&players[i]); else K_KartUpdatePosition(&players[i]); @@ -10170,6 +10169,17 @@ boolean K_RingsActive(void) return true; } +boolean K_UsingLegacyCheckpoints(void) +{ + if (numbosswaypoints > 0) + { + // We are using Kart V1 waypoints! + return true; + } + + return false; +} + void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount) { switch (itemType) diff --git a/src/k_kart.h b/src/k_kart.h index 7fa06f995..5651540d1 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -187,6 +187,7 @@ void K_UnsetItemOut(player_t *player); boolean K_SafeRespawnPosition(mobj_t * mo); boolean K_RingsActive(void); +boolean K_UsingLegacyCheckpoints(void); void K_UpdateMobjItemOverlay(mobj_t *part, SINT8 itemType, UINT8 itemCount); diff --git a/src/k_waypoint.cpp b/src/k_waypoint.cpp index ab110798f..9584b2b17 100644 --- a/src/k_waypoint.cpp +++ b/src/k_waypoint.cpp @@ -20,6 +20,7 @@ #include "z_zone.h" #include "g_game.h" #include "p_slopes.h" +#include "k_kart.h" #include "cxxutil.hpp" @@ -2779,7 +2780,7 @@ boolean K_SetupWaypointList(void) if (!waypointcap) { - if (numbosswaypoints == 0) + if (!K_UsingLegacyCheckpoints()) { CONS_Alert(CONS_ERROR, "No waypoints or legacy checkpoints in map.\n"); } @@ -2799,7 +2800,7 @@ boolean K_SetupWaypointList(void) if (firstwaypoint == NULL) { - if (numbosswaypoints == 0) + if (!K_UsingLegacyCheckpoints()) { CONS_Alert(CONS_ERROR, "No waypoints or legacy checkpoints in map.\n"); } diff --git a/src/lua_baselib.c b/src/lua_baselib.c index cdeb7f183..c54a4a09a 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -3974,7 +3974,21 @@ static int lib_kSafeRespawnPosition(lua_State *L) //HUDSAFE if (!mobj) return LUA_ErrInvalid(L, "mobj_t"); - lua_pushfixed(L, K_SafeRespawnPosition(mobj)); + lua_pushboolean(L, K_SafeRespawnPosition(mobj)); + return 1; +} + +// Checks if Rings are applicable. +static int lib_kRingsActive(lua_State *L) +{ + lua_pushboolean(L, K_RingsActive()); + return 1; +} + +// Checks if current map is using legacy boss3 bassed checkpoints. Useful for map compat. +static int lib_kUsingLegacyCheckpoints(lua_State *L) +{ + lua_pushboolean(L, K_UsingLegacyCheckpoints()); return 1; } @@ -4276,6 +4290,9 @@ static luaL_Reg lib[] = { {"K_GetCollideAngle",lib_kGetCollideAngle}, + {"K_RingsActive",lib_kRingsActive}, + {"K_UsingLegacyCheckpoints",lib_kUsingLegacyCheckpoints}, + // k_boss {"K_InitBossHealthBar", lib_kInitBossHealthBar}, {"K_UpdateBossHealthBar", lib_kUpdateBossHealthBar}, diff --git a/src/p_inter.c b/src/p_inter.c index d595ff85d..6259fe05e 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -849,7 +849,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost) (void)snaptopost; // Player must have touched all previous starposts - if ((post->health - player->starpostnum > 1) && (numbosswaypoints == 0)) + if ((post->health - player->starpostnum > 1) && (!K_UsingLegacyCheckpoints())) { if (!player->checkskip) { @@ -866,7 +866,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost) } // Going backwards triggers sound - if ((post->health >= ((numstarposts/2) + player->starpostnum)) && (numbosswaypoints > 0)) + if ((post->health >= ((numstarposts/2) + player->starpostnum)) && (K_UsingLegacyCheckpoints())) { if (!player->checkskip) S_StartSound(toucher, sfx_s26d); diff --git a/src/p_setup.c b/src/p_setup.c index 7dc990526..e801b8d3e 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -8689,7 +8689,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) if ((K_SetupWaypointList() == false)) { - if (numbosswaypoints == 0) + if (!K_UsingLegacyCheckpoints()) { CONS_Alert(CONS_ERROR, "Waypoints were not able to be setup and legacy checkpoints do not exist! Player positions will not work correctly.\n"); } diff --git a/src/p_spec.c b/src/p_spec.c index f45338f8a..7bde16463 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1987,7 +1987,7 @@ static void K_HandleLapIncrement(player_t *player) { if (K_IgnoreFinishLine(player)) return; - if (((numbosswaypoints > 0) ? (player->starpostnum >= (numstarposts - (numstarposts/2))) : (player->starpostnum == numstarposts)) || (player->laps == 0)) + if (((K_UsingLegacyCheckpoints()) ? (player->starpostnum >= (numstarposts - (numstarposts/2))) : (player->starpostnum == numstarposts)) || (player->laps == 0)) { size_t i = 0; UINT8 nump = 0; From 8e9370c11ff22b63d3e68052c66e910529c59756 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 10 Mar 2025 19:36:05 -0400 Subject: [PATCH 02/18] Item odd changes Drop target was dropped a point. FlameShield was made slighty more common since its less strong. The change for superings in useodds 0 has been dropped a point. --- src/k_kart.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3ad89e444..856668959 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -362,11 +362,11 @@ static UINT8 K_KartItemOddsRace[NUMKARTRESULTS-1][8] = /*Hyudoro*/ { 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring /*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink - /*Super Ring*/ { 2, 1, 1, 0, 0, 0, 0, 0 }, // Super Ring + /*Super Ring*/ { 1, 2, 2, 0, 0, 0, 0, 0 }, // Super Ring /*Land Mine*/ { 3, 0, 0, 0, 0, 0, 0, 0 }, // Land Mine /*Bubble Shield*/ { 0, 1, 2, 1, 0, 0, 0, 0 }, // Bubble Shield - /*Flame Shield*/ { 0, 0, 0, 0, 0, 1, 3, 5 }, // Flame Shield - /*Drop Target*/ { 2, 0, 0, 0, 0, 0, 0, 0 }, // Drop Target + /*Flame Shield*/ { 0, 0, 0, 0, 0, 2, 4, 5 }, // Flame Shield + /*Drop Target*/ { 1, 0, 0, 0, 0, 0, 0, 0 }, // Drop Target /*Sneaker x2*/ { 0, 0, 2, 2, 2, 0, 0, 0 }, // Sneaker x2 /*Sneaker x3*/ { 0, 0, 0, 1, 6,10, 5, 0 }, // Sneaker x3 /*Banana x3*/ { 0, 1, 1, 0, 0, 0, 0, 0 }, // Banana x3 From b15a3a1c09bc9fcf8e2d6ab605f2c5480b292879 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 11 Mar 2025 12:05:28 +0000 Subject: [PATCH 03/18] Update extras/udmf-spec.txt --- extras/udmf-spec.txt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/extras/udmf-spec.txt b/extras/udmf-spec.txt index 111aaba62..6bc931d30 100644 --- a/extras/udmf-spec.txt +++ b/extras/udmf-spec.txt @@ -173,7 +173,7 @@ BlanKart's namespace implements the following additional fields: gravity = ; // Sector's gravity multiplier. Default = 1.0. offroad = ; // Sector's offroad multiplier. Default = 0.0. damagetype = ; // Damage inflicted by the sector. - // Can be "None", "Generic", "Lava", "DeathPit", "Instakill", or "Stumble". + // Can be "None", "Generic", "Lava", "DeathPit", "Instakill". // Default = "None". action = ; // Sector action, same as line special. Default = 0. @@ -217,7 +217,8 @@ BlanKart's namespace implements the following additional fields: nostepup = ; // true = objects can't step up. doublestepup = ; // true = objects have increased step up. nostepdown = ; // true = objects can't step down. - cheatcheckactivator = ; // true = players activate cheat checks when in this sector. + starpostactivator = ; // true = players activate starposts when in this sector. + cheatcheckactivator = ; // true = players activate starposts when in this sector. exit = ; // true = players finish match when entering sector. deleteitems = ; // true = items instantly explode when entering sector. fan = ; // true = players are propelled upwards in this sector. @@ -225,7 +226,7 @@ BlanKart's namespace implements the following additional fields: zoomtubeend = ; // true = sector is end of a zoom tube. speedpad = ; // true = players are launched forward by this sector. - finishline = l // true = players gain a lap or finish the race in this sector. Used for legacy support. + finishline = ; // true = players gain a lap or finish the race in this sector. Used for legacy support. sneakerpanel = ; // true = players are speed boosted forward by this sector. waterpanel = ; // true = players are speed boosted forward by this sector and are able to drive on water. redpogospring = ; // true = players are bounced into the air by this sector. @@ -303,8 +304,12 @@ RR 1.0: 20.09.2024 BK 1.0: 08.02.2025 - Document spec updated to account for BlanKart differnces. -BK 1.0: 10.02.25 +BK 1.0: 10.02.2025 - Added offset*_* flags. - Added flags for nophysics_floor and nophysics_ceiling. - Readded effect6 for compat reasons. - Readded gravityoverride. + +BK 1.0: 11.03.2025 +- Fixed up some typos. +- Added more effects. From df6be21c24f09c4871c9d6ab3cd610f6f2d4c8f8 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 11 Mar 2025 11:38:50 -0400 Subject: [PATCH 04/18] Revert SPB explosion bypass like to be like v1 --- src/p_inter.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 6259fe05e..0465f2733 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -533,6 +533,13 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; } + if (player->invincibilitytimer > 0 || player->growshrinktimer > 0 || player->hyudorotimer > 0) + { + //player->flashing = 0; + K_DropHnextList(player, false); + K_StripItems(player); + } + S_StopSound(special); // Don't continue playing the gurgle or the siren spbexplode = P_SpawnMobj(toucher->x, toucher->y, toucher->z, MT_SPBEXPLOSION); @@ -2158,7 +2165,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da // Check if the player is allowed to be damaged! // If not, then spawn the instashield effect instead. - if (!force && !(inflictor && inflictor->type == MT_SPBEXPLOSION && inflictor->extravalue1 == 1)) + if (!force) { if (gametyperules & GTR_BUMPERS) { @@ -2188,7 +2195,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { - // Check if we should allow wombo combos (hard hits by default, inverted by the presence of DMG_WOMBO). + // Check if we should allow explosion combos. boolean allowcombo = hardhit; if ((allowcombo == false) && (player->flashing > 0 || player->squishedtimer > 0)) From 26da74c4aae0b5eb528ec2f6a8feeecf2faa6847 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 11 Mar 2025 11:42:06 -0400 Subject: [PATCH 05/18] Karma doesn't combo. --- src/p_inter.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 0465f2733..d9c78af6f 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2160,7 +2160,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da else { const UINT8 type = (damagetype & DMG_TYPEMASK); - const boolean hardhit = (type == DMG_EXPLODE || type == DMG_KARMA); // This damage type can do evil stuff like ALWAYS combo + const boolean explosioncombo = (type == DMG_EXPLODE); // This damage type can do evil stuff like ALWAYS combo INT16 ringburst = 5; // Check if the player is allowed to be damaged! @@ -2196,9 +2196,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da { // Check if we should allow explosion combos. - boolean allowcombo = hardhit; - - if ((allowcombo == false) && (player->flashing > 0 || player->squishedtimer > 0)) + if ((explosioncombo == false) && (player->flashing > 0 || player->squishedtimer > 0)) { // Post-hit invincibility K_DoInstashield(player); @@ -2284,7 +2282,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da K_PlayPainSound(target, source); - if ((hardhit == true) || (cv_kartdebughuddrop.value && !modeattacking)) + if ((explosioncombo == true) || (cv_kartdebughuddrop.value && !modeattacking)) { K_DropItems(player); } From 33c2d0955795ea1ad9c2cf19a0e65ac21ab86a51 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 11 Mar 2025 19:35:52 -0400 Subject: [PATCH 06/18] Remove remaining uses of line->special in processspecial --- src/p_spec.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index 7bde16463..5d2c1a782 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3374,7 +3374,7 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha INT32 trigid = args[0]; if (trigid < 0 || trigid > 31) // limited by 32 bit variable - CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger (sidedef %hu): bad trigger ID %d\n", line->sidenum[0], trigid); + CONS_Debug(DBG_GAMELOGIC, "Unlockable trigger: bad trigger ID %d\n", trigid); else { unlocktriggers |= 1 << trigid; @@ -3389,7 +3389,7 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha } // Execute one time only - line->special = 0; + activator = NULL; break; case 442: // Calls P_SetMobjState on mobjs of a given type in the tagged sectors @@ -4119,10 +4119,10 @@ boolean P_ProcessSpecial(activator_t *activator, INT16 special, INT32 *args, cha if (mobj) { mobj->angle = FixedAngle(args[3] << FRACBITS); - CONS_Debug(DBG_GAMELOGIC, "Linedef Type %d - Spawn Object: %d spawned at (%d, %d, %d)\n", line->special, mobj->type, mobj->x>>FRACBITS, mobj->y>>FRACBITS, mobj->z>>FRACBITS); //TODO: Convert mobj->type to a string somehow. + CONS_Debug(DBG_GAMELOGIC, "Linedef Type %d - Spawn Object: %d spawned at (%d, %d, %d)\n", special, mobj->type, mobj->x>>FRACBITS, mobj->y>>FRACBITS, mobj->z>>FRACBITS); //TODO: Convert mobj->type to a string somehow. } else - CONS_Alert(CONS_ERROR,"Linedef Type %d - Spawn Object: Object did not spawn!\n", line->special); + CONS_Alert(CONS_ERROR,"Linedef Type %d - Spawn Object: Object did not spawn!\n", special); } break; From a55393bf4c3109ff004e2be7ae272fafd3de6cd0 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 11 Mar 2025 22:01:47 -0400 Subject: [PATCH 07/18] Add camera tilting to menu --- src/m_menu.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 4f1361654..dfac45743 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1095,12 +1095,13 @@ static menuitem_t OP_CamOptionsMenu[] = { {IT_HEADER, NULL, "Camera Options", {NULL}, 0}, - {IT_STRING | IT_CVAR, NULL, "Lagless Camera", {.cvar = &cv_laglesscam}, 20}, + {IT_STRING | IT_CVAR, NULL, "Camera Tiling", {.cvar = &cv_tilting}, 20}, + {IT_STRING | IT_CVAR, NULL, "Lagless Camera", {.cvar = &cv_laglesscam}, 30}, - {IT_STRING | IT_SUBMENU, NULL, "Player 1 Camera options...", {.submenu = &OP_Player1CamOptionsDef}, 40}, - {IT_STRING | IT_SUBMENU, NULL, "Player 2 Camera options...", {.submenu = &OP_Player2CamOptionsDef}, 50}, - {IT_STRING | IT_SUBMENU, NULL, "Player 3 Camera options...", {.submenu = &OP_Player3CamOptionsDef}, 60}, - {IT_STRING | IT_SUBMENU, NULL, "Player 4 Camera options...", {.submenu = &OP_Player4CamOptionsDef}, 70}, + {IT_STRING | IT_SUBMENU, NULL, "Player 1 Camera options...", {.submenu = &OP_Player1CamOptionsDef}, 50}, + {IT_STRING | IT_SUBMENU, NULL, "Player 2 Camera options...", {.submenu = &OP_Player2CamOptionsDef}, 60}, + {IT_STRING | IT_SUBMENU, NULL, "Player 3 Camera options...", {.submenu = &OP_Player3CamOptionsDef}, 70}, + {IT_STRING | IT_SUBMENU, NULL, "Player 4 Camera options...", {.submenu = &OP_Player4CamOptionsDef}, 80}, }; static menuitem_t OP_Player1CamOptionsMenu[] = From 52b532f265451141cabc02b98dbe0291481d4707 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 11 Mar 2025 22:48:02 -0400 Subject: [PATCH 08/18] Make sloperoll+pitch toggleable and make cameratilt not rely on sloperoll toggle The toggle is handled in renderer for both gl and software! --- src/lua_mobjlib.c | 4 ++++ src/p_mobj.c | 6 +++--- src/p_mobj.h | 1 + src/p_saveg.c | 4 ++++ src/p_user.c | 17 ++++++++++++++++- src/r_main.cpp | 3 +++ src/r_main.h | 2 ++ src/r_patchrotation.c | 11 ++++++++++- 8 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index eab532d9e..6d826e3bb 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -32,6 +32,8 @@ enum mobj_e { mobj_angle, mobj_pitch, mobj_roll, + mobj_slopepitch, + mobj_sloperoll, mobj_rollangle, mobj_sprite, mobj_frame, @@ -117,6 +119,8 @@ static const char *const mobj_opt[] = { "angle", "pitch", "roll", + "slopepitch", + "sloperoll", "rollangle", "sprite", "frame", diff --git a/src/p_mobj.c b/src/p_mobj.c index dc2c82439..f533d63ca 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1290,12 +1290,12 @@ void P_SetPitchRollFromSlope(mobj_t *mo, pslope_t *slope) fixed_t tempy = slope->normal.y; fixed_t tempx = slope->normal.x; - mo->pitch = R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx); - mo->roll = R_PointToAngle2(0, 0, tempz, tempy); + mo->slopepitch = R_PointToAngle2(0, 0, FixedSqrt(FixedMul(tempy, tempy) + FixedMul(tempz, tempz)), tempx); + mo->sloperoll = R_PointToAngle2(0, 0, tempz, tempy); } else { - mo->pitch = mo->roll = 0; + mo->slopepitch = mo->sloperoll = 0; } } diff --git a/src/p_mobj.h b/src/p_mobj.h index cdd0ba610..58477770c 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -294,6 +294,7 @@ struct mobj_t // More drawing info: to determine current sprite. angle_t angle, pitch, roll; // orientation + angle_t slopepitch, sloperoll; angle_t old_angle, old_pitch, old_roll; // orientation interpolation angle_t old_angle2, old_pitch2, old_roll2; angle_t rollangle; diff --git a/src/p_saveg.c b/src/p_saveg.c index c5b7d7feb..1b297244b 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3735,6 +3735,10 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) mobj->terrain = NULL; } + // Reset some non-synch values + mobj->sloperoll = 0; + mobj->slopepitch = 0; + // set sprev, snext, bprev, bnext, subsector P_SetThingPosition(mobj); diff --git a/src/p_user.c b/src/p_user.c index f995b863d..0f2c785b7 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4105,6 +4105,21 @@ Quaketilt (player_t *player) return moma; } +static angle_t P_GetCameraPitchRollAngle(mobj_t *mobj, player_t *viewPlayer) +{ + angle_t viewingAngle = R_PointToAnglePlayer(viewPlayer, mobj->x, mobj->y); + + fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT); + fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT); + + angle_t sloperolll = mobj->slopepitch; + angle_t slopepitch = mobj->sloperoll; + + angle_t rollOrPitch = FixedMul(mobj->pitch + sloperolll, pitchMul) + FixedMul(mobj->roll + slopepitch, rollMul); + + return rollOrPitch; +} + static void DoABarrelRoll (player_t *player) { @@ -4129,7 +4144,7 @@ DoABarrelRoll (player_t *player) return; } - slope = InvAngle(R_GetPitchRollAngle(player->mo, player)); + slope = InvAngle(P_GetCameraPitchRollAngle(player->mo, player)); if (AbsAngle(slope) < ANGLE_11hh) { diff --git a/src/r_main.cpp b/src/r_main.cpp index 02577f964..f80181fc4 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -193,6 +193,8 @@ consvar_t cv_maxportals = CVAR_INIT ("maxportals", "2", CV_SAVE, maxportals_cons consvar_t cv_renderstats = CVAR_INIT ("renderstats", "Off", 0, CV_OnOff, NULL); +consvar_t cv_sloperoll = CVAR_INIT ("spritesloperoll", "On", CV_SAVE, CV_OnOff, NULL); + void SplitScreen_OnChange(void) { UINT8 i; @@ -1826,6 +1828,7 @@ void R_RegisterEngineStuff(void) CV_RegisterVar(&cv_tilting); CV_RegisterVar(&cv_actionmovie); CV_RegisterVar(&cv_windowquake); + CV_RegisterVar(&cv_sloperoll); CV_RegisterVar(&cv_showhud); CV_RegisterVar(&cv_translucenthud); diff --git a/src/r_main.h b/src/r_main.h index fbf3484f2..762095bff 100644 --- a/src/r_main.h +++ b/src/r_main.h @@ -156,6 +156,8 @@ extern consvar_t cv_skybox; extern consvar_t cv_tailspickup; extern consvar_t cv_debugfinishline; +extern consvar_t cv_sloperoll; + // debugging typedef enum { diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index 2051d5ca0..7ecfe3ee7 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -28,7 +28,16 @@ angle_t R_GetPitchRollAngle(mobj_t *mobj, player_t *viewPlayer) fixed_t pitchMul = -FINESINE(viewingAngle >> ANGLETOFINESHIFT); fixed_t rollMul = FINECOSINE(viewingAngle >> ANGLETOFINESHIFT); - angle_t rollOrPitch = FixedMul(mobj->pitch, pitchMul) + FixedMul(mobj->roll, rollMul); + angle_t sloperolll = mobj->slopepitch; + angle_t slopepitch = mobj->sloperoll; + + if (!cv_sloperoll.value) + { + sloperolll = 0; + slopepitch = 0; + } + + angle_t rollOrPitch = FixedMul(mobj->pitch + sloperolll, pitchMul) + FixedMul(mobj->roll + slopepitch, rollMul); return rollOrPitch; } From 8f0a8860c694ab6c9384660ff21a5f790d03241a Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 11 Mar 2025 22:58:55 -0400 Subject: [PATCH 09/18] Default turnsmoothing to Off Someone is bound to complain at first if these is on by default --- src/g_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_input.c b/src/g_input.c index 5fb843ddf..66690e92e 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -31,7 +31,7 @@ consvar_t cv_mousesens2 = CVAR_INIT ("mousesens2", "20", CV_SAVE, mousesens_cons consvar_t cv_mouseysens = CVAR_INIT ("mouseysens", "20", CV_SAVE, mousesens_cons_t, NULL); consvar_t cv_mouseysens2 = CVAR_INIT ("mouseysens2", "20", CV_SAVE, mousesens_cons_t, NULL); consvar_t cv_controlperkey = CVAR_INIT ("controlperkey", "One", CV_SAVE, onecontrolperkey_cons_t, NULL); -consvar_t cv_turnsmooth = CVAR_INIT ("turnsmoothing", "Slow", CV_SAVE, turnsmooth_cons_t, NULL); +consvar_t cv_turnsmooth = CVAR_INIT ("turnsmoothing", "Off", CV_SAVE, turnsmooth_cons_t, NULL); INT32 mousex, mousey; INT32 mlooky; // like mousey but with a custom sensitivity for mlook From c13e4b1d614758b4ef2a6c51c934f36e391f3086 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 11 Mar 2025 23:23:50 -0400 Subject: [PATCH 10/18] Modify M_ChangeCvar conditions --- src/m_menu.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index dfac45743..bb2bcec29 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2487,12 +2487,15 @@ static void M_ChangeCvar(INT32 choice) choice = (choice<<1) - 1; - if (cv->flags & CV_FLOAT) + if (((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_SLIDER) + ||((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_INVISSLIDER) + ||((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_NOMOD)) { - if (((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_SLIDER) - ||((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_INVISSLIDER) - ||((currentMenu->menuitems[itemOn].status & IT_CVARTYPE) == IT_CV_NOMOD) - || !(currentMenu->menuitems[itemOn].status & IT_CV_INTEGERSTEP)) + CV_SetValue(cv,cv->value+choice); + } + else if (cv->flags & CV_FLOAT) + { + if (!(currentMenu->menuitems[itemOn].status & IT_CV_INTEGERSTEP)) { char s[20]; float n = FIXED_TO_FLOAT(cv->value)+(choice)*(1.0f/16.0f); From 1f6e8f25cdb1886b1812cbbb3dbac8dd311304dc Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 12 Mar 2025 12:36:07 -0400 Subject: [PATCH 11/18] Music Test port from Saturn pt1 Mostly ported over but its kind of broken for whatever reason... --- src/f_finale.c | 2 +- src/m_menu.c | 358 ++++++++++++++++++++++++++++++++++++++++++++++++- src/s_sound.c | 60 ++++++++- src/s_sound.h | 6 + 4 files changed, 417 insertions(+), 9 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 8fabfe37a..b5617107d 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -956,7 +956,7 @@ void F_BlanStartCredits(void) S_StopMusic(); S_StopSounds(); - S_ChangeMusicInternal("KMAP04", true); + S_ChangeMusicInternal("BLANCD", true); S_ShowMusicCredit(); finalecount = 0; diff --git a/src/m_menu.c b/src/m_menu.c index bb2bcec29..01c069e36 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -226,6 +226,7 @@ static void M_DestroyRobots(INT32 choice); //static void M_LevelSelectWarp(INT32 choice); static void M_Credits(INT32 choice); static void M_BlanCredits(INT32 choice); +static void M_MusicTest(INT32 choice); static void M_PandorasBox(INT32 choice); static void M_EmblemHints(INT32 choice); static char *M_GetConditionString(condition_t cond); @@ -365,6 +366,7 @@ static void M_DrawCenteredMenu(void); static void M_DrawAddons(void); static void M_DrawSkyRoom(void); static void M_DrawChecklist(void); +static void M_DrawMusicTest(void); static void M_DrawEmblemHints(void); static void M_DrawPauseMenu(void); static void M_DrawLevelSelectOnly(boolean leftfade, boolean rightfade); @@ -391,6 +393,7 @@ static boolean M_ExitPandorasBox(void); static boolean M_QuitMultiPlayerMenu(void); static void M_HandleAddons(INT32 choice); static void M_HandleSoundTest(INT32 choice); +static void M_HandleMusicTest(INT32 choice); static void M_HandleImageDef(INT32 choice); //static void M_HandleLoadSave(INT32 choice); static void M_HandleLevelStats(INT32 choice); @@ -819,6 +822,10 @@ static menuitem_t SR_UnlockChecklistMenu[] = {IT_SUBMENU | IT_STRING, NULL, "NEXT", {.submenu = &MainDef}, 192}, }; +static menuitem_t SR_MusicTestMenu[] = +{ + {IT_KEYHANDLER | IT_STRING, NULL, "", {.routine = M_HandleMusicTest}, 0}, +}; static menuitem_t SR_EmblemHintMenu[] = { {IT_STRING|IT_CVAR, NULL, "Medal Radar", {.cvar = &cv_itemfinder}, 10}, @@ -1389,9 +1396,10 @@ static menuitem_t OP_SoundOptionsMenu[] = {IT_STRING|IT_CVAR, NULL, "Powerup Warning", {.cvar = &cv_kartinvinsfx}, 95}, {IT_KEYHANDLER|IT_STRING, NULL, "Sound Test", {.routine = M_HandleSoundTest}, 110}, + {IT_STRING|IT_CALL, NULL, "Music Test", {.routine = M_MusicTest}, 120}, - {IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", {.cvar = &cv_playmusicifunfocused}, 125}, - {IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", {.cvar = &cv_playsoundifunfocused}, 135}, + {IT_STRING|IT_CVAR, NULL, "Play Music While Unfocused", {.cvar = &cv_playmusicifunfocused}, 135}, + {IT_STRING|IT_CVAR, NULL, "Play SFX While Unfocused", {.cvar = &cv_playsoundifunfocused}, 145}, }; static menuitem_t OP_DataOptionsMenu[] = @@ -1872,6 +1880,20 @@ menu_t SR_UnlockChecklistDef = 0, NULL }; + +menu_t SR_MusicTestDef = +{ + MN_NONE, + NULL, + sizeof (SR_MusicTestMenu)/sizeof (menuitem_t), + &OP_SoundOptionsDef, + SR_MusicTestMenu, + M_DrawMusicTest, + 60, 150, + 0, + NULL +}; + menu_t SR_EmblemHintDef = { MN_NONE, @@ -6809,6 +6831,338 @@ static void M_HandleSoundTest(INT32 choice) } } +static musicdef_t *curplaying = NULL; +static INT32 st_sel = 0; +static tic_t st_time = 0; +static size_t st_namescroll = 0; +static size_t st_namescrollstate = 0; +//static patch_t* st_radio[9]; +//static patch_t* st_launchpad[4]; + +static void M_MusicTest(INT32 choice) +{ + //INT32 ul = skyRoomMenuTranslations[choice-1]; + //UINT8 i; + //char buf[8]; + (void)choice; + + if (!S_PrepareSoundTest()) + { + M_StartMessage(M_GetText("No selectable tracks found.\n"),NULL,MM_NOTHING); + return; + } + + curplaying = NULL; + st_time = 0; + + st_sel = 0; + + M_SetupNextMenu(&SR_MusicTestDef); +} + +static void M_DrawMusicTest(void) +{ + INT32 x, y, i; + + // let's handle the ticker first. ideally we'd tick this somewhere else, BUT... + if (curplaying) + { + { + fixed_t work; + + work = st_time; + + if (st_time >= (FRACUNIT << (FRACBITS - 2))) // prevent overflow jump - takes about 15 minutes of loop on the same song to reach + st_time = work; + + st_time += renderdeltatics; + } + } + + x = 90<title && curplaying->title[0]) + titl = va("%s - ", curplaying->title); + else if (curplaying->title && curplaying->source[0]) + titl = va("%s - ", curplaying->source); + else + titl = va("%s - ", "What did you do......."); + } + else + titl = "NONE - "; + + i = V_LevelNameWidth(titl); + + st_scroll += renderdeltatics; + + while (st_scroll >= (i << FRACBITS)) + st_scroll -= i << FRACBITS; + + x -= st_scroll >> FRACBITS; + + while (x < BASEVIDWIDTH-y) + x += i; + while (x > y) + { + x -= i; + V_DrawLevelTitle(x, 24, 0, titl); + } + + if (curplaying && curplaying->author && curplaying->composers && curplaying->composers[0] && curplaying->author[0]) + V_DrawRightAlignedThinString(BASEVIDWIDTH-16, 46, V_ALLOWLOWERCASE, va ("%s, %s",curplaying->author, curplaying->composers)); + else if (curplaying && curplaying->author && curplaying->author[0]) + V_DrawRightAlignedThinString(BASEVIDWIDTH-16, 46, V_ALLOWLOWERCASE, curplaying->author); + + if (curplaying) + { + if (!curplaying->usage && !curplaying->usage[0]) + V_DrawString(vid.dupx, vid.height - 10*vid.dupy, V_NOSCALESTART|V_ALLOWLOWERCASE, va("%.6s", &curplaying->name[0][0])); + else { + V_DrawSmallString(vid.dupx, vid.height - 5*vid.dupy, V_NOSCALESTART|V_ALLOWLOWERCASE, va("%.6s - %.255s\n", &curplaying->name[0][0], curplaying->usage)); + } + } + } + + V_DrawFill(20, 60, 280, 128, 159); + + { + INT32 t, b, q, m = 128; + + if (numsoundtestdefs <= 8) + { + t = 0; + b = numsoundtestdefs - 1; + i = 0; + } + else + { + q = m; + m = (5*m)/numsoundtestdefs; + if (st_sel < 3) + { + t = 0; + b = 7; + i = 0; + } + else if (st_sel >= numsoundtestdefs-4) + { + t = numsoundtestdefs - 8; + b = numsoundtestdefs - 1; + i = q-m; + } + else + { + t = st_sel - 3; + b = st_sel + 4; + i = (t * (q-m))/(numsoundtestdefs - 8); + } + } + + V_DrawFill(20+280-1, 60 + i, 1, m, 0); + + if (t != 0) + V_DrawString(20+280+4, 60+4 - (skullAnimCounter/5), V_YELLOWMAP, "\x1A"); + + if (b != numsoundtestdefs - 1) + V_DrawString(20+280+4, 60+128-12 + (skullAnimCounter/5), V_YELLOWMAP, "\x1B"); + + x = 24; + y = 64; + + if (renderisnewtic) ++st_namescroll; + + while (t <= b) + { + if (t == st_sel) + V_DrawFill(20, y-4, 280-1, 16, 157); + + { + const size_t MAXLENGTH = 34; + const tic_t SCROLLSPEED = TICRATE/5; // Number of tics for name being scrolled by 1 letter + size_t nameoffset = 0; + size_t namelength = soundtestdefs[t]->source ? strlen(soundtestdefs[t]->source) : 0; + if (soundtestdefs[t]->title && (soundtestdefs[t]->title[0])) + namelength = strlen(soundtestdefs[t]->title); + + char buf[MAXLENGTH+1]; + + if (t == st_sel && namelength > MAXLENGTH) + { + switch (st_namescrollstate) + { + case 0: + { + // Scroll forward + nameoffset = (st_namescroll/SCROLLSPEED) % (namelength - MAXLENGTH + 1); + + if (nameoffset == namelength - MAXLENGTH) + { + st_namescroll = 0; + st_namescrollstate++; + } + } + break; + + case 1: + { + nameoffset = namelength - MAXLENGTH; + + // Show name end for 1 second, then start scrolling back + if (st_namescroll == TICRATE) + { + st_namescroll = 0; + st_namescrollstate++; + } + } + break; + + case 2: + { + // Scroll back + nameoffset = (namelength - MAXLENGTH - 1) - (st_namescroll/SCROLLSPEED) % (namelength - MAXLENGTH); + + if (nameoffset == 0) + { + st_namescroll = 0; + st_namescrollstate++; + } + } + break; + + case 3: + { + nameoffset = 0; + + // Show name beginning for 1 second, then start scrolling forward again + if (st_namescroll == TICRATE) + { + st_namescroll = 0; + st_namescrollstate = 0; + } + } + break; + } + } + + if (soundtestdefs[t]->title && soundtestdefs[t]->title[0]) + strncpy(buf, soundtestdefs[t]->title + nameoffset, MAXLENGTH); + else if (soundtestdefs[t]->source && soundtestdefs[t]->source[0]) + strncpy(buf, soundtestdefs[t]->source + nameoffset, MAXLENGTH); + else + strncpy(buf, "How tf did you get here?", MAXLENGTH); + buf[MAXLENGTH] = 0; + + V_DrawString(x, y, (t == st_sel ? V_YELLOWMAP : 0)|V_ALLOWLOWERCASE|V_MONOSPACE, buf); + if (curplaying == soundtestdefs[t]) + { + V_DrawFill(20+280-9, y-4, 8, 16, 150); + } + } + t++; + y += 16; + } + } +} + +static void M_HandleMusicTest(INT32 choice) +{ + boolean exitmenu = false; // exit to previous menu + + switch (choice) + { + case KEY_DOWNARROW: + if (st_sel++ >= numsoundtestdefs-1) + st_sel = 0; + { + S_StartSound(NULL, sfx_menu1); + } + st_namescroll = 0; + st_namescrollstate = 0; + break; + case KEY_UPARROW: + if (!st_sel--) + st_sel = numsoundtestdefs-1; + { + S_StartSound(NULL, sfx_menu1); + } + st_namescroll = 0; + st_namescrollstate = 0; + break; + case KEY_PGDN: + if (st_sel < numsoundtestdefs-1) + { + st_sel += 3; + if (st_sel >= numsoundtestdefs-1) + st_sel = numsoundtestdefs-1; + S_StartSound(NULL, sfx_menu1); + } + st_namescroll = 0; + st_namescrollstate = 0; + break; + case KEY_PGUP: + if (st_sel) + { + st_sel -= 3; + if (st_sel < 0) + st_sel = 0; + S_StartSound(NULL, sfx_menu1); + } + st_namescroll = 0; + st_namescrollstate = 0; + break; + case KEY_BACKSPACE: + if (curplaying) + { + S_StopSounds(); + S_StopMusic(); + curplaying = NULL; + st_time = 0; + S_StartSound(NULL, sfx_skid); + } + break; + case KEY_ESCAPE: + exitmenu = true; + st_namescroll = 0; + st_namescrollstate = 0; + break; + + case KEY_RIGHTARROW: + case KEY_LEFTARROW: + case KEY_ENTER: + S_StopSounds(); + S_StopMusic(); + st_time = 0; + curplaying = soundtestdefs[st_sel]; + S_ChangeMusicInternal(&curplaying->name[0][0], true); + break; + + default: + break; + } + if (exitmenu) + { + Z_Free(soundtestdefs); + soundtestdefs = NULL; + + if (currentMenu->prevMenu) + M_SetupNextMenu(currentMenu->prevMenu); + else + M_ClearMenus(true); + } +} + // Entering secrets menu /*static void M_SecretsMenu(INT32 choice) { diff --git a/src/s_sound.c b/src/s_sound.c index 586f772eb..4bcd57f79 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -33,6 +33,7 @@ #include "lua_hook.h" // MusicChange hook #include "k_boss.h" // bossinfo #include "byteptr.h" +#include "v_video.h" #ifdef HW3SOUND // 3D Sound Interface @@ -1535,7 +1536,8 @@ ReadMusicDefFields } else if (!stricmp(stoken, "usage")) { - // This does absolutely nothing, just a way to ignore this + Z_Free(def->usage); + def->usage = Z_StrDup(textline); } else { @@ -1630,6 +1632,7 @@ static void S_LoadMusicDefLump(lumpnum_t lumpnum) if (df->legacy && df->source) { df->source = replacechar(df->source, '_', ' '); + df->usage = replacechar(df->usage, '_', ' '); df->title = Z_StrDup(df->source); memset(df->source, 0, strlen(df->source)); df->source = NULL; @@ -1662,7 +1665,9 @@ void S_InitMusicDefs(void) { UINT16 i; for (i = 0; i < numwadfiles; i++) + { S_LoadMusicDefs(i); + } } // @@ -1678,6 +1683,7 @@ void S_ShowMusicCredit(void) char credittext[128] = ""; char *work = NULL; size_t len = 128, worklen; + INT32 widthused = (3*BASEVIDWIDTH/4) - 7, workwidth; if (!cv_songcredits.value || demo.rewinding) return; @@ -1713,20 +1719,27 @@ void S_ShowMusicCredit(void) } } -#define MUSICCREDITAPPEND(field)\ + widthused -= V_ThinStringWidth(credittext, 0); + +#define MUSICCREDITAPPEND(field, force)\ if (field)\ {\ work = va(" - %s", field);\ worklen = strlen(work);\ if (worklen <= len)\ {\ - strncat(credittext, work, len);\ - len -= worklen;\ + workwidth = V_ThinStringWidth(work, 0);\ + if (force || widthused >= workwidth)\ + {\ + strncat(credittext, work, len);\ + len -= worklen;\ + widthused -= workwidth;\ + }\ }\ } - MUSICCREDITAPPEND(def->author); - MUSICCREDITAPPEND(def->source); + MUSICCREDITAPPEND(def->author, true); + MUSICCREDITAPPEND(def->source, false); #undef MUSICCREDITAPPEND } @@ -1742,6 +1755,41 @@ void S_ShowMusicCredit(void) cursongcredit.trans = NUMTRANSMAPS; } +musicdef_t **soundtestdefs = NULL; +INT32 numsoundtestdefs = 0; + +// +// S_PrepareSoundTest +// +// Prepare sound test. What am I, your butler? +// +boolean S_PrepareSoundTest(void) +{ + musicdef_t *def; + INT32 pos = numsoundtestdefs = 0; + + for (def = musicdefstart; def; def = def->next) + { + numsoundtestdefs++; + } + + if (!numsoundtestdefs) + return false; + + if (soundtestdefs) + Z_Free(soundtestdefs); + + if (!(soundtestdefs = Z_Malloc(numsoundtestdefs*sizeof(musicdef_t *), PU_STATIC, NULL))) + I_Error("S_PrepareSoundTest(): could not allocate soundtestdefs."); + + for (def = musicdefstart; def; def = def->next) + { + soundtestdefs[pos++] = def; + } + + return true; +} + /// ------------------------ /// Music Status /// ------------------------ diff --git a/src/s_sound.h b/src/s_sound.h index eed32a439..fdb340d25 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -184,6 +184,7 @@ struct musicdef_t char *author; char *source; char *composers; + char *usage; int volume; boolean contentidunsafe; boolean legacy; @@ -200,13 +201,18 @@ extern struct cursongcredit fixed_t old_x; } cursongcredit; +extern musicdef_t soundtestsfx; extern musicdef_t *musicdefstart; +extern musicdef_t **soundtestdefs; +extern INT32 numsoundtestdefs; +extern UINT8 soundtestpage; extern int musicdef_volume; void S_LoadMusicDefs(UINT16 wadnum); void S_InitMusicDefs(void); musicdef_t *S_FindMusicDef(const char *name, UINT8 *i); void S_ShowMusicCredit(void); +boolean S_PrepareSoundTest(void); // // Music Seeking From f1c27ff9630a9b32ba11e83e621b75b4283f5337 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 12 Mar 2025 14:44:26 -0400 Subject: [PATCH 12/18] Use musicdef from main.pk3 instead. --- src/s_sound.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index 4bcd57f79..136a054b3 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -25,6 +25,7 @@ #include "w_wad.h" #include "z_zone.h" #include "d_main.h" +#include "d_netfil.h" #include "r_sky.h" // skyflatnum #include "p_local.h" // camera info #include "fastcmp.h" @@ -1664,8 +1665,17 @@ void S_LoadMusicDefs(UINT16 wad) void S_InitMusicDefs(void) { UINT16 i; + + char *tempname; for (i = 0; i < numwadfiles; i++) { + nameonly(tempname = va("%s", wadfiles[i]->filename)); + if (wadfiles[i]->filename && !stricmp(tempname, "music.kart")) + { + // Awful hack but what can you do? + continue; + } + S_LoadMusicDefs(i); } } @@ -1738,10 +1748,10 @@ void S_ShowMusicCredit(void) }\ } - MUSICCREDITAPPEND(def->author, true); - MUSICCREDITAPPEND(def->source, false); + MUSICCREDITAPPEND(def->author, false); + MUSICCREDITAPPEND(def->source, true); -#undef MUSICCREDITAPPEND +//#undef MUSICCREDITAPPEND } if (credittext[0] == '\0') From 1d4da50b00b89982d1b4f7efdc11f3bf6a157ad3 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 12 Mar 2025 14:48:28 -0400 Subject: [PATCH 13/18] Use Author like RR for now --- src/s_sound.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index 136a054b3..a20010a60 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1748,8 +1748,8 @@ void S_ShowMusicCredit(void) }\ } - MUSICCREDITAPPEND(def->author, false); - MUSICCREDITAPPEND(def->source, true); + MUSICCREDITAPPEND(def->author, true); + MUSICCREDITAPPEND(def->source, false); //#undef MUSICCREDITAPPEND } From dc68da6da3c637dc9514e66b8253c7957614f065 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 12 Mar 2025 15:08:38 -0400 Subject: [PATCH 14/18] Whoops forgot to add sloperoll and slopepitch to precipmobj_t --- src/p_mobj.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_mobj.h b/src/p_mobj.h index 58477770c..e9389f98e 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -462,6 +462,7 @@ struct precipmobj_t // More drawing info: to determine current sprite. angle_t angle, pitch, roll; // orientation + angle_t slopepitch, sloperoll; angle_t old_angle, old_pitch, old_roll; // orientation interpolation angle_t old_angle2, old_pitch2, old_roll2; angle_t rollangle; From 175e7e3cab0a791769aa145bbc0702547fb9db42 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 12 Mar 2025 15:27:50 -0400 Subject: [PATCH 15/18] Revert 'Use Author like RR for now' This reverts commit 1d4da50b00b89982d1b4f7efdc11f3bf6a157ad3. --- src/s_sound.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index a20010a60..136a054b3 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1748,8 +1748,8 @@ void S_ShowMusicCredit(void) }\ } - MUSICCREDITAPPEND(def->author, true); - MUSICCREDITAPPEND(def->source, false); + MUSICCREDITAPPEND(def->author, false); + MUSICCREDITAPPEND(def->source, true); //#undef MUSICCREDITAPPEND } From 6c9b03843831deab7d5c6b85a1e63e5d041bfc4d Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 13 Mar 2025 00:08:07 -0400 Subject: [PATCH 16/18] Add input display toggle --- src/k_hud.c | 13 +++++++------ src/k_hud.h | 2 ++ src/k_kart.c | 1 + 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/k_hud.c b/src/k_hud.c index 53b25c167..bce20dc7c 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -50,6 +50,8 @@ static CV_PossibleValue_t speedo_cons_t[]= { {0, NULL}}; consvar_t cv_newspeedometer = CVAR_INIT ("newspeedometer", "Default", CV_SAVE, speedo_cons_t, NULL); +consvar_t cv_showinput = CVAR_INIT ("showinput", "Off", CV_SAVE, CV_OnOff, NULL); + //{ Patch Definitions static patch_t *kp_nodraw; @@ -1357,6 +1359,7 @@ static void K_DrawKartPositionNum(INT32 num) fixed_t scale = FRACUNIT; patch_t *localpatch = kp_positionnum[0][0]; INT32 fx = 0, fy = 0, fflags = 0; + INT32 xoffs = (cv_showinput.value) ? -48 : 0; INT32 addOrSub = V_ADD; boolean flipdraw = false; // flip the order we draw it in for MORE splitscreen bs. fun. boolean flipvdraw = false; // used only for 2p splitscreen so overtaking doesn't make 1P's position fly off the screen. @@ -1373,17 +1376,15 @@ static void K_DrawKartPositionNum(INT32 num) overtake = true; // this is used for splitscreen stuff in conjunction with flipdraw. } - if (r_splitscreen) - { + if (r_splitscreen || (cv_showinput.value && !r_splitscreen)) scale /= 2; - } W = FixedMul(W<>FRACBITS; // pain and suffering defined below if (!r_splitscreen) { - fx = POSI_X; + fx = POSI_X + xoffs; fy = BASEVIDHEIGHT - 8; fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN; } @@ -3830,7 +3831,7 @@ static void K_drawKartFirstPerson(void) static void K_drawInput(void) { static INT32 pn = 0; - INT32 target = 0, splitflags = (V_SNAPTOBOTTOM|V_SNAPTORIGHT); + INT32 target = 0, splitflags = (V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SLIDEIN); INT32 x = (BASEVIDWIDTH - 32)*FRACUNIT, y = (BASEVIDHEIGHT - 24)*FRACUNIT; INT32 offs, col; const INT32 accent1 = splitflags | skincolors[stplyr->skincolor].ramp[5]; @@ -4449,7 +4450,7 @@ void K_drawKartHUD(void) K_drawRingMeter(); } - if (modeattacking && !bossinfo.boss) + if (cv_showinput.value || (modeattacking && !bossinfo.boss)) { // Draw the input UI if (LUA_HudEnabled(hud_position)) diff --git a/src/k_hud.h b/src/k_hud.h index f38f4b6f9..287bfce4d 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -25,6 +25,8 @@ extern "C" { extern consvar_t cv_newspeedometer; +extern consvar_t cv_showinput; + struct trackingResult_t { fixed_t x, y; diff --git a/src/k_kart.c b/src/k_kart.c index 856668959..0e3a753cd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -253,6 +253,7 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartrings); CV_RegisterVar(&cv_newspeedometer); + CV_RegisterVar(&cv_showinput); CV_RegisterVar(&cv_kartwalltransfer); From 7ce17d2c6e100583a6d894b752526defbe8688d5 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 13 Mar 2025 01:04:51 -0400 Subject: [PATCH 17/18] Various random changes Menus, rotation and more! --- src/d_player.h | 2 -- src/m_menu.c | 34 ++++++++++++++++++++++------------ src/p_saveg.c | 4 ---- src/r_patchrotation.c | 14 ++++++++------ 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index a081e7476..b5072a2da 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -571,8 +571,6 @@ struct player_t INT32 aizdrifttilt; INT32 aizdriftturn; - INT32 underwatertilt; - fixed_t offroad; // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed UINT8 pogospring; // Pogo spring bounce effect UINT8 brakestop; // Wait until you've made a complete stop for a few tics before letting brake go in reverse. diff --git a/src/m_menu.c b/src/m_menu.c index 01c069e36..bea8bfb34 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -325,7 +325,7 @@ menu_t OP_DataOptionsDef, OP_ScreenshotOptionsDef, OP_EraseDataDef; menu_t OP_DiscordOptionsDef; #endif menu_t OP_HUDOptionsDef, OP_ChatOptionsDef; -menu_t OP_GameOptionsDef, OP_ServerOptionsDef; +menu_t OP_GameOptionsDef, OP_BlanKartGameOptionsDef, OP_ServerOptionsDef; menu_t OP_AdvServerOptionsDef; //menu_t OP_NetgameOptionsDef, OP_GametypeOptionsDef; menu_t OP_MonitorToggleDef; @@ -1533,19 +1533,28 @@ static menuitem_t OP_GameOptionsMenu[] = { {IT_STRING | IT_SUBMENU, NULL, "Random Item Toggles...", {.submenu = &OP_MonitorToggleDef}, 10}, - {IT_STRING | IT_CVAR, NULL, "Race Game Speed", {.cvar = &cv_kartspeed}, 30}, - {IT_STRING | IT_CVAR, NULL, "Battle Game Speed", {.cvar = &cv_kartbattlespeed}, 40}, - {IT_STRING | IT_CVAR, NULL, "Frantic Items", {.cvar = &cv_kartfrantic}, 50}, - {IT_SECRET, NULL, "Encore Mode", {.cvar = &cv_kartencore}, 60}, + {IT_STRING | IT_SUBMENU, NULL, "BlanKart Gameplay...", {.submenu = &OP_BlanKartGameOptionsDef}, 30}, - {IT_STRING | IT_CVAR, NULL, "Number of Laps", {.cvar = &cv_numlaps}, 80}, - {IT_STRING | IT_CVAR, NULL, "Exit Countdown Timer", {.cvar = &cv_countdowntime}, 90}, + {IT_STRING | IT_CVAR, NULL, "Race Game Speed", {.cvar = &cv_kartspeed}, 40}, + {IT_STRING | IT_CVAR, NULL, "Battle Game Speed", {.cvar = &cv_kartbattlespeed}, 50}, + {IT_STRING | IT_CVAR, NULL, "Frantic Items", {.cvar = &cv_kartfrantic}, 60}, + {IT_SECRET, NULL, "Encore Mode", {.cvar = &cv_kartencore}, 70}, - {IT_STRING | IT_CVAR, NULL, "Time Limit", {.cvar = &cv_timelimit}, 110}, - {IT_STRING | IT_CVAR, NULL, "Starting Bumpers", {.cvar = &cv_kartbumpers}, 120}, - {IT_STRING | IT_CVAR, NULL, "Karma Comeback", {.cvar = &cv_kartcomeback}, 130}, + {IT_STRING | IT_CVAR, NULL, "Number of Laps", {.cvar = &cv_numlaps}, 90}, + {IT_STRING | IT_CVAR, NULL, "Exit Countdown Timer", {.cvar = &cv_countdowntime}, 100}, + + {IT_STRING | IT_CVAR, NULL, "Time Limit", {.cvar = &cv_timelimit}, 120}, + {IT_STRING | IT_CVAR, NULL, "Starting Bumpers", {.cvar = &cv_kartbumpers}, 130}, + {IT_STRING | IT_CVAR, NULL, "Karma Comeback", {.cvar = &cv_kartcomeback}, 140}, + + {IT_STRING | IT_CVAR, NULL, "Track Power Levels", {.cvar = &cv_kartusepwrlv}, 160}, +}; + +static menuitem_t OP_BlanKartGameOptionsMenu[] = +{ + {IT_STRING | IT_CVAR, NULL, "Rings", {.cvar = &cv_kartrings}, 10}, + {IT_STRING | IT_CVAR, NULL, "Purple Drift", {.cvar = &cv_kartpurpledrift}, 20}, - {IT_STRING | IT_CVAR, NULL, "Track Power Levels", {.cvar = &cv_kartusepwrlv}, 150}, }; static menuitem_t OP_ServerOptionsMenu[] = @@ -2138,6 +2147,7 @@ menu_t OP_Player4CamOptionsDef = DEFAULTMENUSTYLE(MN_NONE, NULL, OP_Player4CamOp menu_t OP_ChatOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_HUD", OP_ChatOptionsMenu, &OP_HUDOptionsDef, 30, 30); menu_t OP_GameOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_GAME", OP_GameOptionsMenu, &OP_MainDef, 30, 30); +menu_t OP_BlanKartGameOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_GAME", OP_BlanKartGameOptionsMenu, &OP_GameOptionsDef, 30, 30); menu_t OP_ServerOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_SERVER", OP_ServerOptionsMenu, &OP_MainDef, 24, 30); menu_t OP_AdvServerOptionsDef = DEFAULTMENUSTYLE(MN_NONE, "M_SERVER", OP_AdvServerOptionsMenu, &OP_ServerOptionsDef, 24, 30); @@ -6449,7 +6459,7 @@ static void M_Options(INT32 choice) OP_DataOptionsMenu[3].status = (Playing()) ? (IT_GRAYEDOUT) : (IT_STRING|IT_SUBMENU); // Erase data #endif - OP_GameOptionsMenu[4].status = + OP_GameOptionsMenu[5].status = (M_SecretUnlocked(SECRET_ENCORE)) ? (IT_CVAR|IT_STRING) : IT_SECRET; // cv_kartencore OP_MainDef.prevMenu = currentMenu; diff --git a/src/p_saveg.c b/src/p_saveg.c index 1b297244b..8a0b4c1a0 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -266,8 +266,6 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEINT32(save->p, players[i].aizdrifttilt); WRITEINT32(save->p, players[i].aizdriftturn); - WRITEINT32(save->p, players[i].underwatertilt); - WRITEFIXED(save->p, players[i].offroad); WRITEFIXED(save->p, players[i].tiregrease); WRITEUINT8(save->p, players[i].pogospring); @@ -578,8 +576,6 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].aizdrifttilt = READINT32(save->p); players[i].aizdriftturn = READINT32(save->p); - players[i].underwatertilt = READINT32(save->p); - players[i].offroad = READFIXED(save->p); players[i].tiregrease = READFIXED(save->p); players[i].pogospring = READUINT8(save->p); diff --git a/src/r_patchrotation.c b/src/r_patchrotation.c index 7ecfe3ee7..5802b56d9 100644 --- a/src/r_patchrotation.c +++ b/src/r_patchrotation.c @@ -31,7 +31,7 @@ angle_t R_GetPitchRollAngle(mobj_t *mobj, player_t *viewPlayer) angle_t sloperolll = mobj->slopepitch; angle_t slopepitch = mobj->sloperoll; - if (!cv_sloperoll.value) + if (!cv_sloperoll.value || (mobj->player && (mobj->player->pogospring > 0))) { sloperolll = 0; slopepitch = 0; @@ -51,11 +51,7 @@ static angle_t R_PlayerSpriteRotation(player_t *player, player_t *viewPlayer) angle_t rollAngle = 0; - if (player->mo->eflags & MFE_UNDERWATER) - { - rollAngle -= player->underwatertilt; - } - else if (sliptideLift) + if (sliptideLift) { /* (from side) tilt downward if turning toward camera, upward if away. */ @@ -64,6 +60,12 @@ static angle_t R_PlayerSpriteRotation(player_t *player, player_t *viewPlayer) FixedMul(sliptideLift, FINECOSINE(angleDelta >> ANGLETOFINESHIFT)); } + if (player->pogospring) + { + rollAngle = 0; + } + + return rollAngle; } From cdd3516f0b363ae9540a9d2ffa5c5d0cfc66bd8c Mon Sep 17 00:00:00 2001 From: NepDisk Date: Thu, 13 Mar 2025 01:46:37 -0400 Subject: [PATCH 18/18] Remove CLIENTBACKUPTICS Removes the second part added by https://git.do.srb2.org/KartKrew/RingRacers/-/commit/6e7adedaa0378678f2303e0357e98f948d67209b This is to be closer to kart and to remove some freezes I sometimes feel --- src/d_clisrv.c | 10 +++++----- src/d_clisrv.h | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index c9edef5c3..8d9cd3c21 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -4902,8 +4902,8 @@ static void HandlePacketFromPlayer(SINT8 node) txtpak = (UINT8 *)&netbuffer->u.serverpak.cmds[netbuffer->u.serverpak.numslots * netbuffer->u.serverpak.numtics]; - if (realend > gametic + CLIENTBACKUPTICS) - realend = gametic + CLIENTBACKUPTICS; + if (realend > gametic + BACKUPTICS) + realend = gametic + BACKUPTICS; cl_packetmissed = realstart > neededtic; if (realstart <= neededtic && realend > neededtic) @@ -5349,10 +5349,10 @@ static void SV_SendTics(void) { // assert supposedtics[n]>=nettics[n] realfirsttic = supposedtics[n]; + lasttictosend = maketic; - lasttictosend = nettics[n] + CLIENTBACKUPTICS; - if (lasttictosend > maketic) - lasttictosend = maketic; + if (lasttictosend - nettics[n] >= BACKUPTICS) + lasttictosend = nettics[n] + BACKUPTICS-1; if (realfirsttic >= lasttictosend) { diff --git a/src/d_clisrv.h b/src/d_clisrv.h index e1c74b722..6eb7bae29 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -43,7 +43,6 @@ applications may follow different packet versions. // Networking and tick handling related. #define BACKUPTICS 512 // more than enough for most timeouts.... -#define CLIENTBACKUPTICS 32 #define MAXTEXTCMD 512 // No. of tics your controls can be delayed by.