diff --git a/src/d_player.h b/src/d_player.h index 877f65c59..be2b96a70 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -752,6 +752,8 @@ struct player_t boolean markedfordeath; + fixed_t outrun; // Milky Way road effect + uint8_t public_key[PUBKEYLENGTH]; #ifdef HWRENDER diff --git a/src/k_kart.c b/src/k_kart.c index 33fcd8819..31646d16a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3337,6 +3337,11 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower, boolean dorubberb finalspeed = FixedMul(finalspeed, mapobjectscale); + if (dorubberband == true && K_PlayerUsesBotMovement(player) == true) + { + finalspeed = FixedMul(finalspeed, player->botvars.rubberband); + } + if (doboostpower == true) { if (mobjValid == true) @@ -3346,11 +3351,12 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower, boolean dorubberb } finalspeed = FixedMul(finalspeed, player->boostpower + player->speedboost); - } - if (dorubberband == true && K_PlayerUsesBotMovement(player) == true) - { - finalspeed = FixedMul(finalspeed, player->botvars.rubberband); + if (mobjValid == true && player->outrun != 0) + { + // Milky Way's roads + finalspeed += FixedMul(player->outrun, K_GrowShrinkSpeedMul(player)); + } } return finalspeed; @@ -3369,18 +3375,22 @@ fixed_t K_GetKartAccel(player_t *player) k_accel += 17 * stat; // 121 - 257 - if (K_PodiumSequence() == true) - { - return FixedMul(k_accel, FRACUNIT / 4); - } - // Marble Garden Top gets 1200% accel if (player->curshield == KSHIELD_TOP) { k_accel *= 12; } - return FixedMul(k_accel, (FRACUNIT + player->accelboost) / 4); + if (K_PodiumSequence() == true) + { + k_accel = FixedMul(k_accel, FRACUNIT / 4); + } + else + { + k_accel = FixedMul(k_accel, (FRACUNIT + player->accelboost) / 4); + } + + return k_accel; } UINT16 K_GetKartFlashing(player_t *player) diff --git a/src/k_terrain.c b/src/k_terrain.c index 55a6be6a4..00bf76b08 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -455,6 +455,9 @@ void K_ProcessTerrainEffect(mobj_t *mo) return; } + // Milky Way road effect + player->outrun = terrain->outrun + (48*FRACUNIT); + // Damage effects if (terrain->damageType > 0) { @@ -1688,6 +1691,10 @@ static void K_ParseTerrainParameter(size_t i, char *param, char *val) { terrain->springStarColor = get_number(val); } + else if (stricmp(param, "outrun") == 0 || stricmp(param, "speedIncrease") == 0) + { + terrain->outrun = FLOAT_TO_FIXED(atof(val)); + } else if (stricmp(param, "floorClip") == 0) { terrain->floorClip = FLOAT_TO_FIXED(atof(val)); diff --git a/src/k_terrain.h b/src/k_terrain.h index e3cce83ad..5a9dcb25c 100644 --- a/src/k_terrain.h +++ b/src/k_terrain.h @@ -122,6 +122,7 @@ struct terrain_t angle_t speedPadAngle; // Speed pad angle fixed_t springStrength; // Spring strength UINT16 springStarColor; // Spring star color + fixed_t outrun; // Raise top speed by this amount, for super fast road. fixed_t floorClip; // Offset for sprites on this ground UINT32 flags; // Flag values (see: terrain_flags_t) }; diff --git a/src/p_user.c b/src/p_user.c index a415d6c98..c4535efb8 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4609,6 +4609,11 @@ void P_PlayerAfterThink(player_t *player) } #endif + if (P_IsObjectOnGround(player->mo) == true) + { + player->outrun = 0; + } + #ifdef SECTORSPECIALSAFTERTHINK if (player->onconveyor != 1 || !P_IsObjectOnGround(player->mo)) player->onconveyor = 0;