Block cones on VALORANT's minimap lines, drawn on our walls - #242
SunkenInTime wants to merge 16 commits into
Conversation
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>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
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>
This comment has been minimized.
This comment has been minimized.
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>
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>
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>
| 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); |
There was a problem hiding this comment.
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
- 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`.
- The executed probe at bf8f0c6 reports `receiverContains=true` and `seesCrate=true`, confirming the target was visible before the change.
- 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.
| `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 |
There was a problem hiding this comment.
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.
…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>
Stacked on #240. Merge after #241 as planned; the perf numbers below were measured with it. This PR no longer needs #241's
runtimeWallsloader: 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.
[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.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:
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:_Footprintcontainment 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.dartchecks 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: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.dartpasses.The builder, Riot's decoded tables and the line review tool are in the vision pipeline archive (
scripts/riot,tools/vision-lines). Rebuilding from commit0497becreproduces the shipped models byte for byte. The method is indocs/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
Do not merge until the outstanding Breeze Mid sightline issue is resolved. The lower-floor projection concern is non-blocking.
Findings
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..."