You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

380 lines
15 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using SiegeSong;
namespace SiegeSong
{
public class MenuManager : MonoBehaviour
{
public SaveFileLoader SaveFileLoader;
public GameObject SavedGameListRowPrefab;
public GameObject MenuContainer;
public GameObject PauseMenuOptions;
public GameObject StartMenuOptions;
public GameObject SettingsSubMenuOptions;
public GameObject FileMenu;
public GameObject FileListDisplay;
public Text FileMetaDataDisplay;
public Image FilePreviewImageDisplay;
public MetaData[] SavedGames;
public bool MenuActive = true;
public Sprite DefaultImagePreview;
private string pauseGamepadInput = "Start";
private string menuVerticalGamepadInput = "D-Pad Vertical";
private string menuHorizontalGamepadInput = "D-Pad Horizontal";
private string menuConfirmGamepadInput = "A";
private string menuRejectGamepadInput = "B";
private bool oldConfirmState;
private bool oldRejectState;
private float oldVerticalState;
private float oldHorizontalState;
private bool oldSubmenuOpenState = false;
private int selectedIndex;
private int subMenuSelectedIndex;
private Color activeColor = Color.white;
private Color inactiveColor = Color.grey;
private int activeFontSize;
private int inactiveFontSize;
private bool saveLoadSubmenuOpen;
private bool settingsSubmenuOpen;
private bool saveLoadSubmenuInSavingMode;
private bool saveLoadHasDelayed = false;
private bool startMenu = true;
void Start() { }
void LateUpdate()
{
if (!MenuActive && Input.GetButton(pauseGamepadInput))
{
StartCoroutine(SaveFileLoader.TakeTemporaryScreenCapture());
MenuActive = true;
}
}
void Update()
{
MenuContainer.active = MenuActive;
FileMenu.active = saveLoadSubmenuOpen;
var newConfirmState = Input.GetButton(menuConfirmGamepadInput);
var newRejectState = Input.GetButton(menuRejectGamepadInput);
var newVerticalState = Input.GetAxis(menuVerticalGamepadInput);
var newHorizontalState = Input.GetAxis(menuHorizontalGamepadInput);
var newSubmenuOpenState = saveLoadSubmenuOpen || settingsSubmenuOpen;
if (MenuActive)
{
Time.timeScale = 0.0f;
SaveFileLoader.RuntimeManager.DePopulateReferences();
var menuOptions = startMenu ? StartMenuOptions : PauseMenuOptions;
StartMenuOptions.active = startMenu;
PauseMenuOptions.active = !startMenu;
for (var i = 0; i < menuOptions.transform.childCount; i++)
{
var childObject = menuOptions.transform.GetChild(i);
childObject.GetComponent<Text>().text = selectedIndex == i ? $"- {childObject.name} -" : childObject.name;
childObject.GetComponent<Text>().color = selectedIndex == i ? activeColor : inactiveColor;
childObject.GetComponent<Text>().fontSize = selectedIndex == i ? activeFontSize : inactiveFontSize;
}
if (oldVerticalState == 0.0f && newVerticalState < 0.0f)
{
if (saveLoadSubmenuOpen)
{
if (SavedGames.Length + (saveLoadSubmenuInSavingMode ? 1 : 0) > 0)
{
if (subMenuSelectedIndex == (saveLoadSubmenuOpen ? SavedGames.Length - 1 + (saveLoadSubmenuInSavingMode ? 1 : 0) : SettingsSubMenuOptions.transform.childCount - 1))
subMenuSelectedIndex = 0;
else
subMenuSelectedIndex++;
UpdateSaveLoadMetaDataTextDisplay();
UpdateSaveLoadSubmenu();
}
}
else
{
if (selectedIndex == menuOptions.transform.childCount - 1)
selectedIndex = 0;
else
selectedIndex++;
}
}
if (oldVerticalState == 0.0f && newVerticalState > 0.0f)
{
if (saveLoadSubmenuOpen)
{
if (SavedGames.Length + (saveLoadSubmenuInSavingMode ? 1 : 0) > 0)
{
if (subMenuSelectedIndex == 0)
subMenuSelectedIndex = saveLoadSubmenuOpen ? SavedGames.Length - 1 + (saveLoadSubmenuInSavingMode ? 1 : 0) : SettingsSubMenuOptions.transform.childCount - 1;
else
subMenuSelectedIndex--;
UpdateSaveLoadMetaDataTextDisplay();
UpdateSaveLoadSubmenu();
}
}
else
{
if (selectedIndex == 0)
selectedIndex = menuOptions.transform.childCount - 1;
else
selectedIndex--;
}
}
if ((!oldConfirmState && newConfirmState) || (oldHorizontalState == 0.0f && newHorizontalState > 0))
{
if (!saveLoadSubmenuOpen && !settingsSubmenuOpen)
{
if (startMenu)
{
switch (selectedIndex)
{
case 0:
StartNewGame();
break;
case 1:
OpenLoadingSubmenu();
break;
case 3:
OpenSettingsSubmenu();
break;
case 4:
ExitGame();
break;
}
}
else
{
switch (selectedIndex)
{
case 0:
ResumeGame();
break;
case 1:
OpenSavingSubmenu();
break;
case 2:
OpenLoadingSubmenu();
break;
case 3:
OpenSettingsSubmenu();
break;
case 4:
ExitGame();
break;
}
}
}
else if (saveLoadSubmenuOpen)
{
if (oldSubmenuOpenState)
{
if (saveLoadSubmenuInSavingMode)
SaveGame();
else
LoadGame();
}
}
}
if (newRejectState && !oldRejectState)
{
if (!saveLoadSubmenuOpen && !settingsSubmenuOpen)
ResumeGame();
else if (saveLoadSubmenuOpen)
saveLoadSubmenuOpen = false;
}
}
else
{
StartMenuOptions.active = false;
PauseMenuOptions.active = false;
}
oldSubmenuOpenState = newSubmenuOpenState;
oldConfirmState = newConfirmState;
oldRejectState = newRejectState;
oldHorizontalState = newHorizontalState;
oldVerticalState = newVerticalState;
}
void LoadGame()
{
SaveFileLoader.ActiveSaveFileLocation = $"{Application.persistentDataPath.Replace("/", "\\")}\\{SaveFileLoader.DirectoryName}\\{SavedGames[subMenuSelectedIndex].PlayerFullName.Replace(" ", "_")}_{SavedGames[subMenuSelectedIndex].FileNameSuffix}";
SaveFileLoader.LoadGameFile();
ResumeGame();
SaveFileLoader.RuntimeManager.PlayerActorInstance.GetComponentInChildren<NotificationManager>().Notify("Game Loaded!");
}
void SaveGame()
{
if (subMenuSelectedIndex == 0)
SaveFileLoader.SaveGameFile();
else
SaveFileLoader.SaveGameFile($"{Application.persistentDataPath.Replace("/", "\\")}\\{SaveFileLoader.DirectoryName}\\{SavedGames[subMenuSelectedIndex - 1].PlayerFullName.Replace(" ", "_")}_{SavedGames[subMenuSelectedIndex - 1].FileNameSuffix}");
ResumeGame();
SaveFileLoader.RuntimeManager.PlayerActorInstance.GetComponentInChildren<NotificationManager>().Notify("Game Saved!");
InitializeSaveLoadSubmenu();
}
void UpdateSaveLoadMetaDataTextDisplay()
{
var selectedSavedGame = !(saveLoadSubmenuInSavingMode && subMenuSelectedIndex == 0) ? SavedGames[subMenuSelectedIndex - (saveLoadSubmenuInSavingMode ? 1 : 0)] : new MetaData();
var filePath = $"{Application.persistentDataPath.Replace("/", "\\")}\\{SaveFileLoader.DirectoryName}\\{selectedSavedGame.PlayerFullName.Replace(" ", "_")}_{selectedSavedGame.FileNameSuffix}";
if (!saveLoadSubmenuInSavingMode)
SaveFileLoader.ActiveSaveFileLocation = filePath;
FileMetaDataDisplay.text = $"{selectedSavedGame.PlayerFullName}\n{selectedSavedGame.PlayerLevel}\n{selectedSavedGame.PlayerActiveQuestFriendlyName}\n{selectedSavedGame.InGameDate}\n{selectedSavedGame.LastPlayedOn}";
if (System.IO.File.Exists($"{filePath}.png"))
{
var imagePreviewData = System.IO.File.ReadAllBytes($"{filePath}.png");
var imagePreviewTexture = new Texture2D(selectedSavedGame.ScreenWidth, selectedSavedGame.ScreenHeight);
imagePreviewTexture.filterMode = FilterMode.Trilinear;
imagePreviewTexture.LoadImage(imagePreviewData);
var imagePreviewSprite = Sprite.Create(imagePreviewTexture, new Rect(0, 0, selectedSavedGame.ScreenWidth, selectedSavedGame.ScreenHeight), new Vector2(0.5f, 0.0f), 1.0f);
FilePreviewImageDisplay.sprite = imagePreviewSprite;
}
else
{
FilePreviewImageDisplay.sprite = DefaultImagePreview;
}
}
void StartNewGame()
{
startMenu = false;
MenuActive = false;
saveLoadSubmenuOpen = false;
settingsSubmenuOpen = false;
Time.timeScale = 1.0f;
SaveFileLoader.RunNewGameSetup();
}
void ResumeGame()
{
SaveFileLoader.RuntimeManager.PopulateReferences();
startMenu = false;
MenuActive = false;
saveLoadSubmenuOpen = false;
saveLoadSubmenuInSavingMode = false;
selectedIndex = 0;
subMenuSelectedIndex = 0;
Time.timeScale = 1.0f;
}
void InitializeSaveLoadSubmenu()
{
SavedGames = SaveFileLoader.GetSaveFilesMetaData();
UpdateSaveLoadSubmenu();
}
void UpdateSaveLoadSubmenu()
{
for (var i = 0; i < FileListDisplay.transform.childCount; i++)
if (FileListDisplay.transform.GetChild(i).gameObject.active)
GameObject.Destroy(FileListDisplay.transform.GetChild(i).gameObject);
else
FileListDisplay.transform.GetChild(i).gameObject.active = false;
for (var i = 0; i < SavedGames.Length + (saveLoadSubmenuInSavingMode ? 1 : 0); i++)
{
var rowSizeBuffer = 4;
var newRow = GameObject.Instantiate(SavedGameListRowPrefab);
var newRowText = newRow.GetComponent<Text>();
var newRowRect = newRow.GetComponent<RectTransform>();
newRow.active = true;
if (saveLoadSubmenuInSavingMode && i == 0)
{
if (subMenuSelectedIndex == 0)
{
newRowText.text = $"~ New Saved Game ~";
newRowText.color = activeColor;
}
else
{
newRowText.text = $"New Saved Game";
newRowText.color = inactiveColor;
}
}
else
{
var savedGame = SavedGames[i - (saveLoadSubmenuInSavingMode ? 1 : 0)];
if (i + (saveLoadSubmenuInSavingMode ? 1 : 0) == subMenuSelectedIndex + (saveLoadSubmenuInSavingMode ? 1 : 0))
{
newRowText.text = $"~ {savedGame.Title.Replace("_", " ")} ~";
newRowText.color = activeColor;
}
else
{
newRowText.text = $"{savedGame.Title.Replace("_", " ")}";
newRowText.color = inactiveColor;
}
}
newRowText.transform.parent = FileListDisplay.transform;
newRowText.transform.localScale = Vector3.one;
newRowRect.position = new Vector2(-300, (newRowText.fontSize + rowSizeBuffer) * -(i + 1 + (saveLoadSubmenuInSavingMode ? 1 : 0)));
newRowRect.offsetMin = new Vector2(-300, (newRowText.fontSize + rowSizeBuffer) * -(i + 1 + (saveLoadSubmenuInSavingMode ? 1 : 0)));
newRowRect.offsetMax = new Vector2(0, (newRowText.fontSize + rowSizeBuffer) * -(i + (saveLoadSubmenuInSavingMode ? 1 : 0)));
newRowRect.sizeDelta = new Vector2(250, (newRowText.fontSize + rowSizeBuffer));
}
UpdateSaveLoadMetaDataTextDisplay();
}
void OpenLoadingSubmenu()
{
subMenuSelectedIndex = 0;
saveLoadSubmenuOpen = true;
saveLoadSubmenuInSavingMode = false;
InitializeSaveLoadSubmenu();
}
void OpenSavingSubmenu()
{
subMenuSelectedIndex = 0;
saveLoadSubmenuOpen = true;
saveLoadSubmenuInSavingMode = true;
InitializeSaveLoadSubmenu();
}
void OpenSettingsSubmenu()
{
subMenuSelectedIndex = 0;
settingsSubmenuOpen = true;
}
void ExitGame()
{
if (startMenu)
startMenu = false;
else
Application.Quit();
}
}
}