diff --git a/Entity/Character/Character.cs b/Entity/Character/Character.cs index 81e6a70..93ab42e 100644 --- a/Entity/Character/Character.cs +++ b/Entity/Character/Character.cs @@ -875,12 +875,15 @@ namespace Milimoe.FunGame.Core.Entity } /// - /// 为角色装备物品(必须使用此方法而不是自己去给EquipSlot里的物品赋值) + /// 为角色装备物品(必须使用此方法而不是自己去给EquipSlot里的物品赋值) + /// 此方法装备到指定栏位,并返回被替换的装备(如果有的话) /// /// /// - public bool Equip(Item item, EquipSlotType slot) + /// + public bool Equip(Item item, EquipSlotType slot, out Item? previous) { + previous = null; bool result = false; double pastHP = HP; double pastMaxHP = MaxHP; @@ -891,7 +894,7 @@ namespace Milimoe.FunGame.Core.Entity case EquipSlotType.MagicCardPack: if (item.ItemType == ItemType.MagicCardPack) { - UnEquip(EquipSlotType.MagicCardPack); + previous = UnEquip(EquipSlotType.MagicCardPack); EquipSlot.MagicCardPack = item; item.OnItemEquip(this, EquipSlotType.MagicCardPack); result = true; @@ -900,7 +903,7 @@ namespace Milimoe.FunGame.Core.Entity case EquipSlotType.Weapon: if (item.ItemType == ItemType.Weapon) { - UnEquip(EquipSlotType.Weapon); + previous = UnEquip(EquipSlotType.Weapon); EquipSlot.Weapon = item; item.OnItemEquip(this, EquipSlotType.Weapon); result = true; @@ -909,7 +912,7 @@ namespace Milimoe.FunGame.Core.Entity case EquipSlotType.Armor: if (item.ItemType == ItemType.Armor) { - UnEquip(EquipSlotType.Armor); + previous = UnEquip(EquipSlotType.Armor); EquipSlot.Armor = item; item.OnItemEquip(this, EquipSlotType.Armor); result = true; @@ -918,7 +921,7 @@ namespace Milimoe.FunGame.Core.Entity case EquipSlotType.Shoes: if (item.ItemType == ItemType.Shoes) { - UnEquip(EquipSlotType.Shoes); + previous = UnEquip(EquipSlotType.Shoes); EquipSlot.Shoes = item; item.OnItemEquip(this, EquipSlotType.Shoes); result = true; @@ -927,7 +930,7 @@ namespace Milimoe.FunGame.Core.Entity case EquipSlotType.Accessory1: if (item.ItemType == ItemType.Accessory) { - UnEquip(EquipSlotType.Accessory1); + previous = UnEquip(EquipSlotType.Accessory1); EquipSlot.Accessory1 = item; EquipSlot.LastEquipSlotType = EquipSlotType.Accessory1; item.OnItemEquip(this, EquipSlotType.Accessory1); @@ -937,7 +940,7 @@ namespace Milimoe.FunGame.Core.Entity case EquipSlotType.Accessory2: if (item.ItemType == ItemType.Accessory) { - UnEquip(EquipSlotType.Accessory2); + previous = UnEquip(EquipSlotType.Accessory2); EquipSlot.Accessory2 = item; EquipSlot.LastEquipSlotType = EquipSlotType.Accessory2; item.OnItemEquip(this, EquipSlotType.Accessory2); @@ -963,29 +966,70 @@ namespace Milimoe.FunGame.Core.Entity switch (item.ItemType) { case ItemType.MagicCardPack: - return Equip(item, EquipSlotType.MagicCardPack); + return Equip(item, EquipSlotType.MagicCardPack, out _); case ItemType.Weapon: - return Equip(item, EquipSlotType.Weapon); + return Equip(item, EquipSlotType.Weapon, out _); case ItemType.Armor: - return Equip(item, EquipSlotType.Armor); + return Equip(item, EquipSlotType.Armor, out _); case ItemType.Shoes: - return Equip(item, EquipSlotType.Shoes); + return Equip(item, EquipSlotType.Shoes, out _); case ItemType.Accessory: if (EquipSlot.Accessory1 is null) { - return Equip(item, EquipSlotType.Accessory1); + return Equip(item, EquipSlotType.Accessory1, out _); } else if (EquipSlot.Accessory1 != null && EquipSlot.Accessory2 is null) { - return Equip(item, EquipSlotType.Accessory2); + return Equip(item, EquipSlotType.Accessory2, out _); } else if (EquipSlot.Accessory1 != null && EquipSlot.Accessory2 != null && EquipSlot.LastEquipSlotType == EquipSlotType.Accessory1) { - return Equip(item, EquipSlotType.Accessory2); + return Equip(item, EquipSlotType.Accessory2, out _); } else { - return Equip(item, EquipSlotType.Accessory1); + return Equip(item, EquipSlotType.Accessory1, out _); + } + } + return false; + } + + /// + /// 为角色装备物品(必须使用此方法而不是自己去给EquipSlot里的物品赋值) + /// 此方法为根据物品类型,优先空位自动装备 + /// 此方法可返回被替换的装备(如果有的话) + /// + /// + /// + public bool Equip(Item item, out Item? previous) + { + previous = null; + switch (item.ItemType) + { + case ItemType.MagicCardPack: + return Equip(item, EquipSlotType.MagicCardPack, out previous); + case ItemType.Weapon: + return Equip(item, EquipSlotType.Weapon, out previous); + case ItemType.Armor: + return Equip(item, EquipSlotType.Armor, out previous); + case ItemType.Shoes: + return Equip(item, EquipSlotType.Shoes, out previous); + case ItemType.Accessory: + if (EquipSlot.Accessory1 is null) + { + return Equip(item, EquipSlotType.Accessory1, out previous); + } + else if (EquipSlot.Accessory1 != null && EquipSlot.Accessory2 is null) + { + return Equip(item, EquipSlotType.Accessory2, out previous); + } + else if (EquipSlot.Accessory1 != null && EquipSlot.Accessory2 != null && EquipSlot.LastEquipSlotType == EquipSlotType.Accessory1) + { + return Equip(item, EquipSlotType.Accessory2, out previous); + } + else + { + return Equip(item, EquipSlotType.Accessory1, out previous); } } return false; diff --git a/Entity/Item/Item.cs b/Entity/Item/Item.cs index d84e073..870506d 100644 --- a/Entity/Item/Item.cs +++ b/Entity/Item/Item.cs @@ -54,16 +54,16 @@ namespace Milimoe.FunGame.Core.Entity }; } } - + /// /// 是否允许装备 - /// [ 注意:这个不是用来判断是不是装备类型的,判断装备类型时,请判断他们的 ] + /// [ 注意:这个不是用来判断是不是装备类型的,判断装备类型时,请判断他们的 ] /// public bool Equipable { get; set; } = true; /// /// 是否允许取消装备 - /// [ 注意:这个不是用来判断是不是装备类型的,判断装备类型时,请判断他们的 ] + /// [ 注意:这个不是用来判断是不是装备类型的,判断装备类型时,使用 ] /// public bool Unequipable { get; set; } = true; @@ -310,7 +310,7 @@ namespace Milimoe.FunGame.Core.Entity /// /// 局外(库存)使用物品触发 /// - public void UseItem(/*Inventory inventory*/) + public void UseItem() { if (User != null) OnItemUsed(User, this); } @@ -322,7 +322,7 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - public virtual void OnItemUsed(Character character, Item item, bool cancel, bool used) + protected virtual void OnItemUsed(Character character, Item item, bool cancel, bool used) { } @@ -332,7 +332,7 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - public virtual void OnItemUsed(User user, Item item) + protected virtual void OnItemUsed(User user, Item item) { } @@ -343,7 +343,7 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - public virtual void OnItemEquipped(Character character, Item item, EquipSlotType type) + protected virtual void OnItemEquipped(Character character, Item item, EquipSlotType type) { } @@ -354,7 +354,7 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - public virtual void OnItemUnEquipped(Character character, Item item, EquipSlotType type) + protected virtual void OnItemUnEquipped(Character character, Item item, EquipSlotType type) { } diff --git a/Library/Common/JsonConverter/ItemConverter.cs b/Library/Common/JsonConverter/ItemConverter.cs index 7097412..5e5facd 100644 --- a/Library/Common/JsonConverter/ItemConverter.cs +++ b/Library/Common/JsonConverter/ItemConverter.cs @@ -59,6 +59,12 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter case nameof(Item.Equipable): result.Equipable = reader.GetBoolean(); break; + case nameof(Item.Unequipable): + result.Unequipable = reader.GetBoolean(); + break; + case nameof(Item.RemainUseTimes): + result.RemainUseTimes = reader.GetInt32(); + break; case nameof(Item.IsPurchasable): result.IsPurchasable = reader.GetBoolean(); break; @@ -128,6 +134,8 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter writer.WriteNumber(nameof(Item.RankType), (int)value.RankType); writer.WriteBoolean(nameof(Item.IsInGameItem), value.IsInGameItem); writer.WriteBoolean(nameof(Item.Equipable), value.Equipable); + writer.WriteBoolean(nameof(Item.Unequipable), value.Unequipable); + writer.WriteNumber(nameof(Item.RemainUseTimes), value.RemainUseTimes); writer.WriteBoolean(nameof(Item.IsPurchasable), value.IsPurchasable); writer.WriteNumber(nameof(Item.Price), value.Price); if (!value.IsSellable) diff --git a/Model/ActionQueue.cs b/Model/ActionQueue.cs index 5f15cee..449938a 100644 --- a/Model/ActionQueue.cs +++ b/Model/ActionQueue.cs @@ -1987,31 +1987,34 @@ namespace Milimoe.FunGame.Core.Model } /// - /// 装备物品到指定栏位 + /// 装备物品到指定栏位,并返回被替换的装备(如果有的话) /// /// /// /// - public void Equip(Character character, EquipSlotType type, Item item) + /// + public void Equip(Character character, EquipSlotType type, Item item, out Item? previous) { - if (character.Equip(item, type)) + if (character.Equip(item, type, out previous)) { WriteLine($"[ {character} ] 装备了 [ {item.Name} ]。({ItemSet.GetEquipSlotTypeName(type)} 栏位)"); } } /// - /// 取消装备 + /// 取消装备,并返回被替换的装备(如果有的话) /// /// /// - public void UnEquip(Character character, EquipSlotType type) + /// + public Item? UnEquip(Character character, EquipSlotType type) { Item? item = character.UnEquip(type); if (item != null) { WriteLine($"[ {character} ] 取消装备了 [ {item.Name} ]。({ItemSet.GetEquipSlotTypeName(type)} 栏位)"); } + return item; } ///