mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-01 11:15:33 +00:00
149 lines
No EOL
3.6 KiB
C#
149 lines
No EOL
3.6 KiB
C#
using Godot;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using Cirno.Scripts.Interactables;
|
|
|
|
public partial class Selector : Node2D
|
|
{
|
|
private Interactable _lastInteractable;
|
|
|
|
private List<IInteractable> _interactables = [];
|
|
|
|
private int _selectedInteractable;
|
|
|
|
private int SelectedInteractableIndex
|
|
{
|
|
get => _selectedInteractable;
|
|
set
|
|
{
|
|
if (value >= _interactables.Count)
|
|
{
|
|
_selectedInteractable = 0;
|
|
}
|
|
|
|
if (value < 0)
|
|
{
|
|
_selectedInteractable = _interactables.Count - 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
//[Signal]
|
|
//public delegate void SelectedItemInteractableChangedEventHandler(IInteractable interactable);
|
|
|
|
public IInteractable SelectedInteractable
|
|
{
|
|
get =>
|
|
_interactables.Count > 0
|
|
? SelectedInteractableIndex >= _interactables.Count
|
|
? _interactables[^1]
|
|
: _interactables[SelectedInteractableIndex]
|
|
: null;
|
|
set
|
|
{
|
|
// Passing null deselects the interactable
|
|
if (value == null)
|
|
{
|
|
_selectedInteractable = -1;
|
|
NotifyChanged(null);
|
|
return;
|
|
}
|
|
|
|
// If it's already in the list, set the current one to it, otherwise add it
|
|
if (!_interactables.Contains(value))
|
|
{
|
|
AddInteractable(value);
|
|
}
|
|
|
|
SelectedInteractableIndex = _interactables.IndexOf(value);
|
|
NotifyChanged(value);
|
|
}
|
|
}
|
|
|
|
// public override void _Process(double delta)
|
|
// {
|
|
// if (Input.IsActionJustPressed("scan"))
|
|
// {
|
|
// SelectNext();
|
|
// }
|
|
//
|
|
// // if (SelectedInteractable is not null) {
|
|
// // this.Visible = true;
|
|
// // this.GlobalPosition = SelectedInteractable.GlobalPosition;
|
|
// // }
|
|
// // else
|
|
// // {
|
|
// // this.Visible = false;
|
|
// // }
|
|
// }
|
|
|
|
public void SelectNext()
|
|
{
|
|
SelectedInteractableIndex += 1;
|
|
// _selectedInteractable += 1;
|
|
// if (_selectedInteractable >= _interactables.Count)
|
|
// {
|
|
// _selectedInteractable = 0;
|
|
// }
|
|
|
|
if (_interactables.Count > 0)
|
|
{
|
|
SelectedInteractable = _interactables[_selectedInteractable];
|
|
}
|
|
else
|
|
{
|
|
_selectedInteractable = -1;
|
|
}
|
|
|
|
UpdatePosition();
|
|
}
|
|
|
|
private void NotifyChanged(IInteractable interactable)
|
|
{
|
|
//EmitSignal(nameof(SelectedItemInteractableChanged), interactable);
|
|
}
|
|
|
|
public void AddInteractable(IInteractable interactable)
|
|
{
|
|
if (!_interactables.Contains(interactable))
|
|
{
|
|
_interactables.Add(interactable);
|
|
|
|
if (_interactables.Count == 1)
|
|
{
|
|
_selectedInteractable = 0;
|
|
}
|
|
}
|
|
|
|
UpdatePosition();
|
|
}
|
|
|
|
public void RemoveInteractable(IInteractable interactable)
|
|
{
|
|
if (_interactables.Contains(interactable))
|
|
{
|
|
_interactables.Remove(interactable);
|
|
}
|
|
|
|
UpdatePosition();
|
|
}
|
|
|
|
public void Deselect()
|
|
{
|
|
_selectedInteractable = -1;
|
|
this.Visible = false;
|
|
}
|
|
|
|
public void UpdatePosition()
|
|
{
|
|
if (SelectedInteractable != null)
|
|
{
|
|
this.GlobalPosition = SelectedInteractable.GetGlobalPosition2D();
|
|
this.Visible = true;
|
|
}
|
|
else
|
|
{
|
|
this.Visible = false;
|
|
}
|
|
}
|
|
} |