Разведка М3 (ядро): тайные операции -- группа до 10 пехоты/лучников, до 2 операций, проверки обнаружения, прерывание и возврат

- Разведка: CheckCovertGroup, StartCovert, CheckCovertUntil (15/25/35%, при входе и каждые 5 реальных минут, максимум при пересечении, 5-75%, детерминированно по одной сетке), EndCovert; сохранение covert=
- Армия: AvailableUnits, TakeUnitsForMarch -- поход точного состава
- Мир: AbortMission -- домой от места обнаружения, без отчёта; охраняемые области и позиция армии через IWorldMap
- Карта: «Тайно» в окне атаки и окне чужой армии, окно «РАЗВЕДЧИКОВ ЗАМЕТИЛИ»
- «Шпион» -- переключатель IntelligenceConfig (ТЕСТ); 5 тестов

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Alexander
2026-11-06 17:15:22 +01:00
co-authored by Claude Opus 5.5
parent 56a5a82a8c
commit 2835c514d8
18 changed files with 622 additions and 14 deletions
@@ -31,10 +31,22 @@ public sealed class IntelligenceRules
public int ResourceEstimatePercent = 15; // уровень III: ресурсы -- оценочный диапазон ±15%
public int MaxReports = 30; // храним последние отчёты
// М3, тайные операции (ТЗ разведки, разделы 7-8). Числа ТЕСТ
public bool CovertEnabled = false; // технология «Шпион»: без неё тайного режима нет
public int CovertMaxSoldiers = 10; // обычная группа: до 10 пехотинцев / лучников (с героем-шпионом 20 -- позже)
public int CovertMaxOps = 2; // одновременно тайных операций на игрока
public int DetectSettlementPercent = 15; // шанс за проверку: поселение
public int DetectTowerPercent = 25; // зона сторожевой башни
public int DetectCircleCastlePercent = 35; // замок Круга
public int DetectHeroSpyMinus = 10; // герой со способностью «Шпион» (позже)
public int DetectMinPercent = 5, DetectMaxPercent = 75; // итоговый шанс -- в этих пределах
public long DetectIntervalMs = 5 * 60_000; // проверка при входе в зону и дальше каждые 5 РЕАЛЬНЫХ минут
public int TowerRadius = 3000; // радиус охраны башни (поселение и замок -- SettlementRadius)
public static IntelligenceRules Default => new IntelligenceRules();
}
public sealed class IntelligenceService : IIntelligence, ISaveParticipant
public sealed partial class IntelligenceService : IIntelligence, ISaveParticipant
{
// Что игрок знает о чужой армии. Номер наблюдения -- для устойчивых событий и воспроизводимых бросков
class Contact
@@ -387,6 +399,7 @@ public sealed class IntelligenceService : IIntelligence, ISaveParticipant
Csv(r.Units), r.Fortified ? "1" : "0", r.HasHero ? "1" : "0", Clean(r.Modifiers),
string.Join(",", r.ResourceNames ?? Array.Empty<string>()), Csv(r.ResourceMin), Csv(r.ResourceMax)
})).Append('\n');
CaptureCovert(sb);
return sb.ToString();
}
@@ -402,6 +415,7 @@ public sealed class IntelligenceService : IIntelligence, ISaveParticipant
else if (line.StartsWith("grid=")) RestoreGrid(line.Substring(5));
else if (line.StartsWith("contact=")) RestoreContact(line.Substring(8).Split('|'));
else if (line.StartsWith("report=")) RestoreReport(line.Substring(7).Split('|'));
else if (line.StartsWith("covert=")) RestoreCovert(line.Substring(7).Split('|'));
}
viewDirty = true;
}
@@ -410,6 +424,7 @@ public sealed class IntelligenceService : IIntelligence, ISaveParticipant
{
contacts.Clear();
reports.Clear();
covert.Clear();
explored = Array.Empty<bool>();
gridW = gridH = halfW = halfH = 0;
lastTickMs = 0;