Takafumi Horiuchi

Generare un Pokémon tutto tuo: un prototipo di ricerca integrato nel gioco

Panoramica

Ho realizzato un prototipo di ricerca che genera una nuova specie di Pokémon a partire da sei parole scelte durante la partita. Dopo alcuni minuti compare nell’erba alta, dove il giocatore può incontrarla, catturarla e darle un soprannome. Il prototipo genera aspetto, nome, tipo, statistiche di base, mosse e dati necessari a integrarla nel gioco.

Il prototipo collega conversazioni, scelta delle parole, generazione in background, incontri selvatici, cattura e assegnazione del soprannome senza interrompere il gioco. Ogni specie generata viene registrata in un formato utilizzabile dai sistemi di gioco esistenti.

Mi sono concentrato sulla struttura del processo di generazione più che sul modello stesso: definire requisiti che preservino equilibrio di gioco e coerenza visiva, lasciando poi che l’IA esplori entro quei confini. Ho anche giocato personalmente con il prototipo per valutare in via preliminare se un personaggio unico fosse sufficiente a suscitare attaccamento.

La domanda: essere unico basta a suscitare attaccamento?

I giochi permettono di scegliere, far crescere e dare un nome ai personaggi fino a sentirli propri. Il punto di partenza resta però un insieme di opzioni preparato dagli sviluppatori. Se l’IA generativa permettesse ai giocatori di dare forma a un personaggio fin dall’inizio, il legame sarebbe più forte?

Una sola immagine generata non basta per esplorare questa domanda. Il personaggio deve entrare nel mondo di gioco, poter essere incontrato e catturato e restare disponibile per continuare a giocare. Ho creato due percorsi con diversi livelli di coinvolgimento: parlare con l’anziano avvia la generazione senza input, mentre parlare con l’anziana permette di scegliere sei parole. Il primo personaggio con cui si parla determina il metodo di generazione per quella partita.

Il prototipo non trae conclusioni sull’attaccamento. Il suo scopo è integrare contenuti generati nel normale svolgimento del gioco e individuare condizioni per confronti futuri.

L’esperienza di gioco

La sequenza seguente mostra il percorso guidato dal giocatore. Nel Bosco Petalo, il giocatore parla con un’anziana e sceglie sei parole dal vocabolario Easy Chat già presente nel gioco. La generazione prosegue in background mentre la partita continua. Un verso segnala che la nuova specie è pronta; entrare nell’erba alta avvia l’incontro e il giocatore può catturarla con i comandi abituali. Ogni generazione produce nome, tipo, statistiche di base, mosse, sprite di battaglia frontale e posteriore e un’icona per la squadra. Il video dimostrativo mostra l’intera sequenza.

Una coppia di anziani si trova davanti al giocatore nel Bosco Petalo. Il dialogo chiede che tipo di creatura immagini.
Il giocatore inizia parlando con l’anziana.
Schermata Easy Chat con il titolo «Picture the creature:» (immagina la creatura) e le parole BEAUTIFUL, ATTACK e FIRE inserite.
Il giocatore descrive l’idea scegliendo sei parole dal vocabolario Easy Chat già presente in Pokémon Smeraldo.
Il giocatore è accanto all’erba alta nella foresta. Il dialogo dice: «The tall grass is rustling... Something is in there!» (l’erba alta si muove… c’è qualcosa!).
La generazione richiede alcuni minuti sul PC. Un verso segnala che la nuova specie è pronta.
Schermata di battaglia. Una lucertola rossa con fiamme sulla testa si trova di fronte al giocatore. È visualizzato il messaggio: 'È apparso un FLAMEREL selvaggio!'
FLAMEREL, una lucertola di tipo Fuoco, compare dall’erba che si muove.
Durante la battaglia, una Poké Ball viene lanciata verso FLAMEREL.
Come le altre specie, può essere catturata con una Poké Ball.
Schermata di denominazione che chiede il soprannome di FLAMEREL. È inserito GGG.
Come a qualsiasi altro Pokémon, si può assegnare un soprannome alla nuova specie.
Schermata della squadra. La specie generata ha un’icona propria e compare accanto a tre Pokémon esistenti.
La nuova specie riceve un’icona dedicata e compare nella squadra del giocatore.
Riepilogo di FLAMEREL: tipo Fuoco, abilità Aiutofuoco (Blaze), natura Birbona (Naughty), incontrato al livello 7 nel Bosco Petalo.
I dati generati funzionano con la schermata di riepilogo già presente nel gioco.

