AyeZeeBB abdda77946 Give each mod archive its own index; unblock launches and saves
Mod archives (Engine/Vfs/mod_merge*)
- A free archive index no longer has to sit at or below the highest index
  the layout already declares. The engine keeps archives in a table keyed
  by layer, install chunk and a 16-bit index, with no range to stay
  inside; what it cannot survive is a reference to an archive the layout
  never declared. Indices are taken lowest first, per package directory.
- So a mod that collides takes an index of its own and its file is hard
  linked rather than concatenated, and no two mods share one archive's
  4 GB of addressable bytes. Sharing is left for a mod added while the
  game runs, which has no declared index to take, and for a directory
  with no index left.
- A placement addresses its payload with a 32-bit offset, so both append
  paths now refuse to cross 4 GB instead of wrapping round and pointing
  the game at some other payload: CasStore::write fails with the archive
  that is full, and the live-apply path checks archive 1's size plus the
  mod's before appending and asks for a restart, which gives the mod an
  archive of its own anyway.

Injection through a hooked LoadLibraryW (Engine/Core/Platform)
- A player could not launch at all: "Child LoadLibraryW entry bytes match
  neither Windows' kernel32 file nor this process". Anti-virus and
  overlays hook the entry with a jump to a per-process trampoline, so the
  bytes differ in the launcher and in the child and neither comparison
  could match. The guard already allowed the same hook when both
  processes carried it identically, so it refused on an accident of how
  the hook was written rather than on intent.
- inline_jump_length recognises the forms a hooking engine writes (rel32
  jmp or call, push/ret, jmp [rip], mov rax/jmp rax, short jmp). When one
  is present and every byte after it still matches the clean kernel32
  file, the launch goes ahead: the body is Windows' own, and the provider
  image already matched on timestamp, checksum and size. A wholesale
  replacement is still refused, and now says so.
- The failure names the modules loaded into Skate that came from neither
  Windows nor the game folder, instead of guessing at "security
  software". An accepted hook is logged as a warning with the same list.

Launching (Launcher/launch.cpp)
- Exporting loose scripts is a convenience, and a folder that would not
  take it was failing the whole launch: fs::create_directories threw and
  nothing caught it. The export is skipped, RESKATE_LOOSE_FILES goes to
  0 so the runtime does not look for files that are not there, and Skate
  starts. Someone whose install is under Program Files can play; only
  editing loose scripts is lost.

Failures worth reading (Launcher/problem.h)
- A hooked LoadLibraryW, a refused write and ERROR_ELEVATION_REQUIRED
  each explain themselves now. Windows reports the last two in the user's
  own language -- "Zugriff verweigert", "La operación solicitada requiere
  elevación" -- so the rules key on the operation names and the error
  number, which are never translated.

Saved skaters (Extension/Customization, Extension/Profile)
- Outfits stopped saving and every slot showed the standard skater. The
  load hook marks a preset blocked on entry and clears it only on a full
  success, so a load refused for a catalog that was not ready yet left
  the preset blocked for the session and every later save was refused as
  previous_load_rejected. The game asks once per level load and does not
  ask again, so one lost race cost a skater until a restart. Logs show
  the catalog arriving three seconds after the refused load, at startup
  and again on a map switch 17 minutes later.
- The record is remembered in CosmeticRuntime::pending_loads and applied
  by retry_pending_cosmetic_loads from the customization pump, which
  already waits for refresh_cosmetic_catalog. The preset stays blocked
  until a load really succeeds, so nothing is written over the outfit on
  disk.
- Those records belong to the loadout manager's array, which can be
  replaced in between, so each pointer is checked against the live array
  exactly as a save checks one -- manager current, begin/end sane, 0x48
  stride, at most 10 records, in range and aligned. A record that no
  longer belongs is dropped as retry_record_moved rather than written
  through.
2026-10-03 18:30:28 -05:00
2026-10-02 14:40:41 -05:00
2026-10-02 14:40:41 -05:00
2026-10-02 14:40:41 -05:00
2026-10-02 14:40:41 -05:00
2026-10-02 23:08:12 -06:00
2026-10-02 14:40:41 -05:00
2026-10-02 14:40:41 -05:00
2026-10-02 14:40:41 -05:00
2026-10-02 14:40:41 -05:00
2026-10-02 14:40:41 -05:00
2026-10-02 14:40:41 -05:00

ReSkate

play it offline, host your own lobbies and dedicated servers, and mod it. the launcher, the runtime that loads into the game, and the dedicated server.

ReSkate is a fan project. It is not affiliated with or endorsed by Electronic Arts or Full Circle. You need your own copy of skate. on Steam.

