using System.Text; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Interface.Entity; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Entity { /// /// 和 一样,需要继承构造 /// public class Item : BaseEntity, IItem { /// /// 物品的描述 /// public virtual string Description { get; } = ""; /// /// 物品的通用描述 /// public virtual string GeneralDescription { get; } = ""; /// /// 物品类型 /// public virtual ItemType ItemType { get; set; } = ItemType.Others; /// /// 物品槽位 /// public virtual EquipSlotType EquipSlotType { get; set; } = EquipSlotType.None; /// /// 武器类型(如果是武器) /// public virtual WeaponType WeaponType { get; set; } = WeaponType.None; /// /// 快捷键 /// public char Key { get; set; } = '/'; /// /// 是否是主动物品 /// public bool IsActive => Skills.Active != null; /// /// 是否可用(涉及冷却和禁用等) /// public bool Enable { get; set; } = true; /// /// 是否允许装备 /// public bool Equipable { get; set; } = true; /// /// 是否允许取消装备 /// public bool Unequipable { get; set; } = true; /// /// 是否是局内使用的物品(局内是指对角色生效的物品) /// public bool IsInGameItem { get; set; } = true; /// /// 是否允许购买 /// public bool IsPurchasable { get; set; } = true; /// /// 物品的价格 /// public double Price { get; set; } = 0; /// /// 是否允许出售 /// public bool IsSellable { get; set; } = true; /// /// 下次可出售的时间 /// public DateTime NextSellableTime { get; set; } = DateTime.MinValue; /// /// 是否允许交易 /// public bool IsTradable { get; set; } = true; /// /// 下次可交易的时间 /// public DateTime NextTradableTime { get; set; } = DateTime.MinValue; /// /// 剩余使用次数(消耗品才会用到) /// public int RemainUseTimes { get; set; } = 0; /// /// 物品所属的角色(只有装备物品,才需要设置) /// public Character? Character { get => _character; set { _character = value; if (Skills.Active != null) Skills.Active.Character = _character; foreach (Skill skill in Skills.Passives) { skill.Character = _character; foreach (Effect e in skill.Effects) { e.Source = _character; } } } } /// /// 所属的玩家 /// public User? User { get; set; } = null; /// /// 物品拥有的技能 /// public SkillGroup Skills { get; set; } = new(); /// /// 当装备物品时 /// public void OnItemEquip(Character character) { Character = character; Character.Items.Add(this); foreach (Skill skill in Skills.Passives) { if (!skill.IsActive && skill.Level > 0) { foreach (Effect e in skill.AddInactiveEffectToCharacter()) { e.ActionQueue = skill.ActionQueue; if (Character != null && !Character.Effects.Contains(e)) { Character.Effects.Add(e); e.OnEffectGained(Character); } } } } } /// /// 当取消装备物品时 /// public void OnItemUnequip() { if (Character != null) { if (Skills.Active != null) { foreach (Effect e in Character.Effects.Where(e => e.Skill == Skills.Active && e.Level > 0).ToList()) { Character.Effects.Remove(e); e.OnEffectLost(Character); } } foreach (Skill skill in Skills.Passives) { foreach (Effect e in Character.Effects.Where(e => e.Skill == skill && e.Level > 0).ToList()) { Character.Effects.Remove(e); e.OnEffectLost(Character); } } Character.Items.Remove(this); } Character = null; } /// /// 局内使用物品触发 对某个角色使用 /// public void UseItem(ActionQueue queue, Character character, List enemys, List teammates) { if (Skills.Active != null) { Skills.Active.OnSkillCasted(queue, character, enemys, teammates); } OnItemUsed(); } /// /// 局外(库存)使用物品触发 /// public void UseItem(/*Inventory inventory*/) { OnItemUsed(); } /// /// 当物品被使用时 /// public virtual void OnItemUsed() { } protected Item(ItemType type, bool isInGame = true, EquipSlotType slot = EquipSlotType.None) { ItemType = type; IsInGameItem = isInGame; EquipSlotType = slot; } internal Item() { } /// /// 显示物品的详细信息 /// /// public override string ToString() { StringBuilder builder = new(); builder.AppendLine($"【{Name}】"); builder.AppendLine($"{ItemSet.GetItemTypeName(ItemType)}" + (IsPurchasable && Price > 0 ? $" 售价:{Price}" : "")); if (RemainUseTimes > 0) { builder.AppendLine($"剩余可用次数:{RemainUseTimes}"); } List sellandtrade = [""]; if (IsSellable) { sellandtrade.Add("可出售"); } if (IsTradable) { sellandtrade.Add("可交易"); } builder.AppendLine(string.Join(" ", sellandtrade).Trim()); if (!IsSellable && NextSellableTime != DateTime.MinValue) { builder.AppendLine($"此物品将在 {NextSellableTime.ToString(General.GeneralDateTimeFormatChinese)} 后可出售"); } if (!IsTradable && NextTradableTime != DateTime.MinValue) { builder.AppendLine($"此物品将在 {NextTradableTime.ToString(General.GeneralDateTimeFormatChinese)} 后可交易"); } if (Skills.Active != null) builder.AppendLine($"{Skills.Active.ToString()}"); foreach (Skill skill in Skills.Passives) { builder.AppendLine($"{skill.ToString()}"); } return builder.ToString(); } /// /// 判断两个物品是否相同 检查Id.Name /// /// /// public override bool Equals(IBaseEntity? other) { return other is Item c && c.Id + "." + c.Name == Id + "." + Name; } /// /// 所属的角色 /// private Character? _character = null; } }