From bbc9e511667650009db4849ee62e1cdcf91137c8 Mon Sep 17 00:00:00 2001 From: Davide Cappellini Date: Sun, 16 Aug 2026 16:40:28 +0200 Subject: [PATCH] =?UTF-8?q?fix(PPO=5FBot):=20state=20vector=20bearing=20us?= =?UTF-8?q?es=20game=20coords=20(north=3D0=C2=B0=20CW)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- PPO_Bot/state_vector.nim | 2 +- PPO_Bot/tests/test_state.nim | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/PPO_Bot/state_vector.nim b/PPO_Bot/state_vector.nim index 831dcde..e25b9ef 100644 --- a/PPO_Bot/state_vector.nim +++ b/PPO_Bot/state_vector.nim @@ -61,7 +61,7 @@ proc buildStateVector*(bot: BotStateData; enemy: EnemyTracker): Tensor[float32] # Relative bearing to enemy (signed, from bot perspective) let dx = enemy.current.x - bot.x let dy = enemy.current.y - bot.y - let absDir = (180.0 * arctan2(dy, dx) / PI + 360.0) mod 360.0 + let absDir = (180.0 * arctan2(dx, dy) / PI + 360.0) mod 360.0 let relBearing = ((absDir - bot.direction) + 540.0) mod 360.0 - 180.0 result[16] = float32(relBearing / 180.0) # Distance to enemy diff --git a/PPO_Bot/tests/test_state.nim b/PPO_Bot/tests/test_state.nim index 0c7e03e..401b8d3 100644 --- a/PPO_Bot/tests/test_state.nim +++ b/PPO_Bot/tests/test_state.nim @@ -119,9 +119,9 @@ block testWallDistances: check abs(sv[21] - 0.875f32) < 0.001f32, "right wall = 0.875" block testRelativeBearing: - # Bot at (0,0) dir=0°. Enemy at (0,100) → arctan2(100,0)=90° absolute. - # relBearing = (90 - 0 + 540) mod 360 - 180 = 90° - # normalized = 90 / 180 = 0.5 + # Game convention: north=0°, CW. arctan2(dx,dy) used. + # Bot at (0,0) dir=0°. Enemy at (0,100) → due north → absDir=0°. + # relBearing = (0 - 0 + 540) mod 360 - 180 = 0°. normalized = 0/180 = 0.0 var t = initEnemyTracker() t.update(0.0, 100.0, 0.0, 0.0, 100.0) let bot = BotStateData( @@ -130,7 +130,20 @@ block testRelativeBearing: arenaWidth: 800.0, arenaHeight: 600.0, ) let sv = buildStateVector(bot, t) - check abs(sv[16] - 0.5f32) < 0.01f32, "relative bearing = 0.5, got " & $sv[16] + check abs(sv[16] - 0.0f32) < 0.01f32, "relative bearing = 0.0 (due north), got " & $sv[16] + +block testRelativeBearingEast: + # Enemy at (100,0) → due east → absDir=90°. + # relBearing = (90 - 0 + 540) mod 360 - 180 = 90°. normalized = 90/180 = 0.5 + var t = initEnemyTracker() + t.update(100.0, 0.0, 0.0, 0.0, 100.0) + let bot = BotStateData( + x: 0.0, y: 0.0, direction: 0.0, speed: 0.0, energy: 100.0, + gunDirection: 0.0, gunHeat: 0.0, + arenaWidth: 800.0, arenaHeight: 600.0, + ) + let sv = buildStateVector(bot, t) + check abs(sv[16] - 0.5f32) < 0.01f32, "relative bearing east = 0.5, got " & $sv[16] block testHistoryPaddedWhenEmpty: var t = initEnemyTracker()