Better SPB ring locking

Now triggers when locked on instead of when out, and has a temporary HUD colorize animation when ring pickup is locked.

also:
- SPB spawns rings more frequently
- There's only a chance for Super Ring while in debt if you mashed at all
- Added Battle fallback items when alone, for the future Break the Capsules
This commit is contained in:
TehRealSalt 2019-04-09 13:11:55 -04:00
parent 583b3bb4a7
commit 3b352bceea
5 changed files with 59 additions and 22 deletions

View file

@ -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_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_ringdelay, // 3 tic delay between every ring usage
k_ringboost, // Ring boost timer 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_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_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 k_pogospring, // Pogo spring bounce effect

View file

@ -8379,6 +8379,7 @@ static const char *const KARTSTUFF_LIST[] = {
"USERINGS", "USERINGS",
"RINGDELAY", "RINGDELAY",
"RINGBOOST", "RINGBOOST",
"RINGLOCK",
"JMP", "JMP",
"OFFROAD", "OFFROAD",
"POGOSPRING", "POGOSPRING",

View file

@ -1113,22 +1113,45 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
// Record Attack / alone mashing behavior // Record Attack / alone mashing behavior
if (modeattacking || pingame == 1) if (modeattacking || pingame == 1)
{ {
if (mashed && (modeattacking || cv_superring.value)) // ANY mashed value? You get rings. if (G_RaceGametype())
{ {
K_KartGetItemResult(player, KITEM_SUPERRING); if (mashed && (modeattacking || cv_superring.value)) // ANY mashed value? You get rings.
player->kartstuff[k_itemblinkmode] = 1; {
if (P_IsLocalPlayer(player)) K_KartGetItemResult(player, KITEM_SUPERRING);
S_StartSound(NULL, sfx_itrolm); 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! if (mashed && (modeattacking || cv_banana.value)) // ANY mashed value? You get a banana.
K_KartGetItemResult(player, KITEM_SNEAKER); {
else // Default to sad if nothing's enabled... K_KartGetItemResult(player, KITEM_BANANA);
K_KartGetItemResult(player, KITEM_SAD); player->kartstuff[k_itemblinkmode] = 1;
player->kartstuff[k_itemblinkmode] = 0; if (P_IsLocalPlayer(player))
if (P_IsLocalPlayer(player)) S_StartSound(NULL, sfx_itrolm);
S_StartSound(NULL, sfx_itrolf); }
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; player->kartstuff[k_itemblink] = TICRATE;
@ -1138,15 +1161,15 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd)
} }
// SPECIAL CASE No. 4: // SPECIAL CASE No. 4:
// Being in ring debt occasionally forces Super Ring on you // Being in ring debt occasionally forces Super Ring on you if you mashed
if (player->kartstuff[k_rings] <= 0 && cv_superring.value) 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)) if (P_RandomChance((debtamount*FRACUNIT)/20))
{ {
K_KartGetItemResult(player, KITEM_SUPERRING); K_KartGetItemResult(player, KITEM_SUPERRING);
player->kartstuff[k_itemblink] = TICRATE; 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_itemroulette] = 0;
player->kartstuff[k_roulettetype] = 0; player->kartstuff[k_roulettetype] = 0;
if (P_IsLocalPlayer(player)) if (P_IsLocalPlayer(player))
@ -6210,9 +6233,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->kartstuff[k_itemtype] = KITEM_NONE; 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_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); K_LookForRings(player->mo);
} }
else else
@ -8226,11 +8252,17 @@ static void K_drawKartRingsAndLives(void)
UINT8 secondnum = (abs(stplyr->kartstuff[k_rings]) % 10); UINT8 secondnum = (abs(stplyr->kartstuff[k_rings]) % 10);
INT32 ringflip = 0; INT32 ringflip = 0;
UINT8 *ringmap = NULL; UINT8 *ringmap = NULL;
boolean colorring = false;
INT32 ringx = LAPS_X+7; INT32 ringx = LAPS_X+7;
// Rings // Rings
if (stplyr->kartstuff[k_rings] <= 0 && (leveltime/5 & 1)) // In debt if (stplyr->kartstuff[k_rings] <= 0 && (leveltime/5 & 1)) // In debt
{
ringmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_CRIMSON, GTC_CACHE); 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 else if (stplyr->kartstuff[k_rings] >= 20) // Maxed out
ringmap = R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_YELLOW, GTC_CACHE); 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); 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 if (stplyr->kartstuff[k_rings] < 0) // Draw the minus for ring debt
{ {

View file

@ -3677,7 +3677,8 @@ void A_AttractChase(mobj_t *actor)
if (actor->tracer && actor->tracer->player && actor->tracer->health if (actor->tracer && actor->tracer->player && actor->tracer->health
//&& P_CheckSight(actor, actor->tracer) //&& P_CheckSight(actor, actor->tracer)
&& actor->tracer->player->kartstuff[k_itemtype] == KITEM_THUNDERSHIELD && 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; fixed_t dist;
angle_t hang, vang; 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; 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->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]*/) 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)); actor->momz = FixedMul(zspeed, FINESINE(actor->movedir>>ANGLETOFINESHIFT));
// Spawn a trail of rings behind the SPB! // 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, mobj_t *ring = P_SpawnMobj(actor->x - actor->momx, actor->y - actor->momx,
actor->z - actor->momz + (24*mapobjectscale), MT_RING); actor->z - actor->momz + (24*mapobjectscale), MT_RING);
@ -8585,6 +8587,7 @@ void A_SPBChase(mobj_t *actor)
&& !players[actor->lastlook].exiting) && !players[actor->lastlook].exiting)
{ {
spbplace = players[actor->lastlook].kartstuff[k_position]; spbplace = players[actor->lastlook].kartstuff[k_position];
players[actor->lastlook].kartstuff[k_ringlock] = 1;
if (actor->extravalue2-- <= 0 && players[actor->lastlook].mo) if (actor->extravalue2-- <= 0 && players[actor->lastlook].mo)
{ {
P_SetTarget(&actor->tracer, players[actor->lastlook].mo); P_SetTarget(&actor->tracer, players[actor->lastlook].mo);

View file

@ -691,7 +691,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
return; return;
// No picking up rings while SPB is targetting you // No picking up rings while SPB is targetting you
if (player->kartstuff[k_position] == spbplace) if (player->kartstuff[k_ringlock])
return; return;
// Don't immediately pick up spilled rings // Don't immediately pick up spilled rings