From 1ef87baf3f54f9dc0d4eeab78c9b1aaab328f18e Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 12 May 2025 22:25:11 -0400 Subject: [PATCH] refactor kartspeed code and add respawn point safety --- src/k_kart.c | 84 ++++++++++++++++++++--------------------------- src/k_kart.h | 2 +- src/k_terrain.c | 5 +-- src/lua_baselib.c | 14 +++++++- src/p_mobj.c | 5 ++- 5 files changed, 54 insertions(+), 56 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4eed5260b..25a2cf868 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3349,7 +3349,7 @@ void K_SpawnWaterTrail(mobj_t *mobj) } else { - topspeed = FixedMul(mobj->scale, K_GetKartSpeedFromStat(5)); + topspeed = FixedMul(mobj->scale, K_GetKartSpeedFromStat(5, false)); } speed = P_AproxDistance(mobj->momx, mobj->momy); @@ -3461,10 +3461,10 @@ static inline fixed_t K_GetProjectileSpeed(void) { switch (gamespeed) { - case 0: + case KARTSPEED_EASY: return 68*mapobjectscale; // Avg Speed is 34 break; - case 2: + case KARTSPEED_HARD: return 96*mapobjectscale; // Avg Speed is 48 break; default: @@ -3477,10 +3477,10 @@ static inline fixed_t K_GetSneakerBoostSpeed(void) { switch (gamespeed) { - case 0: + case KARTSPEED_EASY: return EASYSNEAKERSPEEDBOOST; break; - case 2: + case KARTSPEED_HARD: return HARDSNEAKERSPEEDBOOST; break; default: @@ -3703,25 +3703,15 @@ static fixed_t K_GrowShrinkOrNormal(const player_t *player) } // Returns kart speed from a stat. Boost power and scale are NOT taken into account, no player or object is necessary. -fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed) +fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed, boolean karmabomb) { - const fixed_t xspd = 3072; - fixed_t g_cc = FRACUNIT; + const fixed_t xspd = (3*FRACUNIT)/64; + fixed_t g_cc = K_GetKartGameSpeedScalar(gamespeed) + xspd; fixed_t k_speed = 150; fixed_t finalspeed; - switch (gamespeed) - { - case 0: - g_cc = 53248 + xspd; // 50cc = 81.25 + 4.69 = 85.94% - break; - case 2: - g_cc = 77824 + xspd; // 150cc = 118.75 + 4.69 = 123.44% - break; - default: - g_cc = 65536 + xspd; // 100cc = 100.00 + 4.69 = 104.69% - break; - } + if (karmabomb) + kartspeed = 1; k_speed += kartspeed*3; // 153 - 177 @@ -3731,34 +3721,13 @@ fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed) fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower, boolean dorubberband) { - fixed_t k_speed = 150; - fixed_t g_cc = FRACUNIT; - fixed_t xspd = 3072; // 4.6875 aka 3/64 - UINT8 kartspeed = player->kartspeed; + boolean karmabomb = ((gametyperules & GTR_KARMA) && player->bumper <= 0); fixed_t finalspeed; if (doboostpower && !player->pogospring && !P_IsObjectOnGround(player->mo)) return (75*mapobjectscale); // air speed cap - switch (gamespeed) - { - case 0: - g_cc = 53248 + xspd; // 50cc = 81.25 + 4.69 = 85.94% - break; - case 2: - g_cc = 77824 + xspd; // 150cc = 118.75 + 4.69 = 123.44% - break; - default: - g_cc = 65536 + xspd; // 100cc = 100.00 + 4.69 = 104.69% - break; - } - - if ((gametyperules & GTR_KARMA) && (player->bumper <= 0)) - kartspeed = 1; - - k_speed += kartspeed*3; // 153 - 177 - - finalspeed = FixedMul(FixedMul(k_speed<<14, g_cc), player->mo->scale); + finalspeed = K_GetKartSpeedFromStat(player->kartspeed, karmabomb); if (K_PlayerUsesBotMovement(player)) { @@ -3768,13 +3737,17 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower, boolean dorubberb finalspeed = FixedMul(finalspeed, FRACUNIT + add); } + finalspeed = FixedMul(finalspeed, player->mo->scale); + if (dorubberband == true && player->botvars.rubberband < FRACUNIT && K_PlayerUsesBotMovement(player) == true) { finalspeed = FixedMul(finalspeed, player->botvars.rubberband); } if (doboostpower) + { finalspeed = FixedMul(finalspeed, player->boostpower+player->speedboost); + } if (player->outrun != 0) { @@ -5039,9 +5012,9 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, if (missile && mapthing != MT_BALLHOG) // Trying to keep compatability... { PROJSPEED = mobjinfo[mapthing].speed; - if (gamespeed == 0) + if (gamespeed == KARTSPEED_EASY) PROJSPEED = FixedMul(PROJSPEED, FRACUNIT-FRACUNIT/4); - else if (gamespeed == 2) + else if (gamespeed == KARTSPEED_HARD) PROJSPEED = FixedMul(PROJSPEED, FRACUNIT+FRACUNIT/4); PROJSPEED = FixedMul(PROJSPEED, mapobjectscale); } @@ -8762,13 +8735,26 @@ void K_SetRespawnAtNextWaypoint(player_t * player) // Safety :P if (!player->currentwaypoint || !player->nextwaypoint) { + waypoint_t *oopisepoint = K_GetClosestWaypointToMobj(player->mo); + // Better safe then sorry. - CONS_Alert(CONS_WARNING, M_GetText("Tried to respawn at invalid waypoint!\n")); - return; + if (!oopisepoint) + { + // Oh shit, oh fuck..... + CONS_Alert(CONS_WARNING, M_GetText("Tried to respawn at invalid waypoint!\n")); + return; + } + + currentwaypoint = player->mo; + safewaypoint = player->nextwaypoint->mobj; + 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->mobj; - safewaypoint = player->nextwaypoint->mobj; respawnangle = R_PointToAngle2(currentwaypoint->x, currentwaypoint->y, safewaypoint->x, safewaypoint->y); player->pflags |= PF_TRUSTWAYPOINTS; diff --git a/src/k_kart.h b/src/k_kart.h index 13f50aaca..068f12af5 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -214,7 +214,7 @@ boolean K_ItemMobjAllowedtoWaterRun(mobj_t *item); void K_SetTireGrease(player_t *player, tic_t tics); void K_SquishPlayer(player_t *player, mobj_t *inflictor, mobj_t *source); void K_ApplyTripWire(player_t *player, tripwirestate_t state); -fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed); +fixed_t K_GetKartSpeedFromStat(UINT8 kartspeed, boolean karmabomb); fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower, boolean dorubberbanding); fixed_t K_GetKartAccel(player_t *player); UINT16 K_GetKartFlashing(player_t *player); diff --git a/src/k_terrain.c b/src/k_terrain.c index b46109d65..5a1c3d29e 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -944,13 +944,14 @@ static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs, tic_t timer) if (mo->player != NULL) { + boolean karmabomb = ((gametyperules & GTR_KARMA) && mo->player->bumper <= 0); tireAngle = (mo->player->drawangle + ANGLE_180); - speedValue = K_GetKartSpeedFromStat(mo->player->kartspeed); + speedValue = K_GetKartSpeedFromStat(mo->player->kartspeed, karmabomb); } else { tireAngle = (mo->angle + ANGLE_180); - speedValue = K_GetKartSpeedFromStat(5); + speedValue = K_GetKartSpeedFromStat(5, false); } speedValue = FixedMul(speedValue, mo->scale); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index c2dfe08e7..99430d32b 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -4152,10 +4152,21 @@ static int lib_kGetKartSpeedFromStat(lua_State *L) UINT16 kartspeed = luaL_checkinteger(L, 1); //HUDSAFE - lua_pushinteger(L, K_GetKartSpeedFromStat(kartspeed)); + lua_pushinteger(L, K_GetKartSpeedFromStat(kartspeed, false)); return 1; } +static int lib_kGetKartSpeedFromStatEx(lua_State *L) +{ + UINT16 kartspeed = luaL_checkinteger(L, 1); + boolean karmabomb = lua_optboolean(L, 2); + + //HUDSAFE + lua_pushinteger(L, K_GetKartSpeedFromStat(kartspeed, karmabomb)); + return 1; +} + + static int lib_kKartKickstart(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); @@ -4529,6 +4540,7 @@ static luaL_Reg lib[] = { {"K_3dKartMovement", lib_k3dKartMovement}, {"K_MomentumAngle", lib_kMomentumAngle}, {"K_GetKartSpeedFromStat", lib_kGetKartSpeedFromStat}, + {"K_GetKartSpeedFromStatEx", lib_kGetKartSpeedFromStatEx}, {"K_KartKickstart", lib_kKartKickstart}, {"K_GetKartButtons", lib_kGetKartButtons}, {"K_GetForwardMove", lib_kGetForwardMove}, diff --git a/src/p_mobj.c b/src/p_mobj.c index 63ff4cff6..72697c9fb 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8373,10 +8373,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj) if (leveltime % TICRATE == 0) S_StartSound(mobj, mobj->info->activesound); - if (gamespeed == 0) + if (gamespeed == KARTSPEED_EASY) distbarrier = FixedMul(distbarrier, FRACUNIT-FRACUNIT/4); - //expert speed - else if (gamespeed == 2 || gamespeed == 3) + else if (gamespeed == KARTSPEED_EASY) distbarrier = FixedMul(distbarrier, FRACUNIT+FRACUNIT/4); if ((gametyperules & GTR_CIRCUIT) && mobj->tracer)