diff --git a/APRandomizerMain.cs b/APRandomizerMain.cs index 9eb97fd..cd1d763 100644 --- a/APRandomizerMain.cs +++ b/APRandomizerMain.cs @@ -112,6 +112,7 @@ public override void Load() On.ElementalSkylandsLevelInitializer.OnBeforeInitDone += RandoLevelManager.ElementalSkylandsInit; // On.PortalOpeningCutscene.OnOpenPortalEvent += RandoPortalManager.OpenPortalEvent; On.TotHQ.LeaveToLevel += RandoPortalManager.LeaveHQ; + On.TowerOfTimePortal.LoadLevel += RandoPortalManager.TowerOfTimePortal_LoadLevel; // generator deactivation management skylandsGeneratorManager.ApplyHooks(); //These functions let us override and manage power seals ourselves with 'fake' items @@ -700,7 +701,7 @@ public static void OnSelectTeleportToHq() RandoLevelManager.CleanupBeforeOptionsTeleport(); //Load the HQ Manager.Instance.TeleportInToTHQ(true, ELevelEntranceID.ENTRANCE_A, null); - ArchipelagoClient.Session.DataStorage[Scope.Slot, "CurrentRegion"] = ELevel.Level_13_TowerOfTimeHQ.ToString(); + RandoLevelManager.TrackerManager.SetCurrentRegion(ELevel.Level_13_TowerOfTimeHQ); RandoLevelManager.CleanupAfterTeleport(); } diff --git a/Archipelago/TrackerManager.cs b/Archipelago/TrackerManager.cs index 4dce507..dd7055c 100644 --- a/Archipelago/TrackerManager.cs +++ b/Archipelago/TrackerManager.cs @@ -34,11 +34,18 @@ public void ReconciliateUnlockedPortals() var unlockedPortals = RandoPortalManager.UnlockedPortals; unlockedPortals.UnionWith(ArchipelagoClient.Session.DataStorage[Scope.Slot, "UnlockedPortals"].To>() ?? []); + if (unlockedPortals.Count == 0) return; var unlockedPortalsList = unlockedPortals.ToList(); unlockedPortalsList.Sort(); Console.WriteLine($"Updating unlocked portals with Data Storage. Unlocked portals are\n\t{string.Join("\n\t", [.. unlockedPortalsList])}"); ArchipelagoClient.Session.DataStorage[Scope.Slot, "UnlockedPortals"] = unlockedPortalsList; } + + public void SetCurrentRegion(ELevel level) + { + if (!ArchipelagoClient.Authenticated) return; + ArchipelagoClient.Session.DataStorage[Scope.Slot, "CurrentRegion"] = level.ToString(); + } } } diff --git a/GameOverrideManagers/RandoLevelManager.cs b/GameOverrideManagers/RandoLevelManager.cs index 870f248..e03e6f8 100644 --- a/GameOverrideManagers/RandoLevelManager.cs +++ b/GameOverrideManagers/RandoLevelManager.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using Archipelago.MultiClient.Net.Enums; using MessengerRando.Archipelago; using MessengerRando.Utils; using MessengerRando.Utils.Constants; @@ -251,12 +250,11 @@ private static void AddCurrentRegionToStorage(LevelManager self) if (!ArchipelagoClient.Authenticated) return; // put the region we just loaded into in AP data storage for tracking if (self.lastLevelLoaded.Equals(ELevel.Level_13_TowerOfTimeHQ + "_Build")) - ArchipelagoClient.Session.DataStorage[Scope.Slot, "CurrentRegion"] = - ELevel.Level_13_TowerOfTimeHQ.ToString(); + TrackerManager.SetCurrentRegion(ELevel.Level_13_TowerOfTimeHQ); else - ArchipelagoClient.Session.DataStorage[Scope.Slot, "CurrentRegion"] = - self.GetCurrentLevelEnum().ToString(); + TrackerManager.SetCurrentRegion(self.GetCurrentLevelEnum()); } + public static void SkipMusicBox() { var playerPosition = RandomizerStateManager.Instance.SkipMusicBox diff --git a/GameOverrideManagers/RandoPortalManager.cs b/GameOverrideManagers/RandoPortalManager.cs index 2e98ce5..9519704 100644 --- a/GameOverrideManagers/RandoPortalManager.cs +++ b/GameOverrideManagers/RandoPortalManager.cs @@ -361,6 +361,8 @@ public static HashSet UnlockedPortals } } + private static bool PortalShuffleEnabled => PortalMapping is not null && PortalMapping.Count > 0; + public static bool ShouldPortalBeOpen(string portal) { return AccessedStartingPortals.Contains(portal); @@ -430,7 +432,7 @@ public static void Teleport() return; } - if (PortalMapping is null || PortalMapping.Count == 0) + if (!PortalShuffleEnabled) { LeftHQPortal = false; return; @@ -468,5 +470,27 @@ public static void LeaveHQ(On.TotHQ.orig_LeaveToLevel orig, TotHQ self, bool pla Console.WriteLine($"Force teleport: {ForceTeleport}"); orig(self, playLevelMusic, loadingNewLevel); } + + public static void TowerOfTimePortal_LoadLevel(On.TowerOfTimePortal.orig_LoadLevel orig, TowerOfTimePortal self) + { + try + { + Console.WriteLine("Left ToT through portal."); + orig(self); + + // When portals are shuffled, the teleportation override will set the current region. + if (!PortalShuffleEnabled) + { + TrackerManager.SetCurrentRegion(self.nextLevel); + return; + } + } + catch (Exception e) + { + Console.Write("Error in TowerOfTimePortal_LoadLevel"); + Console.WriteLine(e); + } + } + } } diff --git a/Utils/RandomizerSaveMethod.cs b/Utils/RandomizerSaveMethod.cs deleted file mode 100644 index e69de29..0000000