Add A* pathfinding movement to the engine master
Movement is now target-based, per the agreed model: an action sets a destination, the reducer computes a collision-free path, and time advances the player along it. - nav.ts: NavGrid + buildNav() (rasterizes collision rects into a walkability grid), worldToCell/cellCenter, and aStar() — 8-directional, no corner cutting, with straight runs collapsed; snaps blocked endpoints to the nearest walkable cell, returns null when unreachable. Pure/deterministic, safe to run in the reducer. - map.ts: reads collision out of a world.tilemap.map record (the sibling tilemap.world format) — areaNodes flagged world.tilemap.collision="1", recursing groups and skipping hidden nodes — and navFromMap() to build a grid (default cell = tile/3 subcell). - Engine wiring: GameState.nav, Player.dest/path, config.moveSpeedPxPerSec; a setDestination action that runs A*; movement integrated on every time advance (tick is the heartbeat); paths cleared on teleport/act/kick. Projection exposes dest/path to self only (others are conveyed by streamed position updates). 12 tests added (nav rasterize/convert, A* straight/around-wall/unreachable/no-corner-cut, map collision extraction, and reducer movement). Full suite 42 green; tsc -b clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>