using System; using Cirno.Scripts.Interactables; using Cirno.Scripts.Resources.Events; using Godot; using Godot.Collections; namespace Cirno.Scripts.Activables; public partial class ScriptableBase : Node2D, 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 bool CanActivate() { return true; } }