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].followmobj);
PlayerPointerRemove(players[playernum].stumbleIndicator); PlayerPointerRemove(players[playernum].stumbleIndicator);
PlayerPointerRemove(players[playernum].sliptideZipIndicator); PlayerPointerRemove(players[playernum].sliptideZipIndicator);
PlayerPointerRemove(players[playernum].trickIndicator);
#undef PlayerPointerRemove #undef PlayerPointerRemove

View file

@ -893,6 +893,7 @@ struct player_t
mobj_t *stumbleIndicator; mobj_t *stumbleIndicator;
mobj_t *sliptideZipIndicator; mobj_t *sliptideZipIndicator;
mobj_t *trickIndicator;
mobj_t *whip; mobj_t *whip;
mobj_t *hand; mobj_t *hand;
mobj_t *flickyAttacker; mobj_t *flickyAttacker;

View file

@ -3892,6 +3892,12 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_SMOOTHLANDING", "S_SMOOTHLANDING",
"S_TRICKINDICATOR_OVERLAY",
"S_TRICKINDICATOR_UNDERLAY",
"S_TRICKINDICATOR_OVERLAY_ARROW",
"S_TRICKINDICATOR_UNDERLAY_ARROW",
"S_TRICKINDICATOR_UNDERLAY_ARROW2",
// DEZ Ring Shooter // DEZ Ring Shooter
"S_TIREGRABBER", "S_TIREGRABBER",
"S_RINGSHOOTER_SIDE", "S_RINGSHOOTER_SIDE",
@ -5649,6 +5655,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_TRIPWIREBOOST", "MT_TRIPWIREBOOST",
"MT_SMOOTHLANDING", "MT_SMOOTHLANDING",
"MT_TRICKINDICATOR",
"MT_TIREGRABBER", "MT_TIREGRABBER",
"MT_RINGSHOOTER", "MT_RINGSHOOTER",

View file

@ -2244,6 +2244,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
PlayerPointerRemove(players[player].followmobj); PlayerPointerRemove(players[player].followmobj);
PlayerPointerRemove(players[player].stumbleIndicator); PlayerPointerRemove(players[player].stumbleIndicator);
PlayerPointerRemove(players[player].sliptideZipIndicator); PlayerPointerRemove(players[player].sliptideZipIndicator);
PlayerPointerRemove(players[player].trickIndicator);
#undef PlayerPointerRemove #undef PlayerPointerRemove

View file

@ -631,6 +631,12 @@ char sprnames[NUMSPRITES + 1][5] =
"TWBT", // Tripwire BLASTER "TWBT", // Tripwire BLASTER
"SMLD", // Smooth landing "SMLD", // Smooth landing
// Trick Indicator
"TRK1",
"TRK2",
"TRK3",
"TRK4",
"TIRG", // Tire grabbers "TIRG", // Tire grabbers
"RSHT", // DEZ Ring Shooter "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_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_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_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 {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 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 { // MT_TIREGRABBER
-1, // doomednum -1, // doomednum
S_TIREGRABBER, // spawnstate S_TIREGRABBER, // spawnstate

View file

@ -1188,6 +1188,12 @@ typedef enum sprite
SPR_TWBT, // Tripwire BLASTER SPR_TWBT, // Tripwire BLASTER
SPR_SMLD, // Smooth landing SPR_SMLD, // Smooth landing
// Trick Indicator
SPR_TRK1,
SPR_TRK2,
SPR_TRK3,
SPR_TRK4,
SPR_TIRG, // Tire grabbers SPR_TIRG, // Tire grabbers
SPR_RSHT, // DEZ Ring Shooter SPR_RSHT, // DEZ Ring Shooter
@ -5106,6 +5112,12 @@ typedef enum state
S_SMOOTHLANDING, S_SMOOTHLANDING,
S_TRICKINDICATOR_OVERLAY,
S_TRICKINDICATOR_UNDERLAY,
S_TRICKINDICATOR_OVERLAY_ARROW,
S_TRICKINDICATOR_UNDERLAY_ARROW,
S_TRICKINDICATOR_UNDERLAY_ARROW2,
// DEZ Ring Shooter // DEZ Ring Shooter
S_TIREGRABBER, S_TIREGRABBER,
S_RINGSHOOTER_SIDE, S_RINGSHOOTER_SIDE,
@ -6902,6 +6914,7 @@ typedef enum mobj_type
MT_TRIPWIREBOOST, MT_TRIPWIREBOOST,
MT_SMOOTHLANDING, MT_SMOOTHLANDING,
MT_TRICKINDICATOR,
MT_TIREGRABBER, MT_TIREGRABBER,
MT_RINGSHOOTER, MT_RINGSHOOTER,

View file

@ -4099,6 +4099,44 @@ void K_InitSliptideZipIndicator(player_t *player)
P_SetTarget(&new->target, player->mo); 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) void K_UpdateStumbleIndicator(player_t *player)
{ {
const angle_t fudge = ANG15; 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) static boolean K_LastTumbleBounceCondition(player_t *player)
{ {
return (player->tumbleBounces > TUMBLEBOUNCES && player->tumbleHeight < 60); 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->trickpanel = 1;
mo->player->pflags |= PF_TRICKDELAY; 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) if (mo->player->sneakertimer)
{ {
thrust = FixedMul(thrust, 5*FRACUNIT/4); thrust = FixedMul(thrust, 5*FRACUNIT/4);
@ -8700,8 +8791,8 @@ void K_KartPlayerAfterThink(player_t *player)
K_KartResetPlayerColor(player); K_KartResetPlayerColor(player);
K_UpdateStumbleIndicator(player); K_UpdateStumbleIndicator(player);
K_UpdateSliptideZipIndicator(player); K_UpdateSliptideZipIndicator(player);
K_UpdateTrickIndicator(player);
// Move held objects (Bananas, Orbinaut, etc) // Move held objects (Bananas, Orbinaut, etc)
K_MoveHeldObjects(player); K_MoveHeldObjects(player);
@ -11966,6 +12057,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
K_trickPanelTimingVisual(player, momz); K_trickPanelTimingVisual(player, momz);
if (P_MobjWasRemoved(player->trickIndicator) == false)
{
player->trickIndicator->destscale = FixedMul(speedmult + FRACUNIT, mapobjectscale);
}
// streaks: // streaks:
if (momz*P_MobjFlip(player->mo) > 0) // only spawn those while you're going upwards relative to your current gravity 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)); P_InstaThrust(player->mo, player->mo->angle + lr, max(basespeed, speed*5/2));
player->trickpanel = 2; player->trickpanel = 2;
if (P_MobjWasRemoved(player->trickIndicator) == false)
{
player->trickIndicator->rollangle = ANGLE_270;
}
} }
else else
{ {
P_InstaThrust(player->mo, player->mo->angle - lr, max(basespeed, speed*5/2)); P_InstaThrust(player->mo, player->mo->angle - lr, max(basespeed, speed*5/2));
player->trickpanel = 3; player->trickpanel = 3;
if (P_MobjWasRemoved(player->trickIndicator) == false)
{
player->trickIndicator->rollangle = ANGLE_90;
}
} }
} }
else if (aimingcompare > TRICKTHRESHOLD) // forward/back trick 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)); P_InstaThrust(player->mo, player->mo->angle, max(basespeed, speed*3));
player->trickpanel = 2; player->trickpanel = 2;
if (P_MobjWasRemoved(player->trickIndicator) == false)
{
player->trickIndicator->rollangle = 0;
}
} }
else if (cmd->throwdir < 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->mo->momz += P_MobjFlip(player->mo)*48*mapobjectscale;
player->trickpanel = 4; player->trickpanel = 4;
if (P_MobjWasRemoved(player->trickIndicator) == false)
{
player->trickIndicator->rollangle = ANGLE_180;
}
} }
} }
#undef TRICKTHRESHOLD #undef TRICKTHRESHOLD
@ -12084,6 +12200,15 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
{ {
player->karthud[khud_trickcool] = TICRATE; 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); boolean K_CheckStumble(player_t *player, angle_t oldPitch, angle_t oldRoll, boolean fromAir);
void K_InitStumbleIndicator(player_t *player); void K_InitStumbleIndicator(player_t *player);
void K_InitSliptideZipIndicator(player_t *player); void K_InitSliptideZipIndicator(player_t *player);
void K_InitTrickIndicator(player_t *player);
void K_UpdateStumbleIndicator(player_t *player); void K_UpdateStumbleIndicator(player_t *player);
void K_UpdateSliptideZipIndicator(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); INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source);
void K_DebtStingPlayer(player_t *player, mobj_t *source); void K_DebtStingPlayer(player_t *player, mobj_t *source);
void K_GiveBumpersToPlayer(player_t *player, player_t *victim, UINT8 amount); 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->stumbleIndicator);
PlayerPointerRemove(player->sliptideZipIndicator); PlayerPointerRemove(player->sliptideZipIndicator);
PlayerPointerRemove(player->trickIndicator);
#undef PlayerPointerRemove #undef PlayerPointerRemove

