Un moteur, pas un émulateur.
OpenPlatinum réécrit le moteur de terrain de Pokémon Platine (DS) en C++17 natif : le moteur lit lui-même le système de fichiers de la cartouche et les formats Nitro (cartes, modèles 3D, collisions, scripts d'événements, banques de texte chiffrées), puis exécute les scripts du jeu sur sa propre VM.
La décompilation pret/pokeplatinum sert de référence comportementale : chaque fonction du moteur pointe vers la fonction d'origine qu'elle reflète. Plus rapide qu'un émulateur, plus moddable qu'une ROM : une base propre pour les fan-projects de demain.
La chaîne, de la ROM au pixel.
Quatre étapes, aucune magie : chaque couche est un composant réel du dépôt, et chaque sortie vient des données de ta cartouche.
Le système de fichiers de la cartouche.
Le moteur ouvre le .nds comme le ferait la console : en-tête, table d'allocation FAT, table de noms FNT, puis les archives NARC (conteneur BTAF/BTNF/GMIF de Nintendo). Chaque sous-fichier est adressé par index, en mémoire, sans extraction.
├── header.bin · signature CPUF/CPUE ├── FAT / FNT · tables de fichiers └── data/ ├── pl_msg.narc · 361+ banques de texte ├── field/… · scripts d'événements ├── pl_bag_gra.narc · écran Sac (BTAF/GMIF) ├── pl_pokegra.narc · sprites, déchiffré ├── fldtanime.narc · boucles eau/fleurs └── sound_data.sdat · SSEQ / SBNK / SWAR
Chaque format Nitro a son parseur.
Les données brutes deviennent des structures utilisables : modèles, textures, hauteurs de collision, police bitmap, texte chiffré, partitions audio. Chaque parseur est écrit contre la spécification du format, vérifiée sur la décompilation pokeplatinum.
12+ formats couverts de bout en bout · zéro asset extrait : tout est lu à la volée.
Modèles 3D du terrain : meshes, matériaux, joints
Textures compressées et palettes, formats 0-7
Hauteurs de collision et comportements par tuile
La police bitmap de la DS, glyphe par glyphe
Banques de texte chiffrées, charmap Gen 4
Séquences SSEQ, instruments SBNK, samples SWAR
Une VM qui parle la langue des scripts.
Les événements de Platine sont du bytecode : chaque map embarque ses scripts, et le moteur les exécute opcode par opcode : dialogues, menus, mouvements, warps, captures. Le même script tourne ici comme sur DS, parce que la sémantique est reproduite à la fonction près.
case 0x0040: case 0x0041: case 0x0044: case 0x0045: { // Init[Local|Global]TextMenu · DS field_menu.c menu_items.clear(); menu_dest = (int)_arg[4]; // var de sélection menu_cancel = (int)_arg[3]; // slot annuler menu_bank = (op == 0x0040 || op == 0x0044) ? 361 : -1; // TEXT_BANK_MENU_ENTRIES } break; case 0x0042: // AddMenuEntryImm text,slot menu_items.push_back({(int)_arg[1], (int)_arg[0]}); break; case 0x0043: case 0x0047: // ShowMenu / ShowListMenu _st = MENU; break;
Le résultat : Sinnoh, en natif.
Tout converge vers la sortie : le terrain NSBMD passe par le renderer OpenGL 3.3 (éclairage GX, caméra DS, edge marking), l'interface se dessine avec la vraie police NFGR, et le séquenceur SDAT rejoue musiques, effets et cris depuis les banques SBNK/SWAR. Ce que tu vois et entends est produit par ta ROM, pas par des assets recréés.
Le jeu en images.
Chaque carte, PNJ, dialogue et cinématique ci-dessous est produit par les données de la ROM, chargées à l'exécution. Rien n'a été placé à la main.
Avancement
Le moteur tourne de bout en bout : monde, scripts, combats sur le vrai layout deux écrans, stockage PC, et l'audio du jeu en natif.
- Système de fichiers NDS / NARCFAT/FNT, BTAF/BTNF/GMIF, membres cachés
- Matrice de maps + streamingOverworld continu, cellules chargées autour du joueur
- Modèles NSBMD / textures TEX0Terrain, bâtiments, props, sets de textures par zone
- Collisions & comportements tuilesHauteurs BDHC, bits d'attributs, rebords
- Déplacement joueurMachine à pas DS : turn, walk, run, bump, jump
- Warps & transitionsPortes, tapis, escaliers ; facing à l'arrivée ; warps 0x100
- VM de scripts d'événements~475 commandes : chemin de l'histoire couvert, systèmes optionnels comptés
- Objets / PNJPlacement, flags de visibilité, scripts de mouvement
- Événements coord / BGTriggers, panneaux, objets cachés
- Texte du jeu (FR/US)Déchiffrement pl_msg, charmap Gen 4
- Animations BCAPortes, valise, balls rebondissantes (NSBCA)
- Scène de sélection du starterModèles ev_pokeselect réels, caméra DS
- Sprites Pokémonpl_pokegra déchiffré, 2 frames 80×80 ping-pong
- Blackout / respawnDernier Centre Pokémon mémorisé, soin au réveil
- Options en jeuLignes DS + graphismes natifs, options.cfg
- Capture PokémonFormule Gen 4 : balles, modifieurs, secousses, taux par espèce
- Boucles de textures (fldtanime)Eau/fleurs animées BTX0 par zone
- SauvegardeSave v8 : map, position, équipe, boîtes PC éparses, flags, respawn
- Audio (SDAT)Séquenceur SSEQ + banques SBNK/SWAR : musiques, effets, cris
- Stockage PCScript commun, menus DS, appli ; boîtes éparses, capture vers boîte
- Rencontres sauvagesTables et taux réels, capture fonctionnelle
- CombatsLayout deux écrans DS, sprites dresseur, boutons ROM, XP, capture vers boîte ; doubles à venir
- Menu X / Sac / ÉquipeVrais écrans DS (sac pl_bag_gra, équipe pl_plist_gra), polish en cours
- Pokédex, objets clés·
Dernières nouvelles.
Trois étapes vers Bonaugure.
Dépose ton propre dump .nds de Pokémon Platine
(FR ou US) dans le dossier rom/.
Lance OpenPlatinum.exe : la ROM est lue au
démarrage, rien ne quitte ta machine.
Contrôles
Open source · MIT
Le code complet est sur GitHub : moteur C++17, SDL3, OpenGL 3.3, build Meson/Ninja pour Windows x64. Étoiles, issues et contributions bienvenues.
OpenPlatinum ne distribue aucune donnée Nintendo :
le moteur lit votre propre dump .nds de Pokémon Platine
(FR ou US), déposé à côté de l'exécutable.
FAQ
C'est légal ?
Quelle ROM faut-il ?
C'est fini ?
Sur quoi ça tourne ?
Le jeu envoie-t-il des données ?
Comment aider ?
Pokémon Prism FR
Le patch français de Pokémon Prism : patcher en ligne, réparateur de sauvegarde, livreur dans les Centres Pokémon.