BITKit/Src/Core/Item/Item.cs

175 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
namespace BITKit
{
#region
public enum ItemQuality
{
/// <summary>
/// 常见的
/// </summary>
Common,
/// <summary>
/// 罕见的
/// </summary>
Uncommon,
/// <summary>
/// 稀有的
/// </summary>
Rare,
/// <summary>
/// 史诗的
/// </summary>
Epic,
/// <summary>
/// 传奇的
/// </summary>
Legendary,
/// <summary>
/// 神话的
/// </summary>
Mythical,
/// <summary>
/// 开发者
/// </summary>
Develop,
}
#endregion
#region
/// <summary>
/// 物品属性
/// </summary>
public interface IScriptableItemProperty
{
}
/// <summary>
/// 基础物品
/// </summary>
public interface IScriptableItem
{
/// <summary>
/// 唯一Id
/// </summary>
int Id { get; }
/// <summary>
/// 物品名,一般用于查找物品的主键
/// </summary>
string Name { get; }
/// <summary>
/// 物品描述
/// </summary>
string Description { get; }
/// <summary>
/// 最大堆叠数量
/// </summary>
public int MaxStack { get; }
/// <summary>
/// 物品品质
/// </summary>
ItemQuality Quality { get; }
/// <summary>
/// 属性
/// </summary>
IReadOnlyDictionary<Type, IScriptableItemProperty> Properties { get; }
/// <summary>
/// 价值
/// </summary>
/// <returns></returns>
int Value => 10;
/// <summary>
/// 创建运行时物品
/// </summary>
/// <returns></returns>
IRuntimeItem CreateRuntimeItem();
}
public interface IRuntimeItem : ICloneable
{
/// <summary>
/// 运行时Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 配置Id
/// </summary>
public int ScriptableId { get; }
/// <summary>
/// 数量
/// </summary>
public int Amount { get; set; }
/// <summary>
/// 运行时属性
/// </summary>
IDictionary<Type, IScriptableItemProperty> RuntimeProperties { get; }
/// <summary>
/// 当运行时属性改变时
/// </summary>
// ReSharper disable once EventNeverInvoked.Global
event Action<IRuntimeItem> OnRuntimePropertiesChanged;
}
#endregion
#region
/// <summary>
/// 被托管的物品
/// </summary>
[Serializable]
public struct RuntimeItem : IRuntimeItem
{
public static RuntimeItem Create()
{
var item = new RuntimeItem()
{
Id = new Random().Next(),
RuntimeProperties =
new Dictionary<Type, IScriptableItemProperty>()
};
return item;
}
public int Id { get; set; }
public int ScriptableId { get; set; }
public int Amount { get; set; }
public IDictionary<Type, IScriptableItemProperty> RuntimeProperties { get; set; }
public event Action<IRuntimeItem> OnRuntimePropertiesChanged;
object ICloneable.Clone()
{
return new RuntimeItem
{
Id = new Random().Next(),
ScriptableId = ScriptableId,
Amount = Amount,
RuntimeProperties = new Dictionary<Type, IScriptableItemProperty>(RuntimeProperties),
OnRuntimePropertiesChanged = null,
};
}
}
#endregion
}