cirnogodot/Scripts/Activables/HealthStation.cs
2025-02-19 23:40:31 +01:00

117 lines
No EOL
2.8 KiB
C#

using System;
using System.Collections;
using System.Threading.Tasks;
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 PlayerMovement _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)
{
_healingTimer += delta;
if (_healingTimer >= 1)
{
_cachedPlayer.CurrentHealth += HealthPerSecond;
_cachedPlayer.CurrentShield += ShieldPerSecond;
_healingTimer = 0;
}
}
}
public override void 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;
}
}
private void _on_body_entered(CharacterBody2D area)
{
// Heal player if active
if (!IsEnabled) return;
if (area is not PlayerMovement 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 PlayerMovement player) return;
// Stop healing player if active
_isHealing = false;
_particles.Emitting = false;
}
}