diff --git a/.DS_Store b/.DS_Store index 795867bd..ac0b85d7 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/Assets/Settings/PC_RPAsset.asset b/Assets/Settings/PC_RPAsset.asset index fb240e0a..a48b8857 100644 --- a/Assets/Settings/PC_RPAsset.asset +++ b/Assets/Settings/PC_RPAsset.asset @@ -53,6 +53,7 @@ MonoBehaviour: m_AdditionalLightsShadowResolutionTierHigh: 1024 m_ReflectionProbeBlending: 1 m_ReflectionProbeBoxProjection: 1 + m_ReflectionProbeAtlas: 1 m_ShadowDistance: 50 m_ShadowCascadeCount: 4 m_Cascade2Split: 0.25 @@ -129,6 +130,10 @@ MonoBehaviour: m_PrefilterScreenCoord: 1 m_PrefilterNativeRenderPass: 1 m_PrefilterUseLegacyLightmaps: 0 + m_PrefilterBicubicLightmapSampling: 1 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 0 m_ShaderVariantLogLevel: 0 m_ShadowCascades: 0 m_Textures: diff --git a/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset b/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset index 75e0bc64..4f4ad2a3 100644 --- a/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset +++ b/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset @@ -55,15 +55,29 @@ MonoBehaviour: - rid: 8712630790384254976 - rid: 3032807696540106752 - rid: 3032807696540106753 - - rid: 8483784638438047744 - - rid: 8483784638438047745 - - rid: 8483784638438047746 - - rid: 8483784638438047747 - - rid: 8483784638438047748 - - rid: 8483784638438047749 - - rid: 8483784638438047750 + - rid: 8483784701748969479 + - rid: 8483784701748969480 + - rid: 8483784701748969481 + - rid: 8483784701748969482 + - rid: 8483784701748969483 + - rid: 8483784701748969484 + - rid: 8483784701748969485 m_RuntimeSettings: - m_List: [] + m_List: + - rid: 6852985685364965378 + - rid: 6852985685364965379 + - rid: 6852985685364965380 + - rid: 6852985685364965381 + - rid: 6852985685364965384 + - rid: 6852985685364965385 + - rid: 6852985685364965392 + - rid: 6852985685364965394 + - rid: 8712630790384254976 + - rid: 3032807696540106752 + - rid: 8483784701748969480 + - rid: 8483784701748969481 + - rid: 8483784701748969484 + - rid: 8483784701748969485 m_AssetVersion: 8 m_ObsoleteDefaultVolumeProfile: {fileID: 0} m_RenderingLayerNames: @@ -263,7 +277,7 @@ MonoBehaviour: m_version: 0 m_EnableCompilationCaching: 1 m_EnableValidityChecks: 1 - - rid: 8483784638438047744 + - rid: 8483784701748969479 type: {class: PostProcessData/ShaderResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: stopNanPS: {fileID: 4800000, guid: 1121bb4e615ca3c48b214e79e841e823, type: 3} @@ -283,12 +297,12 @@ MonoBehaviour: uberPostPS: {fileID: 4800000, guid: e7857e9d0c934dc4f83f270f8447b006, type: 3} finalPostPassPS: {fileID: 4800000, guid: c49e63ed1bbcb334780a3bd19dfed403, type: 3} m_ShaderResourcesVersion: 0 - - rid: 8483784638438047745 + - rid: 8483784701748969480 type: {class: ScreenSpaceAmbientOcclusionPersistentResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} m_Version: 0 - - rid: 8483784638438047746 + - rid: 8483784701748969481 type: {class: ScreenSpaceAmbientOcclusionDynamicResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: m_BlueNoise256Textures: @@ -300,7 +314,7 @@ MonoBehaviour: - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} m_Version: 0 - - rid: 8483784638438047747 + - rid: 8483784701748969482 type: {class: PostProcessData/TextureResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: blueNoise16LTex: @@ -350,11 +364,11 @@ MonoBehaviour: smaaAreaTex: {fileID: 2800000, guid: d1f1048909d55cd4fa1126ab998f617e, type: 3} smaaSearchTex: {fileID: 2800000, guid: 51eee22c2a633ef4aada830eed57c3fd, type: 3} m_TexturesResourcesVersion: 0 - - rid: 8483784638438047748 + - rid: 8483784701748969483 type: {class: RenderingDebuggerRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_version: 0 - - rid: 8483784638438047749 + - rid: 8483784701748969484 type: {class: VrsRenderPipelineRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_TextureComputeShader: {fileID: 7200000, guid: cacb30de6c40c7444bbc78cb0a81fd2a, type: 3} @@ -381,7 +395,7 @@ MonoBehaviour: - {r: 0.5, g: 0, b: 0.5, a: 1} - {r: 0.5, g: 0.5, b: 0.5, a: 1} - {r: 0, g: 0, b: 1, a: 1} - - rid: 8483784638438047750 + - rid: 8483784701748969485 type: {class: LightmapSamplingSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_Version: 1 diff --git a/Assets/_/Features/Core/Runtime/GameManager.cs b/Assets/_/Features/Core/Runtime/GameManager.cs index 36277349..b53945a7 100644 --- a/Assets/_/Features/Core/Runtime/GameManager.cs +++ b/Assets/_/Features/Core/Runtime/GameManager.cs @@ -26,11 +26,11 @@ namespace Core.Runtime { get { - return _fact; + return m_gameFacts; } set { - _fact = value; + m_gameFacts = value; } } @@ -135,7 +135,7 @@ namespace Core.Runtime { GeneralSettings settings = new GeneralSettings { - Language = EnumLanguage.English, + Language = EnumLanguage.French, }; SetFact("GeneralSettings", settings, FactPersistence.Persistent); SaveFacts("GeneralSettings"); diff --git a/Assets/_/Features/Decor/Runtime/QuestSign.cs b/Assets/_/Features/Decor/Runtime/QuestSign.cs index 06e374e2..9eb1ec28 100644 --- a/Assets/_/Features/Decor/Runtime/QuestSign.cs +++ b/Assets/_/Features/Decor/Runtime/QuestSign.cs @@ -30,8 +30,6 @@ namespace Decor.Runtime void Start() { _player = GetFact(GameManager.Instance.Profile); - Info($"Player : {_player.GuildName}"); - QuestManager.Instance.NotifyAvailableQuestsUpdated(_player.GuildLevel); UpdateParchmentState(); } diff --git a/Assets/_/Features/Quests/Runtime/Events/QuestEvent.cs b/Assets/_/Features/Quests/Runtime/Events/QuestEvent.cs index 9db97278..cfde39f1 100644 --- a/Assets/_/Features/Quests/Runtime/Events/QuestEvent.cs +++ b/Assets/_/Features/Quests/Runtime/Events/QuestEvent.cs @@ -74,7 +74,11 @@ namespace Quests.Runtime case TargetingType.AllHeroes: return assignedAdventurers; case TargetingType.RandomHero: - return new List { assignedAdventurers[UnityEngine.Random.Range(0, assignedAdventurers.Count)] }; + if (assignedAdventurers == null || assignedAdventurers.Count == 0) + return new List(); + int count = assignedAdventurers.Count; + int idx = UnityEngine.Random.Range(0, count); + return new List { assignedAdventurers[idx] }; case TargetingType.LowestHp: return assignedAdventurers .OrderBy(adventurer => adventurer.Health) diff --git a/Assets/_/Features/Quests/Runtime/QuestClass.cs b/Assets/_/Features/Quests/Runtime/QuestClass.cs index 0357f053..603a277f 100644 --- a/Assets/_/Features/Quests/Runtime/QuestClass.cs +++ b/Assets/_/Features/Quests/Runtime/QuestClass.cs @@ -56,7 +56,7 @@ namespace Quests.Runtime public List Rewards { get { return _rewards; } - set { _rewards = new List(); } + set { _rewards = value ?? new List(); } } public QuestStateEnum State @@ -215,12 +215,35 @@ namespace Quests.Runtime public static AdventurerClass GetOneAdventurerFromId(Guid adventurerId) { - if (GameManager.Instance.Fact.GetFact>("my_adventurers") == null) + // Guard against GameManager or Fact system not ready + Debug.Log($"ID recherché : {adventurerId}"); + if (GameManager.Instance == null) { + Debug.Log("GameManager introuvable ou pas initialisé"); return null; } - List currentAdventurers = GameManager.Instance.Fact.GetFact>("my_adventurers"); - return currentAdventurers.Find(adventurer => adventurer.ID == adventurerId); + + if (GameManager.Instance.Fact == null) + { + Debug.Log("Fact introuvable ou null"); + return null; + } + + var list = GameManager.Instance.Fact.GetFact>("my_adventurers"); + if (list == null) + { + Debug.Log("Liste des aventuriers est null"); + return null; + } + else + { + Debug.Log($"Nombre d'Aventuriers : {list.Count}"); + } + + var adventurer = list.Find(adventurer => adventurer != null && adventurer.ID == adventurerId); + Debug.Log($"retourne : {adventurer}"); + + return list.Find(adventurer => adventurer != null && adventurer.ID == adventurerId); } public static List GetIdFromAdventurers(List adventurers) @@ -235,8 +258,13 @@ namespace Quests.Runtime public static Guid GetOneIdFromAdventurer(AdventurerClass adventurer) { - List currentAdventurers = GameManager.Instance.Fact.GetFact>("my_adventurers"); - return currentAdventurers.Find(adv => adv.ID == adventurer.ID).ID; + if (adventurer == null || GameManager.Instance == null || GameManager.Instance.Fact == null) + { + return Guid.Empty; + } + var currentAdventurers = GameManager.Instance.Fact.GetFact>("my_adventurers"); + var adv = currentAdventurers?.Find(a => a != null && a.ID == adventurer.ID); + return adv != null ? adv.ID : Guid.Empty; } #endregion diff --git a/Assets/_/Features/Quests/Runtime/QuestManager.cs b/Assets/_/Features/Quests/Runtime/QuestManager.cs index 08ec586f..18ca2ef0 100644 --- a/Assets/_/Features/Quests/Runtime/QuestManager.cs +++ b/Assets/_/Features/Quests/Runtime/QuestManager.cs @@ -45,11 +45,33 @@ namespace Quests.Runtime return; } Instance = this; + if (_activeEvents == null) _activeEvents = new List(); + } + + void OnEnable() + { + GameManager.OnTimeAdvanced += CheckMissionsProgress; + } + + void OnDisable() + { + GameManager.OnTimeAdvanced -= CheckMissionsProgress; } void Start() { - _disponibleQuests = _questDatabase.GetAll().SelectMany(f => f.questTemplates).Select(t => t.ToQuestClass(QuestStateEnum.Disponible)).ToList(); + if (_questDatabase != null) + { + _disponibleQuests = _questDatabase + .GetAll() + .SelectMany(f => f.questTemplates) + .Select(t => t.ToQuestClass(QuestStateEnum.Disponible)) + .ToList(); + } + else + { + _disponibleQuests = new List(); + } // Ensure quest lists are initialized to avoid null issues in consumers if (_activeQuests == null) _activeQuests = new List(); @@ -112,8 +134,7 @@ namespace Quests.Runtime public QuestManager() { - _activeEvents = new List(); - GameManager.OnTimeAdvanced += CheckMissionsProgress; + // Unity will call constructor before Awake; avoid subscribing here. } #endregion @@ -166,7 +187,16 @@ namespace Quests.Runtime { QuestClass quest = GetQuestById(questId); - List events = GetFact>>("events_quests_history")[questId]; + var dict = GetFact>>("events_quests_history"); + List events = null; + if (dict != null && dict.TryGetValue(questId, out var history)) + { + events = history; + } + else + { + events = new List(); + } return new QuestSummary(quest, events); } @@ -185,8 +215,8 @@ namespace Quests.Runtime /// public bool IsQuestCompleted(string questName) { - return ActiveQuests != null - && ActiveQuests.Any(q => q.Name == questName); + return CompletedQuests != null + && CompletedQuests.Any(q => q.Name == questName); } /// @@ -195,11 +225,20 @@ namespace Quests.Runtime public List ResolveQuestsList(List questsFromSave) { List quests = new List(); - foreach (var quest in questsFromSave) + foreach (var saved in questsFromSave) { - QuestTemplate template = _questDatabase.GetTemplatesByName(quest.Name); + QuestTemplate template = _questDatabase.GetTemplatesByName(saved.Name); if (template == null) continue; - quests.Add(template.ToQuestClass(quest.State, quest.ID)); + + var rebuilt = template.ToQuestClass(saved.State, saved.ID); + + // Restaurer les infos runtime utiles + rebuilt.StartSeconds = saved.StartSeconds; + rebuilt.EndSeconds = saved.EndSeconds; + if (saved.AssignedAdventurersID != null) + rebuilt.AssignedAdventurersID = new List(saved.AssignedAdventurersID); + + quests.Add(rebuilt); } return quests; } @@ -237,6 +276,18 @@ namespace Quests.Runtime quest.AssignedAdventurersID = new List(); quest.AssignedAdventurersID.Add(adventurer.ID); } + + // Synchroniser la sauvegarde de la quête avec les aventuriers assignés + var saveQuests = GetFact>("accepted_quests"); + if (saveQuests != null) + { + var saveQuest = saveQuests.FirstOrDefault(q => q.ID == quest.ID); + if (saveQuest != null) + { + saveQuest.AssignedAdventurersID = new List(quest.AssignedAdventurersID); + } + SaveFacts(); + } } /// @@ -277,11 +328,26 @@ namespace Quests.Runtime /// void ReleaseAdventurers(List team) { + bool anyChanged = false; foreach (var adventurerId in team) { AdventurerClass adventurer = QuestClass.GetOneAdventurerFromId(adventurerId); - if (adventurer != null) + if (adventurer == null) + { + Info($"Aventurer {adventurerId} introuvable"); + continue; + } + Info($"{adventurer.Name} est dans la team avec le status dispo : {adventurer.IsAvailable}"); + if (adventurer != null && adventurer.IsAvailable == false) + { adventurer.IsAvailable = true; + anyChanged = true; + } + } + if (anyChanged) + { + Info("Comme les données on changées, on les sauvegarde."); + SaveFacts(); } } @@ -318,7 +384,8 @@ namespace Quests.Runtime void CheckMissionsProgress(int currentSeconds) { if(_activeQuests == null) return; - + + var questsToComplete = new List(); var activeQuests = _activeQuests.Where(q => q.State == QuestStateEnum.InProgress).ToList(); @@ -344,14 +411,23 @@ namespace Quests.Runtime /// void CheckQuestEvents(QuestClass quest, int currentSeconds) { + if (quest?.ActiveEvents == null || quest.TriggeredEventsDescriptionKeys == null) + return; + foreach (var questEvent in quest.ActiveEvents) { + if (questEvent == null) continue; if (quest.TriggeredEventsDescriptionKeys.Contains(questEvent.DescriptionKey)) continue; + // Skip malformed time windows + if (questEvent.MinTimeTrigger > questEvent.MaxTimeTrigger) + continue; + if (_snapTime >= questEvent.MinTimeTrigger && _snapTime <= questEvent.MaxTimeTrigger) { - if (Random.Range(0f, 100f) <= questEvent.PercentTrigger) + float percent = Mathf.Clamp(questEvent.PercentTrigger, 0f, 100f); + if (Random.Range(0f, 100f) <= percent) { TriggerEvent(questEvent, quest); quest.TriggeredEventsDescriptionKeys.Add(questEvent.DescriptionKey); @@ -371,16 +447,22 @@ namespace Quests.Runtime var targets = questEvent.GetTargets(quest.AssignedAdventurersID); ApplyEffect(questEvent.Effects, targets); - Dictionary> events = GetFact>>("events_quests_history"); - - if(!events.ContainsKey(quest.ID)) + var eventsDict = GetFact>>("events_quests_history"); + if (eventsDict == null) { - events.Add(quest.ID, new List()); + eventsDict = new Dictionary>(); + SetFact("events_quests_history", eventsDict, FactPersistence.Persistent); + } + + if(!eventsDict.ContainsKey(quest.ID)) + { + eventsDict.Add(quest.ID, new List()); } QuestEventLog questEventLog = new QuestEventLog(_snapTime, questEvent.Id); - events[quest.ID].Add(questEventLog); + eventsDict[quest.ID].Add(questEventLog); + if (_activeEvents == null) _activeEvents = new List(); _activeEvents.Add(questEvent); SaveFacts(); } diff --git a/Assets/_/Features/Tests/Editor.meta b/Assets/_/Features/Tests/Editor.meta new file mode 100644 index 00000000..9bd96380 --- /dev/null +++ b/Assets/_/Features/Tests/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: efcd90c5fc4a4d29a9edb30408d27e72 +timeCreated: 1760191011 \ No newline at end of file diff --git a/Assets/_/Features/Tests/Editor/QuestManagerTests.cs b/Assets/_/Features/Tests/Editor/QuestManagerTests.cs new file mode 100644 index 00000000..7ec77042 --- /dev/null +++ b/Assets/_/Features/Tests/Editor/QuestManagerTests.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; +using UnityEngine; +using Quests.Runtime; +using Core.Runtime; + +namespace GuildTycoon.Tests.Editor +{ + public class QuestManagerTests + { + private GameObject _gmGO; + private GameObject _qmGO; + private GameManager _gameManager; + private QuestManager _questManager; + + [SetUp] + public void SetUp() + { + // Create and initialize GameManager (Awake will set up facts dictionary) + _gmGO = new GameObject("GameManager_Test"); + _gameManager = _gmGO.AddComponent(); + + // Ensure profile and base facts are set + _gameManager.Profile = "UnitTestProfile"; + _gameManager.Fact = new FactDictionnary(); + GameManager.m_gameFacts = _gameManager.Fact; // ensure BaseMonobehaviour access works + + // Pre-seed facts used by QuestManager + _gameManager.Fact.SetFact("accepted_quests", new List(), BaseMonobehaviour.FactPersistence.Normal); + _gameManager.Fact.SetFact("events_quests_history", new Dictionary>(), BaseMonobehaviour.FactPersistence.Normal); + + // Create QuestManager + _qmGO = new GameObject("QuestManager_Test"); + _questManager = _qmGO.AddComponent(); + + // Initialize lists to avoid nulls and isolate from Start() DB usage + _questManager.ActiveQuests = new List(); + _questManager.CompletedQuests = new List(); + _questManager.DisponibleQuests = new List(); + } + + [TearDown] + public void TearDown() + { + if (_qmGO != null) UnityEngine.Object.DestroyImmediate(_qmGO); + if (_gmGO != null) UnityEngine.Object.DestroyImmediate(_gmGO); + } + + [Test] + public void CompletingQuest_MovesItFromActiveToCompleted_AndUpdatesFacts() + { + // Arrange: create a simple quest in progress + var questId = Guid.NewGuid(); + var quest = new QuestClass(questId, "Test Quest", "Desc", "Obj", duration: 1, difficulty: QuestDifficultyEnum.Easy, reward: new List(), minLevel: 1) + { + State = QuestStateEnum.InProgress, + StartSeconds = 0, + EndSeconds = 10, + AssignedAdventurersID = new List() + }; + + _questManager.ActiveQuests.Add(quest); + + // Seed facts with the same quest so QuestManager can update saved state + var accepted = new List { new QuestClass(questId, quest.Name, quest.Description, quest.Objective, quest.Duration, quest.Difficulty, quest.Rewards, quest.MinLevel) { State = QuestStateEnum.InProgress } }; + _gameManager.Fact.SetFact("accepted_quests", accepted, BaseMonobehaviour.FactPersistence.Normal); + + QuestClass completedRaised = null; + Action handler = q => completedRaised = q; + QuestManager.OnQuestCompleted += handler; + + try + { + // Act: Directly complete the quest + _questManager.CompleteQuest(quest, quest.AssignedAdventurersID); + } + finally + { + QuestManager.OnQuestCompleted -= handler; // ensure unsubscribe even if assertion fails + } + + // Assert: quest state and lists updated + Assert.AreEqual(QuestStateEnum.Completed, quest.State, "La quête devrait être marquée comme complétée."); + CollectionAssert.DoesNotContain(_questManager.ActiveQuests, quest, "La quête ne doit plus être dans la liste des quêtes actives."); + CollectionAssert.Contains(_questManager.CompletedQuests, quest, "La quête devrait apparaître dans la liste des quêtes complétées."); + + // Facts: accepted_quests should reflect Completed state for the same ID + var saved = _gameManager.Fact.GetFact>("accepted_quests"); + var savedQuest = saved.Find(q => q.ID == questId); + Assert.IsNotNull(savedQuest, "La quête devrait être présente dans les faits 'accepted_quests'."); + Assert.AreEqual(QuestStateEnum.Completed, savedQuest.State, "L'état sauvegardé de la quête devrait être 'Completed'."); + + // Event notification raised + Assert.IsNotNull(completedRaised, "Un événement OnQuestCompleted devrait être déclenché."); + Assert.AreEqual(questId, completedRaised.ID, "L'événement devrait concerner la même quête."); + } + } +} diff --git a/Assets/_/Features/Tests/Editor/QuestManagerTests.cs.meta b/Assets/_/Features/Tests/Editor/QuestManagerTests.cs.meta new file mode 100644 index 00000000..c4ddb225 --- /dev/null +++ b/Assets/_/Features/Tests/Editor/QuestManagerTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 64e828a55046493c82c79b4ed49e10ba +timeCreated: 1760191011 \ No newline at end of file diff --git a/Assets/_/Features/UI/Runtime/Quests/InfoQuestPanel.cs b/Assets/_/Features/UI/Runtime/Quests/InfoQuestPanel.cs index b6958e6f..6ba47428 100644 --- a/Assets/_/Features/UI/Runtime/Quests/InfoQuestPanel.cs +++ b/Assets/_/Features/UI/Runtime/Quests/InfoQuestPanel.cs @@ -112,7 +112,6 @@ namespace GameUI.Runtime _panelRecap.SetActive(false); break; case QuestStateEnum.InProgress: - Info("La quête est active."); _buttonActivation.SetActive(false); _adventurersOnThisQuestPanel.SetActive(true); _adventurersSelection.SetActive(false); diff --git a/Assets/_/Features/UI/Runtime/Quests/QuestCardUI.cs b/Assets/_/Features/UI/Runtime/Quests/QuestCardUI.cs index 466c6550..377a4c34 100644 --- a/Assets/_/Features/UI/Runtime/Quests/QuestCardUI.cs +++ b/Assets/_/Features/UI/Runtime/Quests/QuestCardUI.cs @@ -60,19 +60,17 @@ namespace GameUI.Runtime // Ensure state order: Disponible -> Accepted _quest.State = QuestStateEnum.Accepted; - // Persist in saved quests list - List savedQuests = GetFact>("accepted_quests"); - savedQuests.Add(_quest); - - // Also add to runtime active quests list so other systems can find it - if (FactExists>("accepted_quests", out _)) + // Persist in saved quests list, ensure it exists + var savedQuests = GetFact>("accepted_quests"); + if (savedQuests == null) { - var acceptedQuests = GetFact>("accepted_quests"); - // Avoid duplicates by GUID - if (!acceptedQuests.Any(q => q.ID == _quest.ID)) - { - acceptedQuests.Add(_quest); - } + savedQuests = new List(); + SetFact("accepted_quests", savedQuests, FactPersistence.Persistent); + } + // Avoid duplicates by GUID + if (!savedQuests.Any(q => q.ID == _quest.ID)) + { + savedQuests.Add(_quest); } SaveFacts(); @@ -83,7 +81,6 @@ 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/QuestsPanel.cs b/Assets/_/Features/UI/Runtime/Quests/QuestsPanel.cs index 0511d61f..bdb7d3af 100644 --- a/Assets/_/Features/UI/Runtime/Quests/QuestsPanel.cs +++ b/Assets/_/Features/UI/Runtime/Quests/QuestsPanel.cs @@ -92,7 +92,6 @@ namespace GameUI.Runtime #endregion - #region privates and protected [SerializeField] GameObject _panel; diff --git a/Assets/_/Levels/Game.unity b/Assets/_/Levels/Game.unity index 3d34044b..48533355 100644 --- a/Assets/_/Levels/Game.unity +++ b/Assets/_/Levels/Game.unity @@ -135,7 +135,7 @@ GameObject: - component: {fileID: 21829260} - component: {fileID: 21829261} m_Layer: 0 - m_Name: QuestInit + m_Name: QuestManager m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -165,11 +165,11 @@ MonoBehaviour: m_GameObject: {fileID: 21829259} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e8c934d099ac44d6ba1e06e7233c2be1, type: 3} + m_Script: {fileID: 11500000, guid: ae1758b45e06411c99b6177d9b402a19, type: 3} m_Name: - m_EditorClassIdentifier: - m_isVerbose: 0 - _questFactoryDatabase: {fileID: 11400000, guid: e8f120ee188e64915aef36c8454c8f68, type: 2} + m_EditorClassIdentifier: Quests.Runtime::Quests.Runtime.QuestManager + m_isVerbose: 1 + _questDatabase: {fileID: 11400000, guid: e8f120ee188e64915aef36c8454c8f68, type: 2} --- !u!1001 &27914899 PrefabInstance: m_ObjectHideFlags: 0 @@ -2291,7 +2291,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 619425342} - m_Enabled: 0 + m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 8309fb5f87214c46a2994daf35aa90a5, type: 3} m_Name: @@ -2304,7 +2304,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 619425342} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: feb5575f76804030a0ae6877ba236d61, type: 3} m_Name: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 2117307c..75af3d37 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -86,6 +86,7 @@ PlayerSettings: muteOtherAudioSources: 0 Prepare IOS For Recording: 0 Force IOS Speakers When Recording: 0 + audioSpatialExperience: 0 deferSystemGesturesMode: 0 hideHomeButton: 0 submitAnalytics: 1 @@ -132,6 +133,7 @@ PlayerSettings: switchNVNMaxPublicSamplerIDCount: 0 switchMaxWorkerMultiple: 8 switchNVNGraphicsFirmwareMemory: 32 + switchGraphicsJobsSyncAfterKick: 1 vulkanNumSwapchainBuffers: 3 vulkanEnableSetSRGBWrite: 0 vulkanEnablePreTransform: 1 @@ -274,6 +276,9 @@ PlayerSettings: AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 + androidAppCategory: 3 + useAndroidAppCategory: 1 + androidAppCategoryOther: AndroidEnableTango: 0 androidEnableBanner: 1 androidUseLowAccuracyLocation: 0 @@ -517,7 +522,10 @@ PlayerSettings: m_Height: 720 m_Kind: 1 m_SubKind: - m_BuildTargetBatching: [] + m_BuildTargetBatching: + - m_BuildTarget: Standalone + m_StaticBatching: 1 + m_DynamicBatching: 0 m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: [] m_BuildTargetGraphicsJobMode: [] @@ -543,6 +551,7 @@ PlayerSettings: - serializedVersion: 2 m_BuildTarget: Android m_EncodingQuality: 1 + m_BuildTargetGroupHDRCubemapEncodingQuality: [] m_BuildTargetGroupLightmapSettings: [] m_BuildTargetGroupLoadStoreDebugModeSettings: [] m_BuildTargetNormalMapEncoding: @@ -811,12 +820,12 @@ PlayerSettings: webGLMemoryLinearGrowthStep: 16 webGLMemoryGeometricGrowthStep: 0.2 webGLMemoryGeometricGrowthCap: 96 - webGLEnableWebGPU: 0 webGLPowerPreference: 2 webGLWebAssemblyTable: 0 webGLWebAssemblyBigInt: 0 webGLCloseOnQuit: 0 webWasm2023: 0 + webEnableSubmoduleStrippingCompatibility: 0 scriptingDefineSymbols: Android: DOTWEEN EmbeddedLinux: DOTWEEN @@ -946,3 +955,5 @@ PlayerSettings: insecureHttpOption: 0 androidVulkanDenyFilterList: [] androidVulkanAllowFilterList: [] + androidVulkanDeviceFilterListAsset: {fileID: 0} + d3d12DeviceFilterListAsset: {fileID: 0}