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/decay_gf
|
||||||
import guns/knn_gun
|
import guns/knn_gun
|
||||||
import movements/phantom_meteor
|
import movements/phantom_meteor
|
||||||
|
import movements/rammer
|
||||||
import movement_harness/virtual_bodies as mvb
|
import movement_harness/virtual_bodies as mvb
|
||||||
import movement_harness/bullet_shadows
|
import movement_harness/bullet_shadows
|
||||||
import targeting/enemy_tracker
|
import targeting/enemy_tracker
|
||||||
@@ -71,6 +72,8 @@ type
|
|||||||
decayGF: DecayGFGun
|
decayGF: DecayGFGun
|
||||||
knnGun: KNNGun
|
knnGun: KNNGun
|
||||||
mover: PhantomMeteorModule
|
mover: PhantomMeteorModule
|
||||||
|
rammer: RammerModule
|
||||||
|
isRamming: bool
|
||||||
moveTracker: VirtualBodyTracker
|
moveTracker: VirtualBodyTracker
|
||||||
virtualHits: int
|
virtualHits: int
|
||||||
virtualMiss: 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 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 radarColor = if changed == "radar" or changed == "all": CLR_CHANGE else: CLR_RST
|
||||||
let radarName = if bot.radarMode == 0: "radar_lock" else: "melee_scan"
|
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 =
|
proc buildState(bot: ModularBot, ex, ey, espeed, eheading, eenergy: float): WorldState =
|
||||||
var ei: seq[EnemyInfo]
|
var ei: seq[EnemyInfo]
|
||||||
@@ -142,6 +146,7 @@ method onRoundStarted*(bot: ModularBot, e: RoundStartedEvent) =
|
|||||||
bot.radar.init()
|
bot.radar.init()
|
||||||
bot.mover.resetRound()
|
bot.mover.resetRound()
|
||||||
bot.enemyTracker.resetRound()
|
bot.enemyTracker.resetRound()
|
||||||
|
bot.isRamming = false
|
||||||
bot.hasContact = false
|
bot.hasContact = false
|
||||||
bot.tick = 0
|
bot.tick = 0
|
||||||
bot.currentGun = -1
|
bot.currentGun = -1
|
||||||
@@ -205,7 +210,28 @@ method run*(bot: ModularBot) =
|
|||||||
go()
|
go()
|
||||||
continue
|
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)
|
setTargetSpeed(spd)
|
||||||
setTurnRate(tr)
|
setTurnRate(tr)
|
||||||
|
|
||||||
@@ -399,6 +425,7 @@ when isMainModule:
|
|||||||
radar: RadarLockModule(),
|
radar: RadarLockModule(),
|
||||||
meleeScan: initMeleeScan(),
|
meleeScan: initMeleeScan(),
|
||||||
mover: initPhantomMeteor(),
|
mover: initPhantomMeteor(),
|
||||||
|
rammer: initRammer(),
|
||||||
moveTracker: mvb.initVirtualBodyTracker(1),
|
moveTracker: mvb.initVirtualBodyTracker(1),
|
||||||
currentGun: -1,
|
currentGun: -1,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -218,22 +218,6 @@ proc computeMove*(m: var PhantomMeteorModule, ws: WorldState): MoveCommand =
|
|||||||
else:
|
else:
|
||||||
enemyVecs.add enemyPos
|
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
|
# Advance simulation
|
||||||
m.engine.tickPhantoms()
|
m.engine.tickPhantoms()
|
||||||
m.engine.tickWaves(botPos)
|
m.engine.tickWaves(botPos)
|
||||||
|
|||||||
Reference in New Issue
Block a user