Il mio Pokémon unico al mondo

Panoramica

A partita in corso, in una finestra dentro il gioco stesso, il giocatore scrive poche parole. Mentre il gioco continua a girare, un'IA le trasforma in una specie di Pokémon del tutto nuova — illustrazione, nome, tipo, statistiche base e mosse — e la registra come specie a tutti gli effetti. La si incontra nell'erba alta, la si cattura, le si dà un soprannome e la si allena come qualsiasi altra.

Niente è scritto in anticipo. La specie che finisce nel salvataggio non è mai esistita prima e non esiste da nessun'altra parte.

Una parte di ciò che i giochi hanno sempre offerto è costruire qualcosa che sia tuo. Nella pratica ha voluto dire scegliere dentro un insieme già dato. Questo progetto serve a verificare se l'IA generativa rende tuo letteralmente vero e, soprattutto, se a qualcosa di letteralmente tuo il giocatore finisce davvero per affezionarsi.

Come si svolge

Tutto parte parlando con un'anziana signora nel Bosco Petalipoli. Descrivi la creatura che hai in mente; quelle parole diventano una specie mentre continui a giocare; e qualche minuto dopo ti aspetta nell'erba alta, pronta a essere incontrata, catturata e usata da lì in poi esattamente come qualsiasi altra cosa nel gioco. Tutto viene fatto sul momento: il nome, il tipo, le statistiche base, l'elenco delle mosse, entrambi gli sprite da lotta e l'icona nella squadra.

Una coppia di anziani nel Bosco Petalipoli. Una finestra di dialogo dice: Di' un po'… che tipo di creatura hai in mente?
Parlare con l'anziana signora dà il via a tutto.
La schermata di inserimento del dialogo semplificato, intitolata «Immagina la creatura:», con inserite le parole BEAUTIFUL, ATTACK e FIRE.
Le dai sei parole attraverso il sistema di dialogo semplificato di Smeraldo.
Il giocatore è nel bosco accanto all'erba alta. Una finestra di dialogo dice: L'erba alta si muove… C'è qualcosa lì dentro!
La generazione gira sul PC per qualche minuto. Un verso annuncia che è pronta.
Schermata di lotta. Una lucertola rossa con una fiamma sulla testa è di fronte al giocatore. Il testo dice: FLAMEREL selvatico è apparso!
FLAMEREL, una lucertola di tipo Fuoco, compare nell'erba che si muoveva.
Una Poké Ball viene lanciata su FLAMEREL durante la lotta.
Si cattura con una Poké Ball, come qualsiasi altra specie.
La schermata che chiede il soprannome di FLAMEREL, con GGG inserito.
Può ricevere un soprannome, come qualsiasi altra specie.
La schermata della squadra mostra la specie generata accanto a tre Pokémon ordinari, con un'icona tutta sua.
Sta nella squadra con la propria icona, come qualsiasi altra specie.
La schermata dei dati di FLAMEREL: tipo Fuoco, abilità Grinta, natura birbona, incontrato al livello 7 nel Bosco Petalipoli.
La sua schermata riassuntiva funziona, come quella di qualsiasi altra specie.

Una sessione completa, dall'inizio alla fine, è registrata qui: My Own Pokémon Generation — demo02.

Perché questo, e non un generatore di creature

Il problema interessante non è se un'IA sappia inventare un Pokémon, ma se sappia inventarne uno che il gioco riesca ad assorbire senza sfaldarsi. Lasciato a sé, un generatore produce qualcosa di inutilizzabile — un mostro da 900 punti di statistiche che rende banale il gioco — oppure di sgradevole: uno sprite malformato che smette del tutto di leggersi come una creatura.

Il lavoro di design, qui, non è la creatura: è lo spazio dentro cui la creatura viene generata. Le fasce delle statistiche, le regole che dicono quali mosse sono ammesse, le sagome che reggono uno sprite da 64×64, il vocabolario con cui al giocatore è concesso descrivere. Il modello esplora quello spazio. Non è lui a definirlo.

Questo progetto è il punto in cui la mia filosofia progettuale smette di essere una tesi e viene messa alla prova: definire gli obiettivi, i valori, i vincoli e i confini che danno forma a uno spazio progettuale, lasciare che la generazione avvenga al suo interno e scoprire se il risultato regge.

La struttura è la ricerca

L'LLM non scrive mai liberamente: riempie le caselle di uno schema fisso, e ogni risposta viene ricontrollata da un validatore. Le violazioni tornano indietro per essere rigenerate, insieme alla regola precisa che è stata infranta.

I vincoli di equilibrio tengono il gioco giocabile. Il totale delle statistiche base resta in una fascia fissa — da 280 a 360, all'incirca il livello di un Pokémon iniziale — con un intervallo per ogni singola statistica, e le specifiche fuori fascia vengono respinte senza appello. Le mosse sono estratte automaticamente dal codice di pokeemerald, poi filtrate al tipo della specie stessa o a Normale, togliendo le mosse che mettono KO in un colpo solo, gli effetti di autodistruzione e i danni fissi o smisurati. L'insieme che ne esce viene verificato nella sua solidità: abbastanza mosse offensive, almeno un attacco dello stesso tipo, al massimo una mossa di potenza elevata. I livelli di apprendimento li assegna la struttura in modo deterministico, non il modello. Tutto il resto è fissato — un'abilità per tipo, tasso di cattura, curva di crescita, rapporto tra i sessi, compatibilità con le MT — così la variazione individuale resta confinata alle caselle dello schema e le esecuzioni restano confrontabili.

