BITFALL/Assets/BITKit/Core/Modification/IModification.cs

103 lines
2.7 KiB
C#
Raw Normal View History

2023-12-03 17:35:43 +08:00
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace BITKit.Modification
{
/// <summary>
/// 不兼容的改装
/// </summary>
public class IncompatibleModifyException : InGameException
{
public IncompatibleModifyException(IModifyElement[] errorElements) : base()
{
}
}
/// <summary>
/// 没有前置改装
/// </summary>
public class NotRequireModifyException : InGameException
{
public NotRequireModifyException(IModifyElement[] errorElements) : base()
{
}
}
/// <summary>
/// 不支持的改装
/// </summary>
public class NotSupportModifyException : InGameException
{
public NotSupportModifyException(IModifyElement[] errorElements) : base()
{
}
}
/// <summary>
/// 改装元素
/// </summary>
public interface IModifyElement
{
IModifyElement[] Require { get; }
IModifyElement[] Incompatible { get; }
}
/// <summary>
/// 改装管理器
/// </summary>
public interface IModifyManager
{
/// <summary>
/// 获取所有改装
/// </summary>
IDictionary<IModifyElement,object> Modifies { get; }
/// <summary>
/// 获取所有已改装
/// </summary>
IDictionary<IModifyElement,object> Modified { get; }
/// <summary>
/// 添加改装
/// </summary>
/// <param name="modify"></param>
void Add(IModifyElement modify,object obj);
/// <summary>
/// 移除改装
/// </summary>
/// <param name="modify"></param>
void Remove(IModifyElement modify,out object obj);
}
public class ModifyManager : IModifyManager
{
public virtual IDictionary<IModifyElement, object> Modifies { get;private set; } =new Dictionary<IModifyElement,object>();
public virtual IDictionary<IModifyElement, object> Modified => new Dictionary<IModifyElement, object>(Modifies.Where(x=>x.Value is not null));
public virtual void Add(IModifyElement modify, object obj)
{
var list = new List<IModifyElement>();
list.AddRange(Modified.Keys);
list.Add(modify);
if(list.All(x=>x.Require?.Any(y=>list.Contains(y)) is false))
throw new NotRequireModifyException(list.ToArray());
var incompatible = list.Where(x=>x.Incompatible is not null).SelectMany(x => x.Incompatible).ToArray();
if(MathE.Contains(incompatible,list))
throw new IncompatibleModifyException(incompatible);
Modified.Add(modify,obj);
}
public virtual void Remove(IModifyElement modify,out object obj)
{
var list = new List<IModifyElement>();
list.AddRange(Modified.Keys);
list.Remove(modify);
var requires = list.Where(x=>x.Require is not null).SelectMany(x => x.Require).ToArray();
if(requires.Contains(modify))
throw new NotRequireModifyException(requires);
obj = Modified[modify];
Modified.Remove(modify);
}
}
}