From c85a95ca037af6ec5e4ec94209c20cc1d2d6ee62 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 27 Sep 2022 09:39:04 +0200 Subject: [PATCH] - Blood: floatified cultThinkChase Welcome to spaghetti-land, this is one 400 line monstrosity. :( --- source/games/blood/src/aicult.cpp | 62 +++++++++++++++---------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/source/games/blood/src/aicult.cpp b/source/games/blood/src/aicult.cpp index a2a6846d6..e739ee9ba 100644 --- a/source/games/blood/src/aicult.cpp +++ b/source/games/blood/src/aicult.cpp @@ -230,9 +230,11 @@ static void cultThinkChase(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, VecToAngle(dx, dy)); + auto dvec = target->spr.pos - actor->spr.pos; + double nDist = dvec.XY().Length(); + DAngle nAngle = VecToAngle(dvec); + aiChooseDirection(actor, nAngle); + if (target->xspr.health == 0) { switch (actor->xspr.medium) @@ -265,24 +267,24 @@ static void cultThinkChase(DBloodActor* actor) } return; } - int nDist = approxDist(dx, dy); - if (nDist > 0 && nDist <= pDudeInfo->seeDist) + if (nDist > 0 && nDist <= pDudeInfo->SeeDist()) { - int nDeltaAngle = getincangle(actor->int_ang(), getangle(dx, dy)); + DAngle nDeltaAngle = absangle(actor->spr.angle, nAngle); double height = (pDudeInfo->eyeHeight * actor->spr.yrepeat) * REPEAT_SCALE; if (cansee(target->spr.pos, target->sector(), actor->spr.pos.plusZ(-height), actor->sector())) { - if (nDist < pDudeInfo->seeDist && abs(nDeltaAngle) <= pDudeInfo->periphery) + if (nDist < pDudeInfo->SeeDist() && nDeltaAngle <= pDudeInfo->Periphery()) { aiSetTarget(actor, actor->GetTarget()); - actor->dudeSlope = nDist == 0 ? 0 : DivScale(target->int_pos().Z - actor->int_pos().Z, nDist, 10); - switch (actor->spr.type) { + actor->dudeSlope = nDist == 0 ? 0 : (target->spr.pos.Z - actor->spr.pos.Z) / nDist * 16384; + switch (actor->spr.type) + { case kDudeCultistTommy: - if (nDist < 0x1e00 && nDist > 0xe00 && abs(nDeltaAngle) < 85 && !TargetNearExplosion(target->sector()) + if (nDist < 0x1e0 && nDist > 0xe0 && nDeltaAngle < DAngle15 && !TargetNearExplosion(target->sector()) && (target->spr.flags & 2) && gGameOptions.nDifficulty > 2 && target->IsPlayerActor() && gPlayer[target->spr.type - kDudePlayer1].isRunning && Chance(0x8000)) { - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: @@ -301,9 +303,9 @@ static void cultThinkChase(DBloodActor* actor) break; } } - else if (nDist < 0x4600 && abs(nDeltaAngle) < 28) + else if (nDist < 0x460 && nDeltaAngle < DAngle1 * 5) { - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: @@ -346,11 +348,11 @@ static void cultThinkChase(DBloodActor* actor) } break; case kDudeCultistShotgun: - if (nDist < 0x2c00 && nDist > 0x1400 && !TargetNearExplosion(target->sector()) + if (nDist < 0x2c0 && nDist > 0x140 && !TargetNearExplosion(target->sector()) && (target->spr.flags & 2) && gGameOptions.nDifficulty >= 2 && target->IsPlayerActor() && !gPlayer[target->spr.type - kDudePlayer1].isRunning && Chance(0x8000)) { - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: @@ -369,9 +371,9 @@ static void cultThinkChase(DBloodActor* actor) break; } } - else if (nDist < 0x3200 && abs(nDeltaAngle) < 28) + else if (nDist < 0x320 && nDeltaAngle < DAngle1 * 5) { - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: @@ -414,11 +416,11 @@ static void cultThinkChase(DBloodActor* actor) } break; case kDudeCultistTesla: - if (nDist < 0x1e00 && nDist > 0xe00 && !TargetNearExplosion(target->sector()) + if (nDist < 0x1e0 && nDist > 0xe0 && !TargetNearExplosion(target->sector()) && (target->spr.flags & 2) && gGameOptions.nDifficulty > 2 && target->IsPlayerActor() && gPlayer[target->spr.type - kDudePlayer1].isRunning && Chance(0x8000)) { - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: @@ -437,10 +439,10 @@ static void cultThinkChase(DBloodActor* actor) break; } } - else if (nDist < 0x3200 && abs(nDeltaAngle) < 28) + else if (nDist < 0x320 && nDeltaAngle < DAngle1 * 5) { AISTATE *pCultistTsProneFire = !cl_bloodvanillaenemies && !VanillaMode() ? &cultistTsProneFireFixed : &cultistTsProneFire; - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: @@ -483,10 +485,9 @@ static void cultThinkChase(DBloodActor* actor) } break; case kDudeCultistTNT: - if (nDist < 0x2c00 && nDist > 0x1400 && abs(nDeltaAngle) < 85 - && (target->spr.flags & 2) && target->IsPlayerActor()) + if (nDist < 0x2c0 && nDist > 0x140 && nDeltaAngle < DAngle15 && (target->spr.flags & 2) && target->IsPlayerActor()) { - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: @@ -504,10 +505,9 @@ static void cultThinkChase(DBloodActor* actor) break; } } - else if (nDist < 0x1400 && abs(nDeltaAngle) < 85 - && (target->spr.flags & 2) && target->IsPlayerActor()) + else if (nDist < 0x140 && nDeltaAngle < DAngle15 && (target->spr.flags & 2) && target->IsPlayerActor()) { - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: @@ -527,11 +527,11 @@ static void cultThinkChase(DBloodActor* actor) } break; case kDudeCultistBeast: - if (nDist < 0x1e00 && nDist > 0xe00 && !TargetNearExplosion(target->sector()) + if (nDist < 0x1e0 && nDist > 0xe0 && !TargetNearExplosion(target->sector()) && (target->spr.flags & 2) && gGameOptions.nDifficulty > 2 && target->IsPlayerActor() && gPlayer[target->spr.type - kDudePlayer1].isRunning && Chance(0x8000)) { - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: @@ -550,9 +550,9 @@ static void cultThinkChase(DBloodActor* actor) break; } } - else if (nDist < 0x3200 && abs(nDeltaAngle) < 28) + else if (nDist < 0x320 && abs(nDeltaAngle) < DAngle1 * 5) { - int hit = HitScan(actor, actor->spr.pos.Z, dx, dy, 0, CLIPMASK1, 0); + int hit = HitScan(actor, actor->spr.pos.Z, DVector3(dvec, 0), CLIPMASK1, 0); switch (hit) { case -1: