using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; namespace DDD { public class RestaurantController : Singleton, IManager, IGameFlowHandler { // static definitions private static readonly List RestaurantFlowControllerTypes = new() { typeof(RestaurantPlayerController), typeof(RestaurantEnvironmentController), typeof(RestaurantManagementController), typeof(RestaurantRunController) }; public RestaurantState GetRestaurantState() => RestaurantState.instance; public RestaurantDataSo RestaurantData() => RestaurantDataSo.instance; private List _restaurantFlowControllers = new(); public void PreInit() { RegisterFlowHandler(); } public async Task Init() { await LoadData(); await RestaurantDataSo.instance.LoadData(); } public void PostInit() { InitializeAllFlowControllers(); } private void RegisterFlowHandler() { GameFlowManager.Instance.FlowHandlers.Add(this); } private void 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 RestaurantFlowController; _restaurantFlowControllers.Add(newFlowController); newFlowController.InitializeController(); } foreach (var restaurantFlowController in _restaurantFlowControllers) { restaurantFlowController.InitializeState(); } } private async Task LoadData() { } 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); } } }