using System; using System.Collections; using System.Threading.Tasks; using Cirno.Scripts.Components.FSM; using Godot; namespace Cirno.Scripts.Activables; public partial class HealthStation : Activable { [Export] public bool IsEnabled { get; set; } [Export] public float HealthPerSecond { get; private set; } = 10f; [Export] public float ShieldPerSecond { get; private set; } = 10f; private AnimatedSprite2D _animatedSprite; private GpuParticles2D _particles; private bool _isHealing = false; private InteractionController _cachedPlayer; private double _healingTimer = 0; public override void _Ready() { _particles = GetNode("./Particles"); _animatedSprite = GetNode("AnimatedSprite2D"); _particles.Emitting = false; if (IsEnabled) { _animatedSprite.Play("Active"); } else { _animatedSprite.Play("Default"); } _healingTimer = 0; } public override void _Process(double delta) { base._Process(delta); if (!_isHealing || _cachedPlayer == null) return; _healingTimer += delta; if (!(_healingTimer >= 1)) return; if (_cachedPlayer.Health is not null) { _cachedPlayer.Health.CurrentResource += HealthPerSecond; } if (_cachedPlayer.Shield is not null) { _cachedPlayer.Shield.CurrentResource += ShieldPerSecond; } _healingTimer = 0; } public override bool Activate(ActivationType activationType = ActivationType.Toggle) { switch (activationType) { case ActivationType.Toggle: // Enables/Disables teleporter break; case ActivationType.Enable: // Enables Teleporter IsEnabled = true; _animatedSprite.Play("Active"); break; case ActivationType.Disable: IsEnabled = false; _animatedSprite.Play("Default"); // Disables Teleporter break; case ActivationType.Use: // Teleports break; case ActivationType.Destroy: // Destroys break; } return true; } private void _on_area_entered(Area2D area) { if (!IsEnabled) return; if (area is not InteractionController interactionController) return; _cachedPlayer = interactionController; _isHealing = true; _particles.Emitting = true; } private void _on_area_Exited(Area2D area) { if (!_isHealing) return; if (!IsEnabled) return; if (area is not InteractionController player) return; // Stop healing player if active _isHealing = false; _particles.Emitting = false; } // private void _on_body_entered(CharacterBody2D area) // { // // Heal player if active // if (!IsEnabled) return; // if (area is not PlayerStateMachine player) return; // // _cachedPlayer = player; // // _isHealing = true; // _particles.Emitting = true; // } // // private void _on_body_exited(CharacterBody2D area) // { // if (!_isHealing) return; // if (!IsEnabled) return; // if (area is not PlayerStateMachine player) return; // // // Stop healing player if active // // _isHealing = false; // _particles.Emitting = false; // } }