Side Trick effect

- Copiously reuses from MT_MAGICIANBOX, gomen
- Also set the lookback frame, for extra toaster-swag zaza
    - Because this feature is so old it predates lookback!?
This commit is contained in:
toaster 2023-11-06 21:54:40 +00:00
parent 8885a335e7
commit 48d93ec9f6
6 changed files with 129 additions and 4 deletions

View file

@ -3898,6 +3898,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_TRICKINDICATOR_UNDERLAY_ARROW",
"S_TRICKINDICATOR_UNDERLAY_ARROW2",
"S_SIDETRICK",
// DEZ Ring Shooter
"S_TIREGRABBER",
"S_RINGSHOOTER_SIDE",
@ -5656,6 +5658,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_SMOOTHLANDING",
"MT_TRICKINDICATOR",
"MT_SIDETRICK",
"MT_TIREGRABBER",
"MT_RINGSHOOTER",

View file

@ -631,11 +631,12 @@ char sprnames[NUMSPRITES + 1][5] =
"TWBT", // Tripwire BLASTER
"SMLD", // Smooth landing
// Trick Indicator
// Trick Effects
"TRK1",
"TRK2",
"TRK3",
"TRK4",
"TRK5",
"TIRG", // Tire grabbers
"RSHT", // DEZ Ring Shooter
@ -4674,6 +4675,8 @@ state_t states[NUMSTATES] =
{SPR_NULL, 0, 1, {NULL}, 12, 1, S_TRICKINDICATOR_UNDERLAY_ARROW2}, // S_TRICKINDICATOR_UNDERLAY_ARROW,
{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_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
{SPR_RSHT, FF_SEMIBRIGHT|FF_PAPERSPRITE|2, -1, {NULL}, 0, 0, S_NULL}, // S_RINGSHOOTER_NIPPLES
@ -25368,6 +25371,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_SIDETRICK
-1, // doomednum
S_SIDETRICK, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
0, // reactiontime
sfx_None, // attacksound
S_NULL, // painstate
0, // painchance
sfx_None, // painsound
S_NULL, // meleestate
S_NULL, // missilestate
S_NULL, // deathstate
S_NULL, // xdeathstate
sfx_None, // deathsound
0, // speed
36*FRACUNIT, // radius
40*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_TIREGRABBER
-1, // doomednum
S_TIREGRABBER, // spawnstate

View file

@ -1188,11 +1188,12 @@ typedef enum sprite
SPR_TWBT, // Tripwire BLASTER
SPR_SMLD, // Smooth landing
// Trick Indicator
// Trick Effects
SPR_TRK1,
SPR_TRK2,
SPR_TRK3,
SPR_TRK4,
SPR_TRK5,
SPR_TIRG, // Tire grabbers
SPR_RSHT, // DEZ Ring Shooter
@ -5118,6 +5119,8 @@ typedef enum state
S_TRICKINDICATOR_UNDERLAY_ARROW,
S_TRICKINDICATOR_UNDERLAY_ARROW2,
S_SIDETRICK,
// DEZ Ring Shooter
S_TIREGRABBER,
S_RINGSHOOTER_SIDE,
@ -6915,6 +6918,7 @@ typedef enum mobj_type
MT_SMOOTHLANDING,
MT_TRICKINDICATOR,
MT_SIDETRICK,
MT_TIREGRABBER,
MT_RINGSHOOTER,

View file

@ -12189,6 +12189,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
#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;
if (cmd->turning > 0)
{
P_InstaThrust(player->mo, player->mo->angle + lr, max(basespeed, speed*5/2));
@ -12198,6 +12202,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
{
player->trickIndicator->rollangle = ANGLE_270;
}
player->drawangle -= ANGLE_45;
P_SetPlayerMobjState(player->mo, S_KART_FAST_LOOK_L);
}
else
{
@ -12208,6 +12215,32 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
{
player->trickIndicator->rollangle = ANGLE_90;
}
sidetrickspeed = InvAngle(sidetrickspeed);
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

View file

@ -8446,6 +8446,61 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
}
break;
}
case MT_SIDETRICK:
{
fixed_t destx, desty;
fixed_t zoff = 0;
if (!mobj->target
|| !mobj->target->health
|| !mobj->target->player
|| (mobj->target->player->trickpanel != 2
&& mobj->target->player->trickpanel != 3)
)
{
P_RemoveMobj(mobj);
return false;
}
if (leveltime & 1)
{
mobj->renderflags |= RF_DONTDRAW;
}
else
{
mobj->renderflags &= ~RF_DONTDRAW;
mobj->renderflags |= (mobj->target->renderflags & RF_DONTDRAW);
}
mobj->angle += mobj->movedir;
P_SetScale(mobj, mobj->target->scale);
destx = mobj->target->x;
desty = mobj->target->y;
destx += P_ReturnThrustX(mobj, mobj->angle - ANGLE_90, mobj->radius*2);
desty += P_ReturnThrustY(mobj, mobj->angle - ANGLE_90, mobj->radius*2);
mobj->eflags = (mobj->eflags & ~MFE_VERTICALFLIP)|(mobj->target->eflags & MFE_VERTICALFLIP);
mobj->flags2 = (mobj->flags2 & ~MF2_OBJECTFLIP)|(mobj->target->flags2 & MF2_OBJECTFLIP);
if (mobj->eflags & MFE_VERTICALFLIP)
zoff += mobj->target->height - mobj->height;
// Necessary to "ride" on Garden Top
zoff += mobj->target->sprzoff;
if (mobj->flags2 & MF2_AMBUSH)
{
P_SetOrigin(mobj, destx, desty, mobj->target->z + zoff);
mobj->flags2 &= ~MF2_AMBUSH;
}
else
{
P_MoveOrigin(mobj, destx, desty, mobj->target->z + zoff);
}
break;
}
case MT_LIGHTNINGSHIELD:
{
if (!mobj->target || !mobj->target->health || !mobj->target->player

View file

@ -2467,8 +2467,6 @@ void P_MovePlayer(player_t *player)
}
else
{
K_KartMoveAnimation(player);
if (player->trickpanel == 2)
{
player->drawangle += ANGLE_22h;
@ -2479,6 +2477,8 @@ void P_MovePlayer(player_t *player)
}
else
{
K_KartMoveAnimation(player);
player->drawangle = player->mo->angle;
if (player->aizdriftturn)