refactor(movement): extract ram to harness — phantom meteor dodge-only, rammer module via harness decision

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-09-20 12:36:09 +02:00
parent ae9a5fec6d
commit c90874affd
2 changed files with 29 additions and 18 deletions
+29 -2
View File
@@ -26,6 +26,7 @@ import guns/averaged_lead
import guns/decay_gf
import guns/knn_gun
import movements/phantom_meteor
import movements/rammer
import movement_harness/virtual_bodies as mvb
import movement_harness/bullet_shadows
import targeting/enemy_tracker
@@ -71,6 +72,8 @@ type
decayGF: DecayGFGun
knnGun: KNNGun
mover: PhantomMeteorModule
rammer: RammerModule
isRamming: bool
moveTracker: VirtualBodyTracker
virtualHits: int
virtualMiss: int
@@ -85,7 +88,8 @@ proc printConfig(bot: ModularBot, changed: string = "") =
let gunColor = if changed == "gun" or changed == "all": CLR_CHANGE else: CLR_RST
let radarColor = if changed == "radar" or changed == "all": CLR_CHANGE else: CLR_RST
let radarName = if bot.radarMode == 0: "radar_lock" else: "melee_scan"
echo CLR_ROUND & "[config]" & CLR_RST & " " & gunColor & "gun=" & gunName & CLR_RST & " | " & CLR_MOVE & "move=phantom_meteor" & CLR_RST & " | " & radarColor & "radar=" & radarName & CLR_RST & " | enemies=" & $bot.enemyTracker.allAlive().len & " target=#" & $bot.currentTargetId
let moveName = if bot.isRamming: "rammer" else: "phantom_meteor"
echo CLR_ROUND & "[config]" & CLR_RST & " " & gunColor & "gun=" & gunName & CLR_RST & " | " & CLR_MOVE & "move=" & moveName & CLR_RST & " | " & radarColor & "radar=" & radarName & CLR_RST & " | enemies=" & $bot.enemyTracker.allAlive().len & " target=#" & $bot.currentTargetId
proc buildState(bot: ModularBot, ex, ey, espeed, eheading, eenergy: float): WorldState =
var ei: seq[EnemyInfo]
@@ -142,6 +146,7 @@ method onRoundStarted*(bot: ModularBot, e: RoundStartedEvent) =
bot.radar.init()
bot.mover.resetRound()
bot.enemyTracker.resetRound()
bot.isRamming = false
bot.hasContact = false
bot.tick = 0
bot.currentGun = -1
@@ -205,7 +210,28 @@ method run*(bot: ModularBot) =
go()
continue
let (spd, tr) = bot.mover.computeMove(bot.lastState)
# Ram decision — harness decides, not the movement module
let ws = bot.lastState
let ramDist = hypot(ws.enemyX - ws.selfX, ws.enemyY - ws.selfY)
let ramFinisher = ramDist < 300.0 and ws.enemyEnergy < 20.0 and ws.selfEnergy > ws.enemyEnergy
let ramOpportunity = ramDist < 80.0 and ws.selfEnergy > ws.enemyEnergy + 10.0
let ramDesperation = ws.selfEnergy < 5.0 and ws.enemyEnergy < 5.0 and ramDist < 150.0
let shouldRam = ramFinisher or ramOpportunity or ramDesperation
if shouldRam and not bot.isRamming:
bot.isRamming = true
let tag = if ramDesperation: "desperation" elif ramFinisher: "finisher" else: "opportunity"
echo CLR_MOVE & "[ram:" & tag & "] dist=" & $int(ramDist) &
" selfE=" & $int(ws.selfEnergy) & " enemyE=" & $int(ws.enemyEnergy) & CLR_RST
bot.printConfig("move")
elif not shouldRam and bot.isRamming:
bot.isRamming = false
bot.printConfig("move")
let (spd, tr) = if shouldRam:
bot.rammer.computeMove(ws)
else:
bot.mover.computeMove(ws)
setTargetSpeed(spd)
setTurnRate(tr)
@@ -399,6 +425,7 @@ when isMainModule:
radar: RadarLockModule(),
meleeScan: initMeleeScan(),
mover: initPhantomMeteor(),
rammer: initRammer(),
moveTracker: mvb.initVirtualBodyTracker(1),
currentGun: -1,
)