refactor kartspeed code and add respawn point safety

This commit is contained in:
NepDisk 2025-05-12 22:25:11 -04:00
parent 72130dfd99
commit 1ef87baf3f
5 changed files with 54 additions and 56 deletions

View file

@ -3349,7 +3349,7 @@ void K_SpawnWaterTrail(mobj_t *mobj)
} }
else else
{ {
topspeed = FixedMul(mobj->scale, K_GetKartSpeedFromStat(5)); topspeed = FixedMul(mobj->scale, K_GetKartSpeedFromStat(5, false));
} }
speed = P_AproxDistance(mobj->momx, mobj->momy); speed = P_AproxDistance(mobj->momx, mobj->momy);
@ -3461,10 +3461,10 @@ static inline fixed_t K_GetProjectileSpeed(void)
{ {
switch (gamespeed) switch (gamespeed)
{ {
case 0: case KARTSPEED_EASY:
return 68*mapobjectscale; // Avg Speed is 34 return 68*mapobjectscale; // Avg Speed is 34
break; break;
case 2: case KARTSPEED_HARD:
return 96*mapobjectscale; // Avg Speed is 48 return 96*mapobjectscale; // Avg Speed is 48
break; break;
default: default:
@ -3477,10 +3477,10 @@ static inline fixed_t K_GetSneakerBoostSpeed(void)
{ {
switch (gamespeed) switch (gamespeed)
{ {
case 0: case KARTSPEED_EASY:
return EASYSNEAKERSPEEDBOOST; return EASYSNEAKERSPEEDBOOST;
break; break;
case 2: case KARTSPEED_HARD:
return HARDSNEAKERSPEEDBOOST; return HARDSNEAKERSPEEDBOOST;
break; break;
default: 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. // 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; const fixed_t xspd = (3*FRACUNIT)/64;
fixed_t g_cc = FRACUNIT; fixed_t g_cc = K_GetKartGameSpeedScalar(gamespeed) + xspd;
fixed_t k_speed = 150; fixed_t k_speed = 150;
fixed_t finalspeed; fixed_t finalspeed;
switch (gamespeed) if (karmabomb)
{ kartspeed = 1;
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;
}
k_speed += kartspeed*3; // 153 - 177 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_GetKartSpeed(player_t *player, boolean doboostpower, boolean dorubberband)
{ {
fixed_t k_speed = 150; boolean karmabomb = ((gametyperules & GTR_KARMA) && player->bumper <= 0);
fixed_t g_cc = FRACUNIT;
fixed_t xspd = 3072; // 4.6875 aka 3/64
UINT8 kartspeed = player->kartspeed;
fixed_t finalspeed; fixed_t finalspeed;
if (doboostpower && !player->pogospring && !P_IsObjectOnGround(player->mo)) if (doboostpower && !player->pogospring && !P_IsObjectOnGround(player->mo))
return (75*mapobjectscale); // air speed cap return (75*mapobjectscale); // air speed cap
switch (gamespeed) finalspeed = K_GetKartSpeedFromStat(player->kartspeed, karmabomb);
{
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);
if (K_PlayerUsesBotMovement(player)) 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, FRACUNIT + add);
} }
finalspeed = FixedMul(finalspeed, player->mo->scale);
if (dorubberband == true && player->botvars.rubberband < FRACUNIT && K_PlayerUsesBotMovement(player) == true) if (dorubberband == true && player->botvars.rubberband < FRACUNIT && K_PlayerUsesBotMovement(player) == true)
{ {
finalspeed = FixedMul(finalspeed, player->botvars.rubberband); finalspeed = FixedMul(finalspeed, player->botvars.rubberband);
} }
if (doboostpower) if (doboostpower)
{
finalspeed = FixedMul(finalspeed, player->boostpower+player->speedboost); finalspeed = FixedMul(finalspeed, player->boostpower+player->speedboost);
}
if (player->outrun != 0) 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... if (missile && mapthing != MT_BALLHOG) // Trying to keep compatability...
{ {
PROJSPEED = mobjinfo[mapthing].speed; PROJSPEED = mobjinfo[mapthing].speed;
if (gamespeed == 0) if (gamespeed == KARTSPEED_EASY)
PROJSPEED = FixedMul(PROJSPEED, FRACUNIT-FRACUNIT/4); PROJSPEED = FixedMul(PROJSPEED, FRACUNIT-FRACUNIT/4);
else if (gamespeed == 2) else if (gamespeed == KARTSPEED_HARD)
PROJSPEED = FixedMul(PROJSPEED, FRACUNIT+FRACUNIT/4); PROJSPEED = FixedMul(PROJSPEED, FRACUNIT+FRACUNIT/4);
PROJSPEED = FixedMul(PROJSPEED, mapobjectscale); PROJSPEED = FixedMul(PROJSPEED, mapobjectscale);
} }
@ -8762,13 +8735,26 @@ void K_SetRespawnAtNextWaypoint(player_t * player)
// Safety :P // Safety :P
if (!player->currentwaypoint || !player->nextwaypoint) if (!player->currentwaypoint || !player->nextwaypoint)
{ {
waypoint_t *oopisepoint = K_GetClosestWaypointToMobj(player->mo);
// Better safe then sorry. // Better safe then sorry.
CONS_Alert(CONS_WARNING, M_GetText("Tried to respawn at invalid waypoint!\n")); if (!oopisepoint)
return; {
// 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); respawnangle = R_PointToAngle2(currentwaypoint->x, currentwaypoint->y, safewaypoint->x, safewaypoint->y);
player->pflags |= PF_TRUSTWAYPOINTS; player->pflags |= PF_TRUSTWAYPOINTS;

View file

@ -214,7 +214,7 @@ boolean K_ItemMobjAllowedtoWaterRun(mobj_t *item);
void K_SetTireGrease(player_t *player, tic_t tics); void K_SetTireGrease(player_t *player, tic_t tics);
void K_SquishPlayer(player_t *player, mobj_t *inflictor, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *inflictor, mobj_t *source);
void K_ApplyTripWire(player_t *player, tripwirestate_t state); 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_GetKartSpeed(player_t *player, boolean doboostpower, boolean dorubberbanding);
fixed_t K_GetKartAccel(player_t *player); fixed_t K_GetKartAccel(player_t *player);
UINT16 K_GetKartFlashing(player_t *player); UINT16 K_GetKartFlashing(player_t *player);

View file

@ -944,13 +944,14 @@ static void K_SpawnFootstepParticle(mobj_t *mo, t_footstep_t *fs, tic_t timer)
if (mo->player != NULL) if (mo->player != NULL)
{ {
boolean karmabomb = ((gametyperules & GTR_KARMA) && mo->player->bumper <= 0);
tireAngle = (mo->player->drawangle + ANGLE_180); tireAngle = (mo->player->drawangle + ANGLE_180);
speedValue = K_GetKartSpeedFromStat(mo->player->kartspeed); speedValue = K_GetKartSpeedFromStat(mo->player->kartspeed, karmabomb);
} }
else else
{ {
tireAngle = (mo->angle + ANGLE_180); tireAngle = (mo->angle + ANGLE_180);
speedValue = K_GetKartSpeedFromStat(5); speedValue = K_GetKartSpeedFromStat(5, false);
} }
speedValue = FixedMul(speedValue, mo->scale); speedValue = FixedMul(speedValue, mo->scale);

View file

@ -4152,10 +4152,21 @@ static int lib_kGetKartSpeedFromStat(lua_State *L)
UINT16 kartspeed = luaL_checkinteger(L, 1); UINT16 kartspeed = luaL_checkinteger(L, 1);
//HUDSAFE //HUDSAFE
lua_pushinteger(L, K_GetKartSpeedFromStat(kartspeed)); lua_pushinteger(L, K_GetKartSpeedFromStat(kartspeed, false));
return 1; 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) static int lib_kKartKickstart(lua_State *L)
{ {
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -4529,6 +4540,7 @@ static luaL_Reg lib[] = {
{"K_3dKartMovement", lib_k3dKartMovement}, {"K_3dKartMovement", lib_k3dKartMovement},
{"K_MomentumAngle", lib_kMomentumAngle}, {"K_MomentumAngle", lib_kMomentumAngle},
{"K_GetKartSpeedFromStat", lib_kGetKartSpeedFromStat}, {"K_GetKartSpeedFromStat", lib_kGetKartSpeedFromStat},
{"K_GetKartSpeedFromStatEx", lib_kGetKartSpeedFromStatEx},
{"K_KartKickstart", lib_kKartKickstart}, {"K_KartKickstart", lib_kKartKickstart},
{"K_GetKartButtons", lib_kGetKartButtons}, {"K_GetKartButtons", lib_kGetKartButtons},
{"K_GetForwardMove", lib_kGetForwardMove}, {"K_GetForwardMove", lib_kGetForwardMove},

View file

@ -8373,10 +8373,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
if (leveltime % TICRATE == 0) if (leveltime % TICRATE == 0)
S_StartSound(mobj, mobj->info->activesound); S_StartSound(mobj, mobj->info->activesound);
if (gamespeed == 0) if (gamespeed == KARTSPEED_EASY)
distbarrier = FixedMul(distbarrier, FRACUNIT-FRACUNIT/4); distbarrier = FixedMul(distbarrier, FRACUNIT-FRACUNIT/4);
//expert speed else if (gamespeed == KARTSPEED_EASY)
else if (gamespeed == 2 || gamespeed == 3)
distbarrier = FixedMul(distbarrier, FRACUNIT+FRACUNIT/4); distbarrier = FixedMul(distbarrier, FRACUNIT+FRACUNIT/4);
if ((gametyperules & GTR_CIRCUIT) && mobj->tracer) if ((gametyperules & GTR_CIRCUIT) && mobj->tracer)