feat(fixtures): closed-loop DrussGT captures from real Tank Royale battles
The classic captures were OPEN-LOOP: replayed DrussGT never dodged OUR
bullets. These come from real TR battles through the working Java bridge, so
the recording contains genuine reactions to ModularBot's live fire. The
open-loop caveat is gone (perfect-information remains).
PRIMARY RESULT - the boss beats us badly. DrussGT 1447 - ModularBot 300 over
15 rounds, ModularBot winning only round 5 (DrussGT died at tick 1893). Rounds
are long, not truncated: mean 1335 ticks, ModularBot got off 1134 shots.
ModularBot 1134 shots / 60 hits = 5.3% real hit rate
DrussGT 1400 shots / 169 hits = 12.1% real hit rate
So DrussGT's gun is ~2.3x more accurate than our entire rack, on top of far
better movement. That is the number to move.
Also captured: shield-on variant (DrussGT 939-287, 9/10 - ModularBot takes
round 1 to the known shield warm-up), and vs SpinBot 1175-0, Crazy 1080-1,
Corners 1659-0. 20,026 + 12,629 + 10,824 + 11,507 + 2,575 ticks.
Movement statistics match the classic set within ~0.04 on the perpendicular
and radial fractions, so this is the same wave surfer in TR physics:
TR vs modularbot: perp 0.967, radial 0.001, 52.8% at full speed,
reversing 46.3%, median range 464 px.
CLOSED LOOP PROVEN, not asserted. ModularBot's fire is a heat-limited near
metronome (median interval 14 ticks), which gives a usable exogenous clock:
- event-locked |delta heading| oscillates 0.96 -> 2.69 deg about a 1.47 deg
mean with the fire period, almost every lag outside the 95% band of a
400-iteration phase-shuffled null;
- cross-correlation of |delta heading| against the fire impulse peaks at
r = +0.111, lag 12 ticks, permutation p = 0.005 (null peak mean +0.016);
- OWN-FIRE CONTROL is flat, so the oscillation is enemy-driven rather than
an internal cadence;
- range response is weak (~3 px over 30 ticks, near noise) and is therefore
NOT claimed, and per-bullet dodging is not claimed either because the
bullet detector (shield) is off.
CAVEATS: still perfect-information (observer gives true positions every tick,
unlike the live bot's stale between-scan WorldState) so these remain optimistic
vs live play; and they are open-loop AT REPLAY TIME - 'closed_loop' describes
the capture, not a later replay. TR conversion residual is ~1.5 deg mean
because the TR server moves along the pre-turn heading, vs 0.000 deg for the
classic captures.
Adds analyze_closed_loop.py (PSTH event-locking, phase-shuffle permutation
null, cross-correlation, own-fire control) and per-round result sidecars.
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
{"roundResults":[
|
||||
"[capture] ROUND 1 (turn 223): DrussGT rank=1 score=164 | Corners rank=2 score=0 | ",
|
||||
"[capture] ROUND 2 (turn 218): DrussGT rank=1 score=328 | Corners rank=2 score=0 | ",
|
||||
"[capture] ROUND 3 (turn 353): DrussGT rank=1 score=491 | Corners rank=2 score=0 | ",
|
||||
"[capture] ROUND 4 (turn 247): DrussGT rank=1 score=658 | Corners rank=2 score=0 | ",
|
||||
"[capture] ROUND 5 (turn 200): DrussGT rank=1 score=824 | Corners rank=2 score=0 | ",
|
||||
"[capture] ROUND 6 (turn 256): DrussGT rank=1 score=991 | Corners rank=2 score=0 | ",
|
||||
"[capture] ROUND 7 (turn 250): DrussGT rank=1 score=1160 | Corners rank=2 score=0 | ",
|
||||
"[capture] ROUND 8 (turn 247): DrussGT rank=1 score=1327 | Corners rank=2 score=0 | ",
|
||||
"[capture] ROUND 9 (turn 327): DrussGT rank=1 score=1493 | Corners rank=2 score=0 | ",
|
||||
"[capture] ROUND 10 (turn 254): DrussGT rank=1 score=1659 | Corners rank=2 score=0 | "
|
||||
]}
|
||||
@@ -0,0 +1 @@
|
||||
{"rounds":[{"round":1,"startTick":0,"count":223},{"round":2,"startTick":223,"count":218},{"round":3,"startTick":441,"count":353},{"round":4,"startTick":794,"count":247},{"round":5,"startTick":1041,"count":200},{"round":6,"startTick":1241,"count":256},{"round":7,"startTick":1497,"count":250},{"round":8,"startTick":1747,"count":247},{"round":9,"startTick":1994,"count":327},{"round":10,"startTick":2321,"count":254}]}
|
||||
@@ -0,0 +1,12 @@
|
||||
{"roundResults":[
|
||||
"[capture] ROUND 1 (turn 1453): DrussGT rank=1 score=95 | Crazy rank=2 score=1 | ",
|
||||
"[capture] ROUND 2 (turn 666): DrussGT rank=1 score=249 | Crazy rank=2 score=1 | ",
|
||||
"[capture] ROUND 3 (turn 1356): DrussGT rank=1 score=355 | Crazy rank=2 score=1 | ",
|
||||
"[capture] ROUND 4 (turn 771): DrussGT rank=1 score=470 | Crazy rank=2 score=1 | ",
|
||||
"[capture] ROUND 5 (turn 1369): DrussGT rank=1 score=561 | Crazy rank=2 score=1 | ",
|
||||
"[capture] ROUND 6 (turn 1182): DrussGT rank=1 score=662 | Crazy rank=2 score=1 | ",
|
||||
"[capture] ROUND 7 (turn 813): DrussGT rank=1 score=790 | Crazy rank=2 score=1 | ",
|
||||
"[capture] ROUND 8 (turn 1400): DrussGT rank=1 score=899 | Crazy rank=2 score=1 | ",
|
||||
"[capture] ROUND 9 (turn 857): DrussGT rank=1 score=987 | Crazy rank=2 score=1 | ",
|
||||
"[capture] ROUND 10 (turn 1640): DrussGT rank=1 score=1080 | Crazy rank=2 score=1 | "
|
||||
]}
|
||||
@@ -0,0 +1 @@
|
||||
{"rounds":[{"round":1,"startTick":0,"count":1453},{"round":2,"startTick":1453,"count":666},{"round":3,"startTick":2119,"count":1356},{"round":4,"startTick":3475,"count":771},{"round":5,"startTick":4246,"count":1369},{"round":6,"startTick":5615,"count":1182},{"round":7,"startTick":6797,"count":813},{"round":8,"startTick":7610,"count":1400},{"round":9,"startTick":9010,"count":857},{"round":10,"startTick":9867,"count":1640}]}
|
||||
@@ -0,0 +1,17 @@
|
||||
{"roundResults":[
|
||||
"[capture] ROUND 1 (turn 1252): DrussGT rank=1 score=71 | ModularBot rank=2 score=8 | ",
|
||||
"[capture] ROUND 2 (turn 1416): DrussGT rank=1 score=152 | ModularBot rank=2 score=20 | ",
|
||||
"[capture] ROUND 3 (turn 845): DrussGT rank=1 score=286 | ModularBot rank=2 score=36 | ",
|
||||
"[capture] ROUND 4 (turn 1446): DrussGT rank=1 score=385 | ModularBot rank=2 score=68 | ",
|
||||
"[capture] ROUND 5 (turn 1893): DrussGT rank=1 score=399 | ModularBot rank=2 score=156 | ",
|
||||
"[capture] ROUND 6 (turn 1080): DrussGT rank=1 score=499 | ModularBot rank=2 score=156 | ",
|
||||
"[capture] ROUND 7 (turn 1460): DrussGT rank=1 score=606 | ModularBot rank=2 score=188 | ",
|
||||
"[capture] ROUND 8 (turn 1213): DrussGT rank=1 score=708 | ModularBot rank=2 score=200 | ",
|
||||
"[capture] ROUND 9 (turn 1759): DrussGT rank=1 score=808 | ModularBot rank=2 score=228 | ",
|
||||
"[capture] ROUND 10 (turn 1380): DrussGT rank=1 score=910 | ModularBot rank=2 score=236 | ",
|
||||
"[capture] ROUND 11 (turn 1127): DrussGT rank=1 score=1026 | ModularBot rank=2 score=252 | ",
|
||||
"[capture] ROUND 12 (turn 1258): DrussGT rank=1 score=1144 | ModularBot rank=2 score=272 | ",
|
||||
"[capture] ROUND 13 (turn 1330): DrussGT rank=1 score=1240 | ModularBot rank=2 score=280 | ",
|
||||
"[capture] ROUND 14 (turn 1474): DrussGT rank=1 score=1336 | ModularBot rank=2 score=292 | ",
|
||||
"[capture] ROUND 15 (turn 1093): DrussGT rank=1 score=1447 | ModularBot rank=2 score=300 | "
|
||||
]}
|
||||
@@ -0,0 +1 @@
|
||||
{"rounds":[{"round":1,"startTick":0,"count":1252},{"round":2,"startTick":1252,"count":1416},{"round":3,"startTick":2668,"count":845},{"round":4,"startTick":3513,"count":1446},{"round":5,"startTick":4959,"count":1893},{"round":6,"startTick":6852,"count":1080},{"round":7,"startTick":7932,"count":1460},{"round":8,"startTick":9392,"count":1213},{"round":9,"startTick":10605,"count":1759},{"round":10,"startTick":12364,"count":1380},{"round":11,"startTick":13744,"count":1127},{"round":12,"startTick":14871,"count":1258},{"round":13,"startTick":16129,"count":1330},{"round":14,"startTick":17459,"count":1474},{"round":15,"startTick":18933,"count":1093}]}
|
||||
@@ -0,0 +1,12 @@
|
||||
{"roundResults":[
|
||||
"[capture] ROUND 1 (turn 593): ModularBot rank=1 score=139 | DrussGT rank=2 score=31 | ",
|
||||
"[capture] ROUND 2 (turn 1081): ModularBot rank=1 score=151 | DrussGT rank=2 score=144 | ",
|
||||
"[capture] ROUND 3 (turn 1237): DrussGT rank=1 score=246 | ModularBot rank=2 score=167 | ",
|
||||
"[capture] ROUND 4 (turn 1296): DrussGT rank=1 score=366 | ModularBot rank=2 score=195 | ",
|
||||
"[capture] ROUND 5 (turn 1550): DrussGT rank=1 score=452 | ModularBot rank=2 score=207 | ",
|
||||
"[capture] ROUND 6 (turn 1284): DrussGT rank=1 score=535 | ModularBot rank=2 score=211 | ",
|
||||
"[capture] ROUND 7 (turn 1364): DrussGT rank=1 score=618 | ModularBot rank=2 score=223 | ",
|
||||
"[capture] ROUND 8 (turn 1546): DrussGT rank=1 score=726 | ModularBot rank=2 score=255 | ",
|
||||
"[capture] ROUND 9 (turn 1286): DrussGT rank=1 score=837 | ModularBot rank=2 score=275 | ",
|
||||
"[capture] ROUND 10 (turn 1392): DrussGT rank=1 score=939 | ModularBot rank=2 score=287 | "
|
||||
]}
|
||||
@@ -0,0 +1 @@
|
||||
{"rounds":[{"round":1,"startTick":0,"count":593},{"round":2,"startTick":593,"count":1081},{"round":3,"startTick":1674,"count":1237},{"round":4,"startTick":2911,"count":1296},{"round":5,"startTick":4207,"count":1550},{"round":6,"startTick":5757,"count":1284},{"round":7,"startTick":7041,"count":1364},{"round":8,"startTick":8405,"count":1546},{"round":9,"startTick":9951,"count":1286},{"round":10,"startTick":11237,"count":1392}]}
|
||||
@@ -0,0 +1,12 @@
|
||||
{"roundResults":[
|
||||
"[capture] ROUND 1 (turn 1334): DrussGT rank=1 score=101 | Spin Bot rank=2 score=0 | ",
|
||||
"[capture] ROUND 2 (turn 1454): DrussGT rank=1 score=184 | Spin Bot rank=2 score=0 | ",
|
||||
"[capture] ROUND 3 (turn 758): DrussGT rank=1 score=284 | Spin Bot rank=2 score=0 | ",
|
||||
"[capture] ROUND 4 (turn 1035): DrussGT rank=1 score=417 | Spin Bot rank=2 score=0 | ",
|
||||
"[capture] ROUND 5 (turn 691): DrussGT rank=1 score=530 | Spin Bot rank=2 score=0 | ",
|
||||
"[capture] ROUND 6 (turn 1013): DrussGT rank=1 score=674 | Spin Bot rank=2 score=0 | ",
|
||||
"[capture] ROUND 7 (turn 1512): DrussGT rank=1 score=779 | Spin Bot rank=2 score=0 | ",
|
||||
"[capture] ROUND 8 (turn 1215): DrussGT rank=1 score=905 | Spin Bot rank=2 score=0 | ",
|
||||
"[capture] ROUND 9 (turn 1119): DrussGT rank=1 score=1031 | Spin Bot rank=2 score=0 | ",
|
||||
"[capture] ROUND 10 (turn 693): DrussGT rank=1 score=1175 | Spin Bot rank=2 score=0 | "
|
||||
]}
|
||||
@@ -0,0 +1 @@
|
||||
{"rounds":[{"round":1,"startTick":0,"count":1334},{"round":2,"startTick":1334,"count":1454},{"round":3,"startTick":2788,"count":758},{"round":4,"startTick":3546,"count":1035},{"round":5,"startTick":4581,"count":691},{"round":6,"startTick":5272,"count":1013},{"round":7,"startTick":6285,"count":1512},{"round":8,"startTick":7797,"count":1215},{"round":9,"startTick":9012,"count":1119},{"round":10,"startTick":10131,"count":693}]}
|
||||
Reference in New Issue
Block a user