Files
VOIDRPG/Assets/92 - UserInterface/Generic/Game/AbilityBookUI.cs
T
2026-07-09 21:33:33 +02:00

137 lines
4.6 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UIElements;
using VOID.Generic.Dict;
using VOID.Generic.Objects.Unit;
using VOID.Generic.Objects.Unit.Events;
using VOID.Generic.Player;
using VOID.Generic.Player.Input;
using VOID.UserInterface.Game.Interfaces;
using VOID.UserInterface.Game.Util;
using VOID.ScriptableObjects.Abilities;
namespace VOID.UserInterface.Game
{
public class AbilityBookUI : MonoBehaviour, IHasWindow
{
public static AbilityBookUI current { get; private set; }
// WindowUI
public WindowUI windowUI { get; private set; }
// Active Unit and his Backpack
private UnitObject _unit;
private UnitObjectAbilityBook _abilityBook;
// Visual Elements
private VisualElement _rootElement;
private VisualElement _abilityListElement;
private readonly List<SlotUI> _abilitySlots = new();
// References
private ShortcutsInputManager _shortcutsInputManager;
private PlayerController _playerController;
private void Awake()
{
current = this;
var uiDocument = gameObject.GetComponent<UIDocument>();
var templateElement = uiDocument.rootVisualElement;
// Find all important elements
_rootElement = templateElement.Q("root-ability-book");
_abilityListElement = templateElement.Q("ability-slots");
_abilityListElement.Clear();
windowUI = gameObject.GetComponent<WindowUI>();
_rootElement.dataSource = this;
_rootElement.pickingMode = PickingMode.Position;
}
private void Start()
{
_shortcutsInputManager = ShortcutsInputManager.current;
_playerController = PlayerController.current;
// Toggle show/hide when pressing shortcut for ability book
_shortcutsInputManager.abilityBook.performed += _ => windowUI.Toggle();
windowUI.OnOpen += OnOpen;
windowUI.OnClose += OnClose;
windowUI.SetTitle("Ability Book");
// Hidden by default
windowUI.Close();
}
public void Toggle() => windowUI.Toggle();
public void Open() => windowUI.Open();
public void Close() => windowUI.Close();
private void OnOpen()
{
// References to active unit
_unit = PlayerController.current.activeUnit;
_abilityBook = _unit.unitAbilityBook;
// Refresh UI when we change active unit
_playerController.OnActiveUnitChange += OnActiveUnitChange;
// Initialize all VisualElements
_abilityBook.abilities.ForEach(AddSlot);
// Listen to all changes in backpack and update UI
_unit.unitEvents.onAbilityAdded.AddListener(OnAbilityAdded);
_unit.unitEvents.onAbilityRemoved.AddListener(OnAbilityRemoved);
}
private void OnClose()
{
// Stop listening
_playerController.OnActiveUnitChange -= OnActiveUnitChange;
// Backpack closed, no need to listen for backpack changes
if (_unit)
{
_unit.unitEvents.onAbilityAdded.RemoveListener(OnAbilityAdded);
_unit.unitEvents.onAbilityRemoved.RemoveListener(OnAbilityRemoved);
}
// Remove all VisualElement slots
_abilitySlots.ForEach(slot => slot.Destroy());
// Clear variables
_abilitySlots.Clear();
_unit = null;
_abilityBook = null;
}
private void OnActiveUnitChange(UnitObject unitObject)
{
windowUI.Close();
windowUI.Open();
}
private void OnAbilityAdded(AbilityBookAbilityAddedEvent abilityAddedEvent) => AddSlot(abilityAddedEvent.abilityAdded);
private void AddSlot(BasicAbility ability)
{
var newSlot = new SlotUI();
newSlot.InitNew(_abilityListElement, SlotType.AbilityBookSlot, -1);
newSlot.Set(ability);
_abilitySlots.Add(newSlot);
}
private void OnAbilityRemoved(AbilityBookAbilityRemovedEvent abilityRemovedEvent) => RemoveSlot(abilityRemovedEvent.abilityRemoved);
private void RemoveSlot(BasicAbility ability)
{
var oldSlot = _abilitySlots.FirstOrDefault(slot => slot.ability == ability);
oldSlot?.Destroy();
_abilitySlots.Remove(oldSlot);
}
}
}