From aedb1c552656d0775879db4ac57ea9cbf841f9f5 Mon Sep 17 00:00:00 2001 From: ephphatha Date: Thu, 28 Oct 2021 16:41:31 +1100 Subject: [PATCH] Separate search and spawn logic for teleport --- Source/missiles.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 4cecdf2b0..82f2ba1de 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1929,23 +1929,20 @@ void AddMagmaball(Missile &missile, Point dst, Direction /*midir*/) void AddTeleport(Missile &missile, Point dst, Direction /*midir*/) { - for (int i = 0; i < 6; i++) { - int k = CrawlNum[i]; - int ck = k + 2; - for (auto j = static_cast(CrawlTable[k]); j > 0; j--, ck += 2) { - Point target = dst + Displacement { CrawlTable[ck - 1], CrawlTable[ck] }; - if (!PosOkPlayer(Players[missile._misource], target)) - continue; + std::optional teleportDestination = FindClosestValidPosition( + [&player = Players[missile._misource]](Point target) { + return PosOkPlayer(player, target); + }, + dst, 0, 5); - missile.position.tile = target; - missile.position.start = target; - UseMana(missile._misource, SPL_TELEPORT); - missile._mirange = 2; - return; - } + if (teleportDestination) { + missile.position.tile = *teleportDestination; + missile.position.start = *teleportDestination; + UseMana(missile._misource, SPL_TELEPORT); + missile._mirange = 2; + } else { + missile._miDelFlag = true; } - - missile._miDelFlag = true; } void AddLightball(Missile &missile, Point dst, Direction /*midir*/)