using Chickensoft.Collections; 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 IAutoProp EquippedAmmo => _equippedAmmo; public AutoProp _equippedWeapon; public AutoProp _equippedArmor; public AutoProp _equippedAccessory; public AutoProp _equippedAmmo; 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()); _equippedAmmo = new AutoProp(new Ammo()); } public void Reset() { _equippedWeapon.OnNext(new Weapon()); _equippedArmor.OnNext(new Armor()); _equippedAccessory.OnNext(new Accessory()); _equippedAmmo.OnNext(new Ammo()); } public void Equip(IEquipableItem 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); if (equipable is Ammo ammo) _equippedAmmo.OnNext(ammo); EquipmentChanged?.Invoke(equipable); } public void Unequip(IEquipableItem 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()); if (equipable is Ammo ammo) _equippedAmmo.OnNext(new Ammo()); EquipmentChanged?.Invoke(equipable); } public bool IsItemEquipped(IEquipableItem item) { return item == _equippedWeapon.Value || item == _equippedArmor.Value || item == _equippedAccessory.Value || item == _equippedAmmo.Value; } public void UpdateEquipment(IEquipableItem equipable) => EquipmentChanged?.Invoke(equipable); public bool AugmentableEquipmentExists() { return (_equippedWeapon.Value.ItemName != null && _equippedWeapon.Value.Augment == null) || (_equippedArmor.Value.ItemName != null && _equippedArmor.Value.Augment == null) || (_equippedAccessory.Value.ItemName != null && _equippedAccessory.Value.Augment == null); } }