Мир (Bogatyri.World.Simulation, WorldSimulation.Points.cs): - точки дерева, камня, металла, золота трёх размеров; запас, добыча воина за игровой час (1 игровой час = 5 реальных минут), груз на воина, срок жизни 12/24/48 реальных часов — ТЕСТ - сбор: дошли → стоят на точке (MarchState.Gathering) до полного груза, истощения или исчезновения точки, затем физический возврат с грузом; всё считается в момент прихода — работает и офлайн - осадные груза не несут; одна точка — одно войско; точка исчезла до прихода — возврат без добычи - истощённая/исчезнувшая точка заменяется новой того же ресурса в другом месте (детерминированно) - события GatherStarted, GatherFinished; порядок событий по времени с учётом сбора и исчезновения точек - сохранение в секции world (points); старые сохранения без точек читаются Зачисление груза — Экономика через IEconomy (как трофеи боя), код Валдемара не менялся. Таблица WorldResourceConfig (Assets/Resources/WorldResourceConfig.asset). Карта мира: точки — ромбы цвета ресурса с запасом и сроком; окно отправки с запасом, добычей, грузом и прогнозом «унесут N за T»; окно «ТОЧКИ НЕТ»; подпись отряда «сбор», время с часами. Город: окно «ВОЙСКО ВЕРНУЛОСЬ» пишет «Сбор … ресурсы собраны». Открыто (не задано регламентом): число точек на карте (сейчас по 2 каждого ресурса), выбор размера, предел добычи на точку. Позже: нападение на занятую точку, «Связь Волхвов», переполнение склада. Тесты: появление и расстановка, сбор и груз, истощение и новая точка, осадные без груза, исчезновение до прихода и во время сбора, одна точка — одно войско, сохранение посреди сбора. Все 54 теста проходят вне Unity. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
75 lines
4.0 KiB
C#
75 lines
4.0 KiB
C#
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 };
|
|
|
|
[Header("Не задано регламентом -- ТЕСТ")]
|
|
[Tooltip("Сколько точек каждого ресурса одновременно на карте")]
|
|
public int pointsPerResource = 2;
|
|
|
|
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),
|
|
PointsPerResource = Mathf.Max(0, pointsPerResource)
|
|
};
|
|
}
|
|
|
|
static int Milli(float perHour) => Mathf.Max(0, Mathf.RoundToInt(perHour * 1000f));
|
|
|
|
// Ровно три значения (малая / средняя / крупная), иначе -- значения по умолчанию
|
|
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]) };
|
|
}
|
|
}
|