diff --git a/src/TrackerCouncil.Smz3.Data/WorldData/World.cs b/src/TrackerCouncil.Smz3.Data/WorldData/World.cs index ab72969be..2d03859b2 100644 --- a/src/TrackerCouncil.Smz3.Data/WorldData/World.cs +++ b/src/TrackerCouncil.Smz3.Data/WorldData/World.cs @@ -330,12 +330,15 @@ public void UpdateLegacyWorld(TrackerState? trackerState) return; } + var hasAllMedallions = trackerState?.ItemStates.Count(x => + x.Type is ItemType.Quake or ItemType.Ether or ItemType.Bombos && x.TrackingState > 0) == 3; + var worldState = new LegacyWorldState() { Medallions = [ - GetLegacyMedallion(MiseryMire), - GetLegacyMedallion(TurtleRock) + GetLegacyMedallion(MiseryMire, hasAllMedallions), + GetLegacyMedallion(TurtleRock, hasAllMedallions) ], Rewards = [ @@ -380,19 +383,16 @@ private LegacyRewardType GetLegacyRewardType(IHasReward region) }; } - private LegacyWorldState.LegacyMedallion GetLegacyMedallion(IHasPrerequisite region) + private LegacyWorldState.LegacyMedallion GetLegacyMedallion(IHasPrerequisite region, bool hasAllMedallions) { - var unobtainedMedallion = AllItems.FirstOrDefault(x => - x.IsLocalPlayerItem && x.Type.IsInCategory(ItemCategory.Medallion) && x.TrackingState == 0)?.Type; - - var requiredItemType = - region.MarkedItem ?? unobtainedMedallion ?? region.RequiredItem; + var requiredItemType = hasAllMedallions ? region.RequiredItem : region.MarkedItem ?? ItemType.Nothing; return requiredItemType switch { ItemType.Bombos => LegacyWorldState.LegacyMedallion.Bombos, ItemType.Ether => LegacyWorldState.LegacyMedallion.Ether, - _ => LegacyWorldState.LegacyMedallion.Bombos + ItemType.Quake => LegacyWorldState.LegacyMedallion.Quake, + _ => LegacyWorldState.LegacyMedallion.Unknown }; } diff --git a/src/TrackerCouncil.Smz3.LegacyLogic/LegacyWorldState.cs b/src/TrackerCouncil.Smz3.LegacyLogic/LegacyWorldState.cs index fc17f2863..903930584 100644 --- a/src/TrackerCouncil.Smz3.LegacyLogic/LegacyWorldState.cs +++ b/src/TrackerCouncil.Smz3.LegacyLogic/LegacyWorldState.cs @@ -8,6 +8,7 @@ namespace Randomizer.SMZ3 { public class LegacyWorldState { public enum LegacyMedallion { + Unknown, Bombos, Ether, Quake, diff --git a/src/TrackerCouncil.Smz3.LegacyLogic/Regions/Zelda/LegacyMiseryMire.cs b/src/TrackerCouncil.Smz3.LegacyLogic/Regions/Zelda/LegacyMiseryMire.cs index a2c8f8148..f9594c351 100644 --- a/src/TrackerCouncil.Smz3.LegacyLogic/Regions/Zelda/LegacyMiseryMire.cs +++ b/src/TrackerCouncil.Smz3.LegacyLogic/Regions/Zelda/LegacyMiseryMire.cs @@ -37,6 +37,11 @@ public LegacyMiseryMire(LegacyWorld legacyWorld, LegacyConfig legacyConfig) : ba // Need "CanKillManyEnemies" if implementing swordless public override bool CanEnter(LegacyProgression items) { + if (LegacyMedallion == LegacyMedallion.Unknown && (!items.Bombos || !items.Ether || !items.Quake)) + { + return false; + } + return LegacyMedallion switch { LegacyMedallion.Bombos => items.Bombos, LegacyMedallion.Ether => items.Ether, diff --git a/src/TrackerCouncil.Smz3.LegacyLogic/Regions/Zelda/LegacyTurtleRock.cs b/src/TrackerCouncil.Smz3.LegacyLogic/Regions/Zelda/LegacyTurtleRock.cs index 97cc24fc0..c9fea9731 100644 --- a/src/TrackerCouncil.Smz3.LegacyLogic/Regions/Zelda/LegacyTurtleRock.cs +++ b/src/TrackerCouncil.Smz3.LegacyLogic/Regions/Zelda/LegacyTurtleRock.cs @@ -51,6 +51,11 @@ bool CanBeatBoss(LegacyProgression items) { } public override bool CanEnter(LegacyProgression items) { + if (LegacyMedallion == LegacyMedallion.Unknown && (!items.Bombos || !items.Ether || !items.Quake)) + { + return false; + } + return LegacyMedallion switch { LegacyMedallion.Bombos => items.Bombos, LegacyMedallion.Ether => items.Ether, diff --git a/src/TrackerCouncil.Smz3.Tracking/TrackingServices/TrackerPrerequisiteService.cs b/src/TrackerCouncil.Smz3.Tracking/TrackingServices/TrackerPrerequisiteService.cs index c5ce6600e..d9849a98e 100644 --- a/src/TrackerCouncil.Smz3.Tracking/TrackingServices/TrackerPrerequisiteService.cs +++ b/src/TrackerCouncil.Smz3.Tracking/TrackingServices/TrackerPrerequisiteService.cs @@ -38,6 +38,8 @@ public void SetDungeonRequirement(IHasPrerequisite region, ItemType? medallion = Tracker.Say(response: Responses.DungeonRequirementMarked, args: [medallion.ToString(), region.Metadata.Name]); } + World.UpdateLegacyWorld(World.State); + UpdateAccessibility(region); AddUndo(autoTracked, () =>