You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			164 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			164 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
| 
											2 years ago
										 | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using Articy.Touhou; | ||
|  | using Articy.Touhou.Features; | ||
|  | using Articy.Unity; | ||
|  | 
 | ||
|  | namespace Game | ||
|  | { | ||
|  |     public enum EElementType | ||
|  |     { | ||
|  |         None, | ||
|  |         Arcane, | ||
|  |         Dark, | ||
|  |         Earth, | ||
|  |         Flame, | ||
|  |         Ice, | ||
|  |         Laya, | ||
|  |         Light, | ||
|  |         Lightning, | ||
|  |         Poison, | ||
|  |         Water, | ||
|  |         Max, | ||
|  |         Both = 99, | ||
|  |     } | ||
|  |     public partial class UtilElement | ||
|  |     { | ||
|  |         private static Dictionary<uint, ElementReactFeature> _mElementReact; | ||
|  |         static UtilElement() | ||
|  |         { | ||
|  |             _mElementReact = new Dictionary<uint, ElementReactFeature>(); | ||
|  |             InitElementReact(); | ||
|  |         } | ||
|  |         public static void ElementBuff(int owner, int target, string buffId, int level) | ||
|  |         { | ||
|  |             Util.AddBuff(owner, target, buffId, 0, level); | ||
|  |         } | ||
|  |         private static void AddBuff(List<Tuple<string, int, int>> elementEffectList, ArticyObject buffObj, int level, int owner) | ||
|  |         { | ||
|  |             if (buffObj != null) | ||
|  |             { | ||
|  |                 elementEffectList.Add(new Tuple<string, int, int>(buffObj.TechnicalName, level, owner)); | ||
|  |             } | ||
|  |         } | ||
|  |         public static uint ElementReact(uint elementMask, List<Tuple<EElementType, int>> elementList, List<Tuple<string, int, int>> elementEffectList) | ||
|  |         { | ||
|  |             //反应规则: 1.新加入的先互相反应 2.不同元素优先反应 | ||
|  | 
 | ||
|  |             //反应新加入的元素 | ||
|  |             var isStable = false; | ||
|  |             while (!isStable) | ||
|  |             { | ||
|  |                 isStable = true; | ||
|  |                 for (int i = 0; i < elementList.Count; i++) | ||
|  |                 { | ||
|  |                     for (int j = i + 1; j < elementList.Count; j++) | ||
|  |                     { | ||
|  |                         var e1 = elementList[i]; | ||
|  |                         var e2 = elementList[j]; | ||
|  |                         var owner = e1.Item2 != 0 ? e1.Item2 : e2.Item2; | ||
|  |                         var result = _mElementReact[Combine(e1.Item1, e2.Item1)]; | ||
|  |                         var resultElement = (EElementType)result.ElementResult; | ||
|  |                         if (resultElement == EElementType.Both) | ||
|  |                         { | ||
|  |                             continue; | ||
|  |                         } | ||
|  |                         isStable = false; | ||
|  |                         elementList.RemoveAt(j); | ||
|  |                         elementList.RemoveAt(i); | ||
|  |                         if (resultElement != EElementType.None) | ||
|  |                         { | ||
|  |                             elementList.Add(new Tuple<EElementType, int>(resultElement, owner)); | ||
|  |                         } | ||
|  |                         AddBuff(elementEffectList, result.Buff, result.BuffLevel, owner); | ||
|  |                         break; | ||
|  |                     } | ||
|  |                     if (!isStable) | ||
|  |                     { | ||
|  |                         break; | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |             //反应不同元素 | ||
|  |             isStable = false; | ||
|  |             while (!isStable) | ||
|  |             { | ||
|  |                 isStable = true; | ||
|  |                 for (int i = 0; i < elementList.Count; i++) | ||
|  |                 { | ||
|  |                     var mask = Mask(elementList[i].Item1); | ||
|  |                     if ((mask & elementMask) != 0) | ||
|  |                     { | ||
|  |                         //相同元素先排除 | ||
|  |                         continue; | ||
|  |                     } | ||
|  |                     var maskNew = mask | elementMask;//新元素加入后的mask | ||
|  |                     foreach (var item in _mElementReact) | ||
|  |                     { | ||
|  |                         var key = item.Key; | ||
|  |                         if ((maskNew | key) == maskNew) | ||
|  |                         { | ||
|  |                             var result = _mElementReact[key]; | ||
|  |                             var resultElement = (EElementType)result.ElementResult; | ||
|  |                             if (resultElement == EElementType.Both) | ||
|  |                             { | ||
|  |                                 //如果可以共存 直接加入 | ||
|  |                                 elementMask |= key; | ||
|  |                                 continue; | ||
|  |                             } | ||
|  |                             isStable = false;   //不同元素必定反应 | ||
|  |                             elementMask -= elementMask & key;   //原elementMask是稳定的 | ||
|  |                             if (resultElement != EElementType.None) | ||
|  |                             { | ||
|  |                                 elementList.Add(new Tuple<EElementType, int>(resultElement, elementList[i].Item2));//生成的元素加入elementList等待下一轮反应 | ||
|  |                             } | ||
|  |                             AddBuff(elementEffectList, result.Buff, result.BuffLevel, elementList[i].Item2); | ||
|  |                             elementList.RemoveAt(i); | ||
|  |                             break; | ||
|  |                         } | ||
|  |                     } | ||
|  |                     if (isStable) | ||
|  |                     { | ||
|  |                         //加入后仍然稳定 | ||
|  |                         elementMask = maskNew; | ||
|  |                         elementList.RemoveAt(i); | ||
|  |                     } | ||
|  |                     break; | ||
|  |                 } | ||
|  |             } | ||
|  |             //反应相同元素 | ||
|  |             for (int i = 0; i < elementList.Count; i++) | ||
|  |             { | ||
|  |                 var key = Combine(elementList[i].Item1, elementList[i].Item1); | ||
|  |                 var result = _mElementReact[key]; | ||
|  |                 AddBuff(elementEffectList, result.Buff, result.BuffLevel, elementList[i].Item2); | ||
|  |             } | ||
|  |             elementList.Clear(); | ||
|  |             return elementMask; | ||
|  |         } | ||
|  |         public static uint Combine(EElementType e1, EElementType e2) | ||
|  |         { | ||
|  |             if (e1 == e2) | ||
|  |             { | ||
|  |                 return Mask(e1) << 16; | ||
|  |             } | ||
|  |             return Mask(e1) | Mask(e2); | ||
|  |         } | ||
|  |         public static uint Mask(EElementType e) | ||
|  |         { | ||
|  |             return (1u << (int)e); | ||
|  |         } | ||
|  |         private static void InitElementReact() | ||
|  |         { | ||
|  |             var reactList = ArticyDatabase.GetAllOfType<ElementReact>(); | ||
|  |             foreach (var item in reactList) | ||
|  |             { | ||
|  |                 var react = item.Template.ElementReact; | ||
|  |                 var e1 = (EElementType)react.Element1; | ||
|  |                 var e2 = (EElementType)react.Element2; | ||
|  |                 _mElementReact[Combine(e1, e2)] = react; | ||
|  |                 _mElementReact[Combine(e2, e1)] = react; | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |