Проверка одиночки ставила отряд в стену

Она сажала бойца в точку «+3 по X» от твари, не глядя на карту. Стоило
комнатам стать другими - точка попала в стену: боец не видел цель, клинок
её не брал, и проверка объявила первый этаж непроходимым, хотя мерила
собственную раскладку.

Теперь ищется свободная клетка с прямой видимостью - тем же способом, что
и в проверке триггеров, где эта же ошибка уже вылезала.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
z.kirill 2026-08-17 05:30:00 +03:00
parent da670af6dc
commit aa9a175751

View File

@ -2036,7 +2036,24 @@ int RunDescend(const RoomLibrary& rooms, const EntityCatalog& catalog, uint32_t
return n; return n;
}(); }();
game.PlaceSquad(game.targets[size_t(victim)].pos + Vec2{3.0f, 0.0f}, true); // Ставим отряд в СВОБОДНУЮ клетку рядом с тварью и с прямой
// видимостью. Слепое «+3 по X» попадало в стену, стоило
// комнатам измениться: боец не видел цель, клинок её не брал, и
// проверка объявляла непроходимым первый этаж — хотя мерила
// собственную раскладку.
const Vec2 foePos = game.targets[size_t(victim)].pos;
Vec2 spot = foePos + Vec2{3.0f, 0.0f};
const Vec2 around[8] = {{3, 0}, {-3, 0}, {0, 3}, {0, -3},
{2, 2}, {-2, 2}, {2, -2}, {-2, -2}};
for (const Vec2& d : around)
{
const Vec2 test = foePos + d;
if (game.map.IsWallAt(test)) continue;
if (game.map.RaycastBlocked(test, foePos)) continue;
spot = test;
break;
}
game.PlaceSquad(spot, true);
game.Step(FIXED_DT); // SyncLoadout: здоровье по надетому game.Step(FIXED_DT); // SyncLoadout: здоровье по надетому
game.squad.agents[0].hp = game.squad.agents[0].maxHp; game.squad.agents[0].hp = game.squad.agents[0].maxHp;
hpStart = game.squad.agents[0].hp; hpStart = game.squad.agents[0].hp;