using System; using UnityEngine; // ТАБЛИЦА БАЛАНСА ЭКОНОМИКИ. Все числа экономики -- здесь, а не в коде модулей. // // Ассет: Assets/Resources/EconomyConfig.asset (выдели его в окне Project и меняй числа в Inspector, // перекомпиляция не нужна). Создать заново: правый клик в Project -> Create -> Bogatyri -> Economy Config, // имя файла -- EconomyConfig, папка -- Resources. // // Модули конфиг не видят: App/GameModules переводит его в правила модулей (например, правила Населения). // Числа -- из дизайн-документа. Помеченные "не утверждено" -- временные, их решает команда. [CreateAssetMenu(fileName = "EconomyConfig", menuName = "Bogatyri/Economy Config")] public class EconomyConfig : ScriptableObject { [Serializable] public class PopulationSettings { [Tooltip("Стартовый город T1: всего людей")] public int startTotal = 300; [Tooltip("Из них рабочих")] public int startWorkers = 120; [Tooltip("Из них воинов (выдаются в Армию пехотой при новой игре)")] public int startSoldiers = 30; [Tooltip("Еды в час на одного жителя")] public float foodPerCivilianPerHour = 0.1f; [Tooltip("Еды в час на одного воина")] public float foodPerSoldierPerHour = 0.2f; [Tooltip("Прирост людей в час, если есть еда (документ: 2–3)")] public float growthPerHour = 2.5f; [Tooltip("Предел населения без Домов на 1 уровне Ратуши (решение команды от 19.10: 300 при 300 -- прирост стоит)")] public int housingBase = 300; [Tooltip("Прибавка к пределу за каждый следующий уровень Ратуши. Не утверждено")] public int housingPerTownHallLevel = 50; [Tooltip("Прибавка к пределу за каждый уровень Дома (здание \"Население\"). Не утверждено")] public int housingPerHouseLevel = 50; [Tooltip("Офлайн-прогресс считается не больше чем за столько часов. Не утверждено")] public int maxOfflineHours = 48; } [Serializable] public class ProductionSettings // этап 3: производство через рабочих { [Tooltip("Лесоруб T1: дерева в час")] public float woodcutterPerHour = 2f; [Tooltip("Фермер T1: еды в час")] public float farmerPerHour = 2f; [Tooltip("Каменотёс T1: камня в час")] public float stonecutterPerHour = 1.5f; [Tooltip("Шахтёр T1: металла в час")] public float minerIronPerHour = 1f; [Tooltip("Шахтёр T1: золота в час")] public float minerGoldPerHour = 0.4f; [Tooltip("Мест для рабочих в здании T1 (Лесопилка и т.п.)")] public int workerSlotsT1 = 30; [Tooltip("+ мест за каждый уровень здания выше первого. Не утверждено")] public int workerSlotsPerLevel = 10; [Tooltip("+ к норме за каждый уровень здания выше первого (0.1 = +10%). Не утверждено")] public float efficiencyPerLevel = 0.1f; } [Serializable] public class StorageSettings // этап 1: лимиты хранения { [Tooltip("Лимит без Складов: дерево, камень, металл, золото. Не утверждено")] public float baseGoods = 1000f; [Tooltip("Лимит еды без Амбаров. Не утверждено")] public float baseFood = 1500f; [Tooltip("+ к лимиту дерева, камня, металла, золота за каждый уровень Склада. Не утверждено")] public float perWarehouseLevel = 1000f; [Tooltip("+ к лимиту еды за каждый уровень Амбара. Не утверждено")] public float perGranaryLevel = 1500f; [Tooltip("Лимит синего кристалла (решение команды от 19.10: небольшой, не бесконечный). Число не утверждено")] public float crystalCap = 50f; [Tooltip("Цена Склада: дерево / камень. Не утверждено")] public float warehouseWood = 200f; public float warehouseStone = 100f; [Tooltip("Цена Амбара: дерево / камень. Не утверждено")] public float granaryWood = 150f; public float granaryStone = 50f; } [Serializable] public class UpgradeSettings // улучшение зданий (рабочие места, Дома, Склады, Амбары) { [Tooltip("Цена улучшения с 1 на 2 уровень: дерево / камень. Не утверждено")] public float baseWood = 150f; public float baseStone = 100f; [Tooltip("Во сколько раз дорожает каждый следующий уровень. Не утверждено")] public float multiplierPerLevel = 1.6f; public int maxLevel = 10; } [Serializable] public class DepositSettings // этап 4: качество месторождения (пока не используется) { public float poor = 0.6f; public float normal = 1f; public float rich = 1.5f; } [Serializable] public class SoldierSettings // этап 5: цена солдата (пока не используется) { public int people = 1; public float food = 15f; public float iron = 5f; public float gold = 5f; [Tooltip("Время подготовки, секунд. Не утверждено")] public int trainSeconds = 60; } [Serializable] public class StartResources { [Tooltip("Ресурсы новой игры. Не утверждено")] public float wood = 500f; public float food = 500f; public float stone = 200f; public float iron = 100f; public float gold = 100f; public float gems = 0f; } [Header("Население (этап 2)")] public PopulationSettings population = new PopulationSettings(); [Header("Стартовые ресурсы новой игры")] public StartResources startResources = new StartResources(); [Header("Склады и лимиты (этап 1)")] public StorageSettings storage = new StorageSettings(); [Header("Производство T1 (этап 3)")] public ProductionSettings production = new ProductionSettings(); [Header("Улучшение зданий")] public UpgradeSettings upgrade = new UpgradeSettings(); [Header("Месторождения (этап 4)")] public DepositSettings deposits = new DepositSettings(); [Header("Солдат T1 (этап 5)")] public SoldierSettings soldier = new SoldierSettings(); // ---------------- Загрузка ---------------- static EconomyConfig cached; // Конфиг из Assets/Resources/EconomyConfig.asset. Нет ассета -- числа по умолчанию (из этого файла) и предупреждение. public static EconomyConfig Load() { if (cached != null) return cached; cached = Resources.Load("EconomyConfig"); if (cached == null) { Debug.LogWarning("[ЭКОНОМИКА] Нет Assets/Resources/EconomyConfig.asset -- берутся числа по умолчанию из EconomyConfig.cs."); cached = CreateInstance(); } return cached; } // Лимит склада для ресурса по уровням Складов и Амбаров. PositiveInfinity -- без лимита (люди, сила) public float GetCapacity(ResourceType type, int warehouseLevels, int granaryLevels) { var s = storage; switch (type) { case ResourceType.Wood: case ResourceType.Stone: case ResourceType.Iron: case ResourceType.Gold: return s.baseGoods + s.perWarehouseLevel * warehouseLevels; case ResourceType.Food: return s.baseFood + s.perGranaryLevel * granaryLevels; case ResourceType.Gems: return s.crystalCap; default: return float.PositiveInfinity; } } // Цена улучшения здания с уровня level на level + 1 public ResourceAmount[] UpgradeCost(int level) { float m = Mathf.Pow(upgrade.multiplierPerLevel, Mathf.Max(0, level - 1)); return new[] { new ResourceAmount(ResourceType.Wood, Mathf.Round(upgrade.baseWood * m)), new ResourceAmount(ResourceType.Stone, Mathf.Round(upgrade.baseStone * m)), }; } public float GetStartResource(ResourceType type) { var s = startResources; switch (type) { case ResourceType.Wood: return s.wood; case ResourceType.Food: return s.food; case ResourceType.Stone: return s.stone; case ResourceType.Iron: return s.iron; case ResourceType.Gold: return s.gold; case ResourceType.Gems: return s.gems; default: return 0f; } } }