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); 
 | 
    } 
 | 
  
 | 
} 
 |