From 7b2d32e7272719eb0a02d3f948d9bbd8b01f0cd0 Mon Sep 17 00:00:00 2001 From: Marco Date: Mon, 23 Jun 2025 18:30:42 +0200 Subject: [PATCH] Changed events to generic node --- Scripts/Activables/ScriptableBase3D.cs | 74 +++++++++++++++++ Scripts/Activables/ScriptableBase3D.cs.uid | 1 + Scripts/AlarmManager.cs | 19 ++++- .../Events/3D/GenericDialogueStartEvent.cs | 82 ------------------- .../3D/GenericDialogueStartEvent.cs.uid | 1 - Scripts/Resources/Events/ActivateEvent.cs | 6 +- Scripts/Resources/Events/AlarmDisableEvent.cs | 14 ++-- Scripts/Resources/Events/AlarmEnableEvent.cs | 27 ++++-- Scripts/Resources/Events/CameraTargetEvent.cs | 2 +- .../Events/CameraTargetPlayerEvent.cs | 4 +- Scripts/Resources/Events/ControlActorEvent.cs | 8 +- Scripts/Resources/Events/ControlEnemyEvent.cs | 11 ++- .../Resources/Events/DialogueStartEvent.cs | 24 ++++-- Scripts/Resources/Events/EventResource.cs | 4 +- Scripts/Resources/Events/MovePlayerEvent.cs | 11 ++- .../Resources/Events/UpdateCheckPointEvent.cs | 9 +- Scripts/Resources/Events/WaitEvent.cs | 4 +- 17 files changed, 166 insertions(+), 135 deletions(-) create mode 100644 Scripts/Activables/ScriptableBase3D.cs create mode 100644 Scripts/Activables/ScriptableBase3D.cs.uid delete mode 100644 Scripts/Resources/Events/3D/GenericDialogueStartEvent.cs delete mode 100644 Scripts/Resources/Events/3D/GenericDialogueStartEvent.cs.uid diff --git a/Scripts/Activables/ScriptableBase3D.cs b/Scripts/Activables/ScriptableBase3D.cs new file mode 100644 index 00000000..63bbc14c --- /dev/null +++ b/Scripts/Activables/ScriptableBase3D.cs @@ -0,0 +1,74 @@ +using Cirno.Scripts.Resources.Events; +using Godot; +using Godot.Collections; + +namespace Cirno.Scripts.Activables; + +public partial class ScriptableArea3D : Area3D, IActivable +{ + [Export] public Array Events { get; set; } = []; + + private EventResource CurrentEvent => Events[_currentEventIndex]; + + private int _currentEventIndex = 0; + + private bool _started = false; + + public override void _Ready() + { + foreach (var item in Events) + { + item.Init(this); + } + } + + public void Start() + { + _started = true; + StartEvent(CurrentEvent); + } + + private void StartEvent(EventResource eventResource) + { + eventResource.Start(this); + } + + public override void _Process(double delta) + { + if (!_started) return; + + CurrentEvent.UpdateEvent(delta); + + if (!CurrentEvent.WaitForCompletion || CurrentEvent.IsComplete()) + { + // This loops + _currentEventIndex++; + if (_currentEventIndex >= Events.Count) + { + // It's over + _started = false; + _currentEventIndex = 0; + return; + } + + CurrentEvent.Start(this); + } + } + + public bool Activate(ActivationType activationType = ActivationType.Toggle) + { + Start(); + + return true; + } + + public void Toggle() + { + this.Activate(); + } + + public bool CanActivate() + { + return true; + } +} \ No newline at end of file diff --git a/Scripts/Activables/ScriptableBase3D.cs.uid b/Scripts/Activables/ScriptableBase3D.cs.uid new file mode 100644 index 00000000..f11667d6 --- /dev/null +++ b/Scripts/Activables/ScriptableBase3D.cs.uid @@ -0,0 +1 @@ +uid://cpwn25m6b4lqf diff --git a/Scripts/AlarmManager.cs b/Scripts/AlarmManager.cs index 749df63a..3b5abd05 100644 --- a/Scripts/AlarmManager.cs +++ b/Scripts/AlarmManager.cs @@ -2,7 +2,7 @@ namespace Cirno.Scripts; -public partial class AlarmManager : Node2D +public partial class AlarmManager : Node { [Export] public AudioStream AlarmSound { get; private set; } @@ -12,10 +12,14 @@ public partial class AlarmManager : Node2D public bool IsAlarmOn { get; private set; } = false; public Vector2 LastAlarmPosition { get; private set; } = new Vector2(); + public Vector3 LastAlarmPosition3D { get; private set; } = new Vector3(); [Signal] public delegate void AlarmEnabledEventHandler(Vector2 location); + [Signal] + public delegate void AlarmEnabled3DEventHandler(Vector3 location); + [Signal] public delegate void AlarmDisabledEventHandler(); @@ -40,7 +44,18 @@ public partial class AlarmManager : Node2D if (IsAlarmOn) return; IsAlarmOn = true; LastAlarmPosition = location; - EmitSignal(nameof(AlarmEnabled), location); + EmitSignalAlarmEnabled(location); + + GD.Print($"Alarm sounded at {location}"); + _player?.Play(); + } + + public void SoundAlarm(Vector3 location) + { + if (IsAlarmOn) return; + IsAlarmOn = true; + LastAlarmPosition3D = location; + EmitSignalAlarmEnabled3D(location); GD.Print($"Alarm sounded at {location}"); _player?.Play(); diff --git a/Scripts/Resources/Events/3D/GenericDialogueStartEvent.cs b/Scripts/Resources/Events/3D/GenericDialogueStartEvent.cs deleted file mode 100644 index 64cb5ec7..00000000 --- a/Scripts/Resources/Events/3D/GenericDialogueStartEvent.cs +++ /dev/null @@ -1,82 +0,0 @@ -using Cirno.Scripts.Misc; -using Godot; - -namespace Cirno.Scripts.Resources.Events._3D; - -[GlobalClass] -public partial class GenericDialogueStartEvent : EventResource -{ - [Export] public StringName TimelineName = "timeline"; - private Node _dialogic; - private GameManager _gameManager; - private bool _isComplete = false; - - private DialogueSkipListener _listener; - - public override void Init(Node2D parent) - { - _gameManager = parent.GetGameManager(); - _dialogic = parent.GetNode("/root/Dialogic"); - _dialogic.ProcessMode = Node.ProcessModeEnum.Always; - } - - public override void Start(Node2D parent) - { - if (GlobalState.Instance.SessionSettings.SkipDialogues) - { - DialogueEndAction(); - return; - } - - CreateSkipListener(parent); - - Hud.Instance?.HideHud(); - - _dialogic.Connect("timeline_ended", Callable.From(OnTimelineEnded)); - - var dialogicNode =_dialogic.Call("start", TimelineName.ToString()); - ((Node)dialogicNode).ProcessMode = Node.ProcessModeEnum.Always; - _gameManager.ChangeState(GameState.Dialogue); - } - - private void CreateSkipListener(Node2D parent) - { - _listener = new DialogueSkipListener(); - parent.AddChild(_listener); - _listener.ProcessMode = Node.ProcessModeEnum.Always; - _listener.Skipped += ListenerOnSkipped; - } - - private void ListenerOnSkipped() - { - _listener.Skipped -= ListenerOnSkipped; - _listener.QueueFree(); - _dialogic.Call("end_timeline"); - } - - private void OnTimelineEnded() - { - Hud.Instance?.ShowHud(); - _gameManager.ChangeState(GameState.Playing); - if (_dialogic.IsConnected("timeline_ended", Callable.From(OnTimelineEnded))) - { - _dialogic.Disconnect("timeline_ended", Callable.From(OnTimelineEnded)); - } - - DialogueEndAction(); - } - - private void DialogueEndAction() - { - _isComplete = true; - } - - public override void UpdateEvent(double delta) - { - } - - public override bool IsComplete() - { - return _isComplete; - } -} \ No newline at end of file diff --git a/Scripts/Resources/Events/3D/GenericDialogueStartEvent.cs.uid b/Scripts/Resources/Events/3D/GenericDialogueStartEvent.cs.uid deleted file mode 100644 index a81e1f9d..00000000 --- a/Scripts/Resources/Events/3D/GenericDialogueStartEvent.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://no0it4lihfx diff --git a/Scripts/Resources/Events/ActivateEvent.cs b/Scripts/Resources/Events/ActivateEvent.cs index d7be2f51..1b6932b1 100644 --- a/Scripts/Resources/Events/ActivateEvent.cs +++ b/Scripts/Resources/Events/ActivateEvent.cs @@ -10,7 +10,7 @@ public partial class ActivateEvent : EventResource [Export] public Array Targets; - private Node2D _parent; + private Node _parent; private bool _isComplete = false; @@ -37,12 +37,12 @@ public partial class ActivateEvent : EventResource return true; } - public override void Init(Node2D parent) + public override void Init(Node parent) { _parent = parent; } - public override void Start(Node2D parent) + public override void Start(Node parent) { ActivateTargets(); diff --git a/Scripts/Resources/Events/AlarmDisableEvent.cs b/Scripts/Resources/Events/AlarmDisableEvent.cs index f53ef45f..bd974338 100644 --- a/Scripts/Resources/Events/AlarmDisableEvent.cs +++ b/Scripts/Resources/Events/AlarmDisableEvent.cs @@ -7,21 +7,25 @@ namespace Cirno.Scripts.Resources.Events; public partial class AlarmDisableEvent : EventResource { private bool _isComplete = false; - private AlarmManager _alarmManager; public override bool IsComplete() { return _isComplete; } - public override void Init(Node2D parent) + public override void Init(Node parent) { - _alarmManager = parent.GetAlarmManager(); + } - public override void Start(Node2D parent) + public override void Start(Node parent) { - _alarmManager.DisableAlarm(); + if (AlarmManager.Instance is null) + { + _isComplete = true; + return; + }; + AlarmManager.Instance.DisableAlarm(); _isComplete = true; } diff --git a/Scripts/Resources/Events/AlarmEnableEvent.cs b/Scripts/Resources/Events/AlarmEnableEvent.cs index 59848c74..e4d80d17 100644 --- a/Scripts/Resources/Events/AlarmEnableEvent.cs +++ b/Scripts/Resources/Events/AlarmEnableEvent.cs @@ -7,21 +7,36 @@ namespace Cirno.Scripts.Resources.Events; public partial class AlarmEnableEvent : EventResource { private bool _isComplete = false; - private AlarmManager _alarmManager; - + public override bool IsComplete() { return _isComplete; } - public override void Init(Node2D parent) + public override void Init(Node parent) { - _alarmManager = parent.GetAlarmManager(); + } - public override void Start(Node2D parent) + public override void Start(Node parent) { - _alarmManager.SoundAlarm(parent.GlobalPosition); + if (AlarmManager.Instance is null) + { + _isComplete = true; + return; + } + + switch (parent) + { + case Node2D node2D: + AlarmManager.Instance.SoundAlarm(node2D.GlobalPosition); + break; + case Node3D node3D: + AlarmManager.Instance.SoundAlarm(node3D.GlobalPosition); + break; + } + + _isComplete = true; } diff --git a/Scripts/Resources/Events/CameraTargetEvent.cs b/Scripts/Resources/Events/CameraTargetEvent.cs index 4892a5e7..f900a11e 100644 --- a/Scripts/Resources/Events/CameraTargetEvent.cs +++ b/Scripts/Resources/Events/CameraTargetEvent.cs @@ -11,7 +11,7 @@ public partial class CameraTargetEvent : CameraTargetPlayerEvent [Export] public Vector2 Offset { get; private set; } - public override void Start(Node2D parent) + public override void Start(Node parent) { GameManager.Instance.CameraTargetObject(parent.GetNode(Target), Offset); _isComplete = true; diff --git a/Scripts/Resources/Events/CameraTargetPlayerEvent.cs b/Scripts/Resources/Events/CameraTargetPlayerEvent.cs index 3c69d87e..5e1545a0 100644 --- a/Scripts/Resources/Events/CameraTargetPlayerEvent.cs +++ b/Scripts/Resources/Events/CameraTargetPlayerEvent.cs @@ -7,12 +7,12 @@ public partial class CameraTargetPlayerEvent : EventResource { protected bool _isComplete = false; - public override void Init(Node2D parent) + public override void Init(Node parent) { } - public override void Start(Node2D parent) + public override void Start(Node parent) { GameManager.Instance.CameraTargetPlayer(); _isComplete = true; diff --git a/Scripts/Resources/Events/ControlActorEvent.cs b/Scripts/Resources/Events/ControlActorEvent.cs index 4d362ce3..cb04a40c 100644 --- a/Scripts/Resources/Events/ControlActorEvent.cs +++ b/Scripts/Resources/Events/ControlActorEvent.cs @@ -8,22 +8,20 @@ public partial class ControlActorEvent : EventResource [Export] public NodePath Target { get; set; } - private Node2D _parent; + private Node _parent; - private GameManager _gameManager; private bool _isComplete = false; public override bool IsComplete() { return _isComplete; } - public override void Init(Node2D parent) + public override void Init(Node parent) { - _gameManager = parent.GetGameManager(); _parent = parent; } - public override void Start(Node2D parentNode) + public override void Start(Node parentNode) { _isComplete = false; diff --git a/Scripts/Resources/Events/ControlEnemyEvent.cs b/Scripts/Resources/Events/ControlEnemyEvent.cs index dc9ade28..d7955024 100644 --- a/Scripts/Resources/Events/ControlEnemyEvent.cs +++ b/Scripts/Resources/Events/ControlEnemyEvent.cs @@ -8,28 +8,27 @@ public partial class ControlEnemyEvent : EventResource [Export] public NodePath Target { get; set; } - private Node2D _parent; + private Node _parent; - private GameManager _gameManager; private bool _isComplete = false; public override bool IsComplete() { return _isComplete; } - public override void Init(Node2D parent) + public override void Init(Node parent) { - _gameManager = parent.GetGameManager(); + _parent = parent; } - public override void Start(Node2D parentNode) + public override void Start(Node parentNode) { _isComplete = false; if (_parent.GetNode(Target) is Enemy enemy) { - _gameManager.CameraTargetObject(enemy); + GameManager.Instance.CameraTargetObject(enemy); GameManager.Instance.Player.SetState(PlayerState.Controlling); // _gameManager.Player.RequestMovementDisable(true); enemy.AssumeControl(); diff --git a/Scripts/Resources/Events/DialogueStartEvent.cs b/Scripts/Resources/Events/DialogueStartEvent.cs index 888451a8..e4b6ac3a 100644 --- a/Scripts/Resources/Events/DialogueStartEvent.cs +++ b/Scripts/Resources/Events/DialogueStartEvent.cs @@ -8,19 +8,17 @@ public partial class DialogueStartEvent : EventResource { [Export] public StringName TimelineName = "timeline"; private Node _dialogic; - private GameManager _gameManager; private bool _isComplete = false; private DialogueSkipListener _listener; - public override void Init(Node2D parent) + public override void Init(Node parent) { - _gameManager = parent.GetGameManager(); _dialogic = parent.GetNode("/root/Dialogic"); _dialogic.ProcessMode = Node.ProcessModeEnum.Always; } - public override void Start(Node2D parent) + public override void Start(Node parent) { if (GlobalState.Instance.SessionSettings.SkipDialogues) { @@ -36,10 +34,22 @@ public partial class DialogueStartEvent : EventResource var dialogicNode =_dialogic.Call("start", TimelineName.ToString()); ((Node)dialogicNode).ProcessMode = Node.ProcessModeEnum.Always; - _gameManager.ChangeState(GameState.Dialogue); + ChangeState(GameState.Dialogue); } - private void CreateSkipListener(Node2D parent) + private void ChangeState(GameState state) + { + if (GameManager.Instance is not null) + { + GameManager.Instance.ChangeState(state); + } + else if (GameController.Instance is not null) + { + GameController.Instance.ChangeState(state); + } + } + + private void CreateSkipListener(Node parent) { _listener = new DialogueSkipListener(); parent.AddChild(_listener); @@ -57,7 +67,7 @@ public partial class DialogueStartEvent : EventResource private void OnTimelineEnded() { Hud.Instance?.ShowHud(); - _gameManager.ChangeState(GameState.Playing); + ChangeState(GameState.Playing); if (_dialogic.IsConnected("timeline_ended", Callable.From(OnTimelineEnded))) { _dialogic.Disconnect("timeline_ended", Callable.From(OnTimelineEnded)); diff --git a/Scripts/Resources/Events/EventResource.cs b/Scripts/Resources/Events/EventResource.cs index 0e5ee724..2633a12d 100644 --- a/Scripts/Resources/Events/EventResource.cs +++ b/Scripts/Resources/Events/EventResource.cs @@ -6,8 +6,8 @@ namespace Cirno.Scripts.Resources.Events; public abstract partial class EventResource : Resource { [Export] public bool WaitForCompletion = true; - public abstract void Init(Node2D parent); - public abstract void Start(Node2D parent); + public abstract void Init(Node parent); + public abstract void Start(Node parent); public abstract void UpdateEvent(double delta); public abstract bool IsComplete(); } \ No newline at end of file diff --git a/Scripts/Resources/Events/MovePlayerEvent.cs b/Scripts/Resources/Events/MovePlayerEvent.cs index e5ec62b6..1dcb0646 100644 --- a/Scripts/Resources/Events/MovePlayerEvent.cs +++ b/Scripts/Resources/Events/MovePlayerEvent.cs @@ -26,14 +26,13 @@ public partial class MovePlayerEvent : EventResource private bool _isComplete = false; - private GameManager _gameManager; - public override void Init(Node2D parent) + public override void Init(Node parent) { - _gameManager = parent.GetGameManager(); + } - public override void Start(Node2D parentNode) + public override void Start(Node parentNode) { _isComplete = false; _ = MovePlayer(); @@ -45,8 +44,8 @@ public partial class MovePlayerEvent : EventResource //_gameManager.Player.RequestMovementDisable(true); var gtween = GTweenSequenceBuilder.New() - .Append(_gameManager.Player.MainObject.TweenGlobalPosition( - _gameManager.Player.MainObject.GlobalPosition + RelativeTargetPosition, MovementTime) + .Append(GameManager.Instance.Player.MainObject.TweenGlobalPosition( + GameManager.Instance.Player.MainObject.GlobalPosition + RelativeTargetPosition, MovementTime) .SetEasing(GTweenEasing) //. ) diff --git a/Scripts/Resources/Events/UpdateCheckPointEvent.cs b/Scripts/Resources/Events/UpdateCheckPointEvent.cs index 97635be5..75c7b79f 100644 --- a/Scripts/Resources/Events/UpdateCheckPointEvent.cs +++ b/Scripts/Resources/Events/UpdateCheckPointEvent.cs @@ -5,19 +5,18 @@ namespace Cirno.Scripts.Resources.Events; [GlobalClass] public partial class UpdateCheckPointEvent : EventResource { - private GameManager _gameManager; [Export] public NodePath Target { get; set; } - public override void Init(Node2D parent) + public override void Init(Node parent) { - _gameManager = parent.GetGameManager(); + } - public override void Start(Node2D parent) + public override void Start(Node parent) { - _gameManager.LastCheckpointPosition = parent.GetNode(Target).GlobalPosition; + GameManager.Instance.LastCheckpointPosition = parent.GetNode(Target).GlobalPosition; // _gameManager.Player.LastCheckPointPosition = parent.GetNode(Target).GlobalPosition; } diff --git a/Scripts/Resources/Events/WaitEvent.cs b/Scripts/Resources/Events/WaitEvent.cs index 3fa23c56..b87d62e5 100644 --- a/Scripts/Resources/Events/WaitEvent.cs +++ b/Scripts/Resources/Events/WaitEvent.cs @@ -10,12 +10,12 @@ public partial class WaitEvent : EventResource public float WaitTime { get; set; } protected bool _isComplete = false; - public override void Init(Node2D parent) + public override void Init(Node parent) { } - public override void Start(Node2D parent) + public override void Start(Node parent) { _ = Wait(); }