# Darts The board is on the first-floor wall near the billiards area. It opens a native MASM darts match against Max. No Python, browser, external engine or network is required by the game. ## Match - Both players start at 500. First to reach exactly zero wins. - Three darts per visit. Visits alternate between the player and Max. - Any scoring ring can finish. This is a custom 500-point straight-out format, not tournament 501 double-out. - A negative remainder is a bust: the entire visit is cancelled and play passes to the other player. A remainder of one is valid. - The casino bankroll and saved profile are not changed by this game. ## Controls - Move the mouse to aim; the outlined cross marks the current hit point. - Hold the left mouse button to draw back, release to throw. - The hand and cross have the same smooth, mixed-phase sway. Holding the aim longer than 1.2 seconds gradually increases fatigue, capped after 4 seconds. Precise mouse motion is retained independently of the hall's 320px UI grid. There is no extra random scatter after releasing the button. - The target sector appears beside the turn indicator (S, D or T). - Tab opens/closes the live score sheet and pauses the current action. - R or the lower-right button starts a new match. Escape returns to the hall. ## Visuals The throwing line is 2700 board millimetres from the target. The initial lens is adjusted so the board is only about 7 percent smaller on screen than the previous 2370mm/900px view. Its original 512px texture and scoring geometry are unchanged. Max watches the same moving aim point for a short release window; he does not reroll a hit or bypass the sway. The independent scene camera follows one immutable parabolic trajectory, passes beside the dart, returns behind it, pauses at the hit, then returns to the throwing line. The small fading trail samples the same trajectory. Whole-arm raster animation includes the elbow, draw-back, release and empty follow-through. A single rigid canvas transform aligns the held dart with the target; individual limb pieces are never stretched or assembled. The flying dart uses sixteen detailed camera-relative raster views. Its needle anchor is registered per view, so the tip meets the scored board coordinate. It is not drawn from flat-colored geometric triangles. The lounge has actual ray-projected front/side/back walls, floor and ceiling. Chairs and the lamp table occupy fixed world planes, rather than turning to face the camera. The wall chalkboard is rewritten with real scores and recent visit history, including when seen from the moving camera. ## Assets And Checks `tools/generators/pack_darts.py` is an offline asset packer. It builds the exact 20-sector board and packs the generated arm, dart views and lounge artwork. Artwork provenance and prompts are in `assets/sprites/darts/prompts-v1.md`. `C:/Python314/python.exe tools/tests/check_darts.py` compiles the actual MASM scene into a native fixture and checks 67 scoring vectors, 20 complete bot matches, busts, per-player score isolation, immutable hits, real mouse-release events, fine high-resolution mouse input, sway/fatigue, board footprint, Tab behavior, camera motion and profile isolation. It renders native 640x480 framebuffers, a contact sheet and a GIF under `build/darts/`. `--parity` compares tested procedure instruction/relocation signatures to the full shipping assembly object. The hall fixture additionally covers interaction dispatch and the unchanged stairs, doors, bar and fortune room.