using Nox.Core;
using Nox.Game;
using Jovian.SaveSystem;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using PlayMode = Nox.Core.PlayMode;
namespace Nox.UI {
///
/// Main menu interface class which is responsible for creating the main menu view and handling the main menu events
///
public class MainMenuView : IGameLifecycle {
private readonly MenuPrefabsContainer menuPrefabsContainer;
private readonly MenuGameStateData menuGameStateData;
private readonly ISaveSystem saveSystem;
private MainMenuReference mainMenuReference;
private CharacterCreationReference characterCreationReference;
private CharacterCreationView characterCreationView;
private AsyncOperationHandle charCreationHandle;
public MainMenuView(MenuPrefabsContainer menuPrefabsContainer, MenuGameStateData menuGameStateData, ISaveSystem saveSystem) {
this.menuPrefabsContainer = menuPrefabsContainer;
this.menuGameStateData = menuGameStateData;
this.saveSystem = saveSystem;
}
public void Initialize() {
if(mainMenuReference == null) {
mainMenuReference = Addressables.InstantiateAsync(menuPrefabsContainer.mainMenuReference).WaitForCompletion().GetComponent();
}
mainMenuReference.exitButton.onClick.AddListener(Application.Quit);
mainMenuReference.optionsButton.onClick.AddListener(() => {/* options logic here */});
mainMenuReference.newGameButton.onClick.AddListener(InitializeCharacterCreation);
bool hasSave = saveSystem.HasAnySaves();
mainMenuReference.continueButton.gameObject.SetActive(hasSave);
if(hasSave) {
mainMenuReference.continueButton.onClick.AddListener(() => menuGameStateData.continueGameRequest.Invoke());
}
}
public void InitializeCharacterCreation() {
charCreationHandle = Addressables.InstantiateAsync(menuPrefabsContainer.characterCreationReference);
charCreationHandle.Task.ContinueWith(t => {
if(t.IsFaulted) {
Debug.LogError(t.Exception);
}
characterCreationReference =t.Result.GetComponent();
characterCreationView = new CharacterCreationView(characterCreationReference, menuGameStateData);
characterCreationView.Show();
});
}
public void Tick() {
characterCreationView?.Tick();
}
public void Dispose() {
characterCreationView?.Dispose();
Object.Destroy(characterCreationReference.gameObject);
charCreationHandle.Release();
}
}
}