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 = 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.PlayerActorInstance.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.PlayerActorInstance.GetComponentInChildren().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(); 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 = 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(); } } }