Les events se déroule bien comme il faut. Les aventuriers sont bien repasser en IsAvailable = true quand une quête se termine.
This commit is contained in:
parent
838f91ede7
commit
3ba8dad4a2
16 changed files with 310 additions and 68 deletions
|
|
@ -74,7 +74,11 @@ namespace Quests.Runtime
|
|||
case TargetingType.AllHeroes:
|
||||
return assignedAdventurers;
|
||||
case TargetingType.RandomHero:
|
||||
return new List<AdventurerClass> { assignedAdventurers[UnityEngine.Random.Range(0, assignedAdventurers.Count)] };
|
||||
if (assignedAdventurers == null || assignedAdventurers.Count == 0)
|
||||
return new List<AdventurerClass>();
|
||||
int count = assignedAdventurers.Count;
|
||||
int idx = UnityEngine.Random.Range(0, count);
|
||||
return new List<AdventurerClass> { assignedAdventurers[idx] };
|
||||
case TargetingType.LowestHp:
|
||||
return assignedAdventurers
|
||||
.OrderBy(adventurer => adventurer.Health)
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ namespace Quests.Runtime
|
|||
public List<ItemReward> Rewards
|
||||
{
|
||||
get { return _rewards; }
|
||||
set { _rewards = new List<ItemReward>(); }
|
||||
set { _rewards = value ?? new List<ItemReward>(); }
|
||||
}
|
||||
|
||||
public QuestStateEnum State
|
||||
|
|
@ -215,12 +215,35 @@ namespace Quests.Runtime
|
|||
|
||||
public static AdventurerClass GetOneAdventurerFromId(Guid adventurerId)
|
||||
{
|
||||
if (GameManager.Instance.Fact.GetFact<List<AdventurerClass>>("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<AdventurerClass> currentAdventurers = GameManager.Instance.Fact.GetFact<List<AdventurerClass>>("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<List<AdventurerClass>>("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<Guid> GetIdFromAdventurers(List<AdventurerClass> adventurers)
|
||||
|
|
@ -235,8 +258,13 @@ namespace Quests.Runtime
|
|||
|
||||
public static Guid GetOneIdFromAdventurer(AdventurerClass adventurer)
|
||||
{
|
||||
List<AdventurerClass> currentAdventurers = GameManager.Instance.Fact.GetFact<List<AdventurerClass>>("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<List<AdventurerClass>>("my_adventurers");
|
||||
var adv = currentAdventurers?.Find(a => a != null && a.ID == adventurer.ID);
|
||||
return adv != null ? adv.ID : Guid.Empty;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
|||
|
|
@ -45,11 +45,33 @@ namespace Quests.Runtime
|
|||
return;
|
||||
}
|
||||
Instance = this;
|
||||
if (_activeEvents == null) _activeEvents = new List<QuestEvent>();
|
||||
}
|
||||
|
||||
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<QuestClass>();
|
||||
}
|
||||
|
||||
// Ensure quest lists are initialized to avoid null issues in consumers
|
||||
if (_activeQuests == null) _activeQuests = new List<QuestClass>();
|
||||
|
|
@ -112,8 +134,7 @@ namespace Quests.Runtime
|
|||
|
||||
public QuestManager()
|
||||
{
|
||||
_activeEvents = new List<QuestEvent>();
|
||||
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<QuestEventLog> events = GetFact<Dictionary<Guid, List<QuestEventLog>>>("events_quests_history")[questId];
|
||||
var dict = GetFact<Dictionary<Guid, List<QuestEventLog>>>("events_quests_history");
|
||||
List<QuestEventLog> events = null;
|
||||
if (dict != null && dict.TryGetValue(questId, out var history))
|
||||
{
|
||||
events = history;
|
||||
}
|
||||
else
|
||||
{
|
||||
events = new List<QuestEventLog>();
|
||||
}
|
||||
|
||||
return new QuestSummary(quest, events);
|
||||
}
|
||||
|
|
@ -185,8 +215,8 @@ namespace Quests.Runtime
|
|||
/// </summary>
|
||||
public bool IsQuestCompleted(string questName)
|
||||
{
|
||||
return ActiveQuests != null
|
||||
&& ActiveQuests.Any(q => q.Name == questName);
|
||||
return CompletedQuests != null
|
||||
&& CompletedQuests.Any(q => q.Name == questName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -195,11 +225,20 @@ namespace Quests.Runtime
|
|||
public List<QuestClass> ResolveQuestsList(List<QuestClass> questsFromSave)
|
||||
{
|
||||
List<QuestClass> quests = new List<QuestClass>();
|
||||
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<Guid>(saved.AssignedAdventurersID);
|
||||
|
||||
quests.Add(rebuilt);
|
||||
}
|
||||
return quests;
|
||||
}
|
||||
|
|
@ -237,6 +276,18 @@ namespace Quests.Runtime
|
|||
quest.AssignedAdventurersID = new List<Guid>();
|
||||
quest.AssignedAdventurersID.Add(adventurer.ID);
|
||||
}
|
||||
|
||||
// Synchroniser la sauvegarde de la quête avec les aventuriers assignés
|
||||
var saveQuests = GetFact<List<QuestClass>>("accepted_quests");
|
||||
if (saveQuests != null)
|
||||
{
|
||||
var saveQuest = saveQuests.FirstOrDefault(q => q.ID == quest.ID);
|
||||
if (saveQuest != null)
|
||||
{
|
||||
saveQuest.AssignedAdventurersID = new List<Guid>(quest.AssignedAdventurersID);
|
||||
}
|
||||
SaveFacts();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -277,11 +328,26 @@ namespace Quests.Runtime
|
|||
/// </summary>
|
||||
void ReleaseAdventurers(List<Guid> team)
|
||||
{
|
||||
bool anyChanged = false;
|
||||
foreach (var adventurerId in team)
|
||||
{
|
||||
AdventurerClass adventurer = QuestClass.GetOneAdventurerFromId(adventurerId);
|
||||
if (adventurer != null)
|
||||
if (adventurer == null)
|
||||
{
|
||||
Info($"<color=orange>Aventurer {adventurerId} introuvable</color>");
|
||||
continue;
|
||||
}
|
||||
Info($"<color=orange>{adventurer.Name} est dans la team avec le status dispo : {adventurer.IsAvailable}</color>");
|
||||
if (adventurer != null && adventurer.IsAvailable == false)
|
||||
{
|
||||
adventurer.IsAvailable = true;
|
||||
anyChanged = true;
|
||||
}
|
||||
}
|
||||
if (anyChanged)
|
||||
{
|
||||
Info("<color=cyan>Comme les données on changées, on les sauvegarde.</color>");
|
||||
SaveFacts();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -318,7 +384,8 @@ namespace Quests.Runtime
|
|||
void CheckMissionsProgress(int currentSeconds)
|
||||
{
|
||||
if(_activeQuests == null) return;
|
||||
|
||||
|
||||
|
||||
var questsToComplete = new List<QuestClass>();
|
||||
var activeQuests = _activeQuests.Where(q => q.State == QuestStateEnum.InProgress).ToList();
|
||||
|
||||
|
|
@ -344,14 +411,23 @@ namespace Quests.Runtime
|
|||
/// </summary>
|
||||
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<Guid, List<QuestEventLog>> events = GetFact<Dictionary<Guid, List<QuestEventLog>>>("events_quests_history");
|
||||
|
||||
if(!events.ContainsKey(quest.ID))
|
||||
var eventsDict = GetFact<Dictionary<Guid, List<QuestEventLog>>>("events_quests_history");
|
||||
if (eventsDict == null)
|
||||
{
|
||||
events.Add(quest.ID, new List<QuestEventLog>());
|
||||
eventsDict = new Dictionary<Guid, List<QuestEventLog>>();
|
||||
SetFact("events_quests_history", eventsDict, FactPersistence.Persistent);
|
||||
}
|
||||
|
||||
if(!eventsDict.ContainsKey(quest.ID))
|
||||
{
|
||||
eventsDict.Add(quest.ID, new List<QuestEventLog>());
|
||||
}
|
||||
|
||||
QuestEventLog questEventLog = new QuestEventLog(_snapTime, questEvent.Id);
|
||||
|
||||
events[quest.ID].Add(questEventLog);
|
||||
eventsDict[quest.ID].Add(questEventLog);
|
||||
if (_activeEvents == null) _activeEvents = new List<QuestEvent>();
|
||||
_activeEvents.Add(questEvent);
|
||||
SaveFacts();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue