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:
@@ -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,
|
||||
)
|
||||
|
||||
@@ -218,22 +218,6 @@ proc computeMove*(m: var PhantomMeteorModule, ws: WorldState): MoveCommand =
|
||||
else:
|
||||
enemyVecs.add enemyPos
|
||||
|
||||
# ── Ram override ─────────────────────────────────────────────────────────────
|
||||
let ramDist = dist(botPos, enemyPos)
|
||||
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
|
||||
if ramFinisher or ramOpportunity or ramDesperation:
|
||||
let tag = if ramDesperation: "desperation" elif ramFinisher: "finisher" else: "opportunity"
|
||||
echo CLR_CYAN & "[ram:" & tag & "] dist=" & $int(ramDist) &
|
||||
" selfE=" & $int(ws.selfEnergy) & " enemyE=" & $int(ws.enemyEnergy) & CLR_RST
|
||||
let headingRad = arctan2(enemyPos.y - botPos.y, enemyPos.x - botPos.x)
|
||||
let desiredDeg = radToDeg(headingRad)
|
||||
var delta = desiredDeg - ws.selfHeading
|
||||
while delta > 180.0: delta -= 360.0
|
||||
while delta < -180.0: delta += 360.0
|
||||
return (speed: 8.0, turnRate: delta.clamp(-10.0, 10.0))
|
||||
|
||||
# Advance simulation
|
||||
m.engine.tickPhantoms()
|
||||
m.engine.tickWaves(botPos)
|
||||
|
||||
Reference in New Issue
Block a user