优化了角色物品栏和装备栏的逻辑;添加了物品、技能、特效的复制方法

This commit is contained in:
milimoe 2024-09-21 18:31:21 +08:00
parent dcf922fa3f
commit 83fab0d5e4
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
5 changed files with 155 additions and 30 deletions

View File

@ -38,7 +38,7 @@ namespace Milimoe.FunGame.Core.Entity
public CharacterProfile Profile { get; set; } public CharacterProfile Profile { get; set; }
/// <summary> /// <summary>
/// 角色的详细资料 /// 角色的装备
/// </summary> /// </summary>
public EquipSlot EquipSlot { get; set; } public EquipSlot EquipSlot { get; set; }
@ -1158,6 +1158,15 @@ namespace Milimoe.FunGame.Core.Entity
} }
} }
if (Items.Count > 0)
{
builder.AppendLine("== 角色背包 ==");
foreach (Item item in Items)
{
builder.Append(item.ToString());
}
}
if (Effects.Where(e => e.EffectType != EffectType.Item).Any()) if (Effects.Where(e => e.EffectType != EffectType.Item).Any())
{ {
builder.AppendLine("== 状态栏 =="); builder.AppendLine("== 状态栏 ==");
@ -1275,6 +1284,7 @@ namespace Milimoe.FunGame.Core.Entity
{ {
Character c = new() Character c = new()
{ {
Id = Id,
Name = Name, Name = Name,
FirstName = FirstName, FirstName = FirstName,
NickName = NickName, NickName = NickName,
@ -1326,11 +1336,15 @@ namespace Milimoe.FunGame.Core.Entity
}; };
foreach (Skill skill in Skills) foreach (Skill skill in Skills)
{ {
c.Skills.Add(skill); Skill newskill = skill.Copy();
newskill.Character = c;
c.Skills.Add(newskill);
} }
foreach (Item item in Items) foreach (Item item in Items)
{ {
c.Items.Add(item); Item newitem = item.Copy();
newitem.Character = c;
c.Items.Add(newitem);
} }
c.Recovery(); c.Recovery();
return c; return c;

View File

@ -14,17 +14,17 @@ namespace Milimoe.FunGame.Core.Entity
/// <summary> /// <summary>
/// 物品的描述 /// 物品的描述
/// </summary> /// </summary>
public virtual string Description { get; } = ""; public virtual string Description { get; set; } = "";
/// <summary> /// <summary>
/// 物品的通用描述 /// 物品的通用描述
/// </summary> /// </summary>
public virtual string GeneralDescription { get; } = ""; public virtual string GeneralDescription { get; set; } = "";
/// <summary> /// <summary>
/// 物品的背景故事 /// 物品的背景故事
/// </summary> /// </summary>
public virtual string BackgroundStory { get; } = ""; public virtual string BackgroundStory { get; set; } = "";
/// <summary> /// <summary>
/// 物品类型 /// 物品类型
@ -32,7 +32,17 @@ namespace Milimoe.FunGame.Core.Entity
public virtual ItemType ItemType { get; set; } = ItemType.Others; public virtual ItemType ItemType { get; set; } = ItemType.Others;
/// <summary> /// <summary>
/// 物品槽位 /// 是否允许装备
/// </summary>
public bool Equipable { get; set; } = true;
/// <summary>
/// 是否允许取消装备
/// </summary>
public bool Unequipable { get; set; } = true;
/// <summary>
/// 装备槽位
/// </summary> /// </summary>
public virtual EquipSlotType EquipSlotType { get; set; } = EquipSlotType.None; public virtual EquipSlotType EquipSlotType { get; set; } = EquipSlotType.None;
@ -56,16 +66,6 @@ namespace Milimoe.FunGame.Core.Entity
/// </summary> /// </summary>
public bool Enable { get; set; } = true; public bool Enable { get; set; } = true;
/// <summary>
/// 是否允许装备
/// </summary>
public bool Equipable { get; set; } = true;
/// <summary>
/// 是否允许取消装备
/// </summary>
public bool Unequipable { get; set; } = true;
/// <summary> /// <summary>
/// 是否是局内使用的物品(局内是指对角色生效的物品) /// 是否是局内使用的物品(局内是指对角色生效的物品)
/// </summary> /// </summary>
@ -143,7 +143,6 @@ namespace Milimoe.FunGame.Core.Entity
public void OnItemEquip(Character character, EquipItemToSlot type) public void OnItemEquip(Character character, EquipItemToSlot type)
{ {
Character = character; Character = character;
Character.Items.Add(this);
foreach (Skill skill in Skills.Passives) foreach (Skill skill in Skills.Passives)
{ {
if (!skill.IsActive && skill.Level > 0) if (!skill.IsActive && skill.Level > 0)
@ -206,7 +205,6 @@ namespace Milimoe.FunGame.Core.Entity
Character.EquipSlot.Accessory2 = null; Character.EquipSlot.Accessory2 = null;
break; break;
} }
Character.Items.Remove(this);
OnItemUnEquipped(Character, this, type); OnItemUnEquipped(Character, this, type);
} }
Character = null; Character = null;
@ -388,6 +386,44 @@ namespace Milimoe.FunGame.Core.Entity
item.NextTradableTime = NextTradableTime; item.NextTradableTime = NextTradableTime;
} }
/// <summary>
/// 复制一个物品
/// </summary>
/// <returns></returns>
public Item Copy()
{
Item item = new()
{
Id = Id,
Name = Name,
Description = Description,
GeneralDescription = GeneralDescription,
ItemType = ItemType,
Equipable = Equipable,
Unequipable = Unequipable,
EquipSlotType = EquipSlotType,
WeaponType = WeaponType,
Key = Key,
Enable = Enable,
IsInGameItem = IsInGameItem,
IsPurchasable = IsPurchasable,
Price = Price,
IsSellable = IsSellable,
NextSellableTime = NextSellableTime,
IsTradable = IsTradable,
NextTradableTime = NextTradableTime,
RemainUseTimes = RemainUseTimes,
};
item.Skills.Active = Skills.Active?.Copy();
foreach (Skill skill in Skills.Passives)
{
Skill newskill = skill.Copy();
newskill.Item = item;
item.Skills.Passives.Add(newskill);
}
return item;
}
/// <summary> /// <summary>
/// 所属的角色 /// 所属的角色
/// </summary> /// </summary>

View File

@ -19,40 +19,40 @@ namespace Milimoe.FunGame.Core.Entity
/// 特殊效果类型<para/> /// 特殊效果类型<para/>
/// 注意:如果技能特效没有原生施加控制效果,请始终保持此属性为 <see cref="EffectType.None"/>。 /// 注意:如果技能特效没有原生施加控制效果,请始终保持此属性为 <see cref="EffectType.None"/>。
/// </summary> /// </summary>
public virtual EffectType EffectType { get; } = EffectType.None; public virtual EffectType EffectType { get; set; } = EffectType.None;
/// <summary> /// <summary>
/// 作用于自身 /// 作用于自身
/// </summary> /// </summary>
public virtual bool TargetSelf { get; } = false; public virtual bool TargetSelf { get; set; } = false;
/// <summary> /// <summary>
/// 作用目标数量 /// 作用目标数量
/// </summary> /// </summary>
public virtual int TargetCount { get; } = 0; public virtual int TargetCount { get; set; } = 0;
/// <summary> /// <summary>
/// 作用范围 /// 作用范围
/// </summary> /// </summary>
public virtual double TargetRange { get; } = 0; public virtual double TargetRange { get; set; } = 0;
/// <summary> /// <summary>
/// 持续性的<para/> /// 持续性的<para/>
/// 配合 <see cref="Duration"/> 使用,而不是 <see cref="DurationTurn"/>。 /// 配合 <see cref="Duration"/> 使用,而不是 <see cref="DurationTurn"/>。
/// </summary> /// </summary>
public virtual bool Durative { get; } = false; public virtual bool Durative { get; set; } = false;
/// <summary> /// <summary>
/// 持续时间<para/> /// 持续时间<para/>
/// 配合 <see cref="Durative"/> 使用。 /// 配合 <see cref="Durative"/> 使用。
/// </summary> /// </summary>
public virtual double Duration { get; } = 0; public virtual double Duration { get; set; } = 0;
/// <summary> /// <summary>
/// 持续时间(回合)<para/> /// 持续时间(回合)<para/>
/// 使用此属性需要将 <see cref="Durative"/> 设置为 false。 /// 使用此属性需要将 <see cref="Durative"/> 设置为 false。
/// </summary> /// </summary>
public virtual int DurationTurn { get; } = 0; public virtual int DurationTurn { get; set; } = 0;
/// <summary> /// <summary>
/// 剩余持续时间 /// 剩余持续时间
@ -67,12 +67,12 @@ namespace Milimoe.FunGame.Core.Entity
/// <summary> /// <summary>
/// 魔法类型 /// 魔法类型
/// </summary> /// </summary>
public virtual MagicType MagicType { get; } = MagicType.None; public virtual MagicType MagicType { get; set; } = MagicType.None;
/// <summary> /// <summary>
/// 效果描述 /// 效果描述
/// </summary> /// </summary>
public virtual string Description { get; } = ""; public virtual string Description { get; set; } = "";
/// <summary> /// <summary>
/// 等级,跟随技能的等级 /// 等级,跟随技能的等级
@ -434,6 +434,29 @@ namespace Milimoe.FunGame.Core.Entity
return builder.ToString(); return builder.ToString();
} }
/// <summary>
/// 复制一个特效
/// </summary>
/// <returns></returns>
public Effect Copy(Skill skill)
{
Effect copy = new(skill)
{
EffectType = EffectType,
TargetSelf = TargetSelf,
TargetCount = TargetCount,
TargetRange = TargetRange,
Durative = Durative,
Duration = Duration,
DurationTurn = DurationTurn,
MagicType = MagicType,
Description = Description,
ActionQueue = ActionQueue
};
return copy;
}
/// <summary> /// <summary>
/// 比较两个特效 /// 比较两个特效
/// </summary> /// </summary>

