2026-10-31 16:28:50 +01:00
|
|
|
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 };
|
|
|
|
|
|
2026-11-01 13:08:51 +01:00
|
|
|
[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 };
|
2026-10-31 16:28:50 +01:00
|
|
|
|
|
|
|
|
static WorldResourceConfig cached;
|
|
|
|
|
|
|
|
|
|
public static WorldResourceConfig Load()
|
|
|
|
|
{
|
|
|
|
|
if (cached != null) return cached;
|
|
|
|
|
cached = Resources.Load<WorldResourceConfig>("WorldResourceConfig");
|
|
|
|
|
if (cached == null)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogWarning("[РЕСУРСНЫЕ ТОЧКИ] Нет Assets/Resources/WorldResourceConfig.asset -- берутся числа по умолчанию.");
|
|
|
|
|
cached = CreateInstance<WorldResourceConfig>();
|
|
|
|
|
}
|
|
|
|
|
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),
|
2026-11-01 13:08:51 +01:00
|
|
|
Count = new[] { Counts(woodCount, d.Count[0]), Counts(stoneCount, d.Count[1]), Counts(metalCount, d.Count[2]), Counts(goldCount, d.Count[3]) }
|
2026-10-31 16:28:50 +01:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int Milli(float perHour) => Mathf.Max(0, Mathf.RoundToInt(perHour * 1000f));
|
|
|
|
|
|
2026-11-01 13:08:51 +01:00
|
|
|
// Число точек: ровно три значения, не меньше 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]) };
|
|
|
|
|
}
|
|
|
|
|
|
2026-10-31 16:28:50 +01:00
|
|
|
// Ровно три значения (малая / средняя / крупная), иначе -- значения по умолчанию
|
|
|
|
|
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]) };
|
|
|
|
|
}
|
|
|
|
|
}
|