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/HeroUI/HeroPosWin.cs |  388 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 362 insertions(+), 26 deletions(-)

diff --git a/Main/System/HeroUI/HeroPosWin.cs b/Main/System/HeroUI/HeroPosWin.cs
index 1b0d552..00bdc64 100644
--- a/Main/System/HeroUI/HeroPosWin.cs
+++ b/Main/System/HeroUI/HeroPosWin.cs
@@ -2,14 +2,20 @@
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
+using DG.Tweening;
+using Cysharp.Threading.Tasks;
+using System.Threading;
+using System;
 
 /// <summary>
-/// 姝﹀皢甯冮樀: functionOrder锛氬竷闃电被鍨�
+/// 姝﹀皢甯冮樀鐣岄潰
 /// </summary>
 public class HeroPosWin : UIBase
 {
     [SerializeField] Text[] attrOnList; //涓婇樀灞炴�у姞鎴�
+    [SerializeField] Button countryOnBtn;
     [SerializeField] Image countryOnImg;    //涓婇樀闃靛瀷婵�娲诲浗瀹�
+    [SerializeField] UIEffectPlayer countryEffect;
     [SerializeField] List<Image> OnCountImgs;    //涓婇樀鏁伴噺婵�娲�
     [SerializeField] List<Image> scenePosImgs;  //鍦烘櫙甯冮樀浣嶇疆
     [SerializeField] HeroScenePosCell[] sceneHero;
@@ -21,77 +27,197 @@
     [SerializeField] ScrollerController heroListScroller;
     [SerializeField] Transform heroListEmpty;
     [SerializeField] Toggle showConnTipToggleBtn;
+
     [SerializeField] HeroSelectBehaviour fiterManager;  //姝﹀皢绛涢��
 
     [SerializeField] Button oneKeyOnBtn;     //涓�閿笂闃�
     [SerializeField] Button saveBtn;        //淇濆瓨闃靛瀷
     [SerializeField] Button backBtn;      //閫�鍑虹晫闈�
     [SerializeField] GroupButtonEx jjcBtn;       //绔炴妧鍦�
-    [SerializeField] GroupButtonEx tttBtn;        //閫氬ぉ濉�
+    // [SerializeField] GroupButtonEx tttBtn;        //閫氬ぉ濉�
     [SerializeField] GroupButtonEx mainFBBtn;     //涓荤嚎鍓湰
 
     //缇佺粖
     [SerializeField] HeroConnectionCell connetionForm;
+    [SerializeField] HeroHeadBaseCell flyHead;
+    [SerializeField] CanvasGroup flyAlphaTween;
 
+    Sequence sequence;
+    CancellationTokenSource _cts;
+    Queue<int> showConnectTipQueue = new Queue<int>();
+
+    private bool m_IsToggleOn = false;
+    private bool isToggleOn
+    {
+        get { return m_IsToggleOn; }
+        set
+        {
+            if (m_IsToggleOn != value)
+            {
+                m_IsToggleOn = value;
+                LocalSave.SetBool("ShowConn" + PlayerDatas.Instance.baseData.PlayerID, value);
+            }
+        }
+    }
 
     protected override void InitComponent()
     {
         attackTeamBtn.AddListener(() =>
         {
-            if (HeroUIManager.Instance.selectTeamType == TeamType.Arena)
-            {
-                return;
-            }
-
-            HeroUIManager.Instance.selectTeamType = TeamType.Arena;
-            Refresh();
+            SelectTeamFunc((TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(0));
         });
         defendTeamBtn.AddListener(() =>
         {
-            if (HeroUIManager.Instance.selectTeamType == TeamType.ArenaDefense)
-            {
-                return;
-            }
-            HeroUIManager.Instance.selectTeamType = TeamType.ArenaDefense;
-            Refresh();
+            SelectTeamFunc((TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(1));
         });
+
+        mainFBBtn.AddListener(() =>
+        {
+            SelectTeamFunc(TeamType.Story);
+        });
+
+        jjcBtn.AddListener(() =>
+        {
+            SelectTeamFunc(TeamType.Arena);
+        });
+        // tttBtn.AddListener(() =>
+        // {
+        //     SelectTeamFunc(TeamType.Tower);
+        // });
+
+        showConnTipToggleBtn.AddListener((value) =>
+        {
+            isToggleOn = showConnTipToggleBtn.isOn;
+            if (isToggleOn == false)
+            {
+                CancelCurrentTask();
+            }
+        });
+        oneKeyOnBtn.AddListener(OneKeyOnPos);
+        saveBtn.AddListener(SaveTeam);
+
+        backBtn.AddListener(CloseWindow);
+
+        countryOnBtn.AddListener(() =>
+        {
+            HeroUIManager.Instance.isCustonHeroFormation = false;
+            UIManager.Instance.OpenWindow<HeroFormationWin>();
+        });
+
+        m_IsToggleOn = LocalSave.GetBool("ShowConn" + PlayerDatas.Instance.baseData.PlayerID, false);
     }
 
 
     protected override void OnPreOpen()
     {
+        HeroUIManager.Instance.selectTeamPosJob = 0;
+        HeroUIManager.Instance.selectTeamPosCountry = 0;
+        HeroUIManager.Instance.SortHeroOnTeamList();
         heroListScroller.OnRefreshCell += OnRefreshCell;
+        HeroUIManager.Instance.OnTeamPosChangeEvent += TeamChangeEvent;
+        TeamManager.Instance.OnTeamChange += OnTeamChange;
+        SelectTiltleBtn();
         CreateScroller();
-        Refresh();
+        Display();
     }
 
     protected override void OnPreClose()
     {
+        CancelCurrentTask();
         heroListScroller.OnRefreshCell -= OnRefreshCell;
+        HeroUIManager.Instance.OnTeamPosChangeEvent -= TeamChangeEvent;
+        TeamManager.Instance.OnTeamChange -= OnTeamChange;
+        TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType).RestoreTeam();
     }
 
 
-    public override void Refresh()
+    void SelectTiltleBtn()
+    {
+        if (functionOrder == 0)
+        {
+            mainFBBtn.SelectBtn();
+        }
+        else if (functionOrder == 1)
+        {
+            jjcBtn.SelectBtn();
+        }
+    }
+
+
+    public void Display()
     {
         OnBattleTeamAttrPer();
         RefreshOnTeamCountry();
         RefreshOnTeamBtn();
+        RefreshTeamHero();
+        RefreshFlyHead();
+        RefreshConn();
+
+        RefreshEmptyTip();
+
+        showConnTipToggleBtn.isOn = isToggleOn;
+
+        fiterManager.Display(0, HeroUIManager.Instance.selectTeamPosJob, HeroUIManager.Instance.selectTeamPosCountry, SelectJobCountry);
+
+
+        fightPowerText.text = UIHelper.ReplaceLargeArtNum(FightPowerManager.Instance.GetTeamFightPower(HeroUIManager.Instance.selectTeamType, true));
+
+
     }
 
+    void RefreshFlyHead()
+    {
+        var flyCanvas = flyAlphaTween.GetComponent<Canvas>();
+        flyCanvas.sortingLayerID = canvas.sortingLayerID;
+        flyCanvas.sortingOrder = canvas.sortingOrder + 9;
+        flyAlphaTween.alpha = 0;
+        flyHead.transform.localScale = Vector3.zero;
+    }
 
+    void RefreshConn()
+    {
+        connetionForm.SetActive(false);
+        var canvasConn = connetionForm.GetComponent<Canvas>();
+        canvasConn.sortingLayerID = canvas.sortingLayerID;
+        canvasConn.sortingOrder = canvas.sortingOrder + 9;
+        CancelCurrentTask();
+    }
+
+    void SelectJobCountry(int job, int country)
+    {
+        HeroUIManager.Instance.selectTeamPosJob = job;
+        HeroUIManager.Instance.selectTeamPosCountry = country;
+        HeroUIManager.Instance.SortHeroOnTeamList();
+        CreateScroller();
+        RefreshEmptyTip();
+    }
+
+    void RefreshEmptyTip()
+    {
+        if (HeroUIManager.Instance.heroOnTeamSortList.Count <= 0)
+        {
+            heroListEmpty.SetActive(true);
+            heroListScroller.SetActive(false);
+        }
+        else
+        {
+            heroListEmpty.SetActive(false);
+            heroListScroller.SetActive(true);
+        }
+    }
 
     void OnRefreshCell(ScrollerDataType type, CellView cell)
     {
-        var _cell = cell as HeroCardLineCell;
+        var _cell = cell as HeroPosLineCell;
         _cell.Display(cell.index);
     }
 
     void CreateScroller()
     {
         heroListScroller.Refresh();
-        for (int i = 0; i < HeroUIManager.Instance.heroSortList.Count; i++)
+        for (int i = 0; i < HeroUIManager.Instance.heroOnTeamSortList.Count; i++)
         {
-            if (i % 4 == 0)
+            if (i % 5 == 0)
             {
                 heroListScroller.AddCell(ScrollerDataType.Header, i);
             }
@@ -106,9 +232,11 @@
         var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
         if (team != null)
         {
-            for (int i = 0; i < team.serverHeroes.Length; i++)
+            for (int i = 0; i < team.tempHeroes.Length; i++)
             {
-                var hero = HeroManager.Instance.GetHero(team.serverHeroes[i].guid);
+                if (team.tempHeroes[i] == null)
+                    continue;
+                var hero = HeroManager.Instance.GetHero(team.tempHeroes[i].guid);
                 if (hero != null)
                 {
                     valuePer += hero.GetOnBattleAddPer();
@@ -119,19 +247,20 @@
         //涓婇樀灞炴��
         for (int i = 0; i < attrOnList.Length; i++)
         {
-            attrOnList[i].text = PlayerPropertyConfig.GetFullDescription(new Int2(PlayerPropertyConfig.basePerAttrs[i], valuePer));
+            string format = valuePer == 0 ? "{0}+{1}" : "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}", false);
+            attrOnList[i].text = PlayerPropertyConfig.GetFullDescription(PlayerPropertyConfig.basePerAttrs[i], valuePer, format);
         }
     }
 
     //涓婇樀姝﹀皢鍥藉鍏夌幆婵�娲�
-    void RefreshOnTeamCountry()
+    void RefreshOnTeamCountry(bool playEffect = false)
     {
-        Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(HeroUIManager.Instance.selectTeamType);
+        Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(HeroUIManager.Instance.selectTeamType, true);
 
         var config = HeroLineupHaloConfig.GetConfig(result.x, result.y);
         if (config == null)
         {
-            countryOnImg.SetSprite("heroTeamCountry" + result.x);
+            countryOnImg.SetSprite("heroTeamCountry0");
             for (int i = 0; i < OnCountImgs.Count; i++)
             {
                 OnCountImgs[i].SetActive(false);
@@ -152,6 +281,8 @@
                     OnCountImgs[i].SetActive(false);
                 }
             }
+            if (playEffect)
+                countryEffect.Play();
         }
 
     }
@@ -181,7 +312,212 @@
 
     }
 
+    void RefreshTeamHero()
+    {
+        var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
+        for (int i = 0; i < sceneHero.Length; i++)
+        {
+            var teamHero = team.tempHeroes[i];
+            if (teamHero == null)
+            {
+                sceneHero[i].SetActive(false);
+            }
+            else
+            {
+                sceneHero[i].SetActive(true);
+                sceneHero[i].Display(teamHero.guid, i);
+                //鎸塻cenePosImgs 椤哄簭鎺掑簭瀵瑰簲浣嶇疆
+                sceneHero[i].transform.position = scenePosImgs[i].transform.position;
+                sceneHero[i].transform.localScale = Vector3.one;
+            }
+
+        }
+        RefreshPosScale();
+    }
+
+    void RefreshPosScale()
+    {
+        for (int i = 0; i < scenePosImgs.Count; i++)
+        {
+            scenePosImgs[i].transform.localScale = Vector3.one;
+        }
+    }
+
+    /// <summary>
+    /// 鐐瑰嚮涓婇樀锛屾嫋鎷夛紝涓�閿瓑瑙﹀彂锛�
+    /// </summary>
+    /// <param name="posList">瑕佸埛鏂扮殑甯冮樀浣嶇疆</param>
+    /// <param name="flyFrom">澶т簬-1浠h〃鏄偣鍑讳笂闃碉紝闇�瑕佽〃鐜伴琛屾晥鏋�</param>
+    void TeamChangeEvent(List<int> posList, int flyFrom, Vector3 startPos)
+    {
+        var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
+        foreach (var i in posList)
+        {
+            var teamHero = team.tempHeroes[i];
+            if (teamHero == null)
+            {
+                sceneHero[i].SetActive(false);
+            }
+            else
+            {
+                sceneHero[i].SetActive(true);
+                sceneHero[i].Display(teamHero.guid, i, flyFrom >= 0, flyFrom != -2 ? true : false);
+                //鎸塻cenePosImgs 椤哄簭鎺掑簭瀵瑰簲浣嶇疆
+                sceneHero[i].transform.position = scenePosImgs[i].transform.position;
+                sceneHero[i].transform.localScale = Vector3.one;
+
+            }
+        }
+        RefreshPosScale();
+        heroListScroller.m_Scorller.RefreshActiveCellViews();
+        RefreshOnTeamCountry(true);
+        OnBattleTeamAttrPer();
+
+        //琛ㄧ幇椋炲叆锛岃繛缁偣鍑讳笉鍚屽ご鍍忚Е鍙戠殑璇濆垯閲嶇疆
+        if (flyFrom > -1)
+        {
+            var flyHero = HeroManager.Instance.GetHero(HeroUIManager.Instance.heroOnTeamSortList[flyFrom]);
+            if (flyHero == null)
+                return;
+
+            //鍏堝仠姝� sequence
+            if (sequence != null)
+            {
+                sequence.Kill();
+            }
+            sequence = DOTween.Sequence();
 
 
+            flyAlphaTween.alpha = 1;
+            flyHead.Init(flyHero.heroId, flyHero.SkinID);
+            flyHead.transform.position = startPos;
+            var targetPos = scenePosImgs[posList[0]].transform.position;
+            flyHead.transform.localScale = Vector3.one;
+            sequence.Append(flyHead.transform.DOMove(targetPos, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad))
+                .Join(flyHead.transform.DOScale(new Vector3(0.5f, 0.5f, 0.5f), HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad))
+                .Join(flyAlphaTween.DOFade(0f, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad));
+            sequence.onComplete = () => { flyHead.transform.localScale = Vector3.zero; };
 
+            if (isToggleOn)
+            {
+                ShowFetter(flyHero);
+            }
+        }
+        fightPowerText.text = UIHelper.ReplaceLargeArtNum(FightPowerManager.Instance.GetTeamFightPower(HeroUIManager.Instance.selectTeamType, true));
+
+    }
+
+    void ShowFetter(HeroInfo hero)
+    {
+        var heroConfig = hero.heroConfig;
+        var fetterList = hero.GetActiveFetter(heroConfig, TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType));
+        for (int i = 0; i < fetterList.Count; i++)
+        {
+            if (!showConnectTipQueue.Contains(fetterList[i]))
+                showConnectTipQueue.Enqueue(fetterList[i]);
+        }
+
+        if (_cts == null)
+        {
+            _cts = new CancellationTokenSource();
+            RunTaskAsync(_cts.Token).Forget(); // Forget() 琛ㄧず涓嶇瓑寰呮浠诲姟瀹屾垚
+        }
+
+    }
+    async UniTask RunTaskAsync(CancellationToken token)
+    {
+        try
+        {
+            while (showConnectTipQueue.Count > 0)
+            {
+                await UniTask.Delay(300, cancellationToken: token);
+                showConnectTipQueue.TryDequeue(out int fetterID);
+                if (fetterID == 0)
+                {
+                    continue;
+                }
+                connetionForm.SetActive(true);
+                connetionForm.Display(fetterID);
+                //鏄剧ず1.5绉掑悗鍏抽棴
+                await UniTask.Delay(1500, cancellationToken: token);
+                connetionForm.SetActive(false);
+            }
+
+        }
+        catch (OperationCanceledException)
+        {
+            Debug.Log("缇佺粖 鍗忕▼琚彇娑�");
+            connetionForm.SetActive(false);
+        }
+        finally
+        {
+            _cts?.Dispose();     // 閲婃斁璧勬簮
+            _cts = null;         // 缃┖閬垮厤閲嶅鍙栨秷
+            showConnectTipQueue.Clear();
+        }
+
+    }
+
+    // 鍙栨秷褰撳墠姝e湪杩愯鐨勪换鍔�
+    public void CancelCurrentTask()
+    {
+        _cts?.Cancel();      // 瑙﹀彂鍙栨秷
+        _cts?.Dispose();     // 閲婃斁璧勬簮
+        _cts = null;         // 缃┖閬垮厤閲嶅鍙栨秷
+        showConnectTipQueue.Clear();
+    }
+
+    void OneKeyOnPos()
+    {
+        var guidList = HeroUIManager.Instance.SelectRecommend();
+        var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
+        team.RemoveAllHeroes();
+        if (NewBieCenter.Instance.inGuiding && NewBieCenter.Instance.currentGuide == HeroUIManager.Instance.onekeyGuideID)
+        {
+            for (int i = 0; i < guidList.Count; i++)
+            {
+                team.AddHero(HeroManager.Instance.GetHero(guidList[i]), HeroUIManager.Instance.onekeyGuidePosList[i] - 1, true);
+            }
+
+        }
+        else
+        {
+            for (int i = 0; i < guidList.Count; i++)
+            {
+                team.AddHero(HeroManager.Instance.GetHero(guidList[i]), i, true);
+            }
+        }        
+
+        TeamChangeEvent(new List<int>() { 0, 1, 2, 3, 4, 5 }, -1, Vector3.zero);
+
+    }
+
+    void SaveTeam()
+    {
+        var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
+        team.SaveTeam();
+    }
+
+    void SelectTeamFunc(TeamType type)
+    {
+        if (HeroUIManager.Instance.selectTeamType == type)
+        {
+            return;
+        }
+        HeroUIManager.Instance.selectTeamPosJob = 0;
+        HeroUIManager.Instance.selectTeamPosCountry = 0;
+        HeroUIManager.Instance.selectTeamType = type;
+        HeroUIManager.Instance.SortHeroOnTeamList();
+        Display();
+        heroListScroller.m_Scorller.RefreshActiveCellViews();
+    }
+    
+    protected void OnTeamChange(TeamType teamType)
+    {
+        if (HeroUIManager.Instance.selectTeamType == teamType)
+        {
+            HeroUIManager.Instance.SortHeroOnTeamList();
+            heroListScroller.m_Scorller.RefreshActiveCellViews();
+        }
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0