- deal with int positions in approxdist calls

This commit is contained in:
Christoph Oelckers 2022-08-23 22:32:14 +02:00
parent c53a2ac93a
commit f80b228a83
8 changed files with 32 additions and 31 deletions

View file

@ -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;

View file

@ -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())

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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)

View file

@ -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;
}
}
}

View file

@ -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;