Skip to content

Package Metadata

Describes items common in all Reloaded3 packages

Inside each package folder is a file named package.toml; which stores the metadata of each package.

Type Name Description
string Id A name that uniquely identifies the package.
string Name Human friendly name of the package.
string Author Main author of the package. (Individual or Team Name)
string Summary Short summary of the package. Max 2 sentences.
PackageType PackageType Type of the package. See PackageType for possible values.
string DocsFile [Optional] Entry point for this package documentation.
SemVer Version Semantic versioning version of the package.
string LicenseId SPDX License Identifier
string[] Tags Used to make searching easier within mod managers.
Credit[] Credits [Optional] Stores information about who contributed what to the project.
string? SourceUrl [Optional] Link to source code (if applicable).
string? ProjectUrl [Optional] Link to website to learn more about the project.
UpdateData UpdateData Stores package specific update information.
DependencyInfo[] Dependencies Stores information about this package's dependencies.
DateTime Published The time when this package was packed.
StoragePreference StoragePreference Specifies the preferred storage tier for the package.
IgnoredDiagnostic[] IgnoredDiagnostics List of diagnostics to ignore as false positives.

Implicit Fields

Some items are stored as separate files:

  • license: License file, located in package/license.md.
    • This is used if LicenseId is not specified.
  • changelog: Changelog file(s), located in package/changelog/*.md.
  • description: Description file, located in package/description.md.
  • config: Configuration schema for the package, located in config.toml.

Example Config

Any links, IDs here are sample data and not real.

Example game support mod.

Id = "reloaded3.gamesupport.persona5royal.s56"
Name = "Persona 5 Royal Support"
Summary = "Provides Essential Functionality for Persona 5 Royal."
Author = "Sewer56"
PackageType = "Mod"
DocsFile = "index.html"
Version = "1.0.1"
Tags = ["Utility", "Library"]
SourceUrl = "https://github.com/Sewer56/persona5royal.modloader"
ProjectUrl = "https://sewer56.dev/persona5royal.modloader/"
Published = 2023-06-08T12:34:56Z
ClientSide = false

# Mod Fields
Icon = "icon.jxl"
IsLibrary = false
SupportedGames = ["game1", "game2"]

[[Credits]]
Name = "Sewer56"
Role = "Main Developer"
Url = "https://github.com/Sewer56"

[[Credits]]
Name = "AnimatedSwine37"
Role = "BF Emulator & Maintenance"
Url = "https://github.com/AnimatedSwine37"

[[Credits]]
Name = "LTSophia"
Role = "PAK Merging"
Url = "https://github.com/LTSophia"

[[Credits]]
Name = "SecreC"
Role = "SPD Merging Support"
Url = "https://github.com/Secre-C"

[[Credits]]
Name = "berkayfeci"
Role = "GamePass EXE Detection"
Url = "https://github.com/berkayfeci"

[[Credits]]
Name = "SirGamers"
Role = "Adding Missing Features to Documentation"
Url = "https://github.com/SirGamers"

[[Credits]]
Name = "Atlus"
Role = "Original Game Developer"

[UpdateData]
[UpdateData.GameBanana]
ItemType = "Mod"
ItemId = 408376

[UpdateData.GitHub]
UserName = "Sewer56"
RepositoryName = "reloaded3.gamesupport.persona5royal"

[UpdateData.Nexus]
GameDomain = "persona5"
Id = 789012

[UpdateData.NuGet]
DefaultRepositoryUrls = [
   "http://packages.sewer56.moe:5000/v3/index.json"
]
AllowUpdateFromAnyRepository = false

[[Dependencies]]
Id = "reloaded3.utility.reloadedhooks.s56"
Name = "Reloaded3 Hooking Library"
Author = "Sewer56"
[Dependencies.UpdateData]
[Dependencies.UpdateData.GitHub]
UserName = "Reloaded-Project"
RepositoryName = "reloaded3.utility.reloadedhooks"

[[Dependencies]]
Id = "reloaded3.utility.sigscan.s56"
Name = "Reloaded3 Signature Scanning Library"
Author = "Sewer56"
[Dependencies.UpdateData]
[Dependencies.UpdateData.GitHub]
UserName = "Reloaded-Project"
RepositoryName = "reloaded3.utility.sigscanrs"

[[Dependencies]]
Id = "reloaded3.api.crimiddleware.filesystemv2.modloader.s56"
Name = "CRI File System V2 Mod Loader"
Author = "Sewer56"
[Dependencies.UpdateData]
[Dependencies.UpdateData.GitHub]
UserName = "Sewer56"
RepositoryName = "reloaded3.api.crimiddleware.filesystemv2.modloader"

# Mod Structs
[[Gallery]]
FileName = "screenshot1.jxl"
Caption = "Gameplay screenshot 1"

[[Gallery]]
FileName = "screenshot2.jxl"
Caption = "Gameplay screenshot 2"

[Targets]
[Targets."win-x64"]
any = "reloaded3.gamesupport.persona5royal.dll"
x64-v2 = "reloaded3.gamesupport.persona5royal.v2.dll"
x64-v3 = "reloaded3.gamesupport.persona5royal.v3.dll"

Id

A name that uniquely identifies the package.

Must be a valid Windows & Unix file name.

This format is designed to minimize collisions while providing a human-readable name.

The suggested format to use for names is game.type.subtype.name.author.

  • game see Game 'Id' for more info.
  • type name should ideally match category of the package on a site like GameBanana or NexusMods.
  • subtype [Optional] provides additional information about the item.
  • name unique name for the package. Can use another . dot if additional info is needed.
  • author primary package author (prefer abbreviated).

Example(s):

  • No Subtype: sonicheroes.skins.seasidehillmidnight.s56
  • With Subtype: sonicheroes.skins.seasidehill.midnighthill.s56

Use lowercase, no spaces, no special characters.

The author field may be omitted, if e.g. creating GitHub repositories.

It's only there to avoid conflicts.

Universal Mods

Note

For mods that are non-game specific such as backends; set the game identifier as reloaded3 and use one of the following.

Type Description Example
backend For backends. reloaded3.backend.coreclr.s56
api For middleware/API hooks. reloaded3.api.windows.vfs.s56
game support For game support mods. reloaded3.gamesupport.persona5royal.s56
utility For utility mods with reusable code. reloaded3.utility.hooks.s56

Server can choose whether to show non game-specific mods (reloaded3 id) on a specific game's page or not.

Diagnostics

For diagnostics, use the format: reloaded3server.diagnostic.game.name.author

Type Description Example
diagnostic For diagnostics. reloaded3server.diagnostic.general.textureoptimizer.s56

Translations

For translations, append the language code to the package name.

In the form tl-{code}.

For example, for the package name reloaded3server.diagnostic.general, use the name reloaded3server.diagnostic.general.tl-de.

PackageType

Represents the type of the package.

PackageType is an enumerable with the following possible values:

This field helps identify the purpose and nature of the package.

TODO: Link the other package type pages when complete.

DocsFile

Stores the documentation entry point in package/docs folder.

See Docs for more details.

Version

Reloaded Packages use Semantic Versioning.

This is required for update support, and consistency.

Warning

For legacy/foreign packages with non-semver versions, we will use 0.0.0.{originalVersion}. Stripping all spaces and/or invalid characters.

Tags

Used to make searching within mod managers easier; i.e. filter by tag.

These are completely arbitrary, up to end users.

Mod Tags

The default set of suggested tags include:

Tag Name Description
GUI/HUD Any 2D element on the screen.
Stage/Level Self explanatory.
Character Playable characters.
3D Model Any non-Player 3D model.
Pack Compilation of several mods.
Sound Effect Sound effects.
Music Music to enjoy.
Texture Texture overhauls.
NSFW Not safe for work.

Credits

Stores information about who contributed what to the project.

This field may also include credits to the original devs for ported content, and/or any other relevant information.

Each credit uses a Credit structure with following fields:

Type Field Name Description
string Name Name of the person or group.
string Role What the person or group did.
string Url [Optional] Link to the person's website or profile.

Update Data

Info

Information tied to Reloaded3's update library.

This info is stored in a way that avoids direct dependency on Update library by using an Abstractions package.

Note

This section might be moved to dedicated Update library section.

Type Name Description
GameBananaUpdateInfo GameBanana Info on how to update from GitHub.
GitHubUpdateInfo GitHub Info on how to update from GameBanana.
NexusUpdateInfo Nexus Info on how to update from Nexus.
NuGetUpdateInfo NuGet Info on how to update from NuGet.

GameBanana Update Info

Type Name Description
string ItemType Type of item on GameBanana API, e.g. 'Mod', 'Sound', 'Wip'
int ItemId Id of the item on GameBanana, this is the last number in the URL to your mod page; e.g. 150115 if your mod URL is https://gamebanana.com/mods/150115.

GitHub Update Info

Type Name Description
string UserName The user/organization name associated with the repository to fetch files from.
string RepositoryName The name of the repository to fetch files from.
bool AssetFileName [Optional] Pattern for the file name to download if no metadata file is found.
bool UseReleaseTag [Optional] If true, uses the release tag to denote version of the package as speedup.

The field AssetFileName is provided for backwards compatibility only. e.g. *update.zip will look for any file ending with update.zip

Nexus Update Info

Implementation delayed until API allows non-premium members to generate download links.

Type Name Description
string GameDomain The ID/Domain for the game. e.g. 'skyrim'
int Id Unique id for the mod.

NuGet Update Info

Type Name Description
string[] DefaultRepositoryUrls List of NuGet URLs/repos this mod can update from.

Dependency Info

The dependency resolution strategy is to simply copy update info of all dependencies into this structure.

Justification:

  • Helps resolve mods if missing.
  • Ensures user downloads same as mod author used.
    • This improves consistency.
    • And improves overall security.

We cannot unfortunately guarantee there's only ever 1 mod with a given ID uploaded to a website. A malicious attacker could try to upload a mod with an existing ID to 'take over' an existing package. We avoid this by ensuring the user downloads the same version as the mod author used.

DependencyInfo is defined as:

Type Name Description
string Id Unique ID of the dependency.
string Name Human friendly name of dependency.
string Author Name of the dependency author.
UpdateData UpdateData Stores mod update specific information.

All of these fields are copied from the dependency packages.

This struct contains only the info needed to locate the dependency, and troubleshoot if a dependency is missing.

Published

This is the time in which the package containing this mod was compressed.

This value is autogenerated when packing file.

This is used to show when the package was last updated in mod managers and other visual applications.

Storage Preference

Specifies the preferred storage tier for the package.

The StoragePreference field is an enum that indicates where the package should be stored, based on the storage speed. It can have the following values:

  • FASTEST: The package should be stored on the fastest available storage (e.g. SSD).
  • SLOWEST: The package can be stored on slowest storage (e.g. HDD) without significant performance impact.

The values are represented as integers ranging from 0 to 255, with 0 being the fastest and 255 being the slowest. We currently use only two values: FASTEST (0) and SLOWEST (255).

Ignored Diagnostics

Specifies a list of diagnostics to ignore as false positives.

The IgnoredDiagnostics field is an array of IgnoredDiagnostic structures that contain information about diagnostics that should be ignored for the package.

This is useful when a diagnostic is incorrectly triggered for a specific package, and you want to suppress it.

The IgnoredDiagnostic structure has the following fields:

Type Name Description
string Id The ID of the diagnostic to ignore. Should match the format specified in the Diagnostics documentation.

Example:

[[IgnoredDiagnostics]]
Id = "R3.S56.PKGTIER-01"

[[IgnoredDiagnostics]]
Id = "R3.S56.TEXTUREOPT-02"

In this example, the package will ignore the R3.S56.PKGTIER-01 and R3.S56.TEXTUREOPT-02 diagnostics, treating them as false positives.

If the IgnoredDiagnostics field is not specified or is an empty array, no diagnostics will be ignored.