// do the MSQ; if a side quest is the first item do that side quest.
//
// If no quests are marked as 'priority', accepting a new quest adds it to the top of the list.
+ List<(ElementId Quest, byte Sequence)> trackedQuests = [];
for (int i = questManager->TrackedQuests.Length - 1; i >= 0; --i)
{
ElementId currentQuest;
switch (trackedQuest.QuestType)
{
default:
- continue;
+ break;
case 1: // normal quest
currentQuest = new QuestId(questManager->NormalQuests[trackedQuest.Index].QuestId);
if (_questRegistry.IsKnownQuest(currentQuest))
- return (currentQuest, QuestManager.GetQuestSequence(currentQuest.Value));
- continue;
+ trackedQuests.Add((currentQuest, QuestManager.GetQuestSequence(currentQuest.Value)));
+ break;
case 2: // leve
currentQuest = new LeveId(questManager->LeveQuests[trackedQuest.Index].LeveId);
if (_questRegistry.IsKnownQuest(currentQuest))
- return (currentQuest, questManager->GetLeveQuestById(currentQuest.Value)->Sequence);
- continue;
+ trackedQuests.Add((currentQuest, questManager->GetLeveQuestById(currentQuest.Value)->Sequence));
+ break;
}
}
+ if (trackedQuests.Count > 0)
+ {
+ // if we have multiple quests to turn in for an allied society, try and complete all of them
+ var (firstTrackedQuest, firstTrackedSequence) = trackedQuests.First();
+ EAlliedSociety firstTrackedAlliedSociety = GetCommonAlliedSocietyTurnIn(firstTrackedQuest);
+ if (firstTrackedAlliedSociety != EAlliedSociety.None && firstTrackedSequence == 255)
+ {
+ foreach (var (quest, sequence) in trackedQuests.Skip(1))
+ {
+ // only if the other quest isn't ready to be turned in
+ if (GetCommonAlliedSocietyTurnIn(quest) == firstTrackedAlliedSociety && sequence != 255)
+ return (quest, sequence);
+ }
+ }
+
+ return (firstTrackedQuest, firstTrackedSequence);
+ }
+
ElementId? priorityQuest = GetNextPriorityQuestThatCanBeAccepted();
if (priorityQuest != null)
{
return (currentQuest, QuestManager.GetQuestSequence(currentQuest.Value));
}
+ private static EAlliedSociety GetCommonAlliedSocietyTurnIn(ElementId elementId)
+ {
+ if (elementId is QuestId questId)
+ {
+ return questId.Value switch
+ {
+ >= 5199 and <= 5226 => EAlliedSociety.Pelupelu,
+ _ => EAlliedSociety.None,
+ };
+ }
+
+ return EAlliedSociety.None;
+ }
+
public QuestProgressInfo? GetQuestProgressInfo(ElementId elementId)
{
if (elementId is QuestId questId)