Merge branch 'spinout-type-cleanup' into 'master'

Don't run out wipeout in the air

See merge request KartKrew/Kart!314
This commit is contained in:
Sal 2020-09-25 09:31:25 -04:00
commit 89c5d35fce
7 changed files with 55 additions and 23 deletions

View file

@ -257,6 +257,25 @@ typedef enum
NUMKARTSHIELDS NUMKARTSHIELDS
} kartshields_t; } kartshields_t;
typedef enum
{
KSPIN_THRUST = (1<<0),
KSPIN_IFRAMES = (1<<1),
KSPIN_AIRTIMER = (1<<2),
KSPIN_TYPEBIT = (1<<3),
KSPIN_TYPEMASK = ~( KSPIN_TYPEBIT - 1 ),
#define KSPIN_TYPE( type ) ( KSPIN_TYPEBIT << type )
KSPIN_SPINOUT = KSPIN_TYPE(0)|KSPIN_IFRAMES|KSPIN_THRUST,
KSPIN_WIPEOUT = KSPIN_TYPE(1)|KSPIN_IFRAMES,
KSPIN_STUNG = KSPIN_TYPE(2),
KSPIN_EXPLOSION = KSPIN_TYPE(3)|KSPIN_IFRAMES|KSPIN_AIRTIMER,
#undef KSPIN_TYPE
} kartspinoutflags_t;
//{ SRB2kart - kartstuff //{ SRB2kart - kartstuff
typedef enum typedef enum
{ {
@ -270,7 +289,7 @@ typedef enum
k_instashield, // Instashield no-damage animation timer k_instashield, // Instashield no-damage animation timer
k_floorboost, // Prevents Sneaker sounds for a breif duration when triggered by a floor panel k_floorboost, // Prevents Sneaker sounds for a breif duration when triggered by a floor panel
k_spinouttype, // Determines whether to thrust forward or not while spinning out; 0 = move forwards, 1 = stay still, 2 = stay still & no flashing tics k_spinouttype, // Determines the mode of spinout/wipeout, see kartspinoutflags_t
k_drift, // Drifting Left or Right, plus a bigger counter = sharper turn k_drift, // Drifting Left or Right, plus a bigger counter = sharper turn
k_driftend, // Drift has ended, used to adjust character angle after drift k_driftend, // Drift has ended, used to adjust character angle after drift

View file

@ -9429,6 +9429,19 @@ struct {
{"KSHIELD_FLAME",KSHIELD_FLAME}, {"KSHIELD_FLAME",KSHIELD_FLAME},
{"NUMKARTSHIELDS",NUMKARTSHIELDS}, {"NUMKARTSHIELDS",NUMKARTSHIELDS},
// kartspinoutflags_t
{"KSPIN_THRUST",KSPIN_THRUST},
{"KSPIN_IFRAMES",KSPIN_IFRAMES},
{"KSPIN_AIRTIMER",KSPIN_AIRTIMER},
{"KSPIN_TYPEBIT",KSPIN_TYPEBIT},
{"KSPIN_TYPEMASK",KSPIN_TYPEMASK},
{"KSPIN_SPINOUT",KSPIN_SPINOUT},
{"KSPIN_WIPEOUT",KSPIN_WIPEOUT},
{"KSPIN_STUNG",KSPIN_STUNG},
{"KSPIN_EXPLOSION",KSPIN_EXPLOSION},
// translation colormaps // translation colormaps
{"TC_DEFAULT",TC_DEFAULT}, {"TC_DEFAULT",TC_DEFAULT},
{"TC_BOSS",TC_BOSS}, {"TC_BOSS",TC_BOSS},

View file

@ -148,7 +148,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
else else
{ {
// Player Damage // Player Damage
K_SpinPlayer(t2->player, t1->target, 0, t1, (t1->type == MT_BANANA || t1->type == MT_BANANA_SHIELD)); K_SpinPlayer(t2->player, t1->target, KSPIN_SPINOUT, t1, (t1->type == MT_BANANA || t1->type == MT_BANANA_SHIELD));
} }
damageitem = true; damageitem = true;
@ -332,7 +332,7 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2)
if (t1->state == &states[S_MINEEXPLOSION1]) if (t1->state == &states[S_MINEEXPLOSION1])
K_ExplodePlayer(t2->player, t1->target, t1); K_ExplodePlayer(t2->player, t1->target, t1);
else else
K_SpinPlayer(t2->player, t1->target, 0, t1, false); K_SpinPlayer(t2->player, t1->target, KSPIN_SPINOUT, t1, false);
} }
else if (t2->flags & MF_SHOOTABLE) else if (t2->flags & MF_SHOOTABLE)
{ {

View file

@ -1055,7 +1055,7 @@ static void K_DebtStingPlayer(player_t *player, INT32 length)
player->kartstuff[k_driftcharge] = 0; player->kartstuff[k_driftcharge] = 0;
player->kartstuff[k_pogospring] = 0; player->kartstuff[k_pogospring] = 0;
player->kartstuff[k_spinouttype] = 2; player->kartstuff[k_spinouttype] = KSPIN_STUNG;
player->kartstuff[k_spinouttimer] = length; player->kartstuff[k_spinouttimer] = length;
player->kartstuff[k_wipeoutslow] = min(length-1, wipeoutslowtime+1); player->kartstuff[k_wipeoutslow] = min(length-1, wipeoutslowtime+1);
@ -2456,7 +2456,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
if (player->health <= 0) if (player->health <= 0)
return; return;
if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2) if (player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && ( player->kartstuff[k_spinouttype] & KSPIN_IFRAMES ))
|| player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0 || player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) || (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
{ {
@ -2528,7 +2528,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, mobj_t *inflicto
player->kartstuff[k_spinouttype] = type; player->kartstuff[k_spinouttype] = type;
if (player->kartstuff[k_spinouttype] <= 0) // type 0 is spinout, type 1 is wipeout, type 2 is no-invuln wipeout if (( player->kartstuff[k_spinouttype] & KSPIN_THRUST ))
{ {
// At spinout, player speed is increased to 1/4 their regular speed, moving them forward // At spinout, player speed is increased to 1/4 their regular speed, moving them forward
if (player->speed < K_GetKartSpeed(player, true)/4) if (player->speed < K_GetKartSpeed(player, true)/4)
@ -2759,7 +2759,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
player->kartstuff[k_pogospring] = 0; player->kartstuff[k_pogospring] = 0;
// This is the only part that SHOULDN'T combo :VVVVV // This is the only part that SHOULDN'T combo :VVVVV
if (G_BattleGametype() && !(player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && player->kartstuff[k_spinouttype] != 2))) if (G_BattleGametype() && !(player->powers[pw_flashing] > 0 || player->kartstuff[k_squishedtimer] > 0 || (player->kartstuff[k_spinouttimer] > 0 && ( player->kartstuff[k_spinouttype] & KSPIN_IFRAMES ))))
{ {
if (source && source->player && player != source->player) if (source && source->player && player != source->player)
{ {
@ -2798,7 +2798,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
K_CheckBumpers(); K_CheckBumpers();
} }
player->kartstuff[k_spinouttype] = 1; player->kartstuff[k_spinouttype] = KSPIN_EXPLOSION;
player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2; player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2;
player->powers[pw_flashing] = K_GetKartFlashing(player); player->powers[pw_flashing] = K_GetKartFlashing(player);
@ -2849,7 +2849,7 @@ void K_StealBumper(player_t *player, player_t *victim, boolean force)
if (player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0) if (player->kartstuff[k_squishedtimer] > 0 || player->kartstuff[k_spinouttimer] > 0)
return; return;
if (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && victim->kartstuff[k_spinouttype] != 2) if (victim->powers[pw_flashing] > 0 || victim->kartstuff[k_squishedtimer] > 0 || (victim->kartstuff[k_spinouttimer] > 0 && ( victim->kartstuff[k_spinouttype] & KSPIN_IFRAMES ))
|| victim->kartstuff[k_invincibilitytimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_hyudorotimer] > 0) || victim->kartstuff[k_invincibilitytimer] > 0 || victim->kartstuff[k_growshrinktimer] > 0 || victim->kartstuff[k_hyudorotimer] > 0)
{ {
K_DoInstashield(victim); K_DoInstashield(victim);
@ -5862,7 +5862,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->karthud[khud_timeovercam] = 0; player->karthud[khud_timeovercam] = 0;
// Specific hack because it insists on setting flashing tics during this anyway... // Specific hack because it insists on setting flashing tics during this anyway...
if (player->kartstuff[k_spinouttype] == 2) if (( player->kartstuff[k_spinouttype] & KSPIN_IFRAMES ) == 0)
{ {
player->powers[pw_flashing] = 0; player->powers[pw_flashing] = 0;
} }
@ -5881,7 +5881,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->kartstuff[k_spinouttimer]) if (player->kartstuff[k_spinouttimer])
{ {
if ((P_IsObjectOnGround(player->mo) if ((P_IsObjectOnGround(player->mo)
|| (player->kartstuff[k_spinouttype] != 0)) || ( player->kartstuff[k_spinouttype] & KSPIN_AIRTIMER ))
&& (!player->kartstuff[k_sneakertimer])) && (!player->kartstuff[k_sneakertimer]))
{ {
player->kartstuff[k_spinouttimer]--; player->kartstuff[k_spinouttimer]--;
@ -6038,7 +6038,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->kartstuff[k_killfield]++; player->kartstuff[k_killfield]++;
if (player->kartstuff[k_killfield] > 4*TICRATE) if (player->kartstuff[k_killfield] > 4*TICRATE)
{ {
K_SpinPlayer(player, NULL, 0, NULL, false); K_SpinPlayer(player, NULL, KSPIN_SPINOUT, NULL, false);
//player->kartstuff[k_killfield] = 1; //player->kartstuff[k_killfield] = 1;
} }
} }
@ -7150,7 +7150,7 @@ static void K_KartSpindash(player_t *player)
} }
} }
else if (chargetime < -TICRATE) else if (chargetime < -TICRATE)
K_SpinPlayer(player, NULL, 0, NULL, false); K_SpinPlayer(player, NULL, KSPIN_SPINOUT, NULL, false);
else else
{ {
if (player->kartstuff[k_spindash] % 4 == 0) if (player->kartstuff[k_spindash] % 4 == 0)

View file

@ -557,7 +557,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_RemoveMobj(special); P_RemoveMobj(special);
} }
else else
K_SpinPlayer(player, special->target, 0, special, false); K_SpinPlayer(player, special->target, KSPIN_SPINOUT, special, false);
return; return;
/*case MT_EERIEFOG: /*case MT_EERIEFOG:
special->frame &= ~FF_TRANS80; special->frame &= ~FF_TRANS80;
@ -3234,14 +3234,14 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
player->kartstuff[k_sneakertimer] = 0; player->kartstuff[k_sneakertimer] = 0;
player->kartstuff[k_numsneakers] = 0; player->kartstuff[k_numsneakers] = 0;
K_SpinPlayer(player, source, 1, inflictor, false); K_SpinPlayer(player, source, KSPIN_WIPEOUT, inflictor, false);
K_KartPainEnergyFling(player); K_KartPainEnergyFling(player);
if (P_IsDisplayPlayer(player)) if (P_IsDisplayPlayer(player))
P_StartQuake(32<<FRACBITS, 5); P_StartQuake(32<<FRACBITS, 5);
} }
else else
K_SpinPlayer(player, source, 0, inflictor, false); K_SpinPlayer(player, source, KSPIN_SPINOUT, inflictor, false);
return true; return true;
} }

View file

@ -777,7 +777,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; return true;
// Player Damage // Player Damage
K_SpinPlayer(tmthing->player, thing, 0, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), false); K_SpinPlayer(tmthing->player, thing, KSPIN_SPINOUT, ((thing->type == MT_BUBBLESHIELD) ? thing->target : thing), false);
S_StartSound(thing, sfx_s3k44); S_StartSound(thing, sfx_s3k44);
} }
else else
@ -835,7 +835,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; return true;
// Player Damage // Player Damage
K_SpinPlayer(thing->player, tmthing, 0, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), false); K_SpinPlayer(thing->player, tmthing, KSPIN_SPINOUT, ((tmthing->type == MT_BUBBLESHIELD) ? tmthing->target : tmthing), false);
S_StartSound(tmthing, sfx_s3k44); S_StartSound(tmthing, sfx_s3k44);
} }
else else
@ -1429,7 +1429,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (G_BattleGametype() && tmthing->player->kartstuff[k_pogospring]) if (G_BattleGametype() && tmthing->player->kartstuff[k_pogospring])
{ {
K_StealBumper(tmthing->player, thing->player, false); K_StealBumper(tmthing->player, thing->player, false);
K_SpinPlayer(thing->player, tmthing, 0, tmthing, false); K_SpinPlayer(thing->player, tmthing, KSPIN_SPINOUT, tmthing, false);
} }
} }
else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) else if (P_IsObjectOnGround(tmthing) && thing->momz < 0)
@ -1439,7 +1439,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (G_BattleGametype() && thing->player->kartstuff[k_pogospring]) if (G_BattleGametype() && thing->player->kartstuff[k_pogospring])
{ {
K_StealBumper(thing->player, tmthing->player, false); K_StealBumper(thing->player, tmthing->player, false);
K_SpinPlayer(tmthing->player, thing, 0, thing, false); K_SpinPlayer(tmthing->player, thing, KSPIN_SPINOUT, thing, false);
} }
} }
@ -1448,12 +1448,12 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (thing->player->kartstuff[k_sneakertimer] && !(tmthing->player->kartstuff[k_sneakertimer]) && !(thing->player->powers[pw_flashing])) // Don't steal bumpers while intangible if (thing->player->kartstuff[k_sneakertimer] && !(tmthing->player->kartstuff[k_sneakertimer]) && !(thing->player->powers[pw_flashing])) // Don't steal bumpers while intangible
{ {
K_StealBumper(thing->player, tmthing->player, false); K_StealBumper(thing->player, tmthing->player, false);
K_SpinPlayer(tmthing->player, thing, 0, tmthing, false); K_SpinPlayer(tmthing->player, thing, KSPIN_SPINOUT, tmthing, false);
} }
else if (tmthing->player->kartstuff[k_sneakertimer] && !(thing->player->kartstuff[k_sneakertimer]) && !(tmthing->player->powers[pw_flashing])) else if (tmthing->player->kartstuff[k_sneakertimer] && !(thing->player->kartstuff[k_sneakertimer]) && !(tmthing->player->powers[pw_flashing]))
{ {
K_StealBumper(tmthing->player, thing->player, false); K_StealBumper(tmthing->player, thing->player, false);
K_SpinPlayer(thing->player, tmthing, 0, thing, false); K_SpinPlayer(thing->player, tmthing, KSPIN_SPINOUT, thing, false);
} }
} }

View file

@ -6802,7 +6802,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
continue; continue;
if (mo->type == MT_PLAYER) // Players wipe out in Kart if (mo->type == MT_PLAYER) // Players wipe out in Kart
K_SpinPlayer(mo->player, source, 0, inflictor, false); K_SpinPlayer(mo->player, source, KSPIN_SPINOUT, inflictor, false);
//} //}
else else
P_DamageMobj(mo, inflictor, source, 1000); P_DamageMobj(mo, inflictor, source, 1000);