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

362 lines
18 KiB
C#

using UnityEngine;
using UnityEngine.UIElements;
using VOID.Generic.Dict;
using VOID.Generic.Objects.Abstract.Events;
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;
namespace VOID.UserInterface.Game
{
public class EquipmentUI : MonoBehaviour, IHasWindow
{
public static EquipmentUI current {get; private set;}
// WindowUI
public WindowUI windowUI { get; private set; }
// Visual Elements
private VisualElement _rootElement;
private Button[] _tabElements;
private VisualElement[] _tabContentElements;
// Visual Elements - Attributes values
private Label _strengthLabel;
private Label _dexterityLabel;
private Label _intelligenceLabel;
private Label _constitutionLabel;
private Label _speedLabel;
private Label _perceptionLabel;
private Label _damageLabel;
private Label _accuracyLabel;
private Label _dodgeLabel;
private Label _criticalChanceLabel;
private Label _criticalMultiplierLabel;
private Label _sightLabel;
private Label _hearLabel;
private Label _moveLabel;
private Label _initiativeLabel;
private Label _carryCapacityLabel;
// Visual Elements - Resources values
private Label _healthLabel;
private Label _actionPointsLabel;
private Label _movePointsLabel;
// Visual Elements - Equipment Slots
private readonly SlotUI _mainHandSlot = new();
private readonly SlotUI _offHandSlot = new();
private readonly SlotUI _helmetSlot = new();
private readonly SlotUI _armorSlot = new();
private readonly SlotUI _beltSlot = new();
private readonly SlotUI _pantsSlot = new();
private readonly SlotUI _bootsSlot = new();
private readonly SlotUI _necklaceSlot = new();
private readonly SlotUI _glovesSlot = new();
private readonly SlotUI _ringOneSlot = new();
private readonly SlotUI _ringTwoSlot = new();
// References
private UnitObject _unit;
private UnitObjectEquipment _equipment;
private PlayerController _playerController;
private ShortcutsInputManager _shortcutsInputManager;
// String formattings
private const string F0 = "F0";
private const string F1 = "F1";
private const string F2 = "F2";
private const string P0 = "P0";
private const string P1 = "P1";
private const string P2 = "P2";
private void Awake()
{
current = this;
var uiDocument = gameObject.GetComponent<UIDocument>();
var templateElement = uiDocument.rootVisualElement;
// Get all VisualElements
_rootElement = templateElement.Q("root-equipment");
windowUI = gameObject.GetComponent<WindowUI>();
// Get all VisualElements - Attributes
_strengthLabel = _rootElement.Q<Label>("strength");
_dexterityLabel = _rootElement.Q<Label>("dexterity");
_intelligenceLabel = _rootElement.Q<Label>("intelligence");
_constitutionLabel = _rootElement.Q<Label>("constitution");
_speedLabel = _rootElement.Q<Label>("speed");
_perceptionLabel = _rootElement.Q<Label>("perception");
_damageLabel = _rootElement.Q<Label>("damage");
_accuracyLabel = _rootElement.Q<Label>("accuracy");
_dodgeLabel = _rootElement.Q<Label>("dodge");
_criticalChanceLabel = _rootElement.Q<Label>("critical-damage-chance");
_criticalMultiplierLabel = _rootElement.Q<Label>("critical-damage-multiplier");
_sightLabel = _rootElement.Q<Label>("sight");
_hearLabel = _rootElement.Q<Label>("hear");
_moveLabel = _rootElement.Q<Label>("move");
_initiativeLabel = _rootElement.Q<Label>("initiative");
// Get all VisualElements - Resources
_healthLabel = _rootElement.Q<Label>("health");
_actionPointsLabel = _rootElement.Q<Label>("action-points");
_movePointsLabel = _rootElement.Q<Label>("move-points");
// Get all VisualElements - Items
_mainHandSlot.Init(_rootElement.Q("item-main-hand"), SlotType.EquipmentSlot, (int)EquipmentSlotType.MainHand);
_offHandSlot.Init(_rootElement.Q("item-off-hand"), SlotType.EquipmentSlot, (int)EquipmentSlotType.OffHand);
_helmetSlot.Init(_rootElement.Q("item-helmet"), SlotType.EquipmentSlot, (int)EquipmentSlotType.Helmet);
_armorSlot.Init(_rootElement.Q("item-armor"), SlotType.EquipmentSlot, (int)EquipmentSlotType.Armor);
_beltSlot.Init(_rootElement.Q("item-belt"), SlotType.EquipmentSlot, (int)EquipmentSlotType.Belt);
_pantsSlot.Init(_rootElement.Q("item-pants"), SlotType.EquipmentSlot, (int)EquipmentSlotType.Pants);
_bootsSlot.Init(_rootElement.Q("item-boots"), SlotType.EquipmentSlot, (int)EquipmentSlotType.Boots);
_necklaceSlot.Init(_rootElement.Q("item-necklace"), SlotType.EquipmentSlot, (int)EquipmentSlotType.Necklace);
_glovesSlot.Init(_rootElement.Q("item-gloves"), SlotType.EquipmentSlot, (int)EquipmentSlotType.Gloves);
_ringOneSlot.Init(_rootElement.Q("item-ring-one"), SlotType.EquipmentSlot, (int)EquipmentSlotType.RingOne);
_ringTwoSlot.Init(_rootElement.Q("item-ring-two"), SlotType.EquipmentSlot, (int)EquipmentSlotType.RingTwo);
_rootElement.dataSource = this;
_rootElement.pickingMode = PickingMode.Position;
}
private void Start()
{
_playerController = PlayerController.current;
_shortcutsInputManager = ShortcutsInputManager.current;
// Toggle show/hide when pressing shortcut for backpack
_shortcutsInputManager.equipment.performed += _ => windowUI.Toggle();
windowUI.OnOpen += OnOpen;
windowUI.OnClose += OnClose;
windowUI.SetTitle("Equipment");
// 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;
_equipment = _unit.unitEquipment;
// Refresh UI when we change active unit
_playerController.OnActiveUnitChange += OnActiveUnitChange;
// Listen to all changes in equipment and update UI
_unit.unitEvents.onEquipmentEquip.AddListener(OnEquip);
_unit.unitEvents.onEquipmentUnEquip.AddListener(OnUnEquip);
_unit.unitEvents.onMainAttributeChange.AddListener(OnMainAttributeChange);
_unit.unitEvents.onSubAttributeChange.AddListener(OnSubAttributeChange);
_unit.unitEvents.onMaxResourceChange.AddListener(OnUnitResourceChange);
_unit.unitEvents.onCurrentResourceChange.AddListener(OnUnitResourceChange);
_unit.basicEvents.onMaxResourceChange.AddListener(OnBasicResourceChange);
_unit.basicEvents.onCurrentResourceChange.AddListener(OnBasicResourceChange);
// Update all values when opening
UpdateAll();
}
private void OnClose()
{
// Stop listening
_playerController.OnActiveUnitChange -= OnActiveUnitChange;
// Backpack closed, no need to listen for backpack changes
if (_unit)
{
_unit.unitEvents.onEquipmentEquip.RemoveListener(OnEquip);
_unit.unitEvents.onEquipmentUnEquip.RemoveListener(OnUnEquip);
_unit.unitEvents.onMainAttributeChange.RemoveListener(OnMainAttributeChange);
_unit.unitEvents.onSubAttributeChange.RemoveListener(OnSubAttributeChange);
_unit.unitEvents.onMaxResourceChange.RemoveListener(OnUnitResourceChange);
_unit.unitEvents.onCurrentResourceChange.RemoveListener(OnUnitResourceChange);
_unit.basicEvents.onMaxResourceChange.RemoveListener(OnBasicResourceChange);
_unit.basicEvents.onCurrentResourceChange.RemoveListener(OnBasicResourceChange);
}
// Clear variables
_unit = null;
_equipment = null;
}
private void OnActiveUnitChange(UnitObject unitObject)
{
windowUI.Close();
windowUI.Open();
}
private void OnMainAttributeChange(MainAttributeChangeEvent mainAttributeChangeEvent)
{
switch (mainAttributeChangeEvent.type)
{
case MainAttributeType.Strength: OnStrengthChange(); break;
case MainAttributeType.Dexterity: OnDexterityChange(); break;
case MainAttributeType.Intelligence: OnIntelligenceChange(); break;
case MainAttributeType.Constitution: OnConstitutionChange(); break;
case MainAttributeType.Speed: OnSpeedChange(); break;
case MainAttributeType.Perception: OnPerceptionChange(); break;
}
}
private void OnSubAttributeChange(SubAttributeChangeEvent subAttributeChangeEvent)
{
switch (subAttributeChangeEvent.type)
{
case SubAttributeType.DamageMin:
case SubAttributeType.DamageMax: OnDamageChange(); break;
case SubAttributeType.CriticalDamageChance: OnCriticalDamageChanceChange(); break;
case SubAttributeType.CriticalDamageMultiplier: OnCriticalDamageMultiplierChange(); break;
case SubAttributeType.Accuracy: OnAccuracyChange(); break;
case SubAttributeType.Dodge: OnDodgeChange(); break;
case SubAttributeType.Sight: OnSightChange(); break;
case SubAttributeType.Hear: OnHearChange(); break;
case SubAttributeType.Move: OnMoveChange(); break;
case SubAttributeType.Initiative: OnInitiativeChange(); break;
}
}
private void OnBasicResourceChange(BasicResourceChangeEvent basicResourceChangeEvent)
{
switch (basicResourceChangeEvent.type)
{
case BasicResourceType.Health: OnHealthChange(); break;
}
}
private void OnUnitResourceChange(UnitResourceChangeEvent unitResourceChangeEvent)
{
switch (unitResourceChangeEvent.type)
{
case UnitResourceType.MovePoints: OnMovePointsChange(); break;
case UnitResourceType.ActionPoints: OnActionPointsChange(); break;
}
}
private void OnEquip(EquipmentEquipEvent equipmentEquipEvent)
{
switch (equipmentEquipEvent.equipmentSlot)
{
case EquipmentSlotType.MainHand: OnMainHandChange(); break;
case EquipmentSlotType.OffHand: OnOffHandChange(); break;
case EquipmentSlotType.Helmet: OnHelmetChange(); break;
case EquipmentSlotType.Armor: OnArmorChange(); break;
case EquipmentSlotType.Pants: OnPantsChange(); break;
case EquipmentSlotType.Belt: OnBeltChange(); break;
case EquipmentSlotType.Boots: OnBootsChange(); break;
case EquipmentSlotType.Gloves: OnGlovesChange(); break;
case EquipmentSlotType.Necklace: OnNecklaceChange(); break;
case EquipmentSlotType.RingOne: OnRingOneChange(); break;
case EquipmentSlotType.RingTwo: OnRingTwoChange(); break;
default: Debug.LogWarning("Unrecognized EquipmentSlot: " + equipmentEquipEvent.equipmentSlot); return;
}
}
private void OnUnEquip(EquipmentUnEquipEvent equipmentUnEquipEvent)
{
switch (equipmentUnEquipEvent.equipmentSlot)
{
case EquipmentSlotType.MainHand: OnMainHandChange(); break;
case EquipmentSlotType.OffHand: OnOffHandChange(); break;
case EquipmentSlotType.Helmet: OnHelmetChange(); break;
case EquipmentSlotType.Armor: OnArmorChange(); break;
case EquipmentSlotType.Pants: OnPantsChange(); break;
case EquipmentSlotType.Belt: OnBeltChange(); break;
case EquipmentSlotType.Boots: OnBootsChange(); break;
case EquipmentSlotType.Gloves: OnGlovesChange(); break;
case EquipmentSlotType.Necklace: OnNecklaceChange(); break;
case EquipmentSlotType.RingOne: OnRingOneChange(); break;
case EquipmentSlotType.RingTwo: OnRingTwoChange(); break;
default: Debug.LogWarning("Unrecognized EquipmentSlot: " + equipmentUnEquipEvent.equipmentSlot); return;
}
}
private void UpdateAll()
{
OnStrengthChange();
OnDexterityChange();
OnIntelligenceChange();
OnConstitutionChange();
OnSpeedChange();
OnPerceptionChange();
OnDamageChange();
OnAccuracyChange();
OnDodgeChange();
OnCriticalDamageChanceChange();
OnCriticalDamageMultiplierChange();
OnSightChange();
OnHearChange();
OnMoveChange();
OnInitiativeChange();
OnHealthChange();
OnActionPointsChange();
OnMovePointsChange();
OnMainHandChange();
OnOffHandChange();
OnHelmetChange();
OnArmorChange();
OnPantsChange();
OnBeltChange();
OnBootsChange();
OnGlovesChange();
OnNecklaceChange();
OnRingOneChange();
OnRingTwoChange();
}
// On Change - MainAttributes
private void OnStrengthChange() => _strengthLabel.text = $"{_unit.unitData.mainAttributes.strength.ToString(F0)}";
private void OnDexterityChange() => _dexterityLabel.text = $"{_unit.unitData.mainAttributes.dexterity.ToString(F0)}";
private void OnIntelligenceChange() => _intelligenceLabel.text = $"{_unit.unitData.mainAttributes.intelligence.ToString(F0)}";
private void OnConstitutionChange() => _constitutionLabel.text = $"{_unit.unitData.mainAttributes.constitution.ToString(F0)}";
private void OnSpeedChange() => _speedLabel.text = $"{_unit.unitData.mainAttributes.speed.ToString(F0)}";
private void OnPerceptionChange() => _perceptionLabel.text = $"{_unit.unitData.mainAttributes.perception.ToString(F0)}";
// On Change - SubAttributes
private void OnDamageChange() => _damageLabel.text = $"{_unit.unitData.subAttributes.damageMin.ToString(F0)} - {_unit.unitData.subAttributes.damageMax.ToString(F0)}";
private void OnAccuracyChange() => _accuracyLabel.text = $"{_unit.unitData.subAttributes.accuracy.ToString(P0)}";
private void OnDodgeChange() => _dodgeLabel.text = $"{_unit.unitData.subAttributes.dodge.ToString(P0)}";
private void OnCriticalDamageChanceChange() => _criticalChanceLabel.text = $"{_unit.unitData.subAttributes.criticalDamageChance.ToString(P0)}";
private void OnCriticalDamageMultiplierChange() => _criticalMultiplierLabel.text = $"{_unit.unitData.subAttributes.criticalDamageMultiplier.ToString(P0)}";
private void OnSightChange() => _sightLabel.text = $"{_unit.unitData.subAttributes.sight.ToString(F0)}";
private void OnHearChange() => _hearLabel.text = $"{_unit.unitData.subAttributes.hear.ToString(F0)}";
private void OnMoveChange() => _moveLabel.text = $"{_unit.unitData.subAttributes.move.ToString(F1)}m";
private void OnInitiativeChange() => _initiativeLabel.text = $"{_unit.unitData.subAttributes.initiative.ToString(F0)}";
// On Change - Resources
private void OnHealthChange() => _healthLabel.text =
$"{_unit.basicData.currentResources.health.ToString(F0)} / {_unit.basicData.maxResources.health.ToString(F0)}";
private void OnActionPointsChange() => _actionPointsLabel.text =
$"{_unit.unitData.currentResources.actionPoints.ToString(F0)} / {_unit.unitData.maxResources.actionPoints.ToString(F0)}";
private void OnMovePointsChange() => _movePointsLabel.text =
$"{_unit.unitData.currentResources.movePoints.ToString(F1)} / {_unit.unitData.maxResources.movePoints.ToString(F1)}";
// On Change - Items
private void OnMainHandChange() => _mainHandSlot.Set(_equipment.GetEquipped(EquipmentSlotType.MainHand));
private void OnOffHandChange() => _offHandSlot.Set(_equipment.GetEquipped(EquipmentSlotType.OffHand));
private void OnHelmetChange() => _helmetSlot.Set(_equipment.GetEquipped(EquipmentSlotType.Helmet));
private void OnArmorChange() => _armorSlot.Set(_equipment.GetEquipped(EquipmentSlotType.Armor));
private void OnPantsChange() => _pantsSlot.Set(_equipment.GetEquipped(EquipmentSlotType.Pants));
private void OnBeltChange() => _beltSlot.Set(_equipment.GetEquipped(EquipmentSlotType.Belt));
private void OnBootsChange() => _bootsSlot.Set(_equipment.GetEquipped(EquipmentSlotType.Boots));
private void OnGlovesChange() => _glovesSlot.Set(_equipment.GetEquipped(EquipmentSlotType.Gloves));
private void OnNecklaceChange() => _necklaceSlot.Set(_equipment.GetEquipped(EquipmentSlotType.Necklace));
private void OnRingOneChange() => _ringOneSlot.Set(_equipment.GetEquipped(EquipmentSlotType.RingOne));
private void OnRingTwoChange() => _ringTwoSlot.Set(_equipment.GetEquipped(EquipmentSlotType.RingTwo));
}
}