After each hand of an unfinished match the game now pauses in a new
hand_end phase instead of dealing immediately:
- engine: hand_points gains an 'award' map (which team won each category),
_end_hand stops at hand_end with a deadline, new acknowledge_hand deals
the next hand once all four players have acked; plays are rejected while
the summary is up
- state: acked seats, hand_end_deadline and hand_ack_timeout are persisted
and exposed in the personalized view (also on the finished state, so the
final hand is explained before the result)
- ws: new {"action": "ack"}; a per-hand timer force-deals the next hand
after HAND_ACK_TIMEOUT_SECONDS (new env var, default 30s) so an away
player cannot stall the match
- web: modal explaining each category in plain language with icons (card
images for denara/settebello/primiera), team-coloured rows, running
totals with progress bars, an 'Understood — next hand' button that turns
into 'Waiting for …' plus an auto-continue countdown; the final screen
shows the last hand's breakdown too
Verified in the browser against the compose stack: hand played to
completion, summary rendered (including a carte tie), ack from all four
players dealt the next hand live, and the auto-continue path fired when
nobody acked. 60 backend tests + mypy + cargo tests green.
24 lines
575 B
TOML
24 lines
575 B
TOML
[package]
|
|
name = "scopa-web"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
description = "Sycamore/WASM frontend for the scopone scientifico backend"
|
|
|
|
[dependencies]
|
|
sycamore = "0.9"
|
|
sycamore-router = "0.9"
|
|
gloo-net = { version = "0.6", features = ["websocket"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
wasm-bindgen = "0.2"
|
|
wasm-bindgen-futures = "0.4"
|
|
futures = "0.3"
|
|
web-sys = { version = "0.3", features = ["Window", "Location", "console"] }
|
|
js-sys = "0.3"
|
|
gloo-timers = "0.3"
|
|
console_error_panic_hook = "0.1"
|
|
|
|
[profile.release]
|
|
opt-level = "z"
|
|
lto = true
|