Split equipment status from Inventory, fix equip/unequip bonuses being reflected correctly in code and inventory menu
This commit is contained in:
@@ -5,4 +5,6 @@ namespace GameJamDungeon;
|
||||
public interface IEquipableItem : IInventoryItem
|
||||
{
|
||||
public ImmutableList<ItemTag> ItemTags { get; }
|
||||
|
||||
public bool IsEquipped { get; }
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]([])
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user