diff --git a/common_libs/movements/rammer.nim b/common_libs/movements/rammer.nim index c649575..8a88678 100644 --- a/common_libs/movements/rammer.nim +++ b/common_libs/movements/rammer.nim @@ -13,19 +13,23 @@ type RammerModule* = object 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) + let dx = ws.enemyX - ws.selfX + let dy = ws.enemyY - ws.selfY + # Tank Royale: 0° = East, cos for X, sin for Y + let targetBearing = arctan2(dy, dx) * 180.0 / PI - # Delta from current heading to enemy bearing - var delta = enemyBearing - ws.selfHeading - while delta > 180.0: delta -= 360.0 + # Angle we need to turn (relative to current heading) + var delta = targetBearing - ws.selfHeading + # Normalize to -180..180 + 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)) + # Drive forward or backward — whichever requires less turning + if abs(delta) <= 90.0: + # Forward: turn toward enemy, full speed ahead + (speed: MaxSpeed, turnRate: delta.clamp(-10.0, 10.0)) + else: + # Backward: reverse toward enemy + # Flip delta by 180° to get the reverse heading + var revDelta = delta + (if delta > 0.0: -180.0 else: 180.0) + (speed: -MaxSpeed, turnRate: revDelta.clamp(-10.0, 10.0))