Skeuomorphic team1/team2 stone chips near top of HUD; deplete
left-to-right from stones_remaining. Score strip shows end totals.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Replace constant-rate velocity rotate with ω0 spin + v_lat curl.
Path samples are (x, y, theta); client time is index/SAMPLE_RATE_HZ.
Ultraworked with [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
Co-authored-by: Sisyphus <sisyphus@ohmyopencode>
Replace weight-scaled rapier damping with pure initial velocity (m/s),
piecewise-linear ice µ(v) table, and post-step a=−µ_eff·g·unit(v) drag.
Remove left/right/back wall colliders; OOB stones leave via prune only.
game.rs maps legacy weight→velocity via MIN/MAX until B3.
Calibrated DRAW_VELOCITY=2.38 m/s lands near tee (±0.8 m).
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Anyone may join and watch/throw; game auto-starts on first connection.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Anyone identifying as the turn team can throw; room slots for 1v1 removed.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Collision playback needs all stones sampled on a shared t=0 release clock.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Clients send team on throw; joined no longer assigns a fixed slot team.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Drop unused Game methods, Room.id field, and backend-only sheet ring constants that duplicated frontend definitions.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Extract mutable state from game.ts into a dedicated GameModel class to clarify data flow and state transitions.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Replace the ad-hoc StoneState | {...} union in drawStone/draw with a named DrawableStone type.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Replace std::sync::Mutex with tokio::sync::Mutex; extract try_join_room, register_player, spawn_forwarder, broadcast_room_state, spawn_message_handler, remove_player.
Use Game::process_throw in the message handler.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>