using UnityEngine; using System; using System.Collections.Generic; using System.Collections; public class PrologueManager : MonoBehaviour { [SerializeField] private Transform playerNewGameStartPosition; [SerializeField] private GameObject vechicleDrivable; [SerializeField] private GameObject vechicleStatic; public bool isLoadingPrologueRelated; public PrologueStorylineStatesData prologueStorylineStatesData; public PrologueEventsData prologueEventsData; public ProloguePickupsData prologuePickupsData; public PrologueSaveTriggersData prologueSaveTriggersData; public enum PrologueStorylineState { CheckLoad, InsideCar, ExitedCar, OutsideHouse } public PrologueStorylineState prologueStorylineState = PrologueStorylineState.CheckLoad; private void Awake() { GameManager.GetInstance().prologueManager = this; if (LoadManager.GetInstance().LoadingGame) { isLoadingPrologueRelated = true; } } public void Activate() { Debug.Log("Prologue Manager Activated: Initializing events."); //StartCoroutine(CheckIfLoadIsCompleted()); UpdateStoryline(); } public void Deactivate() { Debug.Log("Prologue Manager Deactivated."); StopAllCoroutines(); CleanupPlayerSettings(); SaveStorylineState(); NotifyCompletion(); } private IEnumerator CheckIfLoadIsCompleted() { var loadManager = LoadManager.GetInstance(); if (loadManager == null) { Debug.LogError("LoadManager instance is missing!"); yield break; } while (loadManager.LoadingGame || loadManager.IsEnteringNewGame) { yield return null; } UpdateStoryline(); } public void UpdateStoryline() { switch (prologueStorylineState) { case PrologueStorylineState.CheckLoad: HandleCheckLoadState(); break; case PrologueStorylineState.InsideCar: Debug.Log("Player is inside the car."); #region Logic //if (isLoadingPrologueRelated) //Handles initialization tasks required after the game has finished loading //{ // vechicleDrivable.SetActive(true); // vechicleStatic.SetActive(false); // isLoadingPrologueRelated = false; //} vechicleDrivable.SetActive(true); vechicleStatic.SetActive(false); SetupPlayer(playerNewGameStartPosition, enableCameraCarMovement: true, enablePlayerController: false, enableSanity: false); isLoadingPrologueRelated = false; #endregion SaveStorylineState(); break; case PrologueStorylineState.ExitedCar: Debug.Log("Player has exited the car."); #region Logic GameProgressManager.GetInstance().playerControllerShouldBeEnabledOnGameLoad = true; GameProgressManager.GetInstance().playerCameraControllerShouldBeEnabledOnGameLoad = true; prologueStorylineStatesData.prologueUpdateToTheNextStorylineState_Outside.SetActive(true); if (isLoadingPrologueRelated) //Handles initialization tasks required after the game has finished loading { vechicleDrivable.SetActive(false); vechicleStatic.SetActive(true); isLoadingPrologueRelated = false; } #endregion SaveStorylineState(); break; case PrologueStorylineState.OutsideHouse: Debug.Log("Player is outside the house."); prologueEventsData.PrologueOutsideHouseEvents.SetActive(true); if (isLoadingPrologueRelated) //Handles initialization tasks required after the game has finished loading { vechicleDrivable.SetActive(false); vechicleStatic.SetActive(true); isLoadingPrologueRelated = false; } SaveStorylineState(); break; default: Debug.LogWarning($"Unhandled storyline state: {prologueStorylineState}"); break; } } private void HandleCheckLoadState() { if (IsInitialCutscenePlayed()) { print("Try Load Saved State"); TryLoadSavedState(); } else //If started new game for the first time: { print("New game started"); PlayInitialCutscene(); SetupPlayer(playerNewGameStartPosition, enableCameraCarMovement: true, enablePlayerController: false, enableSanity: false); prologuePickupsData.mainEntranceKeyPickup.AddKeyToInventory(); //Adds key for to the inventory for the main entrance of the mansion. prologueSaveTriggersData.saveTriggerInsideCar_StartOfGame.gameObject.SetActive(true); UpdateToTheNextStorylineState(); } } private void PlayInitialCutscene() { Debug.Log("Playing initial cutscene..."); SetInitialCutscenePlayed(true); var gameProgressManager = GameProgressManager.GetInstance(); gameProgressManager.playerControllerShouldBeEnabledOnGameLoad = false; gameProgressManager.playerCameraControllerShouldBeEnabledOnGameLoad = true; } private void TryLoadSavedState() { if (Enum.TryParse(GameProgressManager.GetInstance().currentStorylineState, out PrologueStorylineState parsedState)) { prologueStorylineState = parsedState; Debug.Log("Try parsing prologue story line state"); UpdateStoryline(); } else { Debug.Log("Invalid saved storyline state. Defaulting to CheckLoad."); prologueStorylineState = PrologueStorylineState.CheckLoad; } } private void SetupPlayer(Transform newPosition, bool enableCameraCarMovement, bool enablePlayerController, bool enableSanity) { var playerManager = PlayerManager.GetInstance(); if (playerManager == null) { Debug.LogError("PlayerManager instance is missing!"); return; } playerManager.DisablePlayerMovement(); playerManager.playerGameObj.transform.position = newPosition.position; playerManager.playerGameObj.transform.rotation = newPosition.rotation; playerManager.playerGameObj.transform.SetParent(newPosition); playerManager._cameraMovement.cameraCarMovement = enableCameraCarMovement; GameProgressManager.GetInstance().playerSanityShouldBeEnabledOnGameLoad = false; PlayerManager.GetInstance().playerSanity.enabled = false; var gameProgressManager = GameProgressManager.GetInstance(); gameProgressManager.playerControllerShouldBeEnabledOnGameLoad = enablePlayerController; } private void CleanupPlayerSettings() { var playerManager = PlayerManager.GetInstance(); if (playerManager != null) { playerManager._cameraMovement.cameraCarMovement = false; playerManager.playerGameObj.transform.SetParent(null); } // Add other player cleanup tasks here } private void SaveStorylineState() { GameProgressManager.GetInstance().currentStorylineState = prologueStorylineState.ToString(); } private void NotifyCompletion() { GameManager.GetInstance().OnStorySectionComplete(GameManager.StoryState.Prologue); } private bool IsInitialCutscenePlayed() => GameProgressManager.GetInstance().initialCutscenePlayed; private void SetInitialCutscenePlayed(bool value) => GameProgressManager.GetInstance().initialCutscenePlayed = value; public void UpdateToTheNextStorylineState() { PrologueStorylineState[] allStates = (PrologueStorylineState[])Enum.GetValues(typeof(PrologueStorylineState)); int currentIndex = Array.IndexOf(allStates, prologueStorylineState); if (currentIndex < allStates.Length - 1) { prologueStorylineState = allStates[currentIndex + 1]; UpdateStoryline(); } else { Debug.Log("Prologue storyline is complete."); } } } [Serializable] public class PrologueStorylineStatesData { public GameObject prologueUpdateToTheNextStorylineState_Outside; } [Serializable] public class PrologueEventsData { public GameObject PrologueOutsideHouseEvents; } [Serializable] public class ProloguePickupsData { public KeyPickup mainEntranceKeyPickup; } [Serializable] public class PrologueSaveTriggersData { public SaveTrigger saveTriggerInsideCar_StartOfGame; }