# Spot The Spy 2.0: progetto Data: 24/09/2026. Approvato da Paolo in sessione. ## Obiettivo Rifare Spot The Spy (app iOS in Swift 4 e UIKit del 2018, ultima versione 1.5, oggi ritirata dall'App Store) come **stessa app, rifatta**: stesse schermate, regole, luoghi, foto e suoni, per iOS e Android da un solo codice. Grafica e impaginazione ripulite per gli schermi di oggi. Nessuna funzione nuova in questa versione. ## Il gioco (comportamento della 1.5, da conservare) Clone di Spyfall a un telefono solo, che passa di mano in mano. - **Home**: titolo, pulsanti «Gioca» e «Regole del gioco». - **Nuova partita**: - giocatori, minimo 3, nessun massimo; - spie = `ceil(giocatori / 8)`, calcolate, non modificabili; - minuti, minimo 5. Aggiungere un giocatore porta i minuti almeno al numero di giocatori; togliendone uno, i minuti scendono di uno se superano i giocatori (senza andare sotto 5); - stile delle foto: Hollywood (`a`), Dallas (`b`), Gothic (`c`); cambia anche lo sfondo di tutte le schermate; - pulsanti «Inizia», «Luoghi», «Regole». - Impostazioni e stile si ricordano fra un avvio e l'altro. - **Avvio partita**: le spie sono giocatori scelti a caso (indici distinti). Il luogo è scelto a caso fra i 59, escludendo gli ultimi 10 usati (lista salvata). Il ruolo di partenza è casuale fra i 6 del luogo. - **Giro del telefono**, per ogni giocatore: 1. avviso «Mostrami le informazioni top secret», con l'invito a non farsi vedere; 2. ruolo: nome del luogo, foto del luogo nello stile scelto, ruolo. Alla spia: «? ? ? ?», foto della spia, «Sei la SPIA». I ruoli girano in ordine sui 6 del luogo; la spia non fa avanzare il giro; 3. conferma «Fatto»: se ci sono altri giocatori, conto alla rovescia di 3 secondi con tic e si torna al punto 1; dopo l'ultimo parte il timer. - **Timer**: conto alla rovescia dei minuti scelti, con tic ogni secondo e schermo sempre acceso. - «Accusa una spia»: pausa; i pulsanti diventano «Spia smascherata» (suono vittoria, fine) e «Spia scappata» (suono sconfitta, fine); «Riprendi» fa ripartire il timer. - «Indovina il luogo»: pausa e conferma; se sì, si apre la griglia dei luoghi in modalità scelta. La spia ha un tentativo per ogni spia in gioco (il telefono passa all'altra spia). Indovinato: vittoria. Tentativi finiti: sconfitta. In entrambi i casi il timer mostra la foto del luogo vero. Nella modalità scelta la griglia non si chiude senza scegliere. - «Concludi»: chiede conferma, poi nuova partita. - Tempo scaduto: suono «paparapa», scritta «Tempo scaduto», restano «Spia smascherata» e «Spia scappata». - A partita finita il pulsante diventa «Nuova partita» e torna alle impostazioni. - Con l'app in background una notifica locale suona a fine tempo; al ritorno il timer riprende dal tempo giusto. - **Luoghi**: griglia dei 59 luoghi con foto e nome (3 colonne sul telefono, 5 sul tablet), selettore dello stile in alto. - **Regole**: pagine scorrevoli, le 5 pagine della 1.5 (`tut1`, `tut3`, `tut4`, `tut5`, `tut6` nello storyboard). - **Suoni**: click, page, tick, vittoria, failure, paparapa, suspense, come nella 1.5. **Vibrazione** leggera ai tocchi. - **Lingue**: italiano, inglese, francese, dalla lingua del telefono; ogni altra lingua usa l'inglese. - **Richiesta di recensione** dello store alla 3ª, 10ª e 50ª apertura e poi ogni 100, come nella 1.5 (il sistema decide se mostrarla davvero). ### Modifiche decise - Il luogo n. 30 «McDonald's» si **toglie**: la foto ha il marchio in primo piano e l'app è a pagamento. Restano **59 luoghi**; gli altri tengono il loro numero (1-60 senza il 30), così foto e testi si ritrovano. Un set di foto nuovo, con stili nuovi, è rimandato a una versione futura. - Il font Burbank (commerciale) è sostituito da un font gratuito con licenza OFL e aspetto simile: **Barlow Condensed** (Bold per titoli e pulsanti, Medium per i testi lunghi), il più vicino al Burbank fra quelli provati. - Il permesso per le notifiche si chiede alla prima partita, non all'apertura. ### Difetti della 1.5 da non riportare - Il timer al ritorno dal background usava solo la componente «secondi» della differenza di tempo: oltre il minuto sbagliava. Il timer nuovo si basa sull'ora di fine partita. - Tutto lo zoom fisso (`scale = larghezza / 414`) sparisce: impaginazione adattiva. ## Aspetto Si conserva lo stile della 1.5: foto di sfondo scura dello stile scelto, pulsanti con sfumatura blu (`#232933` → `#22435E`) e bordo chiaro, riquadri grigi chiari (`#DCE2EB` → bianco) con bordo `#B1B5BC`, testo scuro. Solo tema scuro. Solo verticale. Rispetta notch, isola e barre di sistema. Su iPad e tablet Android il contenuto resta centrato con una larghezza massima, e la griglia dei luoghi passa a 5 colonne. ## Tecnica - **Expo SDK 57** (React Native 0.86), TypeScript, come Quanto Basta. Cartelle `ios/` e `android/` generate da `expo prebuild`, non versionate; modifiche native con piccoli config plugin in `plugins/` (firma Android e blocco verticale sui tablet copiati da Quanto Basta). Build in locale, niente EAS. - Navigazione: `@react-navigation/native-stack`. Il tasto indietro di Android e lo swipe di iOS non devono interrompere una partita per sbaglio: durante il giro del telefono e il timer sono disattivati. - Moduli: `expo-audio`, `expo-notifications` (solo locali), `expo-haptics`, `expo-keep-awake`, `expo-localization`, `expo-image`, `expo-font`, `expo-store-review`. Impostazioni in un archivio chiave/valore semplice. - **Dati**: 59 luoghi × 6 ruoli × 3 lingue e tutti i testi estratti una volta, con uno script, dai `Localizable.strings` della 1.5 in file TypeScript. Le traduzioni sono un modulo semplice con chiavi tipizzate. - **Immagini**: 177 foto dei luoghi (800×600) più sfondi e spie dei 3 stili, prese dalla 1.5 e ricompresse (oggi 66 MB in tutto). - **Logica di gioco** in un modulo puro senza React (partita, spie, luoghi non ripetuti, giro dei ruoli, minuti, timer basato sull'ora di fine), con test `node --test`. ## Identità e pubblicazione - Nome «Spot The Spy», versione **2.0.0**, prezzo **0,99 €** su entrambi gli store, senza pubblicità né acquisti in-app. - **iOS**: stessa scheda di App Store Connect della 1.5, bundle `paoloalby.SpotTheSpy`, team `686XK96PF6`. Supporto iPhone **e iPad** (`TARGETED_DEVICE_FAMILY = "1,2"`), perché un aggiornamento non può togliere un dispositivo già supportato: servono le schermate iPad 13" e `UIRequiresFullScreen`. Paolo firma il contratto «Paid Apps». - **Android**: app nuova `it.duebytes.spotthespy`, chiave di caricamento in `_private/ - App/SpotTheSpy - firma Android/`, proprietà `STS_UPLOAD_*` in `~/.gradle/gradle.properties`. Profilo pagamenti di Google da attivare. Da verificare prima della release: come funziona il test chiuso obbligatorio (12 tester per 14 giorni) con un'app a pagamento. - Pagine di assistenza e privacy su duebytes.it, app sulla pagina beta, come da `comune/pubblicare.md`. ## Dove si lavora - Repository git nella cartella del NAS `_private/ - App/SpotTheSpy/`, che esclude le vecchie versioni (`spotTheSpy 1.*/`) e ` - mat/`. - Si compila da un clone locale in `~/dev/spotthespy`, perché dal NAS Xcode e Gradle falliscono. ## Verifica - Test automatici della logica di gioco. - Prove sul simulatore iOS (iPhone e iPad) e sull'emulatore Android (telefono e tablet): una partita completa in ogni lingua, la spia che indovina e che sbaglia, il timer che scade con l'app in background.