2026-10-31 17:05:17 +01:00
|
|
|
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("Выключено (по умолчанию): города, лагеря и точки видны всегда, туман только затемняет землю. " +
|
2026-11-01 13:01:21 +01:00
|
|
|
"Включено: неисследованная местность закрыта полностью вместе с объектами. Решения 31.10, п. 1: для М1 не требуется, оставлено переключателем")]
|
2026-10-31 17:05:17 +01:00
|
|
|
public bool hideUnexploredObjects = false;
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int Milli(float cells) => Mathf.Max(0, Mathf.RoundToInt(cells * 1000f));
|
|
|
|
|
}
|