# Ringfall changelog

## 0.1.0 — 2026-09-15

### Milestone 1 — Project foundation
- Created a Rust workspace for shared game simulation, an authoritative server, and a WebAssembly/WebGL 2 client.
- Designed an original two-base arena project, with no retail game assets or game runtime dependencies.
- Added the multiplayer lobby, callsign and armor selection, room browser, armory, field guide, and persistent settings.
- Established port 40106 and a same-origin deployment architecture for the game and WebSocket server.

### Milestone 2 — Playable multiplayer
- Hosted the native server at `http://localhost:40106` with static web and WebSocket connections on the same origin.
- Implemented an original WebGL 2 arena with grass terrain, cliffs, two sci-fi bases, cover, raised platforms, an orbital sky arc, six weapon models, and animated armored players.
- Added predicted movement, jumping, collision, authoritative weapon fire, reloads, regenerating shields, health, grenades, melee, pickups, death, respawn, and round scoring.
- Added public and invite-link rooms, Slayer and Team Slayer, AI opponents, chat, scoreboard, radar, and touch controls.
- Initial live protocol verification passed: HTTP/WASM hosting, two-client shared room state and movement, chat and ping, unknown-room rejection, and authoritative input bounds.

### Milestone 3 — Integration and regression testing
- Passed the full Chrome flow: desktop/mobile lobby, armory, field guide, callsign/armor persistence, saved sensitivity/volume/field-of-view/quality, invalid codes, room creation, invite joining, two-player state, movement/jumping, firing/reloading/grenades, scoreboard/chat, leave/rejoin, and public bots.
- Verified real touch joystick movement and firing through Chrome touch input; adjusted the landscape HUD to avoid controls overlapping ammunition and radar.
- Verified a real network opponent damages the browser player's shield, kills them, updates score and kill feed, and triggers the visible respawn countdown and return to play.
- Walked the arena in Chrome to collect the launcher, shotgun, sniper, and plasma pickups; climbed the sniper platform, unlocked/equipped/fired all six weapons, used sniper zoom, and checked Q cycling.
- Verified server-offline recovery, empty room lists, offline disconnect cleanup, mobile settings, the changelog link, and the missing-WebGL fallback.
- Fixed short mouse/touch clicks lost between ticks, explicit Escape mouse release, inventory synchronization, team armor colors, initial outdoor spawn views, stale connection handling, and deployment file permissions.
- Added 37 Rust tests across shared simulation, server, live WebSocket integration, and client geometry; strict Clippy succeeds with warnings denied.

### Milestone 4 — Publishing support
- Built and ran the Linux Docker image as a non-root user; verified HTTP/WASM hosting and all four live protocol tests against the container.
- Ran the standalone macOS ARM64 release bundle on a separate port; all four live protocol tests passed.
- Added native-platform and source release archive scripts, Docker Compose hosting, an HTTPS reverse-proxy example, and deployment documentation.
- Vendored open-license fonts so the game needs no third-party runtime assets, CDN, npm server, or separate matchmaking service.

### Known scope
- One original infantry arena; Slayer and Team Slayer only. No campaign, vehicles, capture-the-flag, persistent accounts, voice chat, or exact retail-physics parity.
- WebGL 2 is the implemented renderer. WebGPU is not implemented.
- Browser verification used Chrome with software WebGL and emulated touch. Physical-device performance and real internet latency remain unverified.
- In-memory room state, heuristic bots, and basic rate limiting are suitable for a small-group prototype, not a hardened large-scale public service.