Features

  • Offline play. No EA servers needed. Your skater, outfits, unlocks and progress are saved on your PC, and the game runs even with Steam closed.
  • Multiplayer.
    • Host a Steam lobby for up to 32 players: public, or joined with a code, with an optional password. Everyone in a lobby is in one party.
    • Join dedicated servers from the in-game server browser.
    • Proximity voice chat, and text chat with emotes and an optional bad-word filter.
    • Parties on dedicated servers: invite, join, leave, promote.
    • Throwdowns with other players (Jam, Spot Battle and S.K.A.T.E.), and co-op challenges.
  • In-game menu and console.
    • Map and fast travel.
    • World: time of day, population, district levels, rotating parks.
    • The Park Editor: place, move and save objects with freecam, snapping and undo.
    • Skater options: first person, movement, boosts, noclip.
    • Progression, controls, graphics and multiplayer settings.
  • Mods.
    • Drop a mod in Mods/ and it is merged into the game at launch. Mods can add custom maps, loading screens, cosmetics and scripts.
    • Browse and install mods from the Thunderstore community in the launcher.
    • Most mod changes apply in game without a restart.
  • Launcher.
    • Checks that you have the supported game build, and can download exactly that build with your Steam account.
    • Keeps ReSkate itself up to date.

Getting started

  1. Download the latest ReSkate-<version>.zip from Releases.
  2. Extract ReSkateLauncher.exe and ReSkate.dll into either folder:
    • your skate. folder, beside Skate.exe (Steam → skate. → Manage → Browse local files); or
    • an empty folder, where the launcher installs the game for you (about 14 GB).
  3. Run ReSkateLauncher.exe.
    • It checks for ReSkate updates, then checks the game files against the supported build.
    • If the game is missing, or Steam has updated it past the supported build, sign in when asked. You can scan a QR code with the Steam app, or use your username and password with Steam Guard. It then downloads only the files it needs.
  4. Press PLAY.

ReSkate supports one game build at a time (Steam build 25414733).

Controls

Key Opens
Insert the ReSkate menu
~ (grave/tilde) the command console (help lists the commands)
T chat, in multiplayer

The menu and console keys can be changed in the launcher's Settings.

Where things are

What Where
Mods Mods\<mod name>\ beside Skate.exe, ordered by Mods\mods.json
Logs logs\ReSkate.log beside Skate.exe
Profile (skater, progress, parks) %LOCALAPPDATA%\ReSkate\profiles\offline\
The game's own settings and saves %LOCALAPPDATA%\ReSkate\Game\ (kept apart from the normal game)
Launcher settings ReSkateLauncher.settings.json beside the launcher

Mods

  • Install mods from the launcher's MODS page: browse Thunderstore, or drag a .zip or folder onto the window.
  • In game, the MODS tab of the ReSkate menu (Insert) turns mods on and off and applies the changes.
  • Mods are checked against the game build they were made for. Outdated mods, or mods that can't be merged cleanly, are left out with a message naming them, and the rest still load.

Only install mods you trust. Mods change game data, and custom scripts can run code.

Dedicated servers

ReSkateServer.exe is a headless lobby that needs neither the game nor Steam installed. It is in the ReSkateServer-<version>.zip of each release. See Server/README.txt for setup, ReSkateServer.json, admin commands, votes and the anti-cheat checks.

Building from source

Requirements

  • Windows 10 or 11, x64.
  • Visual Studio 2022 with the Desktop development with C++ workload (MSVC v143 and a Windows SDK).
  • CMake 3.24 or newer. Visual Studio's C++ CMake tools for Windows component provides one.

All third-party libraries are in the repository, so the build needs no package manager or network access.

Build

From a Developer PowerShell for VS 2022 in the repository folder:

cmake --preset vs2022-x64
cmake --build --preset release --parallel 4

The files are written to build/vs2022-x64/Release/:

File What it is
ReSkateLauncher.exe the launcher (also hosts crash reporting)
ReSkate.dll the runtime the launcher loads into the game
ReSkateServer.exe the dedicated server
ReSkateEmotePacker.exe builds the chat emote pack in assets/emotes

To work in Visual Studio, open build/vs2022-x64/DingoSDK.sln after configuring and select Release | x64.

Running your build

Close the game. Copy ReSkateLauncher.exe and ReSkate.dll beside Skate.exe, then run the launcher.

Local builds never replace themselves. They only report that an update exists, so a release can't overwrite the DLL you are testing.

Useful launcher flags:

Flag Effect
--no-gui start the game straight away, without the launcher window
--no-update skip the update check
--offline play offline, without Steam running
--windowed, --width=N, --height=N windowed mode and its size
--log-level=<trace|debug|info|warning|error> how much ReSkate.log records
--menu-key=0x2D, --console-key=0xC0 menu and console keys (virtual-key codes)
--no-loose-files ignore loose Lua and config files beside the game
--gpu-diagnostics record extra detail when the graphics driver crashes (DRED)

