From f80b228a837120384c44a9f0a6403f03e4e3f30d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 23 Aug 2022 22:32:14 +0200 Subject: [PATCH] - deal with int positions in approxdist calls --- source/games/blood/src/actor.cpp | 4 ++-- source/games/blood/src/ai.cpp | 2 +- source/games/blood/src/aiunicult.cpp | 15 ++++++++------- source/games/blood/src/gameutil.cpp | 8 ++++---- source/games/blood/src/nnexts.cpp | 24 ++++++++++++------------ source/games/blood/src/player.cpp | 2 +- source/games/blood/src/triggers.cpp | 4 ++-- source/games/blood/src/weapon.cpp | 4 ++-- 8 files changed, 32 insertions(+), 31 deletions(-) diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index 180a7a60b..ba9132e36 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -6701,7 +6701,7 @@ void actFireVector(DBloodActor* shooter, int a2, int a3, int a4, int a5, int a6, int z = gHitInfo.int_hitpos().Z - MulScale(a6, 256, 14); auto pSector = gHitInfo.hitSector; uint8_t nSurf = kSurfNone; - if (nRange == 0 || approxDist(gHitInfo.int_hitpos().X - shooter->int_pos().X, gHitInfo.int_hitpos().Y - shooter->int_pos().Y) < nRange) + if (nRange == 0 || approxDist(gHitInfo.hitpos.XY() - shooter->spr.pos.XY()) < nRange) { switch (hit) { @@ -6821,7 +6821,7 @@ void actFireVector(DBloodActor* shooter, int a2, int a3, int a4, int a5, int a6, a6 += Random3(4000); if (HitScan(actor, gHitInfo.int_hitpos().Z, a4, a5, a6, CLIPMASK1, tt) == 0) { - if (approxDist(gHitInfo.int_hitpos().X - actor->int_pos().X, gHitInfo.int_hitpos().Y - actor->int_pos().Y) <= tt) + if (approxDist(gHitInfo.hitpos.XY() - actor->spr.pos.XY()) <= tt) { auto pWall = gHitInfo.hitWall; auto pSector1 = gHitInfo.hitSector; diff --git a/source/games/blood/src/ai.cpp b/source/games/blood/src/ai.cpp index 6a381b72e..a3da0d5cd 100644 --- a/source/games/blood/src/ai.cpp +++ b/source/games/blood/src/ai.cpp @@ -135,7 +135,7 @@ bool CanMove(DBloodActor* actor, DBloodActor* target, int nAngle, int nRange) int y = actor->int_pos().Y; int z = actor->int_pos().Z; HitScan(actor, z, bcos(nAngle), bsin(nAngle), 0, CLIPMASK0, nRange); - int nDist = approxDist(x - gHitInfo.int_hitpos().X, y - gHitInfo.int_hitpos().Y); + int nDist = approxDist(actor->spr.pos.XY() - gHitInfo.hitpos.XY()); if (nDist - (actor->spr.clipdist << 2) < nRange) { if (gHitInfo.actor() == nullptr || target == nullptr || target != gHitInfo.actor()) diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index 85b58ddd0..d73282f43 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -751,7 +751,7 @@ static void unicultThinkChase(DBloodActor* actor) if (hit >= 0) { targetDist = dist - (target->spr.clipdist << 2); - objDist = approxDist(gHitInfo.int_hitpos().X - actor->int_pos().X, gHitInfo.int_hitpos().Y - actor->int_pos().Y); + objDist = approxDist(gHitInfo.hitpos.XY() - actor->spr.pos.XY()); } if (actor != gHitInfo.actor() && targetDist > objDist) @@ -940,8 +940,8 @@ static void unicultThinkChase(DBloodActor* actor) case kMissileFireballTchernobog: { // allow attack if dude is far from object, but target is close to it - int dudeDist = approxDist(gHitInfo.int_hitpos().X - actor->int_pos().X, gHitInfo.int_hitpos().Y - actor->int_pos().Y); - int targetDist1 = approxDist(gHitInfo.int_hitpos().X - target->int_pos().X, gHitInfo.int_hitpos().Y - target->int_pos().Y); + int dudeDist = approxDist(gHitInfo.hitpos.XY() - actor->spr.pos.XY()); + int targetDist1 = approxDist(gHitInfo.hitpos.XY() - target->spr.pos.XY()); if (dudeDist < mdist) { //viewSetSystemMessage("DUDE CLOSE TO OBJ: %d, MDIST: %d", dudeDist, mdist); @@ -1791,16 +1791,17 @@ void dudeLeechOperate(DBloodActor* actor, const EVENT& event) int nType = actTarget->spr.type - kDudeBase; DUDEINFO* pDudeInfo = &dudeInfo[nType]; int z1 = (top - actor->int_pos().Z) - 256; + auto atpos = actTarget->spr.pos; int x = actTarget->int_pos().X; int y = actTarget->int_pos().Y; int z = actTarget->int_pos().Z; - int nDist = approxDist(x - actor->int_pos().X, y - actor->int_pos().Y); + int nDist = approxDist(atpos.XY() - actor->spr.pos.XY()); if (nDist != 0 && cansee(actor->int_pos().X, actor->int_pos().Y, top, actor->sector(), x, y, z, actTarget->sector())) { int t = DivScale(nDist, 0x1aaaaa, 12); x += (actTarget->vel.X * t) >> 12; y += (actTarget->vel.Y * t) >> 12; - int angBak = actor->int_ang(); - actor->set_int_ang(getangle(x - actor->int_pos().X, y - actor->int_pos().Y)); + auto angBak = actor->spr.angle; + actor->spr.angle = VecToAngle(atpos - actor->spr.pos.XY()); int dx = bcos(actor->int_ang()); int dy = bsin(actor->int_ang()); int tz = actTarget->int_pos().Z - (actTarget->spr.yrepeat * pDudeInfo->aimHeight) * 4; @@ -1819,7 +1820,7 @@ void dudeLeechOperate(DBloodActor* actor, const EVENT& event) evPostActor(actor, t2, kCallbackLeechStateTimer); actor->xspr.data3 = ClipLow(actor->xspr.data3 - 1, 0); } - actor->set_int_ang(angBak); + actor->spr.angle = angBak; } } diff --git a/source/games/blood/src/gameutil.cpp b/source/games/blood/src/gameutil.cpp index 71fc4198e..e537bec82 100644 --- a/source/games/blood/src/gameutil.cpp +++ b/source/games/blood/src/gameutil.cpp @@ -373,7 +373,7 @@ int VectorScan(DBloodActor* actor, int nOffset, int nZOffset, int dx, int dy, in actor->spr.cstat = bakCstat; while (nNum--) { - if (nRange && approxDist(gHitInfo.int_hitpos().X - actor->int_pos().X, gHitInfo.int_hitpos().Y - actor->int_pos().Y) > nRange) + if (nRange && approxDist(gHitInfo.hitpos.XY() - actor->spr.pos.XY()) > nRange) return -1; auto other = gHitInfo.actor(); if (other != nullptr) @@ -456,12 +456,12 @@ int VectorScan(DBloodActor* actor, int nOffset, int nZOffset, int dx, int dy, in nOfs = (nOfs * pWall->yrepeat) / 8; nOfs += int((nSizY * pWall->ypan_) / 256); - int nLength = approxDist(pWall->wall_int_pos().X - pWall->point2Wall()->wall_int_pos().X, pWall->wall_int_pos().Y - pWall->point2Wall()->wall_int_pos().Y); + int nLength = approxDist(pWall->pos - pWall->point2Wall()->pos); int nHOffset; if (pWall->cstat & CSTAT_WALL_XFLIP) - nHOffset = approxDist(gHitInfo.int_hitpos().X - pWall->point2Wall()->wall_int_pos().X, gHitInfo.int_hitpos().Y - pWall->point2Wall()->wall_int_pos().Y); + nHOffset = approxDist(gHitInfo.hitpos.XY() - pWall->point2Wall()->pos); else - nHOffset = approxDist(gHitInfo.int_hitpos().X - pWall->wall_int_pos().X, gHitInfo.int_hitpos().Y - pWall->wall_int_pos().Y); + nHOffset = approxDist(gHitInfo.hitpos.XY() - pWall->pos); nHOffset = pWall->xpan() + ((nHOffset * pWall->xrepeat) << 3) / nLength; nHOffset %= nSizX; diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index 29deb1125..ff9432d8b 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -7694,7 +7694,7 @@ bool nnExtCanMove(DBloodActor* actor, DBloodActor* target, int nAngle, int nRang int x = actor->int_pos().X, y = actor->int_pos().Y, z = actor->int_pos().Z; auto pSector = actor->sector(); HitScan(actor, z, Cos(nAngle) >> 16, Sin(nAngle) >> 16, 0, CLIPMASK0, nRange); - int nDist = approxDist(x - gHitInfo.int_hitpos().X, y - gHitInfo.int_hitpos().Y); + int nDist = approxDist(actor->spr.pos.XY() - gHitInfo.hitpos.XY()); if (target != nullptr && nDist - (actor->spr.clipdist << 2) < nRange) return (target == gHitInfo.actor()); @@ -7982,7 +7982,7 @@ void aiPatrolSetMarker(DBloodActor* actor) { if (!nextactor->hasX()) continue; - if (nextactor->xspr.locked || nextactor->xspr.isTriggered || nextactor->xspr.DudeLockout || (dist = approxDist(nextactor->int_pos().X - actor->int_pos().X, nextactor->int_pos().Y - actor->int_pos().Y)) > closest) + if (nextactor->xspr.locked || nextactor->xspr.isTriggered || nextactor->xspr.DudeLockout || (dist = approxDist(nextactor->spr.pos.XY() - actor->spr.pos.XY())) > closest) continue; GetActorExtents(nextactor, &zt1, &zb1); @@ -8261,10 +8261,10 @@ void aiPatrolAlarmLite(DBloodActor* actor, DBloodActor* targetactor) continue; double eaz2 = (getDudeInfo(targetactor->spr.type)->eyeHeight * targetactor->spr.yrepeat) * REPEAT_SCALE; - int nDist = approxDist(dudeactor->int_pos().X - actor->int_pos().X, dudeactor->int_pos().Y - actor->int_pos().Y); + int nDist = approxDist(dudeactor->spr.pos.XY() - actor->spr.pos.XY()); if (nDist >= kPatrolAlarmSeeDist || !cansee(DVector3(actor->spr.pos, zt1), actor->sector(), dudeactor->spr.pos.plusZ(-eaz2), dudeactor->sector())) { - nDist = approxDist(dudeactor->int_pos().X - targetactor->int_pos().X, dudeactor->int_pos().Y - targetactor->int_pos().Y); + nDist = approxDist(dudeactor->spr.pos.XY() - targetactor->spr.pos.XY()); if (nDist >= kPatrolAlarmSeeDist || !cansee(DVector3(targetactor->spr.pos, zt2), targetactor->sector(), dudeactor->spr.pos.plusZ(-eaz2), dudeactor->sector())) continue; } @@ -8388,13 +8388,11 @@ bool readyForCrit(DBloodActor* hunter, DBloodActor* victim) if (!(hunter->spr.type >= kDudeBase && hunter->spr.type < kDudeMax) || !(victim->spr.type >= kDudeBase && victim->spr.type < kDudeMax)) return false; - int dx, dy; - dx = victim->int_pos().X - hunter->int_pos().X; - dy = victim->int_pos().Y - hunter->int_pos().Y; - if (approxDist(dx, dy) >= (7000 / ClipLow(gGameOptions.nDifficulty >> 1, 1))) + auto dvect = victim->spr.pos.XY() - hunter->spr.pos.XY(); + if (approxDist(dvect) >= (7000 / ClipLow(gGameOptions.nDifficulty >> 1, 1))) return false; - return (abs(((getangle(dx, dy) + 1024 - victim->int_ang()) & 2047) - 1024) <= kAng45); + return (abs(((getangle(dvect) + 1024 - victim->int_ang()) & 2047) - 1024) <= kAng45); } //--------------------------------------------------------------------------- @@ -8435,7 +8433,9 @@ DBloodActor* aiPatrolSearchTargets(DBloodActor* actor) newtarget = nullptr; seeChance = hearChance = 0x0000; - x = plActor->int_pos().X, y = plActor->int_pos().Y, z = plActor->int_pos().Z, dx = x - actor->int_pos().X, dy = y - actor->int_pos().Y; nDist = approxDist(dx, dy); + x = plActor->int_pos().X, y = plActor->int_pos().Y, z = plActor->int_pos().Z, + dx = x - actor->int_pos().X, dy = y - actor->int_pos().Y; + nDist = approxDist(dx, dy); seeDist = (stealth) ? pDudeInfo->seeDist / 3 : pDudeInfo->seeDist >> 1; hearDist = pDudeInfo->hearDist; feelDist = hearDist >> 1; @@ -8626,7 +8626,7 @@ DBloodActor* aiPatrolSearchTargets(DBloodActor* actor) if (steal->xspr.data1 > 0) { - if (approxDist(abs(steal->int_pos().X - plActor->int_pos().X) >> 4, abs(steal->int_pos().Y - plActor->int_pos().Y) >> 4) >= steal->xspr.data1) + if ((steal->spr.pos.XY() - plActor->spr.pos.XY()).Length() >= steal->xspr.data1) continue; } @@ -8641,7 +8641,7 @@ DBloodActor* aiPatrolSearchTargets(DBloodActor* actor) { if (steal->xspr.data1 > 0) { - if (approxDist(abs(steal->int_pos().X - actor->int_pos().X) >> 4, abs(steal->int_pos().Y - actor->int_pos().Y) >> 4) >= steal->xspr.data1) + if ((steal->spr.pos.XY() - plActor->spr.pos.XY()).Length() >= steal->xspr.data1) continue; } diff --git a/source/games/blood/src/player.cpp b/source/games/blood/src/player.cpp index 1db4edcf0..3ad566cb0 100644 --- a/source/games/blood/src/player.cpp +++ b/source/games/blood/src/player.cpp @@ -1423,7 +1423,7 @@ int ActionScan(PLAYER* pPlayer, HitInfo* out) int y = bsin(plActor->int_ang()); int z = pPlayer->slope; int hit = HitScan(pPlayer->actor, pPlayer->zView, x, y, z, 0x10000040, 128); - int hitDist = approxDist(plActor->int_pos().X - gHitInfo.int_hitpos().X, plActor->int_pos().Y - gHitInfo.int_hitpos().Y) >> 4; + int hitDist = (int)(plActor->spr.pos.XY() - gHitInfo.hitpos.XY()).Length(); if (hitDist < 64) { switch (hit) diff --git a/source/games/blood/src/triggers.cpp b/source/games/blood/src/triggers.cpp index f30cc1017..9c0e45fd0 100644 --- a/source/games/blood/src/triggers.cpp +++ b/source/games/blood/src/triggers.cpp @@ -276,7 +276,7 @@ void LifeLeechOperate(DBloodActor* actor, EVENT event) int t = DivScale(nDist, 0x1aaaaa, 12); x += (target->vel.X * t) >> 12; y += (target->vel.Y * t) >> 12; - int angBak = actor->int_ang(); + auto angBak = actor->spr.angle; actor->set_int_ang(getangle(x - actor->int_pos().X, y - actor->int_pos().Y)); int dx = bcos(actor->int_ang()); int dy = bsin(actor->int_ang()); @@ -298,7 +298,7 @@ void LifeLeechOperate(DBloodActor* actor, EVENT event) if (!VanillaMode()) // disable collisions so lifeleech doesn't do that weird bobbing missile->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL; } - actor->set_int_ang(angBak); + actor->spr.angle = angBak; } } } diff --git a/source/games/blood/src/weapon.cpp b/source/games/blood/src/weapon.cpp index 934569a74..1b5699505 100644 --- a/source/games/blood/src/weapon.cpp +++ b/source/games/blood/src/weapon.cpp @@ -1738,7 +1738,7 @@ void AltFireVoodoo(int nTrigger, PLAYER* pPlayer) if (!targetactor) continue; if (!gGameOptions.bFriendlyFire && IsTargetTeammate(pPlayer, targetactor)) continue; - int nDist = approxDist(targetactor->int_pos().X - pPlayer->actor->int_pos().X, targetactor->int_pos().Y - pPlayer->actor->int_pos().Y); + int nDist = approxDist(targetactor->spr.pos.XY() - pPlayer->actor->spr.pos.XY()); if (nDist > 0 && nDist < 51200) { int vc = pPlayer->ammoCount[9] >> 3; @@ -1776,7 +1776,7 @@ void AltFireVoodoo(int nTrigger, PLAYER* pPlayer) continue; if (v4 > 0) v4--; - int nDist = approxDist(targetactor->int_pos().X - pPlayer->actor->int_pos().X, targetactor->int_pos().Y - pPlayer->actor->int_pos().Y); + int nDist = approxDist(targetactor->spr.pos.XY() - pPlayer->actor->spr.pos.XY()); if (nDist > 0 && nDist < 51200) { int vc = pPlayer->ammoCount[9] >> 3;