From f06d4b4369ad08d4523bedf7c16d28dc2e5a7915 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 19 Nov 2022 22:37:16 +0000 Subject: [PATCH 1/3] Only return early for floordiff if under-water surface is SLOPED --- src/p_mobj.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index d5924de51..43e6139b1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3218,14 +3218,15 @@ boolean P_CanRunOnWater(mobj_t *mobj, ffloor_t *rover) // We start water run IF we can step onto it! if (surfDiff <= maxStep && surfDiff >= 0) { - if (ourZAng < 0) + pslope_t *groundSlope = (flip ? mobj->subsector->sector->c_slope : mobj->subsector->sector->f_slope); + if (groundSlope != NULL && groundSlope->zangle != 0) { fixed_t floorheight = flip ? P_GetSectorCeilingZAt(mobj->subsector->sector, mobj->x, mobj->y) : P_GetSectorFloorZAt(mobj->subsector->sector, mobj->x, mobj->y); fixed_t floorDiff = flip ? (floorheight - mobjbottom) : (mobjbottom - floorheight); if (floorDiff <= maxStep && floorDiff >= -maxStep) { - // ... but NOT if going down and real floor is in range. - // FIXME: Count solid FOFs in this check + // ... but NOT if downward-sloping real floor is in range. + // FIXME: Count solid FOFs in these checks return false; } } From f83b14e16e07f75503ae8eb56d42c5b35e01acb1 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 19 Nov 2022 22:39:14 +0000 Subject: [PATCH 2/3] Minimum speed of 40% for waterskii (resolves #327) Not 50% to catch spindashing better --- src/k_kart.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 40d1ff0a2..f435ae9e4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3445,6 +3445,8 @@ boolean K_WaterRun(mobj_t *mobj) case MT_PLAYER: { + fixed_t minspeed = 0; + if (mobj->player == NULL) { return false; @@ -3455,11 +3457,18 @@ boolean K_WaterRun(mobj_t *mobj) return K_IsHoldingDownTop(mobj->player) == false; } + minspeed = 2 * K_GetKartSpeed(mobj->player, false, false); // 200% + + if (mobj->player->speed < minspeed / 5) // 40% + { + return false; + } + if (mobj->player->invincibilitytimer || mobj->player->sneakertimer || mobj->player->tiregrease || mobj->player->flamedash - || mobj->player->speed > 2 * K_GetKartSpeed(mobj->player, false, false)) + || mobj->player->speed > minspeed) { return true; } From 2e0365e399effba8cd24e6433a1f4fec9e1aca8e Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 19 Nov 2022 22:41:30 +0000 Subject: [PATCH 3/3] Attenuate fastfall bounce underwater (resolves #329) Probably not worth a branch all by itself, and this branch is already pretty wet --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index f435ae9e4..6bb2be28e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10371,6 +10371,9 @@ boolean K_FastFallBounce(player_t *player) } } + if (player->mo->eflags & MFE_UNDERWATER) + bounce = (117 * bounce) / 200; + S_StartSound(player->mo, sfx_ffbonc); player->mo->momz = bounce * P_MobjFlip(player->mo);