Skip to content

Draw Cyber Cage and Hot Hands at their game radii - #435

Merged
SunkenInTime merged 1 commit into
mainfrom
t3/circle-radii
Nov 1, 2026
Merged

SunkenInTime merged 1 commit into
mainfrom
t3/circle-radii

Conversation

@SunkenInTime

@SunkenInTime SunkenInTime commented Nov 1, 2026 •

Copy link
Copy Markdown
Owner

Cyber Cage and Hot Hands, before and after, on the same saved library

Cyber Cage and Hot Hands were drawn at the wrong size, so a plan built around where a cage blocks sight or how far a molly reaches was slightly off. Cyber Cage goes from 3.72 m to 3.45 m and Hot Hands from 4.5 m to 4.75 m. Saved ones stay where the user put them.

ci: test web

The numbers

Both come from the 13.09 game files.

  • Cyber Cage's CageRadius is 345, read through AbilityRadius, and its active minimap circle is 690 wide. The 3.72 came from the undeployed trap's 744 icon.
  • Hot Hands has a ClampedRadius of 475, overriding the 450 on its parent, Patch_Molotovs_Parent.
  • Snake Bite has the same parent and sets no ClampedRadius, so it inherits 450. Its 4.5 m is right and stays.

Slow Orb stays at 6.5 m. The files give a ceiling of 900 and nothing that settles the real radius, so it needs measuring in a custom game.

Saved items

Nothing saved changes. Both circles keep their old box through storedSize and draw the new size centred in it. Old saves draw differently, about 7% smaller for Cyber Cage and 6% bigger for Hot Hands, and that is the point of the PR.

Hot Hands is the first circle drawn bigger than its box, and the box was clamping it: with only the size changed, it kept drawing at 4.5 m and the test fails at a ratio of 1.0. So fill and outline now go through OverflowBox in a Clip.none stack. The lines are copied from #419, which needs the same thing for its range rings. The two PRs conflict in one spot, where #419's _buildOptionalRange sits next to _centeredOnBox. Keep both.

Replays

Replay cone shadows from Cyber Cage shrink too, because they use the drawn size (replay_frame.dart, _radiusOf). test/replay_frame_test.dart proves this with the real Cyber Cage zone. I didn't watch it in a replay: the one round I checked, Round 1 of the Split replay, had Cypher die without casting a cage.

Ground truth

Windows release build. A main build placed Cyber Cage, Hot Hands, Snake Bite and an Alarmbot and saved them. The main build and this PR then opened those same files, and I compared the screenshots pixel by pixel.

Side Item Centre Icon tile, pixels changed
Attack Cyber Cage 611, 461 0 of 484
Attack Hot Hands 699, 699 0 of 484
Defense Cyber Cage 611, 469 0 of 484
Defense Hot Hands 523, 231 0 of 484

The only changed pixels on either side are those two rings. Snake Bite and the Alarmbot match exactly. Main opened the library again afterwards and rendered it exactly as before, so the PR build didn't damage it.

In the PR build I dragged a saved Hot Hands and the whole ring moved with it, and undo put it back. I placed a new Cyber Cage and a new Hot Hands from the ability dock. An exported screenshot draws the whole ring, 71 px wide against Snake Bite's 67, which matches 4.75 to 4.5.

Main This PR
Main This PR

Not covered

  • The web build wasn't opened. The CI web lane builds it, and this is the same widget.
  • Page transitions and video export weren't run. Both draw through this widget.
  • Hot Hands' box stays 4.5 m. The off-map check still finds the centre from that box and tests only the centre, so part of a ring can sit off the map, as it could before. Only the icon takes clicks, as before.

@coderabbitai

coderabbitai Bot commented Nov 1, 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 32 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
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e508d1b8-a32e-4eec-866c-c04bb18f461c
Commits

Reviewing files that changed from the base of the PR and between 1830650 and e971ecb.

Files selected for processing: 4
  • lib/const/agents.dart
  • lib/widgets/draggable_widgets/ability/custom_circle_widget.dart
  • test/circle_radii_test.dart
  • test/replay_frame_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

@SunkenInTime
SunkenInTime merged commit 268f8a8 into main Nov 1, 2026
15 checks passed
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