Trick Indicator first pass

The author of this commit doesn't know what it's doing
This commit is contained in:
toaster 2023-11-06 01:13:13 +00:00
parent ccbcd203dd
commit 5ffae81b08
12 changed files with 211 additions and 3 deletions

View file

@ -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

View file

@ -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;

View file

@ -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",

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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);
}
}
}
}
}

View file

@ -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);

View file

@ -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

View file

@ -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)
{

View file

@ -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;

View file

@ -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);