CMake options

Option Default Effect
DINGOSDK_VERSION 0.0.0 version stamped into the binaries
DINGOSDK_LAUNCHER_AUTO_UPDATE OFF let the launcher replace itself and ReSkate.dll, and the server replace itself (release builds)
DINGOSDK_RELEASE_REPO Dingo-Shenanigans/ReSkate public GitHub repository whose latest release carries launcher.json and the files it pins
DINGOSDK_BACKTRACE_URL the project's endpoint Backtrace minidump submission URL; empty turns crash uploads off
DINGOSDK_TEST_GAME_ROOT empty a Skate folder, for the tests that read real game data

Tests

Each module keeps its regression tests in a Test/ folder. Turn them on with any of DINGOSDK_BUILD_MULTIPLAYER_TESTS, DINGOSDK_BUILD_LAUNCHER_TESTS, DINGOSDK_BUILD_PARK_EDITOR_TESTS and DINGOSDK_BUILD_BACKTRACE_TESTS, then run CTest:

cmake --preset vs2022-x64 -DDINGOSDK_BUILD_MULTIPLAYER_TESTS=ON -DDINGOSDK_BUILD_LAUNCHER_TESTS=ON
cmake --build --preset release --parallel 4
ctest --test-dir build/vs2022-x64 -C Release

The project builds with /W4 /WX: warnings are errors.

Project layout

The source tree loosely follows Frostbite's own layout.

Folder Contents
Engine/Core/ logging, console, JSON, storage, platform helpers, Detours hooks, crash reporting (Debug/)
Engine/Resource/ Frostbite data formats: EBX, TOC, CAS, bundles, shader lookup
Engine/Vfs/ InitFS, the Mods folder, mod merging, the content cache
Engine/Scripting/ custom Lua scripts
Engine/Game/ the game's native ABI and data models
Engine/Game/Build/<build>/ every address, fingerprint and patch tied to one Skate.exe build, as addr::<area>::<name>
Extension/ ReSkate's features, the in-game UI and diagnostics
Runtime/ ReSkate.dll: entry point, startup and exports
Launcher/ ReSkateLauncher.exe
Server/ ReSkateServer.exe
EmotePacker/ ReSkateEmotePacker.exe
External/ third-party libraries, pinned and hashed (see External/README.md)
assets/, config/ files built into the binaries: launcher art, emotes, default profile settings
cmake/ the build, split by area

Supporting a new game build

Feature code never contains addresses. Everything tied to one Skate.exe lives in Engine/Game/Build/<build>/ and in the pins of supported_build.h: file hashes, the Steam depot and manifest, and the content cache. A new game build means a new table and new pins. Most hooks and patches check the bytes they expect before touching them, so code from the wrong build is refused rather than patched.

Crash reports and privacy

When the launcher or the game crashes, ReSkate uploads a minidump and that session's log to the project's Backtrace account, so crashes can be fixed. The log never contains your Steam password or login name.

To turn it off, untick Send crash reports in the launcher's Settings (ADVANCED), or set the environment variable RESKATE_CRASH_REPORTING=0.

Third-party code

ReSkate uses Dear ImGui, Microsoft Detours, RapidJSON, spdlog, SQLite, LZ4, Zstandard, miniz, bcdec and Valve's networking headers, and the Montserrat and Permanent Marker fonts. Versions, licenses and local patches are in External/README.md. Every release ships their license files in licenses/.

License

Copyright © 2026 the ReSkate contributors.

ReSkate's source code is free software: you can redistribute it and modify it under the terms of the GNU General Public License, version 3. If you share a modified ReSkate, share its source code under the same license.

The license covers ReSkate's own code. It does not cover:

  • Third-party libraries and fonts in External/, which keep their own licenses (see External/README.md).
  • The chat emotes in assets/emotes/, which were made by other people.
  • Images of the game (assets/launcher/background.jpg, assets/startup_splash.jpg) and anything else from skate. The game and its content belong to Electronic Arts, and nothing here grants any rights to them.

AI disclosure

Parts of ReSkate, including code, reverse-engineering notes and documentation, were written with the help of AI coding assistants. The maintainers direct and test that work, but AI-written code can contain mistakes like any other. If something looks wrong, please open an issue.

S
Description
No description provided
Readme GPL-3.0
73 MiB
0 Stars 1 Watchers 0 Forks
Languages
C++ 97.7%
CMake 0.9%
HTML 0.4%
Rust 0.3%
Assembly 0.3%
Other 0.3%