Restructured for new direction.

This commit is contained in:
2026-05-12 12:01:09 +01:00
parent 0439b6c1d2
commit c203f836b1
1134 changed files with 125569 additions and 213519 deletions

View File

@@ -1,53 +1,59 @@
using System;
using System.Threading;
using BriarQueen.Framework.Coordinators.Events;
using BriarQueen.Framework.Effects;
using BriarQueen.Framework.Events.UI;
using BriarQueen.Framework.Managers.Input;
using BriarQueen.Framework.Managers.UI.Events;
using BriarQueen.Framework.Services.Game;
using BriarQueen.Game.Effects;
using BriarQueen.UI.Menus.Components;
using Cysharp.Threading.Tasks;
using PrimeTween;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Serialization;
using UnityEngine.UI;
using VContainer;
namespace BriarQueen.UI.Menus
{
/// <summary>
/// Main Menu flow:
/// - Starts on intro screen
/// - Intro light pulses
/// - Intro text/title fade in after delay
/// - Submit fades intro text/title out, pushes light to full alpha, then fades main menu in
/// - Start Game => opens SelectSaveWindow
/// - Settings => opens settings menu
/// - Quit => quits app
/// </summary>
public class MainMenuWindow : MonoBehaviour
{
[Header("Main Menu Window")]
[SerializeField]
private CanvasGroup _mainMenuIntroScreenCanvasGroup;
[SerializeField]
private CanvasGroup _mainMenuWindowCanvasGroup;
[Header("Intro Screen")]
[SerializeField]
private Image _introScreenLightImage;
[FormerlySerializedAs("_mainMenuIntroScreenCanvasGroup")]
private CanvasGroup _introScreenCanvas;
[SerializeField]
private CanvasGroup _introTextCanvasGroup;
[FormerlySerializedAs("_introTextText")]
private TextMeshProUGUI _pressStartText;
[SerializeField]
private TextMeshProUGUI _introTextText;
private UIDissolveImage _introGroupDissolveGroup;
[Header("Main Menu")]
[SerializeField]
private CanvasGroup _introTitleCanvasGroup;
[FormerlySerializedAs("_mainMenuWindowCanvasGroup")]
private CanvasGroup _mainMenuGroup;
[Header("Buttons")]
[SerializeField]
private CanvasGroup _buttonsGroup;
[SerializeField]
private AnimatedSelectionButtonGroup _mainMenuSelectionGroup;
[SerializeField]
private AnimatedSelectionButton _startGameSelectionButton;
[SerializeField]
private AnimatedSelectionButton _settingsSelectionButton;
[SerializeField]
private AnimatedSelectionButton _quitSelectionButton;
[SerializeField]
private Button _startGameButton;
@@ -61,62 +67,62 @@ namespace BriarQueen.UI.Menus
[SerializeField]
private SelectSaveWindow _selectSaveWindow;
[SerializeField]
private CanvasGroup _selectSaveContainerCanvasGroup;
[SerializeField]
private CanvasGroup _selectSaveWindowCanvasGroup;
[SerializeField]
private UIFogReveal _selectSaveWindowFog;
[Header("Tween Settings")]
[SerializeField]
private TweenSettings _selectSaveTweenSettings = new()
{
duration = 0.25f,
ease = Ease.OutQuad,
duration = 0.25f,
ease = Ease.OutQuad,
useUnscaledTime = true
};
[Header("Intro Timing")]
[SerializeField]
private float _introLightPulseDuration = 2f;
private TweenSettings _pressStartFadeTweenSettings = new()
{
duration = 0.25f,
ease = Ease.OutQuad,
useUnscaledTime = true
};
[SerializeField]
private float _introTextDelaySeconds = 1.5f;
private TweenSettings _pressStartPulseTweenSettings = new()
{
duration = 0.85f,
ease = Ease.InOutSine,
useUnscaledTime = true
};
[SerializeField]
private float _introTextFadeInDuration = 0.8f;
[SerializeField]
private float _introTextPulseDuration = 1.4f;
[SerializeField]
private float _introSubmitTextFadeOutDuration = 0.25f;
[SerializeField]
private float _introSubmitLightToFullDuration = 0.75f;
[SerializeField]
private float _introToMenuCrossfadeDuration = 0.6f;
private EventCoordinator _eventCoordinator;
private GameService _gameService;
private InputManager _inputManager;
[Range(0f, 1f)]
private float _pressStartPulseMinimumAlpha = 0.25f;
private CancellationTokenSource _introCts;
private CancellationTokenSource _selectSaveCts;
private Sequence _introLightPulseSequence;
private Sequence _introTextPulseSequence;
private Sequence _introTransitionSequence;
private Sequence _selectSaveSequence;
private EventCoordinator _eventCoordinator;
private GameService _gameService;
private InputManager _inputManager;
private Sequence _pressStartFadeSequence;
private Sequence _pressStartPulseSequence;
private Sequence _selectSaveSequence;
private bool _introFinished;
private bool _introTransitioning;
private DeviceInputType _lastDeviceInputType;
[Inject]
public void Construct(GameService gameService, EventCoordinator eventCoordinator, InputManager inputManager)
{
_gameService = gameService;
_gameService = gameService;
_eventCoordinator = eventCoordinator;
_inputManager = inputManager;
_inputManager = inputManager;
}
private void Awake()
@@ -128,8 +134,6 @@ namespace BriarQueen.UI.Menus
_selectSaveWindow.OnCloseWindow += CloseSelectSaveWindow;
_selectSaveWindow.gameObject.SetActive(false);
}
UpdateSubmitText(force: true);
}
private void OnEnable()
@@ -138,8 +142,23 @@ namespace BriarQueen.UI.Menus
_eventCoordinator?.PublishImmediate(new UIToggleHudEvent(false));
_inputManager?.BindSubmitForStart(OnIntroSubmit);
_eventCoordinator?.Subscribe<UIBackRequestedEvent>(OnBackRequested);
StartIntroScreen().Forget();
ApplyInitialVisualState();
}
private void Update()
{
if (_introFinished || _introTransitioning)
{
return;
}
if (Mouse.current?.leftButton.wasPressedThisFrame == true ||
Gamepad.current?.buttonSouth.wasPressedThisFrame == true)
{
TransitionFromIntroToMainMenu().Forget();
}
}
private void OnDisable()
@@ -147,6 +166,7 @@ namespace BriarQueen.UI.Menus
UnbindButtons();
_inputManager?.ResetSubmitBind(OnIntroSubmit);
_eventCoordinator?.Unsubscribe<UIBackRequestedEvent>(OnBackRequested);
StopIntroTweens();
StopSelectSaveTween();
@@ -155,300 +175,137 @@ namespace BriarQueen.UI.Menus
private void OnDestroy()
{
if (_selectSaveWindow != null)
{
_selectSaveWindow.OnCloseWindow -= CloseSelectSaveWindow;
}
StopIntroTweens();
StopSelectSaveTween();
}
private void LateUpdate()
{
UpdateSubmitText();
}
private void BindButtons()
{
if (_startGameButton != null)
_startGameButton.onClick.AddListener(OnStartClicked);
var startGameButton = ResolveButton(_startGameSelectionButton, _startGameButton);
if (startGameButton != null)
{
startGameButton.onClick.AddListener(OnStartClicked);
}
if (_settingsButton != null)
_settingsButton.onClick.AddListener(OnSettingsClicked);
var settingsButton = ResolveButton(_settingsSelectionButton, _settingsButton);
if (settingsButton != null)
{
settingsButton.onClick.AddListener(OnSettingsClicked);
}
if (_quitButton != null)
_quitButton.onClick.AddListener(OnQuitClicked);
var quitButton = ResolveButton(_quitSelectionButton, _quitButton);
if (quitButton != null)
{
quitButton.onClick.AddListener(OnQuitClicked);
}
}
private void UnbindButtons()
{
if (_startGameButton != null)
_startGameButton.onClick.RemoveListener(OnStartClicked);
var startGameButton = ResolveButton(_startGameSelectionButton, _startGameButton);
if (startGameButton != null)
{
startGameButton.onClick.RemoveListener(OnStartClicked);
}
if (_settingsButton != null)
_settingsButton.onClick.RemoveListener(OnSettingsClicked);
var settingsButton = ResolveButton(_settingsSelectionButton, _settingsButton);
if (settingsButton != null)
{
settingsButton.onClick.RemoveListener(OnSettingsClicked);
}
if (_quitButton != null)
_quitButton.onClick.RemoveListener(OnQuitClicked);
var quitButton = ResolveButton(_quitSelectionButton, _quitButton);
if (quitButton != null)
{
quitButton.onClick.RemoveListener(OnQuitClicked);
}
}
private void ApplyInitialVisualState()
{
SetCanvasGroupState(_mainMenuIntroScreenCanvasGroup, 1f, true);
SetCanvasGroupState(_mainMenuWindowCanvasGroup, 0f, false);
SetCanvasGroupState(_introTextCanvasGroup, 0f, false);
SetCanvasGroupState(_introTitleCanvasGroup, 0f, false);
SetCanvasGroupState(_selectSaveWindowCanvasGroup, 0f, false);
if (_introScreenLightImage != null)
{
var color = _introScreenLightImage.color;
color.a = 0f;
_introScreenLightImage.color = color;
}
}
private void UpdateSubmitText(bool force = false)
{
if (_introTextText == null || _inputManager == null)
return;
var currentDevice = _inputManager.DeviceInputType;
if (!force && currentDevice == _lastDeviceInputType)
return;
_lastDeviceInputType = currentDevice;
var isKeyboardMouse = currentDevice == DeviceInputType.KeyboardAndMouse;
_introTextText.text = isKeyboardMouse
? "Press Enter to begin."
: "Press Start to begin.";
}
private async UniTaskVoid StartIntroScreen()
{
_introFinished = false;
_introFinished = false;
_introTransitioning = false;
ResetIntroCtsAndCancelRunning();
ApplyInitialVisualState();
UpdateSubmitText(force: true);
try
SetCanvasGroupState(_introScreenCanvas, 1f, true);
if (_introScreenCanvas != null)
{
StartIntroLightPulse(_introCts.Token);
await StartIntroTextFlow(_introCts.Token);
}
catch (OperationCanceledException)
{
}
}
private void StartIntroLightPulse(CancellationToken token)
{
if (_introScreenLightImage == null)
return;
_introLightPulseSequence = Sequence.Create(
useUnscaledTime: true,
cycleMode: Sequence.SequenceCycleMode.Yoyo,
cycles: -1)
.Group(Tween.Alpha(_introScreenLightImage, new TweenSettings<float>
{
startValue = _introScreenLightImage.color.a,
endValue = 1f,
settings = new TweenSettings
{
duration = _introLightPulseDuration,
ease = Ease.InOutSine,
useUnscaledTime = true
}
}));
_introLightPulseSequence.ToUniTask(cancellationToken: token).Forget();
}
private async UniTask StartIntroTextFlow(CancellationToken token)
{
await UniTask.Delay(TimeSpan.FromSeconds(_introTextDelaySeconds), cancellationToken: token);
var fadeInSequence = Sequence.Create(useUnscaledTime: true);
if (_introTitleCanvasGroup != null)
{
fadeInSequence.Group(Tween.Alpha(_introTitleCanvasGroup, new TweenSettings<float>
{
startValue = 0f,
endValue = 1f,
settings = new TweenSettings
{
duration = _introTextFadeInDuration,
ease = Ease.OutQuad,
useUnscaledTime = true
}
}));
_introScreenCanvas.gameObject.SetActive(true);
}
if (_introTextCanvasGroup != null)
SetCanvasGroupState(_mainMenuGroup, 1f, false);
if (_mainMenuGroup != null)
{
fadeInSequence.Group(Tween.Alpha(_introTextCanvasGroup, new TweenSettings<float>
{
startValue = 0f,
endValue = 1f,
settings = new TweenSettings
{
duration = _introTextFadeInDuration,
ease = Ease.OutQuad,
useUnscaledTime = true
}
}));
_mainMenuGroup.gameObject.SetActive(true);
}
await fadeInSequence.ToUniTask(cancellationToken: token);
SetCanvasGroupState(_selectSaveContainerCanvasGroup, 0f, false);
SetCanvasGroupState(_selectSaveWindowCanvasGroup, 0f, false);
if (_introTextCanvasGroup == null)
return;
if (_pressStartText != null)
{
var color = _pressStartText.color;
color.a = 1f;
_pressStartText.color = color;
_pressStartText.gameObject.SetActive(true);
}
_introTextPulseSequence = Sequence.Create(
useUnscaledTime: true,
cycleMode: Sequence.SequenceCycleMode.Yoyo,
cycles: -1)
.Group(Tween.Alpha(_introTextCanvasGroup, new TweenSettings<float>
{
startValue = _introTextCanvasGroup.alpha,
endValue = 0.1f,
settings = new TweenSettings
{
duration = _introTextPulseDuration,
ease = Ease.InOutSine,
useUnscaledTime = true
}
}));
await _introTextPulseSequence.ToUniTask(cancellationToken: token);
StartPressStartPulse();
_introGroupDissolveGroup?.SetDissolveAmount(0f);
_selectSaveWindowFog?.FogSet(0f);
}
private void OnIntroSubmit(InputAction.CallbackContext ctx)
{
if (_introFinished || _introTransitioning)
{
return;
}
if (!ctx.performed)
{
return;
}
TransitionFromIntroToMainMenu().Forget();
}
private void OnBackRequested(UIBackRequestedEvent _)
{
if (!_introFinished || _selectSaveWindow == null || _selectSaveWindowCanvasGroup == null)
{
return;
}
if (!_selectSaveWindow.gameObject.activeInHierarchy || !_selectSaveWindowCanvasGroup.interactable)
{
return;
}
_selectSaveWindow.HandleBackRequest();
}
private async UniTaskVoid TransitionFromIntroToMainMenu()
{
if (_introFinished || _introTransitioning)
{
return;
}
_introTransitioning = true;
ResetIntroCtsAndCancelRunning();
try
{
// Phase 1: fade intro title + text fully out together, while pushing light to full.
var introElementsSequence = Sequence.Create(useUnscaledTime: true);
var fadeTextTask = FadeOutPressStartText(_introCts.Token);
var dissolveTask = _introGroupDissolveGroup != null
? _introGroupDissolveGroup.DissolveOut(false).AttachExternalCancellation(_introCts.Token)
: UniTask.CompletedTask;
if (_introTitleCanvasGroup != null)
{
introElementsSequence.Group(Tween.Alpha(_introTitleCanvasGroup, new TweenSettings<float>
{
startValue = _introTitleCanvasGroup.alpha,
endValue = 0f,
settings = new TweenSettings
{
duration = _introSubmitTextFadeOutDuration,
ease = Ease.OutQuad,
useUnscaledTime = true
}
}));
}
if (_introTextCanvasGroup != null)
{
introElementsSequence.Group(Tween.Alpha(_introTextCanvasGroup, new TweenSettings<float>
{
startValue = _introTextCanvasGroup.alpha,
endValue = 0f,
settings = new TweenSettings
{
duration = _introSubmitTextFadeOutDuration,
ease = Ease.OutQuad,
useUnscaledTime = true
}
}));
}
if (_introScreenLightImage != null)
{
introElementsSequence.Group(Tween.Alpha(_introScreenLightImage, new TweenSettings<float>
{
startValue = _introScreenLightImage.color.a,
endValue = 1f,
settings = new TweenSettings
{
duration = _introSubmitLightToFullDuration,
ease = Ease.OutQuad,
useUnscaledTime = true
}
}));
}
await introElementsSequence.ToUniTask(cancellationToken: _introCts.Token);
// Ensure intro text/title are fully gone before menu begins fading in.
SetCanvasGroupState(_introTitleCanvasGroup, 0f, false);
SetCanvasGroupState(_introTextCanvasGroup, 0f, false);
SetCanvasGroupState(_mainMenuWindowCanvasGroup, 0f, false);
// Phase 2: only after intro text/title have finished fading, crossfade to main menu.
if (_mainMenuIntroScreenCanvasGroup != null && _mainMenuWindowCanvasGroup != null)
{
_introTransitionSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.Alpha(_mainMenuIntroScreenCanvasGroup, new TweenSettings<float>
{
startValue = _mainMenuIntroScreenCanvasGroup.alpha,
endValue = 0f,
settings = new TweenSettings
{
duration = _introToMenuCrossfadeDuration,
ease = Ease.OutQuad,
useUnscaledTime = true
}
}))
.Group(Tween.Alpha(_mainMenuWindowCanvasGroup, new TweenSettings<float>
{
startValue = 0f,
endValue = 1f,
settings = new TweenSettings
{
duration = _introToMenuCrossfadeDuration,
ease = Ease.OutQuad,
useUnscaledTime = true
}
}));
await _introTransitionSequence.ToUniTask(cancellationToken: _introCts.Token);
}
else if (_mainMenuWindowCanvasGroup != null)
{
var menuFade = Sequence.Create(useUnscaledTime: true)
.Group(Tween.Alpha(_mainMenuWindowCanvasGroup, new TweenSettings<float>
{
startValue = 0f,
endValue = 1f,
settings = new TweenSettings
{
duration = _introToMenuCrossfadeDuration,
ease = Ease.OutQuad,
useUnscaledTime = true
}
}));
await menuFade.ToUniTask(cancellationToken: _introCts.Token);
}
await UniTask.WhenAll(fadeTextTask, dissolveTask);
}
catch (OperationCanceledException)
{
@@ -457,28 +314,73 @@ namespace BriarQueen.UI.Menus
}
finally
{
_introTransitionSequence = default;
_pressStartFadeSequence = default;
}
SetCanvasGroupState(_introTextCanvasGroup, 0f, false);
SetCanvasGroupState(_introTitleCanvasGroup, 0f, false);
SetCanvasGroupState(_mainMenuIntroScreenCanvasGroup, 0f, false);
SetCanvasGroupState(_mainMenuWindowCanvasGroup, 1f, true);
if (_introScreenLightImage != null)
SetCanvasGroupState(_introScreenCanvas, 0f, false);
if (_introScreenCanvas != null)
{
var color = _introScreenLightImage.color;
color.a = 1f;
_introScreenLightImage.color = color;
_introScreenCanvas.gameObject.SetActive(false);
}
_introFinished = true;
if (_mainMenuGroup != null)
{
_mainMenuGroup.gameObject.SetActive(true);
}
SetCanvasGroupState(_mainMenuGroup, 1f, true);
_introFinished = true;
_introTransitioning = false;
_mainMenuSelectionGroup?.SelectIndex(0, true);
}
private async UniTask FadeOutPressStartText(CancellationToken token)
{
if (_pressStartText == null)
{
return;
}
_pressStartFadeSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.Alpha(_pressStartText, new TweenSettings<float>
{
startValue = _pressStartText.color.a,
endValue = 0f,
settings = _pressStartFadeTweenSettings
}));
await _pressStartFadeSequence.ToUniTask(cancellationToken: token);
var color = _pressStartText.color;
color.a = 0f;
_pressStartText.color = color;
_pressStartText.gameObject.SetActive(false);
}
private void StartPressStartPulse()
{
StopSequence(ref _pressStartPulseSequence);
if (_pressStartText == null)
{
return;
}
_pressStartPulseSequence = Sequence.Create(
useUnscaledTime: true,
cycleMode: Sequence.SequenceCycleMode.Yoyo,
cycles: -1)
.Group(Tween.Alpha(_pressStartText, new TweenSettings<float>
{
startValue = _pressStartText.color.a,
endValue = _pressStartPulseMinimumAlpha,
settings = _pressStartPulseTweenSettings
}));
}
private void OnStartClicked()
{
Debug.Log("[MainMenuWindow] Starting game");
ShowSelectSaveWindow().Forget();
}
@@ -494,40 +396,49 @@ namespace BriarQueen.UI.Menus
private async UniTask ShowSelectSaveWindow()
{
Debug.Log("[MainMenuWindow] Showing select save window");
if (_selectSaveWindow == null || _selectSaveWindowCanvasGroup == null)
{
Debug.Log("[MainMenuWindow] SelectSaveWindow references not set.");
return;
}
ResetSelectSaveCtsAndCancelRunning();
_selectSaveWindow.gameObject.SetActive(true);
_selectSaveWindowCanvasGroup.alpha = 0f;
_selectSaveWindow.transform.localScale = Vector3.zero;
_selectSaveWindow.Refresh();
SetCanvasGroupState(_mainMenuWindowCanvasGroup, _mainMenuWindowCanvasGroup != null ? _mainMenuWindowCanvasGroup.alpha : 0f, false);
SetCanvasGroupState(_selectSaveWindowCanvasGroup, 0f, false);
SetCanvasGroupState(_selectSaveContainerCanvasGroup, 0f, false);
SetCanvasGroupState(_selectSaveWindowCanvasGroup, 1f, false); // visible but not interactable yet
SetCanvasGroupInteractivity(_mainMenuGroup, false);
_selectSaveSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.Alpha(_selectSaveWindowCanvasGroup, new TweenSettings<float>
{
startValue = _selectSaveWindowCanvasGroup.alpha,
endValue = 1f,
settings = _selectSaveTweenSettings
}))
.Group(Tween.Scale(_selectSaveWindow.transform, new TweenSettings<Vector3>
{
startValue = _selectSaveWindow.transform.localScale,
endValue = Vector3.one,
settings = _selectSaveTweenSettings
}));
if (_selectSaveWindowCanvasGroup != null)
{
_selectSaveWindowFog.FogAmount = 0.2f;
_selectSaveWindowFog.MaxFog = 0.4f;
}
try
{
// Step 1: fog rolls in fully
if (_selectSaveWindowFog != null)
{
await _selectSaveWindowFog.FogIn().AttachExternalCancellation(_selectSaveCts.Token);
}
_selectSaveSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.Alpha(_selectSaveContainerCanvasGroup, new TweenSettings<float>
{
startValue = 0f,
endValue = 1f,
settings = _selectSaveTweenSettings
}))
.Group(Tween.Alpha(_buttonsGroup, new TweenSettings<float>
{
startValue = _buttonsGroup.alpha,
endValue = 0f,
settings = _selectSaveTweenSettings
}));
await _selectSaveSequence.ToUniTask(cancellationToken: _selectSaveCts.Token);
}
catch (OperationCanceledException)
@@ -539,7 +450,9 @@ namespace BriarQueen.UI.Menus
_selectSaveSequence = default;
}
SetCanvasGroupState(_selectSaveWindowCanvasGroup, 1f, true);
// Step 3: tween complete — enable interaction
SetCanvasGroupInteractivity(_selectSaveContainerCanvasGroup, true);
SetCanvasGroupInteractivity(_selectSaveWindowCanvasGroup, true);
}
private void CloseSelectSaveWindow()
@@ -550,28 +463,40 @@ namespace BriarQueen.UI.Menus
private async UniTask CloseSelectSaveWindowInternal()
{
if (_selectSaveWindow == null || _selectSaveWindowCanvasGroup == null)
{
return;
}
ResetSelectSaveCtsAndCancelRunning();
SetCanvasGroupState(_selectSaveWindowCanvasGroup, _selectSaveWindowCanvasGroup.alpha, false);
_selectSaveSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.Alpha(_selectSaveWindowCanvasGroup, new TweenSettings<float>
{
startValue = _selectSaveWindowCanvasGroup.alpha,
endValue = 0f,
settings = _selectSaveTweenSettings
}))
.Group(Tween.Scale(_selectSaveWindow.transform, new TweenSettings<Vector3>
{
startValue = _selectSaveWindow.transform.localScale,
endValue = Vector3.zero,
settings = _selectSaveTweenSettings
}));
// Disable interaction immediately, leave alpha for tween to read
SetCanvasGroupInteractivity(_selectSaveContainerCanvasGroup, false);
SetCanvasGroupInteractivity(_selectSaveWindowCanvasGroup, false);
try
{
// Step 1: container fades out
_selectSaveSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.Alpha(_selectSaveContainerCanvasGroup, new TweenSettings<float>
{
startValue = _selectSaveContainerCanvasGroup.alpha,
endValue = 0f,
settings = _selectSaveTweenSettings
}))
.Group(Tween.Alpha(_buttonsGroup, new TweenSettings<float>
{
startValue = _buttonsGroup.alpha,
endValue = 1f,
settings = _selectSaveTweenSettings
}));
await _selectSaveSequence.ToUniTask(cancellationToken: _selectSaveCts.Token);
// Step 2: fog clears
if (_selectSaveWindowFog != null)
{
await _selectSaveWindowFog.FogOut().AttachExternalCancellation(_selectSaveCts.Token);
}
}
catch (OperationCanceledException)
{
@@ -582,27 +507,27 @@ namespace BriarQueen.UI.Menus
_selectSaveSequence = default;
}
_selectSaveWindowCanvasGroup.alpha = 0f;
// Step 3: fully cleaned up
SetCanvasGroupState(_selectSaveContainerCanvasGroup, 0f, false);
SetCanvasGroupState(_selectSaveWindowCanvasGroup, 0f, false);
_selectSaveWindow.gameObject.SetActive(false);
_selectSaveWindowFog?.FogSet(0f);
SetCanvasGroupState(_mainMenuWindowCanvasGroup, 1f, true);
SetCanvasGroupState(_mainMenuGroup, 1f, true);
}
private void ResetIntroCtsAndCancelRunning()
{
StopSequence(ref _introLightPulseSequence);
StopSequence(ref _introTextPulseSequence);
StopSequence(ref _introTransitionSequence);
StopSequence(ref _pressStartPulseSequence);
StopSequence(ref _pressStartFadeSequence);
CancelAndDispose(ref _introCts);
_introCts = new CancellationTokenSource();
}
private void StopIntroTweens()
{
StopSequence(ref _introLightPulseSequence);
StopSequence(ref _introTextPulseSequence);
StopSequence(ref _introTransitionSequence);
StopSequence(ref _pressStartPulseSequence);
StopSequence(ref _pressStartFadeSequence);
CancelAndDispose(ref _introCts);
}
@@ -622,7 +547,9 @@ namespace BriarQueen.UI.Menus
private static void StopSequence(ref Sequence sequence)
{
if (sequence.isAlive)
{
sequence.Stop();
}
sequence = default;
}
@@ -630,7 +557,9 @@ namespace BriarQueen.UI.Menus
private static void CancelAndDispose(ref CancellationTokenSource cts)
{
if (cts == null)
{
return;
}
try
{
@@ -644,13 +573,28 @@ namespace BriarQueen.UI.Menus
cts = null;
}
private static Button ResolveButton(AnimatedSelectionButton animatedSelectionButton, Button fallbackButton)
{
if (animatedSelectionButton != null && animatedSelectionButton.Button != null)
{
return animatedSelectionButton.Button;
}
return fallbackButton;
}
private static void SetCanvasGroupState(CanvasGroup group, float alpha, bool inputEnabled)
{
if (group == null)
return;
if (group == null) return;
group.alpha = alpha;
group.interactable = inputEnabled;
group.blocksRaycasts = inputEnabled;
}
group.alpha = alpha;
group.interactable = inputEnabled;
private static void SetCanvasGroupInteractivity(CanvasGroup group, bool inputEnabled)
{
if (group == null) return;
group.interactable = inputEnabled;
group.blocksRaycasts = inputEnabled;
}
}