-
Notifications
You must be signed in to change notification settings - Fork 20
Watch Valorant replays in Icarus and capture moments into strategies #237
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+24,676
−146
Merged
Changes from all commits
Commits
Show all changes
29 commits
Select commit
Hold shift + click to select a range
a784cce
WIP: Valorant replay viewer on a native vrfkit decoder
SunkenInTime a2ff1a8
WIP: harden replay reading, finish ability catalog, glossary
SunkenInTime 2c67be7
Add clean-room Selkie decoder for replay archives
SunkenInTime 87ba706
Harden the replay viewer after review
SunkenInTime ff8c1f6
Finish the replay decoder: vitals, utility shapes, release wiring
SunkenInTime f4fed86
Stand replay cones on the replay's level; keep playback smooth
SunkenInTime 0c1e24d
Merge remote-tracking branch 'origin/main' into t3code/valorant-repla…
SunkenInTime ee0751f
Drop an unneeded import in the capture test
SunkenInTime 0eb3383
Address review: bounded decoding, atomic control handle, release notices
SunkenInTime a3452aa
Replace kept replays in one step; bump the decoder version
SunkenInTime b80af76
Replay: smokes block sight, utility arrives and leaves, playback at 1…
SunkenInTime d533636
Review fixes: smoke shadows stay put, cones stand on their agent
SunkenInTime 74ef9fb
Merge the cone runtime fixes; cut replay floors on the worker
SunkenInTime e44254c
Replay: cut cones all the way round, face them when painting
SunkenInTime e09a4f3
Merge the cone review fixes
SunkenInTime 46be9bd
Merge the second round of cone review fixes
SunkenInTime 1c9378b
Merge merged-outline loader and faster floor shadows
SunkenInTime 750571b
Merge branch 't3code/cone-runtime' into t3code/valorant-replay-overhaul
SunkenInTime e22b0c8
Merge branch 't3code/cone-runtime' into t3code/valorant-replay-overhaul
SunkenInTime ddd08d6
Merge branch 't3code/cone-runtime' into t3code/valorant-replay-overhaul
SunkenInTime 60a014a
Merge branch 't3code/cone-runtime' into t3code/valorant-replay-overhaul
SunkenInTime 7d148aa
Block replay sight with each smoke as wide as it is drawn
SunkenInTime 9d84253
Fade a replay ability's range, not its icon
SunkenInTime 50a3c36
Show a back arrow in an editor opened from a replay capture
SunkenInTime 9e67b93
Merge main into t3code/valorant-replay-overhaul
SunkenInTime 886bf5a
Merge remote-tracking branch 'origin/main' into t3code/valorant-repla…
SunkenInTime 1f8a810
Pin Split's crane spot to the floor default #238 gives it
SunkenInTime 58f9f00
Start a replay capture's strategy in the local library
SunkenInTime 977472c
Set the replay window title in the body type role
SunkenInTime File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| # 6. Valorant replays are decoded by a native library built on vrfkit | ||
|
|
||
| Status: accepted, 2026-10-01 | ||
|
|
||
| ## Context | ||
|
|
||
| Valorant writes match replays as `.vrf` files: an Unreal local replay, its | ||
| replication payloads Oodle-compressed and scrambled by a transform Riot | ||
| rotates every patch or two. We spent June and July reverse engineering the | ||
| format in Node (`codex/valorant-replay-file-reverse-engineering`). That work | ||
| proved the layers and decoded movement for build 13.00, but it ran 30 to 300 | ||
| seconds per match, knew three builds, and shelled out to Node, which no user | ||
| has installed. | ||
|
|
||
| Since then two open-source parsers have caught up and track every patch: | ||
| vrfkit (Rust, Apache-2.0, builds 11.06 to 13.06) and Michel Giehl's | ||
| ValorantReplayParser (C#, MIT, which vrfkit derives from). vrfkit decodes one | ||
| of our 13.00 replays in about a second with no decode errors. | ||
|
|
||
| Every open-source Oodle decoder (powzix/ooz and its ports: ooz-wasm, | ||
| oozextract, OozSharp, oozle) is GPL-3.0 or derived from it, including the ones | ||
| labelled MIT. Valorant only uses a narrow Oodle subset: Mermaid/Selkie blocks | ||
| with raw, un-entropy-coded streams. | ||
|
|
||
| ## Decision | ||
|
|
||
| - `native/replay` is a Rust library, loaded over FFI like `native/height`. | ||
| It depends on vrfkit's library crates pinned to a release tag, with the | ||
| `oodle` feature off, and vendors the CLI's packet pass with attribution. | ||
| - Its Oodle decoder is our own, written clean-room for the Selkie subset from | ||
| a facts-only format spec. ooz-derived code never enters the repo or the | ||
| build. Any block outside the subset fails loudly. | ||
| - The library emits Valorant facts only (subjects, agent UUIDs, class paths, | ||
| game-world centimetres) in the format described in | ||
| [`docs/replay-format.md`](../replay-format.md). Mapping those facts onto | ||
| Icarus agents, abilities and map coordinates is Dart's job, so the decoded | ||
| document stays readable by code that has never seen our widgets. | ||
| - A replay from an unknown build is refused, never guessed. Keeping up with | ||
| patches means bumping the vrfkit tag. | ||
|
|
||
| ## Consequences | ||
|
|
||
| - Building the desktop app needs a Rust toolchain on Windows and macOS. | ||
| Unit tests that do not touch decoding stay pure Dart. | ||
| - New Valorant patches reach users when vrfkit registers the build and we | ||
| ship a release with the bumped tag. Until then that patch's replays show a | ||
| clear "not supported yet" state. | ||
| - The same crate can compile to WASM if the web app ever decodes replays. |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.