diff --git a/RemoteAgents/AgentDeepDungeonStatus.cs b/RemoteAgents/AgentDeepDungeonStatus.cs index f40c1b9..8900cc6 100644 --- a/RemoteAgents/AgentDeepDungeonStatus.cs +++ b/RemoteAgents/AgentDeepDungeonStatus.cs @@ -4,16 +4,31 @@ namespace LlamaLibrary.RemoteAgents; +/// +/// Remote agent for tracking the player's Deep Dungeon status, progression, and state. +/// Handles accessing variables and vtable pointers specific to Deep Dungeons (such as Palace of the Dead, Heaven-on-High, and Eureka Orthos). +/// public class AgentDeepDungeonStatus: AgentInterface { + /// public IntPtr RegisteredVtable => AgentDeepDungeonStatusOffsets.VTable; private static AgentInterface? _instance; + /// + /// Gets the raw Agent ID of the Deep Dungeon status agent. + /// public static int IdRaw { get; } = AgentModule.FindAgentIdByVtable(AgentDeepDungeonStatusOffsets.VTable); + /// + /// Gets the singleton or active instance of the remote agent. + /// public static AgentInterface Instance => _instance ??= new AgentDeepDungeonStatus(AgentModule.AgentPointers[AgentModule.FindAgentIdByVtable(AgentDeepDungeonStatusOffsets.VTable)]); + /// + /// Initializes a new instance of the class. + /// + /// The memory address of the agent. protected AgentDeepDungeonStatus(IntPtr pointer) : base(pointer) { } diff --git a/RemoteAgents/AgentGoldSaucerInfo.cs b/RemoteAgents/AgentGoldSaucerInfo.cs index 20c9be5..b725052 100644 --- a/RemoteAgents/AgentGoldSaucerInfo.cs +++ b/RemoteAgents/AgentGoldSaucerInfo.cs @@ -5,11 +5,19 @@ namespace LlamaLibrary.RemoteAgents { + /// + /// Remote agent for the Gold Saucer information tracking system. + /// Manages client-side state and data queries relating to Gold Saucer currencies, stats, and mini-games. + /// public class AgentGoldSaucerInfo : AgentInterface, IAgent { + /// public IntPtr RegisteredVtable => AgentGoldSaucerInfoOffsets.VTable; - + /// + /// Initializes a new instance of the class. + /// + /// The memory address of the agent. protected AgentGoldSaucerInfo(IntPtr pointer) : base(pointer) { } diff --git a/RemoteAgents/AgentHousing.cs b/RemoteAgents/AgentHousing.cs index 65d3631..8b509c8 100644 --- a/RemoteAgents/AgentHousing.cs +++ b/RemoteAgents/AgentHousing.cs @@ -5,12 +5,19 @@ namespace LlamaLibrary.RemoteAgents { + /// + /// Remote agent for the main housing interface and system state. + /// Manages client-side interaction with general housing features, purchase windows, and estate setup. + /// public class AgentHousing : AgentInterface, IAgent { + /// public IntPtr RegisteredVtable => AgentHousingOffsets.VTable; - - + /// + /// Initializes a new instance of the class. + /// + /// The memory address of the agent. protected AgentHousing(IntPtr pointer) : base(pointer) { } diff --git a/RemoteAgents/AgentHousingSelectBlock.cs b/RemoteAgents/AgentHousingSelectBlock.cs index 210c4aa..c4c136d 100644 --- a/RemoteAgents/AgentHousingSelectBlock.cs +++ b/RemoteAgents/AgentHousingSelectBlock.cs @@ -6,21 +6,38 @@ namespace LlamaLibrary.RemoteAgents { + /// + /// Remote agent for the housing ward selection interface. + /// Manages the housing ward selection UI, tracking selected ward numbers and plot status data. + /// public class AgentHousingSelectBlock : AgentInterface, IAgent { + /// public IntPtr RegisteredVtable => AgentHousingSelectBlockOffsets.VTable; - + /// + /// Initializes a new instance of the class. + /// + /// The memory address of the agent. protected AgentHousingSelectBlock(IntPtr pointer) : base(pointer) { } + /// + /// Gets or sets the selected ward number index. + /// + /// The zero-based ward index in the housing area selection. public int WardNumber { get => Core.Memory.Read(Pointer + AgentHousingSelectBlockOffsets.WardNumber); set => Core.Memory.Write(Pointer + AgentHousingSelectBlockOffsets.WardNumber, value); } + /// + /// Reads the status of housing plots for the selected ward block. + /// + /// The number of plots to read status for (usually up to 30 or 60 depending on ward size/subdivision). + /// A byte array representing plot availability/purchase status in the current ward block. public byte[] ReadPlots(int count) { return Core.Memory.ReadArray(Pointer + AgentHousingSelectBlockOffsets.PlotOffset, count); diff --git a/RemoteAgents/AgentMinionNoteBook.cs b/RemoteAgents/AgentMinionNoteBook.cs index 0b2a979..d598f30 100644 --- a/RemoteAgents/AgentMinionNoteBook.cs +++ b/RemoteAgents/AgentMinionNoteBook.cs @@ -9,17 +9,32 @@ namespace LlamaLibrary.RemoteAgents { + /// + /// Remote agent for the Minion Guide (Notebook) interface. + /// Manages the display and querying of acquired minions and their names. + /// public class AgentMinionNoteBook : AgentInterface, IAgent { + /// public IntPtr RegisteredVtable => AgentMinionNoteBookOffsets.VTable; + /// + /// Gets the raw memory address of the minion list. + /// public IntPtr MinionListAddress => Pointer + AgentMinionNoteBookOffsets.AgentOffset; - + /// + /// Initializes a new instance of the class. + /// + /// The memory address of the agent. protected AgentMinionNoteBook(IntPtr pointer) : base(pointer) { } + /// + /// Retrieves the list of currently owned or displayed minions from game memory. + /// + /// An array of representing the player's minion notebook list. public MinionStruct[] GetCurrentMinions() { var address = Pointer + AgentMinionNoteBookOffsets.AgentOffset; @@ -28,6 +43,11 @@ public MinionStruct[] GetCurrentMinions() return Core.Memory.ReadArray(address1, (int)count); } + /// + /// Resolves the in-game name of a minion by its database index. + /// + /// The internal database or row index of the minion companion. + /// The UTF-8 string name of the minion, or an empty string if not found. public static string GetMinionName(int index) { var result = Core.Memory.CallInjectedWraper(AgentMinionNoteBookOffsets.GetCompanion, index); @@ -35,12 +55,21 @@ public static string GetMinionName(int index) } } + /// + /// Represents a 4-byte memory mapping for a minion entry in the player's collection. + /// [StructLayout(LayoutKind.Explicit, Size = 0x4)] public struct MinionStruct { + /// + /// The unique ID of the minion companion. + /// [FieldOffset(0)] public ushort MinionId; + /// + /// An unknown/alignment field. + /// [FieldOffset(2)] public ushort unknown; } diff --git a/RemoteAgents/AgentWorldTravelSelect.cs b/RemoteAgents/AgentWorldTravelSelect.cs index 641330f..eefc743 100644 --- a/RemoteAgents/AgentWorldTravelSelect.cs +++ b/RemoteAgents/AgentWorldTravelSelect.cs @@ -9,45 +9,97 @@ namespace LlamaLibrary.RemoteAgents { + /// + /// Remote agent for the World Travel selection interface. + /// Manages cross-world visit options and retrieves available target worlds. + /// + /// + /// In other regions, a skip logic (MaxSkip = 1) is used to filter out the player's home world from the target choices, + /// while for the Tencent version (RB_TC), no home world skipping is applied (MaxSkip = 0). + /// public class AgentWorldTravelSelect : AgentInterface, IAgent { + /// public IntPtr RegisteredVtable => AgentWorldTravelSelectOffsets.VTable; #if RB_TC const int MaxCountOffset = -1; -const int MaxSkip = 0; + const int MaxSkip = 0; #else const int MaxCountOffset = -1; const int MaxSkip = 1; #endif + /// + /// Initializes a new instance of the class. + /// + /// The memory address of the agent. protected AgentWorldTravelSelect(IntPtr pointer) : base(pointer) { } + /// + /// Gets the ID of the current world the player is physically on. + /// public ushort CurrentWorld => Core.Memory.NoCacheRead(ChoicesPointer + 0x4); + + /// + /// Gets the pointer to the world choices data structure array. + /// public IntPtr ChoicesPointer => Core.Memory.NoCacheRead(Pointer + AgentWorldTravelSelectOffsets.ChoicesOffset); + /// + /// Gets the ID of the player's Home World. + /// public ushort HomeWorld => Core.Memory.NoCacheRead(ChoicesPointer); + /// + /// Gets the total number of worlds in the current logical data center/choices list. + /// public int NumberOfWorlds => Core.Memory.NoCacheRead(Pointer + AgentWorldTravelSelectOffsets.MaxWorldOffset) + MaxCountOffset; + /// + /// Gets the collection of available worlds for cross-world travel. + /// + /// + /// Filters out the Home World in standard configurations using MaxSkip. + /// public WorldChoice[] Choices => Core.Memory.ReadArray(ChoicesPointer + 0x8, NumberOfWorlds).Skip(MaxSkip).ToArray(); } + #if RB_TC + /// + /// Represents a world travel destination choice for the Tencent game client. + /// [StructLayout(LayoutKind.Sequential)] public struct WorldChoice { + /// + /// The unique ID representing the destination game world. + /// public ushort WorldID; + + /// + /// An unknown field alignment/metadata value. + /// public ushort Unk; } #else + /// + /// Represents a world travel destination choice. + /// [StructLayout(LayoutKind.Explicit, Size = 0xC)] public struct WorldChoice { + /// + /// The unique ID representing the destination game world. + /// [FieldOffset(0x4)] public ushort WorldID; + /// + /// Gets the corresponding strongly-typed enum representation for the world ID. + /// public World World => (World)WorldID; } #endif