From 838f91ede774271a29322de7bcbb347ee65e2bf4 Mon Sep 17 00:00:00 2001 From: mrtoine Date: Sat, 11 Oct 2025 15:25:12 +0200 Subject: [PATCH] =?UTF-8?q?Le=20qu=C3=AAtes=20sont=20d=C3=A9sormais=20bien?= =?UTF-8?q?=20retir=C3=A9s=20quand=20choisis.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MedievalSharp-Regular SDF.asset.meta | 8 --- Assets/_/Features/Core/Runtime/GameManager.cs | 5 ++ Assets/_/Features/Decor/Runtime/QuestSign.cs | 10 ++-- .../_/Features/Quests/Runtime/QuestClass.cs | 18 ++++++- .../_/Features/Quests/Runtime/QuestManager.cs | 52 ++++++++++++++++--- .../Features/UI/Runtime/Quests/QuestCardUI.cs | 1 + .../UI/Runtime/Quests/QuestsBoardPanel.cs | 37 +++++++++++-- 7 files changed, 107 insertions(+), 24 deletions(-) delete mode 100644 Assets/_/Content/Fonts/MedievalSharp-Regular SDF.asset.meta diff --git a/Assets/_/Content/Fonts/MedievalSharp-Regular SDF.asset.meta b/Assets/_/Content/Fonts/MedievalSharp-Regular SDF.asset.meta deleted file mode 100644 index 957635c6..00000000 --- a/Assets/_/Content/Fonts/MedievalSharp-Regular SDF.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 44cc5e4b4ce644394a7b14151c11fee3 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_/Features/Core/Runtime/GameManager.cs b/Assets/_/Features/Core/Runtime/GameManager.cs index 441daea3..36277349 100644 --- a/Assets/_/Features/Core/Runtime/GameManager.cs +++ b/Assets/_/Features/Core/Runtime/GameManager.cs @@ -150,6 +150,11 @@ namespace Core.Runtime Debug.Log("Chemin des sauvegardes : " + Application.persistentDataPath); } + void OnDestroy() + { + Destroy(Instance); + } + #endregion diff --git a/Assets/_/Features/Decor/Runtime/QuestSign.cs b/Assets/_/Features/Decor/Runtime/QuestSign.cs index 4b5bf8b5..06e374e2 100644 --- a/Assets/_/Features/Decor/Runtime/QuestSign.cs +++ b/Assets/_/Features/Decor/Runtime/QuestSign.cs @@ -24,12 +24,14 @@ namespace Decor.Runtime void Awake() { - _player = GetFact(GameManager.Instance.Profile); + // } void Start() { - // Trigger an initial refresh + _player = GetFact(GameManager.Instance.Profile); + Info($"Player : {_player.GuildName}"); + QuestManager.Instance.NotifyAvailableQuestsUpdated(_player.GuildLevel); UpdateParchmentState(); } @@ -72,8 +74,8 @@ namespace Decor.Runtime var allPossibleQuests = QuestManager.Instance.GetAvailableQuests(_player.GuildLevel); // 2. Quêtes déjà démarrées (actives OU complétées) - var startedQuests = QuestManager.Instance.ActiveQuests - .Concat(QuestManager.Instance.CompletedQuests) + var startedQuests = (QuestManager.Instance.ActiveQuests ?? new List()) + .Concat(QuestManager.Instance.CompletedQuests ?? Enumerable.Empty()) .ToList(); // 3. Quêtes vraiment disponibles = possibles - déjà démarrées diff --git a/Assets/_/Features/Quests/Runtime/QuestClass.cs b/Assets/_/Features/Quests/Runtime/QuestClass.cs index 14e490d3..0357f053 100644 --- a/Assets/_/Features/Quests/Runtime/QuestClass.cs +++ b/Assets/_/Features/Quests/Runtime/QuestClass.cs @@ -168,17 +168,31 @@ namespace Quests.Runtime public void InitializeEvents(QuestEventPackSO pack) { ActiveEvents.Clear(); - + + if (pack == null || pack.availableEvents == null || pack.availableEvents.Count == 0) + { + return; + } + var pool = new List(pack.availableEvents); int toPick = Mathf.Min(pack.maxEventsToPick, pool.Count); + int currentTime = 0; + if (QuestManager.Instance != null) + { + currentTime = QuestManager.Instance.currentTimeInQuest; + } + for (int i = 0; i < toPick; i++) { int index = UnityEngine.Random.Range(0, pool.Count); var pickedSO = pool[index]; pool.RemoveAt(index); - ActiveEvents.Add(pickedSO.ToQuestEventClass(QuestManager.Instance.currentTimeInQuest)); + if (pickedSO != null) + { + ActiveEvents.Add(pickedSO.ToQuestEventClass(currentTime)); + } } } diff --git a/Assets/_/Features/Quests/Runtime/QuestManager.cs b/Assets/_/Features/Quests/Runtime/QuestManager.cs index c70931e2..08ec586f 100644 --- a/Assets/_/Features/Quests/Runtime/QuestManager.cs +++ b/Assets/_/Features/Quests/Runtime/QuestManager.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using Adventurer.Runtime; @@ -12,9 +13,16 @@ namespace Quests.Runtime public class QuestManager : BaseMonobehaviour { #region Singleton + + public static QuestManager Instance { get; set; } - static QuestManager _instance; - public static QuestManager Instance => _instance ??= new QuestManager(); + void OnDestroy() + { + if (Instance == this) + { + Instance = null; + } + } #endregion @@ -25,25 +33,57 @@ namespace Quests.Runtime public static event Action OnEventFromQuest; public static event Action> OnAvailableQuestsUpdated; + #endregion + + #region Unity API + + void Awake() + { + if (Instance != null && Instance != this) + { + Destroy(gameObject); + return; + } + Instance = this; + } + + void Start() + { + _disponibleQuests = _questDatabase.GetAll().SelectMany(f => f.questTemplates).Select(t => t.ToQuestClass(QuestStateEnum.Disponible)).ToList(); + + // Ensure quest lists are initialized to avoid null issues in consumers + if (_activeQuests == null) _activeQuests = new List(); + if (_completedQuests == null) _completedQuests = new List(); + if (_disponibleQuests == null) _disponibleQuests = new List(); + } + #endregion #region Properties - QuestClass _currentQuest; + List _activeQuests; + List _disponibleQuests; + List _completedQuests; + QuestClass _currentQuest; + public QuestClass CurrentQuest { get => _currentQuest; set => _currentQuest = value; } + + public List DisponibleQuests + { + get => _disponibleQuests; + set => _disponibleQuests = value; + } - List _activeQuests; public List ActiveQuests { get => _activeQuests; set => _activeQuests = value; } - List _completedQuests; public List CompletedQuests { get => _completedQuests; @@ -183,7 +223,7 @@ namespace Quests.Runtime #endregion - #region Methods + #region Utils /// /// Assigne des aventuriers à une quête diff --git a/Assets/_/Features/UI/Runtime/Quests/QuestCardUI.cs b/Assets/_/Features/UI/Runtime/Quests/QuestCardUI.cs index 20458b80..466c6550 100644 --- a/Assets/_/Features/UI/Runtime/Quests/QuestCardUI.cs +++ b/Assets/_/Features/UI/Runtime/Quests/QuestCardUI.cs @@ -83,6 +83,7 @@ namespace GameUI.Runtime QuestManager.Instance.NotifyAvailableQuestsUpdated(player.GuildLevel); // Remove the accepted card from the board + Info($"Quest accepted?: {_quest.Name} : {_quest.State}"); Destroy(gameObject); } diff --git a/Assets/_/Features/UI/Runtime/Quests/QuestsBoardPanel.cs b/Assets/_/Features/UI/Runtime/Quests/QuestsBoardPanel.cs index 286ac4e6..0d176982 100644 --- a/Assets/_/Features/UI/Runtime/Quests/QuestsBoardPanel.cs +++ b/Assets/_/Features/UI/Runtime/Quests/QuestsBoardPanel.cs @@ -65,20 +65,49 @@ namespace GameUI.Runtime void DisplayAvailableQuests(List availableTemplates, List acceptedQuests) { - // Build a set of started quest IDs (Accepted/Active + Completed) + // 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.ID != System.Guid.Empty) startedIds.Add(q.ID); + if (q != null && q.ID != System.Guid.Empty) startedIds.Add(q.ID); } + // Completed foreach (var q in QuestManager.Instance.CompletedQuests ?? new List()) { - if (q.ID != System.Guid.Empty) startedIds.Add(q.ID); + 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 (by GUID) + // Skip if this template already started/accepted (by GUID) if (System.Guid.TryParse(template.m_assetGuid, out var guid) && startedIds.Contains(guid)) { continue;