fbf9414375
- Ram movement: drive straight at enemy (not wired, needs selector) - Averaged-lead gun: mean of linear+circular+wall-bounce predictions - 12 guns total, battle-tested Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
32 lines
994 B
Nim
32 lines
994 B
Nim
## Rammer movement — drive straight at enemy at max speed.
|
|
## Forward/backward optimization: if enemy is behind, reverse instead of U-turning.
|
|
|
|
import std/math
|
|
import gun_harness/gun_interface
|
|
import movement_harness/movement_interface
|
|
|
|
const MaxSpeed* = 8.0
|
|
|
|
type RammerModule* = object
|
|
discard
|
|
|
|
proc initRammer*(): RammerModule = RammerModule()
|
|
|
|
proc computeMove*(m: var RammerModule, ws: WorldState): MoveCommand =
|
|
let enemyBearing = arctan2(ws.enemyY - ws.selfY, ws.enemyX - ws.selfX) * (180.0 / PI)
|
|
|
|
# Delta from current heading to enemy bearing
|
|
var delta = enemyBearing - ws.selfHeading
|
|
while delta > 180.0: delta -= 360.0
|
|
while delta < -180.0: delta += 360.0
|
|
|
|
# If enemy is behind (|delta| > 90°), reverse to avoid U-turn
|
|
let (speed, turnDelta) =
|
|
if abs(delta) <= 90.0:
|
|
(MaxSpeed, delta)
|
|
else:
|
|
let backDelta = if delta > 0.0: delta - 180.0 else: delta + 180.0
|
|
(-MaxSpeed, backDelta)
|
|
|
|
(speed: speed, turnRate: turnDelta.clamp(-10.0, 10.0))
|