Files
MVP1/Assets/Scripts/App/GameModules.cs
T

76 lines
4.2 KiB
C#
Raw Normal View History

using UnityEngine;
// ТОЧКА СБОРКИ МОДУЛЕЙ (слой приложения). Документ: Docs/Modules/README.md
//
// Здесь и только здесь модули соединяются с остальной игрой:
// 1. регистрируются реализации контрактов, которые не регистрируются сами;
// 2. события модулей подключаются к системам, которые ещё не разнесены по модулям (GameProgress, Казармы).
// Модули друг о друге ничего не знают -- всю "проводку" видно в одном файле.
public static class GameModules
{
// После SubsystemRegistration (там ядро очищается) и раньше любых Awake
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)]
static void Register()
{
// Боевая система -- чистый C#, сама зарегистрироваться не может
GameServices.Register<IBattleSystem>(new BattleSystem());
// Армия: войска пока хранятся в GameProgress, контракт реализует мост
GameServices.Register<IArmy>(ArmyBridge.Service);
// Круг -- чистый C#, сам сохраняет, в каком Круге игрок (секция "circle")
var circle = new CircleService();
GameServices.Register<ICircle>(circle);
SaveRegistry.Register(circle);
// Чат -- чистый C#; история живёт, пока открыта игра (между сценами тоже)
GameServices.Register<IChat>(new ChatService(System.DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()));
// Казармы появляются в списке стройки кодом -- до восстановления зданий из сохранения
EventBus.Subscribe<SettlementRestoringEvent>(_ => BarracksBootstrap.Ensure());
// Статистика для заданий (GameProgress) -- по событиям Мира
EventBus.Subscribe<MarchStartedEvent>(OnMarchStarted);
EventBus.Subscribe<MarchReturnedEvent>(OnMarchReturned);
}
// Сцена загружена, Awake всех объектов прошли, Start -- ещё нет (сохранение грузится в Start)
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
static void MigrateLegacyMarches()
{
// Раньше походы хранились в progress.json (GameProgress.Data.sashaMarches).
// Теперь их сохраняет модуль Мира в save.json, секция "world". Переносим один раз.
var data = GameProgress.Instance.Data;
if (data.sashaMarches == null || data.sashaMarches.Count == 0 || MarchManager.Instance == null) return;
// Если в save.json уже есть секция "world", загрузка сохранения заменит эти походы на сохранённые
MarchManager.Instance.LoadMarches(new System.Collections.Generic.List<Bogatyri.World.MarchData>(data.sashaMarches));
// Из progress.json убираем, только когда походы уже записаны в save.json -- иначе вылет игры их потеряет
EventBus.Subscribe<GameSavedEvent>(ClearLegacyMarches);
}
static void ClearLegacyMarches(GameSavedEvent e)
{
EventBus.Unsubscribe<GameSavedEvent>(ClearLegacyMarches);
GameProgress.Instance.Data.sashaMarches.Clear();
GameProgress.Instance.MarkChanged();
Debug.Log("[МОДУЛИ] Походы перенесены из progress.json в модуль Мира.");
}
static void OnMarchStarted(MarchStartedEvent e)
{
var data = GameProgress.Instance.Data;
data.marchesSent++;
data.dailyMarches++;
GameProgress.Instance.MarkChanged();
}
static void OnMarchReturned(MarchReturnedEvent e)
{
if (!e.Victory) return;
GameProgress.Instance.Data.worldWins++;
GameProgress.Instance.MarkChanged();
}
}