mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-27 12:31:54 +00:00
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:
parent
583b3bb4a7
commit
3b352bceea
5 changed files with 59 additions and 22 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -8379,6 +8379,7 @@ static const char *const KARTSTUFF_LIST[] = {
|
||||||
"USERINGS",
|
"USERINGS",
|
||||||
"RINGDELAY",
|
"RINGDELAY",
|
||||||
"RINGBOOST",
|
"RINGBOOST",
|
||||||
|
"RINGLOCK",
|
||||||
"JMP",
|
"JMP",
|
||||||
"OFFROAD",
|
"OFFROAD",
|
||||||
"POGOSPRING",
|
"POGOSPRING",
|
||||||
|
|
|
||||||
70
src/k_kart.c
70
src/k_kart.c
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue