Files
SirRoboGarage/tools/fixtures/drussgt_meta/tr_drussgt_vs_modularbot.jsonl.results.json
T
SirStone 17c99f542f 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.
2026-09-21 01:18:13 +02:00

18 lines
1.4 KiB
JSON

{"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 | "
]}