using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; namespace DDD { public class RestaurantController : Singleton, IManager, IGameFlowHandler { [SerializeField] private AssetReference _restaurantData; [SerializeField] private AssetReference _restaurantState; public RestaurantData RestaurantData { get; private set; } public RestaurantState RestaurantState { get; private set; } private List _restaurantFlowControllers = new(); // static definitions private static readonly List RestaurantFlowControllerTypes = new() { typeof(RestaurantPlayerController), typeof(RestaurantEnvironmentController), typeof(RestaurantManagementController), typeof(RestaurantRunController), typeof(RestaurantGlobalMessageController) }; public void PreInit() { RegisterFlowHandler(); } public async Task Init() { await LoadData(); await RestaurantData.LoadData(); await RestaurantState.LoadData(); await InitializeAllFlowControllers(); } public void PostInit() { } private void RegisterFlowHandler() { GameFlowManager.Instance.FlowHandlers.Add(this); } private async Task InitializeAllFlowControllers() { // Create controllers and initialize them foreach (var restaurantFlowControllerType in RestaurantFlowControllerTypes) { // create new controllers from restaurantFlowControllerType var newController = ScriptableObject.CreateInstance(restaurantFlowControllerType); var newFlowController = newController as FlowController; _restaurantFlowControllers.Add(newFlowController); await newFlowController.InitializeController(); } foreach (var restaurantFlowController in _restaurantFlowControllers) { await restaurantFlowController.InitializeState(); } } private async Task LoadData() { var restaurantDataHandle = _restaurantData.LoadAssetAsync(); var restaurantStateHandle = _restaurantState.LoadAssetAsync(); await restaurantDataHandle.Task; await restaurantStateHandle.Task; RestaurantData = restaurantDataHandle.Result; RestaurantState = restaurantStateHandle.Result; Debug.Assert(RestaurantData != null, "RestaurantData is null"); Debug.Assert(RestaurantState != null, "RestaurantState is null"); } public async Task OnReadyNewFlow(GameFlowState newFlowState) { List tasks = new List(); // Default restaurant initialization if (newFlowState == GameFlowState.ReadyForRestaurant) { // Switch keymap InputManager.Instance.SwitchCurrentActionMap(InputActionMaps.Restaurant); } // Restaurant FlowControllers - Player, Environment, Management, Run, ... foreach (var flowController in _restaurantFlowControllers) { tasks.Add(flowController.OnReadyNewFlow(newFlowState)); } await Task.WhenAll(tasks); } public async Task OnExitCurrentFlow(GameFlowState exitingFlowState) { List tasks = new List(); foreach (var flowController in _restaurantFlowControllers) { tasks.Add(flowController.OnExitCurrentFlow(exitingFlowState)); } await Task.WhenAll(tasks); } } }