| 
									
										
										
										
											2022-05-23 13:39:59 +00:00
										 |  |  |  | using System; | 
					
						
							|  |  |  |  | using System.Collections; | 
					
						
							|  |  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  |  | using UnityEngine; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | public class GroupManager : MonoBehaviour | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     public Action DelSoldierDie; | 
					
						
							|  |  |  |  |     public Action DelSoldierClear; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public int SoldierCount => mSoldierCount; | 
					
						
							|  |  |  |  |     public int TotalDamage => mTotalDamage; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     protected Dictionary<int, List<SoldierUnit>> mSoldierGroupDic; | 
					
						
							|  |  |  |  |     protected List<SoldierUnit> mSoldierList; | 
					
						
							|  |  |  |  |     protected int mSoldierCount = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     protected int mTotalDamage = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     private void Awake() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         mSoldierGroupDic = new Dictionary<int, List<SoldierUnit>>(); | 
					
						
							|  |  |  |  |         mSoldierList = new List<SoldierUnit>(); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public virtual void Init() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |          | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public WarUnit GetNearestTarget(Vector3 pRefPos, float pLimit = -1) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         WarUnit tNearestUnit = null; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         float tMinDisSqr = float.MaxValue; | 
					
						
							|  |  |  |  |         float tCurDisSqr = 0; | 
					
						
							|  |  |  |  |         Vector3 tTargetPos = Vector3.zero; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         for (int i = 0; i < mSoldierList.Count; i++) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (!mSoldierList[i].IsDead) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 tTargetPos = mSoldierList[i].RelativePos(pRefPos); | 
					
						
							|  |  |  |  |                 tCurDisSqr = Mathf.Min(Mathf.Abs(tTargetPos.x - pRefPos.x), Mathf.Abs(tTargetPos.y - pRefPos.y)); | 
					
						
							|  |  |  |  |                 if (pLimit > 0 && pLimit < tCurDisSqr ) | 
					
						
							|  |  |  |  |                     continue; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 tCurDisSqr = (pRefPos - tTargetPos).sqrMagnitude; | 
					
						
							|  |  |  |  |                 if (pLimit > 0 && (pLimit * pLimit) < tCurDisSqr) | 
					
						
							|  |  |  |  |                     continue; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 if (tCurDisSqr < tMinDisSqr) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     tMinDisSqr = tCurDisSqr; | 
					
						
							|  |  |  |  |                     tNearestUnit = mSoldierList[i]; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         return tNearestUnit; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public virtual void AddSoldier(SoldierUnit pUnit, GroupManager pAgainstGroup) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     protected void AddSoldier(SoldierUnit pUnit) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         pUnit.DelDie = OnSoldierDie; | 
					
						
							|  |  |  |  |         pUnit.DelHurt = OnSoldierHurt; | 
					
						
							|  |  |  |  |         pUnit.DelSplash = OnSoldierSplash; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if (!mSoldierGroupDic.ContainsKey(pUnit.GroupID)) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             mSoldierGroupDic[pUnit.GroupID] = new List<SoldierUnit>(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         if(!mSoldierGroupDic[pUnit.GroupID].Contains(pUnit)) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             mSoldierGroupDic[pUnit.GroupID].Add(pUnit); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         mSoldierList.Add(pUnit); | 
					
						
							|  |  |  |  |         mSoldierCount++; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     protected virtual void HandleSoldierClear() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     private void OnSoldierDie(WarUnit pUnit) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         if (mSoldierList.Contains(pUnit as SoldierUnit)) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             mSoldierList.Remove(pUnit as SoldierUnit); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         mSoldierCount--; | 
					
						
							|  |  |  |  |         DelSoldierDie?.Invoke(); | 
					
						
							|  |  |  |  |         if (mSoldierCount <= 0) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             HandleSoldierClear(); | 
					
						
							|  |  |  |  |             DelSoldierClear?.Invoke(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     private void OnSoldierSplash(WarUnit pUnit, int pOverflowDamage) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         SoldierUnit tSoldier = pUnit as SoldierUnit; | 
					
						
							|  |  |  |  |         if (mSoldierGroupDic.ContainsKey(tSoldier.GroupID) && mSoldierGroupDic[tSoldier.GroupID] != null && mSoldierGroupDic[tSoldier.GroupID].Count > 1) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             List<SoldierUnit> tGroupList = mSoldierGroupDic[tSoldier.GroupID]; | 
					
						
							|  |  |  |  |             int tOverflowDamage = pOverflowDamage; | 
					
						
							|  |  |  |  |             for (int i = 0; i < tGroupList.Count; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (tOverflowDamage <= 0) | 
					
						
							|  |  |  |  |                     break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 if (tGroupList[i] == tSoldier || tGroupList[i].IsDead) | 
					
						
							|  |  |  |  |                     continue; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 tOverflowDamage = tGroupList[i].Hurt(tOverflowDamage, false); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     private void OnSoldierHurt(int pDamage) | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         mTotalDamage += pDamage; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public void ActiveAllSoldier() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         foreach (SoldierUnit tUnit in mSoldierList) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (tUnit.gameObject.activeSelf && !tUnit.IsDead) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 tUnit.Active(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     public void Win() | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         foreach (SoldierUnit tUnit in mSoldierList) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (tUnit.gameObject.activeSelf && !tUnit.IsDead) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 tUnit.Win(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-04 11:17:39 +00:00
										 |  |  |  |     public void DefeatAll() | 
					
						
							| 
									
										
										
										
											2022-05-23 13:39:59 +00:00
										 |  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-07-04 11:17:39 +00:00
										 |  |  |  |         List<SoldierUnit> tLeftSoldierList = new List<SoldierUnit>(); | 
					
						
							|  |  |  |  |         foreach (SoldierUnit tUnit in mSoldierList) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (tUnit.gameObject.activeSelf && !tUnit.IsDead) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 tLeftSoldierList.Add(tUnit); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         foreach (SoldierUnit tUnit in tLeftSoldierList) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (tUnit.gameObject.activeSelf && !tUnit.IsDead) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 tUnit.Die(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-05-23 13:39:59 +00:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | } |