Only mark 'Close to Home' as unobtainable once one of them has been picked up or completed

This commit is contained in:
Liza 2024-09-10 22:11:52 +02:00
parent 3a7c877a68
commit c49a388d53
Signed by: liza
GPG Key ID: 7199F8D727D55F67
2 changed files with 32 additions and 26 deletions

View File

@ -1,5 +1,5 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<Version>3.0</Version> <Version>3.1</Version>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@ -476,34 +476,40 @@ internal sealed unsafe class QuestFunctions
if (_questData.GetLockedClassQuests().Contains(questId)) if (_questData.GetLockedClassQuests().Contains(questId))
return true; 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<ushort, EClassJob> closeToHomeQuests = new()
{ {
var startingCity = PlayerState.Instance()->StartTown; { 108, EClassJob.Marauder },
if (questInfo.StartingCity > 0 && questInfo.StartingCity != startingCity) { 109, EClassJob.Arcanist },
return true; { 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; return true;
if (questId.Value == 673 && startingCity != 3)
return true;
Dictionary<ushort, EClassJob> 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; return false;