258 lines
8.8 KiB
C#
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;
|
|
} |