diff --git a/src/d_player.h b/src/d_player.h index b9c44ed0e..402baeebf 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/k_collide.c b/src/k_collide.c index 1921e3d38..641fc5bb6 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -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) { diff --git a/src/k_kart.c b/src/k_kart.c index ce092fa43..cc5904929 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1060,7 +1060,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); @@ -2415,7 +2415,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))) { @@ -2487,7 +2487,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) @@ -2718,7 +2718,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) { @@ -2757,7 +2757,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); @@ -2808,7 +2808,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); @@ -5712,7 +5712,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; } @@ -5731,7 +5731,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]--; @@ -5888,7 +5888,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; } } @@ -7000,7 +7000,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) diff --git a/src/p_inter.c b/src/p_inter.c index 135067753..a10e5eddc 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -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<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 @@ -843,7 +843,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 @@ -1437,7 +1437,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) @@ -1447,7 +1447,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); } } @@ -1456,12 +1456,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); } } diff --git a/src/p_user.c b/src/p_user.c index 8d6014926..800f4f37c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6876,7 +6876,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);