1
0
Fork 0

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

chore-fix-dt-dungeon-unlock v3.1
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>
<PropertyGroup>
<Version>3.0</Version>
<Version>3.1</Version>
</PropertyGroup>
</Project>

View File

@ -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<ushort, EClassJob> 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<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;