using System; using System.Collections.Generic; using Animancer; using Logic; using Logic.Action; using Logic.Audio; using Logic.CrashSight; using Logic.Multilingual; using RuntimeData; using TH1_Core.Events; using TH1_Logic.Core; using TH1_UI.Components; using TH1_UI.HintUI; using TH1Resource; using TMPro; using UI.HintUI; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI; //用于匹配科技树视觉位置的enum标记 public enum TechTreeCircleViewType { t1,t2,t3,t4,t5,t11,t12,t21,t22,t31,t32,t41,t42,t51,t52,t110,t120,t210,t220,t310,t320,t410,t420,t510,t520 } namespace TH1_UI.View.Info { public class UIInfoTechTreeView : Base.View { public Button closeButton; public ViDelegateAssisstant.Dele OnBtnCloseClick; [System.Serializable] public class TechTreeCirclePair { public TechTreeCircleViewType ViewType; public UIInfoTechTreeCircleMono CircleMono; } [Header("头像相关")] public TextMeshProUGUI TechPoint; public Image LeaderAvatar; public TextMeshProUGUI ForceName; public GameObject MountainPoint; public TextMeshProUGUI MountainCount; [Header("TreeCircle相关")] public List< TechTreeCirclePair > TechTreeCircleMonoList; private CivEnum _showCivEnum = CivEnum.Common; private ForceEnum _showForceEnum = ForceEnum.Common; [Header("TreeLine相关")] public List treeLineList; public Color TreeLineColorYellow; public Color TreeLineColorGray; public Color TreeLineColorWhite; [Header("子窗口CheckPanel相关")] public UIInfoTechTreeCheckPanelMono CheckPanel; protected override void InitStart() { base.InitStart(); closeButton.onClick.RemoveAllListeners(); closeButton.onClick.AddListener(() => { OnBtnCloseClick.Invoke(); }); CheckPanel.InitStart(RefreshStatus); } public bool InitAllTechCircle() { //Step #1 获得当前player和playerInfo var viewPlayer = Main.MapData.PlayerMap.SelfPlayerData; if (viewPlayer == null || !Table.Instance.PlayerDataAssets.GetPlayerInfo(viewPlayer, out var playerInfo)) { LogSystem.LogError("UIInfoTechTreeView.InitAllTechCircle(): viewPlayer or playerInfo is null"); return false; } //Step #2 foreach (var tech in playerInfo.TechPool) { if (!Table.Instance.TechDataAssets.GetTechInfo(tech, out var techInfo)) continue; foreach(var techCircleMonoPair in TechTreeCircleMonoList) if (techCircleMonoPair.ViewType == techInfo.TechTreeCircleViewType) { techCircleMonoPair.CircleMono.SetContent(techInfo,OnCircleClick); break; } } return true; } public void RefreshStatus() { //Step #1 获得当前player和playerInfo var viewPlayer = Main.MapData.PlayerMap.SelfPlayerData; if (viewPlayer == null || !Table.Instance.PlayerDataAssets.GetPlayerInfo(viewPlayer, out var playerInfo)) { LogSystem.LogError("UIInfoTechTreeView.InitAllTechCircle(): viewPlayer or playerInfo is null"); return; } //Step #2 处理科技点 / 造山点 TechPoint.text = viewPlayer.PlayerTechPoint + "+" + Main.PlayerLogic.GetPlayerTechPointPerTurn(Main.MapData,viewPlayer.Id) + ""; bool mountain = viewPlayer.TechTree.CheckIfHasTechAtom(TechAtom.CreateMountain); MountainPoint.SetActive(mountain); if (mountain) { var used = viewPlayer.PlayerMountainPointUsed; var all = Main.PlayerLogic.GetPlayerMountainPoint(Main.MapData,viewPlayer.Id); if (used >= all) MountainCount.text = ""+ used +"/" + all; else MountainCount.text = used + "/" + all; } //Step #3 处理每个circle foreach (var tech in playerInfo.TechPool) { if (!Table.Instance.TechDataAssets.GetTechInfo(tech, out var techInfo)) continue; foreach(var techCircleMonoPair in TechTreeCircleMonoList) if (techCircleMonoPair.ViewType == techInfo.TechTreeCircleViewType) { techCircleMonoPair.CircleMono.RefreshStatus(techInfo); break; } } //Step #3 处理每个TreeLine和TreeNode foreach (var line in treeLineList) { if (line.IsNode) line.GetComponent().color = TreeLineColorWhite; else line.GetComponent().color = TreeLineColorYellow; } foreach (var tech in playerInfo.TechPool) { if (viewPlayer.TechTree.CheckIfTechCanLearn(tech) || viewPlayer.TechTree.CheckIfHasTech(tech)) continue; if (!Table.Instance.TechDataAssets.GetTechInfo(tech, out var techInfo)) continue; foreach (var line in treeLineList) if (line.viewType == techInfo.TechTreeCircleViewType) line.GetComponent().color = TreeLineColorGray; } } public void SetContent() { var player = Main.MapData.PlayerMap.SelfPlayerData; //Step #0 处理头像 if (Table.Instance.PlayerDataAssets.GetPlayerInfo(player, out var playerInfo)) { LeaderAvatar.sprite = playerInfo.LeaderAvatar; MultilingualManager.Instance.SetUIText(ForceName,playerInfo.ForceName); } MountainPoint.SetActive(player.TechTree.CheckIfHasTechAtom(TechAtom.CreateMountain)); //Step #1 开局初始化 如果目前科技树上的circle已经是上一局的老版本,或者这是第一次打开科技树 if(_showCivEnum != player.CivEnum || _showForceEnum != player.ForceEnum) InitAllTechCircle(); RefreshStatus(); //Step #6 设置BGM //AudioManager.Instance.PlayMusic(info.MusicName,1f,2f,true); } public void OnCircleClick(TechType techType) { CheckPanel.Open(techType); } public void CloseView() { AudioManager.Instance.StopMusic(); } } }