La sfida progettuale: mantenere giocabili i personaggi generati

Generare un nuovo personaggio e farlo funzionare all’interno di un gioco sono due sfide distinte. Statistiche troppo alte possono alterare il bilanciamento della difficoltà, mentre tipi e mosse poco compatibili possono renderlo difficile da allenare. Un aspetto troppo complesso può diventare irriconoscibile quando viene ridotto a uno sprite di 64 × 64 pixel.

Fissare ogni dettaglio toglierebbe senso alla generazione di un risultato diverso ogni volta. Dovevo distinguere gli elementi essenziali per il gioco da quelli che potevano variare.

Mi sono quindi concentrato sulla progettazione dello spazio dei Pokémon possibili, anziché di un singolo personaggio. Le persone definiscono obiettivi, vincoli, contenuti vietati e metodi di validazione; l’IA sviluppa proposte entro questa struttura. Il prototipo funzionante mette in pratica il mio approccio alla progettazione per vincoli.

L’approccio: definire le condizioni di generazione

Il sistema chiede a un modello linguistico di grandi dimensioni (LLM) di compilare campi predefiniti, come nome, tipo, statistiche di base, mosse, forma del corpo e colore, anziché scrivere un testo libero. Un validatore controlla ogni risposta prima di accettarla. Se una risposta viola una regola, il sistema restituisce la violazione specifica e chiede al modello di rigenerare finché i requisiti sono soddisfatti.

  1. Le persone definiscono i confini. I requisiti di equilibrio del gioco, leggibilità degli sprite e ammissibilità dei contenuti diventano regole esplicite e verificabili.
  2. L’IA sviluppa proposte. Il modello usa le parole del giocatore per proporre valori nei campi consentiti.
  3. Il sistema verifica che l’output rispetti le regole. Controlla automaticamente intervalli numerici, combinazioni di mosse e contenuti vietati.
  4. Il feedback riguarda solo le violazioni. Una proposta che viola una regola viene restituita con la motivazione e rigenerata.

Vincoli che proteggono il gioco. Ho fissato il totale delle statistiche di base tra 280 e 360, con limiti superiori e inferiori per ciascuna statistica. Le mosse sono state estratte dal codice sorgente del gioco e limitate a quelle dello stesso tipo della specie o di tipo Normale. Sono state escluse mosse da KO in un colpo, autodistruttive, a danno fisso ed eccessivamente potenti. Il validatore controllava anche il numero di mosse offensive e la presenza di mosse dello stesso tipo della specie. Tasso di cattura, tasso di crescita e altri fattori sono stati mantenuti fissi per contenere le differenze generate entro un intervallo adatto al confronto.

Vincoli che preservano la chiarezza visiva. Le forme del corpo sono selezionate tra opzioni con sagome leggibili anche in sprite piccoli. Sono limitati anche i termini utilizzabili per colori e caratteristiche. Sono esclusi tratti umani, sangue, armi e testo. Le istruzioni di generazione delle immagini includono sempre condizioni come «una sola creatura», «mostrare il corpo intero» e «nessun arto aggiuntivo».

In un’esecuzione registrata, il modello aveva inizialmente proposto un totale di statistiche di base pari a 380. Il validatore ha rilevato la violazione e chiesto una nuova generazione, arrivando a una specifica con un totale di 320. Il contributo consiste nel processo che rifiuta risultati fuori dai vincoli definiti, senza affidarsi alla casualità di un risultato riuscito.

Mantenere l’esperienza all’interno del gioco