View file

@ -12448,8 +12448,8 @@ void P_SpawnPlayer(INT32 playernum)
p->griefValue = 0; p->griefValue = 0;
K_InitStumbleIndicator(p); K_InitStumbleIndicator(p);
K_InitSliptideZipIndicator(p); K_InitSliptideZipIndicator(p);
K_InitTrickIndicator(p);
if (gametyperules & GTR_ITEMARROWS) if (gametyperules & GTR_ITEMARROWS)
{ {

View file

@ -65,7 +65,7 @@ savedata_cup_t cupsavedata;
#define ARCHIVEBLOCK_RNG 0x7FAAB5BD #define ARCHIVEBLOCK_RNG 0x7FAAB5BD
// Note: This cannot be bigger // Note: This cannot be bigger
// than an UINT16 // than an UINT16 (for now)
typedef enum typedef enum
{ {
AWAYVIEW = 0x0001, AWAYVIEW = 0x0001,
@ -81,6 +81,7 @@ typedef enum
HAND = 0x0400, HAND = 0x0400,
FLICKYATTACKER = 0x0800, FLICKYATTACKER = 0x0800,
FLICKYCONTROLLER = 0x1000, FLICKYCONTROLLER = 0x1000,
TRICKINDICATOR = 0x2000,
} player_saveflags; } player_saveflags;
static inline void P_ArchivePlayer(savebuffer_t *save) static inline void P_ArchivePlayer(savebuffer_t *save)
@ -313,6 +314,9 @@ static void P_NetArchivePlayers(savebuffer_t *save)
if (players[i].sliptideZipIndicator) if (players[i].sliptideZipIndicator)
flags |= SLIPTIDEZIP; flags |= SLIPTIDEZIP;
if (players[i].trickIndicator)
flags |= TRICKINDICATOR;
if (players[i].whip) if (players[i].whip)
flags |= WHIP; flags |= WHIP;
@ -351,6 +355,9 @@ static void P_NetArchivePlayers(savebuffer_t *save)
if (flags & SLIPTIDEZIP) if (flags & SLIPTIDEZIP)
WRITEUINT32(save->p, players[i].sliptideZipIndicator->mobjnum); WRITEUINT32(save->p, players[i].sliptideZipIndicator->mobjnum);
if (flags & TRICKINDICATOR)
WRITEUINT32(save->p, players[i].trickIndicator->mobjnum);
if (flags & WHIP) if (flags & WHIP)
WRITEUINT32(save->p, players[i].whip->mobjnum); WRITEUINT32(save->p, players[i].whip->mobjnum);
@ -864,6 +871,9 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
if (flags & SLIPTIDEZIP) if (flags & SLIPTIDEZIP)
players[i].sliptideZipIndicator = (mobj_t *)(size_t)READUINT32(save->p); 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) if (flags & WHIP)
players[i].whip = (mobj_t *)(size_t)READUINT32(save->p); 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))) if (!P_SetTarget(&players[i].sliptideZipIndicator, P_FindNewPosition(temp)))
CONS_Debug(DBG_GAMELOGIC, "sliptideZipIndicator not found on player %d\n", i); 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) if (players[i].whip)
{ {
temp = (UINT32)(size_t)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->followmobj);
PlayerPointerErase(player->stumbleIndicator); PlayerPointerErase(player->stumbleIndicator);
PlayerPointerErase(player->sliptideZipIndicator); PlayerPointerErase(player->sliptideZipIndicator);
PlayerPointerErase(player->trickIndicator);
PlayerPointerErase(player->whip); PlayerPointerErase(player->whip);
PlayerPointerErase(player->hand); PlayerPointerErase(player->hand);
PlayerPointerErase(player->ringShooter); PlayerPointerErase(player->ringShooter);