Files
aibis-dream/Assets/Scripts/UI/Terminal/TerminalStartPanel.cs
T

204 lines
5.7 KiB
C#

using System;
using AibisDream;
using AibisDream.SaveSystem;
using UnityEngine;
namespace AibisDream.UI
{
public class TerminalStartPanel : MonoBehaviour
{
[SerializeField] private TerminalPanelAnimator panelAnimator;
[SerializeField] private TerminalMenuItemView continueGameItem;
[SerializeField] private TerminalMenuItemView newGameItem;
[SerializeField] private TerminalMenuItemView chapterItem;
[SerializeField] private TerminalMenuItemView settingItem;
[SerializeField] private TerminalMenuItemView quitItem;
private TerminalPanel _owner;
private TerminalMenuItemView _selectedItem;
public bool IsOpen => gameObject.activeSelf;
public void SetOwner(TerminalPanel owner)
{
_owner = owner;
}
private void Awake()
{
InitMenuItems();
RegisterItem(continueGameItem, ContinueGame);
RegisterItem(newGameItem, StartNewGame);
RegisterItem(chapterItem, OpenChapter);
RegisterItem(settingItem, OpenSetting);
RegisterItem(quitItem, QuitApp);
}
private void OnDestroy()
{
UnregisterItem(continueGameItem);
UnregisterItem(newGameItem);
UnregisterItem(chapterItem);
UnregisterItem(settingItem);
UnregisterItem(quitItem);
}
public void Show()
{
RefreshContinueVisibility();
if (panelAnimator != null)
{
panelAnimator.Show(prepare: () => _owner?.SetHeader("termnial_header_start", "REPAIR_STATION_07 - AUTH_VERIFIED"));
}
else
{
_owner?.SetHeader("termnial_header_start", "REPAIR_STATION_07 - AUTH_VERIFIED");
gameObject.SetActive(true);
}
}
public void Hide(Action onComplete = null)
{
if (panelAnimator != null)
{
panelAnimator.Hide(onComplete);
}
else
{
gameObject.SetActive(false);
onComplete?.Invoke();
}
}
private void InitMenuItems()
{
continueGameItem?.SetContent("start_continue", "SESSION RESUME", BuildContinueDetail());
newGameItem?.SetContent("start_newGame", "SESSION CREATE", "STATUS: ACTIVE");
chapterItem?.SetContent("start_selcetLevel", "HISTORY QUERY", "RANGE: 04/533");
settingItem?.SetContent("start_setting", "USER CONFIG", "AUTH: LOCAL");
quitItem?.SetContent("start_quit", "SESSION CLOSE", "LOG: SAVED");
}
private void RefreshContinueVisibility()
{
if (continueGameItem == null)
{
return;
}
var hasAutoSave = SlotManager.HasAutoSave();
continueGameItem.gameObject.SetActive(hasAutoSave);
if (!hasAutoSave)
{
if (_selectedItem == continueGameItem)
{
_selectedItem = null;
}
return;
}
continueGameItem.SetContent("start_continue", "SESSION RESUME", BuildContinueDetail());
if (_selectedItem == null || _selectedItem == continueGameItem)
{
SelectItem(continueGameItem);
}
}
private static string BuildContinueDetail()
{
var meta = SlotManager.LoadMeta(SlotIndex.Auto);
if (meta == null)
{
return "STATUS: READY";
}
if (!string.IsNullOrEmpty(meta.sceneSoName))
{
return $"LAST: {meta.sceneSoName}";
}
if (!string.IsNullOrEmpty(meta.savedAt))
{
return $"LAST: {meta.savedAt}";
}
return "STATUS: READY";
}
private void RegisterItem(TerminalMenuItemView item, Action action)
{
if (item == null)
{
return;
}
item.Hovered += SelectItem;
item.Clicked += _ => action?.Invoke();
}
private void UnregisterItem(TerminalMenuItemView item)
{
if (item == null)
{
return;
}
item.Hovered -= SelectItem;
}
private void SelectItem(TerminalMenuItemView item)
{
if (_selectedItem != null)
{
_selectedItem.SetSelected(false);
}
_selectedItem = item;
_selectedItem?.SetSelected(true);
}
private static void ContinueGame()
{
var terminal = UIManager.Instance.GetPanel<TerminalPanel>();
if (terminal != null && terminal.IsOpen)
{
terminal.CloseThen(() => GameManager.Instance.TryRestoreSlot(SlotIndex.Auto));
return;
}
GameManager.Instance.TryRestoreSlot(SlotIndex.Auto);
}
private static void StartNewGame()
{
var terminal = UIManager.Instance.GetPanel<TerminalPanel>();
if (terminal != null && terminal.IsOpen)
{
terminal.CloseThen(() => GameManager.Instance.TryStartNewGame());
return;
}
GameManager.Instance.TryStartNewGame();
}
private void OpenChapter()
{
_owner.SwitchTo(TerminalPage.Chapter);
}
private void OpenSetting()
{
_owner.SwitchTo(TerminalPage.Setting);
}
private static void QuitApp()
{
GameManager.Instance.QuitApplication();
}
}
}