From 3b7ac38d9fa6976488d3cfba6b91d9c585855cd4 Mon Sep 17 00:00:00 2001 From: Sally Coolatta Date: Fri, 14 Apr 2023 05:34:44 -0400 Subject: [PATCH] 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. --- src/d_player.h | 1 + src/g_game.c | 3 +-- src/k_kart.c | 22 +++++++++++++++++----- src/k_kart.h | 1 + src/k_respawn.c | 27 +++++++++++++++++++++++---- src/objects/ring-shooter.c | 7 +++++++ 6 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 4ecfef161..d0313aaed 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -310,6 +310,7 @@ struct respawnvars_t tic_t dropdash; // Drop Dash charge timer boolean truedeath; // Your soul has left your body 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; }; diff --git a/src/g_game.c b/src/g_game.c index 97cc64c64..527ce39ad 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1324,7 +1324,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // C if (G_PlayerInputDown(forplayer, gc_spindash, 0)) { - forward = 0; cmd->buttons |= BT_SPINDASHMASK; } @@ -1343,7 +1342,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // respawn if (G_PlayerInputDown(forplayer, gc_respawn, 0)) { - cmd->buttons |= BT_RESPAWN; + cmd->buttons |= (BT_RESPAWN | BT_EBRAKEMASK); } // mp general function button diff --git a/src/k_kart.c b/src/k_kart.c index a6485a378..ed24fef49 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3420,7 +3420,9 @@ SINT8 K_GetForwardMove(player_t *player) return MAXPLMOVE; } - if (player->spinouttimer || K_PlayerEBrake(player)) + if (player->spinouttimer != 0 + || K_PressingEBrake(player) == true + || K_PlayerEBrake(player) == true) { 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 \param player player object passed from P_PlayerThink @@ -8076,7 +8083,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) K_SpawnGardenTopSpeedLines(player); } // 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; } @@ -8952,7 +8959,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) currentSpeed = FixedHypot(player->mo->momx, player->mo->momy); 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->curshield != KSHIELD_TOP) // Not riding a Top && (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) { 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; } @@ -9748,7 +9760,7 @@ boolean K_PlayerEBrake(player_t *player) return true; } - if ((K_GetKartButtons(player) & BT_EBRAKEMASK) == BT_EBRAKEMASK + if (K_PressingEBrake(player) == true && player->drift == 0 && P_PlayerInPain(player) == false && player->justbumped == 0 diff --git a/src/k_kart.h b/src/k_kart.h index 782740ce8..bf67be518 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -81,6 +81,7 @@ void K_SpawnBumpEffect(mobj_t *mo); void K_KartMoveAnimation(player_t *player); void K_KartPlayerHUDUpdate(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_KartPlayerAfterThink(player_t *player); fixed_t K_MomentumThreshold(const mobj_t *mo); diff --git a/src/k_respawn.c b/src/k_respawn.c index 252550f06..5573feea1 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -175,9 +175,25 @@ void K_DoIngameRespawn(player_t *player) } else if (player->respawn.wp != NULL) { - const UINT32 dist = RESPAWN_DIST + (player->airtime * 48); - player->respawn.distanceleft = (dist * mapobjectscale) / FRACUNIT; - K_RespawnAtWaypoint(player, player->respawn.wp); + if (player->respawn.fromRingShooter == true) + { + 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 { @@ -465,7 +481,9 @@ static void K_MovePlayerToRespawnPoint(player_t *player) 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! player->respawn.state = RESPAWNST_DROP; @@ -822,6 +840,7 @@ void K_RespawnChecker(player_t *player) K_MovePlayerToRespawnPoint(player); return; case RESPAWNST_DROP: + player->respawn.fromRingShooter = false; player->mo->momx = player->mo->momy = 0; player->flashing = 3; if (player->respawn.timer > 0) diff --git a/src/objects/ring-shooter.c b/src/objects/ring-shooter.c index c71613716..95d7f92b4 100644 --- a/src/objects/ring-shooter.c +++ b/src/objects/ring-shooter.c @@ -428,6 +428,8 @@ void Obj_PlayerUsedRingShooter(mobj_t *base, player_t *player) { player->airtime += rs_base_karted(base); } + + player->respawn.fromRingShooter = true; K_DoIngameRespawn(player); // Now other players can run into it! @@ -676,6 +678,11 @@ void Obj_RingShooterInput(player_t *player) { player->mo->momx = player->mo->momy = 0; P_SetPlayerAngle(player, base->angle); + P_MoveOrigin( + player->mo, + base->x, base->y, + base->z // TODO: reverse gravity + ); if (base->fuse < RS_FUSE_BLINK) {