Compare commits

...
73 Commits
Author SHA1 Message Date
manzolo 650d4e9cf8 Versione 0.1.73
test / test (push) Successful in 27s
test / browser (ambient) (push) Successful in 30s
test / browser (biliardo) (push) Successful in 47s
test / browser (cerbottana) (push) Successful in 32s
test / browser (condor) (push) Successful in 24s
test / browser (campana) (push) Successful in 2m10s
test / browser (flipper) (push) Successful in 1m58s
test / browser (micro) (push) Successful in 3m18s
test / browser (ingorgo) (push) Successful in 3m44s
test / browser (briscola) (push) Successful in 8m32s
test / browser (bruciate) (push) Successful in 8m18s
test / browser (minigiochi) (push) Successful in 3m4s
test / browser (gara) (push) Successful in 8m42s
test / browser (peso) (push) Successful in 5m38s
test / browser (telefono) (push) Successful in 31s
test / browser (tressette) (push) Successful in 1m0s
test / browser (telefoni) (push) Successful in 2m50s
test / browser (veicoli) (push) Successful in 24s
test / browser (risveglio) (push) Successful in 7m4s
test / browser (scopa) (push) Successful in 8m3s
test / browser (principale) (push) Successful in 10m6s
test / browser (smarronata) (push) Successful in 11m6s
test / release (push) Successful in 8m11s
2026-11-01 21:57:59 +01:00
manzoloandClaude Opus 5.5 7384726091 Flipper: il tabellone cambia illustrazione con la zona che la pallina attraversa (il Regolo coronato, la Fortezza, la Pieve, la Sieve, il Trebbio, i rioni) e il simbolo della zona sul campo (Codex, flipper-art.js); «TIENI PREMUTO QUI» per la molla solo col dito
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 21:57:17 +01:00
manzolo c68b365df2 Versione 0.1.72
test / test (push) Successful in 50s
test / browser (campana) (push) Successful in 1m22s
test / browser (biliardo) (push) Successful in 1m57s
test / browser (flipper) (push) Successful in 33s
test / browser (condor) (push) Successful in 1m31s
test / browser (ingorgo) (push) Successful in 58s
test / browser (micro) (push) Successful in 1m13s
test / browser (bruciate) (push) Successful in 6m45s
test / browser (ambient) (push) Successful in 6m51s
test / browser (minigiochi) (push) Successful in 2m53s
test / browser (cerbottana) (push) Successful in 9m18s
test / browser (gara) (push) Successful in 7m41s
test / browser (risveglio) (push) Successful in 2m33s
test / browser (smarronata) (push) Successful in 47s
test / browser (principale) (push) Successful in 4m44s
test / browser (telefono) (push) Successful in 39s
test / browser (briscola) (push) Successful in 11m53s
test / browser (peso) (push) Successful in 5m31s
test / browser (telefoni) (push) Successful in 2m11s
test / browser (tressette) (push) Successful in 2m11s
test / browser (scopa) (push) Successful in 7m11s
test / browser (veicoli) (push) Successful in 8m26s
test / release (push) Successful in 5m2s
2026-11-01 21:44:43 +01:00
manzoloandClaude Opus 5.5 531aee18bf Schermo intero (pulsante accanto ai volumi e tasto F) e gioco fino a 2560 px; nei minigiochi la scena lascia lo spazio vero dei comandi; flipper: «Solo tavola», sul telefono senza pulsantiera e «Lascia stare» in alto, molla toccando al centro con «TIENI PREMUTO QUI», ponti rifatti da Codex; prove più salde (tressette)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 21:38:44 +01:00
manzolo 428fb4bbec Versione 0.1.71
test / test (push) Successful in 34s
test / browser (cerbottana) (push) Successful in 50s
test / browser (biliardo) (push) Successful in 52s
test / browser (ambient) (push) Successful in 54s
test / browser (campana) (push) Successful in 1m2s
test / browser (briscola) (push) Successful in 1m2s
test / browser (bruciate) (push) Successful in 1m6s
test / browser (condor) (push) Successful in 32s
test / browser (gara) (push) Successful in 40s
test / browser (flipper) (push) Successful in 48s
test / browser (micro) (push) Successful in 50s
test / browser (risveglio) (push) Successful in 38s
test / browser (ingorgo) (push) Successful in 1m17s
test / browser (scopa) (push) Successful in 26s
test / browser (telefono) (push) Successful in 29s
test / browser (smarronata) (push) Successful in 42s
test / browser (tressette) (push) Successful in 22s
test / browser (veicoli) (push) Successful in 14s
test / browser (minigiochi) (push) Successful in 2m52s
test / browser (telefoni) (push) Successful in 2m9s
test / browser (principale) (push) Successful in 4m25s
test / browser (peso) (push) Successful in 5m45s
test / release (push) Successful in 15s
2026-11-01 19:52:12 +01:00
manzoloandClaude Opus 5.5 14af51668f Flipper: con ?debug il tasto S fa i due LOCK e apre la SUPER (per provare il Regolo del futuro). Prove più salde coi tempi della scheda video: la tressette aspetta la fine della battuta prima dei tasti, il vento della fessura ha un attimo per sfumare; il peso fa un giro di riscaldamento nelle scene, soglia 500 ms
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 19:47:28 +01:00
manzolo 3bae622c2b Il Regolo del futuro (branch di Codex) 2026-11-01 18:54:37 +01:00
manzoloandClaude Opus 5.5 a8b7d599c2 La prova del peso: sempre con swiftshader, come un telefono lento, misura fotogrammi e arretrato grafico di ogni scena nelle tre fasi e di ogni primo piano (la scheda video nasconde gli effetti pesanti); si rifà quando cambia un disegno, nella pipeline sempre; test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 18:54:37 +01:00
manzoloandClaude Opus 5.5 26da5030a6 Il Regolo del futuro con la musica di Andrea (flipper-futuro.mp3, la musica cambia con la tavola: tableMusic) al posto del battito sintetico
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 18:19:27 +01:00
manzoloandClaude Opus 5.5 a9f8f88010 Le musiche del flipper, di Andrea (Suno): flipper.mp3 per la tavola del River (flipper-futuro.mp3 per quella che arriva); test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 18:18:00 +01:00
manzolo f3d3fa1b00 Allineato a main 2026-11-01 18:18:00 +01:00
manzolo f7aa92acc6 Allineato a main 2026-11-01 18:16:42 +01:00
manzoloandClaude Opus 5.5 7045aa9fcc Il Regolo del futuro: alla SUPER SPECIAL un'esplosione a sorpresa apre la tavola futuristica (Orbita del Serpente, Ponte della Fortezza sopraelevato, Spira al Neon, Regolo mobile); si torna alla classica colpendo il Regolo dopo due giri per percorso (Codex)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 18:13:59 +01:00
manzoloandClaude Opus 5.5 efff8623d8 verify: «una prova alla volta», non «1 prove»
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 17:56:25 +01:00
manzolo 6fdbef1dd7 Versione 0.1.70
test / test (push) Successful in 30s
test / browser (bruciate) (push) Successful in 47s
test / browser (cerbottana) (push) Successful in 46s
test / browser (ambient) (push) Successful in 48s
test / browser (biliardo) (push) Successful in 53s
test / browser (campana) (push) Successful in 59s
test / browser (briscola) (push) Successful in 1m7s
test / browser (gara) (push) Successful in 41s
test / browser (condor) (push) Successful in 42s
test / browser (flipper) (push) Successful in 48s
test / browser (ingorgo) (push) Successful in 1m2s
test / browser (micro) (push) Successful in 57s
test / browser (risveglio) (push) Successful in 34s
test / browser (scopa) (push) Successful in 28s
test / browser (tressette) (push) Successful in 25s
test / browser (telefono) (push) Successful in 31s
test / browser (smarronata) (push) Successful in 45s
test / browser (veicoli) (push) Successful in 12s
test / browser (minigiochi) (push) Successful in 2m44s
test / browser (telefoni) (push) Successful in 2m9s
test / browser (principale) (push) Successful in 4m24s
test / release (push) Successful in 11s
2026-11-01 17:47:32 +01:00
manzoloandClaude Opus 5.5 a926ad6423 Prove nel browser sulla scheda video: tests/chromium.mjs usa la GPU se c'è (schermata 41 ms invece di 633; tutte e venti in ~4 min invece di ~16, sei alla volta), altrimenti swiftshader; la pipeline dà la GPU ai job, runner a 6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 17:47:10 +01:00
manzoloandClaude Opus 5.5 8319f58f1e Flipper da tastiera: la freccia giù carica la molla come Spazio, i due Shift comandano le palette (main.js passa ai minigiochi ShiftLeft e ShiftRight); test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 17:47:10 +01:00
manzoloandClaude Opus 5.5 21cfe8bb89 STATO: durata vera del primo giro della pipeline
test / test (push) Successful in 19s
test / browser (ambient) (push) Skipped
test / browser (biliardo) (push) Skipped
test / browser (briscola) (push) Skipped
test / browser (bruciate) (push) Skipped
test / browser (campana) (push) Skipped
test / browser (cerbottana) (push) Skipped
test / browser (condor) (push) Skipped
test / browser (flipper) (push) Skipped
test / browser (gara) (push) Skipped
test / browser (ingorgo) (push) Skipped
test / browser (micro) (push) Skipped
test / browser (minigiochi) (push) Skipped
test / browser (principale) (push) Skipped
test / browser (risveglio) (push) Skipped
test / browser (scopa) (push) Skipped
test / browser (smarronata) (push) Skipped
test / browser (telefoni) (push) Skipped
test / browser (telefono) (push) Skipped
test / browser (tressette) (push) Skipped
test / browser (veicoli) (push) Skipped
test / release (push) Skipped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 15:48:35 +01:00
manzoloandClaude Opus 5.5 b5a38531c4 STATO: le prove nel browser nella pipeline, primo giro verde
test / test (push) Successful in 20s
test / browser (ambient) (push) Skipped
test / browser (biliardo) (push) Skipped
test / browser (briscola) (push) Skipped
test / browser (bruciate) (push) Skipped
test / browser (campana) (push) Skipped
test / browser (cerbottana) (push) Skipped
test / browser (condor) (push) Skipped
test / browser (flipper) (push) Skipped
test / browser (gara) (push) Skipped
test / browser (ingorgo) (push) Skipped
test / browser (micro) (push) Skipped
test / browser (minigiochi) (push) Skipped
test / browser (principale) (push) Skipped
test / browser (risveglio) (push) Skipped
test / browser (scopa) (push) Skipped
test / browser (smarronata) (push) Skipped
test / browser (telefoni) (push) Skipped
test / browser (telefono) (push) Skipped
test / browser (tressette) (push) Skipped
test / browser (veicoli) (push) Skipped
test / release (push) Skipped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 15:46:47 +01:00
manzoloandClaude Opus 5.5 666e274140 Le prove nel browser nella pipeline di Gitea: sui tag (o a mano) le venti prove, una per job nell'immagine di Playwright, prima della release; un test pretende che l'elenco coincida con le prove di verify.mjs e che l'immagine abbia il Playwright di package-lock.json
test / test (push) Successful in 20s
test / browser (ambient) (push) Skipped
test / browser (biliardo) (push) Skipped
test / browser (briscola) (push) Skipped
test / browser (bruciate) (push) Skipped
test / browser (campana) (push) Skipped
test / browser (cerbottana) (push) Skipped
test / browser (condor) (push) Skipped
test / browser (flipper) (push) Skipped
test / browser (gara) (push) Skipped
test / browser (ingorgo) (push) Skipped
test / browser (micro) (push) Skipped
test / browser (minigiochi) (push) Skipped
test / browser (principale) (push) Skipped
test / browser (risveglio) (push) Skipped
test / browser (scopa) (push) Skipped
test / browser (smarronata) (push) Skipped
test / browser (telefoni) (push) Skipped
test / browser (telefono) (push) Skipped
test / browser (tressette) (push) Skipped
test / browser (veicoli) (push) Skipped
test / release (push) Skipped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 15:26:37 +01:00
manzolo 4015beb4f2 Versione 0.1.69
test / test (push) Successful in 32s
test / release (push) Successful in 14s
2026-11-01 15:19:51 +01:00
manzoloandClaude Opus 5.5 4afac814ee Prove a sezioni: il file di una prova conta solo per la prova che lo esegue (un cambio in browser.mjs non fa rifare ambient o veicoli); test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 15:13:37 +01:00
manzoloandClaude Opus 5.5 37bfe4e15e Prova nel browser: ERR_NETWORK_CHANGED in console è il PC che cambia rete a metà prova (Docker), non un errore del gioco
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 15:13:15 +01:00
manzoloandClaude Opus 5.5 c701edd977 Le prove a sezioni: lo script che le pianifica non è più un ingresso delle prove (cambiarlo non fa rifare il gioco; lo prova verify.test.mjs); il piano dice quando è cambiato l'elenco dei file e non un file
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 14:55:56 +01:00
manzoloandClaude Opus 5.5 a455e3f12f Le prove nel browser a sezioni (idea di Andrea): scripts/verify.mjs rifà solo le prove i cui ingressi sono cambiati dall'ultimo verde (.verify-ok.json fuori da git); make verify le usa, make verify-plan spiega; i minigiochi entrano in make verify; due alla volta, perché con quattro le schermate vanno in timeout. Test del pianificatore (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 14:51:42 +01:00
manzoloandClaude Fable 5.1 be099aa810 La scena prende la finestra (Andrea: «come mai non sfruttiamo tutto lo schermo?»): la riserva sotto non è più 250 px fissi ma l'altezza vera del pannello, in unità --u legate alla larghezza del gioco (cqw, #app è un container); frase, verbi, inventario, risposte, HUD e fumetti scalano col gioco e non con la finestra, i verbi non si tagliano più; pannello alto sempre uguale (quattro risposte piene, da cinque il carattere cala) così la scena non si muove nei dialoghi; frase su una riga coi puntini; «Schermo intero» nella Pausa; la Pausa parte dall'alto se non ci sta. A 1040×590 la scena da 604 a 842 px. Prove nel browser a 1280×860 e 1040×590, con due dialoghi (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 13:46:28 +01:00
manzoloandClaude Opus 5.5 24e9b8c055 La prova nel browser in tre processi paralleli (principale, minigiochi, telefoni), ognuno col suo server e il suo Chromium: da 525 a circa 275 secondi, tre giri su tre verdi; --parte= per una sola. Le attese della torcia hanno una scadenza di 30 s invece di 200 giri, che con la macchina carica non bastavano (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 12:35:40 +01:00
manzolo cfe7cb7fd6 Versione 0.1.68
test / test (push) Successful in 52s
test / release (push) Successful in 9s
2026-11-01 11:07:36 +01:00
manzoloandClaude Opus 5.5 9499c7792b Le Gitea Actions: test unitari a ogni push su main e sui tag, e sul tag vX.Y.Z la release con i commit dal tag prima (.gitea/workflows/test.yml); il runner sul PC si crea o riavvia con make runner (tools/gitea-runner, scripts/runner.sh, token di registrazione chiesto a Gitea con le credenziali di git); hook pre-push con check-public (make hooks) (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 10:58:38 +01:00
manzoloandClaude Opus 5.5 3a9db6d109 Il deploy passa dal registry di Gitea: make deploy costruisce l'immagine dal tag della versione, la spinge su git.manzolo.it/manzolo/leggenda-regolo:vX.Y.Z e :latest, scrive il tag nel compose del VPS e lì fa pull e up; tolto docker save/load. Il compose di produzione si chiama docker-compose.deploy.yml. Nel README il download dagli zip dei tag, in CLAUDE.md il nuovo flusso (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 10:44:58 +01:00
manzolo 797eb80980 Versione 0.1.67 2026-11-01 00:31:17 +01:00
manzoloandClaude Fable 5.1 00e9f7c4d7 Il flipper: chiuso il canale dietro la Pieve fra la parete e il dorso dei bersagli, dove la pallina scendeva dritta nell'uscita sinistra (Andrea: «a sinistra esce troppo facile»); due raccordi inclinati, disegnati come le altre sponde; test (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 00:21:49 +01:00
manzoloandClaude Fable 5.1 77a8777dcd Il flipper alleggerito senza cambiarne l'aspetto: il mobile statico sullo sfondo CSS della tela invece di una copia a tutto schermo per fotogramma, estremità e giunti arrotondati solo nei livelli in cache; arretrato grafico da 4,2 s a 0,03 s per 150 fotogrammi; la misura dell'arretrato nella prova nel browser al posto dell'intervallo fra frame, che non misurava nulla (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-11-01 00:14:31 +01:00
manzoloandClaude Fable 5.1 b660bbeb96 Il flipper rifatto da Codex: tavola ad alta risoluzione con lacca, cromature e luci animate; due LOCK (tre passaggi sulla stessa rampa in venti secondi, Fortezza e Trebbio), la SUPER SPECIAL al centro che si apre con entrambi i lock e dà pallina premio e multiball a tre; jackpot fino a x3 coi bersagli, nuove fanfare; la valvola contro il rientro nella molla; display del punteggio e pannello della caccia al jackpot ai lati; test unitari e nel browser (lock, super, multiball) (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 23:47:51 +01:00
manzoloandClaude Fable 5.1 bbce40b014 Test del tabellone: quanto manca al traguardo sta nella riga in basso, non più nel pannello
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 23:18:09 +01:00
manzoloandClaude Fable 5.1 0ec45c8745 Il flipper col LOCK (idea di Andrea, fatto da Codex e completato): lo stesso ponte tre volte trattiene la pallina e ne dà una nuova, l'altro ponte SPECIAL vale il JACKPOT e il MULTIBALL a due palline; serratura, seconde palline e SPECIAL nel disegno, suoni, aiuto, test; imbocchi delle rampe al centro e uscite laterali più strette (Codex); pallina premio al traguardo; la barra del traguardo sotto la finestra invece del pannello sul Trebbio; il Boccino prudente in curva
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 23:17:36 +01:00
manzoloandClaude Fable 5.1 dfa70a9620 Il Boccino (Gabriele Chiesi, consenso del 31 ottobre) corre il GP di Fortezza col suo NRG bianco e rosso numero 1 (motorino e ritratto di Codex dalle sue foto) (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 22:52:53 +01:00
manzoloandClaude Fable 5.1 3079c6ea8a Il tabellone del flipper è un vero backglass: il fondale di Codex col Castello del Trebbio, la Fortezza, il Regolo e i fuochi dei rioni; le cifre nella finestra nera, le lampadine sui bordi, i dischi delle palline e dei rioni, i ponti ai lati, il fondale che lampeggia ai colpi grossi (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 22:10:55 +01:00
manzoloandClaude Fable 5.1 4d4aa8aeea Il flipper più spettacolare: anelli e scintille, coriandoli dei rioni, luci che corrono sui ponti, punti che volano, lampo e scossa, scia della pallina, regia e fanfare sul tabellone; ponti, sponde e griglia dei punti in cache (niente arretrato grafico) (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 22:06:26 +01:00
manzoloandClaude Fable 5.1 721b6de930 Test della combo: la pallina persa è in gioco, non sulla molla
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 21:47:50 +01:00
manzoloandClaude Fable 5.1 7d419be27a Test dei ponti: la pallina persa parte da sotto i flipper
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 21:46:58 +01:00
manzoloandClaude Fable 5.1 07b6a381c1 Il flipper dopo la seconda revisione di Codex: flipper vivi anche sul ponte, imbocco solo in salita, ponti con la stessa energia su e giù e uscita nelle corsie di ritorno, combo che scade, scritte in coda col traguardo davanti, tabellone con l'esito giusto e le cifre che corrono in tempo fisso, tasti del mouse dalla maschera, glifi rifatti
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 21:43:57 +01:00
manzoloandClaude Fable 5.1 45b8c3d98e STATO.md: i ponti, i punti ×10, il tabellone luminoso e l'ingresso al flipper con un clic
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 21:21:31 +01:00
manzoloandClaude Fable 5.1 0a8b0310d3 Il flipper coi due ponti (le rampe che si incrociano sopra la tavola, i PONTI se fatti di fila), i punti ×10 come sui flipper degli anni 2000, il tabellone a punti luminosi con le cifre che corrono e le scritte che lampeggiano, e un clic sul River che entra e va al flipper (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 21:20:53 +01:00
manzolo a50847da2b Versione 0.1.66 2026-10-31 20:32:52 +01:00
manzoloandClaude Fable 5.1 1fc446d02a Il flipper rivisto con la revisione di Codex: punti solo a un urto nuovo, sottopassi contro gli attraversamenti, molla che arriva sempre in campo (senza cancelletto), salvataggio col tempo della simulazione e in vista, corsie che contano attraversando la riga, traguardo acquisito appena raggiunto, annullare non lancia, due dita e tasto destro, pulsanti dei flipper sempre attivi
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 20:24:01 +01:00
manzoloandClaude Fable 5.1 7076123fcf Il flipper del River: la tavola di Codex con San Piero dipinto (Fortezza, Pieve, torre, la Sieve fra i flipper, il Regolo con la corona, le bandiere dei rioni) e sopra le parti meccaniche del gioco: molla, arco, corsie dei rioni (tutte e quattro: PALIO), funghi, bersagli a caduta, Regolo, sponde elastiche, due flipper; fisica a passo fisso, tre palline, tre livelli (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 18:53:04 +01:00
manzolo 449c9511e1 Versione 0.1.65 2026-10-31 18:00:32 +01:00
manzoloandClaude Opus 5.5 0ec49c4fe7 Lo zio Mario: «Menomale tu ci sei te, Zio!» / «Alla terza tu capisci subito, al volo!» alla Ghiacciomobile, e nell'orto la California «sopra Firenzola» (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 17:11:01 +01:00
manzoloandClaude Opus 5.5 b41cadd95b Lo zio Mario alla Ghiacciomobile: «Siamo a cavallo al ciuco!» e «Tu sei sveglio: alla terza volta tutta capisci subito!» (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 17:06:19 +01:00
manzoloandClaude Opus 5.5 0bd3e2255f Il gioco sta solo sul VPS: make deploy spedisce dritto lì e controlla la versione sull'indirizzo pubblico; tolti deploy-vps e la copia di home-server (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 16:21:56 +01:00
manzoloandClaude Opus 5.5 dc17a7f963 Il sito pubblico è sul VPS: make deploy-vps controlla che https://50037.manzolo.it serva la versione appena spedita (VPS_URL); STATO.md aggiornato
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 16:16:24 +01:00
manzolo 995ad09cca Versione 0.1.64 2026-10-31 15:49:24 +01:00
manzoloandClaude Opus 5.5 b9e9976d34 La hardcore techno di Andrea (Suno) alla console del campo da basket di Via Cipriani, portata al volume del gioco; da lontano la house della Piazza e la tecno (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 15:38:29 +01:00
manzoloandClaude Opus 5.5 d37dafd58c Il test delle bruciate rovescia a cottura piena: al limite, con certe castagne, una volta su cento ne restavano crude troppe
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 15:34:22 +01:00
manzoloandClaude Opus 5.5 4d1611c6eb All'Ingorgo anche l'inizio di Via Cipriani: sfondo di notte di Codex, la console sul campo da basket con le casse in cima alle scale, laser rossi e strobo, la folla che poga a 180 battiti; la folla davanti ad Andrea senza fessure fra le due fasce (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 15:33:17 +01:00
manzoloandClaude Opus 5.5 7268585ed9 La musica anni '90 di Andrea (Suno) alla console del giardino di Via Calimara, portata al volume del gioco; da lontano la house della Piazza e il latino del Comune (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 15:27:06 +01:00
manzoloandClaude Opus 5.5 1b929f1333 All'Ingorgo anche Via Calimara: sfondo di notte di Codex, la console nel giardino sotto i cedri con la palla a specchi, la strada piena e la folla che salta (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 15:24:16 +01:00
manzoloandClaude Opus 5.5 3ba108cf88 All'Ingorgo Andrea ha la sua birra (foglio di Codex): camminando la tiene davanti al petto, parlando pure, e fermo alza il bicchiere schiumante a tempo con la folla (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 15:20:22 +01:00
manzoloandClaude Opus 5.5 70f4e641dc All'Ingorgo Andrea sta dentro la folla: dalla vita in giù la gente dello sfondo gli passa davanti, a strisce che saltano a tempo con la folla e col bordo a teste (Andrea: «sembra di volare fra le persone»)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 15:17:01 +01:00
manzoloandClaude Opus 5.5 23aa9c4788 In cima a Via dell'Antica Posta si arriva sotto la console dell'underground (il marciapiede di destra, fino in fondo); sotto una console le altre calano fino al loro filo, così lì si sente la sola musica di quella (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 15:09:45 +01:00
manzoloandClaude Opus 5.5 04f9a5cb12 Il minigioco delle bruciate alla Smarronata: coi volontari della Misericordia si gira a mano la manovella del cilindro sul fuoco, facendo giri col dito o col mouse; troppo piano si carbonizzano sotto e restano crude sopra, troppo forte volano nel fuoco; cotte, nel sacco (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 15:03:55 +01:00
manzolo 6b833341c5 Versione 0.1.63 2026-10-31 13:52:01 +01:00
manzoloandClaude Fable 5.1 4fe6bf4649 All'Ingorgo la folla dipinta salta a tempo: la fascia della gente tagliata in strisce che sobbalzano sul battito, due fasce per scena, dietro piano e davanti forte (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 13:42:55 +01:00
manzoloandClaude Fable 5.1 b10f031133 Il risveglio leggero per davvero: palpebre disegnate su una tela piccola e allargate con l'interpolazione (bordo morbido senza filtri né passate), tutto sulla tela principale, una versione sola; l'arretrato grafico dopo il risveglio passa da 24 secondi a un decimo. «Fanfara» si legge senza accenti (Andrea)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 13:40:43 +01:00
manzoloandClaude Opus 5.5 4d2278a8f8 La musica della Smarronata, di Andrea con Suno: il liscio nello spiazzo, più forte vicino alle coppie che ballano, e la mazurca dentro il tendone (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 12:45:01 +01:00
manzoloandClaude Opus 5.5 5a38e0eafe La Smarronata piena di gente com'era: i volontari della Misericordia alle bruciate, la fanfara degli alpini, la polenta, il vino, la gente coi cartocci e le coppie del liscio; il fuoco vivo sotto il cilindro delle bruciate; nei Ringraziamenti la dedica allo zio Mario (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 12:39:56 +01:00
manzoloandClaude Opus 5.5 4f2ee45abf Il tendone della Smarronata col tetto a botte, fuori e dentro, come nel video del 1993, con la fascia tricolore (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 12:26:33 +01:00
manzoloandClaude Opus 5.5 09b031dc2e Nel tendone della Smarronata i cartelli dipinti della polenta e del vino gratis, da guardare ingranditi; «fanfara» si legge fanfàra (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 12:22:34 +01:00
manzoloandClaude Opus 5.5 616d514fc5 Il cartello della Smarronata sul lampione si clicca: stava sotto la Sieve, che lo copriva (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 12:15:01 +01:00
manzoloandClaude Opus 5.5 b07a1e4941 La Smarronata del 1993: dal vecchio cartello sul lampione del Ponte sulla Sieve, coi ricordi di Andrea, la macchina del tempo porta alla festa delle castagne degli alpini sotto il ponte, col bruciatore delle bruciate, gli stand e il tendone giallo con le tavolate; dalle scene del viaggio la mappa non porta più via; tolte le battute sull'altezza del Taglia (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 12:13:55 +01:00
manzoloandClaude Opus 5.5 f57a91ca74 Il risveglio di nuovo come prima sul computer, con la sfocatura vera, e leggero sul telefono, senza filtri; tutte e due su una tela a parte che c'è solo finché il risveglio dura, così la scena non ne risente (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 11:57:26 +01:00
manzoloandClaude Opus 5.5 f7ca286066 Le palpebre del risveglio di nuovo sfumate, senza filtri: sedici passate trasparenti che sporgono verso l'occhio aperto (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
2026-10-31 11:29:45 +01:00
190 changed files with 5910 additions and 443 deletions
+68
View File
@@ -0,0 +1,68 @@
# Le Gitea Actions del gioco: girano sul runner del PC di Andrea (make runner; label ubuntu-latest = node:22-bookworm).
# A ogni push su main e a ogni tag i test unitari; su un tag vX.Y.Z (o a mano, «Run workflow») anche le venti prove nel
# browser, una per job nell'immagine di Playwright, sulla scheda video del PC; se passa tutto, la release.
# Il controllo dei file pubblicabili non sta qui (a pipeline partita il push è già pubblico): è l'hook pre-push.
name: test
on:
push:
branches: [main]
tags: ['v*']
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Test unitari
run: node --version && node --test tests/*.test.mjs
# Le prove nel browser, una per job: l'elenco è SUITES di scripts/verify.mjs (verify.test.mjs pretende che coincidano),
# l'immagine ha la stessa versione di Playwright di package-lock.json (idem).
browser:
needs: test
if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.64.1-noble
# La scheda video del PC (runtime NVIDIA di Docker): Chromium disegna lì, tests/chromium.mjs la trova da solo.
options: --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all
strategy:
fail-fast: false
matrix:
prova: [principale, minigiochi, telefoni, ambient, veicoli, ingorgo, smarronata, briscola, tressette, scopa, biliardo, flipper, micro, cerbottana, condor, campana, bruciate, gara, telefono, risveglio, peso]
steps:
- uses: actions/checkout@v4
- name: Playwright
run: npm ci --no-audit --no-fund
- name: Prova ${{ matrix.prova }}
run: node scripts/verify.mjs ${{ matrix.prova }}
release:
needs: [test, browser]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Release del tag
env:
TOKEN: ${{ secrets.GITEA_TOKEN }}
TAG: ${{ github.ref_name }}
API: ${{ github.server_url }}/api/v1/repos/${{ github.repository }}
run: |
prev=$(git describe --tags --abbrev=0 "$TAG^" 2>/dev/null || true)
{
echo "Si gioca su https://50037.manzolo.it; qui sotto lo zip di questa versione."
echo
echo "Cosa cambia${prev:+ da $prev}:"
echo
git log --no-merges --format='- %s' ${prev:+$prev..}"$TAG" | grep -v -e '^- Versione [0-9]' | cut -c1-400
} > note.md
node -e 'const fs=require("fs");process.stdout.write(JSON.stringify({tag_name:process.env.TAG,name:"Versione "+process.env.TAG.slice(1),body:fs.readFileSync("note.md","utf8")}))' > release.json
code=$(curl -s -o risposta.json -w '%{http_code}' -X POST -H "Authorization: token $TOKEN" -H 'Content-Type: application/json' --data @release.json "$API/releases")
cat risposta.json | head -c 400; echo
[ "$code" = 201 ] || [ "$code" = 409 ]
+1
View File
@@ -7,3 +7,4 @@ assets/generated/
.venv/
.env
deploy.local.mk
.verify-ok.json
+11 -1
View File
@@ -16,9 +16,19 @@ i suoi ricordi: non inventare persone, luoghi o fatti del paese al posto suoi; p
(`tools/slice_sprites.py`, `scripts/build-site.sh`, `scripts/bump.sh`, `scripts/check-public.sh`, action di Pages).
- Nessun build step: ES modules statici, server locale con `python3 -m http.server`.
- Ogni funzionalità con il suo test; un test automatico percorre tutta la soluzione dell'avventura.
- Verifica visiva nel browser con Playwright e swiftshader prima di dichiarare finito qualcosa di grafico.
- Le prove nel browser sono a sezioni (`scripts/verify.mjs`, dal 2026-11-01): `make verify` rifà solo quelle i cui ingressi
sono cambiati dall'ultimo verde (la briscola se cambia la briscola, la partita intera se cambiano storia, motore, stile
o risorse). Un `chromium.launch` nuovo nelle prove usa `args: ARGS` di `tests/chromium.mjs`.
Gli effetti pesanti li scopre la prova `peso` (`tests/peso.browser.mjs`): sempre con swiftshader, misura arretrato grafico e
fotogrammi di ogni scena e primo piano; si rifà quando cambia un disegno (`*-render.js`, `render.js`, effetti). Una prova nuova in `tests/*.browser.mjs` va aggiunta a `SUITES` (il test `verify.test.mjs` lo pretende).
- Verifica visiva nel browser con Playwright prima di dichiarare finito qualcosa di grafico. Chromium disegna sulla scheda
video del PC se c'è, altrimenti con swiftshader (`tests/chromium.mjs`, dal 2026-11-01: giro intero ~4 min invece di ~16).
- Pubblicare (tag/bump/push) solo quando Andrea lo chiede.
- Persone vere nel gioco solo con consenso; niente nomi, personaggi o musiche di giochi esistenti.
- Prompt delle immagini in `prompts/` e fogli grezzi in `assets/raw/`: esclusi da git.
- Sfondi nuovi: li genera **Codex** con il suo strumento immagini integrato, gratis e senza chiave API
(`codex exec`, ricetta in `docs/GENERAZIONE_SFONDI.md`, «Generare con Codex»). Si lancia da qui, senza chiedere la chiave ad Andrea.
- **Pubblicare (dal 2026-11-01)**: origin è https://git.manzolo.it/manzolo/leggenda-del-regolo, pubblico: prima `make check-public`, poi `git push origin main --tags`, solo se Andrea lo chiede.
`make deploy` costruisce l'immagine dal tag della versione, la spinge su `git.manzolo.it/manzolo/leggenda-regolo:vX.Y.Z` (e `:latest`); sul VPS il compose fissa quel tag e fa `docker compose pull && up -d`.
Per tornare indietro: sul VPS (`Workspaces/docker/leggenda-regolo/docker-compose.yml`) si rimette il tag precedente e si rifà pull e up.
Hook pre-push (`make hooks`, una volta per clone) lancia check-public; le Gitea Actions (`.gitea/workflows/test.yml`: test unitari a ogni push; sui tag, o a mano, anche le venti prove nel browser, una per job, poi la release) girano sul runner del PC, che si crea o riavvia con `make runner`.
+48 -30
View File
@@ -23,8 +23,8 @@ DST ?= assets/scenes/$(notdir $(SRC))
CROP ?=
COLORS ?= 64
.PHONY: help serve open test browser verify check-public bump voci voci-elenco sfondi sfondi-genera sfondi-confronto background character \
build up down restart logs ps shell image-size deploy deploy-vps deploy-logs clean distclean
.PHONY: help serve open test browser verify verify-browser verify-plan check-public hooks bump voci voci-elenco sfondi sfondi-genera sfondi-confronto background character \
build up down restart logs ps shell image-size deploy deploy-logs runner clean distclean
## ------------------------------------------------------------ sviluppo
@@ -47,14 +47,26 @@ test: ## Test della logica, della storia, della soluzione completa e del generat
$(NODE) --test tests/*.test.mjs
$(PYTHON) -m unittest discover -s tests -p "test_*.py" -q
browser: ## Partita completa nel browser con Playwright
browser: ## Partita completa nel browser con Playwright (tre parti in processi paralleli, ~4,5 min)
$(NODE) tests/browser.mjs
verify: test browser check-public ## Tutti i controlli
verify: test check-public verify-browser ## Tutti i controlli: test unitari, file pubblicabili, prove nel browser cambiate (ALL=1: tutte)
# Le prove nel browser a sezioni: si rifanno solo quelle i cui ingressi sono cambiati dall'ultimo verde (.verify-ok.json,
# fuori da git); make verify-browser ALL=1 le rifà tutte, make verify-plan dice solo cosa rifarebbe; JOBS=2 in parallelo (con 4 vanno in timeout).
verify-browser: ## Le prove nel browser da rifare (ALL=1 tutte; PROVE="briscola flipper" solo quelle)
$(NODE) scripts/verify.mjs $(if $(ALL),--all,) $(PROVE)
verify-plan: ## Dice quali prove nel browser rifarebbe make verify, e perché
$(NODE) scripts/verify.mjs --plan
check-public: ## Prima di pubblicare: niente prompt, fogli grezzi, segreti o nomi della rete di casa (tutta la storia)
bash scripts/check-public.sh
hooks: ## Attiva gli hook del repo (pre-push: check-public prima di ogni push)
git config core.hooksPath scripts/git-hooks
@echo "hook attivi da scripts/git-hooks: $$(ls scripts/git-hooks | tr '\n' ' ')"
bump: ## Nuova versione (PARTE=patch|minor|major): verifica, commit e tag v<versione>; poi make deploy
scripts/bump.sh $(or $(PARTE),patch)
@@ -121,47 +133,53 @@ image-size: ## Dimensione dell'immagine
## ------------------------------------------------------------ deploy su un server proprio
# Host e indirizzo stanno in deploy.local.mk, fuori da git, per esempio:
# Host e cartella stanno in deploy.local.mk, fuori da git, per esempio:
# DEPLOY_HOST = root@mio-server
# DEPLOY_URL = https://gioco.esempio
# VPS_HOST = mio-vps (facoltativo: una seconda copia, con make deploy-vps)
# VPS_DIR = docker/leggenda-regolo
# DEPLOY_DIR = docker/leggenda-regolo (la cartella del compose sul server)
# DEPLOY_IMAGE = registry.esempio/utente/leggenda-regolo
-include deploy.local.mk
DEPLOY_DIR ?= /root/leggenda-regolo
DEPLOY_IMAGE ?= git.manzolo.it/manzolo/leggenda-regolo
DEPLOY_TMP := $(shell mktemp -d -u /tmp/regolo-deploy.XXXXXX)
# La versione dell'ultimo commit (non della cartella di lavoro): il tag git, dell'immagine e del compose.
DEPLOY_VER := v$(shell git show HEAD:src/version.js 2>/dev/null | sed -n "s/.*VERSION = '\([^']*\)'.*/\1/p")
# Si pubblica l'ultimo commit (git archive HEAD), mai la cartella di lavoro: un'altra sessione può avere modifiche a
# metà. Test su quella copia, immagine costruita e provata qui, poi spedita già pronta (docker save | docker load):
# sul server non si compila niente.
# Si pubblica il tag della versione dichiarata dall'ultimo commit (git archive vX.Y.Z, quello di make bump), mai la
# cartella di lavoro: un'altra sessione può avere modifiche a metà, e i commit dopo il tag aspettano la versione dopo.
# Test su quella copia, immagine costruita e provata qui, spinta sul registry di Gitea come :vX.Y.Z e :latest; il
# VPS la scarica con il tag scritto nel suo compose (preso da HEAD, docker-compose.deploy.yml).
SMOKE_PORT ?= 18737
deploy: ## Pubblica l'ultimo commit: test, immagine costruita e provata qui, spedita al server e riavviata
deploy: ## Pubblica la versione dell'ultimo commit: test, immagine provata qui, push sul registry, pull e riavvio sul server
@test -n "$(DEPLOY_HOST)" || { echo "manca DEPLOY_HOST: scrivilo in deploy.local.mk"; exit 2; }
mkdir -p $(DEPLOY_TMP) && git archive HEAD | tar -x -C $(DEPLOY_TMP)
@git rev-parse -q --verify 'refs/tags/$(DEPLOY_VER)' >/dev/null || { echo "manca il tag $(DEPLOY_VER): prima make bump"; exit 2; }
mkdir -p $(DEPLOY_TMP) && git archive $(DEPLOY_VER) | tar -x -C $(DEPLOY_TMP)
cd $(DEPLOY_TMP) && $(NODE) --test tests/*.test.mjs
docker build -q -t $(IMAGE):latest -t $(IMAGE):$$(git rev-parse --short HEAD) $(DEPLOY_TMP)
docker build -q -t $(DEPLOY_IMAGE):$(DEPLOY_VER) -t $(DEPLOY_IMAGE):latest $(DEPLOY_TMP)
@docker rm -f $(IMAGE)-prova >/dev/null 2>&1 || true
docker run -d --rm --name $(IMAGE)-prova -p 127.0.0.1:$(SMOKE_PORT):80 $(IMAGE):latest >/dev/null
docker run -d --rm --name $(IMAGE)-prova -p 127.0.0.1:$(SMOKE_PORT):80 $(DEPLOY_IMAGE):$(DEPLOY_VER) >/dev/null
@ok=1; sleep 1; for u in / /src/main.js /assets/voices/index.json /assets/audio/cartello.mp3; do \
c=$$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:$(SMOKE_PORT)$$u); echo " prova $$u → $$c"; [ "$$c" = 200 ] || ok=0; done; \
docker rm -f $(IMAGE)-prova >/dev/null; [ $$ok = 1 ] || { echo "l'immagine non risponde come deve: non la spedisco"; exit 1; }
ssh $(DEPLOY_HOST) 'mkdir -p $(DEPLOY_DIR)'
scp -q $(DEPLOY_TMP)/docker-compose.homeserver.yml $(DEPLOY_HOST):$(DEPLOY_DIR)/docker-compose.yml
docker save $(IMAGE):latest | gzip | ssh $(DEPLOY_HOST) 'gunzip | docker load -q && cd $(DEPLOY_DIR) && docker compose up -d && docker image prune -f >/dev/null'
docker push -q $(DEPLOY_IMAGE):$(DEPLOY_VER)
docker push -q $(DEPLOY_IMAGE):latest
git show HEAD:docker-compose.deploy.yml | sed 's|$(DEPLOY_IMAGE):VERSIONE|$(DEPLOY_IMAGE):$(DEPLOY_VER)|' | \
ssh $(DEPLOY_HOST) 'mkdir -p $(DEPLOY_DIR) && cat > $(DEPLOY_DIR)/docker-compose.yml'
ssh $(DEPLOY_HOST) 'cd $(DEPLOY_DIR) && docker compose pull -q && docker compose up -d && \
docker image ls $(DEPLOY_IMAGE) --format "{{.Repository}}:{{.Tag}}" | grep -v -x -e $(DEPLOY_IMAGE):$(DEPLOY_VER) | xargs -r docker image rm >/dev/null; \
docker image prune -f >/dev/null'
rm -rf $(DEPLOY_TMP)
@# Sul server il prune toglie l'immagine vecchia; qui restano solo latest e quella appena pubblicata.
@docker image ls $(IMAGE) --format '{{.Tag}}' | grep -v -x -e latest -e $$(git rev-parse --short HEAD) | \
xargs -r -I{} docker image rm -f $(IMAGE):{} >/dev/null
@echo "→ $(DEPLOY_URL) ($$(git log -1 --format='%h %s'))"
@# Qui restano solo latest e la versione appena pubblicata.
@docker image ls $(DEPLOY_IMAGE) --format '{{.Tag}}' | grep -v -x -e latest -e $(DEPLOY_VER) | \
xargs -r -I{} docker image rm -f $(DEPLOY_IMAGE):{} >/dev/null
@# L'indirizzo pubblico deve servire la versione appena spedita.
@v=$$(git show $(DEPLOY_VER):src/version.js | grep -o "VERSION = '[^']*'"); \
for i in 1 2 3 4 5; do curl -s $(DEPLOY_URL)/src/version.js | grep -qF "$$v" && break; sleep 2; done; \
curl -s $(DEPLOY_URL)/src/version.js | grep -qF "$$v" || { echo "$(DEPLOY_URL) non serve $$v"; exit 1; }
@echo "→ $(DEPLOY_URL) ($(DEPLOY_IMAGE):$(DEPLOY_VER), $$(git log -1 --format='%h %s' $(DEPLOY_VER)))"
deploy-vps: ## Spedisce al VPS (VPS_HOST, VPS_DIR in deploy.local.mk) l'immagine dell'ultimo commit già provata da make deploy
@test -n "$(VPS_HOST)" -a -n "$(VPS_DIR)" || { echo "mancano VPS_HOST e VPS_DIR: scrivili in deploy.local.mk"; exit 2; }
@docker image inspect $(IMAGE):$$(git rev-parse --short HEAD) >/dev/null 2>&1 || \
{ echo "manca l'immagine dell'ultimo commit ($$(git rev-parse --short HEAD)): prima make deploy"; exit 1; }
ssh $(VPS_HOST) 'mkdir -p $(VPS_DIR)'
git show HEAD:docker-compose.homeserver.yml | ssh $(VPS_HOST) 'cat > $(VPS_DIR)/docker-compose.yml'
docker save $(IMAGE):$$(git rev-parse --short HEAD) $(IMAGE):latest | gzip | \
ssh $(VPS_HOST) 'gunzip | docker load -q && cd $(VPS_DIR) && docker compose up -d && docker image prune -f >/dev/null'
@ssh $(VPS_HOST) "docker exec $(IMAGE) grep -o \"VERSION = '[^']*'\" /usr/share/nginx/html/src/version.js" | sed 's/^/→ $(VPS_HOST): /'
runner: ## Crea (se manca) e avvia sul PC il runner delle Gitea Actions (tools/gitea-runner, scripts/runner.sh)
bash scripts/runner.sh
deploy-logs: ## Log del container sul server di deploy
@test -n "$(DEPLOY_HOST)" || { echo "manca DEPLOY_HOST: scrivilo in deploy.local.mk"; exit 2; }
+7 -5
View File
@@ -23,7 +23,9 @@ Si gioca online su **https://50037.manzolo.it** (50037 è il CAP di San Piero),
## Giocare in locale
Niente da installare e niente da compilare: HTML, CSS e moduli JavaScript ES.
Il gioco si scarica da **https://git.manzolo.it/manzolo/leggenda-del-regolo**: nella pagina dei
[tag](https://git.manzolo.it/manzolo/leggenda-del-regolo/tags) c'è lo zip di ogni versione (l'ultima è quella online).
Niente da installare e niente da compilare: HTML, CSS e moduli JavaScript ES. Dentro la cartella scompattata:
```zsh
python3 -m http.server 8000 # poi http://localhost:8000
@@ -40,16 +42,16 @@ Oppure `make up` (Docker, su http://localhost:8080). Non aprire `index.html` con
- `assets/`: sfondi, sprite, musiche, voci, carattere, video.
- `tools/`: gli strumenti (sprite dai fogli, voci con XTTS, musiche sintetizzate, favicon, taratura dei minigiochi).
- `tests/`: `npm test` (unità: regole, storia coerente, voci, salvataggi) e `npm run browser` (Playwright: percorre
tutta la soluzione dell'avventura, su desktop e telefono); `npm run browser:briscola`, `:tressette`, `:scopa`,
`:biliardo`, `:effects` per le parti singole.
tutta la soluzione dell'avventura, su desktop e telefono, in tre processi paralleli; `--parte=` per una sola);
`npm run browser:briscola`, `:tressette`, `:scopa`, `:biliardo`, `:effects` per le parti singole.
- `video/`: i copioni dei video «Come si gioca» e della demo, girati in una macchina virtuale.
- `docs/`: `PROGETTO.md` (l'idea, i personaggi, la mappa) e `STATO.md` (dove siamo, cosa manca).
```zsh
make verify # sintassi, test, prova nel browser: quello che gira prima di ogni versione
make verify # test, file pubblicabili e le prove nel browser cambiate dall'ultimo verde (ALL=1: tutte)
make voci # le voci delle battute nuove (XTTS-v2 su GPU)
make bump # nuova versione: verifica, commit e tag
make deploy # pubblica l'ultimo commit (immagine Docker spedita al server)
make deploy # pubblica la versione: immagine sul registry di Gitea, il server la scarica
```
## Chi ha fatto cosa
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+70
View File
@@ -0,0 +1,70 @@
{
"image": "alpino_vino.png",
"height": 120,
"frames": {
"stand": {
"x": 0,
"y": 0,
"w": 69,
"h": 120,
"ax": 28.2,
"ay": 120
},
"blink": {
"x": 71,
"y": 0,
"w": 69,
"h": 120,
"ax": 28.0,
"ay": 120
},
"talk": {
"x": 142,
"y": 0,
"w": 72,
"h": 120,
"ax": 29.4,
"ay": 120
},
"explain": {
"x": 216,
"y": 0,
"w": 71,
"h": 116,
"ax": 29.3,
"ay": 116
},
"pour": {
"x": 289,
"y": 0,
"w": 72,
"h": 122,
"ax": 30.5,
"ay": 122
},
"pour2": {
"x": 363,
"y": 0,
"w": 73,
"h": 122,
"ax": 30.3,
"ay": 122
},
"give": {
"x": 438,
"y": 0,
"w": 66,
"h": 118,
"ax": 24.5,
"ay": 118
},
"cheers": {
"x": 506,
"y": 0,
"w": 72,
"h": 120,
"ax": 33.4,
"ay": 120
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

+70
View File
@@ -0,0 +1,70 @@
{
"image": "andrea-birra.png",
"height": 120,
"frames": {
"walk_1": {
"x": 0,
"y": 0,
"w": 68,
"h": 114,
"ax": 40.2,
"ay": 114
},
"walk_2": {
"x": 70,
"y": 0,
"w": 41,
"h": 114,
"ax": 20.7,
"ay": 114
},
"walk_3": {
"x": 113,
"y": 0,
"w": 67,
"h": 114,
"ax": 38.4,
"ay": 114
},
"walk_4": {
"x": 182,
"y": 0,
"w": 46,
"h": 114,
"ax": 25.3,
"ay": 114
},
"cheer_1": {
"x": 230,
"y": 0,
"w": 51,
"h": 133,
"ax": 21.1,
"ay": 133
},
"cheer_2": {
"x": 283,
"y": 0,
"w": 55,
"h": 130,
"ax": 24.5,
"ay": 130
},
"cheer_3": {
"x": 340,
"y": 0,
"w": 62,
"h": 130,
"ax": 23.8,
"ay": 130
},
"talk": {
"x": 404,
"y": 0,
"w": 58,
"h": 120,
"ax": 21.7,
"ay": 120
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

+70
View File
@@ -0,0 +1,70 @@
{
"image": "cuochi.png",
"height": 120,
"frames": {
"stand": {
"x": 0,
"y": 0,
"w": 95,
"h": 120,
"ax": 41.9,
"ay": 120
},
"blink": {
"x": 97,
"y": 0,
"w": 95,
"h": 120,
"ax": 42.6,
"ay": 120
},
"talk": {
"x": 194,
"y": 0,
"w": 96,
"h": 120,
"ax": 44.4,
"ay": 120
},
"explain": {
"x": 292,
"y": 0,
"w": 95,
"h": 120,
"ax": 44.5,
"ay": 120
},
"work": {
"x": 389,
"y": 0,
"w": 101,
"h": 120,
"ax": 46.7,
"ay": 120
},
"work2": {
"x": 492,
"y": 0,
"w": 101,
"h": 119,
"ax": 45.9,
"ay": 119
},
"give": {
"x": 595,
"y": 0,
"w": 104,
"h": 121,
"ax": 43.1,
"ay": 121
},
"laugh": {
"x": 701,
"y": 0,
"w": 92,
"h": 117,
"ax": 43.7,
"ay": 117
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

+70
View File
@@ -0,0 +1,70 @@
{
"image": "fanfara.png",
"height": 120,
"frames": {
"stand": {
"x": 0,
"y": 0,
"w": 107,
"h": 120,
"ax": 47.1,
"ay": 120
},
"blink": {
"x": 109,
"y": 0,
"w": 106,
"h": 120,
"ax": 47.1,
"ay": 120
},
"talk": {
"x": 217,
"y": 0,
"w": 110,
"h": 120,
"ax": 50.3,
"ay": 120
},
"laugh": {
"x": 329,
"y": 0,
"w": 107,
"h": 120,
"ax": 47.0,
"ay": 120
},
"play": {
"x": 438,
"y": 0,
"w": 112,
"h": 113,
"ax": 50.3,
"ay": 113
},
"play2": {
"x": 552,
"y": 0,
"w": 114,
"h": 118,
"ax": 51.8,
"ay": 118
},
"play3": {
"x": 668,
"y": 0,
"w": 111,
"h": 115,
"ax": 51.6,
"ay": 115
},
"bow": {
"x": 781,
"y": 0,
"w": 110,
"h": 104,
"ax": 51.2,
"ay": 104
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

+70
View File
@@ -0,0 +1,70 @@
{
"image": "gente.png",
"height": 115,
"frames": {
"stand": {
"x": 0,
"y": 0,
"w": 126,
"h": 115,
"ax": 62.9,
"ay": 115
},
"blink": {
"x": 128,
"y": 0,
"w": 125,
"h": 115,
"ax": 62.8,
"ay": 115
},
"talk": {
"x": 255,
"y": 0,
"w": 126,
"h": 115,
"ax": 62.9,
"ay": 115
},
"talk2": {
"x": 383,
"y": 0,
"w": 126,
"h": 115,
"ax": 63.9,
"ay": 115
},
"eat": {
"x": 511,
"y": 0,
"w": 128,
"h": 117,
"ax": 62.9,
"ay": 117
},
"eat2": {
"x": 641,
"y": 0,
"w": 128,
"h": 117,
"ax": 63.0,
"ay": 117
},
"laugh": {
"x": 771,
"y": 0,
"w": 127,
"h": 117,
"ax": 62.0,
"ay": 117
},
"toast": {
"x": 900,
"y": 0,
"w": 127,
"h": 116,
"ax": 62.5,
"ay": 116
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

+70
View File
@@ -0,0 +1,70 @@
{
"image": "liscio.png",
"height": 115,
"frames": {
"stand": {
"x": 0,
"y": 0,
"w": 108,
"h": 115,
"ax": 54.5,
"ay": 115
},
"blink": {
"x": 110,
"y": 0,
"w": 108,
"h": 115,
"ax": 54.3,
"ay": 115
},
"talk": {
"x": 220,
"y": 0,
"w": 111,
"h": 115,
"ax": 57.2,
"ay": 115
},
"laugh": {
"x": 333,
"y": 0,
"w": 110,
"h": 115,
"ax": 55.6,
"ay": 115
},
"dance1": {
"x": 445,
"y": 0,
"w": 117,
"h": 112,
"ax": 57.2,
"ay": 112
},
"dance2": {
"x": 564,
"y": 0,
"w": 115,
"h": 111,
"ax": 57.0,
"ay": 111
},
"dance3": {
"x": 681,
"y": 0,
"w": 115,
"h": 112,
"ax": 56.5,
"ay": 112
},
"dance4": {
"x": 798,
"y": 0,
"w": 113,
"h": 113,
"ax": 54.4,
"ay": 113
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

+70
View File
@@ -0,0 +1,70 @@
{
"image": "volontari.png",
"height": 120,
"frames": {
"stand": {
"x": 0,
"y": 0,
"w": 102,
"h": 120,
"ax": 48.3,
"ay": 120
},
"blink": {
"x": 104,
"y": 0,
"w": 102,
"h": 120,
"ax": 48.3,
"ay": 120
},
"talk": {
"x": 208,
"y": 0,
"w": 101,
"h": 121,
"ax": 47.4,
"ay": 121
},
"explain": {
"x": 311,
"y": 0,
"w": 100,
"h": 120,
"ax": 47.4,
"ay": 120
},
"work": {
"x": 413,
"y": 0,
"w": 107,
"h": 112,
"ax": 49.0,
"ay": 112
},
"work2": {
"x": 522,
"y": 0,
"w": 104,
"h": 111,
"ax": 47.4,
"ay": 111
},
"give": {
"x": 628,
"y": 0,
"w": 100,
"h": 121,
"ax": 47.8,
"ay": 121
},
"laugh": {
"x": 730,
"y": 0,
"w": 100,
"h": 119,
"ax": 48.2,
"ay": 119
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More