Rewrite and simplify Inventory Menu, various fixes for item effects
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user