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_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

View file

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

View file

@ -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
{

View file

@ -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);

View file

@ -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