209 lines
9.8 KiB
C#
209 lines
9.8 KiB
C#
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>("EconomyConfig");
|
|
if (cached == null)
|
|
{
|
|
Debug.LogWarning("[ЭКОНОМИКА] Нет Assets/Resources/EconomyConfig.asset -- берутся числа по умолчанию из EconomyConfig.cs.");
|
|
cached = CreateInstance<EconomyConfig>();
|
|
}
|
|
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;
|
|
}
|
|
}
|
|
}
|