j134 fix: tracker must take the mover's switch per-call (instance flag was silently off on the object-literal construction path) + apply the correction on the reading that carries the server's turn-N+1 energy change (two-slot buffer); live-verified alignment
This commit is contained in:
@@ -312,7 +312,7 @@ proc resetRound*(m: var LearnedSurferModule) =
|
||||
|
||||
proc initLearnedSurfer*(): LearnedSurferModule =
|
||||
result.debugGraphics = false
|
||||
result.fire = initFireTracker(LearnedFireFix)
|
||||
result.fire = initFireTracker()
|
||||
result.sbc = initCountedSbc(LS_NADE, LS_BINS,
|
||||
max(0, LearnedDecayEvery),
|
||||
max(0, LearnedDecayShift))
|
||||
@@ -498,11 +498,13 @@ proc prevEnergySet(m: var LearnedSurferModule, id: int, energy: float) =
|
||||
|
||||
proc noteEnemyBulletHit*(m: var LearnedSurferModule, power: float) =
|
||||
## `onHitByBullet` -> the shooter's `3*power` bonus (no-op when off).
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
if LearnedFireFix:
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
|
||||
proc noteDamageDealt*(m: var LearnedSurferModule, damage: float) =
|
||||
## `onBulletHit` -> our same-tick damage to the enemy (no-op when off).
|
||||
m.fire.noteDamageDealt(damage)
|
||||
if LearnedFireFix:
|
||||
m.fire.noteDamageDealt(damage)
|
||||
|
||||
proc detectFire(m: var LearnedSurferModule, id: int, ex, ey, eenergy: float,
|
||||
ws: WorldState) =
|
||||
@@ -510,7 +512,7 @@ proc detectFire(m: var LearnedSurferModule, id: int, ex, ey, eenergy: float,
|
||||
## drop IS a wave; the state is the wave-relative state at THIS tick (the
|
||||
## fire tick). Window 0.09..3.01, LEARNED's shipped window; the shared
|
||||
## tracker corrects the delta and splits an over-cap drop across waves.
|
||||
for drop in m.fire.detect(id, eenergy, 0.09, 3.01):
|
||||
for drop in m.fire.detect(id, eenergy, 0.09, 3.01, LearnedFireFix):
|
||||
let botX = ws.selfX
|
||||
let botY = ws.selfY
|
||||
let bspeed = 20.0 - 3.0 * drop
|
||||
|
||||
@@ -474,7 +474,7 @@ type
|
||||
lastTileCol, lastTileRow: int
|
||||
|
||||
proc initStrafe*(): StrafeModule =
|
||||
StrafeModule(debugGraphics: false, fire: initFireTracker(StrafeFireFix))
|
||||
StrafeModule(debugGraphics: false, fire: initFireTracker())
|
||||
|
||||
proc removeBulletNear*(m: var StrafeModule, x, y: float) =
|
||||
## Mark the tracked bullet closest to (x,y) within GridSize tolerance as dead.
|
||||
@@ -592,7 +592,8 @@ proc noteEnemyBulletHit*(m: var StrafeModule, power: float) =
|
||||
## "no fire"). ModularBot forwards `onHitByBullet`'s `e.bullet.power` here so
|
||||
## `detectFires` can add the bonus back before classifying the delta.
|
||||
## No-op when the fix is off (shipped detector preserved).
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
if StrafeFireFix:
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
|
||||
proc noteDamageDealt*(m: var StrafeModule, damage: float) =
|
||||
## The mirror contamination: OUR bullet damaging the enemy this tick adds
|
||||
@@ -600,7 +601,8 @@ proc noteDamageDealt*(m: var StrafeModule, damage: float) =
|
||||
## cap and get the enemy's OWN shot rejected by the shipped `<= 3.01` test.
|
||||
## ModularBot forwards `onBulletHit`'s `e.damage` here.
|
||||
## No-op when the fix is off.
|
||||
m.fire.noteDamageDealt(damage)
|
||||
if StrafeFireFix:
|
||||
m.fire.noteDamageDealt(damage)
|
||||
|
||||
proc detectFires(m: var StrafeModule, ws: WorldState) =
|
||||
## The shared tracker does the delta correction + split; STRAFE supplies its
|
||||
@@ -612,7 +614,7 @@ proc detectFires(m: var StrafeModule, ws: WorldState) =
|
||||
" raw=", raw,
|
||||
" bonus=", m.fire.hitBonusPending,
|
||||
" dealt=", m.fire.dealtPending
|
||||
for p in m.fire.detect(ei.id, ei.energy, 0.09, 3.01):
|
||||
for p in m.fire.detect(ei.id, ei.energy, 0.09, 3.01, StrafeFireFix):
|
||||
m.spawnTrackedWave(ws, ei, p)
|
||||
m.fire.endScan()
|
||||
|
||||
|
||||
@@ -263,7 +263,7 @@ type
|
||||
lastPickCall: int ## callCount at the last pick (log only)
|
||||
picks: int ## number of picks this round (log only)
|
||||
|
||||
proc initTFIL*(): TFILModule = TFILModule(debugGraphics: false, fire: initFireTracker(TfilFireFix))
|
||||
proc initTFIL*(): TFILModule = TFILModule(debugGraphics: false, fire: initFireTracker())
|
||||
|
||||
proc removeBulletNear*(m: var TFILModule, x, y: float) =
|
||||
## Mark the tracked bullet closest to (x,y) within GridSize tolerance as dead.
|
||||
@@ -371,17 +371,19 @@ proc spawnTrackedWave(m: var TFILModule, ws: WorldState, ei: EnemyInfo,
|
||||
|
||||
proc noteEnemyBulletHit*(m: var TFILModule, power: float) =
|
||||
## `onHitByBullet` -> the shooter's `3*power` bonus (no-op when off).
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
if TfilFireFix:
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
|
||||
proc noteDamageDealt*(m: var TFILModule, damage: float) =
|
||||
## `onBulletHit` -> our same-tick damage to the enemy (no-op when off).
|
||||
m.fire.noteDamageDealt(damage)
|
||||
if TfilFireFix:
|
||||
m.fire.noteDamageDealt(damage)
|
||||
|
||||
proc detectFires(m: var TFILModule, ws: WorldState) =
|
||||
## Check all enemies for energy drops; spawn a tracked bullet per confirmed
|
||||
## fire. The shared tracker corrects the delta and splits over-cap drops.
|
||||
for ei in ws.enemies:
|
||||
for p in m.fire.detect(ei.id, ei.energy, 0.09, 3.01):
|
||||
for p in m.fire.detect(ei.id, ei.energy, 0.09, 3.01, TfilFireFix):
|
||||
m.spawnTrackedWave(ws, ei, p)
|
||||
m.fire.endScan()
|
||||
|
||||
|
||||
@@ -255,7 +255,7 @@ type
|
||||
|
||||
proc initTFILRing*(): TFILRingModule =
|
||||
TFILRingModule(debugGraphics: false, band: (lo: RangeLo, hi: RangeHi),
|
||||
fire: initFireTracker(TfilRingFireFix))
|
||||
fire: initFireTracker())
|
||||
|
||||
proc removeBulletNear*(m: var TFILRingModule, x, y: float) =
|
||||
## Mark the tracked bullet closest to (x,y) within GridSize tolerance as dead.
|
||||
@@ -329,17 +329,19 @@ proc spawnTrackedWave(m: var TFILRingModule, ws: WorldState, ei: EnemyInfo,
|
||||
|
||||
proc noteEnemyBulletHit*(m: var TFILRingModule, power: float) =
|
||||
## `onHitByBullet` -> the shooter's `3*power` bonus (no-op when off).
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
if TfilRingFireFix:
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
|
||||
proc noteDamageDealt*(m: var TFILRingModule, damage: float) =
|
||||
## `onBulletHit` -> our same-tick damage to the enemy (no-op when off).
|
||||
m.fire.noteDamageDealt(damage)
|
||||
if TfilRingFireFix:
|
||||
m.fire.noteDamageDealt(damage)
|
||||
|
||||
proc detectFires(m: var TFILRingModule, ws: WorldState) =
|
||||
## Check all enemies for energy drops; spawn a tracked bullet per confirmed
|
||||
## fire. The shared tracker corrects the delta and splits over-cap drops.
|
||||
for ei in ws.enemies:
|
||||
for p in m.fire.detect(ei.id, ei.energy, 0.09, 3.01):
|
||||
for p in m.fire.detect(ei.id, ei.energy, 0.09, 3.01, TfilRingFireFix):
|
||||
m.spawnTrackedWave(ws, ei, p)
|
||||
m.fire.endScan()
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ proc resetRound*(m: var WaveSurferModule) =
|
||||
for i in 0..<WS_BINS: m.bins[i] = 1.0
|
||||
|
||||
proc initWaveSurfer*(): WaveSurferModule =
|
||||
var m = WaveSurferModule(debugGraphics: false, fire: initFireTracker(SurfFireFix))
|
||||
var m = WaveSurferModule(debugGraphics: false, fire: initFireTracker())
|
||||
m.resetRound()
|
||||
m
|
||||
|
||||
@@ -149,11 +149,13 @@ proc prevEnergySet(m: var WaveSurferModule, id: int, energy: float) =
|
||||
|
||||
proc noteEnemyBulletHit*(m: var WaveSurferModule, power: float) =
|
||||
## `onHitByBullet` -> the shooter's `3*power` bonus (no-op when off).
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
if SurfFireFix:
|
||||
m.fire.noteEnemyBulletHit(power)
|
||||
|
||||
proc noteDamageDealt*(m: var WaveSurferModule, damage: float) =
|
||||
## `onBulletHit` -> our same-tick damage to the enemy (no-op when off).
|
||||
m.fire.noteDamageDealt(damage)
|
||||
if SurfFireFix:
|
||||
m.fire.noteDamageDealt(damage)
|
||||
|
||||
proc gfToBin(gf: float64): int {.inline.} =
|
||||
clamp(int(round((gf.clamp(-1.0, 1.0) + 1.0) * 0.5 * float64(WS_BINS - 1))),
|
||||
@@ -191,7 +193,7 @@ proc detectFire(m: var WaveSurferModule, id: int, ex, ey, eenergy,
|
||||
## (corrected) one-tick drop. `drop` IS the firepower. Window 0.1..3.0,
|
||||
## SURF's shipped window; the shared tracker corrects the delta and splits an
|
||||
## over-cap drop across several waves.
|
||||
for power in m.fire.detect(id, eenergy, 0.1, 3.0):
|
||||
for power in m.fire.detect(id, eenergy, 0.1, 3.0, SurfFireFix):
|
||||
let bspeed = 20.0 - 3.0 * power
|
||||
let bearing = arctan2(botY - ey, botX - ex)
|
||||
let d = hypot(botX - ex, botY - ey)
|
||||
|
||||
Reference in New Issue
Block a user