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/accepted quest IDs to filter out from the board var startedIds = new HashSet(); // Active (in progress) foreach (var q in QuestManager.Instance.ActiveQuests ?? new List()) { if (q != null && q.ID != System.Guid.Empty) startedIds.Add(q.ID); } // Completed foreach (var q in QuestManager.Instance.CompletedQuests ?? new List()) { if (q != null && q.ID != System.Guid.Empty) startedIds.Add(q.ID); } // Accepted but not yet started (persisted list) try { if (FactExists>("accepted_quests", out var accepted) && accepted != null) { foreach (var q in accepted) { if (q != null && q.ID != System.Guid.Empty) startedIds.Add(q.ID); } } else { // Try to read anyway (some implementations auto-initialize facts) var fallbackAccepted = GetFact>("accepted_quests"); if (fallbackAccepted != null) { foreach (var q in fallbackAccepted) { if (q != null && q.ID != System.Guid.Empty) startedIds.Add(q.ID); } } } } catch { // If facts system isn't ready, just skip; board will refresh later } foreach (var template in availableTemplates) { // Skip if this template already started/accepted (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(); // Use the template's asset GUID as the quest ID so we can track acceptance/completion by template if (System.Guid.TryParse(quest.m_assetGuid, out var templateGuid)) { card.Setup(quest.ToQuestClass(QuestStateEnum.Disponible, templateGuid)); } else { // Fallback: generate a new quest with a random ID card.Setup(quest.ToQuestClass(QuestStateEnum.Disponible)); } } #endregion #region Privates and Protected PlayerClass _player; [SerializeField] GameObject _panel; [SerializeField] GameObject _questCardPrefab; #endregion } }