Skip to content

Watch one player in the replay viewer - #309

Merged
SunkenInTime merged 3 commits into
mainfrom
t3/replay-watch-player
Oct 15, 2026
Merged

SunkenInTime merged 3 commits into
mainfrom
t3/replay-watch-player

Conversation

@SunkenInTime

Copy link
Copy Markdown
Owner

Reviewing a round usually starts with one player: what were they doing, and what could they see? VALORANT's own replay lets you jump into any player's eyes with 1–0, but no 2D viewer has an equivalent, including ours and ValoPlant's. Until now the viewer always showed all ten cones, and the only choice was which team's side to watch from.

What changed

  • Pick a player by clicking their agent on the map, clicking their row in the roster, or pressing 1–5 (allies, top to bottom) or 6–0 (enemies). Picking the watched player again, or pressing Esc, stops watching. Clicking empty map does nothing, so a stray click never loses the watch.
  • While watching:
    • Only that player's view cone is drawn.
    • Everyone else is drawn at 55%, without cones, and the watched player is drawn on top.
    • The camera glides to about 2× and keeps them centred left of the roster while playing or scrubbing.
    • Their roster row is raised with a violet ring, and each row's tooltip says "Watch Jett (3)" or "Stop watching Jett (3)".
  • Moving the map:
    • Dragging stops following, but the watch stays; picking the player again resumes following.
    • Wheel zoom keeps them centred.
    • The watch carries through death, into the next round and across a side swap.
  • Inside the frame: the other players' cones are left out of the frame itself, so they are never cut on the worker and a Capture while watching saves only the watched cone, exactly as drawn.
  • Roster rows are keyed by player. Without keys, a side swap left each row in place to show another player. Stopping a watch after a swap then closed the app on Windows: a crash in Flutter's accessibility bridge, with an accessibility client reading the window. Astra hit this twice, and I reproduced it four times out of four with the sequence "watch, swap, stop watching". Keyed, it ran clean five times out of five.

How it was checked

  • test/replay_watch_test.dart covers:
    • the frame keeping one cone and requesting no others;
    • the key slots, including after a swap;
    • Esc;
    • roster clicks, the selected look and the tooltips;
    • clicking the map;
    • centring, panning and wheel zoom;
    • the watched agent drawn last;
    • a swap never handing one player's row to another, which fails with the key removed;
    • Capture saving only the watched cone.
  • In a release build on a 13.08 Abyss replay (Astra by hand, then me through an input driver that injects key and pointer events into the app):
    • Key 8, a roster click and a map click each watch the right player: centred, single cone, others dimmed, row selected.
    • Empty-map clicks keep the watch. Dragging stops following, and clicking the row resumes it. Wheel zoom stays centred.
    • Chamber stayed watched through his death and into the next round.
    • The swap sequence that used to close the app now plays on.
  • Not checked: how smooth the camera feels at 1× and 4×. Screenshots show the positions are right, but neither of us could judge motion.

ci: analyze test

🤖 Generated with Claude Code

SunkenInTime and others added 3 commits October 15, 2026 18:06
Reviewing a round usually means asking what one player was doing and what
they could see. Now a player can be watched: click their agent on the map
or their row in the roster, or press 1-0 (allies 1-5, enemies 6-0, as the
roster lists them). Picking them again or Esc stops watching.

While watching, only that player's view cone is drawn and cut (the frame
leaves everyone else coneless, so a capture saves exactly the one cone on
screen), everyone else is drawn at 55% opacity, and the camera glides in
to at least 2x and keeps the player centred left of the roster. Panning
by hand stops following without ending the watch; picking the player
again follows them again. The watched roster row is raised and ringed in
violet, and every row's tooltip says how to watch its player.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A canvas that never watched anyone made it in dispose, after its ticker
mode was gone, and Flutter threw.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Swapping sides moves every player to the other block. Unkeyed, the rows
stayed put and took on other players, and stopping a watch after a swap
then closed the app on Windows (in the accessibility bridge, with a tool
reading the window). Keyed by player, it doesn't.

The watched agent is now drawn after everyone else, so a dimmed agent
standing on them no longer hides them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 15, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 59 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 4d688f98-9696-4236-afe9-351e1c34f84a
📥 Commits

Reviewing files that changed from the base of the PR and between 5905ab1 and 033325a.

📒 Files selected for processing: 8
  • lib/replay/replay_frame.dart
  • lib/replay/replay_playback.dart
  • lib/replay_view.dart
  • lib/widgets/replay/replay_canvas.dart
  • lib/widgets/replay/replay_match_card.dart
  • lib/widgets/replay/replay_roster.dart
  • test/replay_capture_test.dart
  • test/replay_watch_test.dart
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@SunkenInTime
SunkenInTime merged commit a70ae2b into main Oct 15, 2026
14 checks passed
@SunkenInTime
SunkenInTime deleted the t3/replay-watch-player branch October 15, 2026 23:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant