Mon Pokémon unique au monde

Aperçu

En pleine partie, dans une fenêtre à l'intérieur du jeu lui-même, le joueur tape quelques mots. Le jeu toujours en marche, une IA les transforme en une espèce de Pokémon entièrement nouvelle — illustration, nom, type, statistiques de base et capacités — et l'enregistre comme une espèce à part entière. On la rencontre dans les hautes herbes, on la capture, on lui donne un surnom, on l'élève comme n'importe quelle autre.

Rien n'est écrit à l'avance. L'espèce qui finit dans la sauvegarde n'a jamais existé auparavant et n'existe nulle part ailleurs.

Une part de ce que les jeux ont toujours offert, c'est de fabriquer quelque chose qui soit à soi. En pratique, cela a voulu dire choisir dans un ensemble fixe. Ce projet existe pour éprouver si l'IA générative rend à soi littéralement vrai — et, surtout, si quelque chose de littéralement à soi est quelque chose auquel un joueur s'attache réellement.

Déroulé

Tout commence en parlant à une vieille dame dans le Bois de Clémenti-Ville. On décrit la créature qu'on a en tête ; ces mots sont transformés en espèce pendant qu'on continue de jouer ; et quelques minutes plus tard elle attend dans les hautes herbes — à rencontrer, à capturer, et à utiliser ensuite exactement comme n'importe quoi d'autre dans le jeu. Tout est fabriqué sur place : le nom, le type, les statistiques de base, la liste des capacités, les deux sprites de combat et l'icône d'équipe.

Un couple de personnes âgées dans le Bois de Clémenti-Ville. Une boîte de dialogue affiche : Dis-moi… quelle sorte de créature imagines-tu ?
Parler à la vieille dame déclenche tout.
L'écran de saisie du dialogue simplifié, intitulé « Imagine la créature : », avec les mots BEAUTIFUL, ATTACK et FIRE saisis.
On lui donne six mots par le système de dialogue simplifié d'Émeraude.
Le joueur se tient dans le bois près des hautes herbes. Une boîte de dialogue affiche : Les hautes herbes bougent… Il y a quelque chose là-dedans !
La génération tourne quelques minutes sur le PC. Un cri annonce qu'elle est prête.
Écran de combat. Un lézard rouge portant une flamme sur la tête fait face au joueur. Le texte affiche : Un FLAMEREL sauvage apparaît !
FLAMEREL, un lézard de type feu, apparaît dans les herbes qui bougeaient.
Une Poké Ball est lancée sur FLAMEREL pendant le combat.
Il se capture avec une Poké Ball, comme n'importe quelle autre espèce.
L'écran demandant un surnom pour FLAMEREL, avec GGG saisi.
Il peut recevoir un surnom, comme n'importe quelle autre espèce.
L'écran d'équipe montrant l'espèce générée aux côtés de trois Pokémon ordinaires, avec sa propre icône.
Il prend place dans l'équipe avec sa propre icône, comme n'importe quelle autre espèce.
L'écran d'information de FLAMEREL : type feu, talent Brasier, nature malpoli, rencontré au niveau 7 dans le Bois de Clémenti-Ville.
Son écran de résumé fonctionne, comme celui de n'importe quelle autre espèce.

Une partie complète, de bout en bout, est enregistrée ici : My Own Pokémon Generation — demo02.

Pourquoi ceci, et non un générateur de créatures

Le problème intéressant n'est pas de savoir si une IA peut inventer un Pokémon. C'est de savoir si elle peut en inventer un que le jeu puisse absorber sans se défaire. Livré à lui-même, un générateur produit soit quelque chose d'inutilisable — un monstre à 900 points de statistiques qui rend le jeu trivial — soit quelque chose de déplaisant : un sprite difforme qui cesse de se lire comme une créature.

Le travail de design, ici, n'est donc pas la créature. C'est l'espace à l'intérieur duquel elle est générée : les fourchettes de statistiques, les règles de légalité des capacités, les silhouettes qui survivent à un sprite de 64×64, le vocabulaire avec lequel le joueur a seulement le droit de décrire. Le modèle explore cet espace. Il n'a pas à le définir.

Ce projet est l'endroit où ma philosophie de design cesse d'être un argument et se voit mise à l'épreuve : définir les objectifs, les valeurs, les contraintes et les limites qui donnent forme à un espace de conception, laisser la génération s'y produire, et découvrir si le résultat tient.

Le cadre est la recherche

Le LLM n'écrit jamais librement. Il remplit des cases d'un schéma fixe, et chaque sortie est revérifiée par un validateur. Les infractions repartent en régénération accompagnées de la règle précise qui a été enfreinte.

Les contraintes d'équilibre gardent le jeu jouable. Le total des statistiques de base est maintenu dans une fourchette fixe — de 280 à 360, à peu près le niveau d'un starter — avec des plages par statistique, et toute spécification hors fourchette est rejetée d'emblée. Les capacités sont extraites automatiquement du code de pokeemerald, puis filtrées au type propre de l'espèce ou à Normal, en retirant les capacités de K.O. immédiat, les effets d'autodestruction et les dégâts fixes ou démesurés. L'ensemble obtenu est vérifié quant à sa solidité : assez de capacités offensives, au moins une attaque du même type, au plus une capacité de forte puissance. L'attribution des niveaux est faite de façon déterministe par le cadre, non par le modèle. Tout le reste est figé — un talent par type, taux de capture, courbe d'expérience, ratio de genres, compatibilité CT — de sorte que la variation individuelle reste confinée aux cases du schéma et que les exécutions restent comparables.

Les contraintes d'apparence empêchent la sortie de se déliter. Les plans corporels proviennent d'une liste blanche de silhouettes qui survivent à un sprite de 64×64 : quadrupède, rongeur, oiseau, lézard. La couleur est choisie dans une liste blanche nommée, et la couleur corporelle du Pokédex en est dérivée mécaniquement. Les traits sont limités à une à trois formules courtes préétablies, avec une liste de blocage qui rejette les traits humains, le sang, les armes et le texte. Le cadre compose lui-même l'instruction finale et y ajoute un épilogue fixe : une seule créature, corps entier, anatomie cohérente, pas de membres en trop, expression calme.

Cela fonctionne, et on peut le voir fonctionner. Lors d'une exécution enregistrée, le modèle a proposé un total de statistiques de base de 380 ; le validateur l'a repoussé trois fois — 380, 360, 340 — jusqu'à ce que la spécification atterrisse dans la fourchette, à 320.

Comment cela tourne

Le jeu lui-même ne génère rien. Le travail est fait par un processus Python résident sur le PC, et les deux moitiés se parlent par une boîte aux lettres de fichiers qu'un script Lua dans mGBA consulte à chaque image.

  1. Texte. Un modèle local (qwen3:8b) transforme les mots en une fiche d'espèce validée.
  2. Image. Un modèle d'image dessine une illustration de référence, puis trois vues cohérentes entre elles : le sprite de combat de face, celui de dos et l'icône d'équipe.
  3. Conversion. Le dessin est quantifié sur une palette commune de 15 couleurs et converti au format de sprites de pokeemerald.
  4. Encodage. Les sprites deviennent des binaires GBA : tuiles 4bpp et 1bpp, palettes gbapal, compression LZ77 compatible BIOS.
  5. Injection. Les binaires sont écrits dans une zone réservée de la ROM.

Écrire dans la cartouche à l'exécution signifie que l'instance en cours récupère la nouvelle espèce sans redémarrage, et que la même séquence d'octets part sur le disque, de sorte que le changement survit à un rechargement.

Ce qui apparaît est durable et irréversible. Il rôde : qu'on fuie ou qu'on perde, il reste dans le monde. Qu'on le mette K.O., et il est perdu pour de bon.

Implémentation

Le générateur, le cadre de contraintes, les encodeurs GBA et le correctif côté jeu sont publiés intégralement : github.com/takafumihoriuchi/my-own-pokemon-generation.

Post-scriptum — sur l'attachement

Le prototype tranche une question technique. Derrière elle se tient celle qui m'importe vraiment : un Pokémon généré pour vous, qui n'existe nulle part ailleurs, finit-il par compter davantage qu'un autre livré avec le jeu ?

D'avoir joué à ma propre version — un échantillon d'un seul, et il ne faut pas y lire davantage — deux conditions semblent gouverner la réponse.

Un cas venu de l'extérieur du jeu parle des deux. En travaillant à la main avec ChatGPT, en faisant des allers-retours jusqu'à être satisfait, j'ai conçu une espèce à moi — Hanagitsune. J'y suis attaché. Je l'avais fabriquée plutôt que commandée, et ce qui en est sorti passait la barre de la qualité.

Hanagitsune, de face : un renard vert pâle dont la queue est une cascade de lianes en fleurs. Hanagitsune, de dos, montrant toute la longueur de la queue fleurie.
Hanagitsune — gardien de la forêt, à la queue en fleurs. Là où il a couru, herbes et fleurs jaillissent, appelant la vie jusque dans les terres stériles. Sa silhouette est prise pour le signe d'une forêt qui grandit vers son avenir.

Les deux conditions sont à portée. Un processus de fabrication plus profond — choisir, reprendre, écarter — déplace la première ; de meilleurs modèles et un cadre d'instructions conçu avec plus de soin déplacent la seconde. C'est là que cela continue.

Le résultat du prototype n'est donc pas un verdict sur la question. C'est la question rendue mesurable : deux variables que l'on peut désormais déplacer à dessein et observer.

Construit sur la décompilation pret/pokeemerald à titre de recherche personnelle. Aucune ROM, aucun correctif de ROM ni aucune ressource du jeu n'est distribué, et tous les sprites présentés ici sont des créations originales générées par IA. Pokémon est une marque de Nintendo, Creatures Inc. et GAME FREAK Inc. ; ce projet n'est ni affilié à ces sociétés ni approuvé par elles.