Поход «Разведка» (решения 31.10, п. 2): до цели и обратно без боя, сбора и потерь, обычный слот

IWorld.TryStartScout, MarchData.scout, WorldEventType.ScoutArrived; кнопка «Разведка» в окне атаки;
разведка не разбивает лагерь и не занимает точку.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Alexander
2026-11-01 13:11:55 +01:00
co-authored by Claude Opus 5.5
parent 24268f3cfb
commit 33db41002e
14 changed files with 208 additions and 17 deletions
@@ -1631,4 +1631,63 @@ public class ModuleTests
Assert.AreEqual(2, events.Count, "два боя -- каждое войско с целью, а не друг с другом");
Assert.AreEqual(solo.survivors, mine.survivors, "первым дошёл -- бьётся с лагерем так же, как в одиночку");
}
// Решения 31.10, п. 2: поход «Разведка» -- до цели и обратно, без боя, сбора и потерь, физически, по времени
[Test]
public void World_ScoutMarch_NoBattle_ReturnsWholeArmy()
{
long t0 = 1_000_000_000_000;
var world = new WorldSimulation(WorldMapLayout.CreateDefault(), new BattleSystem());
MapNode home = world.GetNode(WorldMapLayout.PlayerCityId);
MapNode boss = world.GetNode(WorldMapLayout.BossCastleId);
MarchData m = world.StartMarch(LocalPlayer.Id, home.id, boss.id, 1, t0, out string error, scout: true);
Assert.IsNotNull(m, error);
world.AssignUnits(m, new[] { 0, 0, 1, 0 });
Assert.IsTrue(m.scout);
Assert.IsFalse(m.gather);
var events = new List<WorldEvent>();
world.Advance(m.arriveMs, events);
Assert.AreEqual(1, events.Count);
Assert.AreEqual(WorldEventType.ScoutArrived, events[0].Type, "не бой");
Assert.AreEqual(1, m.survivors, "один кавалерист против замка -- и жив: боя нет");
Assert.AreEqual(0, m.defenderLosses);
Assert.AreEqual(0, m.loot.Count, "без добычи");
Assert.AreEqual(m.arriveMs + world.TravelTimeMs(boss, home, m.units), m.returnMs, "назад -- пешком, по времени");
Assert.IsTrue(world.TryGetPositionAt(m, (m.arriveMs + m.returnMs) / 2, out _, out _, out _, out _, out _), "на обратном пути -- на карте");
events.Clear();
world.Advance(m.returnMs, events);
Assert.AreEqual(WorldEventType.MarchReturned, events[0].Type);
Assert.AreEqual(new[] { 0, 0, 1, 0 }[2], m.survivorUnits[2], "состав не изменился");
Assert.AreEqual(0, world.Marches.Count);
}
[Test]
public void World_ScoutMarch_ClearedCampAndBusyPoint_DoNotBlock_AndDoNotClear()
{
long t0 = 1_000_000_000_000;
var world = new WorldSimulation(WorldMapLayout.CreateDefault(), new BattleSystem(BattleRules.NoRandom));
world.Advance(t0, new List<WorldEvent>());
// Разведка лагеря не разбивает его
MarchData scoutCamp = world.StartMarch(LocalPlayer.Id, WorldMapLayout.PlayerCityId, "camp_4", 500, t0, out _, scout: true);
world.Advance(scoutCamp.arriveMs, new List<WorldEvent>());
Assert.IsFalse(world.IsCampCleared("camp_4", scoutCamp.arriveMs));
// Точка: разведка не занимает её и не мешает сбору; к занятой точке разведку отправить можно
ResourcePoint wood = FirstPoint(world, 0);
long t1 = scoutCamp.arriveMs;
MarchData look = world.StartMarch(LocalPlayer.Id, WorldMapLayout.PlayerCityId, wood.id, 1, t1, out string e1, scout: true);
Assert.IsNotNull(look, e1);
Assert.IsTrue(world.CanGatherAt(wood.id, t1, out string e2), "разведка не занимает точку: " + e2);
MarchData gather = world.StartMarch(LocalPlayer.Id, WorldMapLayout.PlayerCityId, wood.id, 10, t1, out _);
Assert.IsNotNull(gather);
Assert.IsNotNull(world.StartMarch(LocalPlayer.Id, WorldMapLayout.PlayerCityId, wood.id, 1, t1, out _, scout: true), "к занятой точке -- можно");
var events = new List<WorldEvent>();
world.Advance(look.arriveMs, events);
Assert.AreEqual(wood.stock, wood.stockMax, "разведка ничего не собрала");
Assert.IsTrue(look.scout && look.loot.Count == 0);
}
}