64 lines
1.8 KiB
C#
64 lines
1.8 KiB
C#
using Godot;
|
|
using MaxEffort.Code.Core;
|
|
|
|
namespace MaxEffort.Code.Systems;
|
|
|
|
[GlobalClass]
|
|
public partial class DeadliftSystem : BaseLiftSystem
|
|
{
|
|
[Export] private float _barHeight = 100f; // Visual height of the lift
|
|
[Export] private float _holdZoneThreshold = 0.8f; // Must be above 80% to count
|
|
[Export] private Node2D _barVisual;
|
|
[Export] private Vector2 _startPos;
|
|
[Export] private Vector2 _endPos;
|
|
|
|
private float _currentBarHeight = 0f;
|
|
private float _holdTimer = 0f;
|
|
|
|
public override void Initialize(float targetTime, float gravity)
|
|
{
|
|
base.Initialize(targetTime, gravity);
|
|
_holdTimer = 0f;
|
|
}
|
|
|
|
protected override void HandleEffort(float effortDelta)
|
|
{
|
|
_currentBarHeight += PowerPerClick * effortDelta;
|
|
_currentBarHeight = Mathf.Min(_currentBarHeight, _barHeight);
|
|
}
|
|
|
|
public override void _Process(double delta)
|
|
{
|
|
if (IsLiftComplete) return;
|
|
|
|
var dt = (float)delta;
|
|
|
|
if (_currentBarHeight > 0)
|
|
{
|
|
_currentBarHeight -= Gravity * dt;
|
|
_currentBarHeight = Mathf.Max(0, _currentBarHeight);
|
|
}
|
|
|
|
var visualRatio = _currentBarHeight / _barHeight; // 0.0 to 1.0 (Height)
|
|
|
|
if (visualRatio >= _holdZoneThreshold && ActiveHazardCount == 0)
|
|
{
|
|
_holdTimer += dt;
|
|
EventBus.PublishCameraTrauma(0.15f * dt);
|
|
}
|
|
|
|
EventBus.PublishLiftVisualHeight(visualRatio);
|
|
EventBus.PublishLiftProgress(_holdTimer / TargetValue);
|
|
|
|
if (_barVisual != null)
|
|
{
|
|
_barVisual.Position = _startPos.Lerp(_endPos, visualRatio);
|
|
}
|
|
|
|
if (_holdTimer >= TargetValue)
|
|
{
|
|
EventBus.PublishCameraTrauma(1.0f);
|
|
EventBus.PublishLiftCompleted(true);
|
|
}
|
|
}
|
|
} |