From a22300fe011e744eafd1f6339a20369b0c5bf63e Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Mon, 29 Aug 2022 10:22:06 +1000 Subject: [PATCH] - Blood: Replace some `set_int_ang()` usage. * A lot of this repeated code should be factored out into repeated blocks when all of this floatification is done. --- source/common/utility/vectors.h | 7 +++++ source/games/blood/src/ai.cpp | 20 ++++++------- source/games/blood/src/aibat.cpp | 36 +++++++++++------------ source/games/blood/src/aibeast.cpp | 32 ++++++++++---------- source/games/blood/src/aiboneel.cpp | 36 +++++++++++------------ source/games/blood/src/aicaleb.cpp | 24 +++++++-------- source/games/blood/src/aigarg.cpp | 44 ++++++++++++++-------------- source/games/blood/src/aighost.cpp | 44 ++++++++++++++-------------- source/games/blood/src/aigilbst.cpp | 24 +++++++-------- source/games/blood/src/aiunicult.cpp | 8 ++--- 10 files changed, 141 insertions(+), 134 deletions(-) diff --git a/source/common/utility/vectors.h b/source/common/utility/vectors.h index 48bc6cfc6..157aefb89 100644 --- a/source/common/utility/vectors.h +++ b/source/common/utility/vectors.h @@ -1414,6 +1414,12 @@ inline TAngle absangle(const TAngle &a1, const TAngle &a2) return fabs((a1 - a2).Normalized180()); } +template +inline TAngle clamp(const TAngle &angle, const TAngle &min, const TAngle &max) +{ + return TAngle::fromDeg(clamp(angle.Degrees(), min.Degrees(), max.Degrees())); +} + inline TAngle VecToAngle(double x, double y) { return TAngle::fromRad(g_atan2(y, x)); @@ -1636,6 +1642,7 @@ constexpr DAngle nullAngle = DAngle::fromDeg(0.); constexpr FAngle nullFAngle = FAngle::fromDeg(0.); constexpr DAngle DAngle45 = DAngle::fromDeg(45); +constexpr DAngle DAngle60 = DAngle::fromDeg(60); constexpr DAngle DAngle90 = DAngle::fromDeg(90); constexpr DAngle DAngle180 = DAngle::fromDeg(180); constexpr DAngle DAngle270 = DAngle::fromDeg(270); diff --git a/source/games/blood/src/ai.cpp b/source/games/blood/src/ai.cpp index a3da0d5cd..f7144cd0c 100644 --- a/source/games/blood/src/ai.cpp +++ b/source/games/blood/src/ai.cpp @@ -298,10 +298,10 @@ void aiMoveForward(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); - if (abs(nAng) > 341) + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); + if (abs(nAng) > DAngle60) return; actor->vel.X += MulScale(pDudeInfo->frontSpeed, Cos(actor->int_ang()), 30); actor->vel.Y += MulScale(pDudeInfo->frontSpeed, Sin(actor->int_ang()), 30); @@ -317,9 +317,9 @@ void aiMoveTurn(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); } //--------------------------------------------------------------------------- @@ -332,9 +332,9 @@ void aiMoveDodge(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); if (actor->xspr.dodgeDir) { int nCos = Cos(actor->int_ang()); diff --git a/source/games/blood/src/aibat.cpp b/source/games/blood/src/aibat.cpp index 9569f2906..089bd04ec 100644 --- a/source/games/blood/src/aibat.cpp +++ b/source/games/blood/src/aibat.cpp @@ -200,9 +200,9 @@ static void batMoveDodgeUp(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nCos = Cos(actor->int_ang()); int nSin = Sin(actor->int_ang()); int dx = actor->vel.X; @@ -223,9 +223,9 @@ static void batMoveDodgeDown(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); if (actor->xspr.dodgeDir == 0) return; int nCos = Cos(actor->int_ang()); @@ -307,11 +307,11 @@ static void batMoveForward(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; if (actor->GetTarget() == nullptr) actor->spr.angle += DAngle45; @@ -337,11 +337,11 @@ static void batMoveSwoop(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->xspr.goalAng = (actor->int_ang() + 512) & 2047; return; @@ -366,11 +366,11 @@ static void batMoveFly(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->spr.angle += DAngle90; return; diff --git a/source/games/blood/src/aibeast.cpp b/source/games/blood/src/aibeast.cpp index 5dff02595..945edac2e 100644 --- a/source/games/blood/src/aibeast.cpp +++ b/source/games/blood/src/aibeast.cpp @@ -393,10 +393,10 @@ static void beastMoveForward(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); - if (abs(nAng) > 341) + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); + if (abs(nAng) > DAngle60) return; auto dvec = actor->xspr.TargetPos.XY() - actor->spr.pos.XY(); int nDist = approxDist(dvec); @@ -410,11 +410,11 @@ static void sub_628A0(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; if (actor->GetTarget() == nullptr) actor->spr.angle += DAngle45; @@ -444,11 +444,11 @@ static void sub_62AE0(DBloodActor* actor) auto target = actor->GetTarget(); int z = actor->int_pos().Z + getDudeInfo(actor->spr.type)->eyeHeight; int z2 = target->int_pos().Z + getDudeInfo(target->spr.type)->eyeHeight; - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->xspr.goalAng = (actor->int_ang() + 512) & 2047; return; @@ -478,11 +478,11 @@ static void sub_62D7C(DBloodActor* actor) auto target = actor->GetTarget(); int z = actor->int_pos().Z + getDudeInfo(actor->spr.type)->eyeHeight; int z2 = target->int_pos().Z + getDudeInfo(target->spr.type)->eyeHeight; - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->spr.angle += DAngle90; return; diff --git a/source/games/blood/src/aiboneel.cpp b/source/games/blood/src/aiboneel.cpp index 3da096dde..76fdd57e7 100644 --- a/source/games/blood/src/aiboneel.cpp +++ b/source/games/blood/src/aiboneel.cpp @@ -215,9 +215,9 @@ static void eelMoveDodgeUp(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nCos = Cos(actor->int_ang()); int nSin = Sin(actor->int_ang()); int dx = actor->vel.X; @@ -238,9 +238,9 @@ static void eelMoveDodgeDown(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); if (actor->xspr.dodgeDir == 0) return; int nCos = Cos(actor->int_ang()); @@ -319,11 +319,11 @@ static void eelMoveForward(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = (pDudeInfo->frontSpeed - (((4 - gGameOptions.nDifficulty) << 26) / 120) / 120) << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; if (actor->GetTarget() == nullptr) actor->spr.angle += DAngle45; @@ -349,11 +349,11 @@ static void eelMoveSwoop(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = (pDudeInfo->frontSpeed - (((4 - gGameOptions.nDifficulty) << 26) / 120) / 120) << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; auto dvec = actor->xspr.TargetPos.XY() - actor->spr.pos.XY(); int nDist = approxDist(dvec); @@ -375,11 +375,11 @@ static void eelMoveAscend(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = (pDudeInfo->frontSpeed - (((4 - gGameOptions.nDifficulty) << 26) / 120) / 120) << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; auto dvec = actor->xspr.TargetPos.XY() - actor->spr.pos.XY(); int nDist = approxDist(dvec); diff --git a/source/games/blood/src/aicaleb.cpp b/source/games/blood/src/aicaleb.cpp index 033384862..0569c7496 100644 --- a/source/games/blood/src/aicaleb.cpp +++ b/source/games/blood/src/aicaleb.cpp @@ -278,11 +278,11 @@ static void sub_65D04(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; if (actor->GetTarget() == nullptr) actor->spr.angle += DAngle45; @@ -313,11 +313,11 @@ static void sub_65F44(DBloodActor* actor) auto target = actor->GetTarget(); int z = actor->int_pos().Z + getDudeInfo(actor->spr.type)->eyeHeight; int z2 = target->int_pos().Z + getDudeInfo(target->spr.type)->eyeHeight; - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->xspr.goalAng = (actor->int_ang() + 512) & 2047; return; @@ -348,11 +348,11 @@ static void sub_661E0(DBloodActor* actor) auto target = actor->GetTarget(); int z = actor->int_pos().Z + getDudeInfo(actor->spr.type)->eyeHeight; int z2 = target->int_pos().Z + getDudeInfo(target->spr.type)->eyeHeight; - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->spr.angle += DAngle90; return; diff --git a/source/games/blood/src/aigarg.cpp b/source/games/blood/src/aigarg.cpp index 4751acd58..65850b363 100644 --- a/source/games/blood/src/aigarg.cpp +++ b/source/games/blood/src/aigarg.cpp @@ -276,9 +276,9 @@ static void gargMoveDodgeUp(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nCos = Cos(actor->int_ang()); int nSin = Sin(actor->int_ang()); int dx = actor->vel.X; @@ -302,9 +302,9 @@ static void gargMoveDodgeDown(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); if (actor->xspr.dodgeDir == 0) return; int nCos = Cos(actor->int_ang()); @@ -520,11 +520,11 @@ static void gargMoveForward(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; if (actor->GetTarget() == nullptr) actor->spr.angle += DAngle45; @@ -553,11 +553,11 @@ static void gargMoveSlow(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->xspr.goalAng = (actor->int_ang() + 512) & 2047; return; @@ -593,11 +593,11 @@ static void gargMoveSwoop(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->xspr.goalAng = (actor->int_ang() + 512) & 2047; return; @@ -632,11 +632,11 @@ static void gargMoveFly(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->spr.angle += DAngle90; return; diff --git a/source/games/blood/src/aighost.cpp b/source/games/blood/src/aighost.cpp index 4f46022dc..f59de1453 100644 --- a/source/games/blood/src/aighost.cpp +++ b/source/games/blood/src/aighost.cpp @@ -255,9 +255,9 @@ static void ghostMoveDodgeUp(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nCos = Cos(actor->int_ang()); int nSin = Sin(actor->int_ang()); int dx = actor->vel.X; @@ -281,9 +281,9 @@ static void ghostMoveDodgeDown(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); if (actor->xspr.dodgeDir == 0) return; int nCos = Cos(actor->int_ang()); @@ -416,11 +416,11 @@ static void ghostMoveForward(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; if (actor->GetTarget() == nullptr) actor->spr.angle += DAngle45; @@ -449,11 +449,11 @@ static void ghostMoveSlow(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->xspr.goalAng = (actor->int_ang() + 512) & 2047; return; @@ -486,11 +486,11 @@ static void ghostMoveSwoop(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->xspr.goalAng = (actor->int_ang() + 512) & 2047; return; @@ -522,11 +522,11 @@ static void ghostMoveFly(DBloodActor* actor) return; } DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->spr.angle += DAngle90; return; diff --git a/source/games/blood/src/aigilbst.cpp b/source/games/blood/src/aigilbst.cpp index cccc5a295..a0c83011a 100644 --- a/source/games/blood/src/aigilbst.cpp +++ b/source/games/blood/src/aigilbst.cpp @@ -265,11 +265,11 @@ static void sub_6CB00(DBloodActor* actor) { assert(actor->spr.type >= kDudeBase && actor->spr.type < kDudeMax); DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type); - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = (pDudeInfo->frontSpeed - (((4 - gGameOptions.nDifficulty) << 27) / 120) / 120) << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; if (actor->GetTarget() == nullptr) actor->spr.angle += DAngle45; @@ -299,11 +299,11 @@ static void sub_6CD74(DBloodActor* actor) auto target = actor->GetTarget(); int z = actor->int_pos().Z + getDudeInfo(actor->spr.type)->eyeHeight; int z2 = target->int_pos().Z + getDudeInfo(target->spr.type)->eyeHeight; - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = (pDudeInfo->frontSpeed - (((4 - gGameOptions.nDifficulty) << 27) / 120) / 120) << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->xspr.goalAng = (actor->int_ang() + 512) & 2047; return; @@ -333,11 +333,11 @@ static void sub_6D03C(DBloodActor* actor) auto target = actor->GetTarget(); int z = actor->int_pos().Z + getDudeInfo(actor->spr.type)->eyeHeight; int z2 = target->int_pos().Z + getDudeInfo(target->spr.type)->eyeHeight; - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = (pDudeInfo->frontSpeed - (((4 - gGameOptions.nDifficulty) << 27) / 120) / 120) << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) { actor->spr.angle += DAngle90; return; diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index fad73cabe..67d6b2779 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -1114,11 +1114,11 @@ void aiGenDudeMoveForward(DBloodActor* actor) if (pExtra->canFly) { - int nAng = ((actor->xspr.goalAng + 1024 - actor->int_ang()) & 2047) - 1024; - int nTurnRange = (pDudeInfo->angSpeed << 2) >> 4; - actor->set_int_ang((actor->int_ang() + ClipRange(nAng, -nTurnRange, nTurnRange)) & 2047); + auto nAng = deltaangle(actor->spr.angle, DAngle::fromBuild(actor->xspr.goalAng)); + auto nTurnRange = DAngle::fromQ16(pDudeInfo->angSpeed << 3); + actor->spr.angle += clamp(nAng, -nTurnRange, nTurnRange); int nAccel = pDudeInfo->frontSpeed << 2; - if (abs(nAng) > 341) + if (abs(nAng) > DAngle60) return; if (actor->GetTarget() == nullptr) actor->spr.angle += DAngle45;