mirror of
https://github.com/Dingo-Shenanigans/ReSkate.git
synced 2026-10-27 16:17:08 +01:00
AGENTS.md gives agents the build and test commands and the project's rules: one game build for good, addresses only in Engine/Game/Build/20260929 with byte checks, hooks through Engine/Core/Hooks, general SDK APIs with modes as plugins, sandboxed plugin permissions, nothing that unlocks paid items, no EA code in the repository. CLAUDE.md imports it. README's "Supporting a new game build" is now "The supported game build": ReSkate stays on 20260929. STRUCTURE.md and README no longer point at contrib/plugins, which is kept out of the repository.
267 lines
14 KiB
Markdown
267 lines
14 KiB
Markdown
# ReSkate structure
|
|
|
|
How the repository is laid out, what each part builds into, and where a feature's code lives.
|
|
For building and using ReSkate, see [README.md](README.md).
|
|
|
|
## What gets built
|
|
|
|
| Binary | Source | What it is |
|
|
|---|---|---|
|
|
| `ReSkateLauncher.exe` | `Launcher/` | the launcher: updates, Steam sign-in and game download, mods and profiles, starts the game, crash reporting |
|
|
| `ReSkate.dll` | `Runtime/` + `Extension/` + `Engine/` (+ `SpotifyHelper/`) | the runtime the launcher loads into `Skate.exe` |
|
|
| `ReSkateServer.exe` / `ReSkateServer` | `Server/` | the headless dedicated server (Windows and native Linux) |
|
|
| `ReSkateEmotePacker.exe` | `EmotePacker/` | packs `assets/emotes` into the chat emote pack |
|
|
| `dingosdk_builtin_packer` | `BuiltinPacker/` | packs `assets/builtin` into the built-in packs |
|
|
| `dingosdk_*_tests` | each module's `Test/` | regression tests, run with CTest |
|
|
|
|
Internally the project is still called **DingoSDK** (CMake options, target names).
|
|
|
|
## Layering
|
|
|
|
```
|
|
Launcher/ ──launches──▶ Skate.exe ◀──injected── ReSkate.dll
|
|
│
|
|
Runtime/ entry point, startup, per-frame tick, exports
|
|
│
|
|
Extension/ ReSkate's features and UI
|
|
│
|
|
Engine/Game/ native ABI, data models, per-build addresses
|
|
Engine/Vfs/ mods, merging, content cache
|
|
Engine/Resource/ Frostbite formats
|
|
Engine/Core/ logging, console, hooks, crash reports
|
|
│
|
|
External/ third-party libraries
|
|
|
|
Server/ (ReSkateServer) reuses Engine/Core and the multiplayer protocol, not the game.
|
|
```
|
|
|
|
Feature code never holds game addresses: everything tied to one `Skate.exe` build lives in
|
|
`Engine/Game/Build/<build>/` (see [Engine/Game](#enginegame)).
|
|
|
|
## Top level
|
|
|
|
```
|
|
ReSkate/
|
|
├── CMakeLists.txt, CMakePresets.json build entry; presets vs2022-x64, linux-x64, release, linux-release
|
|
├── cmake/ the build, split by area
|
|
├── Engine/ engine-level code shared by the DLL, launcher and server
|
|
├── Extension/ ReSkate's features (in ReSkate.dll)
|
|
├── Runtime/ ReSkate.dll entry point and lifecycle
|
|
├── Launcher/ ReSkateLauncher.exe
|
|
├── Server/ ReSkateServer (dedicated server)
|
|
├── SpotifyHelper/ Rust static library: the game as a Spotify Connect device
|
|
├── EmotePacker/ emote pack tool
|
|
├── BuiltinPacker/ built-in pack tool
|
|
├── External/ vendored third-party code, pinned and hashed
|
|
├── assets/ files embedded into the binaries
|
|
├── config/defaults/ default profile/settings JSON embedded into ReSkate.dll
|
|
├── contrib/ server hosting files, design notes, release script
|
|
├── README.md, MACOS-SETUP.md, MUSIC-SETUP.md, LICENSE
|
|
└── .clangd, .gitattributes, .gitignore
|
|
```
|
|
|
|
## `cmake/`
|
|
|
|
| File | Covers |
|
|
|---|---|
|
|
| `ProjectOptions.cmake` | `DINGOSDK_*` options, version stamping (`reskate_version.h`, `version.rc`) |
|
|
| `Dependencies.cmake` | the `External/` libraries as static targets |
|
|
| `Core.cmake` | `Engine/` libraries: hooks, console core, launcher support, supported build |
|
|
| `Features.cmake` | `Extension/` feature libraries |
|
|
| `UI.cmake` | the ImGui overlay and PlayStation controller input |
|
|
| `Runtime.cmake` | `ReSkate.dll` (`dingosdk_runtime`), including the cargo build of `SpotifyHelper/` |
|
|
| `Apps.cmake` | launcher, server, packer tools, and most test executables |
|
|
| `CrashReport.cmake` | Sentry crash report client/upload, wired into the DLL, launcher and server |
|
|
| `ProfileData.cmake`, `CustomScriptData.cmake` | embed `config/defaults/` and the custom Lua entry |
|
|
| `templates/` | generated headers: version, `version.rc`, crash/update config, profile defaults |
|
|
|
|
## `Engine/`
|
|
|
|
Loosely follows Frostbite's own layout.
|
|
|
|
### `Engine/Core/`
|
|
| Folder | Contents |
|
|
|---|---|
|
|
| `Console/` | command registry and console core |
|
|
| `Debug/` | crash reports: minidumps, report envelope, trace, upload |
|
|
| `Hooks/` | Detours hook helpers |
|
|
| `Json/` | JSON helpers over RapidJSON |
|
|
| `Log/` | spdlog-based logger, log paths, crash/event logging |
|
|
| `Platform/` | process injection, PE helpers, memory and path utilities |
|
|
| `Profiling/` | profiler and sampler |
|
|
| `Storage/` | SQLite save database |
|
|
| `Text/` | chat word filter |
|
|
|
|
### `Engine/Resource/`
|
|
Frostbite data formats: binary bundles, TOC, CAS codec (Oodle/zstd/LZ4), EBX documents (read, write, merge,
|
|
fixup repair), mesh sets, skeletons, textures, material grids, shader lookup.
|
|
|
|
### `Engine/Vfs/`
|
|
The virtual file system and modding pipeline:
|
|
- `initfs`, `game_archives`, `game_bundles`, `game_textures`, `native_db` — reading the game's data.
|
|
- `mod_list`, `mod_catalog`, `mod_item_sources`, `mod_conflicts`, `mod_scoring` — the `Mods/` folder and `mods.json`.
|
|
- `mod_merge*` — merging mods into the game's data (overrides, combine, grid, textures, loading screens, CAS store, scan cache, build stamp).
|
|
- `content_cache*`, `content_catalogs` — the merged-content cache and its install.
|
|
- `thunderstore_package`, `https_download` — Thunderstore packages.
|
|
- `mod_music`, `item_thumbnails`, `world_layer_scan`, `builtin_packs`.
|
|
|
|
### `Engine/Scripting/`
|
|
Custom Lua script support (currently switched off for users).
|
|
|
|
### `Engine/Game/`
|
|
The game's native ABI and plain data models, no hooks:
|
|
|
|
| Folder | Contents |
|
|
|---|---|
|
|
| `Abi/` | native strings, data layouts, transforms, callback queue |
|
|
| `Build/` | `supported_build.h` (hashes, Steam depot/manifest pins), `fingerprint.h`, `image_identity`, `addresses.h` |
|
|
| `Build/20260929/` | one header per area with every address, fingerprint and patch for this `Skate.exe` build, as `addr::<area>::<name>` |
|
|
| `Input/` | controller bindings, PlayStation reports, voice input |
|
|
| `Multiplayer/` | session model and limits, tick/voice/distance settings, role commands, chat rate |
|
|
| `Profile/` | progression, player card, object persistence models |
|
|
| `Rendering/` | draw packets, graphics controls |
|
|
| `Settings/` | named settings, simulation time, multiplayer settings lock |
|
|
| `Skater/` | first person, velocity boost, skater body |
|
|
| `UI/` | game view, menu entries and scale, loading screen selection |
|
|
| `World/` | world model, layers, parks (rotation, randomization, editor), travel, custom level manifest |
|
|
|
|
## `Extension/`
|
|
|
|
ReSkate's features. Each folder is one area; most have a `console_commands.cpp` for its console
|
|
commands and a `Test/` folder.
|
|
|
|
| Folder | Feature |
|
|
|---|---|
|
|
| `Boot/` | offline boot, offline Steam, blocking EA app/services, user-data redirect, startup interventions, Discord presence, fatal dumps |
|
|
| `Assets/` | live mods (apply without restart), loose files, mod layers, multiplayer map download, map icons |
|
|
| `Console/` | built-in console commands, perf commands, memory ledger |
|
|
| `Customization/` | cosmetics catalog, item browser, local customization, player card |
|
|
| `Multiplayer/` | Steam lobbies, sessions, parties, voice and text chat (see below) |
|
|
| `Music/` | local music, playlists and artwork, external players: Spotify, YouTube Music, Plex |
|
|
| `News/` | launcher/game news feed |
|
|
| `Objects/` | object placement and the Park Editor (`ParkEditor/`), park object sets, park mods |
|
|
| `Plugins/` | the Luau plugin host and its `reskate.*` API (see below) |
|
|
| `Profile/` | offline profile storage: skater, progress, missions, objects, preferences |
|
|
| `Progression/` | challenges, entitlements, neighborhood unlocks, fast travel unlock, rip score, board wear |
|
|
| `Rendering/` | graphics controls and labels, display startup, replay export |
|
|
| `ReplayKeyframes/` | replay keyframe curves and settings |
|
|
| `Scripting/` | Lua startup, custom script loader, native blocking |
|
|
| `Settings/` | gameplay/native/user settings, input bindings, engine tweaks, replay drafts |
|
|
| `Skater/` | first person, noclip, free flight, physics tuning, no-bail, AI skaters, x-ray, breakable deck, launches and pad hiding for plugins, trick watch |
|
|
| `Throwdowns/` | native throwdowns, custom (plugin) modes, relay and wire format |
|
|
| `Trainer/` | trick trainer: waypoints, jumps, landings, presets |
|
|
| `Travel/` | location travel |
|
|
| `UI/` | the in-game UI (see below) |
|
|
| `World/` | level loading, loading screens, time/atmosphere, population, park rotation, world layers, engine guards |
|
|
| `AnimationStudio/` | animation core |
|
|
|
|
### `Extension/Multiplayer/`
|
|
| Folder | Contents |
|
|
|---|---|
|
|
| `Net/` | protocol, wire/delta/pose/sound codecs |
|
|
| `Steam/` | lobbies, server browser, transport and lanes, friend join, social |
|
|
| `Session/` | session state, send/receive, parties, commands, rooms, passwords |
|
|
| `Remote/` | remote skaters: native skater spawn, cosmetics, poses, audio, VFX, collision |
|
|
| `Hud/` | nametags, indicators, player UI |
|
|
| `Voice/` | voice capture and playback |
|
|
|
|
### `Extension/UI/`
|
|
| Folder | Contents |
|
|
|---|---|
|
|
| `Overlay/` | the ImGui overlay: the ReSkate menu (Insert) and its pages, console, chat and emotes, Park Editor panels, plugin pages, perf overlay, theme |
|
|
| `NativeMenu/` | pages built into the game's own menu (hub, multiplayer, throwdowns) |
|
|
| `Startup/` | startup window/splash |
|
|
|
|
### `Extension/Plugins/`
|
|
The Luau plugin host. A plugin is a folder in `Mods/` with a `reskate-plugin.json`.
|
|
- `plugin_discovery`, `plugin_manifest` — find and read plugins.
|
|
- `plugin_vm`, `plugin_runtime`, `plugin_host` — the sandboxed Luau VM and plugin lifecycle.
|
|
- `plugin_api*.cpp` — the `reskate.*` API (game, world, UI, more); `plugin_game*`, `plugin_camera`, `plugin_joystick`.
|
|
- `plugin_ui`, `plugin_sound`, `plugin_wave`, `plugin_http`, `plugin_session_feed`, `plugin_wire` — pages, audio, HTTP, multiplayer messages.
|
|
- `plugin_commands` — the `plugin` console command.
|
|
|
|
## `Runtime/`
|
|
|
|
`ReSkate.dll`'s lifecycle: `exports.cpp` (DLL exports), `bootstrap`, `runtime_init`, `runtime_state`,
|
|
`client_context`, `client_tick` (per-frame), `frame_timing`, `level_requests`, `request_scheduler`,
|
|
`menu_entry_hook`, `overlay_callbacks`, `console_bridge`.
|
|
|
|
## `Launcher/`
|
|
|
|
| Files | Contents |
|
|
|---|---|
|
|
| `main.cpp`, `launch` | entry point and starting/injecting the game |
|
|
| `updater` | ReSkate self-update from GitHub releases |
|
|
| `depot_output`, `game_settings` | supported game build download/verification and game settings |
|
|
| `mod_manager`, `mod_profiles`, `thunderstore` | mods, profiles (r2modman-compatible codes and `.r2z`), Thunderstore |
|
|
| `gui*.cpp` | the window: home, mods (browse, profiles), settings, sign-in, changelog, legal, gamepad |
|
|
| `crash_reporter` | crash reporting host |
|
|
| `Test/` | launcher tests |
|
|
|
|
## `Server/`
|
|
|
|
| Files | Contents |
|
|
|---|---|
|
|
| `main.cpp`, `server_engine`, `server_host`, `steam_server` | the server loop and Steam game server |
|
|
| `server_config` | `ReSkateServer.json` |
|
|
| `server_commands`, `server_votes`, `server_party`, `server_parks`, `server_map_update` | admin commands, votes, parties, parks, map updates |
|
|
| `roles.h`, `global_bans`, `server_words` | roles/permissions, bans, word filter |
|
|
| `board_check.h`, `speed_check.h` | anti-cheat checks |
|
|
| `server_plugins` | server-side plugins |
|
|
| `server_update`, `server_release` | self-update |
|
|
| `GUI/` | optional server window |
|
|
| `README.txt`, `README-linux.md`, `README-roles.txt`, `ROLES.md` | server docs |
|
|
| `Test/` | server tests and fixtures |
|
|
|
|
## `SpotifyHelper/`
|
|
|
|
Rust crate (`reskate-spotify`, librespot-based) built by cargo from `cmake/Runtime.cmake` as a static
|
|
library linked into `ReSkate.dll`. It makes the game a Spotify Connect device. Not built in Debug.
|
|
|
|
## `External/`
|
|
|
|
Vendored libraries, versions and hashes in `External/manifest.json` and [External/README.md](External/README.md):
|
|
Dear ImGui, Microsoft Detours, Luau, RapidJSON, spdlog, SQLite, LZ4, Zstandard, miniz, bcdec,
|
|
Valve's Steam networking headers, and fonts (Montserrat, Permanent Marker).
|
|
|
|
## `assets/` and `config/`
|
|
|
|
- `assets/launcher/` — launcher background and icons.
|
|
- `assets/emotes/` — chat emotes (`emotes.json`, `emotes.png`).
|
|
- `assets/builtin/` — built-in packs (`throwdown_menu.zip`).
|
|
- `assets/models/fpv/` — FPV drone model.
|
|
- `assets/*.jpg|png` — splash, music artwork.
|
|
- `config/defaults/` — default `profile.json`, `progress.json`, `settings.json`, `options.json`,
|
|
`challenges.json`, `location-travel.json`, `object-dropper.json`, `news.json`, `manifest.json`.
|
|
|
|
## `contrib/`
|
|
|
|
| Path | Contents |
|
|
|---|---|
|
|
| `pterodactyl/` | Pterodactyl egg for hosting the server |
|
|
| `reskate-server.service`, `setup-linux-server-libs.sh` | Linux server setup |
|
|
| `package_release_zip.py` | packs release zips |
|
|
| `*.md` | design notes for individual features |
|
|
| `Test/` | tests for contrib scripts |
|
|
|
|
Plugin mods (the ports of former built-in features, the test plugins, Fit Check, Animator Studio) are not
|
|
in the repository. Maintainers keep them in `contrib/plugins/`, which is ignored, and
|
|
`dingosdk_plugin_tests` runs the test plugins from there when they are present.
|
|
|
|
A plugin mod's folder looks like:
|
|
|
|
```
|
|
<plugin>/
|
|
├── reskate-plugin.json plugin manifest
|
|
├── manifest.json Thunderstore manifest
|
|
├── plugin/main.lua entry point (+ other modules, tests.lua)
|
|
└── images/, sounds/, data/ optional assets
|
|
```
|
|
|
|
## Tests
|
|
|
|
Tests live in a `Test/` folder beside the code they cover (about 115 files) and build as
|
|
`dingosdk_*_tests` executables. Turn groups on with `DINGOSDK_BUILD_MULTIPLAYER_TESTS`,
|
|
`DINGOSDK_BUILD_LAUNCHER_TESTS`, `DINGOSDK_BUILD_PARK_EDITOR_TESTS`, `DINGOSDK_BUILD_CRASH_REPORT_TESTS`
|
|
and `DINGOSDK_BUILD_PLUGIN_TESTS`, then run `ctest --test-dir build/vs2022-x64 -C Release`.
|