O meu Pokémon único no mundo

Resumo

A meio do jogo, numa janela dentro do próprio jogo, o jogador escreve umas poucas palavras. Com o jogo ainda a correr, uma IA transforma-as numa espécie de Pokémon inteiramente nova — ilustração, nome, tipo, estatísticas base e ataques — e regista-a como espécie de pleno direito. Encontra-la na erva alta, apanha-la, dás-lhe alcunha e crias-la como a qualquer outra.

Nada está escrito de antemão. A espécie que acaba no ficheiro de gravação nunca existiu antes e não existe em mais lado nenhum.

Parte do que os videojogos sempre ofereceram é fazer algo que seja teu. Na prática, isso significou escolher dentro de um conjunto fixo. Este projecto existe para testar se a IA generativa torna teu literalmente verdadeiro e, sobretudo, se algo literalmente teu é algo a que um jogador realmente se afeiçoa.

Percurso

Tudo começa ao falar com uma senhora idosa no Bosque de Petalburg. Descreves a criatura que tens em mente; essas palavras são transformadas numa espécie enquanto continuas a jogar; e uns minutos depois ela está à espera na erva alta — para ser encontrada, apanhada e usada a partir daí exactamente como qualquer outra coisa do jogo. Tudo é feito na hora: o nome, o tipo, as estatísticas base, o conjunto de ataques, os dois sprites de combate e o ícone da equipa.

Um casal de idosos no Bosque de Petalburg. Uma caixa de diálogo diz: Diz-me… que tipo de criatura imaginas?
Falar com a senhora põe tudo em marcha.
O ecrã de introdução do diálogo simplificado, intitulado «Imagina a criatura:», com as palavras BEAUTIFUL, ATTACK e FIRE introduzidas.
Dás-lhe seis palavras através do sistema de diálogo simplificado do próprio Emerald.
O jogador está no bosque junto à erva alta. Uma caixa de diálogo diz: A erva alta está a mexer-se… Está ali qualquer coisa!
A geração demora uns minutos no PC. Um grito avisa que está pronta.
Ecrã de combate. Um lagarto vermelho com uma chama na cabeça enfrenta o jogador. O texto diz: Um FLAMEREL selvagem apareceu!
FLAMEREL, um lagarto do tipo fogo, aparece na erva que se mexia.
Uma Poké Ball é atirada ao FLAMEREL durante o combate.
Pode ser apanhado com uma Poké Ball, como qualquer outra espécie.
O ecrã que pede uma alcunha para o FLAMEREL, com GGG introduzido.
Pode receber alcunha, como qualquer outra espécie.
O ecrã da equipa, com a espécie gerada ao lado de três Pokémon vulgares e com o seu próprio ícone.
Ocupa o seu lugar na equipa com ícone próprio, como qualquer outra espécie.
O ecrã de informação do FLAMEREL: tipo fogo, habilidade Chama, natureza traquina, encontrado ao nível 7 no Bosque de Petalburg.
O seu ecrã de resumo funciona, como o de qualquer outra espécie.

Uma partida completa, do início ao fim, está registada aqui: My Own Pokémon Generation — demo02.

Porquê isto e não um gerador de criaturas

O problema interessante não é se uma IA consegue inventar um Pokémon. É se consegue inventar um que o jogo seja capaz de absorver sem se desfazer. Entregue a si mesmo, um gerador produz ou algo inutilizável — um monstro de 900 pontos de estatísticas que trivializa o jogo — ou algo desagradável: um sprite deformado que deixa de se ler como criatura.

Portanto o trabalho de design aqui não é a criatura. É o espaço dentro do qual ela é gerada: as faixas de estatísticas, as regras de legalidade dos ataques, as silhuetas que sobrevivem a um sprite de 64×64, o vocabulário com que o jogador sequer pode descrever. O modelo explora esse espaço. Não chega a defini-lo.

Este projecto é onde a minha filosofia de design deixa de ser um argumento e é posta à prova: definir os objectivos, valores, restrições e limites que dão forma a um espaço de design, deixar a geração acontecer lá dentro, e descobrir se o resultado se aguenta.

O enquadramento é a investigação

O LLM nunca escreve livremente. Preenche espaços de um esquema fixo, e cada saída é novamente verificada por um validador. As violações são devolvidas para regeneração juntamente com a regra concreta que foi quebrada.

