diff --git a/src/d_player.h b/src/d_player.h index 4bd3babb..b8fb0d78 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -257,6 +257,7 @@ typedef enum k_driftboost, // Boost you get from drifting k_boostcharge, // Charge-up for boosting at the start of the race, or when Lakitu drops you k_jmp, // In Mario Kart, letting go of the jump button stops the drift + k_offroad, // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed k_itemroulette, // Used for the roulette when deciding what item to give you (was "pw_kartitem") k_itemclose, // Used to animate the item window closing (was "pw_psychic") diff --git a/src/g_game.c b/src/g_game.c index 76f64b84..03b5bc88 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2194,6 +2194,7 @@ void G_PlayerReborn(INT32 player) // SRB2kart INT32 starpostwp; + INT32 offroad; score = players[player].score; lives = players[player].lives; @@ -2247,6 +2248,7 @@ void G_PlayerReborn(INT32 player) // SRB2kart starpostwp = players[player].kartstuff[k_starpostwp]; + offroad = players[player].kartstuff[k_offroad]; p = &players[player]; memset(p, 0, sizeof (*p)); @@ -2301,6 +2303,7 @@ void G_PlayerReborn(INT32 player) // SRB2kart p->kartstuff[k_starpostwp] = starpostwp; + p->kartstuff[k_offroad] = offroad; // Don't do anything immediately p->pflags |= PF_USEDOWN; diff --git a/src/k_kart.c b/src/k_kart.c index faa982a1..61ba77e6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -877,6 +877,49 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) S_StartSound(NULL, sfx_mkitmF); } +//} + +//{ SRB2kart p_user.c Stuff + +/** \brief Updates the Player's offroad value once per frame + + \param player player object passed from K_KartPlayerThink + + \return void +*/ +static void K_UpdateOffroad(player_t *player) +{ + fixed_t kartweight = player->kartweight; + fixed_t offroad; + sector_t *nextsector = R_PointInSubsector( + player->mo->x + player->mo->momx*2, player->mo->y + player->mo->momy*2)->sector; + + // If you are offroad, a timer starts. Depending on your weight value, the timer increments differently. + if ((nextsector->special & 256) && nextsector->special != 768 && nextsector->special != 1024 && nextsector->special != 4864) + { + if (P_IsObjectOnGround(player->mo) && player->kartstuff[k_offroad] == 0) + player->kartstuff[k_offroad] = 16; + if (player->kartstuff[k_offroad] > 0) + { + if (kartweight < 1) { kartweight = 1; } if (kartweight > 9) { kartweight = 9; } // Safety Net + + // 1872 is the magic number - 35 frames adds up to approximately 65536. 1872/4 = 468/3 = 156 + // A higher kart weight means you can stay offroad for longer without losing speed + offroad = (1872 + 5*156 - kartweight*156); + + if (player->kartstuff[k_growshrinktimer] > 1) // megashroom slows down half as fast + offroad /= 2; + + player->kartstuff[k_offroad] += offroad; + } + + if (player->kartstuff[k_offroad] > FRACUNIT) + player->kartstuff[k_offroad] = FRACUNIT; + } + else + player->kartstuff[k_offroad] = 0; +} + /** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c \param player player object passed from P_PlayerThink @@ -886,6 +929,8 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) */ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { + K_UpdateOffroad(player); + if (player->kartstuff[k_itemclose]) player->kartstuff[k_itemclose]--; @@ -1009,6 +1054,11 @@ void K_MomentumToFacing(player_t *player) { angle_t dangle = player->mo->angle - R_PointToAngle2(0, 0, player->mo->momx, player->mo->momy); + // Offroad is separate, it's difficult to factor it in with a variable value anyway. + if (!(player->kartstuff[k_startimer] || player->kartstuff[k_bootaketimer] || player->kartstuff[k_mushroomtimer]) + && player->kartstuff[k_offroad] >= 0 && speedonly) + boostpower = FixedDiv(boostpower, player->kartstuff[k_offroad] + FRACUNIT); + if (dangle > ANGLE_180) dangle = InvAngle(dangle);