I vincoli di aspetto impediscono al risultato di sfaldarsi. Gli schemi corporei vengono da una lista chiusa di sagome che reggono uno sprite da 64×64: quadrupede, roditore, uccello, lucertola. Il colore si sceglie da un elenco di nomi ammessi, e da lì il colore corporeo del Pokédex si ricava in modo meccanico. I tratti sono limitati a una o tre formule brevi già pronte, con una lista di esclusione che respinge tratti umani, sangue, armi e testo. Il prompt finale lo compone la struttura stessa, che vi aggiunge in coda una chiusa fissa: una sola creatura, corpo intero, anatomia coerente, niente arti in più, espressione calma.

Funziona, e lo si vede funzionare. In un'esecuzione registrata il modello ha proposto un totale di statistiche base di 380; il validatore l'ha respinto tre volte — 380, 360, 340 — finché la specifica non è rientrata nella fascia, a 320.

Come gira

Il gioco di per sé non genera niente. Il lavoro lo fa un processo Python residente sul PC, e le due metà si parlano attraverso una cassetta postale di file che uno script Lua dentro mGBA controlla a ogni fotogramma.

  1. Testo. Un modello locale (qwen3:8b) trasforma le parole in una scheda di specie validata.
  2. Immagine. Un modello di immagini disegna un'illustrazione di riferimento, poi tre viste coerenti tra loro: lo sprite da lotta di fronte, quello di spalle e l'icona nella squadra.
  3. Conversione. Il disegno viene quantizzato su una tavolozza comune di 15 colori e convertito nel formato sprite di pokeemerald.
  4. Codifica. Gli sprite diventano binari GBA: tile a 4bpp e 1bpp, tavolozze gbapal, compressione LZ77 compatibile con il BIOS.
  5. Iniezione. I binari vengono scritti in un'area riservata della ROM.

Scrivere nella cartuccia mentre il gioco è in esecuzione fa sì che l'istanza in corso prenda la nuova specie senza un riavvio, e la stessa identica sequenza di byte finisce su disco, così la modifica sopravvive a un ricaricamento.

Ciò che compare è permanente e irreversibile. Vaga per il mondo di gioco: che tu fugga o che tu perda, resta lì. Se lo metti KO, è perso per sempre.

Implementazione

Il generatore, la struttura di vincoli, i codificatori GBA e la patch lato gioco sono pubblicati per intero: github.com/takafumihoriuchi/my-own-pokemon-generation.

Poscritto — sull'attaccamento

Il prototipo risolve una domanda tecnica. Dietro di essa sta quella che mi interessa davvero: un Pokémon generato per te, che non esiste da nessun'altra parte, arriva a contare più di uno arrivato insieme al gioco?

Dopo aver giocato alla mia build — un campione di uno solo, e non va letto per più di questo — le condizioni che sembrano governare la risposta sono due.

Un caso venuto da fuori dal gioco parla di entrambe. Lavorando a mano con ChatGPT, avanti e indietro finché non sono stato soddisfatto, ho progettato una specie tutta mia: Hanagitsune. Ci sono affezionato. L'avevo fatta, non richiesta, e quello che ne è uscito superava l'asticella della qualità.

Hanagitsune, di fronte: una volpe verde pallido con la coda fatta di una cascata di tralci in fiore. Hanagitsune, di spalle, con tutta la lunghezza della coda fiorita.
Hanagitsune — custode della foresta, con la coda in fiore. Dove è passata correndo spuntano erba e fiori, che richiamano vita nuova perfino sulla terra sterile. La sua figura è presa come segno di una foresta che cresce verso il proprio futuro.
La schermata dei dati di Hanagi2ne: tipo Erba, abilità Erbaiuto, natura audace, incontrata al livello 7 nel Bosco Petalipoli. Lo sprite è una volpe verde pallido con la coda in fiore. Schermata di lotta. Hanagi2ne, vista di spalle, è di fronte a un Poochyena selvatico. Il testo dice: Hanagi2ne usa ASSORBIMENTO!
Hanagitsune, progettata a mano nel dialogo con ChatGPT, implementata come specie dentro il gioco stesso.

Su entrambe le condizioni si può intervenire. Un processo di fabbricazione più profondo — scegliere, correggere, scartare — sposta la prima; modelli migliori e una struttura di prompt progettata con più cura spostano la seconda. È lì che il lavoro prosegue.

Il risultato del prototipo non è quindi un verdetto sulla domanda: è la domanda resa misurabile, in due variabili che ora si possono muovere di proposito e osservare.

Costruito sulla decompilazione pret/pokeemerald come ricerca personale. Non viene distribuita alcuna ROM, patch per ROM o risorsa del gioco, e tutti gli sprite mostrati qui sono opere originali generate dall'IA. Pokémon è un marchio di Nintendo, Creatures Inc. e GAME FREAK Inc.; questo progetto non è affiliato a queste società né approvato da loro.