From 39001a600fcae2bcf27c225df8752d75fb92fef4 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 31 十月 2025 11:18:26 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/Battle/BattleUtility.cs |  351 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 337 insertions(+), 14 deletions(-)

diff --git a/Main/System/Battle/BattleUtility.cs b/Main/System/Battle/BattleUtility.cs
index 5ac2287..2f9276c 100644
--- a/Main/System/Battle/BattleUtility.cs
+++ b/Main/System/Battle/BattleUtility.cs
@@ -4,29 +4,352 @@
 using UnityEngine.UI;
 using DG.Tweening;
 using DG.Tweening.Core;
-
+using System.Linq;
 
 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)
+
+    public static void MarkStartAndEnd(RectTransform startNode, RectTransform endNode)
     {
-        Vector3 targetWorldPos = target.TransformPoint(target.anchoredPosition + offset);
+        // 杩愯鏃舵墠鎵ц
+        if (!Application.isPlaying)
+        {
+            Debug.LogWarning("璇峰湪杩愯鏃朵娇鐢ㄨ鍔熻兘锛�");
+            return;
+        }
 
-        RectTransform parentRect = transform.parent as RectTransform;
+        var battleField = BattleManager.Instance.storyBattleField;
+        if (battleField == null)
+        {
+            Debug.LogError("BattleManager.storyBattleField 鏈垵濮嬪寲锛�");
+            return;
+        }
 
-        Vector2 targetAnchoredPos;
-        RectTransformUtility.ScreenPointToLocalPointInRectangle(
-            parentRect,
-            RectTransformUtility.WorldToScreenPoint(null, targetWorldPos),
-            null,
-            out targetAnchoredPos);
 
-        // 3. DOTween 绉诲姩
-        return transform.DOAnchorPos(targetAnchoredPos, duration)
-            .SetEase(Ease.Linear)
-            .OnComplete(() => onComplete?.Invoke());
+        BattleWin battleWin = UIManager.Instance.GetUI<BattleWin>();
+
+        RectTransform canvasRect = battleWin.transform as RectTransform;
+
+        CreateMarker(canvasRect, startNode, "StartMarker");
+        CreateMarker(canvasRect, endNode, "EndMarker");
     }
 
