Commit Graph
641 Commits
Author SHA1 Message Date
AyeZeeBB 118c489fdb Plugins: what the Filmer needs as a plugin: carry, who sees a pose, a step in the camera cycle
PR 343's Filmer becomes a Luau plugin mod (kept in contrib/plugins/filmer) on general APIs instead of
its own C++:

- reskate.skater.carry: something held out in one or both hands and aimed, the body crouched (feet
  kept) and hunched over it, turned on the spot after it (Extension/Skater/carry.cpp, from the PR's
  filmer_hold.cpp, with tests)
- shown = "everyone" | "others" | "me" on skater.pose, reach and carry: the pose sent to the other
  players and the one drawn here are split when asked
- reskate.camera.cycle and the camera_cycle event: a plugin's camera as the last step of the camera
  height button's cycle, after first person
- reskate.session.nametags(false) holds the names over the other players off
- board.hide(bone, {others = true}) hides it in the board the others are sent too (a sent-pose filter)
- outfit.set takes hand wear slots; input.bind takes an action with no key of its own
2026-10-22 18:46:49 -05:00
zeex64 8ede361755 Merge pull request #341 from snubroot/fix/item-grid-4096-rows
Customization: item tabs over 1,024 items load instead of showing blank warning triangles
2026-10-22 17:11:08 -05:00
zeex64 e2c188cb75 Merge pull request #342 from moelrobi/plugins/server-parks
Plugins: what a dedicated server's plugins need to run a game mode
2026-10-22 17:02:17 -05:00
snubroot 8e79fd62f5 Customization: item tabs over 1,024 items load instead of showing blank warning triangles
The item browser reads grids up to 4,096 rows, but the native list writer it
publishes them through refused more than 1,024, so a bigger tab failed with
"Native menu list is invalid." every pass. The writer now takes up to 4,096.
2026-10-22 15:02:01 -04:00
Robin MoellerandClaude Opus 5.5 5b10469bad Plugins: server plugins spawn and remove the server's park mods
A dedicated server's park mods could only be spawned from its console, an admin's chat or a vote,
so a server plugin could not bring out the park its game is played in. A new permission,
server.parks, gives a server copy reskate.server.parks(), which lists the park mods set up with
whether each fits the map running now and is spawned (its objects and minutes left), and
reskate.server.park_spawn(name, minutes?) and park_remove(name), which return ok or false and why.

They go through park-mod add and remove, so the park limits, the map check and the chat lines stay
the server's. Their "[parks]" lines are logged "by plugin <id>". A name is a park mod's own (1 to 16
of a-z 0-9 - _) and minutes are 1 to 1440, or none for until removed. Reading the park files is not
part of this: a plugin brings what it needs to know about a park in its own package.

dingosdk_server_plugin_tests spawns and removes a park mod through a plugin and checks what it is
refused; dingosdk_plugin_tests checks the API on a server copy, and that a player's copy and a
plugin without server.parks cannot use it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hs7xxJDf6SDcQUaXnzmtL5
2026-10-22 20:43:01 +02:00
Robin MoellerandClaude Opus 5.5 fd5f95467f Plugins: server plugins know the map and hear it change
On a dedicated server reskate.level.current() was empty and level_loaded and level_unloading never
fired, so a server plugin could not tell which map ran or that it had changed. The server's
plugins are now told the map's level each tick, named as players' games name it (a destination's
level, after its "|"). When the server changes the map, they hear level_unloading for the old one
and level_loaded for the new one, as a game's plugins do; players load it after.

dingosdk_server_plugin_tests checks level.current() and both events across a map change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hs7xxJDf6SDcQUaXnzmtL5
2026-10-22 20:38:22 +02:00
Robin MoellerandClaude Opus 5.5 45d4c64c75 Plugins: a dedicated server's plugins see the skaters
reskate.session.skaters() returned an empty list on a dedicated server: its game for plugins did
not say where anyone was, though the host holds every player's latest pose. A server copy now gets
each player in the world with a pose: their id, the pose's root position, its heading (read as a
client reads it) and how long ago it arrived. A server plugin can now follow players itself, for
a race's checkpoints or a game of tag, instead of trusting what each player's copy reports.

