From bc794a222734cfabf2b1b16af3efcf939a112565 Mon Sep 17 00:00:00 2001 From: MascaraSnake Date: Tue, 8 Oct 2019 00:00:41 +0200 Subject: [PATCH] Players can jostle free from Pterabytes --- src/p_map.c | 1 + src/p_user.c | 30 ++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index ee91b42f8..d17b5190c 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -523,6 +523,7 @@ static void P_DoPterabyteCarry(player_t *player, mobj_t *ptera) player->mo->y = ptera->y; P_SetThingPosition(player->mo); ptera->movefactor = 3*TICRATE; + ptera->watertop = ptera->waterbottom = ptera->cusval = 0; } static void P_DoTailsCarry(player_t *sonic, player_t *tails) diff --git a/src/p_user.c b/src/p_user.c index 5bfb24df4..696bfc3b2 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4291,7 +4291,14 @@ void P_DoJump(player_t *player, boolean soundandstate) return; if (player->powers[pw_carry] == CR_PTERABYTE) + { + S_StartSound(player->mo, sfx_s3kd7s); + player->mo->tracer->cusval += 10; + player->mo->tracer->watertop = P_RandomRange(-player->mo->tracer->cusval, player->mo->tracer->cusval) << (FRACBITS - 1); + player->mo->tracer->waterbottom = P_RandomRange(-player->mo->tracer->cusval, player->mo->tracer->cusval) << (FRACBITS - 1); + player->mo->tracer->cvmem = P_RandomRange(-player->mo->tracer->cusval, player->mo->tracer->cusval) << (FRACBITS - 1); return; + } // Jump this high. if (player->powers[pw_carry] == CR_PLAYER) @@ -11968,14 +11975,33 @@ void P_PlayerAfterThink(player_t *player) if (!ptera->movefactor) goto dropoff; - P_TryMove(player->mo, ptera->x, ptera->y, true); + if (ptera->cusval >= 50) + { + player->powers[pw_carry] = CR_NONE; + P_SetTarget(&player->mo->tracer, NULL); + P_KillMobj(ptera, player->mo, player->mo, 0); + player->mo->momz = 9*FRACUNIT; + player->pflags |= PF_APPLYAUTOBRAKE|PF_JUMPED|PF_THOKKED; + P_SetMobjState(player->mo, S_PLAY_ROLL); + break; + } + + if (ptera->cusval) + ptera->cusval--; + + P_TryMove(player->mo, ptera->x + ptera->watertop, ptera->y + ptera->waterbottom, true); + player->mo->z += ptera->cvmem; player->mo->momx = ptera->momx; player->mo->momy = ptera->momy; player->mo->momz = ptera->momz; - if (P_AproxDistance(player->mo->x - ptera->x, player->mo->y - ptera->y) > player->mo->radius) + if (P_AproxDistance(player->mo->x - ptera->x - ptera->watertop, player->mo->y - ptera->y - ptera->waterbottom) > player->mo->radius) goto dropoff; + ptera->watertop >>= 1; + ptera->waterbottom >>= 1; + ptera->cvmem >>= 1; + if (player->mo->state-states != S_PLAY_FALL) P_SetPlayerMobjState(player->mo, S_PLAY_FALL); break;