ocker/scripts/ui/CaptureUI.cs

121 lines
2.5 KiB
C#

using Godot;
public partial class CaptureUI : CanvasLayer
{
[Export] public float BaseTimeLimit = 3.0f;
[Export] public float BaseRequired = 14.0f; // “energy” required
[Export] public float EnergyPerPress = 1.0f;
private Creature? _target;
private SaveManager? _save;
private float _timeLeft;
private float _required;
private float _energy;
private OptionButton _ballOption = null!;
private ProgressBar _bar = null!;
private Label _timer = null!;
private Label _title = null!;
public override void _Ready()
{
_ballOption = GetNode<OptionButton>("Panel/VBoxContainer/SoulballOption");
_bar = GetNode<ProgressBar>("Panel/VBoxContainer/MashBar");
_timer = GetNode<Label>("Panel/VBoxContainer/TimerLabel");
_title = GetNode<Label>("Panel/VBoxContainer/CreatureNameLabel");
Visible = false;
// v0 balls
_ballOption.Clear();
_ballOption.AddItem("Basic Soulball (easy)", 0);
_ballOption.AddItem("Heavy Soulball (hard)", 1);
_save = GetNodeOrNull<SaveManager>("/root/Main/SaveManager"); // or export a path if you prefer
}
public void StartCapture(Creature target)
{
_target = target;
_energy = 0;
// Ball selection affects difficulty (v0)
int ballId = _ballOption.GetSelectedId();
float difficultyMul = ballId switch
{
0 => 1.0f,
1 => 1.4f,
_ => 1.0f
};
_required = BaseRequired * difficultyMul;
_timeLeft = BaseTimeLimit;
_title.Text = $"Capture: {target.CreatureId}";
_bar.MinValue = 0;
_bar.MaxValue = _required;
_bar.Value = 0;
Visible = true;
// Optional: pause world while capturing
GetTree().Paused = true;
ProcessMode = ProcessModeEnum.WhenPaused;
}
public override void _Process(double delta)
{
if (!Visible || _target == null) return;
// Count presses
if (Input.IsActionJustPressed("capture_mash"))
{
_energy += EnergyPerPress;
_bar.Value = _energy;
}
_timeLeft -= (float)delta;
_timer.Text = $"Time: {_timeLeft:0.00}s";
if (_energy >= _required)
{
OnCaptureSuccess();
}
else if (_timeLeft <= 0)
{
OnCaptureFail();
}
}
private void EndCapture()
{
Visible = false;
GetTree().Paused = false;
ProcessMode = ProcessModeEnum.Inherit;
_target = null;
}
private void OnCaptureSuccess()
{
if (_target == null) return;
GD.Print($"Captured {_target.CreatureId}");
// v0: store captured creature IDs
if (_save != null)
{
_save.State.CapturedCreatures.Add(_target.CreatureId);
_save.Save();
}
_target.Despawn();
EndCapture();
}
private void OnCaptureFail()
{
GD.Print("Capture failed");
EndCapture();
}
}