Loadouts and Game Versions
The Launcher keeps game files separate from Anomaly.Launcher.exe, can hold multiple SCP:SL builds side-by-side, and groups your mod choices into named loadouts.
Concepts
Section titled “Concepts”- GameRoot - the folder you choose to hold game files, mod cache, loadouts, and, on Linux, Wine prefixes. It is persisted in
%APPDATA%/Anomaly/user.json. - Game version - one installed SCP:SL build, such as
14.2.6, underGameRoot/games/<version>/. - Loadout - a named bundle of one game version, platform-catalog mods with pinned versions, and the
trackAnomalyClientflag. - Mod cache - extracted catalog packages under
GameRoot/mods-cache/<modId>-<version>/, shared by any loadout that uses that package. - Runtime view - the materialized active files for one loadout under
GameRoot/loadouts/<name>/runtime/. - Local mods - user-supplied files under
GameRoot/loadouts/<name>/local/, layered over catalog packages at materialize time.
Anomaly.Client tracking
Section titled “Anomaly.Client tracking”Each loadout has a trackAnomalyClient flag, on by default. When enabled, the Launcher tries to resolve and download the latest Anomaly.Client compatible with the loadout’s game version at launch time.
If resolution fails because the network is down or no compatible release exists, the Launcher logs a warning and still launches the loadout without Anomaly.Client. You can also turn the flag off and pin Anomaly.Client as an ordinary mod, or omit it for vanilla-with-loadout setups.
On-disk layout
Section titled “On-disk layout”GameRoot/|-- games/<gameVersion>/| |-- SCPSL.exe| |-- SCPSL_Data/| |-- version.dll| |-- MelonLoader/| `-- .anomaly_links.json present only while a loadout is linked/running|-- mods-cache/<modId>-<version>/| |-- package.json| |-- Mods/| |-- UserLibs/| `-- UserData/|-- loadouts/<name>/| |-- loadout.json { gameVersion, enabledMods[], trackAnomalyClient }| |-- runtime/| | |-- Mods/| | |-- UserLibs/| | `-- UserData/| `-- local/| |-- Mods/| |-- UserLibs/| `-- UserData/`-- wineprefixes/<loadout>/ native Linux launcher onlyWhat happens at launch
Section titled “What happens at launch”- The Launcher resolves the active loadout and its game version.
- It checks that
GameRoot/games/<version>/exists; if not, install that build first. - For each catalog mod in the loadout, it ensures the package exists in
mods-cache/. - If
trackAnomalyClientis on, the latest compatible Anomaly.Client is added to the effective mod set. LoadoutMaterializerrebuildsloadouts/<name>/runtime/from cached packages andlocal/overrides.- The Launcher links the runtime
Mods/,UserLibs/, andUserData/folders intogames/<version>/. - The game starts from
GameRoot/games/<version>/SCPSL.exe.
On Windows, loadout links are directory junctions created with mklink /J, so they do not require administrator-only symlink privileges. On Linux, the Launcher uses directory symlinks.
The Launcher writes games/<version>/.anomaly_links.json before link activation. On normal exit it removes the active links; on the next launch it also uses the sidecar to clean up stale links from a crash or forced close.
If a real non-empty Mods/, UserLibs/, or UserData/ directory is blocking the link path, the current Launcher migrates its contents into the runtime target before replacing it with the link. Conflicts resolve by last-write time, with the live source file winning ties.
UserData ownership
Section titled “UserData ownership”Mods/ and UserLibs/ are rebuilt every launch from the effective loadout. UserData/ is more careful because it contains user preferences and runtime state:
- Package-managed
UserData/Anomaly/is rebuilt during materialization so shipped overrides update. - Package
UserData/Skins/is user-owned and skipped. - Package
MelonPreferences.cfgandLoader.cfgare skipped. - Package and local
UserData/i18n/<modId>/files overwrite matching files but preserve languages and files absent from the incoming package. - Loadout
local/UserData/files are copied last and can overwrite package-providedUserDatafiles.
Local mods
Section titled “Local mods”Drop hand-built or non-catalog DLLs into GameRoot/loadouts/<name>/local/Mods/. Local files are layered after catalog packages, so a local DLL with the same filename replaces the cached package file for that loadout.
See Local and Dev Mods for the developer workflow.
Migrating from a single-install setup
Section titled “Migrating from a single-install setup”If you upgrade from a Launcher version that kept SCPSL.exe in the same folder as Anomaly.Launcher.exe, the new build detects the legacy layout and offers to migrate:
- Pick a GameRoot.
- The Launcher copies game files into
GameRoot/games/<detected-version>/. - Catalog mods listed in the old install state are snapshotted into
mods-cache/<modId>-<version>/and added to adefaultloadout. - Unknown DLLs in the old
Mods/orUserLibs/folders move intoloadouts/default/local/so dev mods survive the move. - The old folder is left intact unless you opt into cleanup.
If migration is interrupted, rerun it. The migrator copies into the new layout before persisting the GameRoot.
Linux and Steam Deck
Section titled “Linux and Steam Deck”- Steam Deck Gaming Mode or Windows launcher under Proton: add
Anomaly.Launcher.exeas a non-Steam game and force a Proton compatibility tool. The Launcher setsWINEDLLOVERRIDES=version=n,bwhen spawning the game so MelonLoader’sversion.dllinjects under Proton. - Native Linux Launcher: loadout launches shell out to
umu-runfrom umu-launcher, with a per-loadoutWINEPREFIXunderGameRoot/wineprefixes/<loadout>/andPROTONPATH=GE-Proton. Ifumu-runis missing, the Launcher shows a distro-aware install hint for you to run manually.