using Chickensoft.Collections; using Godot; using System; using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter.Entity; namespace Zennysoft.Game.Ma; public class EquipmentComponent : IEquipmentComponent { public IAutoProp EquippedWeapon => _equippedWeapon; public IAutoProp EquippedArmor => _equippedArmor; public IAutoProp EquippedAccessory => _equippedAccessory; public AutoProp _equippedWeapon; public AutoProp _equippedArmor; public AutoProp _equippedAccessory; public event Action EquipmentChanged; public int BonusAttack => _equippedWeapon.Value.BonusAttack + _equippedArmor.Value.BonusAttack + _equippedAccessory.Value.BonusAttack; public int BonusDefense => _equippedWeapon.Value.BonusDefense + _equippedArmor.Value.BonusDefense + _equippedAccessory.Value.BonusDefense; public int BonusHP => _equippedWeapon.Value.BonusHP + _equippedArmor.Value.BonusHP + _equippedAccessory.Value.BonusHP; public int BonusVT => _equippedWeapon.Value.BonusVT + _equippedArmor.Value.BonusVT + _equippedAccessory.Value.BonusVT; public int BonusLuck => _equippedWeapon.Value.BonusLuck + _equippedArmor.Value.BonusLuck + _equippedAccessory.Value.BonusLuck; public ElementalResistanceSet ElementalResistance => _equippedWeapon.Value.ElementalResistance + _equippedArmor.Value.ElementalResistance + _equippedAccessory.Value.ElementalResistance; public EquipmentComponent() { _equippedWeapon = new AutoProp(new Weapon()); _equippedArmor = new AutoProp(new Armor()); _equippedAccessory = new AutoProp(new Accessory()); } public void Reset() { _equippedWeapon.OnNext(new Weapon()); _equippedArmor.OnNext(new Armor()); _equippedAccessory.OnNext(new Accessory()); } public void Equip(EquipableItem equipable) { if (equipable is Weapon weapon) _equippedWeapon.OnNext(weapon); if (equipable is Armor armor) _equippedArmor.OnNext(armor); if (equipable is Accessory accessory) _equippedAccessory.OnNext(accessory); EquipmentChanged?.Invoke(equipable); } public void Unequip(EquipableItem equipable) { if (equipable is Weapon weapon) _equippedWeapon.OnNext(new Weapon()); if (equipable is Armor armor) _equippedArmor.OnNext(new Armor()); if (equipable is Accessory accessory) _equippedAccessory.OnNext(new Accessory()); EquipmentChanged?.Invoke(equipable); } public bool IsItemEquipped(InventoryItem item) { if (item is not EquipableItem) return false; return item == _equippedWeapon.Value || item == _equippedArmor.Value || item == _equippedAccessory.Value; } }