using Cirno.Scripts.Misc; using Godot; namespace Cirno.Scripts.Utils; public partial class DialogueTools : RefCounted { private Node _dialogic; private bool _isComplete = false; public bool IsComplete => _isComplete; private DialogueSkipListener _listener; private StringName TimelineName; public void Init(Node parent, StringName timelineName) { _dialogic = parent.GetNode("/root/Dialogic"); _dialogic.ProcessMode = Node.ProcessModeEnum.Always; TimelineName = timelineName; } public void Start(Node 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; ChangeState(GameState.Dialogue); } private void ChangeState(GameState state) { GameStateManager.Instance.ChangeState(state); } private void CreateSkipListener(Node 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(); ChangeState(GameState.Playing); if (_dialogic.IsConnected("timeline_ended", Callable.From(OnTimelineEnded))) { _dialogic.Disconnect("timeline_ended", Callable.From(OnTimelineEnded)); } DialogueEndAction(); } private void DialogueEndAction() { _isComplete = true; } }