From 48d93ec9f6d8d71893026ba4bd1f76fd3845a597 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 6 Nov 2023 21:54:40 +0000 Subject: [PATCH] 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!? --- src/deh_tables.c | 3 +++ src/info.c | 32 +++++++++++++++++++++++++++- src/info.h | 6 +++++- src/k_kart.c | 33 +++++++++++++++++++++++++++++ src/p_mobj.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++ src/p_user.c | 4 ++-- 6 files changed, 129 insertions(+), 4 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 5a7930152..1025c8d58 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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", diff --git a/src/info.c b/src/info.c index 3b1ade0e5..da38478cf 100644 --- a/src/info.c +++ b/src/info.c @@ -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 diff --git a/src/info.h b/src/info.h index 0686c8262..0963e1c93 100644 --- a/src/info.h +++ b/src/info.h @@ -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, diff --git a/src/k_kart.c b/src/k_kart.c index a88aceb54..e892aa851 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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 diff --git a/src/p_mobj.c b/src/p_mobj.c index 4b606bee0..5c9f1f301 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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 diff --git a/src/p_user.c b/src/p_user.c index b348ad7b9..2c9023e49 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -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)