补全 Item 转换器的属性;添加装备物品时返回旧的物品

This commit is contained in:
milimoe 2024-12-08 02:07:08 +08:00
parent a2efcd8328
commit d9737f00f1
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
4 changed files with 84 additions and 29 deletions

View File

@ -875,12 +875,15 @@ namespace Milimoe.FunGame.Core.Entity
} }
/// <summary> /// <summary>
/// 为角色装备物品必须使用此方法而不是自己去给EquipSlot里的物品赋值 /// 为角色装备物品必须使用此方法而不是自己去给EquipSlot里的物品赋值<para/>
/// 此方法装备到指定栏位,并返回被替换的装备(如果有的话)
/// </summary> /// </summary>
/// <param name="item"></param> /// <param name="item"></param>
/// <param name="slot"></param> /// <param name="slot"></param>
public bool Equip(Item item, EquipSlotType slot) /// <param name="previous"></param>
public bool Equip(Item item, EquipSlotType slot, out Item? previous)
{ {
previous = null;
bool result = false; bool result = false;
double pastHP = HP; double pastHP = HP;
double pastMaxHP = MaxHP; double pastMaxHP = MaxHP;
@ -891,7 +894,7 @@ namespace Milimoe.FunGame.Core.Entity
case EquipSlotType.MagicCardPack: case EquipSlotType.MagicCardPack:
if (item.ItemType == ItemType.MagicCardPack) if (item.ItemType == ItemType.MagicCardPack)
{ {
UnEquip(EquipSlotType.MagicCardPack); previous = UnEquip(EquipSlotType.MagicCardPack);
EquipSlot.MagicCardPack = item; EquipSlot.MagicCardPack = item;
item.OnItemEquip(this, EquipSlotType.MagicCardPack); item.OnItemEquip(this, EquipSlotType.MagicCardPack);
result = true; result = true;
@ -900,7 +903,7 @@ namespace Milimoe.FunGame.Core.Entity
case EquipSlotType.Weapon: case EquipSlotType.Weapon:
if (item.ItemType == ItemType.Weapon) if (item.ItemType == ItemType.Weapon)
{ {
UnEquip(EquipSlotType.Weapon); previous = UnEquip(EquipSlotType.Weapon);
EquipSlot.Weapon = item; EquipSlot.Weapon = item;
item.OnItemEquip(this, EquipSlotType.Weapon); item.OnItemEquip(this, EquipSlotType.Weapon);
result = true; result = true;
@ -909,7 +912,7 @@ namespace Milimoe.FunGame.Core.Entity
case EquipSlotType.Armor: case EquipSlotType.Armor:
if (item.ItemType == ItemType.Armor) if (item.ItemType == ItemType.Armor)
{ {
UnEquip(EquipSlotType.Armor); previous = UnEquip(EquipSlotType.Armor);
EquipSlot.Armor = item; EquipSlot.Armor = item;
item.OnItemEquip(this, EquipSlotType.Armor); item.OnItemEquip(this, EquipSlotType.Armor);
result = true; result = true;
@ -918,7 +921,7 @@ namespace Milimoe.FunGame.Core.Entity
case EquipSlotType.Shoes: case EquipSlotType.Shoes:
if (item.ItemType == ItemType.Shoes) if (item.ItemType == ItemType.Shoes)
{ {
UnEquip(EquipSlotType.Shoes); previous = UnEquip(EquipSlotType.Shoes);
EquipSlot.Shoes = item; EquipSlot.Shoes = item;
item.OnItemEquip(this, EquipSlotType.Shoes); item.OnItemEquip(this, EquipSlotType.Shoes);
result = true; result = true;
@ -927,7 +930,7 @@ namespace Milimoe.FunGame.Core.Entity
case EquipSlotType.Accessory1: case EquipSlotType.Accessory1:
if (item.ItemType == ItemType.Accessory) if (item.ItemType == ItemType.Accessory)
{ {
UnEquip(EquipSlotType.Accessory1); previous = UnEquip(EquipSlotType.Accessory1);
EquipSlot.Accessory1 = item; EquipSlot.Accessory1 = item;
EquipSlot.LastEquipSlotType = EquipSlotType.Accessory1; EquipSlot.LastEquipSlotType = EquipSlotType.Accessory1;
item.OnItemEquip(this, EquipSlotType.Accessory1); item.OnItemEquip(this, EquipSlotType.Accessory1);
@ -937,7 +940,7 @@ namespace Milimoe.FunGame.Core.Entity
case EquipSlotType.Accessory2: case EquipSlotType.Accessory2:
if (item.ItemType == ItemType.Accessory) if (item.ItemType == ItemType.Accessory)
{ {
UnEquip(EquipSlotType.Accessory2); previous = UnEquip(EquipSlotType.Accessory2);
EquipSlot.Accessory2 = item; EquipSlot.Accessory2 = item;
EquipSlot.LastEquipSlotType = EquipSlotType.Accessory2; EquipSlot.LastEquipSlotType = EquipSlotType.Accessory2;
item.OnItemEquip(this, EquipSlotType.Accessory2); item.OnItemEquip(this, EquipSlotType.Accessory2);
@ -963,29 +966,70 @@ namespace Milimoe.FunGame.Core.Entity
switch (item.ItemType) switch (item.ItemType)
{ {
case ItemType.MagicCardPack: case ItemType.MagicCardPack:
return Equip(item, EquipSlotType.MagicCardPack); return Equip(item, EquipSlotType.MagicCardPack, out _);
case ItemType.Weapon: case ItemType.Weapon:
return Equip(item, EquipSlotType.Weapon); return Equip(item, EquipSlotType.Weapon, out _);
case ItemType.Armor: case ItemType.Armor:
return Equip(item, EquipSlotType.Armor); return Equip(item, EquipSlotType.Armor, out _);
case ItemType.Shoes: case ItemType.Shoes:
return Equip(item, EquipSlotType.Shoes); return Equip(item, EquipSlotType.Shoes, out _);
case ItemType.Accessory: case ItemType.Accessory:
if (EquipSlot.Accessory1 is null) 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) 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) else if (EquipSlot.Accessory1 != null && EquipSlot.Accessory2 != null && EquipSlot.LastEquipSlotType == EquipSlotType.Accessory1)
{ {
return Equip(item, EquipSlotType.Accessory2); return Equip(item, EquipSlotType.Accessory2, out _);
} }
else else
{ {
return Equip(item, EquipSlotType.Accessory1); return Equip(item, EquipSlotType.Accessory1, out _);
}
}
return false;
}
/// <summary>
/// 为角色装备物品必须使用此方法而不是自己去给EquipSlot里的物品赋值<para/>
/// 此方法为根据物品类型,优先空位自动装备<para/>
/// 此方法可返回被替换的装备(如果有的话)
/// </summary>
/// <param name="item"></param>
/// <param name="previous"></param>
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; return false;

View File

@ -54,16 +54,16 @@ namespace Milimoe.FunGame.Core.Entity
}; };
} }
} }
/// <summary> /// <summary>
/// 是否允许装备 /// 是否允许装备
/// [ 注意:这个不是用来判断是不是装备类型的,判断装备类型时,请判断他们的 <see cref="ItemType"/> ] /// [ 注意:这个不是用来判断是不是装备类型的,判断装备类型时,请判断他们的 <see cref="IsEquipment"/> ]
/// </summary> /// </summary>
public bool Equipable { get; set; } = true; public bool Equipable { get; set; } = true;
/// <summary> /// <summary>
/// 是否允许取消装备 /// 是否允许取消装备
/// [ 注意:这个不是用来判断是不是装备类型的,判断装备类型时,请判断他们的 <see cref="ItemType"/> ] /// [ 注意:这个不是用来判断是不是装备类型的,判断装备类型时,使用 <see cref="IsEquipment"/> ]
/// </summary> /// </summary>
public bool Unequipable { get; set; } = true; public bool Unequipable { get; set; } = true;
@ -310,7 +310,7 @@ namespace Milimoe.FunGame.Core.Entity
/// <summary> /// <summary>
/// 局外(库存)使用物品触发 /// 局外(库存)使用物品触发
/// </summary> /// </summary>
public void UseItem(/*Inventory inventory*/) public void UseItem()
{ {
if (User != null) OnItemUsed(User, this); if (User != null) OnItemUsed(User, this);
} }
@ -322,7 +322,7 @@ namespace Milimoe.FunGame.Core.Entity
/// <param name="item"></param> /// <param name="item"></param>
/// <param name="cancel"></param> /// <param name="cancel"></param>
/// <param name="used"></param> /// <param name="used"></param>
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
/// </summary> /// </summary>
/// <param name="user"></param> /// <param name="user"></param>
/// <param name="item"></param> /// <param name="item"></param>
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
/// <param name="character"></param> /// <param name="character"></param>
/// <param name="item"></param> /// <param name="item"></param>
/// <param name="type"></param> /// <param name="type"></param>
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
/// <param name="character"></param> /// <param name="character"></param>
/// <param name="item"></param> /// <param name="item"></param>
/// <param name="type"></param> /// <param name="type"></param>
public virtual void OnItemUnEquipped(Character character, Item item, EquipSlotType type) protected virtual void OnItemUnEquipped(Character character, Item item, EquipSlotType type)
{ {
} }

View File

@ -59,6 +59,12 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
case nameof(Item.Equipable): case nameof(Item.Equipable):
result.Equipable = reader.GetBoolean(); result.Equipable = reader.GetBoolean();
break; break;
case nameof(Item.Unequipable):
result.Unequipable = reader.GetBoolean();
break;
case nameof(Item.RemainUseTimes):
result.RemainUseTimes = reader.GetInt32();
break;
case nameof(Item.IsPurchasable): case nameof(Item.IsPurchasable):
result.IsPurchasable = reader.GetBoolean(); result.IsPurchasable = reader.GetBoolean();
break; break;
@ -128,6 +134,8 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
writer.WriteNumber(nameof(Item.RankType), (int)value.RankType); writer.WriteNumber(nameof(Item.RankType), (int)value.RankType);
writer.WriteBoolean(nameof(Item.IsInGameItem), value.IsInGameItem); writer.WriteBoolean(nameof(Item.IsInGameItem), value.IsInGameItem);
writer.WriteBoolean(nameof(Item.Equipable), value.Equipable); 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.WriteBoolean(nameof(Item.IsPurchasable), value.IsPurchasable);
writer.WriteNumber(nameof(Item.Price), value.Price); writer.WriteNumber(nameof(Item.Price), value.Price);
if (!value.IsSellable) if (!value.IsSellable)

View File

@ -1987,31 +1987,34 @@ namespace Milimoe.FunGame.Core.Model
} }
/// <summary> /// <summary>
/// 装备物品到指定栏位 /// 装备物品到指定栏位,并返回被替换的装备(如果有的话)
/// </summary> /// </summary>
/// <param name="character"></param> /// <param name="character"></param>
/// <param name="type"></param> /// <param name="type"></param>
/// <param name="item"></param> /// <param name="item"></param>
public void Equip(Character character, EquipSlotType type, Item item) /// <param name="previous"></param>
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)} 栏位)"); WriteLine($"[ {character} ] 装备了 [ {item.Name} ]。({ItemSet.GetEquipSlotTypeName(type)} 栏位)");
} }
} }
/// <summary> /// <summary>
/// 取消装备 /// 取消装备,并返回被替换的装备(如果有的话)
/// </summary> /// </summary>
/// <param name="character"></param> /// <param name="character"></param>
/// <param name="type"></param> /// <param name="type"></param>
public void UnEquip(Character character, EquipSlotType type) /// <returns></returns>
public Item? UnEquip(Character character, EquipSlotType type)
{ {
Item? item = character.UnEquip(type); Item? item = character.UnEquip(type);
if (item != null) if (item != null)
{ {
WriteLine($"[ {character} ] 取消装备了 [ {item.Name} ]。({ItemSet.GetEquipSlotTypeName(type)} 栏位)"); WriteLine($"[ {character} ] 取消装备了 [ {item.Name} ]。({ItemSet.GetEquipSlotTypeName(type)} 栏位)");
} }
return item;
} }
/// <summary> /// <summary>