forked from Shardstone/trail-into-darkness
First commit on my server, yey!
This commit is contained in:
104
Assets/Code/Core/MainMenuGameState.cs
Normal file
104
Assets/Code/Core/MainMenuGameState.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
using Nox.Game;
|
||||
using Jovian.SaveSystem;
|
||||
using Nox.UI;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.AddressableAssets;
|
||||
using UnityEngine.ResourceManagement.AsyncOperations;
|
||||
using UnityEngine.ResourceManagement.ResourceProviders;
|
||||
|
||||
namespace Nox.Core {
|
||||
|
||||
public class MenuGameStateData {
|
||||
public Action<PlayMode> startGameRequests;
|
||||
public Action continueGameRequest;
|
||||
}
|
||||
|
||||
public class MainMenuGameState : IGameState {
|
||||
private readonly GameDataState gameDataState;
|
||||
private readonly MenuGameStateData menuGameStateData;
|
||||
private readonly BootstrapReferences bootstrapReferences;
|
||||
private readonly ISaveSystem saveSystem;
|
||||
private readonly PartyCreatorModel partyCreatorModel;
|
||||
private AdventureData adventureData;
|
||||
private Action<PlayMode> onStartGameRequested;
|
||||
private Action onContinueRequested;
|
||||
private MainMenuView mainMenuView;
|
||||
private AsyncOperationHandle<SceneInstance> loadSceneAsync;
|
||||
public bool IsGameStateInitialized { get; set; }
|
||||
|
||||
public MainMenuGameState(GameDataState gameDataState,
|
||||
MenuGameStateData menuGameStateData,
|
||||
BootstrapReferences bootstrapReferences,
|
||||
ISaveSystem saveSystem,
|
||||
PartyCreatorModel partyCreatorModel,
|
||||
AdventureData adventureData) {
|
||||
this.gameDataState = gameDataState;
|
||||
this.menuGameStateData = menuGameStateData;
|
||||
this.bootstrapReferences = bootstrapReferences;
|
||||
this.saveSystem = saveSystem;
|
||||
this.partyCreatorModel = partyCreatorModel;
|
||||
this.adventureData = adventureData;
|
||||
}
|
||||
|
||||
public void EnterGameState() {
|
||||
IsGameStateInitialized = false;
|
||||
onStartGameRequested = mode => {
|
||||
var party = partyCreatorModel.CreatePartyForNewRun(companionCount: 4);
|
||||
gameDataState.ActiveParty = party;
|
||||
var sessions = saveSystem.GetAllSessions();
|
||||
gameDataState.activeSessionId = sessions.Count > 0
|
||||
? sessions[0].sessionId
|
||||
: saveSystem.CreateSession();
|
||||
gameDataState.savedPartyPosition = new Vector3(7.285129f, 0, 0.4297419f);
|
||||
gameDataState.ChangeGameState(GameState.GameMode);
|
||||
gameDataState.ChangePlayMode(mode);
|
||||
};
|
||||
onContinueRequested = () => {
|
||||
var saveData = NoxSaveData.RestoreSavedData(saveSystem, gameDataState, ref adventureData);
|
||||
if(saveData == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
gameDataState.ChangeGameState(GameState.GameMode);
|
||||
gameDataState.ChangePlayMode(saveData.activePlayMode);
|
||||
|
||||
};
|
||||
menuGameStateData.startGameRequests += onStartGameRequested;
|
||||
menuGameStateData.continueGameRequest += onContinueRequested;
|
||||
_ = InitializeGameState();
|
||||
}
|
||||
|
||||
private async Task InitializeGameState() {
|
||||
var sceneHandle = Addressables.LoadSceneAsync(bootstrapReferences.startMenuScene);
|
||||
await sceneHandle.Task;
|
||||
await sceneHandle.Result.ActivateAsync();
|
||||
var assetHandle = Addressables.LoadAssetAsync<MenuPrefabsContainer>(bootstrapReferences.menuPrefabsContainer);
|
||||
await assetHandle.Task;
|
||||
mainMenuView = new MainMenuView(assetHandle.Result, menuGameStateData, saveSystem);
|
||||
mainMenuView.Initialize();
|
||||
IsGameStateInitialized = true;
|
||||
}
|
||||
|
||||
public GameState Tick() {
|
||||
mainMenuView?.Tick();
|
||||
return gameDataState.ActiveGameState;
|
||||
}
|
||||
public void LateTick() { }
|
||||
public void Dispose() { }
|
||||
|
||||
public void ExitGameState() {
|
||||
if(onStartGameRequested != null) {
|
||||
menuGameStateData.startGameRequests -= onStartGameRequested;
|
||||
onStartGameRequested = null;
|
||||
}
|
||||
if(onContinueRequested != null) {
|
||||
menuGameStateData.continueGameRequest -= onContinueRequested;
|
||||
onContinueRequested = null;
|
||||
}
|
||||
mainMenuView?.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user