From 230913bad3ed48ee910ab05aa3a4eb871602c502 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 23 Aug 2022 22:30:40 +0200 Subject: [PATCH] - another large AI cleanup batch --- source/games/blood/src/aibeast.cpp | 12 +++++++----- source/games/blood/src/aiboneel.cpp | 22 ++++++++++++---------- source/games/blood/src/aiburn.cpp | 12 +++++++----- source/games/blood/src/aicaleb.cpp | 24 ++++++++++++++---------- source/games/blood/src/aicerber.cpp | 13 ++++++++----- source/games/blood/src/aigilbst.cpp | 11 ++++++----- source/games/blood/src/aihand.cpp | 10 +++++----- source/games/blood/src/aihound.cpp | 11 ++++++----- source/games/blood/src/aiinnoc.cpp | 11 ++++++----- source/games/blood/src/aipod.cpp | 10 +++++----- source/games/blood/src/airat.cpp | 11 ++++++----- source/games/blood/src/aispid.cpp | 11 ++++++----- source/games/blood/src/aitchern.cpp | 11 ++++++----- source/games/blood/src/aizomba.cpp | 23 +++++++++++++---------- source/games/blood/src/nnexts.cpp | 12 ++++-------- 15 files changed, 111 insertions(+), 93 deletions(-) diff --git a/source/games/blood/src/aibeast.cpp b/source/games/blood/src/aibeast.cpp index 0924ae0c4..673992dac 100644 --- a/source/games/blood/src/aibeast.cpp +++ b/source/games/blood/src/aibeast.cpp @@ -345,9 +345,11 @@ static void beastThinkSwimChase(DBloodActor* actor) if (!actor->ValidateTarget(__FUNCTION__)) return; auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &beastSwimSearch); @@ -358,10 +360,10 @@ static void beastThinkSwimChase(DBloodActor* actor) aiNewState(actor, &beastSwimSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; int top, bottom; GetActorExtents(actor, &top, &bottom); diff --git a/source/games/blood/src/aiboneel.cpp b/source/games/blood/src/aiboneel.cpp index b801e0df5..8fdd6ff8f 100644 --- a/source/games/blood/src/aiboneel.cpp +++ b/source/games/blood/src/aiboneel.cpp @@ -172,18 +172,19 @@ static void eelThinkPonder(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &eelSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; int height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) << 2; int height2 = (getDudeInfo(target->spr.type)->eyeHeight * target->spr.yrepeat) << 2; int top, bottom; @@ -273,9 +274,10 @@ static void eelThinkChase(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &eelSearch); @@ -286,10 +288,10 @@ static void eelThinkChase(DBloodActor* actor) aiNewState(actor, &eelSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; int top, bottom; GetActorExtents(actor, &top, &bottom); diff --git a/source/games/blood/src/aiburn.cpp b/source/games/blood/src/aiburn.cpp index 7eaed153a..e4d6f1039 100644 --- a/source/games/blood/src/aiburn.cpp +++ b/source/games/blood/src/aiburn.cpp @@ -156,9 +156,11 @@ static void burnThinkChase(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { switch (actor->spr.type) @@ -189,10 +191,10 @@ static void burnThinkChase(DBloodActor* actor) } return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { diff --git a/source/games/blood/src/aicaleb.cpp b/source/games/blood/src/aicaleb.cpp index 95c52083e..984cb8966 100644 --- a/source/games/blood/src/aicaleb.cpp +++ b/source/games/blood/src/aicaleb.cpp @@ -125,9 +125,10 @@ static void calebThinkChase(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { if (pXSector && pXSector->Underwater) @@ -147,10 +148,10 @@ static void calebThinkChase(DBloodActor* actor) aiNewState(actor, &tinycalebSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { @@ -160,6 +161,8 @@ static void calebThinkChase(DBloodActor* actor) actor->dudeSlope = nDist == 0 ? 0 : DivScale(target->int_pos().Z - actor->int_pos().Z, nDist, 10); if (nDist < 0x599 && abs(nDeltaAngle) < 28) { + int dx = dvec.X * worldtoint; + int dy = dvec.Y * worldtoint; int hit = HitScan(actor, actor->int_pos().Z, dx, dy, 0, CLIPMASK1, 0); switch (hit) { @@ -231,9 +234,10 @@ static void calebThinkSwimChase(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &tinycalebSwimSearch); @@ -244,10 +248,10 @@ static void calebThinkSwimChase(DBloodActor* actor) aiNewState(actor, &tinycalebSwimSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; int top, bottom; GetActorExtents(actor, &top, &bottom); diff --git a/source/games/blood/src/aicerber.cpp b/source/games/blood/src/aicerber.cpp index e50730f54..f23af0e09 100644 --- a/source/games/blood/src/aicerber.cpp +++ b/source/games/blood/src/aicerber.cpp @@ -341,9 +341,10 @@ static void cerberusThinkChase(DBloodActor* actor) if (!actor->ValidateTarget(__FUNCTION__)) return; auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { switch (actor->spr.type) { @@ -369,10 +370,10 @@ static void cerberusThinkChase(DBloodActor* actor) return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { @@ -402,6 +403,8 @@ static void cerberusThinkChase(DBloodActor* actor) } else if (nDist < 0x200 && abs(nDeltaAngle) < 85) { + int dx = dvec.X * worldtoint; + int dy = dvec.Y * worldtoint; int hit = HitScan(actor, actor->int_pos().Z, dx, dy, 0, CLIPMASK1, 0); switch (actor->spr.type) { case kDudeCerberusTwoHead: diff --git a/source/games/blood/src/aigilbst.cpp b/source/games/blood/src/aigilbst.cpp index 7010cd482..7a442ca17 100644 --- a/source/games/blood/src/aigilbst.cpp +++ b/source/games/blood/src/aigilbst.cpp @@ -218,9 +218,10 @@ static void gillThinkSwimChase(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); if (!actor->ValidateTarget(__FUNCTION__)) return; auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (actor->xspr.health == 0) { aiNewState(actor, &gillBeastSwimSearch); @@ -231,10 +232,10 @@ static void gillThinkSwimChase(DBloodActor* actor) aiNewState(actor, &gillBeastSwimSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; int top, bottom; GetActorExtents(actor, &top, &bottom); diff --git a/source/games/blood/src/aihand.cpp b/source/games/blood/src/aihand.cpp index ab870dd95..2b76828e9 100644 --- a/source/games/blood/src/aihand.cpp +++ b/source/games/blood/src/aihand.cpp @@ -87,9 +87,10 @@ static void handThinkChase(DBloodActor* actor) if (!actor->ValidateTarget(__FUNCTION__)) return; auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &handSearch); @@ -100,10 +101,9 @@ static void handThinkChase(DBloodActor* actor) aiNewState(actor, &handSearch); return; } - int nDist = approxDist(dx, dy); if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { diff --git a/source/games/blood/src/aihound.cpp b/source/games/blood/src/aihound.cpp index dd2c307b6..b8da523a8 100644 --- a/source/games/blood/src/aihound.cpp +++ b/source/games/blood/src/aihound.cpp @@ -104,9 +104,10 @@ static void houndThinkChase(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &houndSearch); @@ -117,10 +118,10 @@ static void houndThinkChase(DBloodActor* actor) aiNewState(actor, &houndSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { diff --git a/source/games/blood/src/aiinnoc.cpp b/source/games/blood/src/aiinnoc.cpp index 0fe22b2d5..e040b32e2 100644 --- a/source/games/blood/src/aiinnoc.cpp +++ b/source/games/blood/src/aiinnoc.cpp @@ -71,9 +71,10 @@ static void innocThinkChase(DBloodActor* actor) if (!actor->ValidateTarget(__FUNCTION__)) return; auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &innocentSearch); @@ -84,10 +85,10 @@ static void innocThinkChase(DBloodActor* actor) aiNewState(actor, &innocentSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { diff --git a/source/games/blood/src/aipod.cpp b/source/games/blood/src/aipod.cpp index cf2e09f2c..b24efe8f9 100644 --- a/source/games/blood/src/aipod.cpp +++ b/source/games/blood/src/aipod.cpp @@ -180,9 +180,10 @@ static void aiPodChase(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { switch (actor->spr.type) { @@ -197,10 +198,9 @@ static void aiPodChase(DBloodActor* actor) } return; } - int nDist = approxDist(dx, dy); if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { diff --git a/source/games/blood/src/airat.cpp b/source/games/blood/src/airat.cpp index 1837861b0..19fda5727 100644 --- a/source/games/blood/src/airat.cpp +++ b/source/games/blood/src/airat.cpp @@ -82,9 +82,10 @@ static void ratThinkChase(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &ratSearch); @@ -95,10 +96,10 @@ static void ratThinkChase(DBloodActor* actor) aiNewState(actor, &ratSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { diff --git a/source/games/blood/src/aispid.cpp b/source/games/blood/src/aispid.cpp index d5b5b402d..055dc2e94 100644 --- a/source/games/blood/src/aispid.cpp +++ b/source/games/blood/src/aispid.cpp @@ -190,9 +190,10 @@ static void spidThinkChase(DBloodActor* actor) DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &spidSearch); @@ -203,9 +204,9 @@ static void spidThinkChase(DBloodActor* actor) aiNewState(actor, &spidSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { diff --git a/source/games/blood/src/aitchern.cpp b/source/games/blood/src/aitchern.cpp index 91e1b7a1d..5ec4ca9f2 100644 --- a/source/games/blood/src/aitchern.cpp +++ b/source/games/blood/src/aitchern.cpp @@ -289,9 +289,10 @@ static void sub_72934(DBloodActor* actor) if (!actor->ValidateTarget(__FUNCTION__)) return; auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &tchernobogSearch); @@ -302,10 +303,10 @@ static void sub_72934(DBloodActor* actor) aiNewState(actor, &tchernobogSearch); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { diff --git a/source/games/blood/src/aizomba.cpp b/source/games/blood/src/aizomba.cpp index f519ba5bc..e8edf3995 100644 --- a/source/games/blood/src/aizomba.cpp +++ b/source/games/blood/src/aizomba.cpp @@ -112,9 +112,11 @@ static void zombaThinkChase(DBloodActor* actor) if (!actor->ValidateTarget(__FUNCTION__)) return; auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); + if (target->xspr.health == 0) { aiNewState(actor, &zombieASearch); @@ -129,10 +131,10 @@ static void zombaThinkChase(DBloodActor* actor) if (!VanillaMode() && actor->spr.type == kDudeZombieAxeBuried) actor->spr.type = kDudeZombieAxeNormal; - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { @@ -162,9 +164,10 @@ static void zombaThinkPonder(DBloodActor* actor) if (!actor->ValidateTarget(__FUNCTION__)) return; auto target = actor->GetTarget(); - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - aiChooseDirection(actor, getangle(dx, dy)); + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int nAngle = getangle(dvec); + int nDist = approxDist(dvec); + aiChooseDirection(actor, nAngle); if (target->xspr.health == 0) { aiNewState(actor, &zombieASearch); @@ -175,10 +178,10 @@ static void zombaThinkPonder(DBloodActor* actor) aiNewState(actor, &zombieAGoto); return; } - int nDist = approxDist(dx, dy); + if (nDist <= pDudeInfo->seeDist) { - int nDeltaAngle = ((getangle(dx, dy) + 1024 - actor->int_ang()) & 2047) - 1024; + int nDeltaAngle = ((nAngle + 1024 - actor->int_ang()) & 2047) - 1024; double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index a8db79160..29deb1125 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -5359,10 +5359,9 @@ bool aiFightIsMeleeUnit(DBloodActor* dude) int aiFightGetTargetDist(DBloodActor* actor, DUDEINFO* pDudeInfo, DBloodActor* target) { - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + int dist = approxDist(dvec); - int dist = approxDist(dx, dy); if (dist <= pDudeInfo->meleeDist) return 0; if (dist >= pDudeInfo->seeDist) return 13; if (dist <= pDudeInfo->seeDist / 12) return 1; @@ -5387,11 +5386,8 @@ int aiFightGetTargetDist(DBloodActor* actor, DUDEINFO* pDudeInfo, DBloodActor* t int aiFightGetFineTargetDist(DBloodActor* actor, DBloodActor* target) { - int dx = target->int_pos().X - actor->int_pos().X; - int dy = target->int_pos().Y - actor->int_pos().Y; - - int dist = approxDist(dx, dy); - return dist; + auto dvec = target->spr.pos.XY() - actor->spr.pos.XY(); + return approxDist(dvec); } //---------------------------------------------------------------------------