Add scopa: classic two-player and scopa a quattro
New tavolo-scopa package with a pure rules engine and the platform adapters for two-player scopa and four-player fixed-partnership scopa a quattro: three cards each and four on the table, capture by rank or sum, sweep for scope and score carte/denara/settebello/primiera. The optional asso pigliatutto creation option turns either variant into scopa d'assi (an ace sweeps the whole table and scores no scopa), reusing scopone's rule semantics. Wire both engines into the app and the Docker install, add the scopa table view to the SPA (duo and four-seat layouts, deck count, captured/scope stats, hand-summary and final screens, player names in the two-player summary), and cover the rules, the platform contract, the REST/WebSocket flows, match persistence and Elo.
This commit is contained in:
1 parent
7883d0c458
commit
d4d437c1a1
27 files changed
+3401
-116
No files matched your search
@@ -1,17 +1,21 @@
|
||||
# tavolo
|
||||
|
||||
A platform for multiplayer card games. Three games are included:
|
||||
A platform for multiplayer card games. Four games are included:
|
||||
**scopone scientifico** — the four-player, fixed-partnership Italian card
|
||||
game — **briscola**, in its classic two-player and four-player
|
||||
partnership (*briscola a quattro*) variants, and **briscola chiamata** —
|
||||
the five-player variant with a calling auction and a secret partner:
|
||||
game — **scopa**, in its classic two-player and four-player partnership
|
||||
(*scopa a quattro*) variants, with the *asso pigliatutto* option turning
|
||||
either into **scopa d'assi** — **briscola**, in its classic two-player
|
||||
and four-player partnership (*briscola a quattro*) variants, and
|
||||
**briscola chiamata** — the five-player variant with a calling auction
|
||||
and a secret partner:
|
||||
|
||||
- **`server/`** — backend: Python + [kaya](https://github.com/woggioni/kaya)
|
||||
framework, OIDC login, live games in Redis, match statistics in Postgres.
|
||||
A monorepo of four distributions sharing the `tavolo` namespace: the
|
||||
game-independent `tavolo-platform`, the `tavolo-scopone` and
|
||||
`tavolo-briscola` games, and the `tavolo-app` composition root wiring
|
||||
them together. See [server/README.md](server/README.md).
|
||||
A monorepo of five distributions sharing the `tavolo` namespace: the
|
||||
game-independent `tavolo-platform`, the `tavolo-scopone`,
|
||||
`tavolo-scopa` and `tavolo-briscola` games, and the `tavolo-app`
|
||||
composition root wiring them together. See
|
||||
[server/README.md](server/README.md).
|
||||
- **`web/`** — frontend: Rust + [Sycamore](https://sycamore.dev) compiled to
|
||||
WebAssembly, built with [Trunk](https://trunkrs.dev) and styled with
|
||||
[Bootstrap](https://getbootstrap.com) 5.3 (MIT, vendored under
|
||||
@@ -40,15 +44,16 @@ echo "127.0.0.1 mockoauth" | sudo tee -a /etc/hosts
|
||||
## Between hands
|
||||
|
||||
When a hand ends but the match is not decided, the game pauses on a
|
||||
**scoring summary screen**: scopone players see how each category was won
|
||||
(carte, denara, settebello, primiera, scope — plus napola and asso
|
||||
pigliatutto when enabled), briscola players see the deal's points and any
|
||||
*patta*; both see the running totals and must click "Understood" before
|
||||
the next hand is dealt. If someone is away the next hand is dealt
|
||||
automatically after `HAND_ACK_TIMEOUT_SECONDS` (default 30s). The
|
||||
match-ending hand is explained on the final screen. Briscola chiamata
|
||||
plays a single deal per match, so it goes straight from the last trick to
|
||||
the final scoring screen; a 60–60 *patta* is replayed immediately.
|
||||
**scoring summary screen**: scopone and scopa players see how each
|
||||
category was won (carte, denara, settebello, primiera, scope — plus
|
||||
napola and asso pigliatutto when enabled), briscola players see the
|
||||
deal's points and any *patta*; both see the running totals and must click
|
||||
"Understood" before the next hand is dealt. If someone is away the next
|
||||
hand is dealt automatically after `HAND_ACK_TIMEOUT_SECONDS` (default
|
||||
30s). The match-ending hand is explained on the final screen. Briscola
|
||||
chiamata plays a single deal per match, so it goes straight from the last
|
||||
trick to the final scoring screen; a 60–60 *patta* is replayed
|
||||
immediately.
|
||||
|
||||
## On your turn
|
||||
|
||||
@@ -80,10 +85,11 @@ Backend (from `server/`):
|
||||
cd server
|
||||
python3 -m venv .venv
|
||||
.venv/bin/pip install -r requirements.txt
|
||||
.venv/bin/pip install -e ./packages/tavolo-platform -e ./packages/tavolo-scopone -e ./packages/tavolo-briscola -e './packages/tavolo-app[dev]'
|
||||
.venv/bin/pip install -e ./packages/tavolo-platform -e ./packages/tavolo-scopone -e ./packages/tavolo-scopa -e ./packages/tavolo-briscola -e './packages/tavolo-app[dev]'
|
||||
.venv/bin/python -m unittest discover -s tests -t .
|
||||
.venv/bin/python -m unittest discover -s packages/tavolo-platform/tests
|
||||
.venv/bin/python -m unittest discover -s packages/tavolo-scopone/tests
|
||||
.venv/bin/python -m unittest discover -s packages/tavolo-scopa/tests
|
||||
.venv/bin/python -m unittest discover -s packages/tavolo-briscola/tests
|
||||
```
|
||||
|
||||
|
||||
Reference in new issue
Block a user