119 lines
3.0 KiB
C#
119 lines
3.0 KiB
C#
using System;
|
|
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 => Array.Empty<IModifyElement>();
|
|
IModifyElement[] Incompatible => Array.Empty<IModifyElement>();
|
|
}
|
|
/// <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; } =new Dictionary<IModifyElement,object>();
|
|
public virtual IDictionary<IModifyElement, object> Modified { get; } = new Dictionary<IModifyElement, object>();
|
|
|
|
public virtual void Add(IModifyElement modify, object obj)
|
|
{
|
|
if(Modified.ContainsKey(modify))
|
|
throw new NotSupportModifyException(new[]{modify});
|
|
|
|
var list = new List<IModifyElement>();
|
|
list.AddRange(Modified.Keys);
|
|
list.Add(modify);
|
|
|
|
|
|
foreach (var x in list)
|
|
{
|
|
if(x.Require is null or {Length:0})continue;
|
|
|
|
foreach (var _x in x.Require)
|
|
{
|
|
if (list.Contains(_x) is false)
|
|
throw new NotRequireModifyException(x.Require);
|
|
}
|
|
}
|
|
|
|
//你知道怎么做,帮我做一下
|
|
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|