using System.Collections; using System.Collections.Generic; using System.Linq; namespace BITKit.Modification { /// /// 不兼容的改装 /// public class IncompatibleModifyException : InGameException { public IncompatibleModifyException(IModifyElement[] errorElements) : base() { } } /// /// 没有前置改装 /// public class NotRequireModifyException : InGameException { public NotRequireModifyException(IModifyElement[] errorElements) : base() { } } /// /// 不支持的改装 /// public class NotSupportModifyException : InGameException { public NotSupportModifyException(IModifyElement[] errorElements) : base() { } } /// /// 改装元素 /// public interface IModifyElement { IModifyElement[] Require { get; } IModifyElement[] Incompatible { get; } } /// /// 改装管理器 /// public interface IModifyManager { /// /// 获取所有改装 /// IDictionary Modifies { get; } /// /// 获取所有已改装 /// IDictionary Modified { get; } /// /// 添加改装 /// /// void Add(IModifyElement modify,object obj); /// /// 移除改装 /// /// void Remove(IModifyElement modify,out object obj); } public class ModifyManager : IModifyManager { public virtual IDictionary Modifies { get;private set; } =new Dictionary(); public virtual IDictionary Modified => new Dictionary(Modifies.Where(x=>x.Value is not null)); public virtual void Add(IModifyElement modify, object obj) { var list = new List(); 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(); 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); } } }