Resolved where main's trainer meets the plugin branch:
- Board Break, the drone, Road Rash, Hall of Meat and Grind Exits are plugins here, so their
built-in code stays deleted: the trainer no longer hands Board Break's wear values back (the
plugin does not tune physics), its QUICK SETTINGS list no longer names Grind Exits or Board
Break, and the drone's debug action and menu are not brought back.
- The trainer's pump power, gravity, revert boost and transition help run beside the plugins'
pushes and velocities on each physics step; both sides' new declarations are kept.
- The game's own pad reads go through game_pad_read (the gamepad filter, Dark Pop's D-pad hiding,
the grind sticks) and then the plugin branch's menu and hidden-button handling.
- The trainer's forced grind settings are noted as the stance like any other value.
Players found the flat ground stutter goes away with Animation timing at 1, so
that is the default now: moving Gravity off 1 gives normal-gravity timing at
once, and the Advanced gravity fold is there to change it. Saved under a new
key (gravity_animation_timing), since 0.8.5 saved its default 0. The gravity
tooltips break into paragraphs.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Players still saw landings stutter on flat ground tricks with Gravity at
x1.31: the game fits a trick into the time to land but cannot hurry a catch
past its own speed, so in a shorter flight the catch is still playing when the
wheels touch. A fold under Gravity adds two levers:
- Animation timing (0 .. 1): the skater's air animations play faster by as much
as the flight is shorter than at the game's gravity (rate hook 0x10dd2f0), so
tricks and landings keep their x1 timing; 0 is the game's own, between part
of the way. Back to the game's rate on landing or when the countdown stops.
- Landing gravity of its own: the gravity the game plans landings with (the
landing searches), the same as Gravity unless set.
Options gravity_timing, gravity_landing_own, gravity_landing; presets carry
them; they let go with Gravity under a host's physics or with boosts off.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Underflip speed: the game holds the underflip's two playback rate controllers
(cdbchooser_onboard_underflips_(pbrate) 1-1.2, ..._toair(pbrate) 0.6-1.2) to a band it
copies into each controller as it is made; the trainer scales that band, and the state
copy that starts the underflip, so the slider sets the whole underflip.
- Underflip part only: the band spans the flip's speed and Underflip speed from the start;
where the board turns back the trainer scales the rate the game computes for its rate
controllers every tick (0x10dd2f0, called by their update 0x10de730) until the landing.
- A speed for each underflip at the bottom of Advanced trick speed (kickflip, heelflip, pop
shuvit, FS pop shuvit and the four impossible underflips), times Underflip speed, and the
Late flip slider beside them.
- Late flip speed in the TRICKS card; dial sliders reach 0; Underflip speed named on the
MODIFIED line and shared by a session's host (session extras version 2).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A preset's dial refused 0 in its box and in `trainer dial` (it works on a log scale). A factor of
0 now sets every value the dial moves to 0; a value that moves the other way stays stock instead
of going to infinity.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011m6eM3ps6bttTbZqo9Gz6Y
The forward, up and off-board up boost speeds defaulted to +20, which counted as not
stock. They now default to 0: the boost adds nothing until a speed is set, and resets
(RESET EVERYTHING, the console resets, restore_debug) put them back to 0.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Forward, up and off-board up boosts take a typed value up to 10000 (sliders still end
at 300 / 25), Revert Boost strength up to x100. Noclip, No Bail, Dark Pop, a boost
that is not +20, Revert Boost, grind exit triggers and Board Break are listed at the
top of QUICK SETTINGS with their values (Go to, Reset), make the SANDBOX line say
MODIFIED, and RESET EVERYTHING turns them back.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Full screen sliders (stepper): a click still steps, press and move slides the
value; a number box beside each (the controller's focus skips it). A typed
value past a slider's end stays there, and stepping does not snap it back.
- No slider end is a limit for a typed number: game speed, return delay, the
full screen value rows (their bar now spans 0 to 4x the game's own), and the
trainer's own limits behind the commands (gravity 0.001 to 1000, flip speed to
1000, pump power and bending boost to 1e6, transition and grind numbers, the
bending rules).
- Help: the 74 named rows that had none now explain themselves; every slider's
explanation shows on hover and in the full screen bottom bar; unnamed rows
say what they are.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The trainer keeps upstream's page and naming (SANDBOX; noclip, No Bail and
the boosts on Skater > Cheats; the full screen controller menu) with its own
TUNE sections, presets card and search inside. The MOVEMENT tab is gone:
`trainer open movement` opens Skater > Cheats, where the Revert Boost rows
now sit. Upstream's Hardcore preset sits beside Realistic; saving
trainer.json and reading the map file stay off the client thread.
Board Break's wear and the trainer no longer undo each other: wear writes
four tuning values itself, and every trainer write used to put them back to
the trainer's copy (and a level loaded on a worn board took them as stock).
board_break::handling_value() tells the trainer what wear wants; values the
player has not changed are handed back to it, their stock is the game's own.
Tests: Hardcore's check follows the sections (topic, not the old lists);
the session test pokes a flip speed past the trainer's own limit (100).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The ReSkate menu now has two styles, switched with View / F11 or the buttons in its top bar
and saved with the profile (`ui fullscreen`):
- Window: the mouse menu as before, with a side rail of pages in groups.
- Full screen: made for a controller, in the pause menu's look. Pages across the top (LB / RB),
each page's sections as the ONLINE page's tabs (LT / RT), button prompts at the bottom, the
pause menu's sounds, and the pause menu's own Multiplayer pages as ONLINE.
The pages are regrouped: HOME (quick switches and a tile for each page), MAP, BUILD, SKATER
(freecam, first person, cheats), SANDBOX (once Trainer), ADDONS (drone, Board Break, Road
Rash, Hall of Meat, grind exits, music), ONLINE, PROGRESS, MODS, SETTINGS, DEVELOPER.
Full screen, every shared control is drawn for a pad: switches and option rows changed with
left / right one step a press, sliders as steppers that repeat when held, rows of buttons,
and pages that scroll with the right stick. Search boxes and typed values stay in the window.
A pad press takes the menu's focus back and hides the pointer until the mouse moves.
Also: map pictures in the map picker (official loading screens, a mod's icon) with a search
box in the window, Splash and Tutorial Island left out of it; number boxes beside the
window's sliders; the binds in groups, with an action bind to open the menu (`menu`); a menu
size for each style (`ui scalefull`); the time of day stepping from the one last asked for.
The trainer's own controller combo for its menu (LB + RB + click the right stick) is also
how you bail. Removed, as standard ReSkate has none: the menu opens with Insert.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Merges ReSkate v2.0.9.
- Wallies (the game's own switch) with their measured numbers; double / triple jump, jump
on release and wipeout bounce on foot; foot flip / spin speeds; no speed limit on foot.
- Flip speed and the per-trick Late flip speed now change late flips; Late flip start /
buffer rows.
- The trainer never changes the game's own settings (GAME SETTINGS rows only show them).
- Dark Pop 3.1 (Sivaes/darkpop, GPL-3.0), saved on and off like No Bail; Revert Boost 2.0.
- The search for the game's values walks memory once and shows in the panel.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Gravity slider (POP AND TRICKS): gravity in the air on the board and on foot.
- TUNE's first section is PRESETS AND QUICK SETTINGS: every kind of preset in one card, and
everything that is changed in one list (change in place, Hide, Go to, Reset).
- trainer setup <key> <value>.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wk6Y7hSKoBANMm9ZHbStLg
TUNE as one page of folding sections, presets above the tabs, Skate 3 grind and
transition feel, Dark Pop, manual pop height, slow flips pop higher, per-trick
speeds, and a release audit of stock / resets / presets. See Extension/Trainer/CHANGELOG.md.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wk6Y7hSKoBANMm9ZHbStLg
PRACTICE > TELEPORT now shows the waypoint the player placed on the
game's pause map, with a "Go to map waypoint" button. The console gets
`trainer waypoint [info]` and `trainer ground <x> <z>`.
Reading the waypoint (trainer_waypoint.cpp)
- It is a point of interest in the map's registry, the one ReSkate's
party markers register into (addr::native_party::map_manager), with
kind DingoMapPOIType_Waypoint (3) and its world matrix at @0.
- The registry is walked only while the TELEPORT card is drawn (the
page notes it, like the class list) or the command runs, every
250 ms at most. A player who never opens the card pays nothing.
- A registry the map has filled without a waypoint means it was
removed; an empty or unreadable one keeps the last waypoint seen. A
new level forgets it.
Landing on the surface (trainer_landing.h)
- The waypoint's height is not the ground: teleporting to it dropped
the skater through the map. local_ground_height() casts the park
editor's downward ray (editor::cast_surface) through the client
physics world and takes the topmost hit.
- The first ray starts at 1500 or 500 above the hint. A custom map
can sit higher than that (a waypoint at Y 12 over ground at Y 1939
was seen in game), so a miss is cast again from 20000.
- If collision there is still streaming in, the teleport goes to the
hint's height and a 12 s watch puts the skater on the surface when
it arrives (at most 6 corrections; the teleport is re-sent up to 3
times if it never arrives).
- Teleports still go through go_to(), so they follow the host's
noclip / teleport permission in a session.
The decisions (ray spans, the watch, remember/forget) have no game in
them and are tested by trainer_landing (DINGOSDK_BUILD_TRAINER_TESTS).
README and CHANGELOG updated.
Follow-ups to the trainer (PR 37), and one multiplayer change.
Off until asked for (Extension/Trainer)
- The jump read-out and the LB+RB controller shortcuts start off. Jumps
are logged only while the read-out or telemetry recording is on, and
trick launches only when the trainer scaled them. A saved trainer.json
keeps what the player chose.
Memory search on demand (trainer.cpp, trainer_classes.cpp)
- The search for the game's tuning classes reads all writable memory.
It ran for every player after a level loaded, and up to seven times
when it found nothing. It now runs only when a class value or the flip
speed is not the game's own (the player's, or a host's they skate
with) or the EVERYTHING list is open, and at most three times a level.
- For those players it runs again on each level, which brings fresh
copies; a search from an earlier level used to count as done.
Guests under enforced physics
- A guest is locked by the session's enforce setting, from the moment
of joining (Engine/Game/Multiplayer/session_physics.h), not by whether
the enforcement status text was set yet.
- A guest's class values no longer come back after a map change.
The host's whole setup reaches its guests (protocol 39)
- Only Gameplay/SkatePhysicsTuning travelled, so a host could push,
sprint or jump further than the guests it held to the game's own.
- New packet physics_extras (30): the host's class values, trick
multipliers and auto push (trainer_session.h), sent when they change
and to players who join later, taken from the host only. A dedicated
server's are the game's own and it ignores the packet.
- Under enforcement a guest's own trick multipliers stand down for the
host's, whatever the boosts switch says. With enforcement off nothing
changes.
- A guest refuses bytes that are not an encoding, holds values to the
trainer's own ranges, and leaves out class values written for another
game build's table.
- protocol_version 38 -> 39: released versions disconnect from a peer
that sends a packet they cannot decode.
Out-of-view players are posed every frame again (Session/session.cpp)
- Players outside the camera's view and past 8 m were sampled at 20 Hz
(b763631). The game's replays record each skater as it stood every
frame and their camera looks anywhere, so those players moved at
20 Hz in replays. Removed; the distance rule (20 Hz past 200 m, 10 Hz
past 350 m) stays. This gives back the client-tick time it saved on
busy servers.
Presets, trick sliders and the values share one screen and one set of values, so a preset
cannot say "on" while a slider says otherwise. Every built-in preset is a dial (1 = the game's
own). Reset everything clears locks and trick sliders too. A player's grinds, pumping, climbing,
vaults and bails confirmed 56 more class values as read by the game (243 of 314).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018szL7EmApPZxh9GK4Phw6x
The game keeps much of its tuning in data-defined classes (push speeds,
everything on foot, dive and glide, bail speeds...). The trainer finds 24 of
them in memory by the defaults and field order the game's data ships and lists
their 314 values by name. Push speed now drives the push class's own speeds;
auto push, off-board jump height and wider trick height ranges come with it.
The Tune tab opens on a Realistic or a Fun short list. Built on ReSkate 1.0.7.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018szL7EmApPZxh9GK4Phw6x
The game's trick scripts launch the no comply and the boneless through its
jump-trajectory setter; the trainer multiplies the launch speed there, told
apart by the physics states around the call. Pushing is scripted too, so the
push tuning values were never read: the top pushing speed is now applied after
each physics step, and push strength is hidden.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The hippy jump's height is set by the game's trick scripts, not by the tuning asset (traced:
no tuning value is read for it). The trainer recognises one starting (riding -> off board,
rising) and scales the off-board upward velocity through the existing off-board velocity
path; a plain dismount is not rising and is left alone.
The jump read-out gains degrees of spin (and the peak rate) and of body tumble. The table of
tuning values the game reads now includes offsets seen in traced play sessions.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Players changed values such as the Mode ollie heights and saw nothing happen: no game code
reads them. trainer_used.inc lists the asset offsets the code was found to read (the asset
pointer, the per-group accessors and the skater's mode pointer were followed); rows without
evidence are hidden by default and marked when shown. The Essentials list and the built-in
presets now only use values with evidence.
Switching one preset off keeps the values of the presets that are still on.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
All new code is in Extension/Trainer. The game thread owns the trainer's state; the menu
page only queues `trainer ...` console commands and reads two snapshots.
- physics_tuning_model keeps the field and curve names the game's EBX carries, so the
editable table is built at run time from the player's own data.
- physics_tuning exports game_tuning / read_live / write_live / refresh_skater, with the
same field whitelist and curve rules as the session sync.
- no_bail publishes the physics state the local skater's selector last chose (air time,
wipeouts).
- A guest under host tuning cannot edit; teleports follow the host's noclip permission.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>