fixes the regression commit B introduced: coins and skills lived in the Attempt ledger, but nothing discarded it, because LivesStateHandler still called the old store and HandlePlayerDeath was never invoked. Dying kept everything earned that level. Discard-on-death is the ledger's purpose, so it could not be separated from it. new AttemptFailed(remaining, runOver) event, raised after the life is spent and the ledger discarded. DeathScreen and GameOverScreen react to that instead of being wired to HealthComponent.Death by scene connections which fired *before* the life was charged - on the last life game-over saw one life left and showed nothing, then the death screen saw zero and refused to reload. 18 scene connections deleted; the race is now unrepresentable rather than fixed. DeathScreen also had two read paths for lives - a signal and a direct store read - because neither was reliable alone. Now one. Hud reads both facts from signals; only health still polls, and that belongs to the component rather than to progression. GameManager no longer touches GameStateStore or SaveSystem at all.
97 lines
3.0 KiB
C#
97 lines
3.0 KiB
C#
using Godot;
|
|
using Mr.BrickAdventures.Autoloads;
|
|
|
|
namespace Mr.BrickAdventures.scripts.UI;
|
|
|
|
public partial class PauseMenu : Control
|
|
{
|
|
[Export] public Control PauseMenuControl { get; set; }
|
|
[Export] public Control SettingsControl { get; set; }
|
|
[Export] public Button ResumeButton { get; set; }
|
|
[Export] public Button MainMenuButton { get; set; }
|
|
[Export] public Button QuitButton { get; set; }
|
|
[Export] public Button SettingsButton { get; set; }
|
|
[Export] public PackedScene MainMenuScene { get; set; }
|
|
|
|
private GameManager GameManager => GameManager.Instance;
|
|
private UIManager UIManager => UIManager.Instance;
|
|
|
|
public override void _Ready()
|
|
{
|
|
ResumeButton.FocusMode = Control.FocusModeEnum.All;
|
|
MainMenuButton.FocusMode = Control.FocusModeEnum.All;
|
|
QuitButton.FocusMode = Control.FocusModeEnum.All;
|
|
SettingsButton.FocusMode = Control.FocusModeEnum.All;
|
|
|
|
ResumeButton.Pressed += OnResumePressed;
|
|
MainMenuButton.Pressed += OnMainMenuPressed;
|
|
QuitButton.Pressed += OnQuitPressed;
|
|
SettingsButton.Pressed += OnSettingsPressed;
|
|
|
|
PauseMenuControl.Hide();
|
|
|
|
if (InputDeviceManager.Instance != null)
|
|
InputDeviceManager.Instance.DeviceChanged += OnDeviceChanged;
|
|
PauseMenuControl.VisibilityChanged += OnVisibilityChanged;
|
|
}
|
|
|
|
public override void _ExitTree()
|
|
{
|
|
if (InputDeviceManager.Instance != null)
|
|
InputDeviceManager.Instance.DeviceChanged -= OnDeviceChanged;
|
|
PauseMenuControl.VisibilityChanged -= OnVisibilityChanged;
|
|
}
|
|
|
|
private void OnVisibilityChanged()
|
|
{
|
|
if (PauseMenuControl.IsVisibleInTree() && InputDeviceManager.Instance?.IsPointerless == true)
|
|
GrabFirstFocus();
|
|
}
|
|
|
|
private void OnDeviceChanged(int device)
|
|
{
|
|
var d = (InputDeviceManager.InputDevice)device;
|
|
if (d != InputDeviceManager.InputDevice.Mouse && PauseMenuControl.IsVisibleInTree())
|
|
GrabFirstFocus();
|
|
}
|
|
|
|
private void GrabFirstFocus() => ResumeButton.GrabFocus();
|
|
|
|
public override void _UnhandledInput(InputEvent @event)
|
|
{
|
|
if (!@event.IsActionPressed("pause")) return;
|
|
if (UIManager.IsVisibleOnStack(PauseMenuControl))
|
|
OnResumePressed();
|
|
else
|
|
{
|
|
UIManager.PushScreen(PauseMenuControl);
|
|
GameManager.PauseGame();
|
|
}
|
|
}
|
|
|
|
private void OnSettingsPressed()
|
|
{
|
|
UIManager.PushScreen(SettingsControl);
|
|
GameManager.PauseGame();
|
|
}
|
|
|
|
private void OnQuitPressed()
|
|
{
|
|
GameManager.QuitGame();
|
|
}
|
|
|
|
private void OnMainMenuPressed()
|
|
{
|
|
GameManager.ResumeGame();
|
|
ProgressionRoot.Instance?.AbandonAttempt();
|
|
// The run is over once you leave to the menu; otherwise the timer keeps ticking there.
|
|
SpeedRunManager.Instance?.StopTimer();
|
|
GetTree().ChangeSceneToPacked(MainMenuScene);
|
|
}
|
|
|
|
private void OnResumePressed()
|
|
{
|
|
UIManager.PopScreen();
|
|
GameManager.ResumeGame();
|
|
}
|
|
} |