diff --git a/Source/missiles.cpp b/Source/missiles.cpp index b84d68ca3..14b6f18d5 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -693,23 +693,29 @@ void SetMissAnim(Missile &missile, int animtype) void AddRune(Missile &missile, Point dst, missile_id missileID) { if (LineClearMissile(missile.position.start, dst)) { - for (int i = 0; i < 10; 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 (!InDungeonBounds(target)) - continue; - - int dp = dPiece[target.x][target.y]; - if (nSolidTable[dp] || dObject[target.x][target.y] != 0 || TileContainsMissile(target)) - continue; + std::optional runePosition = FindClosestValidPosition( + [](Point target) { + if (!InDungeonBounds(target)) { + return false; + } + if (dObject[target.x][target.y] != 0) { + return false; + } + if (TileContainsMissile(target)) { + return false; + } + if (nSolidTable[dPiece[target.x][target.y]]) { + return false; + } + return true; + }, + dst, 0, 9); - missile.position.tile = target; - missile.var1 = missileID; - missile._mlid = AddLight(target, 8); - return; - } + if (runePosition) { + missile.position.tile = *runePosition; + missile.var1 = missileID; + missile._mlid = AddLight(missile.position.tile, 8); + return; } }