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