cirnogodot/Scripts/Activables/HealthStation.cs

145 lines
No EOL
3.6 KiB
C#

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<GpuParticles2D>("./Particles");
_animatedSprite = GetNode<AnimatedSprite2D>("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;
// }
}