# lockstep artillery - build roadmap ## phase 1: foundation - [x] set up build.zig with raylib-zig dependency - [x] create fixed-point math module (Fixed struct, add/sub/mul/div) - [x] create trig lookup tables (sin/cos at comptime) - [x] basic window opens with raylib ## phase 2: single-player simulation - [ ] define GameState, Player, Projectile structs - [ ] terrain generation (random jagged line) - [ ] cannon aiming (angle adjustment with keys) - [ ] power adjustment - [ ] fire projectile - [ ] projectile physics (gravity, movement) - [ ] terrain collision detection - [ ] player hit detection - [ ] turn switching after shot resolves ## phase 3: rendering - [ ] draw terrain as connected line segments - [ ] draw players as geometric shapes - [ ] draw cannon angle indicator - [ ] draw power meter - [ ] draw projectile with trail (last N positions) - [ ] implement bloom shader (blur.fs) - [ ] render-to-texture pipeline for glow effect - [ ] explosion effect (expanding circle) ## phase 4: local two-player - [ ] split keyboard input (player 1: wasd+space, player 2: arrows+enter) - [ ] verify determinism by running two simulations side-by-side - [ ] add checksum verification ## phase 5: networking - [ ] UDP socket wrapper (bind, send, receive) - [ ] define packet format (INPUT, SYNC, PING, PONG) - [ ] host mode: listen for connection, send initial SYNC - [ ] guest mode: connect, receive SYNC, start simulation - [ ] input exchange each frame - [ ] handle packet loss (resend on timeout) - [ ] checksum exchange and desync detection - [ ] latency display ## phase 6: polish - [ ] wind indicator - [ ] health bars - [ ] win/lose screen - [ ] rematch option - [ ] sound effects (optional, breaks no-dependency purity) ## known pitfalls to watch - [ ] don't use floats in simulation - [ ] don't iterate hashmaps - [ ] don't use @sin/@cos - use lookup tables - [ ] always process inputs in same order (player 0 then player 1) - [ ] serialize terrain heights as fixed-point, not float ## stretch goals - [ ] destructible terrain (explosion removes pixels) - [ ] multiple weapon types - [ ] rollback netcode (predict, rewind, replay on correction) - [ ] replay file save/load - [ ] web build via emscripten