Rewrite and simplify Inventory Menu, various fixes for item effects

This commit is contained in:
2025-11-04 01:12:16 -08:00
parent 7b7fc910bd
commit a5846e08dc
49 changed files with 1070 additions and 826 deletions

View File

@@ -1,18 +1,19 @@
using Chickensoft.AutoInject;
using Chickensoft.Collections;
using Chickensoft.Introspection;
using Godot;
using System;
using Zennysoft.Game.Abstractions;
using Zennysoft.Game.Implementation;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
public partial class ItemSlot : HBoxContainer, IItemSlot
public partial class ItemSlot : Button, IItemSlot
{
public override void _Notification(int what) => this.Notify(what);
[Dependency] public IPlayer Player => this.DependOn<IPlayer>();
[Dependency] private IPlayer _player => this.DependOn<IPlayer>();
[Node] public TextureRect ItemTexture { get; set; } = default!;
@@ -20,6 +21,8 @@ public partial class ItemSlot : HBoxContainer, IItemSlot
[Node] public Label ItemCount { get; set; } = default!;
public AutoProp<InventoryItem> Item { get; } = new AutoProp<InventoryItem>(default);
private static LabelSettings ItemFont => GD.Load<LabelSettings>("res://src/ui/label_settings/MainTextBold.tres");
private static LabelSettings SelectedItemFont => GD.Load<LabelSettings>("res://src/ui/label_settings/MainTextFontItalicized.tres");
@@ -28,53 +31,89 @@ public partial class ItemSlot : HBoxContainer, IItemSlot
private static LabelSettings SelectedEquippedItemFont => GD.Load<LabelSettings>("res://src/ui/label_settings/MainTextFontSelectedEquipped.tres");
public void OnReady()
{
ItemName.Text = Item.ItemName;
ItemTexture.Texture = Item.GetTexture();
Player.EquipmentComponent.EquippedWeapon.Sync += EquipableItem_Sync;
Player.EquipmentComponent.EquippedArmor.Sync += EquipableItem_Sync;
Player.EquipmentComponent.EquippedAccessory.Sync += EquipableItem_Sync;
public event Action<InventoryItem> ItemPressed;
public event Action<IItemSlot> ItemEnterFocus;
public event Action<IItemSlot> ItemExitFocus;
if (Item is IStackable stackableItem)
{
ItemCount.Text = $"{stackableItem.Count:D2}";
ItemCount.Visible = true;
}
}
public bool IsSelected { get; set; } = false;
private void EquipableItem_Sync(EquipableItem obj)
public void OnResolved()
{
if (Item is EquipableItem equipableItem && equipableItem == obj)
{
SetEquippedSelectedItemStyle();
}
if (Item is EquipableItem unequippedItem && unequippedItem != obj)
{
SetItemStyle();
}
Item.Changed += Item_Changed;
_player.EquipmentComponent.EquippedWeapon.Sync += EquipableItem_Sync;
_player.EquipmentComponent.EquippedArmor.Sync += EquipableItem_Sync;
_player.EquipmentComponent.EquippedAccessory.Sync += EquipableItem_Sync;
FocusEntered += ItemSlot_FocusEntered;
FocusExited += ItemSlot_FocusExited;
Pressed += ItemSlot_Pressed;
}
public void SetItemStyle()
{
ItemName.LabelSettings = ItemFont;
if (_player.EquipmentComponent.IsItemEquipped(Item.Value) && IsSelected)
SetEquippedSelectedItemStyle();
else if (_player.EquipmentComponent.IsItemEquipped(Item.Value))
SetEquippedItemStyle();
else if (IsSelected)
SetSelectedItemStyle();
else
SetToUnselectedStyle();
}
public void SetSelectedItemStyle()
public void SetToUnselectedStyle()
{
if (Player.EquipmentComponent.IsItemEquipped(Item))
SetItemFont();
if (_player.EquipmentComponent.IsItemEquipped(Item.Value))
SetEquippedItemStyle();
}
private void EquipableItem_Sync(EquipableItem item) => SetItemStyle();
private void ItemSlot_Pressed()
{
if (Item.Value == null)
return;
ItemPressed?.Invoke(Item.Value);
}
private void ItemSlot_FocusExited() => ItemExitFocus?.Invoke(this);
private void ItemSlot_FocusEntered() => ItemEnterFocus?.Invoke(this);
private void Item_Changed(InventoryItem obj)
{
if (obj == null)
return;
ItemName.Text = obj.ItemName;
ItemTexture.Texture = obj.GetTexture();
if (obj is IStackable stackableItem)
{
ItemCount.Text = $"{stackableItem.Count:D2}";
ItemCount.Visible = true;
}
else
{
ItemCount.Text = string.Empty;
ItemCount.Visible = false;
}
}
private void SetToSelectedStyle() => SetSelectedItemStyle();
private void SetSelectedItemStyle()
{
if (_player.EquipmentComponent.IsItemEquipped(Item.Value))
ItemName.LabelSettings = SelectedEquippedItemFont;
else
ItemName.LabelSettings = SelectedItemFont;
}
public void SetEquippedItemStyle()
{
ItemName.LabelSettings = EquippedItemFont;
}
private void SetItemFont() => ItemName.LabelSettings = ItemFont;
public void SetEquippedSelectedItemStyle()
{
ItemName.LabelSettings = SelectedEquippedItemFont;
}
private void SetEquippedItemStyle() => ItemName.LabelSettings = EquippedItemFont;
public InventoryItem Item { get; set; } = default!;
private void SetEquippedSelectedItemStyle() => ItemName.LabelSettings = SelectedEquippedItemFont;
}