using Lumina.Excel.GeneratedSheets;
using Questionable.Model;
using Questionable.Model.Questing;
-using Quest = Lumina.Excel.GeneratedSheets.Quest;
+using Leve = Lumina.Excel.GeneratedSheets2.Leve;
+using Quest = Lumina.Excel.GeneratedSheets2.Quest;
namespace Questionable.Data;
// workaround because the game doesn't require completion of the CT questline through normal means
QuestInfo aTimeToEveryPurpose = (QuestInfo)_quests[new QuestId(425)];
- aTimeToEveryPurpose.AddPreviousQuest(new QuestId(495));
+ aTimeToEveryPurpose.AddPreviousQuest(new QuestInfo.PreviousQuestInfo(new QuestId(495)));
}
public IQuestInfo GetQuestInfo(ElementId elementId)
if (questInfo.PreviousQuests.Count == 0)
return true;
- var completedQuests = questInfo.PreviousQuests.Count(x => IsQuestComplete(x) || x.Equals(extraCompletedQuest));
+ var completedQuests = questInfo.PreviousQuests.Count(x =>
+ HasEnoughProgressOnPreviousQuest(x) || x.QuestId.Equals(extraCompletedQuest));
if (questInfo.PreviousQuestJoin == QuestInfo.QuestJoin.All &&
questInfo.PreviousQuests.Count == completedQuests)
return true;
return false;
}
+ private bool HasEnoughProgressOnPreviousQuest(QuestInfo.PreviousQuestInfo previousQuestInfo)
+ {
+ if (IsQuestComplete(previousQuestInfo.QuestId))
+ return true;
+
+ if (previousQuestInfo.Sequence != 0 && IsQuestAccepted(previousQuestInfo.QuestId))
+ {
+ var progress = GetQuestProgressInfo(previousQuestInfo.QuestId);
+ return progress != null && progress.Sequence >= previousQuestInfo.Sequence;
+ }
+
+ return false;
+ }
+
private static bool HasCompletedPreviousInstances(QuestInfo questInfo)
{
if (questInfo.PreviousInstanceContent.Count == 0)
using System.Collections.Generic;
using LLib.GameData;
-using Lumina.Excel.GeneratedSheets;
+using Lumina.Excel.GeneratedSheets2;
using Questionable.Model.Questing;
namespace Questionable.Model;
Level = leve.ClassJobLevel;
JournalGenre = leve.JournalGenre.Row;
SortKey = QuestId.Value;
- IssuerDataId = leve.LevelLevemete.Value!.Object;
+ IssuerDataId = leve.LevelLevemete.Value!.Object.Row;
ClassJobs = QuestInfoUtils.AsList(leve.ClassJobCategory.Value!);
Expansion = (EExpansionVersion)leve.LevelLevemete.Value.Territory.Value!.ExVersion.Row;
}
using JetBrains.Annotations;
using LLib.GameData;
using Questionable.Model.Questing;
-using ExcelQuest = Lumina.Excel.GeneratedSheets.Quest;
+using ExcelQuest = Lumina.Excel.GeneratedSheets2.Quest;
namespace Questionable.Model;
};
Name = $"{quest.Name}{suffix}";
- Level = quest.ClassJobLevel0;
- IssuerDataId = quest.IssuerStart;
+ Level = quest.ClassJobLevel[0];
+ IssuerDataId = quest.IssuerStart.Row;
IsRepeatable = quest.IsRepeatable;
- PreviousQuests = quest.PreviousQuest
- .Select(x => new QuestId((ushort)(x.Row & 0xFFFF)))
- .Where(x => x.Value != 0)
- .ToImmutableList();
+ PreviousQuests =
+ new List<PreviousQuestInfo>
+ {
+ new(new QuestId((ushort)(quest.PreviousQuest[0].Row & 0xFFFF)), quest.Unknown7),
+ new(new QuestId((ushort)(quest.PreviousQuest[1].Row & 0xFFFF))),
+ new(new QuestId((ushort)(quest.PreviousQuest[1].Row & 0xFFFF)))
+ }
+ .Where(x => x.QuestId.Value != 0)
+ .ToImmutableList();
PreviousQuestJoin = (QuestJoin)quest.PreviousQuestJoin;
QuestLocks = quest.QuestLock
.Select(x => new QuestId((ushort)(x.Row & 0xFFFFF)))
JournalGenre = quest.JournalGenre?.Row;
SortKey = quest.SortKey;
IsMainScenarioQuest = quest.JournalGenre?.Value?.JournalCategory?.Value?.JournalSection?.Row is 0 or 1;
- CompletesInstantly = quest.ToDoCompleteSeq[0] == 0;
+ CompletesInstantly = quest.TodoParams[0].ToDoCompleteSeq == 0;
PreviousInstanceContent = quest.InstanceContent.Select(x => (ushort)x.Row).Where(x => x != 0).ToList();
PreviousInstanceContentJoin = (QuestJoin)quest.InstanceContentJoin;
GrandCompany = (GrandCompany)quest.GrandCompany.Row;
public ushort Level { get; }
public uint IssuerDataId { get; }
public bool IsRepeatable { get; }
- public ImmutableList<QuestId> PreviousQuests { get; set; }
+ public ImmutableList<PreviousQuestInfo> PreviousQuests { get; set; }
public QuestJoin PreviousQuestJoin { get; }
public ImmutableList<QuestId> QuestLocks { get; }
public QuestJoin QuestLockJoin { get; }
AtLeastOne = 2,
}
- public void AddPreviousQuest(QuestId questId)
+ public void AddPreviousQuest(PreviousQuestInfo questId)
{
PreviousQuests = [..PreviousQuests, questId];
}
+
+ public sealed record PreviousQuestInfo(QuestId QuestId, byte Sequence = 0);
}
using System.Collections.Generic;
using System.Linq;
using LLib.GameData;
-using Lumina.Excel.GeneratedSheets;
+using Lumina.Excel.GeneratedSheets2;
namespace Questionable.Model;
{ EClassJob.Dancer, classJobCategory.DNC },
{ EClassJob.Reaper, classJobCategory.RPR },
{ EClassJob.Sage, classJobCategory.SGE },
- { EClassJob.Viper, classJobCategory.VPR },
- { EClassJob.Pictomancer, classJobCategory.PCT }
+ { EClassJob.Viper, classJobCategory.Unknown1 },
+ { EClassJob.Pictomancer, classJobCategory.Unknown2 }
}
.Where(y => y.Value)
.Select(y => y.Key)
private readonly TerritoryData _territoryData;
private readonly QuestFunctions _questFunctions;
private readonly UiUtils _uiUtils;
+ private readonly Configuration _configuration;
public QuestTooltipComponent(
QuestRegistry questRegistry,
QuestData questData,
TerritoryData territoryData,
QuestFunctions questFunctions,
- UiUtils uiUtils)
+ UiUtils uiUtils,
+ Configuration configuration)
{
_questRegistry = questRegistry;
_questData = questData;
_territoryData = territoryData;
_questFunctions = questFunctions;
_uiUtils = uiUtils;
+ _configuration = configuration;
}
public void Draw(IQuestInfo quest)
foreach (var q in quest.PreviousQuests)
{
- if (_questData.TryGetQuestInfo(q, out var qInfo))
+ if (_questData.TryGetQuestInfo(q.QuestId, out var qInfo))
{
- var (iconColor, icon, _) = _uiUtils.GetQuestStyle(q);
+ var (iconColor, icon, _) = _uiUtils.GetQuestStyle(q.QuestId);
if (!_questRegistry.IsKnownQuest(qInfo.QuestId))
iconColor = ImGuiColors.DalamudGrey;
- _uiUtils.ChecklistItem(FormatQuestUnlockName(qInfo), iconColor, icon);
+ _uiUtils.ChecklistItem(FormatQuestUnlockName(qInfo, _questFunctions.IsQuestComplete(q.QuestId) ? byte.MinValue : q.Sequence), iconColor, icon);
if (qInfo is QuestInfo qstInfo && (counter <= 2 || icon != FontAwesomeIcon.Check))
DrawQuestUnlocks(qstInfo, counter + 1);
ImGui.Unindent();
}
- private static string FormatQuestUnlockName(IQuestInfo questInfo)
+ private string FormatQuestUnlockName(IQuestInfo questInfo, byte sequence = 0)
{
+ string name = questInfo.Name;
+ if (_configuration.Advanced.AdditionalStatusInformation && sequence != 0)
+ name += $" {SeIconChar.ItemLevel.ToIconString()}";
+
if (questInfo.IsMainScenarioQuest)
- return $"{questInfo.Name} ({questInfo.QuestId}, MSQ)";
+ name += $" ({questInfo.QuestId}, MSQ)";
else
- return $"{questInfo.Name} ({questInfo.QuestId})";
+ name += $" {questInfo.Name} ({questInfo.QuestId})";
+
+ return name;
}
}