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.

312 lines
12 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 MenuContainer;
public GameObject PauseMenuOptions;
public GameObject StartMenuOptions;
public GameObject SettingsSubMenuOptions;
public GameObject SaveLoadContainer;
public GameObject SaveLoadListDisplay;
public GameObject SaveLoadMetaDataTextDisplay;
public GameObject SaveLoadMetaDataImageDisplay;
public MetaData[] SavedGames;
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 menuOpen = true;
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 startMenu = true;
void Start() { }
void Update()
{
if (!menuOpen && Input.GetButton(pauseGamepadInput))
menuOpen = true;
MenuContainer.active = menuOpen;
SaveLoadContainer.active = saveLoadSubmenuOpen;
if (menuOpen)
{
Time.timeScale = 0.0f;
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;
}
var newConfirmState = Input.GetButton(menuConfirmGamepadInput);
var newRejectState = Input.GetButton(menuRejectGamepadInput);
var newMenuVerticalState = Input.GetAxis(menuVerticalGamepadInput);
var newMenuHorizontalState = Input.GetAxis(menuHorizontalGamepadInput);
if (oldVerticalState == 0 && newMenuVerticalState < 0)
{
if (saveLoadSubmenuOpen)
{
if (SavedGames.Length > (saveLoadSubmenuInSavingMode ? 1 : 0))
{
if (subMenuSelectedIndex == (saveLoadSubmenuOpen ? SavedGames.Length - 1 + (saveLoadSubmenuInSavingMode ? 1 : 0) : SettingsSubMenuOptions.transform.childCount - 1))
subMenuSelectedIndex = 0;
else
subMenuSelectedIndex++;
UpdateSaveLoadMetaDataTextDisplay();
}
}
else
{
if (selectedIndex == menuOptions.transform.childCount - 1)
selectedIndex = 0;
else
selectedIndex++;
}
}
if (oldVerticalState == 0 && newMenuVerticalState > 0)
{
if (saveLoadSubmenuOpen)
{
if (SavedGames.Length > (saveLoadSubmenuInSavingMode ? 1 : 0))
{
if (subMenuSelectedIndex == 0)
subMenuSelectedIndex = saveLoadSubmenuOpen ? SavedGames.Length - 1 + (saveLoadSubmenuInSavingMode ? 1 : 0) : SettingsSubMenuOptions.transform.childCount - 1;
else
subMenuSelectedIndex--;
UpdateSaveLoadMetaDataTextDisplay();
}
}
else
{
if (selectedIndex == 0)
selectedIndex = menuOptions.transform.childCount - 1;
else
selectedIndex--;
}
}
if ((!oldConfirmState && newConfirmState) || (oldHorizontalState == 0 && newMenuHorizontalState > 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 (saveLoadSubmenuInSavingMode)
SaveGame();
else
LoadGame();
}
}
if (newRejectState && !oldRejectState)
{
if (!saveLoadSubmenuOpen && !settingsSubmenuOpen)
ResumeGame();
else if (saveLoadSubmenuOpen)
saveLoadSubmenuOpen = false;
}
oldConfirmState = newConfirmState;
oldRejectState = newRejectState;
oldHorizontalState = newMenuHorizontalState;
oldVerticalState = newMenuVerticalState;
}
else
{
StartMenuOptions.active = false;
PauseMenuOptions.active = false;
}
}
void LoadGame()
{
SaveFileLoader.ActiveSaveFileLocation = $"{Application.persistentDataPath}\\{SaveFileLoader.DirectoryName}\\{SavedGames[subMenuSelectedIndex].PlayerFullName}_{SavedGames[subMenuSelectedIndex].FileNameSuffix}";
SaveFileLoader.LoadGameFile();
ResumeGame();
SaveFileLoader.RuntimeManager.PlayerInstance.GetComponentInChildren<NotificationManager>().Notify("Game Loaded!");
}
void SaveGame()
{
if (subMenuSelectedIndex == 0)
SaveFileLoader.SaveGameFile();
else
SaveFileLoader.SaveGameFile($"{Application.persistentDataPath}\\{SaveFileLoader.DirectoryName}\\{SavedGames[subMenuSelectedIndex].PlayerFullName}_{SavedGames[subMenuSelectedIndex].FileNameSuffix}");
ResumeGame();
SaveFileLoader.RuntimeManager.PlayerInstance.GetComponentInChildren<NotificationManager>().Notify("Game Saved!");
}
void UpdateSaveLoadMetaDataTextDisplay()
{
var selectedSavedGame = SavedGames != null && SavedGames.Length > 0 ? SavedGames[subMenuSelectedIndex] : new MetaData();
SaveLoadMetaDataTextDisplay.GetComponent<Text>().text = $"{selectedSavedGame.PlayerFullName}\n{selectedSavedGame.PlayerLevel}\n{selectedSavedGame.PlayerActiveQuestFriendlyName}\n{selectedSavedGame.InGameDate}\n{selectedSavedGame.LastPlayedOn}";
}
void StartNewGame()
{
startMenu = false;
menuOpen = false;
saveLoadSubmenuOpen = false;
settingsSubmenuOpen = false;
Time.timeScale = 1.0f;
SaveFileLoader.RunNewGameSetup();
}
void ResumeGame()
{
menuOpen = false;
saveLoadSubmenuOpen = false;
saveLoadSubmenuInSavingMode = false;
selectedIndex = 0;
subMenuSelectedIndex = 0;
Time.timeScale = 1.0f;
}
void InitializeSaveLoadSubmenu()
{
SavedGames = SaveFileLoader.GetSaveFilesMetaData(saveLoadSubmenuInSavingMode);
var savedGameListRow = SaveLoadListDisplay.transform.GetChild(0).gameObject;
for (var i = 0; i < SavedGames.Length; i++)
{
var savedGame = SavedGames[i];
var rowSizeBuffer = 4;
var newRow = GameObject.Instantiate(savedGameListRow);
var newRowText = newRow.GetComponent<Text>();
var newRowRect = newRow.GetComponent<RectTransform>();
savedGameListRow.active = false;
newRow.active = true;
if (i == subMenuSelectedIndex)
{
newRowText.text = $"- {savedGame.Title.Replace("_", " ")} -";
newRowText.color = activeColor;
}
else
{
newRowText.text = $"{savedGame.Title.Replace("_", " ")}";
newRowText.color = inactiveColor;
}
newRowText.transform.parent = SaveLoadListDisplay.transform;
newRowText.transform.localScale = Vector3.one;
newRowRect.position = new Vector2(-300, (newRowText.fontSize + rowSizeBuffer) * -(i + 1));
newRowRect.offsetMin = new Vector2(-300, (newRowText.fontSize + rowSizeBuffer) * -(i + 1));
newRowRect.offsetMax = new Vector2(0, (newRowText.fontSize + rowSizeBuffer) * -(i));
newRowRect.sizeDelta = new Vector2(250, (newRowText.fontSize + rowSizeBuffer));
}
UpdateSaveLoadMetaDataTextDisplay();
}
void OpenLoadingSubmenu()
{
if (SavedGames == null || SavedGames.Length == 0)
InitializeSaveLoadSubmenu();
saveLoadSubmenuInSavingMode = false;
saveLoadSubmenuOpen = true;
subMenuSelectedIndex = 0;
}
void OpenSavingSubmenu()
{
if (SavedGames == null || SavedGames.Length == 0)
InitializeSaveLoadSubmenu();
saveLoadSubmenuInSavingMode = true;
saveLoadSubmenuOpen = true;
subMenuSelectedIndex = 0;
}
void OpenSettingsSubmenu()
{
settingsSubmenuOpen = true;
subMenuSelectedIndex = 0;
}
void ExitGame()
{
startMenu = false;
if (startMenu)
startMenu = false;
else
Application.Quit();
}
}
}