Skip to content

Block cones on VALORANT's minimap lines, drawn on our walls - #242

Open
SunkenInTime wants to merge 16 commits into
t3code/seal-void-windowsfrom
t3code/truth-derived-bands
Open

SunkenInTime wants to merge 16 commits into
t3code/seal-void-windowsfrom
t3code/truth-derived-bands

Conversation

@SunkenInTime

@SunkenInTime SunkenInTime commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

Stacked on #240. Merge after #241 as planned; the perf numbers below were measured with it. This PR no longer needs #241's runtimeWalls loader: the walls themselves are now the merged outlines.

What changes. Walls no longer carry heights measured from the 3D map. Every wall is our drawn wall art, and it takes its heights from VALORANT's own minimap vision lines, the 2D line set the game uses for its minimap cones. Riot's lines decide how tall a wall is, and our art decides where it is. So cones stop exactly on the drawn walls, with no gap.

  • The rule. A viewer whose capsule centre (floor + 0.98 m) is in [th_k, th_k+1) is blocked by layer k's lines. The thresholds are absolute heights in Riot's data. The 0.98 m comes from a scan of where the lines' obstacles top out, which peaks sharply there. The assets don't state it.
  • Walls.
    • Each edge of the wall art takes the layers of every Riot line running alongside it (within 2 SVG units).
    • Riot lines with no art beside them (glass, railings, crates we don't draw) stay as thin walls, joined to the nearest art where they hand over.
    • One line was added where Riot has none: the Lotus defense platform wall from your round 2 replay.
    • One spot has Riot's lines taken off: the Haven C Garage window, kept open from the garage floor as you ruled (2026-09-19, again 2026-10-04).
    • Touching strips with the same heights are merged into one outline each, and those outlines are the walls.
  • Floor. Cones are drawn on the floor minus the wall art.

Checked against the 3D map (240 standing poses per map side). Only the part of each ray that lands on floor the app draws counts, because rays leaving the map are never drawn:

visible floor, both sides measured (before) this PR
leaked length 1,747,007 2,313,132 (+32%)
false-shadow length 32,714,287 33,816,279 (+3.4%)
  • Better: Pearl (−88% leaked), Summit (−90%), Breeze (−65%), Ascent (−63%), Corrode (−52%) and Haven (−43%).
  • Worse: Abyss, Fracture, Icebox and Sunset leak about twice as much or more, and Split and Bind about a quarter more.

The check is stricter than the game. Riot's minimap ignores props the 3D map has, like crates, poles and low walls. On Split's six worst spots, five cones look normal for exactly that reason.

Perf (all-maps drag, profile build, with #241): frame build is at most 3.35 ms at p99 on every side over two runs, under the 6.06 ms budget for 165 fps, and no frame's build goes over budget (13 frames did before this fix, 6 on #241's own run). Raster still has 2–7 single slow frames (10–27 ms) per run, on a different side each time; they were there before this PR too and don't depend on the wall data.

The first perf pass on the final models found a regression the drag test had partly hidden. Each frame of a drag steps the agent out of any wall it stands in (standablePointNear). With thousands of thin strips as walls, and a floor with every wall cut out of it, that step took up to 1.6 s on Lotus in a profile build (old models: 1.7 ms). Two fixes:

  • The walls are the merged outlines rather than strips (builder).
  • _Footprint containment files each edge under the 1-unit rows its height reaches and reads only the point's row. The answer is unchanged; test/svg_footprint_contains_test.dart checks it against reading every edge, and fails if the filing is broken.

Over a grid of every 1.37 units on Lotus, Breeze and Summit, placement now takes at most 2.0–5.6 ms in a profile build, against 1.2–6.7 ms for the old models with the same code.

Short stretches only. An art edge with no Riot line alongside borrows the nearest line only when it's a short stretch, at most 4 units, between edges that have a line: a bevel, a jog, a wall's end. Before this, a drawn ring by Split's B wall took the wall's line and cut cones beside it into slivers. Where several lines are equally near (Riot often stacks a ground line and an upper line on one spot), the stretch takes all of them; picking one by list order flipped a Haven corner when the garage lines were taken off.

Tried and dropped: making everything that is neither floor nor wall a wall. It blocked real sightlines across drops on Abyss and Icebox (+54% and +34% false shadow on visible floor) and changed nothing visible on Pearl.

Review. Astra found four issues and all are fixed: holes in walls were treated as solid, there was a gap where a Riot line hands over to the art, band tops were closed while Riot's layers are open, and this PR depended on #241's loader (it no longer does).

Tests. test/svg_riot_vision_test.dart:

  • every band edge is a Riot layer edge;
  • a viewer exactly on a threshold gets the layer above;
  • a wall's hole stays floor;
  • the Lotus platform wall blocks;
  • the Bind container blocks (your call: follow Riot);
  • Breeze Mid's slanted roof blocks (your call: follow Riot);
  • a drawn ring by a wall doesn't slice a cone;
  • the Haven garage window stays open from the garage floor.

test/svg_footprint_contains_test.dart: containment matches reading every edge, on Lotus's walls and floor.

Checksums are updated, all 161 svg/vision/cone/map tests pass, and tool/check_bundled_wall_heights.dart passes.

The builder, Riot's decoded tables and the line review tool are in the vision pipeline archive (scripts/riot, tools/vision-lines). Rebuilding from commit 0497bec reproduces the shipped models byte for byte. The method is in docs/vision-model.md, under "Blocking from VALORANT's minimap lines".

Your calls (2026-10-04). Abyss, Fracture, Icebox and Sunset look right in the dev build. The Haven garage window stays open. The Bind container and Breeze Mid's slanted roof follow Riot's lines.

🤖 Generated with Claude Code

RetriggerConfidence Score: 4/5

Do not merge until the outstanding Breeze Mid sightline issue is resolved. The lower-floor projection concern is non-blocking.

Findings

  1. P1 Breeze opening becomes opaque ▶
  2. P2 Destination floor projection disappears ▶

Summary

This PR replaces measured wall heights with VALORANT minimap-line layers and updates the bundled models and visibility checks. The Haven garage window and Lotus platform test are fixed. Two earlier visibility concerns remain: the Breeze Mid opening is blocked from the perch, and lower-floor views no longer use destination-height projection. The Breeze sightline issue must be resolved before merging.

Reviews (13) · Last reviewed commit: "Keep placing an agent fast on the Riot-l..."

The ray probe that measured bands looked half a metre either side of the
ink and left a piece open where the real face sat further off. Lotus's
defense platform wall had no band below 20.75 m, and Bind's B container
outline had no bands at all.

A check from ~32,000 standing spots compares the painted walls with the
3D scene sliced at each eye. Pieces the scene stops 60%+ of the rays
through rise to the height of what stopped them, cut short where the
scene lets rays through. Long partly-open pieces are cut into one-unit
pieces first. Recorded decisions about openings are left alone.

Spots seeing through a solid painted piece: 11,054 -> 5,905; leak rays
337,158 -> 104,440; false shadows +0.7%. Scripts are in the archive under
scripts/truth.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e5090d51-808e-4b94-ac5d-c739d0c0fb00

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autopilot · 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.

Comment thread test/svg_truth_bands_test.dart Outdated
SunkenInTime and others added 3 commits October 3, 2026 01:04
Dara swiped through the 119 pieces whose recorded open decision the 3D
scene disagrees with, looking at a render from the spot that sees through
each one. 51 become solid at the measured heights: the Abyss atrium wall
sections the 2026-09-14 review left open beside the eleven it confirmed
(all now 3.96-8.0 m), both Fracture corridor openings and Haven defense's
gameplay opening. Haven, Icebox and Pearl door and corridor openings stay.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The Abyss atrium strips were one case: earlier passes measured walls in
short strips against chosen objects, and strips that missed them stayed
open. scripts/truth/notch.py finds every piece up to a metre long that is
open where the pieces either side of it are solid, and checks it against
every solid face within half a metre. 5,343 holes found; 4,096 filled where
the scene is solid; 463 open in the scene stay open. Dara's rulings are
untouched.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@greptile-apps

This comment has been minimized.

SunkenInTime and others added 2 commits October 3, 2026 02:06
Breeze and Pearl draw a few strokes a couple of centimetres apart, and the
nudge out of wall ink could leave an agent in that slit, where its cone is
a hairline running down it. Within 5 cm of blocking ink now counts as ink,
and a nudged agent stands 6 cm clear, so a slit narrower than 10 cm has no
standing point: the three reported spots step out onto open floor.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…sides

The 463 holes the scene check left open are single pieces a few tens of
centimetres wide between solid walls. Renders from the standing spots that
see them show mostly solid wall whose face sits over half a metre off the
ink; a real window or doorway spans several pieces. All filled.

Haven Mid Window had lost its sill on both sides, so anyone below it saw
through the wall under the window. Both sides now carry the measured sill
(about 1 to 4 m) under the existing header.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comment thread docs/vision-model.md
SunkenInTime and others added 3 commits October 3, 2026 13:33
The truth passes broke 19 sightlines of the archived acceptance suite.
Cast against the complete 3D scene, six were clear (the hole fill had
closed Corrode's 4801 gap) and others contradicted a ruling: Dara's
see-through C Garage window, Icebox's zipline and ramp markings, pieces
named see-through, and a Haven Mid band where the scene is clear. Those
pieces go back to their #240 bands. The seven failures left are Dara's
Mid Window sill and sightlines the scene blocks.

Every model now carries runtimeWalls, touching pieces with the same
heights merged into one outline, which cones are cast against once the
loader reads them (#241). Older loaders ignore the field.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
SunkenInTime and others added 3 commits October 4, 2026 14:11
Every wall is now our drawn art, carrying the heights of the Riot minimap
vision lines that run along it: a viewer whose capsule centre (floor +
0.98 m) stands in [th_k, th_k+1) is blocked by layer k's lines. Riot
stretches with no art beside them stay as thin walls; the Lotus defense
platform wall, which Riot has no line for, gets an added one. Same-height
strips are merged into runtimeWalls, so cones cost what they did.

Tests follow Riot: the Bind container and Breeze Mid's slanted roof block,
and the Haven garage window test is skipped until Dara rules again.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…nd tops

From Astra's review:
- Holes drawn inside even-odd walls were filled as solid art and cut out of
  the floor (1,337 square units on Haven attack). Walls are now read by
  their fill rule.
- A Riot stretch cut where the art takes over stopped short of the wall,
  leaving a gap rays slipped through. Its end now joins the nearest art.
- Band edges sit 1e-6 m below their thresholds, so a viewer exactly on a
  threshold (Ascent's 5.02 m floors) gets the layer above, as in Riot's
  open-topped layers.

Tests pin all three, and Breeze's slanted roof is asserted blocked rather
than dropped. Leak poses on the 3D check fall from 4,088 to 3,694 for 0.5%
more false shadow; frame build stays at or under 5.57 ms p99 on every side.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@SunkenInTime SunkenInTime changed the title Raise wall bands the 3D scene shows solid from where players stand Block cones on VALORANT's minimap lines, drawn on our walls Oct 4, 2026
Comment thread test/svg_riot_vision_test.dart Outdated
Comment on lines +120 to +127
test('Breeze Mid blocks the slanted-roof opening from the perch', () {
// The 3D scene clears a ray from the 10 m perch through the opening
// to a standing eye on the crate across Mid; Riot's lines block it.
final model = _model('breeze', 'attack');
const perch = Offset(160, 190);
expect(model.automaticSupportAt(perch)?.surfaceElevationAt(perch),
closeTo(10.0, 0.1));
expect(_sees(model, perch, const Offset(213.49, 183.84)), isFalse);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Breeze opening becomes opaque

An agent on the Breeze Mid perch could previously see the crate across this opening, which the test notes is clear in the 3D scene. The rebuilt model excludes the crate from the visible area, and the new assertion treats that loss as correct. Players therefore see a false shadow through the opening; preserve the sightline rather than accepting the blocked result.

Artifacts

Breeze Mid cone probe source

  • The authored Flutter test loads the bundled Breeze attack model and exercises the actual perch-to-crate cone on both revisions.

Base and HEAD comparison command

  • The authored script runs the same probe against an isolated base worktree and current HEAD using `--no-pub`.

Base revision cone result

  • The executed probe at bf8f0c6 reports `receiverContains=true` and `seesCrate=true`, confirming the target was visible before the change.

Current HEAD cone result

  • The identical probe at HEAD reports `receiverContains=false` and `seesCrate=false`, confirming the target is now blocked.

Current Breeze Mid assertion result

  • The focused PR test passes on HEAD with its new blocked expectation, showing the test accepts the changed sightline.

View artifacts

T-Rex Ran code and verified through T-Rex

Comment thread docs/vision-model.md
Comment on lines +63 to +65
`sightlineFloorSupportIds` is dropped. Riot's layers already decide which
floors a viewer sees over. Each model stores the thresholds as
`riotVisionLayers`, and `test/svg_riot_vision_test.dart` checks that every

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Destination floor projection disappears

Dropping sightlineFloorSupportIds removes the runtime’s target-height projection for cross-height views. From a raised Lotus defense floor, the previous projected cone excludes a point on the lower destination floor, but the new horizontal fallback paints it visible. This changes the displayed lower-floor area without checking visibility at that floor’s height. Retain the projection or provide an equivalent target-height-aware path.

Artifacts

Flutter test for a raised Lotus observer and lower destination floor

  • The authored test loads each ref's bundled asset and calls the runtime cone used by the painter, enabling the two runs to be compared.

Base run with destination-floor projection

  • The Flutter test loaded the base Lotus asset and observed a projected path that excluded the lower-floor target.

HEAD run without destination-floor projection

  • The same Flutter test loaded the HEAD asset and observed a null projected path and a horizontal fallback that painted the target.

View artifacts

T-Rex Ran code and verified through T-Rex

SunkenInTime and others added 4 commits October 4, 2026 17:49
…sible floor

An art edge with no Riot line alongside used to take the nearest line within
2 units, so a ring or box touching a wall took the wall's line where it came
near. An agent just inside Split's ring by the B wall got a cone cut into
slivers. Now only a short stretch (at most 4 units) between walled edges
borrows the nearest line: a bevel, a jog, a wall's end. A test pins the
Split ring; it fails on the previous models.

The 3D check in the doc now counts only what lands on floor the app draws.
Rays leaving the map were counted before, which made Pearl look worse than it
is. Walling the void was tried and dropped: it blocked real sightlines
across drops on Abyss and Icebox.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Dara ruled the C Garage window open from the garage floor (2026-09-19,
again 2026-10-04). Riot's lines close it for layer 0, so the builder now
takes them off there (`cleared` in haven.edits.json) and the test is back.
Short stretches with no line alongside borrow every line tied for nearest,
so the result no longer depends on list order. Visible-floor leaks
2,327,130 -> 2,323,163, false shadow 33,824,793 -> 33,816,275.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Each frame of a drag steps the agent out of any wall it stands in. With
thousands of thin strips as walls, and a floor with every wall cut out of
it, that step took up to 1.6 s on Lotus in a profile build (old models:
1.7 ms), and the drag showed 13 build frames over budget.

The walls are now the merged outlines (the builder makes them the model's
walls; no runtimeWalls), and footprint containment files each edge under
the 1-unit rows its height reaches, reading only the point's row. The
answer is unchanged: the new test checks it against reading every edge.
Placement now takes at most 2.0-5.6 ms on the heaviest maps; the all-maps
drag has build p99 at most 3.35 ms and no build frame over budget, over
two runs. Visible-floor leaks 2,323,163 -> 2,313,132 (merging seals
hairline cracks), false shadow unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

This branch has not been deployed

No deployments
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