diff options
| author | salmonik <salmonik@tuta.io> | 2026-11-01 21:09:56 +0100 |
|---|---|---|
| committer | salmonik <salmonik@tuta.io> | 2026-11-01 21:09:56 +0100 |
| commit | bf4cf78ab26896faf457273e37d30fc96381c4a4 (patch) | |
| tree | 71d67c300b6be191016a988ed5338e15c8b1bdd3 /docs | |
| parent | v4.1.1: pointer-first betting and visible payouts in the GUI (diff) | |
| download | zagan-bet-bf4cf78ab26896faf457273e37d30fc96381c4a4.tar.gz zagan-bet-bf4cf78ab26896faf457273e37d30fc96381c4a4.zip | |
v4.2.0: wire the GUI to the core, transport and all four games
Phase 4. The egui frontend now shares ClientCore and the client database with the terminal: one background worker owns TLS, trust answers go through a channel, and a 10 s request deadline mirrors the terminal socket timeout. First contact, a changed key and a version mismatch are explicit screens; login can remember the credential and auto-login signs in before the login form appears.
Adds the lobby with an update notice, a full-width scrollable history table, and the four games painted from View: slots with reel animation and win lines that stop at the last matching reel, roulette with the hover lattice and wheel spin, blackjack with vector-drawn suits, and a smooth crash curve. Sidebars pin their action block; leaving a live hand or round asks before forfeiting.
The header balance holds the staked amount while the reels or wheel turn and only shows the payout when they stop. Refused spins cancel the animation. Live crash multipliers keep full precision for the chart; the terminal still displays two decimals.
Verified live against a 4.2.0 server: register, login, auto-login, trust, all four games settling, history (50 rows), logout, disconnect, forfeit confirmation, and the version-mismatch screen. Release: 8.3 MB Linux, 6.8 MB Windows, 61 ms to window, 131 MB idle RSS.
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/GUI-PLAN.md | 71 | ||||
| -rw-r--r-- | docs/TESTING.md | 60 | ||||
| -rw-r--r-- | docs/screenshots/gui-blackjack-1080p.png | bin | 0 -> 60075 bytes | |||
| -rw-r--r-- | docs/screenshots/gui-crash-1080p.png | bin | 0 -> 64377 bytes | |||
| -rw-r--r-- | docs/screenshots/gui-history-1080p.png | bin | 0 -> 166509 bytes | |||
| -rw-r--r-- | docs/screenshots/gui-lobby-1080p.png | bin | 0 -> 64944 bytes | |||
| -rw-r--r-- | docs/screenshots/gui-roulette-1080p.png | bin | 128158 -> 118143 bytes | |||
| -rw-r--r-- | docs/screenshots/gui-roulette-result-1080p.png | bin | 127283 -> 113253 bytes | |||
| -rw-r--r-- | docs/screenshots/gui-slots-1080p.png | bin | 0 -> 78173 bytes |
9 files changed, 86 insertions, 45 deletions
diff --git a/docs/GUI-PLAN.md b/docs/GUI-PLAN.md index bb63530..4279626 100644 --- a/docs/GUI-PLAN.md +++ b/docs/GUI-PLAN.md | |||
| @@ -67,9 +67,7 @@ crash board from its local clock. | |||
| 67 | 67 | ||
| 68 | **Gate:** all four games playable in the TUI through `Command`/`View`. | 68 | **Gate:** all four games playable in the TUI through `Command`/`View`. |
| 69 | 69 | ||
| 70 | ## Phase 3 — `gui/` skeleton and the style spike | 70 | ## Phase 3 — `gui/` skeleton and the style spike (done) |
| 71 | |||
| 72 | **Code complete in v4.1.0; awaiting the screenshot sign-off.** | ||
| 73 | 71 | ||
| 74 | - `gui/` is a workspace member (`zagan-bet-gui`). It depends on the core with | 72 | - `gui/` is a workspace member (`zagan-bet-gui`). It depends on the core with |
| 75 | `default-features = false`, so neither egui nor native-tls enters the TUI or | 73 | `default-features = false`, so neither egui nor native-tls enters the TUI or |
| @@ -104,24 +102,65 @@ Measured on Linux at 1080p with llvmpipe software GL: | |||
| 104 | | Idle RSS | 137 MB | | 102 | | Idle RSS | 137 MB | |
| 105 | | Idle CPU | 0% | | 103 | | Idle CPU | 0% | |
| 106 | 104 | ||
| 107 | The approved reference lives at `docs/screenshots/gui-roulette-1080p.png`, with | 105 | The Phase 4 screenshots in `docs/screenshots/` supersede the spike captures; |
| 108 | the result state at `docs/screenshots/gui-roulette-result-1080p.png`. | 106 | they show the same layout with the real session and the pinned action bars. |
| 109 | 107 | ||
| 110 | **Gate:** the screenshot needs your approval. Frame rate on integrated graphics | 108 | **Gate:** met. The style was approved and the spike grew into Phase 4. |
| 111 | still needs a run on real hardware. | 109 | |
| 110 | ## Phase 4 — GUI wiring (code complete, v4.2.0) | ||
| 111 | |||
| 112 | - `gui/src/net.rs` is the adapter's network worker. One blocking thread owns the | ||
| 113 | TLS stream; `Command` goes in, `Event` comes out (connected, failed, trust, | ||
| 114 | line, closed), and every event calls `Context::request_repaint`. There is no | ||
| 115 | async runtime. | ||
| 116 | - First contact is a modal that answers the transport's trust callback through | ||
| 117 | a channel. A changed key is a hard stop with an explicit forget-and-retry; | ||
| 118 | a version mismatch links to the download page; a saved credential auto-logs | ||
| 119 | in before the login screen is ever shown. | ||
| 120 | - Screens: connect (remembered hosts, forget trust), login/register with a | ||
| 121 | "remember this login" choice, lobby with the update notice, history table, | ||
| 122 | and the four games. "Log out" and "forget saved login" are separate. Leaving | ||
| 123 | a live hand or round asks first and forfeits the reservation. | ||
| 124 | - Games are painted from `View`: slots with a 0.9 s reel animation and payline | ||
| 125 | highlights, roulette with the wheel spin, the hover lattice, chip placement | ||
| 126 | and payouts, blackjack with vector-drawn suits and legal actions, crash with | ||
| 127 | a sampled curve, cashout and a server-drawn crash point. A refused spin shows | ||
| 128 | the error and never runs the animation: the reels and the wheel wait for the | ||
| 129 | server's answer, not for the click. | ||
| 130 | - Sidebars pin their action block below the content, so SPIN, CLEAR, DEAL and | ||
| 131 | START never move as the bet slip or a hand grows. The embedded fonts have no | ||
| 132 | suit or arrow glyphs, so suits are shapes and navigation uses plain words. | ||
| 133 | - The header balance is held at the staked amount while the reels or wheel | ||
| 134 | turn, then jumps to the settled value: the GUI never reveals a payout before | ||
| 135 | the animation does. Refused spins cancel the animation and show the error. | ||
| 136 | The crash multiplier keeps full precision in the game state so the chart is | ||
| 137 | a smooth line; the terminal still formats it to two decimals. | ||
| 138 | - `gui/tests/layout.rs` covers money, wheel angles, lattice snapping, table | ||
| 139 | aspect and bet names. | ||
| 140 | |||
| 141 | Verified live against a v4.2.0 server: register, login, auto-login, trust, | ||
| 142 | all four games settling, history, logout, disconnect, the leave-forfeit | ||
| 143 | confirmation, and the version-mismatch screen (new client against a 4.1.1 | ||
| 144 | server). | ||
| 145 | |||
| 146 | Screenshots: `docs/screenshots/gui-{lobby,slots,roulette,blackjack,crash, | ||
| 147 | history}-1080p.png`, plus the roulette result state. | ||
| 112 | 148 | ||
| 113 | ## Phase 4 — GUI wiring | 149 | Measured on Linux at 1080p with llvmpipe software GL: |
| 114 | ## Phase 4 — GUI wiring | ||
| 115 | 150 | ||
| 116 | - Network thread with channels, request deadlines in the shared adapter. | 151 | | Check | Result | |
| 117 | - Trust modal, version-mismatch screen, login/register, lobby, history panel. | 152 | | --- | --- | |
| 118 | - All four games, per-frame painting and tier 1–2 effects. | 153 | | Linux binary | 8.3 MB | |
| 119 | - Update notice from the handshake in the lobby. | 154 | | Windows x86_64 binary | 6.8 MB | |
| 155 | | Cold start to window | 61 ms | | ||
| 156 | | Idle RSS | 131 MB | | ||
| 157 | | Idle CPU | 0% | | ||
| 120 | 158 | ||
| 121 | **Gate:** manual checklist per game at 60 fps, `egui_kittest` wiring tests, | 159 | **Gate:** the screenshot set is ready for review. Remaining for the gate: |
| 122 | modem-throttled run. | 160 | frame rate on integrated graphics and the Windows interactive pass. |
| 123 | 161 | ||
| 124 | ## Phase 5 — packaging | 162 | ## Phase 5 — packaging |
| 163 | ## Phase 5 — packaging | ||
| 125 | 164 | ||
| 126 | - `publish.sh` emits `zagan-bet-gui-<version>-<platform>-<arch>[.exe]`. | 165 | - `publish.sh` emits `zagan-bet-gui-<version>-<platform>-<arch>[.exe]`. |
| 127 | - Bash and PowerShell installers that verify the SHA-256, install to the user | 166 | - Bash and PowerShell installers that verify the SHA-256, install to the user |
diff --git a/docs/TESTING.md b/docs/TESTING.md index 32fc628..817cb3d 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md | |||
| @@ -46,7 +46,7 @@ or a vendored OpenSSL. | |||
| 46 | | `tests/slots.rs` | Server slots payout rules and overflow handling. | | 46 | | `tests/slots.rs` | Server slots payout rules and overflow handling. | |
| 47 | | `tests/storage.rs` | Client/server SQLite storage helpers. | | 47 | | `tests/storage.rs` | Client/server SQLite storage helpers. | |
| 48 | | `tests/tofu.rs` | SPKI fingerprint and TOFU decisions. | | 48 | | `tests/tofu.rs` | SPKI fingerprint and TOFU decisions. | |
| 49 | | `gui/tests/layout.rs` | GUI presentation maths: money grouping, wheel angle, table aspect, bet names. | | 49 | | `gui/tests/layout.rs` | GUI presentation maths: money grouping, wheel angle, table aspect, lattice snapping (straight/split/corner/outside), bet names. | |
| 50 | 50 | ||
| 51 | `tests/tofu.rs` and `tests/server_setup.rs` shell out to `openssl`, so run them | 51 | `tests/tofu.rs` and `tests/server_setup.rs` shell out to `openssl`, so run them |
| 52 | on a machine where the `openssl` CLI is available. | 52 | on a machine where the `openssl` CLI is available. |
| @@ -118,34 +118,36 @@ Use an 80-column terminal because several output lines are width-sensitive. | |||
| 118 | 118 | ||
| 119 | ## Manual GUI checklist | 119 | ## Manual GUI checklist |
| 120 | 120 | ||
| 121 | The GUI is a style spike until Phase 4: the table and wheel are painted from a | 121 | The desktop frontend shares `ClientCore` and the data directory with the |
| 122 | demo `RouletteView`, and no network connection is made. Run it on Linux and on | 122 | terminal client; a saved login from one signs in the other. |
| 123 | Windows 10 before approving the look. | 123 | |
| 124 | 124 | 1. `cargo run -p zagan-bet-gui` (or `-d <dir>` / `--unsafe`). The connect | |
| 125 | 1. `cargo run -p zagan-bet-gui` at 1440x900, then at 1920x1080. The header | 125 | screen lists remembered hosts with short fingerprints. |
| 126 | keeps its right margin at both sizes and shows ONLINE, host, ping, account | 126 | 2. First contact: the fingerprint modal appears before any credentials. Cancel |
| 127 | and balance; the table is centred and the sidebar is full height. | 127 | leaves the connect screen; Trust continues to the login screen. |
| 128 | 2. The felt shows 0, the 3x12 numbers, dozens, columns (each a quarter of the | 128 | 3. Register, then log in with "Remember this login". The lobby shows the host, |
| 129 | row) and the six outside cells. Chips sit on their targets: a straight in | 129 | ping, account, balance and the four games; quit and reconnect: the stored |
| 130 | the cell, a corner on the lattice crossing, an outside bet in its box. | 130 | login signs in without asking. |
| 131 | 3. Hover a number: a translucent chip of the selected denomination appears. | 131 | 4. Each game: place a bet or deal, play a round, and confirm the balance and the |
| 132 | In the inner half of a cell it is a straight (one cell tints); near an edge | 132 | header update. Slots shows reels and win lines; roulette spins the wheel and |
| 133 | it snaps to a split (two cells tint) and near a corner to a corner (four | 133 | reports the payout; blackjack draws suits and settles; crash draws a smooth |
| 134 | cells tint). Hovering the dozens, columns and outside boxes moves the | 134 | curve and cashes out. While the reels or wheel turn, the balance shows the |
| 135 | preview there. | 135 | stake already deducted; the payout appears only when they stop. A spin or |
| 136 | 4. Left click adds the chip where the preview is; right or middle click takes | 136 | deal the server refuses (for example an insufficient balance) shows the |
| 137 | one chip of that value back, dropping the row when it reaches zero. The | 137 | error and must not animate the reels, the wheel or the curve. |
| 138 | slip and total follow every change. C or CLEAR empties the slip. | 138 | 5. Sidebar actions never move while the slip grows. CLEAR empties the slip; |
| 139 | 5. Space or SPIN animates the wheel for about 2.4 s and stops with the winning | 139 | right or middle click on the felt takes one chip back; C clears and space |
| 140 | pocket under the pointer. The winning cell gets a gold outline and LAST | 140 | spins in roulette. |
| 141 | gains a dot. RESULT names the number and colour, WON shows the amount paid | 141 | 6. Leaving a live blackjack hand or crash round asks for confirmation, then |
| 142 | and the net for the round, and a losing spin says NO WIN. SPIN, CLEAR and | 142 | forfeits. Leaving an idle table returns to the lobby. |
| 143 | the chips are disabled during the spin. | 143 | 7. HISTORY shows the last plays; SHOW changes the limit. LOG OUT returns to |
| 144 | 6. Placing a chip after a result starts the next round: the payout row goes | 144 | the login screen but stays connected; Disconnect drops the session (the |
| 145 | back to PLACE YOUR BETS while the wheel stays where it stopped. Resize to | 145 | saved login survives). |
| 146 | 1100x720: the sidebar scrolls, nothing overlaps the header, and the table | 146 | 8. Run the client against a server of another MAJOR.MINOR version: the |
| 147 | keeps its aspect ratio. | 147 | mismatch screen names both versions and the download page. A changed host |
| 148 | 7. Compare the 1080p window against the approved reference screenshots. | 148 | key stops the connection and offers forget-and-reconnect. |
| 149 | 9. Resize to 1100x720: the sidebar scrolls, the actions stay reachable, and | ||
| 150 | the board keeps its aspect ratio. | ||
| 149 | 151 | ||
| 150 | ## Manual roulette checklist | 152 | ## Manual roulette checklist |
| 151 | 153 | ||
diff --git a/docs/screenshots/gui-blackjack-1080p.png b/docs/screenshots/gui-blackjack-1080p.png new file mode 100644 index 0000000..b0fcc19 --- /dev/null +++ b/docs/screenshots/gui-blackjack-1080p.png | |||
| Binary files differ | |||
diff --git a/docs/screenshots/gui-crash-1080p.png b/docs/screenshots/gui-crash-1080p.png new file mode 100644 index 0000000..245a3a1 --- /dev/null +++ b/docs/screenshots/gui-crash-1080p.png | |||
| Binary files differ | |||
diff --git a/docs/screenshots/gui-history-1080p.png b/docs/screenshots/gui-history-1080p.png new file mode 100644 index 0000000..a979dcd --- /dev/null +++ b/docs/screenshots/gui-history-1080p.png | |||
| Binary files differ | |||
diff --git a/docs/screenshots/gui-lobby-1080p.png b/docs/screenshots/gui-lobby-1080p.png new file mode 100644 index 0000000..a258967 --- /dev/null +++ b/docs/screenshots/gui-lobby-1080p.png | |||
| Binary files differ | |||
diff --git a/docs/screenshots/gui-roulette-1080p.png b/docs/screenshots/gui-roulette-1080p.png index 2f30aa7..1d7af3d 100644 --- a/docs/screenshots/gui-roulette-1080p.png +++ b/docs/screenshots/gui-roulette-1080p.png | |||
| Binary files differ | |||
diff --git a/docs/screenshots/gui-roulette-result-1080p.png b/docs/screenshots/gui-roulette-result-1080p.png index a7d425c..fe4c9cd 100644 --- a/docs/screenshots/gui-roulette-result-1080p.png +++ b/docs/screenshots/gui-roulette-result-1080p.png | |||
| Binary files differ | |||
diff --git a/docs/screenshots/gui-slots-1080p.png b/docs/screenshots/gui-slots-1080p.png new file mode 100644 index 0000000..9d79321 --- /dev/null +++ b/docs/screenshots/gui-slots-1080p.png | |||
| Binary files differ | |||
