From 9d7ca0fde8022bacf992c7b8c0053d1e28f4248b Mon Sep 17 00:00:00 2001
From: Striven <sg.striven@cutecat.club>
Date: Sat, 13 Sep 2025 22:58:13 +0000
Subject: [PATCH] Refactor the docs structure

---
 04_rendezvous/04_prudp_protocol.md                         |   15 ++
 02_internals_of_hyperscape/README.md                       |    3 
 04_rendezvous/03_structure.md                              |    2 
 05_scapegoat/02_build_and_use_scapegoat.md                 |    1 
 03_ubisoft_services/04_logging_in.md                       |    3 
 05_scapegoat/03_install_and_use_scapegoat.md               |    1 
 04_rendezvous/README.md                                    |   19 +++
 01_general_information/README.md                           |    3 
 03_ubisoft_services/03_rest_endpoints.md                   |    1 
 02_internals_of_hyperscape/01_game_files.md                |   35 +++++
 05_scapegoat/README.md                                     |    3 
 04_rendezvous/02_connections_to_rendezvous_servers.md      |    1 
 03_ubisoft_services/05_ubiservices_links_to_rendezvous.md  |    1 
 03_ubisoft_services/02_accessing_ubiservices.md            |    3 
 03_ubisoft_services/README.md                              |    3 
 04_rendezvous/01_rmc_protocols/loginprotocol.md            |   50 ++++---
 README.md                                                  |   12 +
 /dev/null                                                  |    0 
 02_internals_of_hyperscape/03_login_screen.md              |    8 +
 04_rendezvous/01_rmc_protocols/cloudserversprotocol.md     |   36 ++++++
 01_general_information/01_game_versions.md                 |    1 
 04_rendezvous/01_rmc_protocols/apexantitoxicityprotocol.md |    9 +
 05_scapegoat/01_overview.md                                |    1 
 02_internals_of_hyperscape/02_game_settings.md             |    6 +
 04_rendezvous/05_rmc_protocol.md                           |   86 ++++++++------
 25 files changed, 239 insertions(+), 64 deletions(-)

