Files
max-effort/Code/Systems/BaseLiftSystem.cs

66 lines
1.8 KiB
C#

using Godot;
using MaxEffort.Code.Core;
using MaxEffort.Code.Data;
namespace MaxEffort.Code.Systems;
public abstract partial class BaseLiftSystem : Node
{
[Export] protected float PowerPerClick = 5f;
[Export] protected float Gravity = 2f;
[Export] protected float TargetValue = 100f; // Distance OR Time
protected float CurrentProgress = 0f;
protected bool IsLiftComplete = false;
protected int ActiveHazardCount = 0;
public override void _Ready()
{
EventBus.OnLiftEffortApplied += ApplyPower;
EventBus.OnHazardSpawned += OnHazardSpawned;
EventBus.OnHazardResolved += OnHazardResolved;
EventBus.OnLiftCompleted += OnLiftCompleted;
}
public override void _ExitTree()
{
EventBus.OnLiftEffortApplied -= ApplyPower;
EventBus.OnHazardSpawned -= OnHazardSpawned;
EventBus.OnHazardResolved -= OnHazardResolved;
EventBus.OnLiftCompleted -= OnLiftCompleted;
}
public virtual void Initialize(float target, float gravity)
{
TargetValue = target;
Gravity = gravity;
CurrentProgress = 0f;
IsLiftComplete = false;
ActiveHazardCount = 0;
}
private void OnLiftCompleted(bool success)
{
IsLiftComplete = true;
}
private void OnHazardResolved(HazardType _)
{
ActiveHazardCount--;
if (ActiveHazardCount < 0) ActiveHazardCount = 0;
}
private void OnHazardSpawned(HazardType _)
{
ActiveHazardCount++;
}
private void ApplyPower(float effortDelta)
{
if (IsLiftComplete || ActiveHazardCount > 0) return;
HandleEffort(effortDelta);
}
protected abstract void HandleEffort(float effortDelta);
public abstract override void _Process(double delta);
}