View File

@ -118,7 +118,7 @@ namespace Milimoe.FunGame.Core.Entity
/// 冷却时间 /// 冷却时间
/// </summary> /// </summary>
[InitRequired] [InitRequired]
public virtual double CD { get; } = 0; public virtual double CD { get; set; } = 0;
/// <summary> /// <summary>
/// 剩余冷却时间 [ 建议配合 <see cref="Enable"/> 属性使用 ] /// 剩余冷却时间 [ 建议配合 <see cref="Enable"/> 属性使用 ]
@ -146,6 +146,11 @@ namespace Milimoe.FunGame.Core.Entity
/// </summary> /// </summary>
public ActionQueue? ActionQueue { get; set; } = null; public ActionQueue? ActionQueue { get; set; } = null;
/// <summary>
/// 技能是否属于某个物品
/// </summary>
public Item? Item { get; set; } = null;
/// <summary> /// <summary>
/// 继承此类实现时,调用基类的构造函数 /// 继承此类实现时,调用基类的构造函数
/// </summary> /// </summary>
@ -308,6 +313,35 @@ namespace Milimoe.FunGame.Core.Entity
return other is Skill c && c.Id + "." + c.Name == Id + "." + Name; return other is Skill c && c.Id + "." + c.Name == Id + "." + Name;
} }
/// <summary>
/// 复制一个技能
/// </summary>
/// <returns></returns>
public Skill Copy()
{
Skill s = new()
{
Id = Id,
Name = Name,
Description = Description,
GeneralDescription = GeneralDescription,
SkillType = SkillType,
MPCost = MPCost,
CastTime = CastTime,
EPCost = EPCost,
CD = CD,
CurrentCD = CurrentCD,
HardnessTime = HardnessTime,
ActionQueue = ActionQueue
};
foreach (Effect e in Effects)
{
Effect neweffect = e.Copy(s);
s.Effects.Add(neweffect);
}
return s;
}
/// <summary> /// <summary>
/// 等级 /// 等级
/// </summary> /// </summary>

