| using System.Collections.Generic; | 
| using LitJson; | 
| using UnityEngine; | 
| using UnityEngine.UI; | 
|   | 
| public class ArenaBattleWin : UIBase | 
| { | 
|     // 组件引用 | 
|     [SerializeField] Transform mountPoint; | 
|     [SerializeField] Transform transButtons; | 
|     [SerializeField] Button btnSpeed; | 
|     [SerializeField] Text textSpeed; | 
|     [SerializeField] Button btnPass; | 
|     [SerializeField] Button btnPause; | 
|     private BattleRootNode battleRootNode = null; | 
|     private BattleField battleField; | 
|   | 
|     [SerializeField] HeroCountryComponent myCountry; | 
|     [SerializeField] TextEx txtMyLV; | 
|     [SerializeField] TextEx txtMyName; | 
|     [SerializeField] TextEx txtMyHp; | 
|     [SerializeField] ImageEx imgMyHp; | 
|     [SerializeField] TextEx txtMyFightPonit; | 
|     [SerializeField] AvatarCell myAvatarCell; | 
|     [SerializeField] List<ArenaHeroHead> myHeroHeads; | 
|   | 
|     [SerializeField] HeroCountryComponent enemyCountry; | 
|     [SerializeField] TextEx txtEnemyLV; | 
|     [SerializeField] TextEx txtEnemyName; | 
|     [SerializeField] TextEx txtEnemyHp; | 
|     [SerializeField] ImageEx imgEnemyHp; | 
|     [SerializeField] TextEx txtEnemyFightPonit; | 
|     [SerializeField] AvatarCell enemyAvatarCell; | 
|     [SerializeField] List<ArenaHeroHead> enemyHeroHeads; | 
|   | 
|     [SerializeField] TextEx txtWaveInfo; | 
|     // 生命周期 | 
|     protected override void InitComponent() | 
|     { | 
|         base.InitComponent(); | 
|         // 初始化组件引用 绑定按钮等UI组件事件 | 
|         btnSpeed.AddListener(ChangeSpeed); | 
|         btnPass.AddListener(OnClickPass); | 
|         btnPause.AddListener(OnClickPause); | 
|     } | 
|   | 
|     private void OnClickPause() | 
|     { | 
|         if (null == battleField) | 
|             return; | 
|         battleField.IsPause = !battleField.IsPause; | 
|     } | 
|   | 
|     private void OnClickPass() | 
|     { | 
|         if (null == battleField) | 
|             return; | 
|         battleField.ForceFinish(); | 
|     } | 
|   | 
|     private void ChangeSpeed() | 
|     { | 
|         if (null == battleField) | 
|             return; | 
|         BattleManager.Instance.speedIndex = (BattleManager.Instance.speedIndex + 1) % BattleManager.Instance.speedGear.Length; | 
|         battleField.SetSpeedRatio(BattleManager.Instance.speedGear[BattleManager.Instance.speedIndex]); | 
|         textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString(); | 
|     } | 
|   | 
|     protected override void OnPreOpen() | 
|     { | 
|         base.OnPreOpen(); | 
|         // SetBattleField(BattleManager.Instance.storyBattleField); | 
|         MainWin.TabChangeEvent += OnTabChangeEvent; | 
|         BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField; | 
|         EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken); | 
|         EventBroadcast.Instance.AddListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd); | 
|   | 
|         BattleManager.Instance.storyBattleField.IsPause = true; | 
|         bool isOpenBattleChangeTab = IsOpenBattleChangeTab(); | 
|         transButtons.localPosition = new Vector3(0, isOpenBattleChangeTab ? 200 : 0, 0); | 
|         if (isOpenBattleChangeTab) | 
|         { | 
|             UIManager.Instance.GetUI<MainWin>()?.CloseSubUI(); | 
|         } | 
|         else | 
|         { | 
|             UIManager.Instance.CloseWindow<MainWin>(); | 
|         } | 
|     } | 
|   | 
|     protected override void OnPreClose() | 
|     { | 
|         base.OnPreClose(); | 
|         UIManager.Instance.CloseWindow<BattleHUDWin>(); | 
|         MainWin.TabChangeEvent -= OnTabChangeEvent; | 
|         BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField; | 
|         EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken); | 
|         EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd); | 
|         BattleManager.Instance.storyBattleField.IsPause = false; | 
|   | 
|         bool isOpenBattleChangeTab = IsOpenBattleChangeTab(); | 
|         if (isOpenBattleChangeTab) | 
|         { | 
|             UIManager.Instance.GetUI<MainWin>()?.RestoreSubUI(); | 
|         } | 
|         else | 
|         { | 
|             UIManager.Instance.OpenWindow<MainWin>(); | 
|         } | 
|     } | 
|   | 
|     private void OnTabChangeEvent() | 
|     { | 
|         UIManager.Instance.CloseWindow<ArenaBattleWin>(); | 
|     } | 
|   | 
|     private void OnBattleEnd(string guid, JsonData endData) | 
|     { | 
|         if (battleField != null && guid == battleField.guid) | 
|         { | 
|             DisplayHpInfo(); | 
|         } | 
|     } | 
|   | 
|     private void OnDamageTaken(BattleDmgInfo damageInfo) | 
|     { | 
|         if (battleField == null) | 
|             return; | 
|         if (damageInfo.battleFieldGuid == battleField.guid) | 
|         { | 
|             DisplayHpInfo(); | 
|         } | 
|     } | 
|   | 
|     private void OnCreateBattleField(string arg1, BattleField field) | 
|     { | 
|         if (field.GetType() == battleField.GetType()) | 
|         { | 
|             SetBattleField(field); | 
|         } | 
|     } | 
|   | 
|     protected override void OnClose() | 
|     { | 
|         base.OnClose(); | 
|         if (battleRootNode != null) | 
|         { | 
|             battleRootNode.transform.SetParent(Launch.Instance.transform); | 
|             battleRootNode.transform.localPosition = new Vector3(-10000, -10000, 0); | 
|         } | 
|          | 
|         if (battleField != null) | 
|         { | 
|             battleField.OnRoundChange -= OnRoundChange; | 
|             battleField = null; | 
|         } | 
|     } | 
|   | 
|     public void SetBattleField(BattleField _battleField) | 
|     { | 
|         if (battleField != null) | 
|         { | 
|             battleField.OnRoundChange -= OnRoundChange; | 
|             battleField = null; | 
|         } | 
|   | 
|         battleField = _battleField; | 
|         if (battleRootNode != null) | 
|         { | 
|             battleRootNode.transform.localPosition = Vector3.zero; | 
|             battleRootNode.transform.SetParent(Launch.Instance.transform); | 
|         } | 
|   | 
|         battleRootNode = battleField.battleRootNode; | 
|         battleRootNode.transform.SetParent(mountPoint); | 
|         battleRootNode.transform.localPosition = Vector3.zero; | 
|         battleRootNode.transform.localScale = Vector3.one; | 
|         BattleHUDWin ui = UIManager.Instance.GetUI<BattleHUDWin>(); | 
|   | 
|         if (null == ui) | 
|         { | 
|             ui = UIManager.Instance.OpenWindow<BattleHUDWin>(); | 
|         } | 
|         ui.SetBattleField(battleField); | 
|         battleField.UpdateCanvas(canvas); | 
|         textSpeed.text = (BattleManager.Instance.speedIndex + 1).ToString(); | 
|         DisplayHpInfo(); | 
|         DisplayPlayerInfo(); | 
|         battleField.OnRoundChange -= OnRoundChange; | 
|         battleField.OnRoundChange += OnRoundChange; | 
|         OnRoundChange(battleField.round, battleField.turnMax); | 
|     } | 
|     private void DisplayHpInfo() | 
|     { | 
|         if (battleField == null) | 
|             return; | 
|   | 
|         // 获取我方(红方)队伍数据 | 
|         List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red); | 
|         // 获取敌方(蓝方)队伍数据 | 
|         List<BattleObject> enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue); | 
|   | 
|         ulong myMaxHp = GetMaxHP(myTeam); | 
|         ulong enemyMaxHp = GetMaxHP(enemyTeam); | 
|   | 
|         ulong myNowHp = GetNowHP(myTeam); | 
|         ulong enemyNowHp = GetNowHP(enemyTeam); | 
|         txtMyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeArtNum(myNowHp), UIHelper.ReplaceLargeArtNum(myMaxHp)); | 
|         txtEnemyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeArtNum(enemyNowHp), UIHelper.ReplaceLargeArtNum(enemyMaxHp)); | 
|         imgMyHp.fillAmount = Mathf.Clamp01((myMaxHp > 0) ? (float)myNowHp / myMaxHp : 0f); | 
|         imgEnemyHp.fillAmount = Mathf.Clamp01((enemyMaxHp > 0) ? (float)enemyNowHp / enemyMaxHp : 0f); | 
|   | 
|     } | 
|   | 
|     private void DisplayPlayerInfo() | 
|     { | 
|         if (battleField == null) | 
|             return; | 
|         if (!ArenaManager.Instance.TryGetPlayerInfo(ArenaManager.Instance.atkPlayerId, out ArenaMatchInfo info)) | 
|             return; | 
|         // 获取我方(红方)队伍数据 | 
|         List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red); | 
|         // 获取敌方(蓝方)队伍数据 | 
|         List<BattleObject> enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue); | 
|   | 
|   | 
|         txtEnemyLV.text = Language.Get("Arena22", info.Lv); | 
|         txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName); | 
|         txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(info.FightPower); | 
|         enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic)); | 
|   | 
|         var team = GetTeamHeroList(enemyTeam); | 
|         enemyCountry.RefreshOnTeamCountry(team, true); | 
|   | 
|         txtMyLV.text = Language.Get("Arena22", PlayerDatas.Instance.baseData.LV); | 
|         txtMyName.text = PlayerDatas.Instance.baseData.PlayerName; | 
|         txtMyFightPonit.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower); | 
|         myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic)); | 
|         team = GetTeamHeroList(myTeam); | 
|         myCountry.RefreshOnTeamCountry(team, true); | 
|   | 
|         for (int i = 0; i < myHeroHeads.Count; i++) | 
|         { | 
|             if (i < myTeam.Count) | 
|             { | 
|                 myHeroHeads[i].SetActive(true); | 
|                 var teamHero = myTeam[i].teamHero; | 
|                 myHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level); | 
|             } | 
|             else | 
|             { | 
|                 myHeroHeads[i].SetActive(false); | 
|             } | 
|         } | 
|   | 
|         // 敌方英雄显示(从右到左) | 
|         for (int i = enemyHeroHeads.Count - 1; i >= 0; i--) | 
|         { | 
|             int teamIndex = enemyHeroHeads.Count - 1 - i;  // 建立反向映射 | 
|   | 
|             if (teamIndex < enemyTeam.Count) | 
|             { | 
|                 enemyHeroHeads[i].SetActive(true); | 
|                 var teamHero = enemyTeam[teamIndex].teamHero;  // 使用映射后的索引 | 
|                 enemyHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level); | 
|             } | 
|             else | 
|             { | 
|                 enemyHeroHeads[i].SetActive(false); | 
|             } | 
|         } | 
|   | 
|     } | 
|     ulong GetMaxHP(List<BattleObject> battleObjects) | 
|     { | 
|         ulong sun = 0; | 
|         if (!battleObjects.IsNullOrEmpty()) | 
|         { | 
|             for (int i = 0; i < battleObjects.Count; i++) | 
|             { | 
|                 sun += (ulong)battleObjects[i].teamHero.maxHp; | 
|             } | 
|         } | 
|         return sun; | 
|     } | 
|   | 
|     ulong GetNowHP(List<BattleObject> battleObjects) | 
|     { | 
|         ulong sun = 0; | 
|         if (!battleObjects.IsNullOrEmpty()) | 
|         { | 
|             for (int i = 0; i < battleObjects.Count; i++) | 
|             { | 
|                 sun += (ulong)battleObjects[i].teamHero.curHp; | 
|             } | 
|         } | 
|         return sun; | 
|     } | 
|   | 
|     List<TeamHero> GetTeamHeroList(List<BattleObject> teams) | 
|     { | 
|         List<TeamHero> teamHeroes = new List<TeamHero>(); | 
|         if (teams.IsNullOrEmpty()) | 
|             return teamHeroes; | 
|         foreach (var item in teams) | 
|         { | 
|             teamHeroes.Add(item.teamHero); | 
|         } | 
|         return teamHeroes; | 
|   | 
|     } | 
|   | 
|     private void OnRoundChange(int round, int maxRound) | 
|     { | 
|         txtWaveInfo.text = string.Format("{0}/{1}", round, maxRound); | 
|     } | 
|   | 
|     bool IsOpenBattleChangeTab() | 
|     { | 
|         return FuncOpen.Instance.IsFuncOpen(ArenaManager.Instance.BattleChangeTabFuncId); | 
|     } | 
|   | 
| } |