GuildTycoon/Assets/_/Features/UI/Runtime/Quests/QuestsBoardPanel.cs

116 lines
No EOL
3.7 KiB
C#

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<PlayerClass>(GameManager.Instance.Profile);
QuestManager.OnAvailableQuestsUpdated += OnAvailableQuestsChanged;
}
void OnDisable()
{
QuestManager.OnAvailableQuestsUpdated -= OnAvailableQuestsChanged;
}
void Start()
{
InitializeLocalization();
List<QuestTemplate> availableTemplates = QuestManager.Instance.GetAvailableQuests(_player.GuildLevel);
List<QuestClass> acceptedQuests = QuestManager.Instance.ActiveQuests;
DisplayAvailableQuests(availableTemplates, acceptedQuests);
}
#endregion
#region Public
void OnAvailableQuestsChanged(List<QuestTemplate> availableTemplates)
{
List<QuestClass> acceptedQuests = QuestManager.Instance.ActiveQuests;
ClearPanel();
DisplayAvailableQuests(availableTemplates, acceptedQuests);
}
#endregion
#region Utils
void InitializeLocalization()
{
foreach (var txt in GetComponentsInChildren<TMP_Text>())
{
txt.text = LocalizationSystem.Instance.GetLocalizedText(txt.text);
}
}
void ClearPanel()
{
foreach (Transform child in _panel.transform)
{
Destroy(child.gameObject);
}
}
void DisplayAvailableQuests(List<QuestTemplate> availableTemplates, List<QuestClass> acceptedQuests)
{
// Build a set of started quest IDs (Accepted/Active + Completed)
var startedIds = new HashSet<System.Guid>();
foreach (var q in QuestManager.Instance.ActiveQuests ?? new List<QuestClass>())
{
if (q.ID != System.Guid.Empty) startedIds.Add(q.ID);
}
foreach (var q in QuestManager.Instance.CompletedQuests ?? new List<QuestClass>())
{
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<QuestCardUI>();
// 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
}
}