SimCity, ma con i permessi
Un gioco di costruzione di città dove il nemico vero è la burocrazia
Cosa fa
Gioco nel browser che prende in giro la burocrazia: per costruire la tua città devi ottenere permessi, timbri e autorizzazioni. Ha ricevuto quasi mille voti su Hacker News.
Come guadagna
Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: versione completa a pagamento una tantum, pubblicità sui portali di giochi.
Rendilo tuo
- La versione italiana sarebbe irresistibile: SCIA, marche da bollo, uffici chiusi il pomeriggio.
- I giochi satirici girano molto sui social: ogni livello è un meme.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Permesso Negato": un gioco satirico nel browser: costruisci la tua città, ma ogni edificio richiede permessi, timbri e moduli che dipendono da altri permessi. Ridere della burocrazia giocando. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con "Gioca" e qualche schermata
2. Mappa della città a griglia con gli edifici
3. Ufficio: le pratiche aperte, i moduli da compilare, le code
4. Il catalogo dei permessi con le loro dipendenze assurde
5. Classifica: città più grande costruita in meno giorni
Stile: satirico da ufficio anni '80: sfondo carta da modulo #F5F1E3, verde ministeriale #3F6212, timbri rossi #B91C1C, carattere "Courier Prime" per i moduli e "Inter" per il resto, edifici in pixel art. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- "partite": stato della città in JSON, giorno di gioco, punteggio, collegate all'utente (facoltativo)
- "classifica": nome, abitanti raggiunti, giorni impiegati
Regole di sicurezza obbligatorie:
- si gioca anche senza account, salvando nel browser
- ogni utente vede solo le sue partite; la classifica è pubblica con solo nome e punteggio
- il piano non si modifica dal browser
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Permessi che dipendono da altri permessi
Ogni edificio richiede dei permessi; ogni permesso ha requisiti (altri permessi, giorni di attesa, costi, "marca da bollo") descritti come dati. Esempio: il panificio richiede "Agibilità", che richiede "Certificato di conformità", che richiede... il panificio già costruito.
Il gioco calcola l'ordine in cui ottenere i permessi e rileva i cicli assurdi (codice nei Dettagli tecnici): quando ne trova uno, compare un evento ironico ("Il funzionario va in ferie") e una via d'uscita a pagamento in monete del gioco ("Deroga straordinaria").
Eventi casuali: sciopero degli uffici, modulo cambiato senza preavviso, timbro sbagliato. Tutti i nomi sono inventati: nessun riferimento a uffici o persone reali.
4. Ufficio e classifica
La schermata "Ufficio" mostra le pratiche in corso con le code (numerini che scorrono), e moduli da compilare con campi volutamente ridondanti ("Scrivi il tuo nome. Ora riscrivilo in stampatello").
Classifica pubblica: abitanti raggiunti e giorni di gioco. Condivisione di un'immagine con la città e il "record di timbri".
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di 3,99 € una volta sola. Il pagamento sblocca le altre 3 città (Comune montano, Città metropolitana, Isola), la modalità infinita e toglie la pubblicità.
A pagamento riuscito il webhook imposta "piano" a "pro" nella tabella "profili", sulla riga dell'utente indicata in client_reference_id.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Gioco: verifica che ogni partita sia sempre vincibile: ogni ciclo di permessi deve avere una via d'uscita.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Ordine dei permessi e cicli assurdi
Ordina i permessi in modo che ognuno venga dopo quelli che richiede (ordinamento topologico). Se trova un permesso che, giro dopo giro, richiede se stesso, segnala il ciclo.
type Permessi = Record<string, string[]>; // permesso -> permessi richiesti
export function ordinePermessi(obiettivo: string, permessi: Permessi):
{ ordine: string[] } | { ciclo: string[] } {
const ordine: string[] = [];
const stato = new Map<string, "visita" | "fatto">();
const percorso: string[] = [];
function visita(p: string): string[] | null {
if (stato.get(p) === "fatto") return null;
if (stato.get(p) === "visita") { // già in corso: è un ciclo
return [...percorso.slice(percorso.indexOf(p)), p];
}
stato.set(p, "visita");
percorso.push(p);
for (const richiesto of permessi[p] ?? []) {
const ciclo = visita(richiesto);
if (ciclo) return ciclo;
}
percorso.pop();
stato.set(p, "fatto");
ordine.push(p); // dopo tutti i suoi requisiti
return null;
}
const ciclo = visita(obiettivo);
return ciclo ? { ciclo } : { ordine };
}
// ordinePermessi("Panificio", {
// Panificio: ["Agibilità"], Agibilità: ["Conformità"], Conformità: ["Panificio"],
// }) -> { ciclo: ["Panificio", "Agibilità", "Conformità", "Panificio"] }
Pezzi comuni a tutti i progetti
Glossario
- JSONB
- Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
- Ordinamento topologico
- Mettere in fila delle cose in modo che ognuna venga dopo quelle da cui dipende.