| using System; | 
| using System.Collections.Generic; | 
| using UnityEngine; | 
| using UnityEngine.UI; | 
| using DG.Tweening; | 
| using DG.Tweening.Core; | 
|   | 
|   | 
| public static class BattleUtility | 
| { | 
|     // 其他通用的战斗工具方法可以放在这里 | 
|   | 
|     public static TweenerCore<Vector2, Vector2, DG.Tweening.Plugins.Options.VectorOptions> MoveToTarget(RectTransform transform, RectTransform target, Vector2 offset, float duration, Action onComplete = null) | 
|     { | 
|         // 1. 获取目标的最终 anchoredPosition(加上 offset) | 
|         Vector2 targetAnchoredPos = target.anchoredPosition + offset; | 
|         Vector3 worldAnchorPos = target.TransformPoint(targetAnchoredPos); | 
|   | 
|   | 
|         // 转换 target 的 anchoredPosition 到 sourceParent 的坐标系 | 
|         Vector2 localPoint; | 
|         RectTransformUtility.ScreenPointToLocalPointInRectangle( | 
|             transform, | 
|             RectTransformUtility.WorldToScreenPoint(CameraManager.uiCamera, worldAnchorPos), | 
|             CameraManager.uiCamera, | 
|             out localPoint); | 
|   | 
|         // 3. DOTween 移动 | 
|         var tween = transform.DOAnchorPos(localPoint, duration).SetEase(Ease.Linear); | 
|         tween.onComplete += () => | 
|         { | 
|             onComplete?.Invoke(); | 
|         }; | 
|   | 
|         return tween; | 
|     } | 
|   | 
|     public static string DisplayDamageNum(long num, int attackType) | 
|     { | 
|         var basePowerStr = UIHelper.ReplaceLargeArtNum(num); | 
|         var result = string.Empty; | 
|         for (int i = 0; i < basePowerStr.Length; i++) | 
|         { | 
|             var numChar = (char)GetDamageNumKey((DamageType)attackType, basePowerStr[i]); | 
|             if (numChar > 0) | 
|             { | 
|                 result += numChar; | 
|             } | 
|         } | 
|         return result; | 
|     } | 
|   | 
|     public static int GetDamageNumKey(DamageType damageType, int _num) | 
|     { | 
|         var config = DamageNumConfig.Get(damageType.ToString()); | 
|         //.的ASCII码是46 | 
|         if (_num == 46) | 
|         { | 
|             return config.nums[10]; | 
|         } | 
|         //k的ASCII码是107 | 
|         else if (_num == 107) | 
|         { | 
|             return config.nums[11]; | 
|         } | 
|         //m的ASCII码是109 | 
|         else if (_num == 109) | 
|         { | 
|             return config.nums[12]; | 
|         } | 
|         //b的ASCII码是98 | 
|         else if (_num == 98) | 
|         { | 
|             return config.nums[13]; | 
|         } | 
|         //t的ASCII码是116 | 
|         else if (_num == 116) | 
|         { | 
|             return config.nums[14]; | 
|         } | 
|         return config.nums[_num - 48]; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 保证所有分配项加起来等于totalDamage,避免因整除导致的误差 | 
|     /// </summary> | 
|     public static List<long> DivideDamageToList(int[] damageDivide, long totalDamage) | 
|     { | 
|         List<long> fixedDamageList = new List<long>(); | 
|         long assigned = 0; | 
|         int count = damageDivide.Length; | 
|   | 
|         for (int i = 0; i < count; i++) | 
|         { | 
|             long damage; | 
|             if (i == count - 1) | 
|             { | 
|                 // 最后一个分配项修正为剩余 | 
|                 damage = totalDamage - assigned; | 
|             } | 
|             else | 
|             { | 
|                 damage = (totalDamage * damageDivide[i] + 5000) / 10000; // 四舍五入 | 
|                 assigned += damage; | 
|             } | 
|             fixedDamageList.Add(damage); | 
|         } | 
|         return fixedDamageList; | 
|     } | 
|   | 
|     public static List<HB422_tagMCTurnFightObjDead> FindDeadPack(List<GameNetPackBasic> packList) | 
|     { | 
|         List<HB422_tagMCTurnFightObjDead> deadPacks = new List<HB422_tagMCTurnFightObjDead>(); | 
|         for (int i = 0; i < packList.Count; i++) | 
|         { | 
|             var pack = packList[i]; | 
|             //    寻找死亡包 找到死亡包之后要找掉落包 不能超过技能包 | 
|             if (pack is HB422_tagMCTurnFightObjDead) | 
|             { | 
|                 var deadPack = pack as HB422_tagMCTurnFightObjDead; | 
|                 deadPacks.Add(deadPack); | 
|             } | 
|             else if (pack is CustomHB426CombinePack) | 
|             { | 
|                 //    找死亡包不要越过技能包 | 
|                 var combinePack = pack as CustomHB426CombinePack; | 
|                 if (combinePack.startTag.Tag.StartsWith("Skill_")) | 
|                 { | 
|                     break; | 
|                 } | 
|             } | 
|         } | 
|         return deadPacks; | 
|     } | 
|   | 
|   | 
|     public static List<HB423_tagMCTurnFightObjReborn> FindRebornPack(List<GameNetPackBasic> packList) | 
|     { | 
|         List<HB423_tagMCTurnFightObjReborn> rebornPack = new List<HB423_tagMCTurnFightObjReborn>(); | 
|         for (int i = 0; i < packList.Count; i++) | 
|         { | 
|             var pack = packList[i]; | 
|             //    寻找死亡包 找到死亡包之后要找掉落包 不能超过技能包 | 
|             if (pack is HB423_tagMCTurnFightObjReborn) | 
|             { | 
|                 var deadPack = pack as HB423_tagMCTurnFightObjReborn; | 
|                 rebornPack.Add(deadPack); | 
|             } | 
|             else if (pack is CustomHB426CombinePack) | 
|             { | 
|                 //    找死亡包不要越过技能包 | 
|                 var combinePack = pack as CustomHB426CombinePack; | 
|                 if (combinePack.startTag.Tag.StartsWith("Skill_")) | 
|                 { | 
|                     break; | 
|                 } | 
|             } | 
|         } | 
|         return rebornPack; | 
|     } | 
| } |