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 = selectedIndex == i ? $"~ {childObject.name} ~" : childObject.name; childObject.GetComponent().color = selectedIndex == i ? activeColor : inactiveColor; childObject.GetComponent().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().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().Notify("Game Saved!"); } void UpdateSaveLoadMetaDataTextDisplay() { var selectedSavedGame = SavedGames != null && SavedGames.Length > 0 ? SavedGames[subMenuSelectedIndex] : 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(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(); var newRowRect = newRow.GetComponent(); 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(); } } }