About this tile
Two-player count-up darts. Both players start at 0. Each turn throws 3 darts; every dart adds its segment value (single = sector, double = 2×, triple = 3×, outer-bull = 25, inner-bull = 50, miss = 0). After 3 rounds the higher cumulative score wins; tied scores are a draw. No bust rules, no double-out — pure arcade scoring.
What you can do
- Play a 3-round count-up match against another real player. Pure arcade scoring — every dart adds to your total.
- Throw with feel — drag up from the throwing zone to aim; longer, committed swipes are accurate, short flicks scatter.
- See the running totals count up live as each dart lands; the leader gets a green "LEAD" pill, the active thrower gets a gold "TO THROW" pill.
- Watch the opponent throw in real time — their darts appear on your board the instant they're thrown.
- Track match progress at a glance via the 3-pip round-progress strip above the scoreboard.
- Rematch from the end-of-game screen; seats swap on rematch so the player who started last time goes second.
Built on Synced-Store
Darts uses synced-store as its single source of truth: one game row tracks status and live turn state, and each dart is its own row in a throws table keyed by a zero-padded index. This keeps multi-user sync, optimistic offline-first throws, and full match history free.
Cheat-proof scoring
The client passes only landingX, landingY SVG coords to the throwDart mutator. The server independently re-derives the segment and points from those coords via pointToSegment + scoreSegment, so a malicious client can't lie about points. Coordinate bounds (±300), score bounds (0–7200), and maxRounds bounds (1–20) are enforced at the trust boundary per PRINCIPLES.md.
Visual baseline
The dartboard rendering, hit detection geometry, and arcing throw zone are ported from a standalone HTML prototype. The match-3 gameplay of that prototype is replaced here with real darts scoring (singles / doubles / triples / bullseye, count-up totals).