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 уровне Ратуши. Не утверждено")] public int housingBase = 400; [Tooltip("Прибавка к пределу за каждый следующий уровень Ратуши. Не утверждено")] public int housingPerTownHallLevel = 100; [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; } [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("Производство T1 (этап 3)")] public ProductionSettings production = new ProductionSettings(); [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; } 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; } } }