diff --git a/Scripts/Components/Actors/ActivationProvider.cs b/Scripts/Components/Actors/ActivationProvider.cs index afbbdd0b..d3d8a281 100644 --- a/Scripts/Components/Actors/ActivationProvider.cs +++ b/Scripts/Components/Actors/ActivationProvider.cs @@ -37,7 +37,12 @@ public partial class ActivationProvider : Area2D { if (_inputProvider.GetUseJustPressed()) { - TrySelect(); + if (!TrySelect()) + { + _selector.SelectNext(); + } + + return; } if (_inputProvider.GetScanJustPressed()) @@ -46,33 +51,33 @@ public partial class ActivationProvider : Area2D } } - private void TrySelect() + private bool TrySelect() { var selected = _selector.SelectedInteractable; if (selected is null) { _errorSound?.Play(); - return; + return false; }; if (!selected.CanActivate()) { _errorSound?.Play(); - return; + return true; }; bool success = selected.Activate(); if (success) { // Deselect and scan for next - _selector.RemoveInteractable(selected); - //_selector.SelectedInteractable = null; - //_selector.SelectNext(); + _selector.SelectNext(); + //_selector.RemoveInteractable(selected); } else { _errorSound?.Play(); } + return true; //var spaceState = GetWorld2D().DirectSpaceState; //var query = PhysicsRayQueryParameters2D.Create(Vector2.Zero, ) diff --git a/Scripts/Selector.cs b/Scripts/Selector.cs index 7f0adb4e..64f8df5a 100644 --- a/Scripts/Selector.cs +++ b/Scripts/Selector.cs @@ -10,17 +10,34 @@ public partial class Selector : Node2D private List _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 - ? _selectedInteractable >= _interactables.Count + ? SelectedInteractableIndex >= _interactables.Count ? _interactables[^1] - : _interactables[_selectedInteractable] + : _interactables[SelectedInteractableIndex] : null; set { @@ -31,14 +48,14 @@ public partial class Selector : Node2D 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); } - _selectedInteractable = _interactables.IndexOf(value); + SelectedInteractableIndex = _interactables.IndexOf(value); NotifyChanged(value); } } @@ -62,11 +79,12 @@ public partial class Selector : Node2D public void SelectNext() { - _selectedInteractable += 1; - if (_selectedInteractable >= _interactables.Count) - { - _selectedInteractable = 0; - } + SelectedInteractableIndex += 1; + // _selectedInteractable += 1; + // if (_selectedInteractable >= _interactables.Count) + // { + // _selectedInteractable = 0; + // } if (_interactables.Count > 0) { @@ -76,7 +94,7 @@ public partial class Selector : Node2D { _selectedInteractable = -1; } - + UpdatePosition(); } @@ -87,15 +105,16 @@ public partial class Selector : Node2D public void AddInteractable(IInteractable interactable) { - if (!_interactables.Contains(interactable)) { + if (!_interactables.Contains(interactable)) + { _interactables.Add(interactable); if (_interactables.Count == 1) { _selectedInteractable = 0; } - } + UpdatePosition(); } @@ -105,6 +124,7 @@ public partial class Selector : Node2D { _interactables.Remove(interactable); } + UpdatePosition(); } @@ -126,5 +146,4 @@ public partial class Selector : Node2D this.Visible = false; } } - -} +} \ No newline at end of file