Ring Shooter: E-Brake + adjust distance

- Y is now additionally another macro for HOLD!
- Disable HOLD! drop from respawning when done with Ring Shooter.
- Immediate release Ring Shooter now goes back a waypoint, and does not have a minimum distance to go forward anymore.
This commit is contained in:
Sally Coolatta 2023-04-14 05:34:44 -04:00
parent b123fd98a2
commit 3b7ac38d9f
6 changed files with 50 additions and 11 deletions

View file

@ -310,6 +310,7 @@ struct respawnvars_t
tic_t dropdash; // Drop Dash charge timer tic_t dropdash; // Drop Dash charge timer
boolean truedeath; // Your soul has left your body boolean truedeath; // Your soul has left your body
boolean manual; // Respawn coords were manually set, please respawn exactly there boolean manual; // Respawn coords were manually set, please respawn exactly there
boolean fromRingShooter; // Respawn was from Ring Shooter, don't allow E-Brake drop
boolean init; boolean init;
}; };

View file

@ -1324,7 +1324,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
// C // C
if (G_PlayerInputDown(forplayer, gc_spindash, 0)) if (G_PlayerInputDown(forplayer, gc_spindash, 0))
{ {
forward = 0;
cmd->buttons |= BT_SPINDASHMASK; cmd->buttons |= BT_SPINDASHMASK;
} }
@ -1343,7 +1342,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
// respawn // respawn
if (G_PlayerInputDown(forplayer, gc_respawn, 0)) if (G_PlayerInputDown(forplayer, gc_respawn, 0))
{ {
cmd->buttons |= BT_RESPAWN; cmd->buttons |= (BT_RESPAWN | BT_EBRAKEMASK);
} }
// mp general function button // mp general function button

View file

