diff --git a/APRandomizerMain.cs b/APRandomizerMain.cs index 9eb97fd..7476b24 100644 --- a/APRandomizerMain.cs +++ b/APRandomizerMain.cs @@ -60,7 +60,6 @@ public override void Load() randoStateManager = new RandomizerStateManager(); trackerManager = new TrackerManager(); - ItemsAndLocationsHandler.TrackerManager = trackerManager; RandoPortalManager.TrackerManager = trackerManager; RandoLevelManager.TrackerManager = trackerManager; @@ -877,10 +876,43 @@ private void PlayerController_OnUpdate(PlayerController controller) TrapManager.TrapTimer += Time.deltaTime; if (!(updateTimer >= UpdateTime)) return; updateTimer = 0; - ArchipelagoClient.UpdateArchipelagoState(); + UpdateArchipelagoState(); apMessagesDisplay16.text = apMessagesDisplay8.text = ArchipelagoClient.UpdateMessagesText(); } + public void UpdateArchipelagoState() + { + while (ArchipelagoClient.ItemQueue.Count > 0) + { + ItemsAndLocationsHandler.Unlock((long)ArchipelagoClient.ItemQueue.Dequeue()); + } + + if (ArchipelagoClient.DialogQueue.Count > 0) + { + var message = (string)ArchipelagoClient.DialogQueue.Dequeue(); + Console.WriteLine(message); + DialogChanger.CreateDialogBox(message); + } + + TrapManager.UpdateTrapStatus(); + if (ArchipelagoClient.Offline) return; + if (!ArchipelagoClient.Authenticated) + { + Console.WriteLine("Attempting to reconnect to Archipelago Server..."); + ThreadPool.QueueUserWorkItem(_ => ArchipelagoClient.ConnectAsync()); + return; + } + + if (ArchipelagoClient.ServerData.Index < ArchipelagoClient.Session.Items.AllItemsReceived.Count) + { + ItemsAndLocationsHandler.UnlockItems(); + return; + } + + if (!ItemsAndLocationsHandler.Synced) ItemsAndLocationsHandler.ReSync(); + if (!trackerManager.Synced) trackerManager.ReSync(); + } + private void InGameHud_OnGUI(On.InGameHud.orig_OnGUI orig, InGameHud self) { orig(self); @@ -888,8 +920,10 @@ private void InGameHud_OnGUI(On.InGameHud.orig_OnGUI orig, InGameHud self) { apTextDisplay8 = Object.Instantiate(self.hud_8.coinCount, self.hud_8.gameObject.transform); apTextDisplay16 = Object.Instantiate(self.hud_16.coinCount, self.hud_16.gameObject.transform); - apTextDisplay8.transform.Translate(0f, -110f, 0f); - apTextDisplay16.transform.Translate(0f, -110f, 0f); + apTextDisplay8.rectTransform.Translate(0f, -110f, 0f); + apTextDisplay16.rectTransform.Translate(0f, -110f, 0f); + apTextDisplay8.rectTransform.sizeDelta = new Vector2(apTextDisplay8.rectTransform.sizeDelta.x + 100f, apTextDisplay8.rectTransform.sizeDelta.y); + apTextDisplay16.rectTransform.sizeDelta = new Vector2(apTextDisplay16.rectTransform.sizeDelta.x + 100f, apTextDisplay16.rectTransform.sizeDelta.y); apTextDisplay16.fontSize = apTextDisplay8.fontSize = UserConfig.StatusTextSize; apTextDisplay16.alignment = apTextDisplay8.alignment = TextAlignmentOptions.TopRight; apTextDisplay16.enableWordWrapping = apTextDisplay8.enableWordWrapping = true; @@ -897,8 +931,8 @@ private void InGameHud_OnGUI(On.InGameHud.orig_OnGUI orig, InGameHud self) apMessagesDisplay8 = Object.Instantiate(self.hud_8.coinCount, self.hud_8.gameObject.transform); apMessagesDisplay16 = Object.Instantiate(self.hud_16.coinCount, self.hud_16.gameObject.transform); - apMessagesDisplay8.transform.Translate(0f, -200f, 0f); - apMessagesDisplay16.transform.Translate(0f, -200f, 0f); + apMessagesDisplay8.rectTransform.Translate(0f, -200f, 0f); + apMessagesDisplay16.rectTransform.Translate(0f, -200f, 0f); apMessagesDisplay16.fontSize = apMessagesDisplay8.fontSize = UserConfig.MessageTextSize; apMessagesDisplay16.alignment = apMessagesDisplay8.alignment = TextAlignmentOptions.BottomRight; apMessagesDisplay16.enableWordWrapping = apMessagesDisplay16.enableWordWrapping = true; diff --git a/Archipelago/ArchipelagoClient.cs b/Archipelago/ArchipelagoClient.cs index 534b507..06c7eeb 100644 --- a/Archipelago/ArchipelagoClient.cs +++ b/Archipelago/ArchipelagoClient.cs @@ -101,13 +101,6 @@ private static ArchipelagoSession CreateSession() return session; } - private static ArchipelagoSession CreateSession(Uri uri) - { - var session = ArchipelagoSessionFactory.CreateSession(uri); - SetupSession(session); - return session; - } - private static void SetupSession(ArchipelagoSession session) { session.MessageLog.OnMessageReceived += OnMessageReceived; @@ -124,23 +117,6 @@ private static void OnPacketReceived(ArchipelagoPacketBase packet) } } - public static string Connect(Uri uri) - { - if (Authenticated) return "already connected"; - - try - { - Session = CreateSession(uri); - } - catch (Exception e) - { - Console.WriteLine($"Error: {e}"); - return e.ToString(); - } - - return TryConnect(); - } - public static string Connect() { if (Authenticated) return "already connected"; @@ -194,6 +170,7 @@ private static string HandleConnectResult(LoginResult result, bool needSlotData) ServerData.SlotData = success.SlotData; ServerData.SeedName = Session.RoomState.Seed; Authenticated = true; + roomUpdate = true; try { @@ -207,6 +184,7 @@ private static string HandleConnectResult(LoginResult result, bool needSlotData) "Please submit a bug report with the log.txt, " + "which can be found by the game executable."; Authenticated = false; + roomUpdate = true; Disconnect(); return outputText; } @@ -230,6 +208,7 @@ private static string HandleConnectResult(LoginResult result, bool needSlotData) Console.WriteLine(outputText); Authenticated = false; + roomUpdate = true; Disconnect(); } @@ -409,44 +388,13 @@ public static void Disconnect() Session?.Socket.Disconnect(); Session = null; Authenticated = false; + roomUpdate = true; attemptingConnection = false; DialogQueue = new Queue(); ItemQueue = new Queue(); messageQueue = new Queue(); } - public static void UpdateArchipelagoState() - { - while (ItemQueue.Count > 0) - { - ItemsAndLocationsHandler.Unlock((long)ItemQueue.Dequeue()); - } - - if (DialogQueue.Count > 0) - { - var message = (string)DialogQueue.Dequeue(); - Console.WriteLine(message); - DialogChanger.CreateDialogBox(message); - } - - TrapManager.UpdateTrapStatus(); - if (Offline) return; - if (!Authenticated) - { - Console.WriteLine("Attempting to reconnect to Archipelago Server..."); - ThreadPool.QueueUserWorkItem(_ => ConnectAsync()); - return; - } - - if (ServerData.Index < Session.Items.AllItemsReceived.Count) - { - ItemsAndLocationsHandler.UnlockItems(); - return; - } - if (!ItemsAndLocationsHandler.Synced) - ItemsAndLocationsHandler.ReSync(); - } - public static void UpdateClientStatus(ArchipelagoClientState newState) { Console.WriteLine($"Updating client status to {newState}"); @@ -533,7 +481,7 @@ public static string UpdateStatusText() } else if (HasConnected) { - statusText = "Disconnected from Archipelago server."; + statusText = "Disconnected from Archipelago server\nWill attempt to reconnect..."; } return statusText; } diff --git a/Archipelago/ItemsAndLocationsHandler.cs b/Archipelago/ItemsAndLocationsHandler.cs index da36ef4..3d92f9d 100644 --- a/Archipelago/ItemsAndLocationsHandler.cs +++ b/Archipelago/ItemsAndLocationsHandler.cs @@ -22,7 +22,6 @@ public static class ItemsAndLocationsHandler public const long BaseOffset = 0xADD_000; public static bool Synced; - public static TrackerManager TrackerManager; /// /// Builds the item and lookup dictionaries for converting to and from AP checks. Will always make every location @@ -547,7 +546,6 @@ public static void ReSync() { Synced = true; ArchipelagoClient.SyncEvents(); - TrackerManager.ReconciliateUnlockedPortals(); var receivedItems = new Dictionary(); diff --git a/Archipelago/TrackerManager.cs b/Archipelago/TrackerManager.cs index 4dce507..8d31de8 100644 --- a/Archipelago/TrackerManager.cs +++ b/Archipelago/TrackerManager.cs @@ -9,28 +9,67 @@ namespace MessengerRando.Archipelago public class TrackerManager { - private List VisitedEntrances = []; + private List visitedEntrances = []; + + public bool Synced { get; private set; } = false; + + private readonly HashSet unsentVisitedEntrances = []; + private bool needsUnlockedPortalsReconciliation = true; + private ELevel lastKnownCurrentRegion = ELevel.NONE; + + public void ReSync() + { + Synced = true; + Console.WriteLine("Re-syncing tracker data from Data Storage"); + + visitedEntrances = ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"].To>() ?? []; + unsentVisitedEntrances.RemoveWhere(visitedEntrances.Contains); + if (unsentVisitedEntrances.Count > 0) + { + Console.WriteLine($"Adding visited entrances:\n\t{string.Join("\n\t", [.. unsentVisitedEntrances])}"); + visitedEntrances.AddRange(unsentVisitedEntrances); + visitedEntrances.Sort(); + ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"] = visitedEntrances; + unsentVisitedEntrances.Clear(); + } + + if (needsUnlockedPortalsReconciliation) ReconciliateUnlockedPortals(); + if (lastKnownCurrentRegion != ELevel.NONE) SetCurrentRegion(lastKnownCurrentRegion); + } public void AddVisitedEntrance(string entrance) { - if (VisitedEntrances.Contains(entrance)) return; + if (visitedEntrances.Contains(entrance)) return; + + if (ArchipelagoClient.Offline) return; + if (!ArchipelagoClient.Authenticated) + { + Synced = false; + unsentVisitedEntrances.Add(entrance); + return; + } - if (!ArchipelagoClient.Authenticated) return; - VisitedEntrances = ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"].To>() ?? []; - if (VisitedEntrances.Contains(entrance)) return; + visitedEntrances = ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"].To>() ?? []; + if (visitedEntrances.Contains(entrance)) return; Console.WriteLine("Adding visited entrance: " + entrance); - VisitedEntrances.Add(entrance); - VisitedEntrances.Sort(); - ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"] = VisitedEntrances; + visitedEntrances.Add(entrance); + visitedEntrances.Sort(); + ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"] = visitedEntrances; return; } public void ReconciliateUnlockedPortals() { - if (!ArchipelagoClient.Authenticated) return; + if (ArchipelagoClient.Offline) return; + if (!ArchipelagoClient.Authenticated) + { + Synced = false; + needsUnlockedPortalsReconciliation = true; + return; + } var unlockedPortals = RandoPortalManager.UnlockedPortals; unlockedPortals.UnionWith(ArchipelagoClient.Session.DataStorage[Scope.Slot, "UnlockedPortals"].To>() ?? []); @@ -40,5 +79,18 @@ public void ReconciliateUnlockedPortals() 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.Offline) return; + if (!ArchipelagoClient.Authenticated) + { + Synced = false; + lastKnownCurrentRegion = level; + return; + } + + ArchipelagoClient.Session.DataStorage[Scope.Slot, "CurrentRegion"] = level.ToString(); + } } }