View File

@ -170,6 +170,20 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
case nameof(Character.ExEvadeRate): case nameof(Character.ExEvadeRate):
result.ExEvadeRate = reader.GetDouble(); result.ExEvadeRate = reader.GetDouble();
break; break;
case nameof(Character.Skills):
HashSet<Skill> skills = NetworkUtility.JsonDeserialize<HashSet<Skill>>(ref reader, options) ?? [];
foreach (Skill skill in skills)
{
result.Skills.Add(skill);
}
break;
case nameof(Character.Items):
HashSet<Item> items = NetworkUtility.JsonDeserialize<HashSet<Item>>(ref reader, options) ?? [];
foreach (Item item in items)
{
result.Items.Add(item);
}
break;
} }
} }
@ -230,6 +244,10 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
writer.WriteNumber(nameof(Character.ExCritRate), value.ExCritRate); writer.WriteNumber(nameof(Character.ExCritRate), value.ExCritRate);
writer.WriteNumber(nameof(Character.ExCritDMG), value.ExCritDMG); writer.WriteNumber(nameof(Character.ExCritDMG), value.ExCritDMG);
writer.WriteNumber(nameof(Character.ExEvadeRate), value.ExEvadeRate); writer.WriteNumber(nameof(Character.ExEvadeRate), value.ExEvadeRate);
writer.WritePropertyName(nameof(Character.Skills));
JsonSerializer.Serialize(writer, value.Skills, options);
writer.WritePropertyName(nameof(Character.Items));
JsonSerializer.Serialize(writer, value.Items, options);
writer.WriteEndObject(); writer.WriteEndObject();
} }