From db8b8c245e1fd8b5f3730c35e26bfd69d4e23e54 Mon Sep 17 00:00:00 2001 From: ephphatha Date: Thu, 28 Oct 2021 14:06:03 +1100 Subject: [PATCH] Use FindClosestValidPosition for FindClosestMonster --- Source/missiles.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 9c45db866..8dccbae79 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -83,22 +83,18 @@ bool CheckBlock(Point from, Point to) Monster *FindClosest(Point source, int rad) { - if (rad > 19) - rad = 19; - - for (int i = 1; i < rad; i++) { - int k = CrawlNum[i]; - int ck = k + 2; - for (auto j = static_cast(CrawlTable[k]); j > 0; j--, ck += 2) { - Point target = source + Displacement { CrawlTable[ck - 1], CrawlTable[ck] }; - if (!InDungeonBounds(target)) - continue; + std::optional monsterPosition = FindClosestValidPosition( + [&source](Point target) { + // search for a monster with clear line of sight + return InDungeonBounds(target) && dMonster[target.x][target.y] > 0 && !CheckBlock(source, target); + }, + source, 1, rad); - int mid = dMonster[target.x][target.y]; - if (mid > 0 && !CheckBlock(source, target)) - return &Monsters[mid - 1]; - } + if (monsterPosition) { + int mid = dMonster[monsterPosition->x][monsterPosition->y]; + return &Monsters[mid - 1]; } + return nullptr; }