using System; using System.Threading; using Cysharp.Threading.Tasks; using RebootKit.Engine.Foundation; using RebootKit.Engine.Services.Console; using RebootKit.Engine.Services.Game; using RebootKit.Engine.Services.Input; using RebootKit.Engine.Services.Simulation; using UnityEngine; using UnityEngine.Assertions; using UnityEngine.Events; using Logger = RebootKit.Engine.Foundation.Logger; namespace RebootKit.Engine { public partial class RR : IDisposable { internal static RR s_Shared; static readonly Logger s_logger = new("RR"); ConsoleService m_ConsoleService; DIContext m_DIContext; EngineConfigAsset m_EngineConfigAsset; GameService m_GameService; InputService m_InputService; WorldService m_WorldService; readonly UnityEvent m_CVarChanged = new(); public void Dispose() { m_CVarChanged.RemoveAllListeners(); } public async UniTask Init(EngineConfigAsset configAsset, CancellationToken cancellationToken) { Assert.IsNotNull(configAsset, "Config asset is required"); s_logger.Info("Waking up"); m_EngineConfigAsset = configAsset; m_DIContext = new DIContext(); m_DIContext.AddInjector(new CVarFieldInjector()); CreateCoreServices(); InitializeAppStateMachine(); await UniTask.Yield(cancellationToken); } public void Run() { OpenMainMenu(); } TService CreateService(ServiceAsset asset) where TService : class, IService { TService service = asset.Create(m_DIContext); m_DIContext.Bind(service); return service; } void CreateCoreServices() { s_logger.Debug("Registering core services"); m_ConsoleService = CreateService(m_EngineConfigAsset.coreServices.consoleService); m_InputService = CreateService(m_EngineConfigAsset.coreServices.inputService); m_WorldService = CreateService(m_EngineConfigAsset.coreServices.worldService); m_GameService = CreateService(m_EngineConfigAsset.coreServices.gameService); } } }