Back Trick effect

A rising tornado swirling the opposite direction.
Sprites do not currently exist, but it's a one-line emergency-break-glass change if there's any danger of not shopping with them
This commit is contained in:
toaster 2023-11-07 20:24:01 +00:00
parent c1f7546f99
commit c3d34e9377
5 changed files with 84 additions and 31 deletions

View file

@ -3899,6 +3899,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_TRICKINDICATOR_UNDERLAY_ARROW2",
"S_SIDETRICK",
"S_BACKTRICK",
// DEZ Ring Shooter
"S_TIREGRABBER",

View file

@ -637,6 +637,7 @@ char sprnames[NUMSPRITES + 1][5] =
"TRK3",
"TRK4",
"TRK5",
"TRK6",
"TIRG", // Tire grabbers
"RSHT", // DEZ Ring Shooter
@ -4676,6 +4677,7 @@ state_t states[NUMSTATES] =
{SPR_TRK4, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, 13, {NULL}, 12, 1, S_INVISIBLE}, // S_TRICKINDICATOR_UNDERLAY_ARROW2,
{SPR_TRK5, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_SIDETRICK,
{SPR_TRK6, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_BACKTRICK,
{SPR_TIRG, FF_ANIMATE, -1, {NULL}, 1, 1, S_NULL}, // S_TIREGRABBER
{SPR_RSHT, FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_RINGSHOOTER_SIDE

View file

@ -1194,6 +1194,7 @@ typedef enum sprite
SPR_TRK3,
SPR_TRK4,
SPR_TRK5,
SPR_TRK6,
SPR_TIRG, // Tire grabbers
SPR_RSHT, // DEZ Ring Shooter
@ -5120,6 +5121,7 @@ typedef enum state
S_TRICKINDICATOR_UNDERLAY_ARROW2,
S_SIDETRICK,
S_BACKTRICK,
// DEZ Ring Shooter
S_TIREGRABBER,

View file

@ -12190,16 +12190,18 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
else if (!(player->pflags & PF_TRICKDELAY)) // don't allow tricking at the same frame you tumble obv
{
// For tornado trick effects
angle_t tornadotrickspeed = ANG30;
const angle_t angledelta = FixedAngle(36*FRACUNIT);
angle_t baseangle = player->mo->angle + angledelta/2;
boolean fronttrick = false;
INT16 aimingcompare = abs(cmd->throwdir) - abs(cmd->turning);
// Uses cmd->turning over steering intentionally.
#define TRICKTHRESHOLD (KART_FULLTURN/4)
if (aimingcompare < -TRICKTHRESHOLD) // side trick
{
angle_t sidetrickspeed = ANG30;
const angle_t angledelta = FixedAngle(36*FRACUNIT);
angle_t baseangle = player->mo->angle + angledelta/2;
S_StartSound(player->mo, sfx_trick0);
player->dotrickfx = true;
@ -12226,39 +12228,18 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->trickIndicator->rollangle = ANGLE_90;
}
sidetrickspeed = InvAngle(sidetrickspeed);
tornadotrickspeed = InvAngle(tornadotrickspeed);
player->drawangle += ANGLE_45;
P_SetPlayerMobjState(player->mo, S_KART_FAST_LOOK_R);
}
INT32 j;
for (j = 0; j < 8; j++, baseangle += angledelta)
{
mobj_t *swipe = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_SIDETRICK);
P_SetTarget(&swipe->target, player->mo);
swipe->hitlag = TRICKLAG;
swipe->color = player->trickIndicator->color;
swipe->angle = baseangle + ANGLE_90;
swipe->renderflags |= RF_DONTDRAW;
swipe->flags2 |= MF2_AMBUSH; // don't interp on first think
swipe->movedir = sidetrickspeed;
swipe->frame |= (j % 4);
// This is so they make a 10-sided shape with one-sprite gap
if (j != 3)
continue;
baseangle += angledelta;
}
}
else if (aimingcompare > TRICKTHRESHOLD) // forward/back trick
{
S_StartSound(player->mo, sfx_trick0);
player->dotrickfx = true;
if (cmd->throwdir > 0) // back trick
if (cmd->throwdir > 0) // forward trick
{
if (player->mo->momz * P_MobjFlip(player->mo) > 0)
{
@ -12272,8 +12253,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
{
player->trickIndicator->rollangle = 0;
}
P_SetPlayerMobjState(player->mo, S_KART_FAST);
fronttrick = true;
}
else if (cmd->throwdir < 0)
else if (cmd->throwdir < 0) // back trick
{
player->mo->momx /= 3;
player->mo->momy /= 3;
@ -12296,6 +12281,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
{
player->trickIndicator->rollangle = ANGLE_180;
}
//tornadotrickspeed = InvAngle(tornadotrickspeed);
//player->drawangle += ANGLE_45;
P_SetPlayerMobjState(player->mo, S_KART_FAST);
}
}
#undef TRICKTHRESHOLD
@ -12311,6 +12301,34 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->karthud[khud_trickcool] = TICRATE;
}
INT32 j;
if (fronttrick == true)
; // Not yet sprited
else for (j = 0; j < 8; j++, baseangle += angledelta)
{
mobj_t *swipe = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_SIDETRICK);
if (player->trickpanel == 4)
P_SetMobjState(swipe, S_BACKTRICK);
P_SetTarget(&swipe->target, player->mo);
swipe->hitlag = TRICKLAG;
swipe->color = player->trickIndicator->color;
swipe->angle = baseangle + ANGLE_90;
swipe->renderflags |= RF_DONTDRAW;
swipe->flags2 |= MF2_AMBUSH; // don't interp on first think
swipe->movedir = tornadotrickspeed;
swipe->frame |= (j % 4);
swipe->threshold = 0;
// This is so they make a 10-sided shape with one-sprite gap
if (j != 3)
continue;
baseangle += angledelta;
}
if (P_MobjWasRemoved(player->trickIndicator) == false)
{
K_TrickCatholocismBlast(player->trickIndicator, player->trickIndicator->scale*10, 0);

View file

@ -8454,9 +8454,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
if (!mobj->target
|| !mobj->target->health
|| !mobj->target->player
|| (mobj->target->player->trickpanel != 2
&& mobj->target->player->trickpanel != 3)
)
|| mobj->target->player->trickpanel <= 1)
{
P_RemoveMobj(mobj);
return false;
@ -8478,6 +8476,38 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
fixed_t scale = mobj->target->scale;
// sweeping effect
if (mobj->target->player->trickpanel == 4)
{
const fixed_t saferange = (20*FRACUNIT)/21;
if (mobj->threshold < -saferange)
{
mobj->threshold = -saferange;
mobj->flags2 |= MF2_AMBUSH;
}
else while (mobj->threshold > saferange)
{
mobj->threshold -= 2*saferange;
mobj->flags2 |= MF2_AMBUSH;
}
scale = P_ReturnThrustX(mobj, FixedAngle(90*mobj->threshold), scale);
// This funny dealie is to make it so default
// scale is placed as standard,
// but variant threshold shifts upwards
fixed_t extraoffset = FixedMul(mobj->info->height, mobj->target->scale - scale);
if (mobj->threshold < 0)
extraoffset /= 2;
// And this makes it swooce across the object.
extraoffset += FixedMul(mobj->threshold, mobj->target->height);
zoff += P_MobjFlip(mobj) * extraoffset;
mobj->threshold += (saferange/8);
}
mobj->angle += mobj->movedir;
P_InstaScale(mobj, scale);