diff --git a/CHANGELOG.md b/CHANGELOG.md index bf35f5c..ebea06c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ Tutte le versioni notevoli del gioco. Le date sono in formato AAAA-MM-GG. Ogni versione pubblicata ha anche una [release GitHub](https://github.com/cammo22/DaProd-ClawMachine/releases) con le app per Android, Windows e Mac, e va online su [GitHub Pages](https://cammo22.github.io/DaProd-ClawMachine/) subito dopo il push. +## [1.1.5] — 2026-09-26 · Niente premio fisso, e i potenziamenti DaProd + +- **La vincita è dinamica** (con la [DaProd Suite](https://github.com/cammo22/DaProdSuite) 1.5.1): «togliamo il max dei + 20 euro di vincita». Quello che metti (ricariche e potenziamenti) rende di più quanto più vai avanti col punteggio, + da metà a tre volte, e finire la collezione lo moltiplica per 1,25, più velocità e montepremi. Il pannello della + fine fa vedere la stima della sala, contando in su. +- **⚡ Potenziamenti DaProd coi soldi veri**: Super presa, Pinza larga, Prese gratis, Pioggia shiny, Rendita ×5, Lire + ×10, per 2, 5 o 10 minuti. Si pagano dal portafoglio della suite, e ogni volta la sala avvisa. Nel pannello c'è anche + quanto porteresti a casa adesso. +- **Gli effetti accesi si vedono ai lati**, col conto alla rovescia, e lampeggiano negli ultimi dieci secondi. +- **L'incasso dice tutto prima**, anche quello della cornice, e dopo il sì il gioco riparte da capo. + ## [1.1.4] — 2026-09-25 · La fine che paga, e PRENDI al centro - **La fine della partita ha il suo pannello**: tutti e 20 i modellini, e le tue lire di gioco (anche 6,1 miliardi) diff --git a/README.md b/README.md index 69adbfc..747a97a 100644 --- a/README.md +++ b/README.md @@ -62,9 +62,18 @@ capienza, motore, fortuna shiny e rendita, più le teste da sbloccare. ### 🏆 La fine Tutti e 20 i modellini in collezione e la partita è finita: il pannello fa vedere le tue lire di gioco -(anche miliardi) diventare euro. Nella [DaProd Suite](https://github.com/cammo22/DaProdSuite) si riscatta: -da 20 a 30 euro nel portafoglio, più il premio della velocità e un pezzo del montepremi, e il gioco -ricomincia da capo. Fuori dalla suite si ricomincia e basta. +(anche miliardi) diventare euro. Nella [DaProd Suite](https://github.com/cammo22/DaProdSuite) si riscatta, e +**non c'è un premio fisso** (dalla 1.1.5): quello che hai messo (ricariche e potenziamenti) rende di più quanto +più sei andato avanti, da metà fino a tre volte, e finire lo moltiplica ancora per 1,25, più il premio della +velocità e un pezzo del montepremi. La sala dice tutto prima di incassare, e il gioco ricomincia da capo. +Fuori dalla suite si ricomincia e basta. + +### ⚡ Potenziamenti DaProd (solo nella suite) + +Il tasto **⚡ DaProd** a destra di PRENDI apre sei potenziamenti a tempo, che si pagano coi **soldi veri** del +portafoglio della suite (la sala chiede conferma ogni volta): Super presa, Pinza larga, Prese gratis, Pioggia +shiny, Rendita ×5 e Lire ×10. Accesi, si vedono ai lati dello schermo col conto alla rovescia, e negli ultimi +dieci secondi lampeggiano. Nello stesso pannello c'è quanto porteresti a casa adesso, e finendo. **Mai bloccato**: ogni fase del carroponte ha un tempo massimo, la presa si paga solo se parte davvero, sopra la buca non si cala, e con meno di L.100 arriva il **bonus di cortesia**. diff --git a/gioca/daprod-lira.js b/gioca/daprod-lira.js index d0fd460..8563aae 100644 --- a/gioca/daprod-lira.js +++ b/gioca/daprod-lira.js @@ -29,6 +29,14 @@ * DaProdLira.evento("dozer", "jackpot"); * DaProdLira.incassa(); // dal tasto del gioco; la cornice ha il suo * DaProdLira.soldi(12345); // «L. 12.345» o «€ 6,38», come ha scelto chi gioca + * DaProdLira.paga(9681, "Pioggia d'oro").then(function () { attiva(); }); + * DaProdLira.suStima(function (s) { tasto.textContent = "Incassa " + DaProdLira.soldi(s.netto); }); + * + * **Dalla 1.5.1** i potenziamenti si pagano coi soldi veri del portafoglio + * (`paga`): la sala fa vedere l'avviso ogni volta, e solo se chi gioca dice si' + * la promessa si risolve. E la sala manda al gioco **la stima dell'incasso** + * (`suStima`): quanto porteresti a casa adesso, e con che punti. L'incasso + * chiede sempre conferma, dicendo tutto, e chiude la partita. * * **Dalla 1.4.9** il gioco racconta alla sala quante lire ha, ogni tre * secondi, e la sala le mostra dal vivo; e la valuta (lire o euro) la sceglie @@ -79,6 +87,8 @@ var ascoltatori = []; var perLaValuta = []; + var perLaStima = []; + var ultimaStima = null; var ultimo = null; var valuta = "lire"; function annuncia(stato) { @@ -96,8 +106,16 @@ var numero = 0; var attese = {}; + /** + * ⚠ Le domande che aspettano una persona (1.5.1): l'avviso dei soldi veri e + * la conferma dell'incasso restano aperti finche' chi gioca non tocca un + * tasto. Per quelle si aspetta dieci minuti, e il silenzio non spegne il + * modulo: chi ci pensa su non e' una sala che non risponde. + */ + var ASPETTANO_UNA_PERSONA = { paga: true, incassa: true }; function allaSala(cosa, dati) { if (spento) return Promise.reject(new Error("Fuori dalla sala giochi della DaProd Suite le lire non ci sono.")); + var persona = Boolean(ASPETTANO_UNA_PERSONA[cosa]); return new Promise(function (risolvi, rifiuta) { var n = ++numero; attese[n] = { risolvi: risolvi, rifiuta: rifiuta }; @@ -106,9 +124,10 @@ setTimeout(function () { if (!attese[n]) return; delete attese[n]; + if (persona) { rifiuta(new Error("Annullato")); return; } spento = true; rifiuta(new Error("La sala non risponde: si gioca lo stesso, ma senza lire.")); - }, 15000); + }, persona ? 600000 : 15000); }); } if (inSuite) { @@ -116,6 +135,11 @@ var m = ev.data; if (!m || m.daprod !== "lira" || ev.source !== window.parent) return; if (m.stato) annuncia(m.stato); + // 1.5.1: quanto porteresti a casa adesso, e con che punti. + if (m.stima) { + ultimaStima = m.stima; + for (var k = 0; k < perLaStima.length; k++) { try { perLaStima[k](m.stima); } catch (e) { /* niente */ } } + } if (m.n && attese[m.n]) { var a = attese[m.n]; delete attese[m.n]; if (m.errore) a.rifiuta(new Error(m.errore)); else a.risolvi(m.esito); @@ -212,10 +236,12 @@ }, /** - * L'incasso (1.4.8): quello che il gioco ha diventa lire vere, meno la - * fetta di DaProd, fino al tetto della partita. `opzioni.fine` chiude la - * partita col premio della velocita' (Claw, Neon); `opzioni.chiudi` la - * chiude senza premio. Risponde con `preso`: quante lire togliersi. + * L'incasso: quello che il gioco ha diventa lire vere, meno la fetta di + * DaProd. Dalla 1.5.1 senza tetto, e **la sala chiede sempre conferma** + * dicendo tutto (quanto hai messo, quanto porti a casa, che il gioco + * ricomincia da capo): se chi gioca dice no, la promessa si rifiuta con + * «Annullato» e `togli` non si chiama. `opzioni.fine` vuol dire che il + * gioco e' stato finito (Claw, Neon). Ogni incasso chiude la partita. */ incassa: function (opzioni) { manda(); @@ -225,6 +251,7 @@ // Claw e Neon ricominciano da capo a ogni incasso: la partita si chiude sempre. var chiudi = Boolean(opzioni.chiudi || (cassa && cassa.chiudi)); return allaSala("incassa", { gioco: gioco, grezzo: grezzo, fine: fine, chiudi: chiudi }).then(function (r) { + if (!r || r.annullato) throw new Error("Annullato"); if (cassa && cassa.togli) { try { cassa.togli(r); } catch (e) { /* il gioco si arrangia */ } } dettoNelGioco = -1; setTimeout(raccontaNelGioco, 300); @@ -232,6 +259,27 @@ }); }, + /** + * ⚠ **Un potenziamento coi soldi veri** (1.5.1). La sala fa vedere + * l'avviso — quanto costa in lire e in euro, e da dove escono — e la + * promessa si risolve solo se chi gioca dice si' e le lire sono uscite + * davvero dal portafoglio. Se dice no, o non bastano, si rifiuta: il gioco + * non da' niente. Fuori dalla suite si rifiuta sempre. + */ + paga: function (lire, cosa) { + var n = Math.floor(Number(lire) || 0); + if (n <= 0) return Promise.reject(new Error("Quanto costa?")); + return allaSala("paga", { gioco: gioco, lire: n, cosa: String(cosa || "potenziamento") }).then(function (r) { + if (!r || r.annullato) throw new Error("Annullato"); + return r; + }); + }, + + /** L'ultima stima dell'incasso (1.5.1), o null. */ + stima: function () { return spento ? null : ultimaStima; }, + /** Chi vuole sapere quanto vale la partita adesso: arriva ogni volta che cambia. */ + suStima: function (fn) { perLaStima.push(fn); if (ultimaStima) { try { fn(ultimaStima); } catch (e) { /* niente */ } } }, + /** Lire in euro, scritte all'italiana: «€ 1,00». Il cambio e' quello del 2002. */ euro: function (lire) { var e = (Number(lire) || 0) / 1936.27; diff --git a/gioca/index.html b/gioca/index.html index bafc71b..bec0610 100644 --- a/gioca/index.html +++ b/gioca/index.html @@ -212,6 +212,45 @@ box-shadow: 0 12px 30px rgba(255,160,0,.45); } #fineBtn:disabled { filter: grayscale(.6) brightness(.7); } + /* ---------- 1.1.5: i potenziamenti DaProd e gli effetti ai lati ---------- */ + #turboBtn { grid-area: dx; justify-self: end; color: #1a1000; background: radial-gradient(circle at 50% 28%, #fff6c8, var(--oro) 48%, var(--oro2) 100%); } + #turboBtn[hidden] { display: none; } + #turbo { position: fixed; inset: 0; z-index: 44; display: grid; place-items: end center; padding: 12px; background: rgba(0,0,0,.55); } + #turbo.chiuso { display: none; } + #turbo .pannello { width: min(520px, 100%); max-height: 82vh; overflow: auto; padding: 16px; border-radius: 24px; display: grid; gap: 10px; } + #turbo .testa { display: flex; justify-content: space-between; align-items: center; font: 900 15px/1 var(--num); color: var(--oro); } + #turbo .testa button { border: 0; background: transparent; color: #fff; font-size: 20px; cursor: pointer; } + #turbo .spiega { margin: 0; font: 600 12.5px/1.45 var(--txt); color: #cfc6e6; } + .incassoVivo { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; } + .incassoVivo:empty { display: none; } + .incassoVivo div { padding: 8px 10px; border-radius: 14px; background: rgba(0,0,0,.35); } + .incassoVivo small { display: block; font: 800 8.5px/1 var(--num); letter-spacing: 1px; color: #b9aed6; } + .incassoVivo b { display: block; margin-top: 4px; font: 900 16px/1 var(--num); color: var(--oro); } + .incassoVivo b.su { color: var(--verde); } .incassoVivo b.giu { color: #ff6b7d; } + .tb { display: grid; grid-template-columns: auto 1fr auto; gap: 10px; align-items: center; padding: 10px; border-radius: 16px; + background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.1); } + .tb.acceso { border-color: rgba(93,255,180,.6); background: rgba(93,255,180,.08); } + .tb .i { font-size: 24px; } + .tb b { display: block; font: 900 12px/1.1 var(--num); color: #fff; } + .tb small { display: block; font: 600 11.5px/1.3 var(--txt); color: #b9aed6; margin-top: 3px; } + .tb button { border: 0; border-radius: 999px; padding: 10px 12px; cursor: pointer; font: 900 11.5px/1 var(--num); color: #1a1000; + background: radial-gradient(circle at 50% 28%, #fff6c8, var(--oro) 48%, var(--oro2) 100%); white-space: nowrap; } + .bordo { position: fixed; top: 0; bottom: 0; left: 0; width: 22px; z-index: 9; pointer-events: none; opacity: 0; transition: opacity .4s; + background: linear-gradient(90deg, rgba(93,255,180,.55), transparent); } + .bordo.su { opacity: 1; } + .bordo.finisce, .eff.finisce { animation: lampeggia .5s steps(2, jump-none) infinite; } + @keyframes lampeggia { 50% { opacity: .25; } } + #effetti { position: fixed; right: 10px; top: 50%; transform: translateY(-50%); z-index: 13; pointer-events: none; + display: flex; flex-direction: column; gap: 6px; align-items: flex-end; } + @media (max-width: 700px) { #effetti { top: 36%; right: 6px; } } + .eff { display: grid; grid-template-columns: auto auto; align-items: center; column-gap: 7px; row-gap: 3px; padding: 6px 9px 7px; + border-radius: 14px; background: rgba(12,10,24,.82); min-width: 104px; box-shadow: 0 8px 20px rgba(0,0,0,.5); border: 1px solid rgba(93,255,180,.6); } + .eff i { font-style: normal; font-size: 18px; line-height: 1; grid-row: span 2; } + .eff b { font: 900 15px/1 var(--num); color: #fff; font-variant-numeric: tabular-nums; } + .eff small { font: 800 8.5px/1 var(--num); letter-spacing: .8px; color: #bfffe0; white-space: nowrap; } + .eff u { grid-column: 1 / -1; display: block; height: 4px; border-radius: 99px; background: rgba(255,255,255,.12); overflow: hidden; text-decoration: none; } + .eff u::before { content: ""; display: block; height: 100%; width: var(--p, 100%); background: var(--verde); border-radius: 99px; } + /* ---------- la barra in basso, rifatta (1.1.4) ---------- «Vorrei selettori pinza, amo e rete piu' piccoli e sotto, e il pulsante per acchiappare bello al centro.» Tre colonne: vetrina e officina a sinistra, @@ -566,6 +605,19 @@
+ + + + + + +Si pagano coi soldi veri del tuo portafoglio DaProd: ogni volta ti chiedo conferma. Contano come messi nella partita, e piu' vai avanti piu' rendono quando incassi.
+ + +