Files
HauntedBloodlines/Assets/Scripts/Managers/Game/prologueManager.cs
2025-05-29 22:31:40 +03:00

258 lines
8.8 KiB
C#

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;
}