Files
2026-07-20 22:19:25 +08:00

378 lines
13 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using utils;
using Transform = UnityEngine.Transform;
public class teamSettingPanel : MonoBehaviour
{
/// <summary>
/// Documentation text normalized.
[SerializeField]
public GameObject teamSettingPanelObj;
/// <summary>
/// Documentation text normalized.
/// </summary>
[SerializeField]
public GameObject[] teamElementsObj;
/// <summary>
/// Documentation text normalized.
/// </summary>
[SerializeField] public TeamIndexSetterView[] teamSettingButtonStatusObj;
/// <summary>
/// Documentation text normalized.
/// </summary>
[SerializeField]
public TeamCharacterList teamCharacterList;
/// <summary>
/// Documentation text normalized.
[SerializeField]
public TeamCharacterLevelData teamCharacterLevelData;
/// <summary>
/// Documentation text normalized.
[SerializeField]
public GameObject teamCharacterPrefab;
[SerializeField]
public RectTransform teamCharacterViewContent;
private TeamManager teamManager;
public static teamSettingPanel Instance{get;private set;}
void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject);
}
}
void Start()
{
teamManager = TeamManager.Instance;
if(teamManager!=null)
{
teamManager.OnSelectedCharacterChanged += updateTeamCharacterSelectedStatus;
teamManager.OnSelectedTeamChanged += updateTeamSettingSelectedStatus;
teamManager.OnSelectedTeamChanged += updateTeamSettingElements;
teamManager.OnSelectedTeamChanged += updateSelectableCharacterViewList;
}
updateTeamSettingElements();
updateSelectableCharacterViewList();
// StartCoroutine(UpdateTeamSettingAfterOneFrame());
// StartCoroutine(UpdateSelectableCharacterAfterOneFrame());
}
void OnDestroy()
{
if (teamManager != null)
{
teamManager.OnSelectedCharacterChanged -= updateTeamCharacterSelectedStatus;
teamManager.OnSelectedTeamChanged -= updateTeamSettingSelectedStatus;
teamManager.OnSelectedTeamChanged -= updateTeamSettingElements;
teamManager.OnSelectedTeamChanged -= updateSelectableCharacterViewList;
}
}
/// <summary>
/// Documentation text normalized.
/// </summary>
/// <param name="index"></param>
public void updateSelectedTeam(int index)
{
teamManager.setCurrentSelectedTeam(index);
updateTeamSettingElements();
}
public TeamCharacterDataInfo getCharacterViewInfo(int characterID)
{
if (teamCharacterList == null)
{
Debug.LogError("teamCharacterList is missing.");
return null;
}
foreach (TeamCharacterDataInfo tcdi in teamCharacterList.characters)
{
if(tcdi.CharacterID==characterID)
{
return tcdi;
}
}
Debug.LogWarning($"Character data not found for characterID={characterID}.");
return null;
}
public Sprite getLevelSprite(string level)
{
if(level==null)
{
Debug.LogWarning("Level is null, cannot resolve level sprite.");
return null;
}
switch (level)
{
case "S":
return teamCharacterLevelData.LevelSSprite;
case "A":
return teamCharacterLevelData.LevelASprite;
case "B":
return teamCharacterLevelData.LevelBSprite;
case "C":
return teamCharacterLevelData.LevelCSprite;
default:
Debug.LogWarning($"No level sprite mapped for level '{level}'.");
return null;
}
}
/// <summary>
/// Documentation text normalized.
public void clearTeamSettingElements()
{
foreach (GameObject gameObject in teamElementsObj)
{
teamCharacterView t = gameObject.GetComponent<teamCharacterView>();
if (t != null)
{
t.characterID = -1;
t.charcterImg.sprite = null;
t.charcterImg.color=new Color(t.charcterImg.color.r,t.charcterImg.color.g,t.charcterImg.color.b,0f);
t.levelIcon.sprite = null;
t.levelIcon.color=new Color(t.levelIcon.color.r,t.levelIcon.color.g,t.levelIcon.color.b,0f);
t.skillName.text="";
t.isLeader.SetActive(false);
t.notLeader.SetActive(true);
}
}
}
public void updateTeamSettingElements()
{
// defensive guards
if (teamManager == null) teamManager = TeamManager.Instance;
if (teamManager == null)
{
Debug.LogWarning("teamSettingPanel.updateTeamSettingElements: TeamManager is null. Skipping update.");
clearTeamSettingElements();
return;
}
TeamSetting currentSelectedTeam = null;
try { currentSelectedTeam = teamManager.getCurrentSelectedTeam(); } catch { currentSelectedTeam = null; }
if (currentSelectedTeam == null)
{
clearTeamSettingElements();
return;
}
if (currentSelectedTeam.teamIdList == null)
{
clearTeamSettingElements();
return;
}
if (teamElementsObj == null)
{
Debug.LogWarning("teamSettingPanel.updateTeamSettingElements: teamElementsObj is null");
return;
}
List<CharacterView> currentTeam = currentSelectedTeam.teamIdList;
clearTeamSettingElements();
for (int i = 0; i < teamElementsObj.Length && i < currentTeam.Count; i++)
{
if (teamElementsObj[i] == null) continue;
if (currentTeam[i] == null) continue;
teamCharacterView t = teamElementsObj[i].GetComponent<teamCharacterView>();
if (t == null) continue;
t.characterID= currentTeam[i].characterId;
TeamCharacterDataInfo tcdi = getCharacterViewInfo(t.characterID);
if (tcdi != null)
{
if (t.charcterImg != null) { t.charcterImg.sprite = tcdi.CharacterTeamSprite; t.charcterImg.color=new Color(t.charcterImg.color.r,t.charcterImg.color.g,t.charcterImg.color.b,1f); }
string boundaryLevel = ResolveBoundaryLevel(t.characterID, currentTeam[i].currentBoundaryLevel);
currentTeam[i].currentBoundaryLevel = boundaryLevel;
if (t.levelIcon != null) { t.levelIcon.sprite = getLevelSprite(boundaryLevel); t.levelIcon.color=new Color(t.levelIcon.color.r,t.levelIcon.color.g,t.levelIcon.color.b,1f); }
if (t.skillName != null) t.skillName.text = tcdi.CharacterSkillName ?? string.Empty;
}
else
{
if (t.charcterImg != null) { t.charcterImg.sprite = null; t.charcterImg.color=new Color(t.charcterImg.color.r,t.charcterImg.color.g,t.charcterImg.color.b,0f); }
if (t.levelIcon != null) { t.levelIcon.sprite = null; t.levelIcon.color=new Color(t.levelIcon.color.r,t.levelIcon.color.g,t.levelIcon.color.b,0f); }
if (t.skillName != null) t.skillName.text="";
}
if(currentSelectedTeam.LeaderId==currentTeam[i].characterId)
{
if (t.isLeader != null) t.isLeader.SetActive(true);
if (t.notLeader != null) t.notLeader.SetActive(false);
}
else
{
if (t.isLeader != null) t.isLeader.SetActive(false);
if (t.notLeader != null) t.notLeader.SetActive(true);
}
}
}
/// <summary>
/// Documentation text normalized.
public void updateSelectableCharacterViewList()
{
foreach (Transform child in teamCharacterViewContent.transform)
{
Destroy(child.gameObject);
}
teamManager.currentSelectedCharacterCard = null;
List<CharacterView> currentTeam = teamManager.getCurrentSelectedTeam().teamIdList;
List<CharacterView> selectAbleCharacters = teamManager.SelectableCharacterList;
int visibleIndex = 0;
foreach (CharacterView c in selectAbleCharacters) //id and level
{
if (!IsCharacterUnlocked(c != null ? c.characterId : 0))
{
continue;
}
GameObject characterObj = Instantiate(teamCharacterPrefab, teamCharacterViewContent.transform);
UI_OrderedEntryAnimator.PlayFadeOnly(characterObj, visibleIndex, 0.16f, 0.012f, true);
visibleIndex++;
CharacterCardView ccv = characterObj.GetComponent<CharacterCardView>();
TeamCharacterDataInfo tcdi = getCharacterViewInfo(c.characterId);
if (ccv != null&& tcdi!=null)
{
ccv.characterID = tcdi.CharacterID;
ccv.currentBoundaryLevel= ResolveBoundaryLevel(c.characterId, c.currentBoundaryLevel);
ccv.characterImage.sprite =tcdi.CharacterCardSprite;
ccv.levelIcon.sprite = getLevelSprite(ccv.currentBoundaryLevel);
ccv.occupationIcon.sprite = tcdi.CharacterRoleSprite;
}
if (checkExistenceStatus(currentTeam, ccv.characterID))
{
ccv.isSelected = true;
ccv.characterImage.color = new Color(0.5f, 0.5f, 0.5f,1);
}
}
}
private bool IsCharacterUnlocked(int characterID)
{
if (characterID <= 0)
{
return false;
}
AllyHero_SO[] heroes = RuntimeResourcesCache.LoadAllAllyHeroes();
for (int i = 0; i < heroes.Length; i++)
{
AllyHero_SO hero = heroes[i];
if (hero != null && hero.ally_heroID == characterID)
{
return hero.isUnlocked;
}
}
return false;
}
private string ResolveBoundaryLevel(int characterID, string fallbackLevel)
{
if (characterID <= 0)
{
return fallbackLevel;
}
AllyHero_SO[] heroes = RuntimeResourcesCache.LoadAllAllyHeroes();
for (int i = 0; i < heroes.Length; i++)
{
AllyHero_SO hero = heroes[i];
if (hero != null && hero.ally_heroID == characterID)
{
return AllyHeroLevelRuntimeResolver.GetDisplayRatingKey(hero);
}
}
return fallbackLevel;
}
private bool checkExistenceStatus(List<CharacterView> currentTeam,int characterID)
{
foreach (CharacterView c in currentTeam)
{
if (c.characterId == characterID)
return true;
}
return false;
}
/// <summary>
/// Documentation text normalized.
public void updateTeamCharacterSelectedStatus()
{
int currentSelectedCharacter = teamManager.currentSelectedTeamCharacter;
for (int i = 0; i < teamElementsObj.Length; i++)
{
if (i != currentSelectedCharacter)
{
teamCharacterView teamCharacterView = teamElementsObj[i].GetComponent<teamCharacterView>();
if(teamCharacterView!=null)
{
teamCharacterView.SetUnSelected();
}
}
else
{
teamCharacterView teamCharacterView = teamElementsObj[i].GetComponent<teamCharacterView>();
teamCharacterView.SetSelected();
}
}
}
/// <summary>
/// Documentation text normalized.
public void rightChangeTeamSettingIndex()
{
int currentSelectedTeam = teamManager.currentSelectedTeam;
if (currentSelectedTeam < 4)
{
teamManager.setCurrentSelectedTeamSetting(currentSelectedTeam + 1);
}
}
/// <summary>
/// Documentation text normalized.
public void leftChangeTeamSettingIndex()
{
int currentSelectedTeam = teamManager.currentSelectedTeam;
if(currentSelectedTeam>0)
{
teamManager.setCurrentSelectedTeamSetting(currentSelectedTeam - 1);
}
}
public void updateTeamSettingSelectedStatus()
{
int currentSelectedTeam = teamManager.currentSelectedTeam;
for(int i= 0;i<teamSettingButtonStatusObj.Length;i++)
{
if(i!=currentSelectedTeam)
{
teamSettingButtonStatusObj[i].setUnSelectedTeamSetting();
}
else
{
teamSettingButtonStatusObj[i].setTeamSettingSelect();
}
}
}
public void updateCharacter()
{
}
}