using System; 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 => Array.Empty(); IModifyElement[] Incompatible => Array.Empty(); } /// /// 改装管理器 /// 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; } =new Dictionary(); public virtual IDictionary Modified { get; } = new Dictionary(); public virtual void Add(IModifyElement modify, object obj) { if(Modified.ContainsKey(modify)) throw new NotSupportModifyException(new[]{modify}); var list = new List(); 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(); 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); } } }