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("Выключено (по умолчанию): города, лагеря и точки видны всегда, туман только затемняет землю. " + "Включено: неисследованная местность закрыта полностью вместе с объектами. Решение команды не принято")] public bool hideUnexploredObjects = false; static IntelligenceConfig cached; public static IntelligenceConfig Load() { if (cached != null) return cached; cached = Resources.Load("IntelligenceConfig"); if (cached == null) { Debug.LogWarning("[РАЗВЕДКА] Нет Assets/Resources/IntelligenceConfig.asset -- берутся числа по умолчанию из IntelligenceConfig.cs."); cached = CreateInstance(); } 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) }; } static int Milli(float cells) => Mathf.Max(0, Mathf.RoundToInt(cells * 1000f)); }