About
This details the per game metadata stored in the Added Games (User)
(Games/{gameId}
) folder.
TODO: Store Global Configuration Settings
Game config stores all of the user's preferences for launcher/loader behaviour related to a game.
This file is intended to be user editable by hand, thus all files here are in TOML format.
Folder Structure
{gameId}
├── BannerHorz.jxl
├── BannerSquare.jxl
├── BannerVert.jxl
├── Icon.jxl
└── Info.toml
Icons and Banners
If present, the following will be used.
Value | Item | Description |
---|---|---|
Icon.jxl |
Icon | Icon for the game in 1:1 aspect ratio. |
BannerSquare.jxl |
BannerSquare | Grid Square for the game in 1:1 aspect ratio. |
BannerHorz.jxl |
BannerHorz | Horizontal banner for the game. |
BannerVert.jxl |
BannerVert | Vertical banner for the game. |
What's inside an Game Configuration?
This is the specification for Info.toml
This file is intended to be editable by hand, thus is in TOML format.
Type | Name | Description |
---|---|---|
string? | Id | A name that uniquely identifies the game. |
string | Name | User friendly name for the game, e.g. 'Sonic Heroes'. |
Task[] | ExtraTasks | List of extra ways to launch the game. |
AutoCreateShortcutKind | AutoCreateShortcuts | If true, auto creates shortcuts on the desktop. |
StoreInfo | UserStoreInformation | Store specific information for current user. |
MachineSpecificInfo | MachineSpecificInformation | Machine specific information tied to this user. |
Id
A known, standardized name that uniquely identifies this application.
Use lowercase, don't abbreviate.
For example use persona5royal
, not p5r
. Use sonicheroes
, not sh
. etc.
For games without established communities or people experimenting with new titles, this may be left blank.
This ID links the item with the Community Repository. If the community repository has no data for this game, the field will be left blank.
What do I do if the game has no known ID?
The launcher should block publish until a valid ID is set.
On publish the launcher should take the user to a readme page that tells you how to add game to Community Repository. This should be a largely automated step.
New submissions can be made via GitHub PRs to Community repo, or by Discord request. This ensures all shared mods have the same game ID.
There will be a need to introduce a 'rename package ID in loadout' operation
As a new game ID will need injecting into package name.
Name
A user friendly name for the game.
This can be populated from the following sources (in order of preference):
- Game Store Name
- Friendly Name embedded in executable.
- The game's executable name.
The user can overwrite the name if they wish.
AutoCreateShortcuts
If true, shortcuts are automatically created on desktop.
Value | Description |
---|---|
0 | Dont: Never make any shortcuts. |
1 | PromptOnNewMachine: Prompt when on a new PC for the first time. |
2 | Sync: Create a shortcut for each loadout. |
These shortcuts auto launch the game with a specific configuration.
User Store Information
The information tied to the specific store that the user installed the game from.
The StoreInformation
here is NOT copied from the Community Repository.
This is a local copy of the user's store information for the game.
This distinction is important. If we use the Community
store information, we will not know
which store the user bought the game from. This may cause confusion if the user has the game
installed in more than one store.
Machine Specific Info
This contains machine specific information tied to this user.
This structure is defined as: HashMap<EntryID, MachineInfo>
.
Deriving the EntryID
EntryID
is derived as {MachineID}+{UserName}
MachineID
is derived as:
- Linux:
/etc/machine-id
- Windows:
MachineGuid
- This is
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Cryptography
->MachineGuid
- This is
- macOS: TODO
UserName
is well, as the name describes.
MachineInfo
MachineInfo
is defined as:
Type | Name | Description |
---|---|---|
bool | DisplayedCreateShortcutPrompt | Displayed the Create Shortcut prompt. |
string | FriendlyName | Friendly Name for the Machine. |
string | MainExePath | Last path to the main executable. |
string | MainExeHash | Original hash of the main executable. XXH128 |
string | FileHashCacheName | Name of the file containing the File Hash Cache in the 'Games' folder |
DeploymentType | DeploymentType | Dictates how the loader is injected into the game. |
The FriendlyName
is derived from UserName
and MachineName
.
MachineName
is derived as hostname
on Linux/macOS and ComputerName
on Windows.
Usually it's formatted as {UserName}'s {MachineName}
.
The FileHashCacheName
can be any name, but it is generally recommended to use UUID v7
(timestamp + random)
for this. The name should be {UUID}.hashcache
.
DeploymentType
This defines user's preference for how the loader is injected into the game.
Value | Description |
---|---|
0 | Undecided: Default value. |
1 | CodeInjection: Inject code, i.e. Shared Library (DLL) Injection. |
2 | DllHijacking: Place a 'shim' executable to the user's game folder. |
Extended Information
Some additional info is obtained from the Community Repository.
Type | Item | Description |
---|---|---|
Version[] | Versions | Versions of the executable. |
OtherBinary[] | OtherBinaries | Stores information about other executables in game folder you probably don't wanna mod. |
StoreInfo | StoreInformation | Game store specific information. |
ModSourceInfo | ModSourceInformation | Mod source (Nexus/GameBanana/OtherModSite) specific information. |
Diagnostic[] | Diagnostics | Diagnostics to display based on game's current folder state. |
This data is cached in the Server Cache Files
(Cache/Server
) folder."