From 08c19cd2a41c9cfd21a128e73a2495476ce41e55 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 22 Aug 2022 18:23:36 +0200 Subject: [PATCH] - floatified CheckProximity position parameter --- source/games/blood/src/actor.cpp | 17 ++++++++--------- source/games/blood/src/aibeast.cpp | 12 +++++------- source/games/blood/src/aiunicult.cpp | 2 +- source/games/blood/src/bloodactor.h | 8 ++++++++ source/games/blood/src/gameutil.cpp | 22 ++++++++-------------- source/games/blood/src/gameutil.h | 2 +- source/games/blood/src/nnexts.cpp | 8 +++----- source/games/blood/src/weapon.cpp | 7 ++----- 8 files changed, 36 insertions(+), 42 deletions(-) diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index 94bd50df5..2e03e2339 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -2640,7 +2640,6 @@ int actFloorBounceVector(int* x, int* y, int* z, sectortype* pSector, int a5) void actRadiusDamage(DBloodActor* source, const DVector3& pos, sectortype* pSector, int nDist, int baseDmg, int distDmg, DAMAGE_TYPE dmgType, int flags, int burn) { - int x = pos.X * worldtoint, y = pos.Y * worldtoint, z = pos.Z * worldtoint; auto pOwner = source->GetOwner(); const bool newSectCheckMethod = !cl_bloodvanillaexplosions && pOwner && pOwner->IsDudeActor() && !VanillaMode(); // use new sector checking logic auto sectorMap = GetClosestSpriteSectors(pSector, pos.XY(), nDist, nullptr, newSectCheckMethod); @@ -2656,7 +2655,7 @@ void actRadiusDamage(DBloodActor* source, const DVector3& pos, sectortype* pSect { if (act2->spr.flags & 0x20) continue; if (!CheckSector(sectorMap, act2)) continue; - if (!CheckProximity(act2, x, y, z, pSector, nDist)) continue; + if (!CheckProximity(act2, pos, pSector, nDist)) continue; int dist = int((pos - act2->spr.pos).Length() * worldtoint); if (dist > nDist) continue; @@ -2678,7 +2677,7 @@ void actRadiusDamage(DBloodActor* source, const DVector3& pos, sectortype* pSect { if (act2->spr.flags & 0x20) continue; if (!CheckSector(sectorMap, act2)) continue; - if (!CheckProximity(act2, x, y, z, pSector, nDist)) continue; + if (!CheckProximity(act2, pos, pSector, nDist)) continue; if (act2->xspr.locked) continue; @@ -5598,7 +5597,7 @@ static void actCheckProximity() proxyDist = 512; } - if (CheckProximity(dudeactor, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), proxyDist)) + if (CheckProximity(dudeactor, actor->spr.pos, actor->sector(), proxyDist)) { switch (actor->spr.type) { @@ -5810,7 +5809,7 @@ static void actCheckExplosion() if (CheckSector(sectorMap, dudeactor)) { - if (actor->xspr.data1 && CheckProximity(dudeactor, x, y, z, pSector, radius)) + if (actor->xspr.data1 && CheckProximity(dudeactor, apos, pSector, radius)) { if (pExplodeInfo->dmg && actor->explosionhackflag) { @@ -5835,7 +5834,7 @@ static void actCheckExplosion() if (CheckSector(sectorMap, thingactor)) { - if (actor->xspr.data1 && CheckProximity(thingactor, x, y, z, pSector, radius) && thingactor->hasX()) + if (actor->xspr.data1 && CheckProximity(thingactor, apos, pSector, radius) && thingactor->hasX()) { if (!thingactor->xspr.locked) { @@ -5875,7 +5874,7 @@ static void actCheckExplosion() DBloodActor* physactor = gPhysSpritesList[i]; if (!physactor->insector() || (physactor->spr.flags & kHitagFree) != 0) continue; - if (!CheckSector(sectorMap, physactor) || !CheckProximity(physactor, x, y, z, pSector, radius)) continue; + if (!CheckSector(sectorMap, physactor) || !CheckProximity(physactor, apos, pSector, radius)) continue; else debrisConcuss(Owner, i, x, y, z, pExplodeInfo->dmgType); } } @@ -5889,7 +5888,7 @@ static void actCheckExplosion() DBloodActor* impactactor = gImpactSpritesList[i]; if (!impactactor->hasX() || !impactactor->insector() || (impactactor->spr.flags & kHitagFree) != 0) continue; - if (!CheckSector(sectorMap, impactactor) || !CheckProximity(impactactor, x, y, z, pSector, radius)) + if (!CheckSector(sectorMap, impactactor) || !CheckProximity(impactactor, apos, pSector, radius)) continue; trTriggerSprite(impactactor, kCmdSpriteImpact, Owner); @@ -6028,7 +6027,7 @@ static void actCheckDudes() if (actor2->IsPlayerActor() && (unsigned int)actor2->xspr.health > 0) { - if (CheckProximity(actor2, actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), 128)) + if (CheckProximity(actor2, actor->spr.pos, actor->sector(), 128)) trTriggerSprite(actor, kCmdSpriteProximity, actor2); } } diff --git a/source/games/blood/src/aibeast.cpp b/source/games/blood/src/aibeast.cpp index d72384af5..fe93ac1b5 100644 --- a/source/games/blood/src/aibeast.cpp +++ b/source/games/blood/src/aibeast.cpp @@ -82,9 +82,7 @@ void StompSeqCallback(int, DBloodActor* actor) { int angx = bcos(actor->int_ang()); int angy = bsin(actor->int_ang()); - int x = actor->int_pos().X; - int y = actor->int_pos().Y; - int z = actor->int_pos().Z; + auto pos = actor->spr.pos; const int vc = 400; auto pSector = actor->sector(); int v1c = 5 + 2 * gGameOptions.nDifficulty; @@ -106,11 +104,11 @@ void StompSeqCallback(int, DBloodActor* actor) continue; if (actor2->spr.flags & 32) continue; - if (CheckSector(sectorMap, actor2) && CheckProximity(actor2, x, y, z, pSector, vc << 4)) + if (CheckSector(sectorMap, actor2) && CheckProximity(actor2, pos, pSector, vc << 4)) { - int top, bottom; + double top, bottom; GetActorExtents(actor, &top, &bottom); - if (abs(bottom - pSector->int_floorz()) == 0) + if (abs(bottom - pSector->floorz) == 0) { double nDist2 = (actor->spr.pos.XY() - actor2->spr.pos.XY()).Length(); if (nDist2 <= vc) @@ -134,7 +132,7 @@ void StompSeqCallback(int, DBloodActor* actor) { if (actor2->spr.flags & 32) continue; - if (CheckSector(sectorMap, actor2) && CheckProximity(actor2, x, y, z, pSector, vc << 4)) + if (CheckSector(sectorMap, actor2) && CheckProximity(actor2, pos, pSector, vc << 4)) { if (actor2->xspr.locked) continue; diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index ab8aa5bd1..116c87529 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -726,7 +726,7 @@ static void unicultThinkChase(DBloodActor* actor) { int nType = curWeapon - kTrapExploder; const EXPLOSION* pExpl = &explodeInfo[nType]; - if (CheckProximity(actor, target->int_pos().X, target->int_pos().Y, target->int_pos().Z, target->sector(), pExpl->radius >> 1)) + if (CheckProximity(actor, target->spr.pos, target->sector(), pExpl->radius >> 1)) { actor->vel.X = actor->vel.Y = actor->vel.Z = 0; if (doExplosion(actor, nType) && actor->xspr.health > 0) diff --git a/source/games/blood/src/bloodactor.h b/source/games/blood/src/bloodactor.h index ad547b546..1a4f4cc9c 100644 --- a/source/games/blood/src/bloodactor.h +++ b/source/games/blood/src/bloodactor.h @@ -154,6 +154,14 @@ inline void GetActorExtents(DBloodActor* actor, int* top, int* bottom) GetSpriteExtents(&actor->spr, top, bottom); } +inline void GetActorExtents(DBloodActor* actor, double* top, double* bottom) +{ + int t, b; + GetSpriteExtents(&actor->spr, &t, &b); + *top = t * zinttoworld; + *bottom = b * zinttoworld; +} + inline bool CheckSector(const BitArray& bits, DBloodActor* act) { return bits[act->sectno()]; diff --git a/source/games/blood/src/gameutil.cpp b/source/games/blood/src/gameutil.cpp index 728490579..c8656b2c3 100644 --- a/source/games/blood/src/gameutil.cpp +++ b/source/games/blood/src/gameutil.cpp @@ -120,27 +120,21 @@ bool FindSector(int nX, int nY, sectortype** pSector) // //--------------------------------------------------------------------------- -bool CheckProximity(DBloodActor* actor, int nX, int nY, int nZ, sectortype* pSector, int nDist) +bool CheckProximity(DBloodActor* actor, const DVector3& pos, sectortype* pSector, int nDist) { assert(actor != nullptr); - int oX = abs(nX - actor->int_pos().X) >> 4; - if (oX >= nDist) return 0; + auto vec = pos - actor->spr.pos; + if (abs(vec.Z) >= nDist) return false; - int oY = abs(nY - actor->int_pos().Y) >> 4; - if (oY >= nDist) return 0; + if (vec.LengthSquared() >= nDist * nDist) return false; - int oZ = abs(nZ - actor->int_pos().Z) >> 8; - if (oZ >= nDist) return 0; - - if (approxDist(oX, oY) >= nDist) return 0; - - int bottom, top; + double bottom, top; GetActorExtents(actor, &top, &bottom); - if (cansee(actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector(), nX, nY, nZ, pSector)) + if (cansee(actor->spr.pos, actor->sector(), pos, pSector)) return 1; - if (cansee(actor->int_pos().X, actor->int_pos().Y, bottom, actor->sector(), nX, nY, nZ, pSector)) + if (cansee(DVector3(actor->spr.pos.XY(), bottom), actor->sector(), pos, pSector)) return 1; - if (cansee(actor->int_pos().X, actor->int_pos().Y, top, actor->sector(), nX, nY, nZ, pSector)) + if (cansee(DVector3(actor->spr.pos.XY(), top), actor->sector(), pos, pSector)) return 1; return 0; } diff --git a/source/games/blood/src/gameutil.h b/source/games/blood/src/gameutil.h index 82d41f9b5..90a8e1830 100644 --- a/source/games/blood/src/gameutil.h +++ b/source/games/blood/src/gameutil.h @@ -35,7 +35,7 @@ enum { bool FindSector(int nX, int nY, int nZ, sectortype** ppSector); bool FindSector(int nX, int nY, sectortype** ppSector); -bool CheckProximity(DBloodActor* pSprite, int nX, int nY, int nZ, sectortype* pSector, int nDist); +bool CheckProximity(DBloodActor* pSprite, const DVector3& pos, sectortype* pSector, int nDist); bool CheckProximityPoint(int nX1, int nY1, int nZ1, int nX2, int nY2, int nZ2, int nDist); bool CheckProximityWall(walltype* pWall, int x, int y, int nDist); int GetWallAngle(walltype* pWall); diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index f4fa4f016..7349fcd0a 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -1180,9 +1180,7 @@ void nnExtProcessSuperSprites() || pProx->xspr.isTriggered) continue; // don't process locked or triggered sprites int okDist = (pProx->IsDudeActor()) ? 96 : ClipLow(pProx->spr.clipdist * 3, 32); - int x = pProx->int_pos().X; - int y = pProx->int_pos().Y; - int z = pProx->int_pos().Z; + auto pos = pProx->spr.pos; auto pSect = pProx->sector(); if (!pProx->xspr.DudeLockout) @@ -1191,7 +1189,7 @@ void nnExtProcessSuperSprites() while (auto affected = itr.Next()) { if (!affected->hasX() || affected->xspr.health <= 0) continue; - else if (CheckProximity(affected, x, y, z, pSect, okDist)) + else if (CheckProximity(affected, pos, pSect, okDist)) { trTriggerSprite(pProx, kCmdSpriteProximity, affected); break; @@ -1206,7 +1204,7 @@ void nnExtProcessSuperSprites() if (!pPlayer || !pPlayer->actor->hasX() || pPlayer->actor->xspr.health <= 0) continue; - if (pPlayer->actor->xspr.health > 0 && CheckProximity(gPlayer->actor, x, y, z, pSect, okDist)) + if (pPlayer->actor->xspr.health > 0 && CheckProximity(gPlayer->actor, pos, pSect, okDist)) { trTriggerSprite(pProx, kCmdSpriteProximity, pPlayer->actor); } diff --git a/source/games/blood/src/weapon.cpp b/source/games/blood/src/weapon.cpp index 1bf31bd5a..934569a74 100644 --- a/source/games/blood/src/weapon.cpp +++ b/source/games/blood/src/weapon.cpp @@ -2993,9 +2993,6 @@ void WeaponProcess(PLAYER* pPlayer) { void teslaHit(DBloodActor* missileactor, int a2) { auto mpos = missileactor->spr.pos; - int x = missileactor->int_pos().X; - int y = missileactor->int_pos().Y; - int z = missileactor->int_pos().Z; int nDist = 300; auto pSector = missileactor->sector(); auto owneractor = missileactor->GetOwner(); @@ -3013,7 +3010,7 @@ void teslaHit(DBloodActor* missileactor, int a2) { if (hitactor->spr.flags & 32) continue; - if (CheckSector(sectorMap, hitactor) && CheckProximity(hitactor, x, y, z, pSector, nDist)) + if (CheckSector(sectorMap, hitactor) && CheckProximity(hitactor, mpos, pSector, nDist)) { int dx = missileactor->int_pos().X - hitactor->int_pos().X; int dy = missileactor->int_pos().Y - hitactor->int_pos().Y; @@ -3029,7 +3026,7 @@ void teslaHit(DBloodActor* missileactor, int a2) { if (hitactor->spr.flags & 32) continue; - if (CheckSector(sectorMap, hitactor) && CheckProximity(hitactor, x, y, z, pSector, nDist)) + if (CheckSector(sectorMap, hitactor) && CheckProximity(hitactor, mpos, pSector, nDist)) { if (!hitactor->xspr.locked) {