Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 40 additions & 6 deletions APRandomizerMain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ public override void Load()
randoStateManager = new RandomizerStateManager();

trackerManager = new TrackerManager();
ItemsAndLocationsHandler.TrackerManager = trackerManager;
RandoPortalManager.TrackerManager = trackerManager;
RandoLevelManager.TrackerManager = trackerManager;

Expand Down Expand Up @@ -877,28 +876,63 @@ 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);
if (apTextDisplay8 == null)
{
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;
apTextDisplay16.color = apTextDisplay8.color = Color.white;

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;
Expand Down
62 changes: 5 additions & 57 deletions Archipelago/ArchipelagoClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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";
Expand Down Expand Up @@ -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
{
Expand All @@ -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;
}
Expand All @@ -230,6 +208,7 @@ private static string HandleConnectResult(LoginResult result, bool needSlotData)
Console.WriteLine(outputText);

Authenticated = false;
roomUpdate = true;
Disconnect();
}

Expand Down Expand Up @@ -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}");
Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 0 additions & 2 deletions Archipelago/ItemsAndLocationsHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ public static class ItemsAndLocationsHandler
public const long BaseOffset = 0xADD_000;

public static bool Synced;
public static TrackerManager TrackerManager;

/// <summary>
/// Builds the item and lookup dictionaries for converting to and from AP checks. Will always make every location
Expand Down Expand Up @@ -547,7 +546,6 @@ public static void ReSync()
{
Synced = true;
ArchipelagoClient.SyncEvents();
TrackerManager.ReconciliateUnlockedPortals();

var receivedItems = new Dictionary<long, int>();

Expand Down
70 changes: 61 additions & 9 deletions Archipelago/TrackerManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,67 @@ namespace MessengerRando.Archipelago
public class TrackerManager
{

private List<string> VisitedEntrances = [];
private List<string> visitedEntrances = [];

public bool Synced { get; private set; } = false;

private readonly HashSet<string> 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<List<string>>() ?? [];
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<List<string>>() ?? [];
if (VisitedEntrances.Contains(entrance)) return;
visitedEntrances = ArchipelagoClient.Session.DataStorage[Scope.Slot, "VisitedEntrances"].To<List<string>>() ?? [];
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<List<string>>() ?? []);
Expand All @@ -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();
}
}
}