using System.Collections.Generic; using System.Linq; using Core.Runtime; using Player.Runtime; using Quest.Runtime; using Quests.Runtime; using TMPro; using UnityEngine; namespace GameUI.Runtime { public class QuestsBoardPanel : BaseMonobehaviour { #region Unity API void OnEnable() { _player = GetFact(GameManager.Instance.Profile); QuestManager.OnAvailableQuestsUpdated += OnAvailableQuestsChanged; } void OnDisable() { QuestManager.OnAvailableQuestsUpdated -= OnAvailableQuestsChanged; } void Start() { InitializeLocalization(); List availableTemplates = QuestManager.Instance.GetAvailableQuests(_player.GuildLevel); List acceptedQuests = QuestManager.Instance.ActiveQuests; DisplayAvailableQuests(availableTemplates, acceptedQuests); } #endregion #region Public void OnAvailableQuestsChanged(List availableTemplates) { List acceptedQuests = QuestManager.Instance.ActiveQuests; ClearPanel(); DisplayAvailableQuests(availableTemplates, acceptedQuests); } #endregion #region Utils void InitializeLocalization() { foreach (var txt in GetComponentsInChildren()) { txt.text = LocalizationSystem.Instance.GetLocalizedText(txt.text); } } void ClearPanel() { foreach (Transform child in _panel.transform) { Destroy(child.gameObject); } } void DisplayAvailableQuests(List availableTemplates, List acceptedQuests) { // Build a set of started quest IDs (Accepted/Active + Completed) var startedIds = new HashSet(); foreach (var q in QuestManager.Instance.ActiveQuests ?? new List()) { if (q.ID != System.Guid.Empty) startedIds.Add(q.ID); } foreach (var q in QuestManager.Instance.CompletedQuests ?? new List()) { if (q.ID != System.Guid.Empty) startedIds.Add(q.ID); } foreach (var template in availableTemplates) { // Skip if this template already started (by GUID) if (System.Guid.TryParse(template.m_assetGuid, out var guid) && startedIds.Contains(guid)) { continue; } DisplayCard(template); } } void DisplayCard(QuestTemplate quest) { GameObject GO = Instantiate(_questCardPrefab, _panel.transform); QuestCardUI card = GO.GetComponent(); card.Setup(quest.ToQuestClass(QuestStateEnum.Disponible)); } #endregion #region Privates and Protected PlayerClass _player; [SerializeField] GameObject _panel; [SerializeField] GameObject _questCardPrefab; #endregion } }