From 679405b28883a00fac7853a7d508cb868a30b644 Mon Sep 17 00:00:00 2001 From: Valdemar Date: Tue, 27 Oct 2026 17:59:16 +0300 Subject: [PATCH] =?UTF-8?q?EconomyConfig:=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D0=B0=20=D0=B1=D0=B0=D0=BB=D0=B0=D0=BD=D1=81=D0=B0=20?= =?UTF-8?q?=D1=8D=D0=BA=D0=BE=D0=BD=D0=BE=D0=BC=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Resources/EconomyConfig.asset | 48 ++++++++ Assets/Resources/EconomyConfig.asset.meta | 8 ++ Assets/Scripts/App/EconomyConfig.cs | 136 ++++++++++++++++++++++ Assets/Scripts/App/EconomyConfig.cs.meta | 11 ++ 4 files changed, 203 insertions(+) create mode 100644 Assets/Resources/EconomyConfig.asset create mode 100644 Assets/Resources/EconomyConfig.asset.meta create mode 100644 Assets/Scripts/App/EconomyConfig.cs create mode 100644 Assets/Scripts/App/EconomyConfig.cs.meta diff --git a/Assets/Resources/EconomyConfig.asset b/Assets/Resources/EconomyConfig.asset new file mode 100644 index 0000000..fd480b4 --- /dev/null +++ b/Assets/Resources/EconomyConfig.asset @@ -0,0 +1,48 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4ddb59400c6d4b08b3afaaadc461ec1e, type: 3} + m_Name: EconomyConfig + m_EditorClassIdentifier: + population: + startTotal: 300 + startWorkers: 120 + startSoldiers: 30 + foodPerCivilianPerHour: 0.1 + foodPerSoldierPerHour: 0.2 + growthPerHour: 2.5 + housingBase: 400 + housingPerTownHallLevel: 100 + maxOfflineHours: 48 + startResources: + wood: 500 + food: 500 + stone: 200 + iron: 100 + gold: 100 + gems: 0 + production: + woodcutterPerHour: 2 + farmerPerHour: 2 + stonecutterPerHour: 1.5 + minerIronPerHour: 1 + minerGoldPerHour: 0.4 + workerSlotsT1: 30 + deposits: + poor: 0.6 + normal: 1 + rich: 1.5 + soldier: + people: 1 + food: 15 + iron: 5 + gold: 5 + trainSeconds: 60 diff --git a/Assets/Resources/EconomyConfig.asset.meta b/Assets/Resources/EconomyConfig.asset.meta new file mode 100644 index 0000000..23cedb6 --- /dev/null +++ b/Assets/Resources/EconomyConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: db192d63d5ff4504a4624613292cf3ab +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/App/EconomyConfig.cs b/Assets/Scripts/App/EconomyConfig.cs new file mode 100644 index 0000000..cd1408a --- /dev/null +++ b/Assets/Scripts/App/EconomyConfig.cs @@ -0,0 +1,136 @@ +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; + } + } +} diff --git a/Assets/Scripts/App/EconomyConfig.cs.meta b/Assets/Scripts/App/EconomyConfig.cs.meta new file mode 100644 index 0000000..a559a4f --- /dev/null +++ b/Assets/Scripts/App/EconomyConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ddb59400c6d4b08b3afaaadc461ec1e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: