games: the uno table opens its doors

Driven in a browser for the first time, which is where three bugs were.

Every visit to /games/uno was a 500: the page was never added to the list
server.go parses into the games template set, so render() answered "unknown
page". The casino tests all call their handlers directly and never go through
render(), so nothing saw it. TestEveryCasinoPageRenders now walks the mux and
asks for every page the casino routes to.

The play script hid the first card that lit up rather than the one you clicked,
so playing any other playable card made an innocent card vanish. And on a phone
the discard sized its box but not its card, which takes its size from --uno-h,
so a full-size card hung out of a small hole and covered the colour in play.

Claude-Session: https://claude.ai/code/session_013M5nD7PgUboJXoDcYHzpuJ
This commit is contained in:
prosolis
2026-07-14 07:38:03 -07:00
parent 79c857023f
commit d7e63d86a6
6 changed files with 104 additions and 21 deletions

View File

@@ -63,6 +63,8 @@
var game = null; // the game as the server last described it
var tier = "table";
var pendingWild = -1; // the wild you clicked, waiting on a colour
var played = -1; // the card you just played, so the script lifts that one out
// of the hand and not merely the first one that lit up
var reduced = FX.reduced;
function pace(ms) { return reduced ? 0 : ms; }
@@ -399,9 +401,10 @@
var from = seatAnchor(e.seat);
// Your own card leaves the hand it was in, so the hand has to lose it
// before the flight or the card is briefly in two places.
if (e.seat === 0) {
var live = handEl.querySelector('.pete-uno-card[data-on="1"][data-at]');
if (e.seat === 0 && played >= 0) {
var live = handEl.querySelector('.pete-uno-card[data-at="' + played + '"]');
if (live) live.style.visibility = "hidden";
played = -1;
}
bump(e.seat, e.left);
return throwCard(node, from, discardEl, { index: n })
@@ -555,6 +558,7 @@
if (cancelWild) cancelWild.addEventListener("click", hideWild);
function move(body) {
played = body.kind === "play" ? body.index : -1;
send("/api/games/uno/move", body, gameMsgEl);
}