2025-08-17 12:49:06 +00:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using UnityEngine;
|
2025-08-18 10:48:36 +00:00
|
|
|
using UnityEngine.AddressableAssets;
|
2025-08-17 12:49:06 +00:00
|
|
|
|
|
|
|
namespace DDD
|
|
|
|
{
|
|
|
|
public class GameController : Singleton<GameController>, IManager, IGameFlowHandler
|
|
|
|
{
|
2025-08-18 10:48:36 +00:00
|
|
|
[SerializeField] private AssetReference _gameData;
|
|
|
|
|
2025-08-19 04:51:42 +00:00
|
|
|
public GameData GetGameData() => GameData.Instance;
|
|
|
|
public GameState GetGameState() => GameState.Instance;
|
2025-08-17 12:49:06 +00:00
|
|
|
|
|
|
|
private List<FlowController> _gameFlowControllers = new();
|
2025-08-18 10:48:36 +00:00
|
|
|
private static readonly List<Type> GameFlowControllerTypes = new();
|
2025-08-17 12:49:06 +00:00
|
|
|
|
|
|
|
public void PreInit()
|
|
|
|
{
|
2025-08-19 04:51:42 +00:00
|
|
|
CreateGameState();
|
2025-08-17 12:49:06 +00:00
|
|
|
RegisterFlowHandler();
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task Init()
|
|
|
|
{
|
|
|
|
await LoadData();
|
2025-08-19 04:51:42 +00:00
|
|
|
await GetGameData().LoadData();
|
2025-08-17 12:49:06 +00:00
|
|
|
await InitializeAllFlowControllers();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void PostInit()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2025-08-19 04:51:42 +00:00
|
|
|
private void CreateGameState()
|
2025-08-19 03:12:10 +00:00
|
|
|
{
|
2025-08-19 04:51:42 +00:00
|
|
|
GameState.CreateScriptSingleton();
|
2025-08-19 03:12:10 +00:00
|
|
|
}
|
|
|
|
|
2025-08-17 12:49:06 +00:00
|
|
|
private void RegisterFlowHandler()
|
|
|
|
{
|
|
|
|
GameFlowManager.Instance.FlowHandlers.Add(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
private async Task InitializeAllFlowControllers()
|
|
|
|
{
|
|
|
|
// Create controllers and initialize them
|
|
|
|
foreach (var gameFlowControllerType in GameFlowControllerTypes)
|
|
|
|
{
|
2025-08-19 04:51:42 +00:00
|
|
|
// create new controllers from gameFlowControllerType
|
2025-08-17 12:49:06 +00:00
|
|
|
var newController = ScriptableObject.CreateInstance(gameFlowControllerType);
|
|
|
|
var newFlowController = newController as FlowController;
|
|
|
|
_gameFlowControllers.Add(newFlowController);
|
|
|
|
await newFlowController.InitializeController();
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach (var gameFlowController in _gameFlowControllers)
|
|
|
|
{
|
|
|
|
await gameFlowController.InitializeState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-08-18 10:48:36 +00:00
|
|
|
private async Task LoadData()
|
2025-08-17 12:49:06 +00:00
|
|
|
{
|
2025-08-18 10:48:36 +00:00
|
|
|
await Task.CompletedTask;
|
2025-08-17 12:49:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public async Task OnReadyNewFlow(GameFlowState newFlowState)
|
|
|
|
{
|
|
|
|
List<Task> tasks = new List<Task>();
|
|
|
|
// Default initialization
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var gameFlowController in _gameFlowControllers)
|
|
|
|
{
|
|
|
|
tasks.Add(gameFlowController.OnReadyNewFlow(newFlowState));
|
|
|
|
}
|
|
|
|
await Task.WhenAll(tasks);
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task OnExitCurrentFlow(GameFlowState exitingFlowState)
|
|
|
|
{
|
|
|
|
List<Task> tasks = new List<Task>();
|
|
|
|
foreach (var gameFlowController in _gameFlowControllers)
|
|
|
|
{
|
|
|
|
tasks.Add(gameFlowController.OnExitCurrentFlow(exitingFlowState));
|
|
|
|
}
|
|
|
|
await Task.WhenAll(tasks);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|