- Разведка: 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>
93 lines
5.7 KiB
C#
93 lines
5.7 KiB
C#
using UnityEngine;
|
|
|
|
// ТАБЛИЦА РАЗВЕДКИ, этап М1: радиусы обзора, последний контакт, примерная численность, опознание (ТЗ разведки 31.10).
|
|
// Числа -- ТЕСТ.
|
|
//
|
|
// Ассет: Assets/Resources/IntelligenceConfig.asset (выдели его в окне Project и меняй числа в Inspector;
|
|
// изменения действуют со следующего запуска игры). Создать заново: правый клик в Project ->
|
|
// Create -> Bogatyri -> Intelligence Config, имя файла -- IntelligenceConfig, папка -- Resources.
|
|
//
|
|
// Модуль таблицу не видит: App/GameModules передаёт числа в модуль Разведки.
|
|
// Патрули-заглушки соседей включаются в таблице MarchConfig (это походы Мира).
|
|
[CreateAssetMenu(fileName = "IntelligenceConfig", menuName = "Bogatyri/Intelligence Config")]
|
|
public class IntelligenceConfig : ScriptableObject
|
|
{
|
|
[Header("Радиус обзора, клеток карты")]
|
|
[Tooltip("Своё поселение. ТЗ разведки: 5")]
|
|
public float settlementRadius = 5f;
|
|
[Tooltip("Обычная армия в походе. ТЗ разведки: 1")]
|
|
public float armyRadius = 1f;
|
|
|
|
[Header("Технология «Обзор» (не складывается, уровень заменяет)")]
|
|
[Tooltip("Прибавка к радиусам на уровнях I, II, III, %. ТЗ: 10 / 20 / 30")]
|
|
public int[] observationPercent = { 10, 20, 30 };
|
|
[Tooltip("ТОЛЬКО ДЛЯ ТЕСТА: уровень «Обзора» 0..3, пока нет дерева технологий")]
|
|
public int testObservationLevel = 0;
|
|
|
|
[Header("Чужие армии")]
|
|
[Tooltip("Метка последнего контакта живёт, РЕАЛЬНЫХ минут. ТЗ: 10")]
|
|
public float lastContactMinutes = 10f;
|
|
[Tooltip("Примерная численность: ±%. ТЗ: 20")]
|
|
public int approxPercent = 20;
|
|
[Tooltip("Шанс опознать владельца за одно событие наблюдения, %. ТЗ: 50")]
|
|
public int identifyPercent = 50;
|
|
[Tooltip("Шаг расчёта наблюдения за время, пока игра была закрыта, РЕАЛЬНЫХ секунд")]
|
|
public float sampleStepSeconds = 10f;
|
|
|
|
[Header("Туман на карте")]
|
|
[Tooltip("Выключено (по умолчанию): города, лагеря и точки видны всегда, туман только затемняет землю. " +
|
|
"Включено: неисследованная местность закрыта полностью вместе с объектами. Решения 31.10, п. 1: для М1 не требуется, оставлено переключателем")]
|
|
public bool hideUnexploredObjects = false;
|
|
|
|
[Header("М3: тайные операции (ТЕСТ)")]
|
|
[Tooltip("Технология «Шпион». Дерева технологий пока нет -- включено для проверки")]
|
|
public bool spyTechnology = true;
|
|
[Tooltip("Тайная группа: не больше стольких пехотинцев и лучников")]
|
|
public int covertMaxSoldiers = 10;
|
|
[Tooltip("Тайных операций одновременно")]
|
|
public int covertMaxOps = 2;
|
|
[Tooltip("Шанс обнаружения за проверку, %: поселение / зона башни / замок Круга")]
|
|
public int detectSettlementPercent = 15, detectTowerPercent = 25, detectCircleCastlePercent = 35;
|
|
[Tooltip("Проверка -- при входе в охраняемую область и потом каждые столько реальных минут")]
|
|
public float detectIntervalMinutes = 5f;
|
|
|
|
static IntelligenceConfig cached;
|
|
|
|
public static IntelligenceConfig Load()
|
|
{
|
|
if (cached != null) return cached;
|
|
cached = Resources.Load<IntelligenceConfig>("IntelligenceConfig");
|
|
if (cached == null)
|
|
{
|
|
Debug.LogWarning("[РАЗВЕДКА] Нет Assets/Resources/IntelligenceConfig.asset -- берутся числа по умолчанию из IntelligenceConfig.cs.");
|
|
cached = CreateInstance<IntelligenceConfig>();
|
|
}
|
|
return cached;
|
|
}
|
|
|
|
public IntelligenceRules ToRules()
|
|
{
|
|
var levels = new int[4];
|
|
for (int i = 0; i < 3 && observationPercent != null && i < observationPercent.Length; i++) levels[i + 1] = Mathf.Max(0, observationPercent[i]);
|
|
return new IntelligenceRules
|
|
{
|
|
SettlementRadius = Milli(settlementRadius),
|
|
ArmyRadius = Milli(armyRadius),
|
|
ObservationPercent = levels,
|
|
LastContactMs = (long)(Mathf.Max(0f, lastContactMinutes) * 60_000f),
|
|
ApproxPercent = Mathf.Clamp(approxPercent, 0, 100),
|
|
IdentifyPercent = Mathf.Clamp(identifyPercent, 0, 100),
|
|
SampleStepMs = (long)(Mathf.Max(1f, sampleStepSeconds) * 1000f),
|
|
CovertEnabled = spyTechnology,
|
|
CovertMaxSoldiers = Mathf.Max(1, covertMaxSoldiers),
|
|
CovertMaxOps = Mathf.Max(1, covertMaxOps),
|
|
DetectSettlementPercent = Mathf.Clamp(detectSettlementPercent, 0, 100),
|
|
DetectTowerPercent = Mathf.Clamp(detectTowerPercent, 0, 100),
|
|
DetectCircleCastlePercent = Mathf.Clamp(detectCircleCastlePercent, 0, 100),
|
|
DetectIntervalMs = (long)(Mathf.Max(0.1f, detectIntervalMinutes) * 60_000f)
|
|
};
|
|
}
|
|
|
|
static int Milli(float cells) => Mathf.Max(0, Mathf.RoundToInt(cells * 1000f));
|
|
}
|