From d52e7a652e61ff3b2412b876886061439ccc9e71 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 27 Oct 2019 09:03:35 -0400 Subject: [PATCH 1/2] Faster waterskipping --- src/p_map.c | 10 +++++++--- src/p_mobj.c | 25 ++++++++++--------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index d4f2a94fa..e9bc95712 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -2787,18 +2787,22 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff) if (!(thing->flags & MF_NOCLIP)) { //All things are affected by their scale. - fixed_t maxstep = FixedMul(MAXSTEPMOVE, mapobjectscale); + const fixed_t maxstepmove = FixedMul(MAXSTEPMOVE, mapobjectscale); + fixed_t maxstep = maxstepmove; if (thing->player) { + if (thing->player->kartstuff[k_waterskip]) + maxstep += maxstepmove; // Force some stepmove when waterskipping + // If using type Section1:13, double the maxstep. if (P_PlayerTouchingSectorSpecial(thing->player, 1, 13) || GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 13) - maxstep <<= 1; + maxstep += maxstepmove; // If using type Section1:12, no maxstep. For ledges you don't want the player to climb! (see: Egg Zeppelin & SMK port walls) else if (P_PlayerTouchingSectorSpecial(thing->player, 1, 12) || GETSECSPECIAL(R_PointInSubsector(x, y)->sector->special, 1) == 12) - maxstep = 0; + maxstep -= maxstepmove; // Don't 'step up' while springing, // Only step up "if needed". diff --git a/src/p_mobj.c b/src/p_mobj.c index f54eca41e..b220ff4e6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1268,6 +1268,8 @@ fixed_t P_GetMobjGravity(mobj_t *mo) P_PlayerFlip(mo); if (mo->player->kartstuff[k_pogospring]) gravityadd = (5*gravityadd)/2; + if (mo->player->kartstuff[k_waterskip]) + gravityadd = (4*gravityadd)/3; } else { @@ -3301,26 +3303,19 @@ void P_MobjCheckWater(mobj_t *mobj) // skipping stone! if (p && p->kartstuff[k_waterskip] < 2 && ((p->speed/3 > abs(mobj->momz)) // Going more forward than horizontal, so you can skip across the water. - || (p->speed > K_GetKartSpeed(p,false)/3 && p->kartstuff[k_waterskip])) // Already skipped once, so you can skip once more! + || (p->speed > 20*mapobjectscale && p->kartstuff[k_waterskip])) // Already skipped once, so you can skip once more! && ((!(mobj->eflags & MFE_VERTICALFLIP) && thingtop - mobj->momz > mobj->watertop) || ((mobj->eflags & MFE_VERTICALFLIP) && mobj->z - mobj->momz < mobj->waterbottom))) { - const fixed_t min = 6<momx = mobj->momx/2; - mobj->momy = mobj->momy/2; - mobj->momz = -mobj->momz/2; + mobj->momx = (4*mobj->momx)/5; + mobj->momy = (4*mobj->momy)/5; - if (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->momz < FixedMul(min, mobj->scale)) - mobj->momz = FixedMul(min, mobj->scale); - else if (mobj->eflags & MFE_VERTICALFLIP && mobj->momz > FixedMul(-min, mobj->scale)) - mobj->momz = FixedMul(-min, mobj->scale); - - /*if (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->momz > FixedMul(max, mobj->scale)) - mobj->momz = FixedMul(max, mobj->scale); - else if (mobj->eflags & MFE_VERTICALFLIP && mobj->momz < FixedMul(-max, mobj->scale)) - mobj->momz = FixedMul(-max, mobj->scale);*/ + if (mobj->eflags & MFE_VERTICALFLIP) + mobj->momz = FixedMul(-hop, mobj->scale); + else + mobj->momz = FixedMul(hop, mobj->scale); p->kartstuff[k_waterskip]++; } From b948f74b4f573dfc792961bb39151ca35f01e020 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 28 Oct 2019 00:04:30 -0700 Subject: [PATCH 2/2] Add overflow checks so we I_Error instead of death crash into oblivion You'd love to know how we even reached (size_t)-1. --- src/z_zone.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/z_zone.c b/src/z_zone.c index a3e13422f..2c0ddc295 100644 --- a/src/z_zone.c +++ b/src/z_zone.c @@ -210,7 +210,11 @@ void Z_Free(void *ptr) static void *xm(size_t size) { const size_t padedsize = size+sizeof (size_t); - void *p = malloc(padedsize); + void *p; + + if (padedsize < size)/* overflow check */ + I_Error("You are allocating memory too large!"); + p = malloc(padedsize); if (p == NULL) { @@ -254,6 +258,9 @@ void *Z_MallocAlign(size_t size, INT32 tag, void *user, INT32 alignbits) CONS_Debug(DBG_MEMORY, "Z_Malloc %s:%d\n", file, line); #endif + if (blocksize < size)/* overflow check */ + I_Error("You are allocating memory too large!"); + block = xm(sizeof *block); #ifdef HAVE_VALGRIND padsize += (1<