From a79d1fa9f7ca20071ad2d4f6c7c724e9e39e75a4 Mon Sep 17 00:00:00 2001 From: ephphatha Date: Thu, 28 Oct 2021 16:48:30 +1100 Subject: [PATCH] Separate search and effect logic for mana trap --- Source/missiles.cpp | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 82f2ba1de..a21bb3acd 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1523,27 +1523,22 @@ void AddStealPotions(Missile &missile, Point /*dst*/, Direction /*midir*/) void AddManaTrap(Missile &missile, Point /*dst*/, Direction /*midir*/) { - for (int i = 0; i < 3; i++) { - int k = CrawlNum[i]; - int ck = k + 2; - for (auto j = static_cast(CrawlTable[k]); j > 0; j--, ck += 2) { - Point target = missile.position.start + Displacement { CrawlTable[ck - 1], CrawlTable[ck] }; - if (!InDungeonBounds(target)) - continue; - - int8_t pid = dPlayer[target.x][target.y]; - if (pid == 0) - continue; + std::optional trappedPlayerPosition = FindClosestValidPosition( + [](Point target) { + return InDungeonBounds(target) && dPlayer[target.x][target.y] != 0; + }, + missile.position.start, 0, 2); - auto &player = Players[abs(pid) - 1]; + if (trappedPlayerPosition) { + auto &player = Players[abs(dPlayer[trappedPlayerPosition->x][trappedPlayerPosition->y]) - 1]; - player._pMana = 0; - player._pManaBase = player._pMana + player._pMaxManaBase - player._pMaxMana; - CalcPlrInv(player, false); - drawmanaflag = true; - PlaySfxLoc(TSFX_COW7, target); - } + player._pMana = 0; + player._pManaBase = player._pMana + player._pMaxManaBase - player._pMaxMana; + CalcPlrInv(player, false); + drawmanaflag = true; + PlaySfxLoc(TSFX_COW7, *trappedPlayerPosition); } + missile._miDelFlag = true; }