Split equipment status from Inventory, fix equip/unequip bonuses being reflected correctly in code and inventory menu

This commit is contained in:
2025-02-19 16:04:40 -08:00
parent f71412d946
commit 5404f8e7b0
16 changed files with 200 additions and 170 deletions

View File

@@ -5,4 +5,6 @@ namespace GameJamDungeon;
public interface IEquipableItem : IInventoryItem
{
public ImmutableList<ItemTag> ItemTags { get; }
public bool IsEquipped { get; }
}

View File

@@ -1,8 +1,6 @@
using Chickensoft.AutoInject;
using Chickensoft.Collections;
using Chickensoft.GodotNodeInterfaces;
using Godot;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -11,22 +9,11 @@ namespace GameJamDungeon;
public interface IInventory : INode
{
public List<IInventoryItem> Items { get; }
public IAutoProp<Weapon> EquippedWeapon { get; }
public IAutoProp<Armor> EquippedArmor { get; }
public IAutoProp<Accessory> EquippedAccessory { get; }
public bool TryAdd(IInventoryItem inventoryItem);
public void Remove(IInventoryItem inventoryItem);
public void Equip(IEquipableItem equipable);
public void Unequip(IEquipableItem equipable);
public bool IsEquipped(IEquipableItem equipable);
public void Sort();
event Inventory.InventoryAtCapacityEventHandler InventoryAtCapacity;
@@ -51,38 +38,8 @@ public partial class Inventory : Node, IInventory
Items = [];
}
public void Setup()
{
EquippedWeapon.Changed += EquippedWeapon_Changed;
EquippedArmor.Changed += EquippedArmor_Changed;
EquippedAccessory.Changed += EquippedAccessory_Changed;
}
private void EquippedAccessory_Changed(Accessory obj)
{
}
private void EquippedArmor_Changed(Armor obj)
{
throw new NotImplementedException();
}
private void EquippedWeapon_Changed(Weapon obj)
{
throw new NotImplementedException();
}
public List<IInventoryItem> Items { get; private set; }
public IAutoProp<Weapon> EquippedWeapon => _equippedWeapon;
private AutoProp<Weapon> _equippedWeapon { get; set; } = new AutoProp<Weapon>(new Weapon());
public IAutoProp<Armor> EquippedArmor => _equippedArmor;
private AutoProp<Armor> _equippedArmor { get; set; } = new AutoProp<Armor>(new Armor());
public IAutoProp<Accessory> EquippedAccessory => _equippedAccessory;
private AutoProp<Accessory> _equippedAccessory { get; set; } = new AutoProp<Accessory>(new Accessory());
public bool TryAdd(IInventoryItem inventoryItem)
{
if (Items.Count >= _maxInventorySize)
@@ -98,50 +55,12 @@ public partial class Inventory : Node, IInventory
public void Remove(IInventoryItem inventoryItem) => Items.Remove(inventoryItem);
public void Equip(IEquipableItem equipable)
{
if (equipable is Weapon weapon)
_equippedWeapon.OnNext(weapon);
else if (equipable is Armor armor)
_equippedArmor.OnNext(armor);
else if (equipable is Accessory accessory)
_equippedAccessory.OnNext(accessory);
else
throw new NotImplementedException("Item type is not supported.");
}
public void Unequip(IEquipableItem equipable)
{
if (equipable is Weapon)
_equippedWeapon.OnNext(new Weapon());
else if (equipable is Armor)
_equippedArmor.OnNext(new Armor());
else if (equipable is Accessory)
_equippedAccessory.OnNext(new Accessory());
else
throw new NotImplementedException("Item type is not supported.");
if (equipable.ItemTags.Contains(ItemTag.BreaksOnChange))
Remove(equipable);
}
public bool IsEquipped(IEquipableItem equipable)
{
if (equipable is Weapon weapon)
return _equippedWeapon.Value.Equals(weapon);
else if (equipable is Armor armor)
return _equippedArmor.Value.Equals(armor);
else if (equipable is Accessory accessory)
return _equippedAccessory.Value.Equals(accessory);
else
throw new NotImplementedException("Item type is not supported.");
}
public void Sort()
{
var equippedWeapon = Items.OfType<Weapon>().Where(IsEquipped);
var equippedArmor = Items.OfType<Armor>().Where(IsEquipped);
var equippedAccessory = Items.OfType<Accessory>().Where(IsEquipped);
var equippedWeapon = Items.OfType<Weapon>().Where(x => x.IsEquipped);
var equippedArmor = Items.OfType<Armor>().Where(x => x.IsEquipped);
var equippedAccessory = Items.OfType<Accessory>().Where(x => x.IsEquipped);
var equippedItems = new List<IInventoryItem>();
equippedItems.AddRange(equippedWeapon);
equippedItems.AddRange(equippedArmor);

View File

@@ -41,10 +41,16 @@ public partial class Accessory : Node3D, IEquipableItem
public double LuckUp => _accessoryStats.LuckUp;
public int ATKUp => _accessoryStats.ATKUp;
public int DEFUp => _accessoryStats.DEFUp;
public ImmutableList<AccessoryTag> AccessoryTags => [.. _accessoryStats.AccessoryTags];
public ImmutableList<ItemTag> ItemTags => [.. _accessoryStats.ItemTags];
public bool IsEquipped { get; set; }
public void OnReady()
{
Pickup.BodyEntered += OnEntered;

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=3 format=3 uid="uid://b07srt3lckt4e"]
[ext_resource type="Script" path="res://src/items/accessory/Accessory.cs" id="1_ikyk2"]
[ext_resource type="Script" uid="uid://2xddsc0pjykd" path="res://src/items/accessory/Accessory.cs" id="1_ikyk2"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1ceef"]
radius = 0.470016

View File

@@ -1,17 +1,22 @@
[gd_resource type="Resource" script_class="AccessoryStats" load_steps=3 format=3 uid="uid://cvkwmart5y51r"]
[ext_resource type="Texture2D" uid="uid://hjyk3j24o48b" path="res://src/items/accessory/textures/MASK 03.PNG" id="1_q42cv"]
[ext_resource type="Script" path="res://src/items/accessory/AccessoryStats.cs" id="1_xqaot"]
[ext_resource type="Script" uid="uid://b8arlmivk68b" path="res://src/items/accessory/AccessoryStats.cs" id="1_xqaot"]
[resource]
script = ExtResource("1_xqaot")
ATKUp = 0
DEFUp = 0
LUCKUp = 0.15
LuckUp = 0.1
MaxHPUp = 0
MaxVTUp = 0
AccessoryTags = []
AccessoryTags = Array[int]([])
Name = "Mask of the Goddess of Avarice"
Description = "Raises Luck"
Texture = ExtResource("1_q42cv")
SpawnRate = 0.1
ThrowSpeed = 12.0
HealHPAmount = 0
HealVTAmount = 0
ThrowDamage = 5
ItemTags = Array[int]([])

View File

@@ -37,6 +37,8 @@ public partial class Armor : Node3D, IEquipableItem
public ImmutableList<ItemTag> ItemTags => [.. _armorStats.ItemTags];
public bool IsEquipped { get; set; }
public void OnReady()
{
Pickup.BodyEntered += OnEntered;

View File

@@ -51,6 +51,8 @@ public partial class Weapon : Node3D, IInventoryItem, IEquipableItem
public double ElementalDamageBonus => _weaponStats.ElementalDamageBonus;
public bool IsEquipped { get; set; }
public void OnReady()
{
Pickup.BodyEntered += OnEntered;
@@ -60,8 +62,11 @@ public partial class Weapon : Node3D, IInventoryItem, IEquipableItem
public void SetItemStats(InventoryItemStats inventoryItemStats)
{
_weaponStats = (WeaponStats)inventoryItemStats;
var texture = ResourceLoader.Load(inventoryItemStats.Texture.ResourcePath) as Texture2D;
Sprite.Texture = texture;
if (inventoryItemStats.Texture != null)
{
var texture = ResourceLoader.Load(inventoryItemStats.Texture.ResourcePath) as Texture2D;
Sprite.Texture = texture;
}
}
public void Throw()