using UnityEngine; // ТАБЛИЦА МАРШЕЙ: скорости войск по типам и слоты похода (регламент 31.10, раздел 7). Числа -- ТЕСТ. // // Ассет: Assets/Resources/MarchConfig.asset (выдели его в окне Project и меняй числа в Inspector; // изменения действуют со следующего запуска игры). Создать заново: правый клик в Project -> // Create -> Bogatyri -> March Config, имя файла -- MarchConfig, папка -- Resources. // // Модули таблицу не видят: App/GameModules передаёт скорости в модуль Мира, слоты -- в модуль Армии. // Бонусы героя (+15%) и технологии (+20%) к скорости появятся вместе с героями и технологиями. [CreateAssetMenu(fileName = "MarchConfig", menuName = "Bogatyri/March Config")] public class MarchConfig : ScriptableObject { [Header("Скорость: клеток карты за 1 РЕАЛЬНЫЙ час (марш идёт в реальном времени)")] [Tooltip("Пехота. Регламент 31.10: 8")] public float infantry = 8f; [Tooltip("Лучники. Регламент 31.10: 9")] public float archers = 9f; [Tooltip("Кавалерия. Регламент 31.10: 12")] public float cavalry = 12f; [Tooltip("Осадные. Регламент 31.10: 4")] public float siege = 4f; [Header("Модификаторы скорости, % (решения 31.10, п. 4: смешанное войско -- средняя по численности)")] [Tooltip("По типам: пехота, лучники, кавалерия, осадные. +10 -- быстрее на 10%. Позже -- бонусы героев и технологий. ТЕСТ")] public int[] typeSpeedBonusPercent = { 0, 0, 0, 0 }; [Tooltip("Общий модификатор всего войска, применяется один раз. ТЕСТ")] public int armySpeedBonusPercent = 0; [Header("Слоты похода")] [Tooltip("Сколько походов игрока могут идти одновременно. Регламент 31.10: 2 (технология «Военная логистика» -- до 7)")] public int baseMarchSlots = 2; [Header("Патрули-заглушки соседей (Разведка М1, ВРЕМЕННАЯ тестовая механика)")] [Tooltip("Соседние города иногда отправляют отряды к другим городам и лагерям -- проверить обнаружение, численность, опознание и потерю контакта. Выключить, когда появится настоящий PvP")] public bool patrolsEnabled = true; [Tooltip("Сколько патрулей одновременно на карте")] public int patrolMaxActive = 3; [Tooltip("Новый патруль -- раз в столько РЕАЛЬНЫХ минут (если не превышен предел)")] public float patrolIntervalMinutes = 10f; public int patrolSoldiersMin = 10; public int patrolSoldiersMax = 40; static MarchConfig cached; public static MarchConfig Load() { if (cached != null) return cached; cached = Resources.Load("MarchConfig"); if (cached == null) { Debug.LogWarning("[МАРШИ] Нет Assets/Resources/MarchConfig.asset -- берутся числа по умолчанию из MarchConfig.cs."); cached = CreateInstance(); } return cached; } // Скорости для модуля Мира: милли-единиц карты (1000 = клетка) за реальный час public Bogatyri.World.MarchSpeedRules ToSpeedRules() { return new Bogatyri.World.MarchSpeedRules { SpeedMilliPerHour = new[] { Milli(infantry), Milli(archers), Milli(cavalry), Milli(siege) }, TypeBonusPercent = (int[])(typeSpeedBonusPercent ?? new int[4]).Clone(), ArmyBonusPercent = armySpeedBonusPercent }; } public Bogatyri.World.PatrolRules ToPatrolRules() { return new Bogatyri.World.PatrolRules { Enabled = patrolsEnabled, MaxActive = Mathf.Max(0, patrolMaxActive), IntervalMs = (long)(Mathf.Max(1f, patrolIntervalMinutes) * 60_000f), SoldiersMin = Mathf.Max(1, patrolSoldiersMin), SoldiersMax = Mathf.Max(1, patrolSoldiersMax) }; } static int Milli(float cellsPerHour) => Mathf.Max(1, Mathf.RoundToInt(cellsPerHour * 1000f)); }