From 5ffae81b0860f45b67bbeb4084fc515199c2dbb8 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 6 Nov 2023 01:13:13 +0000 Subject: [PATCH] Trick Indicator first pass The author of this commit doesn't know what it's doing --- src/d_clisrv.c | 1 + src/d_player.h | 1 + src/deh_tables.c | 7 +++ src/g_game.c | 1 + src/info.c | 39 +++++++++++++++ src/info.h | 13 +++++ src/k_kart.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++- src/k_kart.h | 2 + src/p_inter.c | 1 + src/p_mobj.c | 2 +- src/p_saveg.c | 19 ++++++- src/p_user.c | 1 + 12 files changed, 211 insertions(+), 3 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index a48bb344d..abcdb7580 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2551,6 +2551,7 @@ void CL_ClearPlayer(INT32 playernum) PlayerPointerRemove(players[playernum].followmobj); PlayerPointerRemove(players[playernum].stumbleIndicator); PlayerPointerRemove(players[playernum].sliptideZipIndicator); + PlayerPointerRemove(players[playernum].trickIndicator); #undef PlayerPointerRemove diff --git a/src/d_player.h b/src/d_player.h index cc176671c..c132ca4e9 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -893,6 +893,7 @@ struct player_t mobj_t *stumbleIndicator; mobj_t *sliptideZipIndicator; + mobj_t *trickIndicator; mobj_t *whip; mobj_t *hand; mobj_t *flickyAttacker; diff --git a/src/deh_tables.c b/src/deh_tables.c index 3023b70eb..5a7930152 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3892,6 +3892,12 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_SMOOTHLANDING", + "S_TRICKINDICATOR_OVERLAY", + "S_TRICKINDICATOR_UNDERLAY", + "S_TRICKINDICATOR_OVERLAY_ARROW", + "S_TRICKINDICATOR_UNDERLAY_ARROW", + "S_TRICKINDICATOR_UNDERLAY_ARROW2", + // DEZ Ring Shooter "S_TIREGRABBER", "S_RINGSHOOTER_SIDE", @@ -5649,6 +5655,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_TRIPWIREBOOST", "MT_SMOOTHLANDING", + "MT_TRICKINDICATOR", "MT_TIREGRABBER", "MT_RINGSHOOTER", diff --git a/src/g_game.c b/src/g_game.c index 3c796cae4..3b4ca5125 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2244,6 +2244,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) PlayerPointerRemove(players[player].followmobj); PlayerPointerRemove(players[player].stumbleIndicator); PlayerPointerRemove(players[player].sliptideZipIndicator); + PlayerPointerRemove(players[player].trickIndicator); #undef PlayerPointerRemove diff --git a/src/info.c b/src/info.c index 23c3225ee..3b1ade0e5 100644 --- a/src/info.c +++ b/src/info.c @@ -631,6 +631,12 @@ char sprnames[NUMSPRITES + 1][5] = "TWBT", // Tripwire BLASTER "SMLD", // Smooth landing + // Trick Indicator + "TRK1", + "TRK2", + "TRK3", + "TRK4", + "TIRG", // Tire grabbers "RSHT", // DEZ Ring Shooter @@ -4662,6 +4668,12 @@ state_t states[NUMSTATES] = {SPR_SMLD, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE, -1, {NULL}, 7, 2, S_NULL}, // S_SMOOTHLANDING + {SPR_TRK1, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE|FF_ADD, -1, {NULL}, 3, 3, S_NULL}, // S_TRICKINDICATOR_OVERLAY, + {SPR_TRK2, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 3, 3, S_NULL}, // S_TRICKINDICATOR_UNDERLAY, + {SPR_TRK3, FF_FULLBRIGHT|FF_ANIMATE|FF_PAPERSPRITE|FF_ADD, 13, {NULL}, 12, 1, S_INVISIBLE}, // S_TRICKINDICATOR_OVERLAY_ARROW, + {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_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 @@ -25329,6 +25341,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_TRICKINDICATOR + -1, // doomednum + S_INVISIBLE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // 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 + 128*FRACUNIT, // radius + 128*FRACUNIT, // height + -1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_TIREGRABBER -1, // doomednum S_TIREGRABBER, // spawnstate diff --git a/src/info.h b/src/info.h index b57082a5f..0686c8262 100644 --- a/src/info.h +++ b/src/info.h @@ -1188,6 +1188,12 @@ typedef enum sprite SPR_TWBT, // Tripwire BLASTER SPR_SMLD, // Smooth landing + // Trick Indicator + SPR_TRK1, + SPR_TRK2, + SPR_TRK3, + SPR_TRK4, + SPR_TIRG, // Tire grabbers SPR_RSHT, // DEZ Ring Shooter @@ -5106,6 +5112,12 @@ typedef enum state S_SMOOTHLANDING, + S_TRICKINDICATOR_OVERLAY, + S_TRICKINDICATOR_UNDERLAY, + S_TRICKINDICATOR_OVERLAY_ARROW, + S_TRICKINDICATOR_UNDERLAY_ARROW, + S_TRICKINDICATOR_UNDERLAY_ARROW2, + // DEZ Ring Shooter S_TIREGRABBER, S_RINGSHOOTER_SIDE, @@ -6902,6 +6914,7 @@ typedef enum mobj_type MT_TRIPWIREBOOST, MT_SMOOTHLANDING, + MT_TRICKINDICATOR, MT_TIREGRABBER, MT_RINGSHOOTER, diff --git a/src/k_kart.c b/src/k_kart.c index 40298dbaf..34d635560 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4099,6 +4099,44 @@ void K_InitSliptideZipIndicator(player_t *player) P_SetTarget(&new->target, player->mo); } +void K_InitTrickIndicator(player_t *player) +{ + mobj_t *new = NULL; + + if (player == NULL) + { + return; + } + + if (player->mo == NULL || P_MobjWasRemoved(player->mo) == true) + { + return; + } + + if (P_MobjWasRemoved(player->trickIndicator) == false) + { + if (P_MobjWasRemoved(player->trickIndicator->tracer) == false) + { + P_RemoveMobj(player->trickIndicator->tracer); + } + + P_RemoveMobj(player->trickIndicator); + } + + new = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_TRICKINDICATOR); + + P_SetTarget(&player->trickIndicator, new); + P_SetTarget(&new->target, player->mo); + + mobj_t *secondlayer = P_SpawnMobjFromMobj(new, 0, 0, 0, MT_OVERLAY); + + P_SetTarget(&new->tracer, secondlayer); + P_SetTarget(&secondlayer->target, new); + + secondlayer->dispoffset = 1; + secondlayer->flags |= MF_DONTENCOREMAP; +} + void K_UpdateStumbleIndicator(player_t *player) { const angle_t fudge = ANG15; @@ -4282,6 +4320,49 @@ void K_UpdateSliptideZipIndicator(player_t *player) } } +void K_UpdateTrickIndicator(player_t *player) +{ + mobj_t *mobj = NULL; + + if (player == NULL) + { + return; + } + + if (player->mo == NULL || P_MobjWasRemoved(player->mo) == true) + { + return; + } + + if (player->trickIndicator == NULL + || P_MobjWasRemoved(player->trickIndicator) == true + || player->trickIndicator->tracer == NULL + || P_MobjWasRemoved(player->trickIndicator->tracer) == true) + { + K_InitTrickIndicator(player); + return; + } + + mobj = player->trickIndicator; + + const fixed_t onidistance = 200*mapobjectscale; + + P_MoveOrigin( + mobj, + player->mo->x + P_ReturnThrustX(player->mo, player->mo->angle, onidistance), + player->mo->y + P_ReturnThrustY(player->mo, player->mo->angle, onidistance), + player->mo->z + (player->mo->height / 2)); + mobj->angle = player->mo->angle + ANGLE_90; + + if (player->trickpanel == 0) + { + P_SetScale(mobj, mobj->destscale = player->mo->scale); + + P_SetMobjState(mobj, S_INVISIBLE); + P_SetMobjState(mobj->tracer, S_INVISIBLE); + } +} + static boolean K_LastTumbleBounceCondition(player_t *player) { return (player->tumbleBounces > TUMBLEBOUNCES && player->tumbleHeight < 60); @@ -6256,6 +6337,16 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) mo->player->trickpanel = 1; mo->player->pflags |= PF_TRICKDELAY; + if (P_MobjWasRemoved(mo->player->trickIndicator) == false) + { + mo->player->trickIndicator->rollangle = 0; + P_SetMobjState(mo->player->trickIndicator, S_TRICKINDICATOR_UNDERLAY); + if (P_MobjWasRemoved(mo->player->trickIndicator->tracer) == false) + { + P_SetMobjState(mo->player->trickIndicator->tracer, S_TRICKINDICATOR_OVERLAY); + } + } + if (mo->player->sneakertimer) { thrust = FixedMul(thrust, 5*FRACUNIT/4); @@ -8700,8 +8791,8 @@ void K_KartPlayerAfterThink(player_t *player) K_KartResetPlayerColor(player); K_UpdateStumbleIndicator(player); - K_UpdateSliptideZipIndicator(player); + K_UpdateTrickIndicator(player); // Move held objects (Bananas, Orbinaut, etc) K_MoveHeldObjects(player); @@ -11966,6 +12057,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_trickPanelTimingVisual(player, momz); + if (P_MobjWasRemoved(player->trickIndicator) == false) + { + player->trickIndicator->destscale = FixedMul(speedmult + FRACUNIT, mapobjectscale); + } + // streaks: if (momz*P_MobjFlip(player->mo) > 0) // only spawn those while you're going upwards relative to your current gravity { @@ -12031,11 +12127,21 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { P_InstaThrust(player->mo, player->mo->angle + lr, max(basespeed, speed*5/2)); player->trickpanel = 2; + + if (P_MobjWasRemoved(player->trickIndicator) == false) + { + player->trickIndicator->rollangle = ANGLE_270; + } } else { P_InstaThrust(player->mo, player->mo->angle - lr, max(basespeed, speed*5/2)); player->trickpanel = 3; + + if (P_MobjWasRemoved(player->trickIndicator) == false) + { + player->trickIndicator->rollangle = ANGLE_90; + } } } else if (aimingcompare > TRICKTHRESHOLD) // forward/back trick @@ -12049,6 +12155,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) P_InstaThrust(player->mo, player->mo->angle, max(basespeed, speed*3)); player->trickpanel = 2; + + if (P_MobjWasRemoved(player->trickIndicator) == false) + { + player->trickIndicator->rollangle = 0; + } } else if (cmd->throwdir < 0) { @@ -12068,6 +12179,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->mo->momz += P_MobjFlip(player->mo)*48*mapobjectscale; player->trickpanel = 4; + + if (P_MobjWasRemoved(player->trickIndicator) == false) + { + player->trickIndicator->rollangle = ANGLE_180; + } } } #undef TRICKTHRESHOLD @@ -12084,6 +12200,15 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { player->karthud[khud_trickcool] = TICRATE; } + + if (P_MobjWasRemoved(player->trickIndicator) == false) + { + P_SetMobjState(player->trickIndicator, S_TRICKINDICATOR_UNDERLAY_ARROW); + if (P_MobjWasRemoved(player->trickIndicator->tracer) == false) + { + P_SetMobjState(player->trickIndicator->tracer, S_TRICKINDICATOR_OVERLAY_ARROW); + } + } } } } diff --git a/src/k_kart.h b/src/k_kart.h index 7a4424f08..3f6293bba 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -120,8 +120,10 @@ void K_StumblePlayer(player_t *player); boolean K_CheckStumble(player_t *player, angle_t oldPitch, angle_t oldRoll, boolean fromAir); void K_InitStumbleIndicator(player_t *player); void K_InitSliptideZipIndicator(player_t *player); +void K_InitTrickIndicator(player_t *player); void K_UpdateStumbleIndicator(player_t *player); void K_UpdateSliptideZipIndicator(player_t *player); +void K_UpdateTrickIndicator(player_t *player); INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source); void K_DebtStingPlayer(player_t *player, mobj_t *source); void K_GiveBumpersToPlayer(player_t *player, player_t *victim, UINT8 amount); diff --git a/src/p_inter.c b/src/p_inter.c index 447744aaa..18a2f5e7c 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2559,6 +2559,7 @@ static boolean P_KillPlayer(player_t *player, mobj_t *inflictor, mobj_t *source, PlayerPointerRemove(player->stumbleIndicator); PlayerPointerRemove(player->sliptideZipIndicator); + PlayerPointerRemove(player->trickIndicator); #undef PlayerPointerRemove diff --git a/src/p_mobj.c b/src/p_mobj.c index 1ada630c8..168fc86ac 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -12448,8 +12448,8 @@ void P_SpawnPlayer(INT32 playernum) p->griefValue = 0; K_InitStumbleIndicator(p); - K_InitSliptideZipIndicator(p); + K_InitTrickIndicator(p); if (gametyperules & GTR_ITEMARROWS) { diff --git a/src/p_saveg.c b/src/p_saveg.c index a1c3d1f64..865732692 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -65,7 +65,7 @@ savedata_cup_t cupsavedata; #define ARCHIVEBLOCK_RNG 0x7FAAB5BD // Note: This cannot be bigger -// than an UINT16 +// than an UINT16 (for now) typedef enum { AWAYVIEW = 0x0001, @@ -81,6 +81,7 @@ typedef enum HAND = 0x0400, FLICKYATTACKER = 0x0800, FLICKYCONTROLLER = 0x1000, + TRICKINDICATOR = 0x2000, } player_saveflags; static inline void P_ArchivePlayer(savebuffer_t *save) @@ -313,6 +314,9 @@ static void P_NetArchivePlayers(savebuffer_t *save) if (players[i].sliptideZipIndicator) flags |= SLIPTIDEZIP; + if (players[i].trickIndicator) + flags |= TRICKINDICATOR; + if (players[i].whip) flags |= WHIP; @@ -351,6 +355,9 @@ static void P_NetArchivePlayers(savebuffer_t *save) if (flags & SLIPTIDEZIP) WRITEUINT32(save->p, players[i].sliptideZipIndicator->mobjnum); + if (flags & TRICKINDICATOR) + WRITEUINT32(save->p, players[i].trickIndicator->mobjnum); + if (flags & WHIP) WRITEUINT32(save->p, players[i].whip->mobjnum); @@ -864,6 +871,9 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) if (flags & SLIPTIDEZIP) players[i].sliptideZipIndicator = (mobj_t *)(size_t)READUINT32(save->p); + if (flags & TRICKINDICATOR) + players[i].trickIndicator = (mobj_t *)(size_t)READUINT32(save->p); + if (flags & WHIP) players[i].whip = (mobj_t *)(size_t)READUINT32(save->p); @@ -5595,6 +5605,13 @@ static void P_RelinkPointers(void) if (!P_SetTarget(&players[i].sliptideZipIndicator, P_FindNewPosition(temp))) CONS_Debug(DBG_GAMELOGIC, "sliptideZipIndicator not found on player %d\n", i); } + if (players[i].trickIndicator) + { + temp = (UINT32)(size_t)players[i].trickIndicator; + players[i].trickIndicator = NULL; + if (!P_SetTarget(&players[i].trickIndicator, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "trickIndicator not found on player %d\n", i); + } if (players[i].whip) { temp = (UINT32)(size_t)players[i].whip; diff --git a/src/p_user.c b/src/p_user.c index 419e78ab6..3d2aa4b37 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3996,6 +3996,7 @@ void P_PlayerThink(player_t *player) PlayerPointerErase(player->followmobj); PlayerPointerErase(player->stumbleIndicator); PlayerPointerErase(player->sliptideZipIndicator); + PlayerPointerErase(player->trickIndicator); PlayerPointerErase(player->whip); PlayerPointerErase(player->hand); PlayerPointerErase(player->ringShooter);