Разведка М1: обратный путь открывает туман и после офлайна

Мир досчитывается по событиям (AdvanceInSteps), Разведка -- до каждого:
до расчёта боя войско считалось стоящим у цели всё время возвращения.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Alexander
2026-10-31 17:19:39 +01:00
co-authored by Claude Opus 5.5
parent d5747f845d
commit 54036eafcf
4 changed files with 91 additions and 5 deletions
@@ -1499,4 +1499,59 @@ public class ModuleTests
}
Assert.Greater(spotted, 0, "за сутки хотя бы один патруль прошёл рядом с поселением");
}
[Test]
public void Intelligence_OwnMarchExploresWholePath()
{
long t0 = 1_000_000_000_000;
var world = PatrolWorld(false);
var intel = Intel(new WorldAsMap { World = world });
MapNode home = world.GetNode(WorldMapLayout.PlayerCityId);
MapNode far = null;
foreach (var n in world.Nodes)
if (n.type == MapNodeType.NeighborCity && (far == null || WorldMapLayout.Distance(home, n) > WorldMapLayout.Distance(home, far))) far = n;
MarchData m = world.StartMarch(LocalPlayer.Id, home.id, far.id, 17, t0, out _);
world.AssignUnits(m, new[] { 17, 0, 0, 0 });
var events = new List<WorldEvent>();
for (long t = t0; t <= m.arriveMs + 60_000; t += 1000)
{
intel.ObserveUntil(t);
world.Advance(t, events);
}
for (int i = 0; i <= 20; i++)
{
int x = home.x + (far.x - home.x) * i / 20, y = home.y + (far.y - home.y) * i / 20;
Assert.AreNotEqual(MapVisibility.Unexplored, intel.GetVisibility(x, y), $"точка пути {i}/20 ({x},{y})");
}
}
[Test]
public void Intelligence_OfflineMarch_ExploresPathThereAndBack()
{
long t0 = 1_000_000_000_000;
var world = PatrolWorld(false);
var intel = Intel(new WorldAsMap { World = world });
MapNode home = world.GetNode(WorldMapLayout.PlayerCityId);
MapNode far = null;
foreach (var n in world.Nodes)
if (n.type == MapNodeType.NeighborCity && (far == null || WorldMapLayout.Distance(home, n) > WorldMapLayout.Distance(home, far))) far = n;
intel.ObserveUntil(t0);
MarchData m = world.StartMarch(LocalPlayer.Id, home.id, far.id, 200, t0, out _);
world.AssignUnits(m, new[] { 200, 0, 0, 0 });
long back = m.arriveMs + (m.arriveMs - t0);
// Игра закрыта до половины обратного пути: войско дошло, бой, идёт домой
var events = new List<WorldEvent>();
long now = m.arriveMs + (back - m.arriveMs) / 2;
world.AdvanceInSteps(now, events, t => intel.ObserveUntil(t));
Assert.AreEqual(1, events.Count, "бой посчитан");
Assert.IsTrue(m.survivors > 0);
Assert.IsTrue(world.TryGetPositionAt(m, now, out int x, out _, out _, out _, out _));
Assert.AreNotEqual(far.x, x, "войско в пути домой, а не у цели");
for (int i = 0; i <= 20; i++)
{
int px = home.x + (far.x - home.x) * i / 20, py = home.y + (far.y - home.y) * i / 20;
Assert.AreNotEqual(MapVisibility.Unexplored, intel.GetVisibility(px, py), $"точка пути {i}/20");
}
}
}