diff --git a/01_general_information/01_game_versions.md b/01_general_information/01_game_versions.md
index e69de29..c205f96 100644
--- a/01_general_information/01_game_versions.md
+++ b/01_general_information/01_game_versions.md
@@ -0,0 +1 @@
+# General Information: Game Versions
\ No newline at end of file
diff --git a/01_general_information/README.md b/01_general_information/README.md
new file mode 100644
index 0000000..af3066d
--- /dev/null
+++ b/01_general_information/README.md
@@ -0,0 +1,3 @@
+# General Information
+
+General information about the game, essentially a wiki for the game on a surface-level. For understanding the game in closer depth, check out the [Internals of Hyperscape](../02_internals_of_hyperscape) folder.
\ No newline at end of file
diff --git a/02_internals_of_hyperscape/01_game_files.md b/02_internals_of_hyperscape/01_game_files.md
new file mode 100644
index 0000000..94562f9
--- /dev/null
+++ b/02_internals_of_hyperscape/01_game_files.md
@@ -0,0 +1,35 @@
+# Internals of Hyperscape: Game Files
+
+## `Hyperscape.exe`
+
+### Detect It Easy information
+
+| Property         | Value                                                                                                                                            |
+|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
+| Operation system | `Windows(Vista)[AMD64, 64-bit, GUI]`                                                                                                             |
+| Linker           | `Microsoft Linker(14.16.27027)`                                                                                                                  |
+| Compiler         | `Microsoft Visual C/C++(19.16.27043)[C++]`                                                                                                       |
+| Language         | `C++`                                                                                                                                            |
+| Library          | `Direct3D(9)`                                                                                                                                    |
+| Library          | `Steam`                                                                                                                                          |
+| Library          | `Vulkan`                                                                                                                                         |
+| Tool             | `Visual Studio(2017, v15.9)`                                                                                                                     |
+| Sign tool        | `Windows Authenticode(2.0)[PKCS #7]`                                                                                                             |
+| Protector        | `VMProtect(3.2.0-3.5.0)`                                                                                                                         |
+| (Heur)Packer     | `Compressed or packed data[Imports like VMProtect (v3.2.0-3.5.0) + Sections collision (".UBX") + High entropy + Section 6 (".UBX1") compressed]` |
+| Debug data       | `PDB file link(7.0)`                                                                                                                             |
+| Certificate      | `WinAuth(2.0)[PKCS #7]`                                                                                                                          |
+
+### Launching the Game
+Because the game is normally distributed with BattlEye, the following game flags are required to pass into the executable: `-eac_launcher /belaunch -be` in order to mod the game.
+
+Currently, the only known way of launching the game and being able to attach debuggers and inject dynamic libraries is to use **LumaPlay**, which hijacks [UbiServices](../03_ubisoft_services/03_rest_endpoints.md) APIs to prevent usual restrictions like owning the game from preventing the launch.
+
+### Dumping Imports
+A tool like [VMP3 Import Fix](https://github.com/KuNgia09/vmp3-import-fix) can be used to dynamically fix imports and export a much more manageable executable for reverse-engineering with a decompiler like IDA or Ghidra.
+
+### Debug Builds
+No debug builds are currently known of the game itself, however debug builds and PDBs of libraries like RendezVous have been leaked and have been instrumental in further understanding the game.
+
+> [!INFO]
+> TODO: Explain further
\ No newline at end of file
diff --git a/02_internals_of_hyperscape/02_game_settings.md b/02_internals_of_hyperscape/02_game_settings.md
new file mode 100644
index 0000000..042f5c2
--- /dev/null
+++ b/02_internals_of_hyperscape/02_game_settings.md
@@ -0,0 +1,6 @@
+# Internals of Hyperscape: Game Settings
+
+Game settings are located at `"C:\Users\<your user>\Documents\My Games\Hyperscape\<user id>\GameSettings.ini"`.
+
+> [!INFO]
+> TODO: Explain setting values
\ No newline at end of file
diff --git a/02_internals_of_hyperscape/03_login_screen.md b/02_internals_of_hyperscape/03_login_screen.md
new file mode 100644
index 0000000..bae304f
--- /dev/null
+++ b/02_internals_of_hyperscape/03_login_screen.md
@@ -0,0 +1,8 @@
+# Internals of Hyperscape: Login Screen
+
+When the game is first launched, the first screen after the loading and credits is a "Press any Key" screen, featuring artwork of the current season and where audio is first heard.
+
+## Logging In
+When the any key is pressed, the client begins to make several requests in parallel, but there are some that have since been broken or lost relevance, and thus have acted as blockers in effectively getting past this initial screen.
+
+Firstly, the client attempts to create a session with the UbiServices API, see [Ubisoft Services: Creating a Session](../03_ubisoft_services/04_creating_a_session.md).
\ No newline at end of file
diff --git a/02_internals_of_hyperscape/README.md b/02_internals_of_hyperscape/README.md
new file mode 100644
index 0000000..810b7f2
--- /dev/null
+++ b/02_internals_of_hyperscape/README.md
@@ -0,0 +1,3 @@
+# Internals of Hyperscape
+
+Understanding the game from the inside-out, how game features are implemented and how libraries are used. These pages also serve as something of a guide to start reverse engineering the game yourself, providing a baseline knowledge from the ground up of where things currently stand in researching the game.
\ No newline at end of file
diff --git a/02_reverse_engineering/01_structure_of_game_files.md b/02_reverse_engineering/01_structure_of_game_files.md
deleted file mode 100644
index e69de29..0000000
--- a/02_reverse_engineering/01_structure_of_game_files.md
+++ /dev/null
diff --git a/02_reverse_engineering/02_how_to_start_reverse_engineering.md b/02_reverse_engineering/02_how_to_start_reverse_engineering.md
deleted file mode 100644
index e69de29..0000000
--- a/02_reverse_engineering/02_how_to_start_reverse_engineering.md
+++ /dev/null
diff --git a/03_ubisoft_services/02_accessing_ubiservices.md b/03_ubisoft_services/02_accessing_ubiservices.md
index e69de29..1ee5966 100644
--- a/03_ubisoft_services/02_accessing_ubiservices.md
+++ b/03_ubisoft_services/02_accessing_ubiservices.md
@@ -0,0 +1,3 @@
+# Ubisoft Services: Accessing UbiServices
+
+## Getting a Ticket
\ No newline at end of file
diff --git a/03_ubisoft_services/03_rest_endpoints.md b/03_ubisoft_services/03_rest_endpoints.md
index e69de29..6236239 100644
--- a/03_ubisoft_services/03_rest_endpoints.md
+++ b/03_ubisoft_services/03_rest_endpoints.md
@@ -0,0 +1 @@
+# Ubisoft Services: REST Endpoints
\ No newline at end of file
diff --git a/03_ubisoft_services/04_initial_login_flow.md b/03_ubisoft_services/04_initial_login_flow.md
deleted file mode 100644
index aa2df55..0000000
--- a/03_ubisoft_services/04_initial_login_flow.md
+++ /dev/null
@@ -1 +0,0 @@
-# Ticket
\ No newline at end of file
diff --git a/03_ubisoft_services/04_logging_in.md b/03_ubisoft_services/04_logging_in.md
new file mode 100644
index 0000000..cd713dd
--- /dev/null
+++ b/03_ubisoft_services/04_logging_in.md
@@ -0,0 +1,3 @@
+# Ubisoft Services: Logging In
+
+## Tickets
\ No newline at end of file
diff --git a/03_ubisoft_services/05_ubiservices_links_to_rendezvous.md b/03_ubisoft_services/05_ubiservices_links_to_rendezvous.md
index e69de29..0a92d3a 100644
--- a/03_ubisoft_services/05_ubiservices_links_to_rendezvous.md
+++ b/03_ubisoft_services/05_ubiservices_links_to_rendezvous.md
@@ -0,0 +1 @@
+# Ubisoft Services: UbiServices Links to RendezVous
\ No newline at end of file
diff --git a/03_ubisoft_services/README.md b/03_ubisoft_services/README.md
new file mode 100644
index 0000000..c4e90fb
--- /dev/null
+++ b/03_ubisoft_services/README.md
@@ -0,0 +1,3 @@
+# Ubisoft Services
+
+Documenting the behaviour of the UbiServices API, explaining terms, how the game uses it and giving estimations on how it is implemented on the server. These pages should ultimately provide the information necessary to implement a custom version of the UbiServers API from scratch.
\ No newline at end of file
diff --git a/04_rendezvous/01_protocols/02_cloudserversprotocol.md b/04_rendezvous/01_protocols/02_cloudserversprotocol.md
deleted file mode 100644
index 4a10848..0000000
--- a/04_rendezvous/01_protocols/02_cloudserversprotocol.md
+++ /dev/null
@@ -1,34 +0,0 @@
-## Overview
-
-## Method: `GetDatacenters`
-Fetches a list of available datacenters to the client. Currently unknown exactly what the datacenters are for and whether they contain actual URLs.
-
-### Request
-
-##### Example
-_[Full Request Packet](../../00_packet_dumps/C2S-CloudServersProtocol__GetDatacenters_V1)_
-
-##### Parsing
-The request data is empty for this method.
-
-### Successful Response
-
-> [!NOTE]
-> TODO: Example
-
-##### Parsing
-| Name        | Description                                    | Type                                                                                               |
-|-------------|------------------------------------------------|----------------------------------------------------------------------------------------------------|
-| Datacenters | A list of datacenters available to the client. | [`List`](../03_rendezvous_structure.md#structure-listt)`<`[`Datacenter`](#structure-datacenter)`>` |
-
-## Structure: `Datacenter`
-
-> [!NOTE]
-> TODO: Example
-
-##### Parsing
-| Name     | Description | Type                                                       |
-|----------|-------------|------------------------------------------------------------|
-| String 1 | Unknown.    | [`String`](../03_rendezvous_structure.md#structure-string) |
-| String 2 | Unknown.    | [`String`](../03_rendezvous_structure.md#structure-string) |
-| String 3 | Unknown.    | [`String`](../03_rendezvous_structure.md#structure-string) |
\ No newline at end of file
diff --git a/04_rendezvous/01_rmc_protocols/apexantitoxicityprotocol.md b/04_rendezvous/01_rmc_protocols/apexantitoxicityprotocol.md
new file mode 100644
index 0000000..c244a5b
--- /dev/null
+++ b/04_rendezvous/01_rmc_protocols/apexantitoxicityprotocol.md
@@ -0,0 +1,9 @@
+# RendezVous: RMC Protocols: ApexAntitoxicityProtocol
+
+It is currently unknown exactly what the Apex Antitoxicity Protocol does, however it appears to manage penalties and sanctions for bad conduct.
+
+## Method: `GetPlayerSanctions`
+Currently unknown.
+
+## Method: `ReportPlayerOffense`
+Currently unknown.
\ No newline at end of file
diff --git a/04_rendezvous/01_rmc_protocols/cloudserversprotocol.md b/04_rendezvous/01_rmc_protocols/cloudserversprotocol.md
new file mode 100644
index 0000000..dd738e8
--- /dev/null
+++ b/04_rendezvous/01_rmc_protocols/cloudserversprotocol.md
@@ -0,0 +1,36 @@
+# RendezVous: RMC Protocols: CloudServersProtocol
+
+The Cloud Servers Protocol allows the client to learn about which datacenters are available to connect to for the actual game servers.
+
+## Method: `GetDatacenters`
+Fetches a list of available datacenters to the client. Currently unknown exactly what the datacenters are for and whether they contain actual URLs, or just identifiers.
+
+### Request
+
+##### Example
+The request data is empty for this method.
+
+> [!TIP]
+> Check out a [full request packet dump](../../00_packet_dumps/C2S-LoginProtocol__LoginWithToken_V1) for this call.
+
+### Successful Response
+
+> [!NOTE]
+> TODO: Example
+
+##### Parsing
+| Name        | Description                                    | Type                                                                                    |
+|-------------|------------------------------------------------|-----------------------------------------------------------------------------------------|
+| Datacenters | A list of datacenters available to the client. | [`List`](../03_structure.md#structure-listt)`<`[`Datacenter`](#structure-datacenter)`>` |
+
+## Structure: `Datacenter`
+
+> [!NOTE]
+> TODO: Example
+
+##### Parsing
+| Name     | Description | Type                                            |
+|----------|-------------|-------------------------------------------------|
+| String 1 | Unknown.    | [`String`](../03_structure.md#structure-string) |
+| String 2 | Unknown.    | [`String`](../03_structure.md#structure-string) |
+| String 3 | Unknown.    | [`String`](../03_structure.md#structure-string) |
\ No newline at end of file
diff --git a/04_rendezvous/01_protocols/01_loginprotocol.md b/04_rendezvous/01_rmc_protocols/loginprotocol.md
similarity index 76%
rename from 04_rendezvous/01_protocols/01_loginprotocol.md
rename to 04_rendezvous/01_rmc_protocols/loginprotocol.md
index 8c889d2..8215209 100644
--- a/04_rendezvous/01_protocols/01_loginprotocol.md
+++ b/04_rendezvous/01_rmc_protocols/loginprotocol.md
@@ -1,7 +1,9 @@
-## Overview
+# RendezVous: RMC Protocols: LoginProtocol
+
+The Login Protocol is common among Ubisoft games and is responsible for authenticating users by their [UbiServices ticket](../../03_ubisoft_services/02_accessing_ubiservices.md#getting-a-ticket). Additionally, it provides the server with information about the user's client and game information, and the server can re-direct the client to a more appropriate server.
 
 ## Method: `LoginWithToken`
-Authenticates with the server using a [UbiServices](../../03_ubisoft_services/02_accessing_ubiservices.md) ticket. See [Initial Login Flow](../../03_ubisoft_services/04_initial_login_flow.md) for information on how to obtain one.
+Authenticates with the server using a [UbiServices ticket](../../03_ubisoft_services/02_accessing_ubiservices.md#getting-a-ticket). See [Initial Login Flow](../../03_ubisoft_services/04_initial_login_flow.md) for information on how to obtain one.
 
 ### Request
 
@@ -50,17 +52,18 @@
 00000270  08 00 70 72 75 64 70 3A 2F 00                    ..prudp:/.
 ```
 
-_[Full Request Packet](../../00_packet_dumps/C2S-LoginProtocol__LoginWithToken_V1)_
+> [!TIP]
+> This is just the request data portion of a full packet. Check out a [full request packet dump](../../00_packet_dumps/C2S-LoginProtocol__LoginWithToken_V1) for this call.
 
-> [!NOTE]
+> [!IMPORTANT]
 > While this is a real packet sent, the ticket has been replaced with a dummy for security reasons. The normal ticket is a base64-encoded [JWT](../../03_ubisoft_services/04_initial_login_flow.md#ticket).
 
 ##### Parsing
-| Name                | Description                                                         | Type                                                                |
-|---------------------|---------------------------------------------------------------------|---------------------------------------------------------------------|
-| Token               | Ticket obtained via UbiServices, identifying the connecting client. | [`String`](../03_rendezvous_structure.md#structure-string)          |
-| Client Version Info | Information about the client version                                | [`ClientVersionInfo`](#client-version-info)                         |
-| Diagnostic URL      | Unknown.                                                            | [`Station URL`](../03_rendezvous_structure.md#structure-stationurl) |
+| Name                | Description                                                         | Type                                                     |
+|---------------------|---------------------------------------------------------------------|----------------------------------------------------------|
+| Token               | Ticket obtained via UbiServices, identifying the connecting client. | [`String`](../03_structure.md#structure-string)          |
+| Client Version Info | Information about the client version                                | [`ClientVersionInfo`](#client-version-info)              |
+| Diagnostic URL      | Unknown.                                                            | [`Station URL`](../03_structure.md#structure-stationurl) |
 
 ### Successful Response
 
@@ -68,11 +71,11 @@
 > TODO: Example
 
 ##### Parsing
-| Name                 | Description                                                        | Type                                                                |
-|----------------------|--------------------------------------------------------------------|---------------------------------------------------------------------|
-| User PID             | ID of the user profile that the connected client is identified as. | [`UUID`](../03_rendezvous_structure.md#structure-uuid)              |
-| Protocol URL         | Unknown.                                                           | [`Station URL`](../03_rendezvous_structure.md#structure-stationurl) |
-| Required Redirection | Unknown exactly. Presumably self-explanatory.                      | `bool`                                                              |
+| Name                 | Description                                                        | Type                                                     |
+|----------------------|--------------------------------------------------------------------|----------------------------------------------------------|
+| User PID             | ID of the user profile that the connected client is identified as. | [`UUID`](../03_structure.md#structure-uuid)              |
+| Protocol URL         | Unknown.                                                           | [`Station URL`](../03_structure.md#structure-stationurl) |
+| Required Redirection | Unknown exactly. Presumably self-explanatory.                      | `bool`                                                   |
 
 ## Method: `Register`
 Currently unknown exactly what this method does, although it is called after receiving a successful response from the [LoginWithToken method](#method-loginwithtoken).
@@ -96,15 +99,16 @@
 000000C0  31 35 00                                         15.
 ```
 
-_[Full Request Packet](../../00_packet_dumps/C2S-LoginProtocol__Register_V1)_
+> [!TIP]
+> This is just the request data portion of a full packet. Check out a [full request packet dump](../../00_packet_dumps/C2S-LoginProtocol__Register_V1) for this call.
 
-> [!NOTE]
+> [!IMPORTANT]
 > While this is a real packet sent, local IP addresses have been replaced with dummies for privacy reasons. It is currently unknown how the IP addresses are produced.
 
 ##### Parsing
-| Name         | Description | Type                                                                                                                             |
-|--------------|-------------|----------------------------------------------------------------------------------------------------------------------------------|
-| Station URLs | Unknown.    | [`List`](../03_rendezvous_structure.md#structure-listt)`<`[`Station URL`](../03_rendezvous_structure.md#structure-stationurl)`>` |
+| Name         | Description | Type                                                                                                       |
+|--------------|-------------|------------------------------------------------------------------------------------------------------------|
+| Station URLs | Unknown.    | [`List`](../03_structure.md#structure-listt)`<`[`Station URL`](../03_structure.md#structure-stationurl)`>` |
 
 ### Response
 
@@ -112,7 +116,7 @@
 > TODO: Example
 
 ##### Parsing
-| Name          | Description                                   | Type                                                                |
-|---------------|-----------------------------------------------|---------------------------------------------------------------------|
-| Connection ID | Unknown exactly. Presumably self-explanatory. | `u32`                                                               |
-| Url Public    | Unknown.                                      | [`Station URL`](../03_rendezvous_structure.md#structure-stationurl) |
\ No newline at end of file
+| Name          | Description                                   | Type                                                     |
+|---------------|-----------------------------------------------|----------------------------------------------------------|
+| Connection ID | Unknown exactly. Presumably self-explanatory. | `u32`                                                    |
+| Url Public    | Unknown.                                      | [`Station URL`](../03_structure.md#structure-stationurl) |
\ No newline at end of file
diff --git a/04_rendezvous/02_connections_to_rendezvous_servers.md b/04_rendezvous/02_connections_to_rendezvous_servers.md
index e69de29..f5ff991 100644
--- a/04_rendezvous/02_connections_to_rendezvous_servers.md
+++ b/04_rendezvous/02_connections_to_rendezvous_servers.md
@@ -0,0 +1 @@
+# RendezVous: Connections to RendezVous Servers
\ No newline at end of file
diff --git a/04_rendezvous/03_rendezvous_structure.md b/04_rendezvous/03_structure.md
similarity index 98%
rename from 04_rendezvous/03_rendezvous_structure.md
rename to 04_rendezvous/03_structure.md
index 79a188a..0a0383c 100644
--- a/04_rendezvous/03_rendezvous_structure.md
+++ b/04_rendezvous/03_structure.md
@@ -1,3 +1,5 @@
+# RendezVous: Structure
+
 All types are in little-endian.
 
 ## Common Structures
diff --git a/04_rendezvous/04_prudp_protocol.md b/04_rendezvous/04_prudp_protocol.md
index e69de29..0be0834 100644
--- a/04_rendezvous/04_prudp_protocol.md
+++ b/04_rendezvous/04_prudp_protocol.md
@@ -0,0 +1,15 @@
+# RendezVous: PRUDP Protocol
+
+PRUDP probably stands for: "**P**rotected **R**eliable **U**ser **D**atagram **P**rotocol", as it is designed for adding connections, reliability, encryption and compression to UDP. To do this, it adds [connections](#connections), [ordering](#ordering), [fragmentation](#fragmentation) and [checksums](#checksums).
+
+## Connections
+
+
+
+## Ordering
+
+## Fragmentation
+
+## Checksums
+
+## Packet Format
\ No newline at end of file
diff --git a/04_rendezvous/05_rmc_protocol.md b/04_rendezvous/05_rmc_protocol.md
index f8eaa36..691b4b9 100644
--- a/04_rendezvous/05_rmc_protocol.md
+++ b/04_rendezvous/05_rmc_protocol.md
@@ -1,26 +1,40 @@
-The RMC protocol, standing for **R**emote **M**ethod **C**all, is used to make transactional requests, such that "methods" are called by the client and responses are generated by the server. As seen in HyperScape, this protocol is done over [RendezVous](./03_rendezvous_structure.md) data packets.
+# RendezVous: RMC Protocol
+
+The RMC protocol, standing for **R**emote **M**ethod **C**all, is used to make transactional requests, such that "methods" are called by the client and responses are generated by the server.
 
 RMC itself is designed as a transport for several other application-defined protocols, such that services can send and handle requests through RMC. This means that there's another level deeper to go before we get to application/game data, as each protocol implements its own reading and writing of bytes, although they follow similar patterns and standardised ways.
 
-Here are the currently understood RMC protocols implemented in HyperScape. Some appear to be standard to Ubisoft games as a whole, while others appear to be designed specifically for the game.
+## Official Implementation
+
+As seen in HyperScape, this protocol is done over [RendezVous](./03_structure.md) data packets.
+
+When a request is made, usually in a function going by `<protocol name>Protocol::Call<method name>`, a call context is created and containers in memory for data returned by the server are associated with **return value pointers**, with IDs from `[0, n)`, where n is the number of parameters.
+
+When a response is received, these **return value pointers** are fetched from the call context, and the packet is parsed and data is placed into these pointers.
 
 ## Known Protocols
 
-| Protocol                                                            | Description                                                       | HyperScape-specific? |
-|---------------------------------------------------------------------|-------------------------------------------------------------------|----------------------|
-| [`LoginProtocol`](./01_protocols/01_loginprotocol.md)               | Used for authenticating with an RMC server using a Ubisoft token. | ✖️                   |
-| [`CloudServersProtocol`](./01_protocols/02_cloudserversprotocol.md) | Used for listing datacenters for connecting to game servers       | ✔️                   |
-| ...                                                                 | ...                                                               | ...                  |
+Here are the currently understood RMC protocols implemented in HyperScape. Some appear to be standard to Ubisoft games as a whole, while others appear to be designed specifically for the game.
+
+| Protocol                                                                     | Description                                                       | HyperScape-specific? |
+|------------------------------------------------------------------------------|-------------------------------------------------------------------|----------------------|
+| [`LoginProtocol`](./01_rmc_protocols/loginprotocol.md)                       | Used for authenticating with an RMC server using a Ubisoft token. | ✖️                   |
+| [`CloudServersProtocol`](./01_rmc_protocols/cloudserversprotocol.md)         | Used for listing datacenters for connecting to game servers.      | ✔️                   |
+| [`ApexAntitoxicityProtocol`](./01_rmc_protocols/apexantitoxicityprotocol.md) | Currently unknown, presumably for managing bans and mutes.        | ✔️                   |
+| ...                                                                          | ...                                                               | ...                  |
+
+> [!NOTE]
+> This list is far from complete.
 
 ## Base Packet Format
 
 ##### Parsing
-| Name          | Description                                                                                                                                                 | Type                                                      |
-|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|
-| Packet Length | The total number of bytes in the packet, not including the length itself.                                                                                   | `u32`                                                     |
-| Protocol Name | The protocol service on the server that is responsible for managing this request                                                                            | [`String`](./03_rendezvous_structure.md#structure-string) |
-| Is Request?   | Whether or not this packet is for a _request_.                                                                                                              | `bool`                                                    |
-| ...           | See [Request Packet Format](#request-packet-format) or [Response Packet Format](#response-packet-format) for parsing the packet depending on `Is Request?`. | ...                                                       |
+| Name          | Description                                                                                                                                                 | Type                                           |
+|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------|
+| Packet Length | The total number of bytes in the packet, not including the length itself.                                                                                   | `u32`                                          |
+| Protocol Name | The protocol service on the server that is responsible for managing this request                                                                            | [`String`](./03_structure.md#structure-string) |
+| Is Request?   | Whether or not this packet is for a _request_.                                                                                                              | `bool`                                         |
+| ...           | See [Request Packet Format](#request-packet-format) or [Response Packet Format](#response-packet-format) for parsing the packet depending on `Is Request?`. | ...                                            |
 
 ## Request Packet Format
 
@@ -46,13 +60,13 @@
 ```
 
 ##### Parsing
-| Name           | Description                                                                                                         | Type                                                                                                  |
-|----------------|---------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------|
-| ...            | See [Base Packet Format](#base-packet-format) for parsing the prologue of a request packet.                         | ...                                                                                                   |
-| Call ID        | The nonce token for this call to identify the response associated with this request.                                | `u32`                                                                                                 |
-| Method Name    | The method to call on the server.                                                                                   | [`String`](./03_rendezvous_structure.md#structure-string)                                             |
-| Class Versions | Version information about the data in the request                                                                   | [`List`](./03_rendezvous_structure.md#structure-listt)`<`[`ClassVersion`](#structure-classversion)`>` |
-| ...            | See the respective [protocol and method specification](#known-protocols) to parse and write the rest of the packet. |                                                                                                       |
+| Name           | Description                                                                                                         | Type                                                                                       |
+|----------------|---------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
+| ...            | See [Base Packet Format](#base-packet-format) for parsing the prologue of a request packet.                         | ...                                                                                        |
+| Call ID        | The nonce token for this call to identify the response associated with this request.                                | `u32`                                                                                      |
+| Method Name    | The method to call on the server.                                                                                   | [`String`](./03_structure.md#structure-string)                                             |
+| Class Versions | Version information about the data in the request                                                                   | [`List`](./03_structure.md#structure-listt)`<`[`ClassVersion`](#structure-classversion)`>` |
+| ...            | See the respective [protocol and method specification](#known-protocols) to parse and write the rest of the packet. |                                                                                            |
 
 ### Structure: `ClassVersion`
 Example:
@@ -62,10 +76,10 @@
 00000010  6E 66 6F 00 01 00                                nfo...
 ```
 
-| Name           | Description                                       | Type                                                      |
-|----------------|---------------------------------------------------|-----------------------------------------------------------|
-| Structure Name | The name of the structure to assign a version to. | [`String`](./03_rendezvous_structure.md#structure-string) |
-| Version        | The version of the structure.                     | `u16`                                                     |
+| Name           | Description                                       | Type                                           |
+|----------------|---------------------------------------------------|------------------------------------------------|
+| Structure Name | The name of the structure to assign a version to. | [`String`](./03_structure.md#structure-string) |
+| Version        | The version of the structure.                     | `u16`                                          |
 
 ## Response Packet Format
 
@@ -90,12 +104,12 @@
 ### Successful Response Format
 
 ##### Parsing
-| Name        | Description                                                                                                         | Type                                                      |
-|-------------|---------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|
-| ...         | See [Response Packet Format](#response-packet-format) for parsing the prologue of a successful response packet.     | ...                                                       |
-| Call ID     | The nonce token for the call to associate the response to the request.                                              | `u32`                                                     |
-| Method Name | The method that was called by the client, see note below.                                                           | [`String`](./03_rendezvous_structure.md#structure-string) |
-| ...         | See the respective [protocol and method specification](#known-protocols) to parse and write the rest of the packet. |                                                           |
+| Name        | Description                                                                                                         | Type                                           |
+|-------------|---------------------------------------------------------------------------------------------------------------------|------------------------------------------------|
+| ...         | See [Response Packet Format](#response-packet-format) for parsing the prologue of a successful response packet.     | ...                                            |
+| Call ID     | The nonce token for the call to associate the response to the request.                                              | `u32`                                          |
+| Method Name | The method that was called by the client, see note below.                                                           | [`String`](./03_structure.md#structure-string) |
+| ...         | See the respective [protocol and method specification](#known-protocols) to parse and write the rest of the packet. |                                                |
 
 > [!NOTE]
 > Typically, a `*` is appended to the Method Name in responses for currently unknown reasons. Likely to do with the fact that the response handlers update pointers to data containers created in the original request.
@@ -105,9 +119,9 @@
 ### Unsuccessful Response Format
 
 ##### Parsing
-| Name            | Description                                                                                                        | Type                                                      |
-|-----------------|--------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|
-| ...             | See [Response Packet Format](#response-packet-format) for parsing the prologue of an unsuccessful response packet. | ...                                                       |
-| Error Namespace | The category of error that occurred.                                                                               | [`String`](./03_rendezvous_structure.md#structure-string) |
-| Error Code      | The code of the error in the specified namespace                                                                   | `u16`                                                     |
-| Call ID         | The nonce token for the call to associate the response to the request.                                             | `u32`                                                     |
\ No newline at end of file
+| Name            | Description                                                                                                        | Type                                           |
+|-----------------|--------------------------------------------------------------------------------------------------------------------|------------------------------------------------|
+| ...             | See [Response Packet Format](#response-packet-format) for parsing the prologue of an unsuccessful response packet. | ...                                            |
+| Error Namespace | The category of error that occurred.                                                                               | [`String`](./03_structure.md#structure-string) |
+| Error Code      | The code of the error in the specified namespace                                                                   | `u16`                                          |
+| Call ID         | The nonce token for the call to associate the response to the request.                                             | `u32`                                          |
\ No newline at end of file
diff --git a/04_rendezvous/README.md b/04_rendezvous/README.md
new file mode 100644
index 0000000..9a8e316
--- /dev/null
+++ b/04_rendezvous/README.md
@@ -0,0 +1,19 @@
+# RendezVous
+
+RendezVous is a wide-ranging matchmaking, networking and authentication framework that serves as the basis for much of HyperScape's remote connection and gameplay system.
+
+RendezVous was developed by Quazal, seemingly around 2000, and the technology has since been licensed out to other studios.[[1]](#1) Quazal was purchased by UbiSoft in 2010.[[2]](#2)
+
+At the heart of RendezVous is an extremely customisable, extensible and dynamic system, and serves as much more of a general philosophy with a base implementation than a full library in itself. This makes it very difficult to have a single source of truth for defining RendezVous formats and flows.
+
+Therefore, these pages serve only to explain Ubisoft's use and version of RendezVous, and does not attempt to implement other games' or studios' flavours of the framework. Other wikis and pages exist to do that, such as [Pretendo](https://developer.pretendo.network/home), which implements Nintendo's licensed version and is significantly different to the one described here.
+
+Since RendezVous is so complex, it's unlikely that you would be able to use these pages to understand how to implement a RendezVous stack, however it should provide a solid enough basis for understanding the protocols used and how the game uses them.
+
+#### Footnotes
+
+###### [1]
+https://web.archive.org/web/20180823162719/http:/quazal.com/rendez-vous.htm
+
+###### [2]
+https://www.fasken.com/en/experience/2010/11/ubisoft-acquires-quazal-technologies
\ No newline at end of file
diff --git a/05_scapegoat/01_explaining_scapegoat.md b/05_scapegoat/01_explaining_scapegoat.md
deleted file mode 100644
index e69de29..0000000
--- a/05_scapegoat/01_explaining_scapegoat.md
+++ /dev/null
diff --git a/05_scapegoat/01_overview.md b/05_scapegoat/01_overview.md
new file mode 100644
index 0000000..65ec9e4
--- /dev/null
+++ b/05_scapegoat/01_overview.md
@@ -0,0 +1 @@
+# Scapegoat: Overview
\ No newline at end of file
diff --git a/05_scapegoat/02_build_and_use_scapegoat.md b/05_scapegoat/02_build_and_use_scapegoat.md
index e69de29..1e73435 100644
--- a/05_scapegoat/02_build_and_use_scapegoat.md
+++ b/05_scapegoat/02_build_and_use_scapegoat.md
@@ -0,0 +1 @@
+# Scapegoat: Build and Use Scapegoat
\ No newline at end of file
diff --git a/05_scapegoat/03_install_and_use_scapegoat.md b/05_scapegoat/03_install_and_use_scapegoat.md
index e69de29..017c383 100644
--- a/05_scapegoat/03_install_and_use_scapegoat.md
+++ b/05_scapegoat/03_install_and_use_scapegoat.md
@@ -0,0 +1 @@
+# Scapegoat: Install and Use Scapegoat
\ No newline at end of file
diff --git a/05_scapegoat/README.md b/05_scapegoat/README.md
new file mode 100644
index 0000000..5d43ea7
--- /dev/null
+++ b/05_scapegoat/README.md
@@ -0,0 +1,3 @@
+# Scapegoat
+
+Information on how to install Scapegoat, its goals and how to contribute. The goal here isn't to explain how Scapegoat works internally, as that can change drastically and quickly.
\ No newline at end of file
diff --git a/README.md b/README.md
index 58d0603..2be9f45 100644
--- a/README.md
+++ b/README.md
@@ -7,8 +7,10 @@
 
 Browse individual folders to find a page to read, or check out some of these good starting
 points:
-- [Getting Started on Reverse Engineering](02_reverse_engineering/02_how_to_start_reverse_engineering.md)
-- [UbiServices Login Flow](03_ubisoft_services/04_initial_login_flow.md)
-- [RendezVous Structure](04_rendezvous/03_rendezvous_structure.md)
-- [Explaining Scapegoat](05_scapegoat/01_explaining_scapegoat.md)
-- [Installing and Using Scapegoat](05_scapegoat/03_install_and_use_scapegoat.md)
\ No newline at end of file
+- [Reverse Engineering: Getting Started on Reverse Engineering](02_reverse_engineering/02_how_to_start_reverse_engineering.md)
+- [Ubisoft Services: Creating a Session](03_ubisoft_services/04_creating_a_session.md)
+- [RendezVous: RendezVous Structure](04_rendezvous/03_structure.md)
+- [Scapegoat: Overview](05_scapegoat/01_overview.md)
+- [Scapegoat: Installing and Using Scapegoat](05_scapegoat/03_install_and_use_scapegoat.md)
+
+If you're looking to reverse-engineer the game yourself, check out the [Internals of Hyperscape](./02_internals_of_hyperscape) pages.
\ No newline at end of file

--
Gitblit v1.10.0