@ -3420,7 +3420,9 @@ SINT8 K_GetForwardMove(player_t *player)
return MAXPLMOVE; return MAXPLMOVE;
} }
if (player->spinouttimer || K_PlayerEBrake(player)) if (player->spinouttimer != 0
|| K_PressingEBrake(player) == true
|| K_PlayerEBrake(player) == true)
{ {
return 0; return 0;
} }
@ -7549,6 +7551,11 @@ static void K_UpdateTripwire(player_t *player)
} }
} }
boolean K_PressingEBrake(player_t *player)
{
return ((K_GetKartButtons(player) & BT_EBRAKEMASK) == BT_EBRAKEMASK);
}
/** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c /** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c
\param player player object passed from P_PlayerThink \param player player object passed from P_PlayerThink
@ -8076,7 +8083,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
K_SpawnGardenTopSpeedLines(player); K_SpawnGardenTopSpeedLines(player);
} }
// Only allow drifting while NOT trying to do an spindash input. // Only allow drifting while NOT trying to do an spindash input.
else if ((K_GetKartButtons(player) & BT_EBRAKEMASK) != BT_EBRAKEMASK) else if (K_PressingEBrake(player) == false)
{ {
player->pflags |= PF_DRIFTINPUT; player->pflags |= PF_DRIFTINPUT;
} }
@ -8952,7 +8959,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
currentSpeed = FixedHypot(player->mo->momx, player->mo->momy); currentSpeed = FixedHypot(player->mo->momx, player->mo->momy);
if ((currentSpeed <= 0) // Not moving if ((currentSpeed <= 0) // Not moving
&& ((K_GetKartButtons(player) & BT_EBRAKEMASK) != BT_EBRAKEMASK) // Not e-braking && (K_PressingEBrake(player) == false) // Not e-braking
&& (player->respawn.state == RESPAWNST_NONE) // Not respawning && (player->respawn.state == RESPAWNST_NONE) // Not respawning
&& (player->curshield != KSHIELD_TOP) // Not riding a Top && (player->curshield != KSHIELD_TOP) // Not riding a Top
&& (P_IsObjectOnGround(player->mo) == true)) // On the ground && (P_IsObjectOnGround(player->mo) == true)) // On the ground
@ -9738,7 +9745,12 @@ static INT32 K_FlameShieldMax(player_t *player)
boolean K_PlayerEBrake(player_t *player) boolean K_PlayerEBrake(player_t *player)
{ {
if (player->respawn.state != RESPAWNST_NONE if (player->respawn.state != RESPAWNST_NONE
&& player->respawn.init == true) && (player->respawn.init == true || player->respawn.fromRingShooter == true))
{
return false;
}
if (Obj_PlayerRingShooterFreeze(player) == true)
{ {
return false; return false;
} }
@ -9748,7 +9760,7 @@ boolean K_PlayerEBrake(player_t *player)
return true; return true;
} }
if ((K_GetKartButtons(player) & BT_EBRAKEMASK) == BT_EBRAKEMASK if (K_PressingEBrake(player) == true
&& player->drift == 0 && player->drift == 0
&& P_PlayerInPain(player) == false && P_PlayerInPain(player) == false
&& player->justbumped == 0 && player->justbumped == 0

View file

@ -81,6 +81,7 @@ void K_SpawnBumpEffect(mobj_t *mo);
void K_KartMoveAnimation(player_t *player); void K_KartMoveAnimation(player_t *player);
void K_KartPlayerHUDUpdate(player_t *player); void K_KartPlayerHUDUpdate(player_t *player);
void K_KartResetPlayerColor(player_t *player); void K_KartResetPlayerColor(player_t *player);
boolean K_PressingEBrake(player_t *player);
void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
void K_KartPlayerAfterThink(player_t *player); void K_KartPlayerAfterThink(player_t *player);
fixed_t K_MomentumThreshold(const mobj_t *mo); fixed_t K_MomentumThreshold(const mobj_t *mo);

View file

@ -175,9 +175,25 @@ void K_DoIngameRespawn(player_t *player)
} }
else if (player->respawn.wp != NULL) else if (player->respawn.wp != NULL)
{ {
const UINT32 dist = RESPAWN_DIST + (player->airtime * 48); if (player->respawn.fromRingShooter == true)
player->respawn.distanceleft = (dist * mapobjectscale) / FRACUNIT; {
K_RespawnAtWaypoint(player, player->respawn.wp); waypoint_t *prevWP = player->respawn.wp;
if (prevWP->numprevwaypoints > 0)
{
prevWP = prevWP->prevwaypoints[0];
}
const UINT32 dist = (player->airtime * 48);
player->respawn.distanceleft = (dist * mapobjectscale) / FRACUNIT;
K_RespawnAtWaypoint(player, prevWP);
}
else
{
const UINT32 dist = RESPAWN_DIST + (player->airtime * 48);
player->respawn.distanceleft = (dist * mapobjectscale) / FRACUNIT;
K_RespawnAtWaypoint(player, player->respawn.wp);
}
} }
else else
{ {
@ -465,7 +481,9 @@ static void K_MovePlayerToRespawnPoint(player_t *player)
player->mo->momz = step.z; player->mo->momz = step.z;
} }
if (player->respawn.init == false && K_PlayerEBrake(player) == true) if (player->respawn.init == false
&& player->respawn.fromRingShooter == false
&& K_PlayerEBrake(player) == true)
{ {
// Manual drop! // Manual drop!
player->respawn.state = RESPAWNST_DROP; player->respawn.state = RESPAWNST_DROP;
@ -822,6 +840,7 @@ void K_RespawnChecker(player_t *player)
K_MovePlayerToRespawnPoint(player); K_MovePlayerToRespawnPoint(player);
return; return;
case RESPAWNST_DROP: case RESPAWNST_DROP:
player->respawn.fromRingShooter = false;
player->mo->momx = player->mo->momy = 0; player->mo->momx = player->mo->momy = 0;
player->flashing = 3; player->flashing = 3;
if (player->respawn.timer > 0) if (player->respawn.timer > 0)

View file

@ -428,6 +428,8 @@ void Obj_PlayerUsedRingShooter(mobj_t *base, player_t *player)
{ {
player->airtime += rs_base_karted(base); player->airtime += rs_base_karted(base);
} }
player->respawn.fromRingShooter = true;
K_DoIngameRespawn(player); K_DoIngameRespawn(player);
// Now other players can run into it! // Now other players can run into it!
@ -676,6 +678,11 @@ void Obj_RingShooterInput(player_t *player)
{ {
player->mo->momx = player->mo->momy = 0; player->mo->momx = player->mo->momy = 0;
P_SetPlayerAngle(player, base->angle); P_SetPlayerAngle(player, base->angle);
P_MoveOrigin(
player->mo,
base->x, base->y,
base->z // TODO: reverse gravity
);
if (base->fuse < RS_FUSE_BLINK) if (base->fuse < RS_FUSE_BLINK)
{ {