Host::skater_poses() lists them for the plugins. dingosdk_server_plugin_tests drives the host with
simulated players sending poses and checks what a server plugin sees, and that a plugin without
session.skaters is still refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hs7xxJDf6SDcQUaXnzmtL5
2026-10-22 20:30:07 +02:00
AyeZeeBB 45346b122c Plugins: prop hunt APIs, and plugin commands in the console lookup
- reskate.entities.blueprints lists the game's object blueprints (meshes only if asked),
  and reskate.entities.bounds gives a blueprint's box, so a mod can pick a prop by list or at random
- Attached objects take upright, turn and ground (a floor found within reach below), the "root"
  joint, and a 6th options argument with solid; spawned props' bodies are found and ghosted
- reskate.skater.hide, reskate.world.pick, and skater.get gives right and switch
- reskate.console.command takes an optional 4th table of subcommands; the console lookup
  suggests plugin commands word by word, and plugin commands lists the subcommands
- objbody: a test command for finding which body setter takes a prop out of collision
2026-10-22 00:30:06 -05:00
AyeZeeBB c35e9a357b Docs: AGENTS.md for coding agents, and the README says the game build is pinned
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.
2026-10-21 23:19:40 -05:00
AyeZeeBB 721ed9e64d Plugins: a general launch API in place of grind_exit; grind exits is all Lua, and 701 is a grind
The SDK knew grind exits: reskate.skater.grind_exit took a toe/heel/left/right wish, and C++ worked
out the rail's direction, toe and heel from the stance and facing, the 1.8 m/s and the strength.
That logic is now the grind-exits mod's own Lua (plugin/exits.lua, kept on this machine). What has
to run on the physics thread is general:
- Extension/Skater/launches: every launch of the local skater (ollie, grind, no_comply, boneless),
  classified by its call site and the state before it, with the board's direction of travel; the
  `launch` event for plugins with events.skater; reskate.skater.shape_launch(from, {across, along,
  up}) sets those speeds against the travel, one plugin a kind.
- reskate.skater.get() gains `right` (the root's right axis) and `switch` (the game's stance flag).
- Extension/Skater/pad_hide: reskate.input.hide's pad filter, out of the old grind exit file.
Removed: reskate.skater.grind_exit, the grind_exit event, GrindExitWish and GrindPop.

