using UnityEngine; // ТАБЛИЦА РЕСУРСНЫХ ТОЧЕК (регламент 31.10, раздел 7: «Изменять числа через WorldResourceConfig.asset»). Числа -- ТЕСТ. // // Ассет: Assets/Resources/WorldResourceConfig.asset (выдели его в окне Project и меняй числа в Inspector; // изменения действуют со следующего запуска игры). Создать заново: правый клик в Project -> // Create -> Bogatyri -> World Resource Config, имя файла -- WorldResourceConfig, папка -- Resources. // // Модуль Мира таблицу не видит: App/GameModules переводит её в ResourcePointRules. // Состояние точек (запас, сроки) ведёт Мир; зачисление добычи и складские лимиты -- Экономика (решение №46). [CreateAssetMenu(fileName = "WorldResourceConfig", menuName = "Bogatyri/World Resource Config")] public class WorldResourceConfig : ScriptableObject { [Header("Запас точки: малая / средняя / крупная")] public int[] woodStock = { 200, 600, 1500 }; public int[] stoneStock = { 150, 450, 1000 }; public int[] metalStock = { 80, 250, 600 }; public int[] goldStock = { 30, 100, 250 }; [Header("Добыча одного воина за ИГРОВОЙ час (1 игровой час = 5 реальных минут)")] public float woodPerGameHour = 2f; public float stonePerGameHour = 1.5f; public float metalPerGameHour = 1f; public float goldPerGameHour = 0.5f; [Header("Груз одного воина (осадные машины груза не несут)")] public int woodCargo = 12; public int stoneCargo = 10; public int metalCargo = 8; public int goldCargo = 5; [Header("Срок жизни точки, РЕАЛЬНЫХ часов с момента появления: малая / средняя / крупная")] public int[] lifetimeRealHours = { 12, 24, 48 }; [Header("Сколько точек на карте: малых / средних / крупных (решения 31.10, п. 6, ТЕСТ)")] [Tooltip("Решения 31.10: всего 24 -- лес 8, камень 7, металл 5, золото 4; по размерам 12 / 8 / 4. Раскладка по ресурсам -- здесь")] public int[] woodCount = { 4, 3, 1 }; public int[] stoneCount = { 4, 2, 1 }; public int[] metalCount = { 2, 2, 1 }; public int[] goldCount = { 2, 1, 1 }; static WorldResourceConfig cached; public static WorldResourceConfig Load() { if (cached != null) return cached; cached = Resources.Load("WorldResourceConfig"); if (cached == null) { Debug.LogWarning("[РЕСУРСНЫЕ ТОЧКИ] Нет Assets/Resources/WorldResourceConfig.asset -- берутся числа по умолчанию."); cached = CreateInstance(); } return cached; } public Bogatyri.World.ResourcePointRules ToRules() { var d = Bogatyri.World.ResourcePointRules.Default; return new Bogatyri.World.ResourcePointRules { Stock = new[] { Three(woodStock, d.Stock[0]), Three(stoneStock, d.Stock[1]), Three(metalStock, d.Stock[2]), Three(goldStock, d.Stock[3]) }, MiningMilliPerGameHour = new[] { Milli(woodPerGameHour), Milli(stonePerGameHour), Milli(metalPerGameHour), Milli(goldPerGameHour) }, CargoPerSoldier = new[] { Mathf.Max(0, woodCargo), Mathf.Max(0, stoneCargo), Mathf.Max(0, metalCargo), Mathf.Max(0, goldCargo) }, LifetimeRealHours = Three(lifetimeRealHours, d.LifetimeRealHours), Count = new[] { Counts(woodCount, d.Count[0]), Counts(stoneCount, d.Count[1]), Counts(metalCount, d.Count[2]), Counts(goldCount, d.Count[3]) } }; } static int Milli(float perHour) => Mathf.Max(0, Mathf.RoundToInt(perHour * 1000f)); // Число точек: ровно три значения, не меньше 0 (0 -- такого размера нет), иначе -- значения по умолчанию static int[] Counts(int[] values, int[] fallback) { if (values == null || values.Length != 3) return (int[])fallback.Clone(); return new[] { Mathf.Max(0, values[0]), Mathf.Max(0, values[1]), Mathf.Max(0, values[2]) }; } // Ровно три значения (малая / средняя / крупная), иначе -- значения по умолчанию static int[] Three(int[] values, int[] fallback) { if (values == null || values.Length != 3) return (int[])fallback.Clone(); return new[] { Mathf.Max(1, values[0]), Mathf.Max(1, values[1]), Mathf.Max(1, values[2]) }; } }