Il giocatore usa soltanto conversazioni, scelta delle parole e incontri nell’erba presenti nel gioco: non c’è una schermata di generazione separata. Le elaborazioni più impegnative vengono eseguite da un processo Python sul PC, che scambia dati con il gioco attraverso file. Script Lua nell’emulatore mGBA collegano i due ambienti, preservando i comandi familiari del gioco e mantenendo esterna l’elaborazione dell’IA.

  1. Generare la specifica. Un modello linguistico locale trasforma le sei parole in dati della specie, validati prima dell’uso.
  2. Generare le immagini. Un modello di immagini crea un’illustrazione di riferimento, poi sprite frontale e posteriore e un’icona di squadra visivamente coerenti.
  3. Convertire in dati di gioco. Le immagini vengono ridotte a 15 colori, poi convertite e compresse in sprite e palette compatibili con Game Boy Advance (GBA).
  4. Integrare nel gioco in esecuzione. I dati vengono scritti in un’area riservata, introducendo la nuova specie senza riavviare il gioco.

Gli stessi dati vengono salvati anche su disco, così la specie generata permane quando si ricarica il gioco. La generazione avviene una sola volta e non può essere annullata. Se il giocatore fugge o perde l’incontro, il Pokémon rimane nel mondo. Se lo sconfigge, non ricompare più. Questa irreversibilità rende l’essere «l’unico in quella partita» parte dell’esperienza.

Che cosa ha confermato il prototipo

Ho realizzato da solo questo prototipo per verificarne la fattibilità tecnica. Non è né un gioco finito né uno studio con utenti. Di seguito distinguo ciò che ho verificato, ciò che ho implementato e ciò che resta da provare.

Che cosa ho imparato giocando: l’unicità da sola non mi ha fatto affezionare

Giocare personalmente con il prototipo non mi ha fatto sviluppare un forte attaccamento al Pokémon generato. È la mia impressione di sviluppatore, non un risultato generalizzabile ad altri giocatori. Mi ha però suggerito che cosa variare in un futuro confronto.

Due fattori mi sono sembrati degni di approfondimento.

Al contrario, provo attaccamento per Hanagitsune, un personaggio che ho creato al di fuori del processo automatizzato del gioco, attraverso conversazioni ripetute con diversi strumenti di IA generativa e rifiniture manuali. Ho confrontato proposte, corretto dettagli e continuato fino a essere soddisfatto. Penso che abbiano contribuito a questo legame sia la qualità del risultato sia il mio coinvolgimento nel processo iterativo.

Vista frontale di Hanagitsune, una volpe verde chiaro con una coda simile a tralci ricadenti coperti di fiori. Vista posteriore di Hanagitsune, che mostra tutta la lunghezza della coda fiorita.
Hanagitsune, custode della foresta dalla coda fiorita. Dove corre spuntano erba e fiori, portando nuova vita anche alla terra arida. È considerato un simbolo della continua crescita della foresta.
Riepilogo di Hanagi2ne: tipo Erba, abilità Erbaiuto (Overgrow), natura Audace (Brave), incontrato al livello 7 nel Bosco Petalo. Lo sprite è una volpe verde chiaro con una coda fiorita. Schermata di battaglia: Hanagi2ne visto da dietro affronta un Poochyena selvatico. Il testo dice «Hanagi2ne used ABSORB!» (Hanagi2ne usa Assorbimento!).
Hanagitsune, progettato attraverso dialogo ripetuto e rifiniture manuali, è stato implementato come specie nel gioco.

Questo prototipo non risponde alla domanda se i contenuti generati suscitino attaccamento. Traduce la domanda generale in due fattori che si possono variare deliberatamente: qualità del risultato e profondità del coinvolgimento. Uno studio futuro introdurrebbe occasioni per scegliere, confrontare e correggere durante la creazione, porterebbe i risultati a un livello qualitativo omogeneo e confronterebbe le esperienze di più partecipanti.

Implementazione

Il processo di generazione, la struttura dei vincoli e della validazione, la conversione dei dati GBA e le modifiche lato gioco sono pubblicati nel repository GitHub.

Questo progetto di ricerca indipendente è stato realizzato a partire dalla decompilazione pret/pokeemerald . Non distribuisce ROM, patch di ROM o risorse del gioco. Pokémon è un marchio di Nintendo, Creatures Inc. e Game Freak Inc.; il progetto non è affiliato a queste aziende né da esse approvato.