+    private static void CreateMarker(RectTransform canvasRect, RectTransform targetNode, string markerName)
+    {
+        // 鑾峰彇鐩爣鑺傜偣鐨勪笘鐣屽潗鏍囷紙涓績鐐癸級
+        Vector3 worldPos = targetNode.TransformPoint(targetNode.rect.center);
+
+        // 杞崲鍒癈anvas鏈湴鍧愭爣
+        Vector2 localPoint;
+        RectTransformUtility.ScreenPointToLocalPointInRectangle(
+            canvasRect,
+            RectTransformUtility.WorldToScreenPoint(null, worldPos),
+            null,
+            out localPoint);
+
+        // 鍒涘缓RawImage
+        GameObject marker = new GameObject(markerName, typeof(RawImage));
+        GameObject.Destroy(marker, 5f);
+        marker.transform.SetParent(canvasRect, false);
+        var rawImage = marker.GetComponent<RawImage>();
+        rawImage.color = Color.white;
+        rawImage.rectTransform.sizeDelta = new Vector2(100, 100);
+        rawImage.rectTransform.anchoredPosition = localPoint;
+    }
+
+
+    public static TweenerCore<Vector2, Vector2, DG.Tweening.Plugins.Options.VectorOptions> MoveToTarget(
+        RectTransform transform, RectTransform target, Vector2 offset, Action onComplete = null, float speed = 500f)
+    {
+        // 鑾峰彇鐩爣鑺傜偣鐨勪笘鐣屽潗鏍囷紙閿氱偣浣嶇疆锛�
+        Vector3 worldPos = target.position;
+
+        // 濡傛灉闇�瑕佸姞 offset锛岄渶鑰冭檻 scale
+        Vector3 offsetWorld = target.TransformVector(offset);
+        worldPos += offsetWorld;
+
+        RectTransform canvasRect = transform.parent as RectTransform;
+
+        // 杞崲鍒癈anvas鏈湴鍧愭爣
+        Vector2 localPoint;
+        RectTransformUtility.ScreenPointToLocalPointInRectangle(
+            canvasRect,
+            RectTransformUtility.WorldToScreenPoint(null, worldPos),
+            null,
+            out localPoint);
+
+        float distance = Vector2.Distance(transform.anchoredPosition, localPoint);
+        float duration = distance / speed;
+
+        var tween = transform.DOAnchorPos(localPoint, duration).SetEase(Ease.Linear);
+        tween.onComplete += () =>
+        {
+            onComplete?.Invoke();
+        };
+
+        return tween;
+    }
+
+    public static string DisplayDamageNum(long num, int attackType)
+    {
+        var config = DamageNumConfig.Get(attackType);
+        var basePowerStr = UIHelper.ReplaceLargeArtNum(num);
+        var result = string.Empty;
+        for (int i = 0; i < basePowerStr.Length; i++)
+        {
+            var numChar = (char)GetDamageNumKey(config, basePowerStr[i]);
+            if (numChar > 0)
+            {
+                result += numChar;
+            }
+        }
+        return result;
+    }
+
+    public static string DisplayDamageNum(BattleDmg damage)
+    {
+        var config = DamageNumConfig.Get(damage.attackType);
+
+        string result = string.Empty;
+
+        //  濡傛灉鏄棯閬� 鍒欏彧鏄剧ず闂伩涓や釜瀛�
+        if (damage.IsType(DamageType.Dodge))
+        {
+            result += (char)config.prefix;
+        }
+        else
+        {
+            result = ConvertToArtFont(config, damage.damage);
+        }
+
+        return result;
+    }
+
+    public static string ConvertToArtFont(DamageNumConfig config, float _num)
+    {
+        var stringBuild = new System.Text.StringBuilder();
+
+        if (0 != config.plus)
+            stringBuild.Append((char)config.plus);
+        if (0 != config.prefix)
+            stringBuild.Append((char)config.prefix);
+
+        var chars = UIHelper.ReplaceLargeArtNum(_num);
+        for (var i = 0; i < chars.Length; i++)
+        {
+            int numChar = GetDamageNumKey(config, (int)chars[i]);
+
+            if (numChar > 0)
+            {
+                stringBuild.Append((char)numChar);
+            }
+        }
+
+        return stringBuild.ToString();
+    }
+
+    public static int GetMainTargetPositionNum(BattleObject caster, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> targetList, SkillConfig skillConfig)
+    {
+        int returnIndex = 0;
+        //  鏍规嵁鏁屾柟琛�閲忛樀钀� 瀛樻椿浜烘暟鏉ラ�夋嫨
+        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+        List<BattleObject> targetObjList = caster.battleField.battleObjMgr.GetBattleObjList(battleCamp);
+
+
+        // 鐬勫噯鐨勭洰鏍囪寖鍥达紝濡傛灉鐩爣涓暟涓�0鍒欎负鑼冨洿鍐呭叏閮�
+        // 0    鍏ㄩ儴鑼冨洿
+        // 1    瀵逛綅锛岄粯璁ゅ彧閫�1涓�
+        // 2    鍓嶆帓
+        // 3    鍚庢帓
+        // 4    绾垫帓锛屾寜瀵逛綅瑙勫垯閫夋嫨绾垫帓
+        // 5    鑷繁锛岄粯璁ゅ彧閫夎嚜宸�
+
+        switch (skillConfig.TagAim)
+        {
+            case 0:
+                // 0   鍏ㄩ儴鑼冨洿锛�
+                // 鑻agCount鐩爣涓暟涓�0鎴�6锛屾牴鎹甌agFriendly鏁屾垜閰嶇疆锛屼唬琛ㄤ綔鐢ㄤ簬鏁屾柟鍏ㄤ綋鎴栨垜鏂瑰叏浣擄紝姝ゆ椂涓荤洰鏍囦负鏁屾垜绔欎綅涓殑2鍙蜂綅缃�
+                // 鑻agCount鐩爣涓暟涓�1~5涓紝鏍规嵁TagFriendly鏁屾垜+TagAffect缁嗗垎鐩爣閰嶇疆锛屼唬琛ㄩ殢鏈轰綔鐢ㄤ簬鏁屾柟鎴栨垜鏂箈涓灏嗭紝绗竴涓负涓荤洰鏍�
+                if (skillConfig.TagCount == 0 || skillConfig.TagCount == 6)
+                {
+                    returnIndex = 1;
+                }
+                else
+                {
+                    uint objId = targetList[0].ObjID;
+                    BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId);
+                    return target.teamHero.positionNum;
+                }
+                break;
+            case 1:
+                // 1    瀵逛綅锛�
+                // 榛樿鍙��1涓紝瀵逛綅瑙勫垯涓篈1浼樺厛鎵揃1锛孉2浼樺厛鎵揃2锛孉3浼樺厛鎵揃3锛屽浣嶇洰鏍囨浜℃椂锛屼紭鍏堝墠鎺掞紝姣斿B2宸茬粡姝讳骸锛岄偅涔圓2灏嗕紭鍏堟墦B1锛屽墠鎺�1銆�2銆�3鍙蜂綅缃叏閮ㄦ浜′箣鍚庢墠寮�濮嬮�夋嫨鍚庢帓4銆�5銆�6鍙蜂綅缃紝瀵逛綅鍙彲閫�1涓洰鏍囷紝鍗充富鐩爣
+                if (targetList.Count > 0)
+                {
+                    BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)targetList[0].ObjID);
+                    if (battleObject != null)
+                    {
+                        returnIndex = battleObject.teamHero.positionNum;
+                    }
+                    else
+                    {
+                        Debug.LogError("GetMainTargetPositionNum 鎵句笉鍒扮洰鏍� ObjId : " + targetList[0].ObjID);
+                        returnIndex = 0;
+                    }
+                }
+                else
+                {
+                    Debug.LogError("targetList 鐩爣鍒楄〃涓虹┖");
+                    returnIndex = 0;
+                }
+                break;
+            case 2:
+                //  1銆�2銆�3鍙蜂綅涓哄墠鎺掞紝榛樿2鍙蜂綅缃负涓荤洰鏍囷紝褰�1銆�2銆�3鍙蜂綅缃鑹插叏閮ㄦ浜★紝鍓嶆帓灏嗘浛鎹㈡垚鍚庢帓锛�5鍙蜂綅缃彉鏇翠负涓荤洰鏍囷紝
+                //  鑻ラ厤缃甌agAffect缁嗗垎鐩爣锛屼笖浜烘暟灏忎簬3锛屽垯鎵�鏈夎閫夋嫨鐩爣鍧囦负涓荤洰鏍囷紙鏂芥硶浣嶇疆浼氱敤瀹㈡埛绔厤缃級
+                // 锛堝嵆鍓嶆帓榛樿2鍙蜂綅鎴�5鍙蜂綅瑙勫垯鏃犳晥锛屽疄闄呬綔鐢ㄥ灏戜汉灏辨槸澶氬皯涓富鐩爣锛� (YL : TagAffect>0 && TagAffect != 3灏辨槸鍏ㄤ綋閮芥槸涓荤洰鏍� 鍚庢帓涓�鏍� )
+                if (skillConfig.TagAffect != 0 || skillConfig.TagCount < 3)
+                {
+                    uint objId = targetList[0].ObjID;
+                    BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId);
+                    returnIndex = target.teamHero.positionNum;
+                }
+                else
+                {
+                    //  鐪嬬湅瀵归潰鍓嶆帓鏄惁閮芥椿鐫�
+                    List<BattleObject> front = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.teamHero.positionNum < 3 select bo);
+                    if (front.Count > 0)
+                    {
+                        returnIndex = 1;
+                    }
+                    else
+                    {
+                        returnIndex = 4;
+                    }
+                }
+                break;
+            case 3:
+                if (skillConfig.TagAffect != 0 || skillConfig.TagCount < 3)
+                {
+                    uint objId = targetList[0].ObjID;
+                    BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId);
+                    returnIndex = target.teamHero.positionNum;
+                }
+                else
+                {
+                    //  鐪嬬湅瀵归潰鍚庢帓鏄惁閮芥椿鐫�
+                    List<BattleObject> back = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.teamHero.positionNum >= 3 select bo);
+                    if (back.Count > 0)
+                    {
+                        returnIndex = 4;
+                    }
+                    else
+                    {
+                        returnIndex = 1;
+                    }
+                }
+                break;
+            // 4    绾垫帓锛屾寜瀵逛綅瑙勫垯閫夋嫨绾垫帓
+            case 4:
+                returnIndex = int.MaxValue;
+                for (int i = 0; i < targetList.Count; i++)
+                {
+                    var hurt = targetList[i];
+                    BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+                    if (target == null)
+                    {
+                        Debug.LogError("GetMainTargetPositionNum 鎵句笉鍒扮洰鏍� ObjId : " + hurt.ObjID);
+                        continue;
+                    }
+                    else
+                    {
+                        returnIndex = Mathf.Min(returnIndex, target.teamHero.positionNum);
+                    }
+                }
+                break;
+            // 5    鑷繁锛岄粯璁ゅ彧閫夎嚜宸�
+            case 5:
+                returnIndex = caster.teamHero.positionNum;
+                break;
+            default:
+                Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閫夋嫨涓荤洰鏍� 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " TagAim " + skillConfig.TagAim);
+                returnIndex = 0;
+                break;
+        }
+
+        return returnIndex;
+    }
+
+    public static int GetDamageNumKey(DamageNumConfig config, int _num)
+    {
+        if (_num == 46)      return config.nums[10]; // '.'
+        else if (_num == 107) return config.nums[11]; // 'k'
+        else if (_num == 109) return config.nums[12]; // 'm'
+        else if (_num == 98)  return config.nums[13]; // 'b'
+        else if (_num == 116) return config.nums[14]; // 't'
+        int targetNum = _num - 48;
+        if (targetNum >= config.nums.Length || targetNum < 0)
+        {
+            Debug.LogError("damage config " + config.TypeID + " _num is " +  _num + " out of range");
+            return _num;
+        }
+        return config.nums[_num - 48];
+    }
+
+    /// <summary>
+    /// 淇濊瘉鎵�鏈夊垎閰嶉」鍔犺捣鏉ョ瓑浜巘otalDamage锛岄伩鍏嶅洜鏁撮櫎瀵艰嚧鐨勮宸�
+    /// </summary>
+    public static List<long> DivideDamageToList(int[] damageDivide, long totalDamage)
+    {
+        List<long> fixedDamageList = new List<long>();
+
+        for (int i = 0; i < damageDivide.Length; i++)
+        {
+            float fixedDamage = (float)totalDamage * (float)damageDivide[i] / 10000f;
+            fixedDamageList.Add((int)fixedDamage);
+        }
+        
+        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 deadPack)
+            {
+                deadPacks.Add(deadPack);
+            }
+            else if (pack is CustomHB426CombinePack)
+            {
+                break;
+            }
+        }
+        // Debug.LogError("find dead pack " + deadPacks.Count);
+        return deadPacks;
+    }
+
+
+    public static List<HB423_tagMCTurnFightObjReborn> FindRebornPack(List<GameNetPackBasic> packList)
+    {
+        List<HB423_tagMCTurnFightObjReborn> rebornPackList = new List<HB423_tagMCTurnFightObjReborn>();
+        for (int i = 0; i < packList.Count; i++)
+        {
+            var pack = packList[i];
+            //	瀵绘壘姝讳骸鍖� 鎵惧埌姝讳骸鍖呬箣鍚庤鎵炬帀钀藉寘 涓嶈兘瓒呰繃鎶�鑳藉寘
+            if (pack is HB423_tagMCTurnFightObjReborn rebornPack)
+            {
+                rebornPackList.Add(rebornPack);
+            }
+            else if (pack is CustomHB426CombinePack)
+            {
+                break;
+            }
+        }
+        return rebornPackList;
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0