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 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 oldSubmenuOpenState = false; 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 saveLoadHasDelayed = false; private bool startMenu = true; void Start() { } void Update() { if (!menuOpen && Input.GetButton(pauseGamepadInput)) menuOpen = true; MenuContainer.active = menuOpen; SaveLoadContainer.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 (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 = selectedIndex == i ? $"- {childObject.name} -" : childObject.name; childObject.GetComponent().color = selectedIndex == i ? activeColor : inactiveColor; childObject.GetComponent().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.PlayerInstance.GetComponentInChildren().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.PlayerInstance.GetComponentInChildren().Notify("Game Saved!"); InitializeSaveLoadSubmenu(); } void UpdateSaveLoadMetaDataTextDisplay() { var selectedSavedGame = !(saveLoadSubmenuInSavingMode && subMenuSelectedIndex == 0) ? SavedGames[subMenuSelectedIndex - (saveLoadSubmenuInSavingMode ? 1 : 0)] : new MetaData(); SaveLoadMetaDataTextDisplay.GetComponent().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(); UpdateSaveLoadSubmenu(); } void UpdateSaveLoadSubmenu() { for (var i = 0; i < SaveLoadListDisplay.transform.childCount; i++) if (SaveLoadListDisplay.transform.GetChild(i).gameObject.active) GameObject.Destroy(SaveLoadListDisplay.transform.GetChild(i).gameObject); else SaveLoadListDisplay.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(); var newRowRect = newRow.GetComponent(); 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 = SaveLoadListDisplay.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() { startMenu = false; if (startMenu) startMenu = false; else Application.Quit(); } } }