Мир (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>
133 lines
5.2 KiB
C#
133 lines
5.2 KiB
C#
// События, которыми модули сообщают друг другу о случившемся.
|
|
// Событие -- это факт в прошедшем времени ("ресурс изменился"), а не просьба что-то сделать.
|
|
// Добавляя событие, впиши его в документ модуля-отправителя (Docs/Modules).
|
|
|
|
// ---------------- Экономика ----------------
|
|
public struct ResourceChangedEvent
|
|
{
|
|
public ResourceType Type;
|
|
public float Value;
|
|
}
|
|
|
|
// ---------------- Поселение ----------------
|
|
public struct BuildingPlacedEvent
|
|
{
|
|
public string BuildingName;
|
|
}
|
|
|
|
public struct TownHallLevelChangedEvent
|
|
{
|
|
public int Level;
|
|
}
|
|
|
|
// Поселение начинает восстанавливать здания из сохранения: самое время добавить в список стройки
|
|
// здания, которые появляются кодом (например, Казармы)
|
|
public struct SettlementRestoringEvent { }
|
|
|
|
// ---------------- Время ----------------
|
|
// Время игры промотано вперёд (отладочная панель). Модули досчитывают прошедшее время.
|
|
public struct GameTimeAdvancedEvent
|
|
{
|
|
public long Seconds;
|
|
public long UnixNow;
|
|
}
|
|
|
|
// ---------------- Население ----------------
|
|
// Число людей изменилось (прирост, загрузка, сброс, изменение войска)
|
|
public struct PopulationChangedEvent
|
|
{
|
|
public int Total;
|
|
public int Civilians;
|
|
public int Soldiers;
|
|
public int HousingCap;
|
|
}
|
|
|
|
// Рабочих переставили (окно "Рабочие", автоматическое заполнение новых мест)
|
|
public struct WorkersChangedEvent
|
|
{
|
|
public int Workers;
|
|
public int FreeWorkers;
|
|
}
|
|
|
|
// Голод начался (IsStarving = true) или закончился
|
|
public struct StarvationChangedEvent
|
|
{
|
|
public bool IsStarving;
|
|
}
|
|
|
|
// ---------------- Армия ----------------
|
|
// Число воинов изменилось (обучение, потери, поход, возвращение, загрузка)
|
|
public struct TroopsChangedEvent
|
|
{
|
|
public int AtHome;
|
|
public int InMarches;
|
|
public int Garrison; // из AtHome -- в гарнизоне
|
|
}
|
|
|
|
// ---------------- Глобальный мир ----------------
|
|
// У событий похода -- номер похода и точное время по часам игры (документ 02 комплекта от 29.10.2026):
|
|
// TimeMs -- когда это случилось, а не когда игра это заметила (после офлайна это разные моменты).
|
|
public struct MarchStartedEvent
|
|
{
|
|
public int MarchId;
|
|
public long TimeMs; // выступление
|
|
public string TargetId;
|
|
public int Soldiers;
|
|
}
|
|
|
|
public struct MarchBattleResolvedEvent
|
|
{
|
|
public int MarchId;
|
|
public long BattleId; // номер боя (= Seed): по нему бой можно перепроверить
|
|
public long TimeMs; // приход к цели и бой
|
|
public string TargetId;
|
|
public bool Victory;
|
|
public int Soldiers;
|
|
public int Survivors;
|
|
}
|
|
|
|
public struct MarchReturnedEvent
|
|
{
|
|
public int MarchId;
|
|
public long TimeMs; // возвращение домой
|
|
public bool Victory;
|
|
public int Survivors;
|
|
public int Sent; // сколько воинов уходило в поход
|
|
public bool TargetEmpty; // лагерь уже был разбит / ресурсной точки уже не было: боя и сбора не было, вернулись все
|
|
public bool IsGather; // поход на ресурсную точку (сбор, а не бой)
|
|
public string TargetName; // куда ходили ("Замок Змея Горыныча", имя соседа)
|
|
public string LootText; // добыча текстом: "+20 золота, +40 еды" или "нет"
|
|
}
|
|
|
|
// ---------------- Чат ----------------
|
|
// Новое сообщение в любом канале (своё или чужое)
|
|
public struct ChatMessageReceivedEvent
|
|
{
|
|
public ChatMessage Message;
|
|
}
|
|
|
|
// ---------------- Круг ----------------
|
|
// Игрок вступил в Круг или создал свой
|
|
public struct CircleJoinedEvent
|
|
{
|
|
public string CircleId;
|
|
public string CircleName;
|
|
public bool Created;
|
|
}
|
|
|
|
// Игрок вышел из Круга (Disbanded -- Круг распущен, игрок был в нём один)
|
|
public struct CircleLeftEvent
|
|
{
|
|
public string CircleId;
|
|
public string CircleName;
|
|
public bool Disbanded;
|
|
}
|
|
|
|
// ---------------- Сохранения ----------------
|
|
public struct GameLoadedEvent { }
|
|
// Файла сохранения нет -- это первая игра на устройстве (стартовые ресурсы, стартовое войско)
|
|
public struct NewGameStartedEvent { }
|
|
public struct GameSavedEvent { }
|
|
// Сохранения сброшены, все модули уже в состоянии новой игры
|
|
public struct GameResetEvent { }
|