As restrições de equilíbrio mantêm o jogo jogável. O total de estatísticas base é mantido numa faixa fixa — de 280 a 360, aproximadamente o nível de um inicial — com intervalos por estatística, e especificações fora da faixa são rejeitadas de imediato. Os ataques são extraídos automaticamente do código do pokeemerald e depois filtrados para o tipo da própria espécie ou Normal, removendo ataques de derrube imediato, efeitos de autodestruição e dano fixo ou excessivo. O conjunto resultante é verificado quanto à solidez: ataques ofensivos suficientes, pelo menos um ataque do mesmo tipo, no máximo um ataque de alta potência. A atribuição de níveis é feita de forma determinista pelo enquadramento, não pelo modelo. Tudo o resto está fixado — uma habilidade por tipo, taxa de captura, curva de crescimento, proporção de géneros, compatibilidade com MT — de modo que a variação individual fica confinada aos espaços do esquema e as execuções continuam comparáveis.

As restrições de aparência impedem que a saída se desfaça. Os planos corporais vêm de uma lista branca de silhuetas que sobrevivem a um sprite de 64×64: quadrúpede, roedor, ave, lagarto. A cor é escolhida de uma lista branca com nomes, e a cor corporal da Pokédex é derivada mecanicamente. As características limitam-se a uma a três frases curtas pré-definidas, com uma lista de bloqueio que rejeita traços humanos, sangue, armas e texto. O enquadramento compõe ele próprio a instrução final e acrescenta-lhe um epílogo fixo: uma só criatura, corpo inteiro, anatomia coerente, sem membros a mais, expressão serena.

Funciona, e pode ver-se a funcionar. Numa execução registada, o modelo propôs um total de estatísticas base de 380; o validador devolveu-o três vezes — 380, 360, 340 — até a especificação aterrar dentro da faixa, em 320.

Como funciona

O jogo em si não gera nada. O trabalho é feito por um processo Python residente no PC, e as duas metades falam através de uma caixa de correio em ficheiros que um script Lua no mGBA consulta a cada fotograma.

  1. Texto. Um modelo local (qwen3:8b) transforma as palavras num registo de espécie validado.
  2. Imagem. Um modelo de imagem desenha uma ilustração de referência e, a partir dela, três vistas coerentes entre si: o sprite frontal de combate, o traseiro e o ícone da equipa.
  3. Conversão. A arte é quantizada para uma paleta comum de 15 cores e convertida para o formato de sprites do pokeemerald.
  4. Codificação. Os sprites passam a binários de GBA: tiles de 4bpp e 1bpp, paletas gbapal e compressão LZ77 compatível com a BIOS.
  5. Injecção. Os binários são escritos numa região reservada da ROM.

Escrever na cassete em tempo de execução significa que a instância em curso apanha a nova espécie sem reiniciar, e que a mesma sequência de bytes vai para o disco, pelo que a alteração sobrevive a um recarregamento.

O que aparece é permanente e irreversível. Anda pelo mundo: se fugires ou perderes, fica lá. Se o derrubares, desaparece para sempre.

Implementação

O gerador, o enquadramento de restrições, os codificadores de GBA e a alteração do lado do jogo estão publicados na íntegra: github.com/takafumihoriuchi/my-own-pokemon-generation.

Posfácio — sobre o apego

O protótipo resolve uma questão técnica. Atrás dela está aquela com que realmente me importo: um Pokémon gerado para ti, que não existe em mais lado nenhum, acaba por significar mais do que um que veio com o jogo?

De jogar a minha própria versão — uma amostra de um, e não vale a pena lê-la como mais do que isso — parecem sobressair duas condições que governam a resposta.

Um caso de fora do jogo fala das duas. A trabalhar à mão com o ChatGPT, indo e voltando até ficar satisfeito, desenhei uma espécie minha — Hanagitsune. Tenho-lhe apego. Tinha-a feito em vez de a encomendar, e o que saiu ultrapassava a fasquia da qualidade.

Hanagitsune, de frente: uma raposa verde-pálida cuja cauda é uma cascata de trepadeiras em flor. Hanagitsune, de costas, com todo o comprimento da cauda florida à vista.
Hanagitsune — guardião da floresta, de cauda em flor. Por onde correu brotam ervas e flores, chamando vida nova mesmo em terra estéril. A sua figura é tomada como sinal de que a floresta cresce em direcção ao seu futuro.

Ambas as condições são acessíveis. Um processo de criação mais fundo — escolher, rever, recusar — mexe na primeira; melhores modelos e um enquadramento de instruções desenhado com mais cuidado mexem na segunda. É para aí que isto segue.

Portanto o resultado do protótipo não é um veredicto sobre a pergunta. É a pergunta tornada mensurável: duas variáveis que agora podem ser movidas de propósito e observadas.

Construído sobre a descompilação pret/pokeemerald como investigação pessoal. Nenhuma ROM, alteração de ROM ou recurso do jogo é distribuído, e todos os sprites aqui apresentados são arte original gerada por IA. Pokémon é uma marca registada da Nintendo, da Creatures Inc. e da GAME FREAK Inc.; este projecto não tem qualquer ligação a essas empresas nem o seu aval.