j147 results: 180-battle live A/B on the frozen 15-opponent panel

Within-mover references (the only comparison that isolates the knob): tfil_lag1
-0.04 wins/run, strafe_lag1 +0.18 wins/run, both far under the reported MDEs
(0.33 / 0.41) -> NOT distinguishable, so TR_FIRE_LAG stays default 0. Incoming
hit rate also unmoved (+0.94 / +0.33 pp). The one significant result is the
mover (strafe_lag1 vs tfil_off +0.38 wins/run p=0.0386, hit rate -4.67pp
p=0.0074), which is the known strafe-over-tfil gap and exactly why the
within-mover reference was pre-registered.

Also a cosmetic no-op refactor of the two spawn sites (compute velX/velY once;
bit-identical, and it keeps the default-parity claim exact).
This commit is contained in:
2026-09-26 23:20:36 +02:00
parent d21f7ce5f5
commit 32ec040e90
4 changed files with 104 additions and 12 deletions
+6 -4
View File
@@ -433,16 +433,18 @@ proc spawnTrackedWave(m: var TFILModule, ws: WorldState, ei: EnemyInfo,
m.bullets.del(0) # ponytail: drop oldest; fine for 20-bullet cap
# j147: back-date the shot by the measured detection lag (`TR_FIRE_LAG`,
# default 0 = untouched). See `movement_harness/fire_tracker.nim`.
let vx = speed * cos(heading)
let vy = speed * sin(heading)
var gx = ei.x
var gy = ei.y
if FireLag > 0:
gx += (speed * cos(heading)) * FireLag.float
gy += (speed * sin(heading)) * FireLag.float
gx += vx * FireLag.float
gy += vy * FireLag.float
m.bullets.add TrackedBullet(
originX: ei.x, originY: ei.y,
x: gx, y: gy,
velX: speed * cos(heading),
velY: speed * sin(heading),
velX: vx,
velY: vy,
power: power,
alive: true,
age: 0)