Physics state 701 is a grind too (the game checks it with 400 in about a dozen places; the
2026-10-11 measurement only reached the 400s): pops out of it were dropped, and skater_state called
it "other". Launches, skater_state ("grinding") and the trainer's grind pop all count it now.
Tests: the grind-exits plugin test drives the new path (11 checks of its own).
2026-10-21 21:41:04 -05:00
AyeZeeBB 97793b79fc Build: the Linux server tests link the server plugins, every core compiles, no vcpkg hook
The release script's Linux step failed: dingosdk_server_park_tests and dingosdk_server_lock_tests
build server_host.cpp and server_commands.cpp, which call ServerPlugins since the server Lua API,
without server_plugins.cpp or dingosdk_plugins. Both have them now; the 18 Linux tests pass.
MSVC compiles with /MP instead of /MP4, so a project uses every core rather than four (the
release build's clean ReSkate.dll was the slow part).
A user-wide "vcpkg integrate install" ran its DLL copy after every link with PowerShell 7
("'pwsh.exe' is not recognized"); ReSkate uses no vcpkg packages, and the projects now leave it
out (VCPkgLocalAppDataDisabled).
v2.1.2
2026-10-21 20:59:42 -05:00
AyeZeeBB 77542e4db9 Throwdowns: a plugin refusing its card no longer blocks every later flag, and joins say what they did
A plugin that calls flag.leave() on `open` (Tag and Infected outside a session) sent the game an
exit from a setup that never opened. The game never took it, and every later flag's setup waited
behind it. A registration left before its setup was asked for now just ends, from flag.leave()
and from the waiting card's Leave alike (leave_unopened).
The join card says which flag it read and how it was branded, or which buttons it has when it has
no Enroll; its branding errors were swallowed. Joining another player's plugin flag says whether
its plugin heard join, or why the player was taken out of its queue. A navigation that waits on
the game's says so every 3 s, and a setup that does not open in 15 s says so.
2026-10-21 20:42:49 -05:00
AyeZeeBB a598ce602b Launcher: the start map is the game's first level, without San Vansterdam before it
The first level the game loads from the splash took San Vansterdam, and the startup commands'
"load" then loaded the start map over it. queue_menu_bam now takes the map from the front of
RESKATE_STARTUP_COMMANDS when it is installed and can load (its start point as the console's
"load" picks one), and the startup commands drop that "load" rather than run it again. A map that
cannot load then still leaves the game in San Vansterdam.
2026-10-21 20:42:49 -05:00
AyeZeeBB d1bdb0f8a6 Launcher: a start map in Settings, GAME, instead of always San Vansterdam
The launcher lists San Vansterdam, the game's other maps and the custom maps of the mods that
load (start_maps.h), keeps the choice with its settings and starts the game in it, as its -map
does: a "load" at the front of the startup commands. A map no longer listed when the world can
load it (a map mod switched off or left out of the merge) is dropped after 20 s, and the game stays
in San Vansterdam. A launcher kept open no longer adds a launch's map to the last one's commands.
Tests: Launcher/Test/start_maps_tests.cpp.
2026-10-21 20:12:18 -05:00
AyeZeeBB ecacdd4242 Plugins: a change to a plugin's files waits for the game to have the focus
A plugin edited in another window reloaded at every save while the game was in the background.
A change found then is held, and loads once when the game window has the focus again (the log
says it waits); the first set of plugins still loads at once, focused or not.
2026-10-21 20:12:18 -05:00
AyeZeeBB 48d1e245db Outfit layers: an item worn on top keeps its textures, and the log says what the layers do
The game's skater loader builds each recipe slot with that slot's own function, which puts the
item's appearance preset on a material named for the slot's kind ("Outfit_Top_mat"). An item worn
on top sits in another kind's slot, so its mesh found nothing under its own material ("Bottom_mat")
and drew white. The preset lookup guard's addEsShaderPreset hook now also puts the preset of an item
on top on its own kind's material (layer_materials.h: which presets those are, from each item's
catalog folder and AssetPaths; the five native functions checked by their first bytes).
The outfit service logs what goes on top and where, the slot trials, why an item is not worn and
what it waits for.
2026-10-21 19:49:35 -05:00
AyeZeeBB 89a97caed7 Plugins: an item grid's own list and marks, items worn on top, keys kept from the game, the menu's category icons
General APIs from pull request 269 (the player's own item tabs and outfit layers), whose tabs,
panels and prompts are now a plugin's (contrib/plugins/item-tabs, kept on this machine):
- reskate.menu.grid_show(keys): a plugin's list in the item grid that has the focus, drawn from
  every grid of the screen; reskate.menu.grid_mark(keys): the game's check on tiles. menu.grid()
  also says whether a list shows, whether it is empty, and where the grid's own prompts end.
- reskate.outfit.on_top(items) and on_top_state(): items worn on top of the outfit in the slots it
  leaves empty, the item given the slot's category, a slot tried and left if the game reports a
  failed load (ReSkate.layer_slots.txt remembers which load where); paid store items refused.
  Part of the shared outfit service, with reskate.outfit.set.
- reskate.input.game_keys(keys): presses the game does not see, by any way it reads the keyboard;
  "Delete" is a key name.
- d:game_image draws the customization menu's 17 category icons ("cas_tops", ...).
dingosdk_plugin_tests skips the test of a contrib plugin that is not on this machine.
2026-10-21 19:18:01 -05:00
AyeZeeBB 913b4ce422 Merge remote-tracking branch 'origin/main' 2026-10-21 19:01:43 -05:00
AyeZeeBB 89fca92f19 Launcher: official mods removed; their packs are mods like any other
Now that features are Luau plugins, nothing needs mods of ReSkate's own:
- The OFFICIAL tab and its rail tile are gone, with Launcher/official_mods (the backend's list, the
  install, update and sync, and Play's wait for them).
- GET MODS lists and updates Board Break, Road Rash and the rest like any other package, and MY
  MODS no longer marks them Official or keeps them out of UPDATE ALL.
- The merge may leave one out over a conflict like any other mod; the version stamp, the on/off
  helpers and the move out of the old .reskate-official folder are gone from builtin_packs.
- Installed copies stay in Mods as ordinary mods. The retired first Board Break is still left out.
2026-10-21 19:00:55 -05:00
zeex64 70fb13f130 Merge pull request #307 from wilu222/map-prompt-file-size
Show a missing map's zip file size on the join prompt before the download starts
2026-10-21 18:49:57 -05:00
zeex64 c745d605ae Merge pull request #310 from moelrobi/fix/poll-answer-repeat
Polls: answers no longer refused as repeats, and less chat noise
2026-10-21 18:45:38 -05:00
zeex64 8a14996980 Merge pull request #305 from DreadHeadHippy/amd-mp4-video-export
Replay export: MP4 export works on PCs with an AMD iGPU beside another GPU
2026-10-21 18:38:56 -05:00
AyeZeeBB 51fc90c436 Merge branch 'main' of https://github.com/Dingo-Shenanigans/ReSkate 2026-10-21 18:38:20 -05:00
AyeZeeBBandtsullivan13 b991e45d71 Mod Manager: UPDATE ALL sits in a bar over the MY MODS list, with each update's version and size
From pull request 301 (tsullivan13), fitted to the newer MY MODS page:
- UPDATE ALL leaves the left rail for a bar over the list, made like the conflicts bar and
  under it: how many updates wait and what they download, each mod's old -> new version (the
  first six, then how many more), Show only these (the Updates filter and back) and
  UPDATE ALL (N) with the download size. Hidden with nothing waiting, off while an install runs.
- A row with an update shows its old -> new version in blue after the author.
- Ctrl+F goes to the search box on MY MODS and GET MODS, as their placeholders say.

Co-authored-by: tsullivan13 <25965236+tsullivan13@users.noreply.github.com>
2026-10-21 18:37:46 -05:00
zeex64 98b9a3e839 Merge pull request #330 from andrewnakas/physics-210
Bug fix: ReSkate Trainer landings stutter with Gravity off 1, Grind lock-on 0 still locks on
2026-10-21 18:31:14 -05:00
zeex64 9897edcc4b Merge pull request #331 from Dingo-Shenanigans/plugins
Plugins
2026-10-21 18:30:11 -05:00
AyeZeeBB f352179785 Merge main into plugins: the trainer (PR 300), object unlocks (290), server browser sort (302) and export bitrate (322)
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.
2026-10-21 18:26:55 -05:00
AyeZeeBB bb98e9627f Plugins: contrib/plugins kept on this machine, out of the repository
The plugin folders (the ports, the test plugins, Fit Check, Animator Studio, SmokeyDawg58's throwdown kit and the tools) are no longer tracked and contrib/plugins is ignored as a whole. The files stay where they are; dingosdk_plugin_tests still runs them when they are present.
2026-10-21 18:13:36 -05:00
AyeZeeBB e004de580e Merge branch 'plugins' of https://github.com/Dingo-Shenanigans/ReSkate into plugins 2026-10-21 18:11:03 -05:00
AyeZeeBB b67fe93e55 Crashes: guards for 2.1.1's top crash sites, launcher checks, stuck-load reports, quieter logs
From 2.1.1's Sentry reports (60,000 in three days, 2026-10-21):
- Textures: a stale render texture handle takes the game's default texture instead of reading
  through null (Skate.exe+0x3e897fb, a third of all reports, every one with TheVlixOne-Nike_Pack 2.3.x).
- Physics: the wake pass's bitset is made as long as the world's owner list once indices pass
  20000, after long multiplayer sessions (+0x3d99e2f, +0x3d9ee43, +0x3d9ee47).
- Music: more than 1024 candidates are picked by ReSkate; the game's shuffle wrote past its stack table.
- Streaming: a staged read's piece that reaches past its 64 KB buffer is left unfilled (VCRUNTIME memcpy).
- Multiplayer: a remote skater or board whose parent bus link is damaged is left alive instead of
  destroyed (+0x2b94cd0).
- Mesh pool: on an integrated GPU its budget is capped by the RAM and page file free; the Memory
  line says what the PC has left.
Launcher:
- A folder with non-ASCII letters is a hard stop (the boot crash +0x18df4cf came after "Start anyway").
- The game's data files are checked against the supported build's sizes (from Steam's manifest);
  missing, cut-short or online-only files send the player to verifying.
- One game per folder: the launcher will not merge or start while one runs there, and ReSkate.dll
  holds the folder's mutex.
- Advice on the ready screen for PCs short of RAM and page file; reports carry pc.ram_gb and
  pc.commit_free_gb.
Stuck loads:
- A load in one stage for two minutes sends a stuck-load report (every thread's stack and the log,
  error.type stall, load.stage, load.seconds) while the game goes on (crash protocol 6).
- A load the player closes sends its timing with the stage it was in.
Logs: the PanelTrace diagnostics and the neighborhood unlock override's observation lines are gone.
2026-10-21 18:10:58 -05:00
AyeZeeBB 74cab22b0f Crashes: guards for 2.1.1's top crash sites, launcher checks, stuck-load reports, quieter logs
From 2.1.1's Sentry reports (60,000 in three days, 2026-10-21):
- Textures: a stale render texture handle takes the game's default texture instead of reading
  through null (Skate.exe+0x3e897fb, a third of all reports, every one with TheVlixOne-Nike_Pack 2.3.x).
- Physics: the wake pass's bitset is made as long as the world's owner list once indices pass
  20000, after long multiplayer sessions (+0x3d99e2f, +0x3d9ee43, +0x3d9ee47).
- Music: more than 1024 candidates are picked by ReSkate; the game's shuffle wrote past its stack table.
- Streaming: a staged read's piece that reaches past its 64 KB buffer is left unfilled (VCRUNTIME memcpy).
- Multiplayer: a remote skater or board whose parent bus link is damaged is left alive instead of
  destroyed (+0x2b94cd0).
- Mesh pool: on an integrated GPU its budget is capped by the RAM and page file free; the Memory
  line says what the PC has left.
Launcher:
- A folder with non-ASCII letters is a hard stop (the boot crash +0x18df4cf came after "Start anyway").
- The game's data files are checked against the supported build's sizes (from Steam's manifest);
  missing, cut-short or online-only files send the player to verifying.
- One game per folder: the launcher will not merge or start while one runs there, and ReSkate.dll
  holds the folder's mutex.
- Advice on the ready screen for PCs short of RAM and page file; reports carry pc.ram_gb and
  pc.commit_free_gb.
Stuck loads:
- A load in one stage for two minutes sends a stuck-load report (every thread's stack and the log,
  error.type stall, load.stage, load.seconds) while the game goes on (crash protocol 6).
- A load the player closes sends its timing with the stage it was in.
Logs: the PanelTrace diagnostics and the neighborhood unlock override's observation lines are gone.
2026-10-21 18:10:51 -05:00
andrewnakasandClaude Opus 5.5 df29f533fd Trainer 0.8.6: Animation timing 1 by default
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 16:52:37 -06:00
andrewnakasandClaude Opus 5.5 382dd4b010 Advanced gravity: Animation timing defaults to 1, tooltips in paragraphs
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>
2026-10-21 16:52:37 -06:00
AyeZeeBB dce293e25d Fit Check as a plugin: screen capture, the menu's preview turned and read, and what the skater wears
Pull request 326 split into general plugin APIs and contrib/plugins/fit-check:
- reskate.capture (start, stop, discard, state, compare, kept, save): the screen
  recorded before the overlay draws, cut out by the game's depth or by colour,
  saved as GIF, APNG, PNG or WebM with an optional card; the "capture" permission.
- reskate.room.turn: a stand-in pad's stick held over to turn the menu's preview.
- reskate.menu.game and reskate.menu.grid: what the game's menu and its item grid show.
- reskate.outfit.worn, board and title: what the skater wears, by name.
- reskate.files.reveal: a data folder opened in Explorer.
The plugin finds where the turn comes round, eases the stick off, picks evenly
spaced frames and saves them with the board's parts or the outfit on the card.
2026-10-21 17:16:56 -05:00
andrewnakasandClaude Opus 5.5 4f8810f749 Trainer 0.8.5: Advanced gravity (animation timing, landing gravity)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 14:24:44 -06:00
andrewnakasandClaude Opus 5.5 0f5b81135d Advanced gravity: animation timing and landing gravity
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>
2026-10-21 14:24:43 -06:00
andrewnakasandClaude Opus 5.5 58d064e2d7 Trainer 0.8.4: landings at other gravities, Grind lock-on 0
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 11:51:46 -06:00
andrewnakasandClaude Opus 5.5 76a2332771 Sticky Grinds: the dial reaches the air reach too, so 0 is no lock-on
The Grind lock-on dial drove only the ground lock-on values; the reach from the
air (physicsgrindsair.maxdist*, physicstrajectory.scoregrind) stayed stock, so
at 0 the board was still pulled onto rails in flight (over a gap, over water).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 11:51:39 -06:00
andrewnakasandClaude Opus 5.5 c919586d21 Gravity: the game's landing searches use the trainer's gravity
The game finds where and when a flight lands by walking trajectories with the
gravity of the trajectory query manager (rva 0x7785da8 +0x30, 9.8). The air
state follows the record it chose, so with any other gravity the landing stayed
late on real jumps (a player at x1.25). 0.8.1 only re-planned the animation's
landing countdown, for flat ground. The manager's gravity is now the trainer's
while it holds one, and goes back to 9.8 when it lets go; the countdown patch,
which would now correct twice, is gone. Guarded by the code bytes of 0x473e312.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 11:51:38 -06:00
DreadHeadHippyandCopilot 78f422310d Replay export: MP4 export works on PCs with an AMD iGPU beside another GPU
The game takes the first H.264 encoder Media Foundation lists, and that is the AMD one
even when the game renders on another vendor's GPU. It cannot take frames from that
device, so the export ended in 'Failed to save video'. Hardware encoders of a vendor
other than the render GPU's are now left out of the video encoder list.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-21 10:47:43 -04:00
AyeZeeBB 79df4762c4 Animator Studio: game tricks mirrored to the skater's stance, a steady board, and the room held together
- reskate.animation.mirror makes a clip for the other stance (Left and Right trade across the board's
  length, each joint from its rest; the board mirrored as itself), and info gives a clip's stance. The
  game's trick clips stand goofy: the studio mirrors one for a regular skater, which played half a
  turn round in game.
- The studio no longer holds the skater with noclip: he left his board and the flight pose showed
  through. His board is stopped once instead; while drawn in the room No Bail guards him, and the
  game's own placement goes back into the pose before its physics.
- The whole board is held rigid while a clip moves it, deck mount included.
- The room closes when the game's menu leaves the Skaters page, and the studio closes with it.
- The studio's first camera angle is the PR's, taken once the room's joints are read.
- A log line every 2 s while a clip plays (Clip pose: updates, renders, scale, heights, the joints
  that change most), kept while the room's pose is still checked in game.
2026-10-21 00:31:13 -05:00
AyeZeeBB 19b42c37b0 Game clips keep the skater's build, the board's trucks ride the deck, and the studio's room and pan
- A clip marks the joints it only turns (Clip::turned_only, kept in the clip file): those keep the
  skater's own position, as the game does; a game trick no longer changed his size.
- While a clip moves the board, its trucks and wheels are held as they were on the deck: the board
  physics shook them.
- The character room's facing is taken once: the Skaters page turned its skater on a right drag, and
  ours turned with it and sprang back.
- A plugin's cursor reads the middle button from Windows and raw input as well: it did not reach
  ImGui in game.
2026-10-20 19:03:52 -05:00
AyeZeeBB 2b0b744ec5 Animator Studio: not opened during a bail, and the walk back from the character room always ends
- The studio waits until a bail is over (its state, or 4 s after the bail event): held still mid-bail,
  the game took the hold away and the skater went on bailing behind the studio.
- The character room's walk back gives up after 8 s: with no skater ready (a respawn) it could not
  step, and the studio stayed on its loading screen.
2026-10-20 18:46:02 -05:00
AyeZeeBB 5b2664abf8 Animator Studio: works on a ReSkate without game clips, and says to update it 2026-10-20 18:36:31 -05:00
AyeZeeBB 75cc241277 Plugins: the game's own clips by name, clips played on the floor, and Animator Studio's tricks from the game
- reskate.animation.game_clips lists the game's animations and "game:<name>" plays one: the
  skater's Eclipse clips decoded from its data (Extension/AnimationStudio/game_clips, ported from
  ReSkate Studio's animation export), matching make_trick_library.py's clips.
- reskate.animation.play's floor stands a clip on the floor where the skater is, its board's lowest
  point on it, as the pull request's studio did; the game's trick clips no longer sink.
- Animator Studio lists the game's tricks from its data; the Python tools are gone.
2026-10-20 18:31:16 -05:00
AyeZeeBB 55d5f70d4f Plugins: touching other players, hiding one on your screen, and a raycast that hits players
reskate.session.touch, touching, hide, hidden and raycast, and the touch and touch_end events.
The session publishes every skater's body as capsules while a plugin reads them; a hidden
player goes through the same path a throwdown's hidden players do.
2026-10-20 18:06:30 -05:00
AyeZeeBB 41b5973896 Plugins: the character room and typing into a drawn field, and Animator Studio on both
- reskate.room.open, leave and state, with the room permission: ReSkate walks the game's menu to the Skaters page (its navigation events and RB on an internal scripted pad, as PR 297 and PR 230 did), draws the local skater on the room's floor and hides the room's own skater and board; other players are not sent the room. Extension/World/character_room, the room placement and hiding in skater_animation, and post_native_ui_event made general.
- reskate.input.text: what is typed while the plugin's screen is open; while it types, Esc is the plugin's.
- Animator Studio opens in its room (the Studio room setting, as the PR's), under its loading screen, or where the skater is when the walk fails; its card's name, trick and numbers are typed into in place.
2026-10-20 17:43:40 -05:00
AyeZeeBB 805cd0d6f5 Plugins: Animator Studio's screen 1:1, on general drawing, screen and pose APIs
- The studio plugin draws PR 297's screen itself: skate.'s Trick List menu and card, the joint timeline with key rows, dragging joints on the skater, keyboard and pad controls with their prompts, the unsaved-changes card, the recording strip and the loading screen. It lists a trick library made with tools/make_trick_library.py (the PR's, here beside it), and checks itself with studio test.
- Drawing: d:rough_rect, d:halftone, d:scribble, d:clip, d:measure, a text wrap width, the title_large font, text up to 400, and the loading screen's kickflipping board as d:game_image("loading_board") with a frame.
- reskate.ui.screen with panel = false: input taken, nothing drawn, the plugin draws it.
- reskate.skater.joint gives each joint's parent; reskate.skater.pose takes an offset.
2026-10-20 17:22:19 -05:00
AyeZeeBB 5f65bcf690 Plugins: Animator Studio as a mod, on clip editing, docked screens and the cursor
- reskate.animation: play's at and paused, seek, pause and time; info, sample, joints, trim, edit (keys baked onto a clip) and save; clips named "data:<path>" from the plugin's data folder, "clip:<n>" and "edit:<name>".
- reskate.ui.screen's dock and width: a panel down one side, the game showing beside it.
- reskate.input.cursor: the mouse over the game while the plugin's screen is open.
- contrib/plugins/animator-studio: the Animator Studio of PR 297 (22sh, Fourth Studio, Norms) as a plugin: record a trick, key joints on a timeline, save it, and the trick plays it in game.
2026-10-20 16:43:46 -05:00
AyeZeeBB b12b904c65 Plugins: joints, physics tuning, velocity, game settings and pose offsets
- reskate.skater.joint and reskate.session.joint: where any joint of your skater or another player's is.
- reskate.physics.tuning, find and tune: the trainer's tuning values, a plugin's set over the player's own and never saved.
- reskate.skater.set_velocity: the board's velocity set or added to at the next on-board physics step, in the air too.
- reskate.settings.set and the settings.write permission: a game setting held while the plugin keeps it, then put back; gameplay settings stay locked in multiplayer.
- reskate.skater.pose: joints turned and scaled on top of the animation, in the pose drawn and sent.
- The mesh tests build anim_core, which the session's joint publishing now uses.
2026-10-20 15:46:54 -05:00