diff --git a/src/d_player.h b/src/d_player.h index 152aeb272..cad1f06f0 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -297,6 +297,7 @@ typedef enum k_userings, // Have to be not holding the item button to change from using rings to using items (or vice versa), to prevent some weirdness with the button k_ringdelay, // 3 tic delay between every ring usage k_ringboost, // Ring boost timer + k_ringlock, // Prevent picking up rings while SPB is locked on 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_pogospring, // Pogo spring bounce effect diff --git a/src/dehacked.c b/src/dehacked.c index c62d2cf7e..851fd8e8f 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8379,6 +8379,7 @@ static const char *const KARTSTUFF_LIST[] = { "USERINGS", "RINGDELAY", "RINGBOOST", + "RINGLOCK", "JMP", "OFFROAD", "POGOSPRING", diff --git a/src/k_kart.c b/src/k_kart.c index 405815b15..0cbade16e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1113,22 +1113,45 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) // Record Attack / alone mashing behavior if (modeattacking || pingame == 1) { - if (mashed && (modeattacking || cv_superring.value)) // ANY mashed value? You get rings. + if (G_RaceGametype()) { - K_KartGetItemResult(player, KITEM_SUPERRING); - player->kartstuff[k_itemblinkmode] = 1; - if (P_IsLocalPlayer(player)) - S_StartSound(NULL, sfx_itrolm); + if (mashed && (modeattacking || cv_superring.value)) // ANY mashed value? You get rings. + { + K_KartGetItemResult(player, KITEM_SUPERRING); + player->kartstuff[k_itemblinkmode] = 1; + if (P_IsLocalPlayer(player)) + S_StartSound(NULL, sfx_itrolm); + } + else + { + if (modeattacking || cv_sneaker.value) // Waited patiently? You get a sneaker! + K_KartGetItemResult(player, KITEM_SNEAKER); + else // Default to sad if nothing's enabled... + K_KartGetItemResult(player, KITEM_SAD); + player->kartstuff[k_itemblinkmode] = 0; + if (P_IsLocalPlayer(player)) + S_StartSound(NULL, sfx_itrolf); + } } - else + else if (G_BattleGametype()) { - if (modeattacking || cv_sneaker.value) // Waited patiently? You get a sneaker! - K_KartGetItemResult(player, KITEM_SNEAKER); - else // Default to sad if nothing's enabled... - K_KartGetItemResult(player, KITEM_SAD); - player->kartstuff[k_itemblinkmode] = 0; - if (P_IsLocalPlayer(player)) - S_StartSound(NULL, sfx_itrolf); + if (mashed && (modeattacking || cv_banana.value)) // ANY mashed value? You get a banana. + { + K_KartGetItemResult(player, KITEM_BANANA); + player->kartstuff[k_itemblinkmode] = 1; + if (P_IsLocalPlayer(player)) + S_StartSound(NULL, sfx_itrolm); + } + else + { + if (modeattacking || cv_orbinaut.value) // Waited patiently? You get an orbinaut! + K_KartGetItemResult(player, KITEM_ORBINAUT); + else // Default to sad if nothing's enabled... + K_KartGetItemResult(player, KITEM_SAD); + player->kartstuff[k_itemblinkmode] = 0; + if (P_IsLocalPlayer(player)) + S_StartSound(NULL, sfx_itrolf); + } } player->kartstuff[k_itemblink] = TICRATE; @@ -1138,15 +1161,15 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) } // SPECIAL CASE No. 4: - // Being in ring debt occasionally forces Super Ring on you - if (player->kartstuff[k_rings] <= 0 && cv_superring.value) + // Being in ring debt occasionally forces Super Ring on you if you mashed + if (mashed && player->kartstuff[k_rings] < 0 && cv_superring.value) { - INT32 debtamount = min(20, abs(player->kartstuff[k_rings])+1); + INT32 debtamount = min(20, abs(player->kartstuff[k_rings])); if (P_RandomChance((debtamount*FRACUNIT)/20)) { K_KartGetItemResult(player, KITEM_SUPERRING); player->kartstuff[k_itemblink] = TICRATE; - player->kartstuff[k_itemblinkmode] = (mashed ? 1 : 0); + player->kartstuff[k_itemblinkmode] = 1; player->kartstuff[k_itemroulette] = 0; player->kartstuff[k_roulettetype] = 0; if (P_IsLocalPlayer(player)) @@ -6210,9 +6233,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->kartstuff[k_itemtype] = KITEM_NONE; } + if (spbplace == -1 || player->kartstuff[k_position] != spbplace) + player->kartstuff[k_ringlock] = 0; // reset ring lock + if (player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD) { - if ((player->kartstuff[k_rings]+player->kartstuff[k_pickuprings]) < 20) + if ((player->kartstuff[k_rings]+player->kartstuff[k_pickuprings]) < 20 && !player->kartstuff[k_ringlock]) K_LookForRings(player->mo); } else @@ -8226,11 +8252,17 @@ static void K_drawKartRingsAndLives(void) UINT8 secondnum = (abs(stplyr->kartstuff[k_rings]) % 10); INT32 ringflip = 0; UINT8 *ringmap = NULL; + boolean colorring = false; INT32 ringx = LAPS_X+7; // Rings if (stplyr->kartstuff[k_rings] <= 0 && (leveltime/5 & 1)) // In debt + { ringmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_CRIMSON, GTC_CACHE); + colorring = true; + } + else if (stplyr->kartstuff[k_ringlock]) // SPB ring lock + ringmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_JET, GTC_CACHE); else if (stplyr->kartstuff[k_rings] >= 20) // Maxed out ringmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_YELLOW, GTC_CACHE); @@ -8246,7 +8278,7 @@ static void K_drawKartRingsAndLives(void) ringx += SHORT(kp_ring[ringanim_realframe]->width); } - V_DrawMappedPatch(ringx, LAPS_Y-16, V_HUDTRANS|splitflags|ringflip, kp_ring[ringanim_realframe], (stplyr->kartstuff[k_rings] <= 0 ? ringmap : NULL)); // Don't do maxed out gold mapping + V_DrawMappedPatch(ringx, LAPS_Y-16, V_HUDTRANS|splitflags|ringflip, kp_ring[ringanim_realframe], (colorring ? ringmap : NULL)); // Don't do maxed out gold mapping if (stplyr->kartstuff[k_rings] < 0) // Draw the minus for ring debt { diff --git a/src/p_enemy.c b/src/p_enemy.c index 00cf2f395..d844a98db 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3677,7 +3677,8 @@ void A_AttractChase(mobj_t *actor) if (actor->tracer && actor->tracer->player && actor->tracer->health //&& P_CheckSight(actor, actor->tracer) && actor->tracer->player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD - && (actor->tracer->player->kartstuff[k_rings]+actor->tracer->player->kartstuff[k_pickuprings]) < 20) + && (actor->tracer->player->kartstuff[k_rings]+actor->tracer->player->kartstuff[k_pickuprings]) < 20 + && !actor->tracer->player->kartstuff[k_ringlock]) { fixed_t dist; angle_t hang, vang; @@ -8458,6 +8459,7 @@ void A_SPBChase(mobj_t *actor) fixed_t easiness = ((actor->tracer->player->kartspeed + (10-spark)) << FRACBITS) / 2; actor->lastlook = actor->tracer->player-players; // Save the player num for death scumming... + actor->tracer->player->kartstuff[k_ringlock] = 1; // set ring lock if (!P_IsObjectOnGround(actor->tracer) /*&& !actor->tracer->player->kartstuff[k_pogospring]*/) { @@ -8539,7 +8541,7 @@ void A_SPBChase(mobj_t *actor) actor->momz = FixedMul(zspeed, FINESINE(actor->movedir>>ANGLETOFINESHIFT)); // Spawn a trail of rings behind the SPB! - if (leveltime % 9 == 0) + if (leveltime % 6 == 0) { mobj_t *ring = P_SpawnMobj(actor->x - actor->momx, actor->y - actor->momx, actor->z - actor->momz + (24*mapobjectscale), MT_RING); @@ -8585,6 +8587,7 @@ void A_SPBChase(mobj_t *actor) && !players[actor->lastlook].exiting) { spbplace = players[actor->lastlook].kartstuff[k_position]; + players[actor->lastlook].kartstuff[k_ringlock] = 1; if (actor->extravalue2-- <= 0 && players[actor->lastlook].mo) { P_SetTarget(&actor->tracer, players[actor->lastlook].mo); diff --git a/src/p_inter.c b/src/p_inter.c index 1d4e538db..49f5a37f7 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -691,7 +691,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; // No picking up rings while SPB is targetting you - if (player->kartstuff[k_position] == spbplace) + if (player->kartstuff[k_ringlock]) return; // Don't immediately pick up spilled rings