diff --git a/Directory.Build.targets b/Directory.Build.targets
index e65ff76c..0a5ba814 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -1,5 +1,5 @@
- 3.0
+ 3.1
diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs
index 091150a8..0e12262e 100644
--- a/Questionable/Functions/QuestFunctions.cs
+++ b/Questionable/Functions/QuestFunctions.cs
@@ -476,34 +476,40 @@ internal sealed unsafe class QuestFunctions
if (_questData.GetLockedClassQuests().Contains(questId))
return true;
- unsafe
+ var startingCity = PlayerState.Instance()->StartTown;
+ if (questInfo.StartingCity > 0 && questInfo.StartingCity != startingCity)
+ return true;
+
+ if (questId.Value == 674 && startingCity == 3)
+ return true;
+ if (questId.Value == 673 && startingCity != 3)
+ return true;
+
+ Dictionary closeToHomeQuests = new()
{
- var startingCity = PlayerState.Instance()->StartTown;
- if (questInfo.StartingCity > 0 && questInfo.StartingCity != startingCity)
- return true;
+ { 108, EClassJob.Marauder },
+ { 109, EClassJob.Arcanist },
+ { 85, EClassJob.Lancer },
+ { 123, EClassJob.Archer },
+ { 124, EClassJob.Conjurer },
+ { 568, EClassJob.Gladiator },
+ { 569, EClassJob.Pugilist },
+ { 570, EClassJob.Thaumaturge }
+ };
- if (questId.Value == 674 && startingCity == 3)
+ // The starting class experience is a bit confusing. If you start in Gridania, the MSQ next quest data will
+ // always select 'Close to Home (Lancer)' even if starting as Conjurer/Archer. However, if we always mark the
+ // Lancer quest as unobtainable, it'll not get picked up as Conjurer/Archer, and thus will stop questing.
+ //
+ // While the NPC offers all 3 quests, there's no manual selection, and interacting will automatically select the
+ // quest for your current class, then switch you from a dead-ish intro zone to the actual starting city
+ // (so that you can't come back later to pick up another quest).
+ if (closeToHomeQuests.TryGetValue(questId.Value, out EClassJob neededStartingClass) &&
+ closeToHomeQuests.Any(x => IsQuestAcceptedOrComplete(new QuestId(x.Key))))
+ {
+ EClassJob actualStartingClass = (EClassJob)PlayerState.Instance()->FirstClass;
+ if (actualStartingClass != neededStartingClass)
return true;
- if (questId.Value == 673 && startingCity != 3)
- return true;
-
- Dictionary closeToHomeQuests = new()
- {
- { 108, EClassJob.Marauder },
- { 109, EClassJob.Arcanist },
- { 85, EClassJob.Lancer },
- { 123, EClassJob.Archer },
- { 124, EClassJob.Conjurer },
- { 568, EClassJob.Gladiator },
- { 569, EClassJob.Pugilist },
- { 570, EClassJob.Thaumaturge }
- };
- if (closeToHomeQuests.TryGetValue(questId.Value, out EClassJob neededStartingClass))
- {
- EClassJob actualStartingClass = (EClassJob)PlayerState.Instance()->FirstClass;
- if (actualStartingClass != neededStartingClass)
- return true;
- }
}
return false;