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
} 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
typedef enum
{
@ -270,7 +289,7 @@ typedef enum
k_instashield, // Instashield no-damage animation timer
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_driftend, // Drift has ended, used to adjust character angle after drift

View file

@ -9429,6 +9429,19 @@ struct {
{"KSHIELD_FLAME",KSHIELD_FLAME},
{"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
{"TC_DEFAULT",TC_DEFAULT},
{"TC_BOSS",TC_BOSS},

View file

@ -148,7 +148,7 @@ boolean K_BananaBallhogCollide(mobj_t *t1, mobj_t *t2)
else
{
// 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;
@ -332,7 +332,7 @@ boolean K_MineExplosionCollide(mobj_t *t1, mobj_t *t2)
if (t1->state == &states[S_MINEEXPLOSION1])
K_ExplodePlayer(t2->player, t1->target, t1);
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)
{

View file

@ -1055,7 +1055,7 @@ static void K_DebtStingPlayer(player_t *player, INT32 length)
player->kartstuff[k_driftcharge] = 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_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)
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
|| (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;
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
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;
// 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)
{
@ -2798,7 +2798,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
K_CheckBumpers();
}
player->kartstuff[k_spinouttype] = 1;
player->kartstuff[k_spinouttype] = KSPIN_EXPLOSION;
player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2;
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)
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)
{
K_DoInstashield(victim);
@ -5862,7 +5862,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->karthud[khud_timeovercam] = 0;
// 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;
}
@ -5881,7 +5881,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
if (player->kartstuff[k_spinouttimer])
{
if ((P_IsObjectOnGround(player->mo)
|| (player->kartstuff[k_spinouttype] != 0))
|| ( player->kartstuff[k_spinouttype] & KSPIN_AIRTIMER ))
&& (!player->kartstuff[k_sneakertimer]))
{
player->kartstuff[k_spinouttimer]--;
@ -6038,7 +6038,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->kartstuff[k_killfield]++;
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;
}
}
@ -7150,7 +7150,7 @@ static void K_KartSpindash(player_t *player)
}
}
else if (chargetime < -TICRATE)
K_SpinPlayer(player, NULL, 0, NULL, false);
K_SpinPlayer(player, NULL, KSPIN_SPINOUT, NULL, false);
else
{
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);
}
else
K_SpinPlayer(player, special->target, 0, special, false);
K_SpinPlayer(player, special->target, KSPIN_SPINOUT, special, false);
return;
/*case MT_EERIEFOG:
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_numsneakers] = 0;
K_SpinPlayer(player, source, 1, inflictor, false);
K_SpinPlayer(player, source, KSPIN_WIPEOUT, inflictor, false);
K_KartPainEnergyFling(player);
if (P_IsDisplayPlayer(player))
P_StartQuake(32<<FRACBITS, 5);
}
else
K_SpinPlayer(player, source, 0, inflictor, false);
K_SpinPlayer(player, source, KSPIN_SPINOUT, inflictor, false);
return true;
}

View file

@ -777,7 +777,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true;
// 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);
}
else
@ -835,7 +835,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true;
// 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);
}
else
@ -1429,7 +1429,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (G_BattleGametype() && tmthing->player->kartstuff[k_pogospring])
{
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)
@ -1439,7 +1439,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (G_BattleGametype() && thing->player->kartstuff[k_pogospring])
{
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
{
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]))
{
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;
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
P_DamageMobj(mo, inflictor, source, 1000);