|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|