[NDS] Développement d'un outil de ROM Hacking HG/SS

Pages: [1] 2 3

Ribesg

  • Membre
  • 39 posts
17 juillet 2015, 12:50
EDIT: Les sources et des releases sont disponibles sur Github : https://github.com/Ribesg/PkmnEditor
                                                 
Hi

Voici mon premier post sur ce forum, si vous voulez savoir qui je suis cliquez ici, sinon ne cliquez pas ici.

J'ai récemment cherché à créer un petit hack de HG pour changer les starters, modifier tous les pokémons avec évolutions complexes pour retirer le besoin d'échanger (ou plutôt le rendre optionnel), modifier un peu la répartition des pokémons sauvages et modifier les dresseurs pour augmenter la difficulté.
J'ai trouvé un certain nombre d'outils, tous plus mauvais les uns que les autres (Mention spéciale pour PPRE qui en est à sa troisième réécriture sans jamais atteindre un niveau utilisable).

J'ai donc commencé à développer mon propre outil. Comme vous le savez surement si vous avez cliqué sur le bon lien plus haut, je n'ai aucun problème au niveau programmation. Mon problème est plutôt au niveau des informations. Pour l'instant mon objectif est de faire un petit logiciel graphique pour changer les starters, la seule chose que je comprends dans son intégralité : extraire le arm9.bin de la ROM, modifier les 3 valeurs au bon endroit, recompresser le arm9.bin et reconstruire la ROM. J'en suis à l'implémentation des algorithmes de compression/décompression (LZSS, ONZ ou "LZSS 0x11"), le reste devrait suivre.
J'ai déjà trouvé quelque références, mais je voulais savoir si vous aviez quelque tuyaux :)

Le projet sera très probablement libre comme beaucoup de mes projets, mais j'attends déjà d'avoir quelque chose qui fonctionne avant.

Toute aide serait la bienvenue, merci :)

PS: Attention je ne demande pas ici comment réaliser ces opérations avec tel ou tel outil (j'ai déjà partiellement réussi), mais plutôt comment ces outils réalisent ces opérations. Code source, documentations techniques, offsets connus, tout cela m'intéresse.
« Modifié: 25 juillet 2015, 16:37 par Ribesg »

yago58

  • Invité
17 juillet 2015, 14:05
Le log existe déjà, dsl.

En revanche, si tu étais capable de décrypter les moves tutors, ça, ça serait un vrai plus.
« Modifié: 17 juillet 2015, 14:06 par Yago »

Ribesg

  • Membre
  • 39 posts
17 juillet 2015, 14:45
Quel "log" ?

yago58

  • Invité
17 juillet 2015, 14:46
Editeur de starter.

Ribesg

  • Membre
  • 39 posts
17 juillet 2015, 14:55
Il s'agit là de mon premier objectif, de la première étape. Je développe de façon incrémentale. Les autres fonctionnalités viendront ensuite, quand j'aurai compris comment est organisée la ROM à ce niveau là, et ce qui doit être fait. J'ai parlé de la modification de starters car c'est pour l'instant la seule chose que je comprends intégralement.

J'ai déjà trouvé des outils basiques qui ne font qu'une seule action (comme changer les starters) et d'autres qui font beaucoup de choses. PPRE ne fait que crash aléatoirement, il est extrêmement instable. Quand à Spiky's DS Map Editor, les ROM produites sont corrompues, sauf si on utilise une version de développement (et encore, là, certaines choses ne fonctionnent tout simplement pas, de façon aléatoire).

Utiliser plusieurs petits outils à la suite peut poser des problèmes, les bugs de chacun d'eux s'accumulant. Par exemple il est déconseillé d'utiliser un outil sur une ROM avant de la "passer dans" PPRE car il pourrait mal le prendre.

Donc en pratique je n'ai pour l'instant besoin de rien (à part plus d'infos sur la compression LZSS made in Nintendo, même si j'ai l'impression d'avoir un truc qui pourra marcher) jusqu'à ce que la partie starters soit finie, ensuite je suis dans le brouillard. C'est pour ça que je demande où trouver plus d'infos ici, en avance de phase.
« Modifié: 17 juillet 2015, 15:02 par Ribesg »

yago58

  • Invité
17 juillet 2015, 15:02
Le meilleur moyen d'éviter les bugs sur ppre c'est d'extraire les narc et de les ré-insérer dans une rom clean :)
J'ai de la pratique à ce niveau.

Pour les infos, y a pas grand chose, pokécommunity et project pokémon sont les plus "fournis"

Ribesg

  • Membre
  • 39 posts
17 juillet 2015, 15:09
Justement, c'est ce genre de choses que je veux éviter. J'ai bien vu sur ton tutoriel d'utilisation de PPRE, tu décris un paquet de workaround nécessaires à l'utilisation du logiciel. Il faut renommer la ROM car le logiciel ne sait pas lire l'Unicode, il faut supprimer un dossier temporaire que le logiciel "oublie" et semble incapable de relire correctement, la taille finale de la ROM qui n'est pas bonne (Donc la compression et la décompression de la ROM ne sont pas miroir), et le besoin d'extraire et de réintégrer les narc avec un autre logiciel pour que ça puisse fonctionner un peu mieux.

Je pense qu'il est préférable de pouvoir se concentrer sur le hack en lui-même plutôt que de se battre avec des outils faits avec les pieds !

Mickey`

  • Membre
  • 2746 posts
17 juillet 2015, 15:14
L'extraction et la réinsertion des narcs ne buguent pas que je sache, si ? Je me trompe peut-être, mais si ça ne pose pas de problème, il sera plus simple de travailler directement sur les narcs décompressés.

yago58

  • Invité
17 juillet 2015, 15:20
nop ça bug pas, à partir du moment où tu remets les narc au bon endroit.
Néanmoins je reconnais que logiciel multi-fonction "peut être" utile, d'ailleurs il me semble qu'il existe un autre log  dans le même style que ppre (plus stable d'ailleurs)
Le soucis c'est qu'il travaille directement sur la rom, hors pour certaines manips il faut quand même sortir le narc.

Je dis ça, mais aujourd'hui hgss, c'est le cadet de mes soucis.

Mickey`

  • Membre
  • 2746 posts
17 juillet 2015, 15:22
Ouais mais je préfère extraire et manipuler sans bug perso...

yago58

  • Invité
17 juillet 2015, 15:29
C'est que ce que je fait aussi. comme ça je localise les bugs/gaffes/oublis plus facilement.

Ribesg

  • Membre
  • 39 posts
17 juillet 2015, 15:39
De ce que j'ai compris, les ROM contiennent certains fichiers spéciaux "en dur", comme le arm9 et le arm7, puis il y a un véritable système de fichier (avec une table FAT et tout). C'est à l'intérieur de ce système que se trouvent les fichiers .narc. Leur extraction est donc extrêmement simple, il suffit de le copier dans un fichier sur le système de fichiers de l'OS. Pour la réinsertion, ça n'est pas compliqué non plus, mais cela nécessite (s'il sa taille a changé après edition, et uniquement dans ce cas) de mettre à jour la table FAT pour le fichier narc et pour tous les suivants dans la table, rien de compliqué.

Ce qui est compliqué, c'est la décompression et la recompression des fichiers arm9 et arm7 s'ils sont compressés, mais aussi des fichiers de la ROM comme les fichiers narc qui peuvent aussi être compressés. Le problème vient du fait que Nintendo utilise des versions modifiées d'algorithmes connus, algorithmes qui ne sont donc documentés nulle part...

hremeraude

  • Membre
  • 11384 posts
18 juillet 2015, 13:44
http://projectpokemon.org/rawdb/heartgold/

Ici tu trouveras les localisations de tous les fichiers de HG, sinon tu peux toujours demander à SCV comment il a procéder.

Ribesg

  • Membre
  • 39 posts
18 juillet 2015, 14:43
Tiens j'étais tombé là dessus mais je ne le retrouvais plus, merci :)

Je viens de réussir à décompresser le arm9.bin avec succès. Il semble qu'il n'y ait même pas besoin de le recompresser pour le remettre dans la ROM après modification, puisque les ROM supportent les arm9.bin non compressés.
Il doit juste y avoir quelque pointeurs à éditer étant donné que la taille est différente.

yago58

  • Invité
18 juillet 2015, 14:47
Il est pas complet celui là, hremeraude.

http://www.projectpokemon.org/wiki/HGSS_File_System, celui la, oui.
« Modifié: 18 juillet 2015, 15:07 par Yago »

hremeraude

  • Membre
  • 11384 posts
18 juillet 2015, 15:05
There is currently no text in this page. You can search for this page title in other pages, or search the related logs, but you do not have permission to create this page.

yago58

  • Invité
18 juillet 2015, 15:08
Bleh bleh bleh, corrigé, na.

Ribesg

  • Membre
  • 39 posts
18 juillet 2015, 18:41
J'ai un problème qui fait que les émulateurs et ma 3DS refusent ma rom. J'ai observé que plusieurs outils se contentent de décompresser les fichiers comme arm9.bin, ils ne les recompressent pas, vu que une ROM peut très bien contenir un arm9 non compressé.

Mais quand je remets mon arm9.bin décompressé dans la ROM, même en éditant les pointeurs qui vont bien et le CRC du header, ça plante :(

Ribesg

  • Membre
  • 39 posts
22 juillet 2015, 14:58
J'en suis toujours au même point. Le code source complet est disponible ici https://github.com/Ribesg/PkmnEditor

En debuggant avec No$GBA, j'ai pu voir pourquoi j'avais un écran blanc (sur émulateur ou hw) : à un moment, l'exécution jump en PLEIN MILIEU d'une zone de données (et non de code) et essaye d'exécuter ces données, faisant absolument n'importe quoi. L'instruction qui explose est SWI #123456 (0x563412EF), qui n'a effectivement pas de sens.

Je suis en train de chercher de l'aide au sein de la communauté anglophone, surtout sur IRC. Mais ça s'annonce compliqué.

Tout ça pour changer trois malheureux entiers (12 petits octets) dans un fichiers de plus d'1Mo.
« Modifié: 22 juillet 2015, 15:00 par Ribesg »

hremeraude

  • Membre
  • 11384 posts
22 juillet 2015, 16:15
le mieux est de demander aux mecs ayant faits des logs sur HGSS sur PPORG, ce sera le meilleur endroit où trouver de l'aide je suppose

Ribesg

  • Membre
  • 39 posts
23 juillet 2015, 09:20
Hey !

Donc avec l'aide de quelque anglophone, j'ai pu finir de tuer les derniers bugs. Il m'en reste un vraisemblablement, mais il n'empêche pas la rom de fonctionner parfaitement : le arm9 que je décompresse n'a pas tout à fait la même taille que ce qu'obtient un autre développeur de son côté quand il essayait de m'aider. Après avoir cherché pourquoi pendant des heures, j'ai quand même essayé la rom, et elle marche !

Donc ma Proof of Concept, ici présente https://github.com/Ribesg/PkmnEditor, fonctionne. Ce n'est pas un encore un logiciel, juste une PoC, donc pour l'instant c'est un peu compliqué à exécuter pour les non-développeurs et ça remplace les starters par des valeurs hardcodées (Goinfrex, Riolu et Keunotor). Mais ça fonctionne et il n'y a plus qu'à réorganiser tout ça pour que ça donne un truc bien.

Prochaine étape, le texte !

Unifag

  • Membre
  • 883 posts
23 juillet 2015, 10:48
Ça à l'air prometteur si tu arrive à faire quelque chose de propre. Une question : tu compte développer uniquement pour windows ou tes logs seront multiplateforme?
Et j'ai vu que tu compte éventuellement rajouter le support pour SS mais ne te presse pas pour ça, de mon point de vue c'est pas très utile et surtout ça risque plus de compliqué la tache pour les débutants ne savant pas quelle version choisir. En effet depuis les versions gba on constate que l'une des versions prend toujours le dessus sur l'autre (rf > vf, rubis > saphir, etc) d'un points de vue recherche (souvent par flemme de chercher les offsets pour la version miroir), et ce n'est pas gênant, ça simplifie même l'entraide car les offsets des uns colle avec les offsets des autres.

Ribesg

  • Membre
  • 39 posts
23 juillet 2015, 11:06
Je pense faire un système de configuration définissant les offsets. Par exemple on aurait un fichier pour HG FRA, SS FRA, HG USA, SS USA, et ainsi de suite. La rom serait reconnu selon son header et le bon fichier de configuration serait utilisé.
Ainsi, vu que le projet est Open Source, tout le monde pourra trouver les offsets de sa ROM et les ajouter. Après, je ne sais pas si ce sera forcément nécessaire, à voir si des offsets diffèrent vraiment. Par exemple je ne prévois pas de faire d'éditeur de map etc (après c'est Open Source, donc ça peut se faire même si je le fais pas). Je ne sais pas ce qui nécessite de connaitre offsets, vu que pour l'instant je n'ai que modifié les starters... qui nécessite des offsets (en fait, un seul), mais bon. Un fichier par version pour stocker un seul petit entier, bof.

Au départ je voulais faire un outil en pur Java, donc multi-plateforme, malheureusement certaines des tâches sont trop complexes pour que je les réimplémente, comme l'unpack de la ROM ou (surtout en fait) le repack de la ROM, qui sont fait avec ndstool.

Je prévois de wrap ndstool dans le jar du logiciel, et de l'extraire dans un dossier temporaire avant de l'utiliser. Donc s'il est possible d'avoir des version de ndstool pour Linux (et Mac pourquoi pas), je peux les ajouter et les utiliser. C'est la seule chose qui empêche le tout d'être multi-plateforme.

Ah et sinon pour la modification de starter, là mon prochain objectif c'est de pouvoir modifier les textes en général et aussi en particulier au changement de starter : ça dit toujours "Voulez-vous choisir Germignon, le Pokémon Plante ?" par exemple. Donc ça ce sera assez facile d'après ce que j'ai vu, la difficulté ça va être pour le cri. Quand on fait tourner les pokéball pour choisir le starter, on entend le cri du pokémon. Sauf que c'est les cri des starters d'origine, donc il doit y avoir un autre offset où sont stockés les références des cris. Il faut que je trouve ça. Ca ferait déjà 2 offsets pour ces fichiers de config.

EDIT : Je souhaite de toutes façons faire un outil propre, "pour noob", donc d'un point de vue utilisateur, HG et SS ça doit être pareil. Certes le support de SS complexifie le truc, mais trouver les offsets dans d'autres ROMs quand tu les as dans une, c'est assez facile en général. Par exemple là, j'ai l'offset des starters dans HG. Je regarde ce qu'il y a comme valeurs à cet offset et après, puis je cherche ces valeurs dans mon ROM SS, et paf j'ai ma offset SS. Comparé à trouver un offset "from scratch", c'est extrêmement simple.
« Modifié: 23 juillet 2015, 11:11 par Ribesg »

Mickey`

  • Membre
  • 2746 posts
23 juillet 2015, 13:02
Bien, c'est cool tout ça ! Tu développes en quoi du coup ?

Après, concernant ton problème de version, pourquoi tu crées pas tout simplement un seul fichier ini ou tu mets tous tes offsets nécessaires dedans ?

hremeraude

  • Membre
  • 11384 posts
23 juillet 2015, 14:19
Les textes après ils sont localisés dans les narc du jeu, mais si ton truc permet de les éditer directement, ça peut être pas mal du tout, ou alors tu parles de modifier uniquement le texte du starter et ce de manière automatique?

Ribesg

  • Membre
  • 39 posts
23 juillet 2015, 14:24
Bien, c'est cool tout ça ! Tu développes en quoi du coup ?
En Java.

Après, concernant ton problème de version, pourquoi tu crées pas tout simplement un seul fichier ini ou tu mets tous tes offsets nécessaires dedans ?
Parce que c'est plus compliqué à gérer. Imagine plutôt pouvoir faire quelque chose comme
new Offsets(rom.headerString())Où la méthode headerString() renverrai l'identifiant de la ROM qu'on constituerait du nom ("POKEMON HG" dans ma ROM) et du code ("IPKF" dans ma ROM). Il faudra peut-être ajouter la version de la ROM, je ne sais pas encore. Ensuite tout le reste du code du logiciel est identique, et on utilise cet objet Offsets un peu partout. Bien sûr, cet objet Offsets pourrait alors chercher le bon endroit dans l'unique fichier, mais c'est beaucoup plus simple d'avoir directement un fichier genre "POKEMON HG IPKF.properties" qui match le header. Chacun de ces fichiers sera aussi plus facile à maintenir qu'un seul fichier contenant tous les offsets de 10 roms.

Les textes après ils sont localisés dans les narc du jeu, mais si ton truc permet de les éditer directement, ça peut être pas mal du tout, ou alors tu parles de modifier uniquement le texte du starter et ce de manière automatique?
Je parle de faire les deux :) Que tu puisses éditer les textes si tu le veux, et que ça change le texte des starters si tu changes les starters.
Il faut aussi que je vois comment faire pour traiter les fichiers compressés, car pour l'instant je ne peux que décompresser un arm9 compressé. Les autres fichiers utilisent d'autres algorithmes, donc à voir. Je sais qu'il y a beaucoup d'implémentation disponibles sur le net pour ces algorithmes là (l'algo de l'arm9 étant le plus exotique).
« Modifié: 23 juillet 2015, 14:28 par Ribesg »

Unifag

  • Membre
  • 883 posts
23 juillet 2015, 19:11
Pour extraire les fichiers de la roms NDS (et donc ne plus dépendre de NDSTool) tu peut peut-être t'inspirer des sources de TINKE. Et pour la decompression de l'arm9 je suis tombé la dessus :https://github.com/magical/nlzss mais je ne sais pas ce que ça vaut mais ça te permet de comparer avec ce que tu à fait.

Ribesg

  • Membre
  • 39 posts
23 juillet 2015, 20:11
Je ne suis pas sûr de vouloir remplacer ndstool pour le moment, il fait beaucoup de choses que j'aurais a gérer moi-même si je le faisais. Après je crois que toutes les sources intéressantes sont ici à peu près https://github.com/pleonex/tinke/tree/master/Tinke/Nitro je verrai si je m'en sers un jour.

Quand à la décompression de l'arm9, mon algo fonctionne bien et m'a déjà été fourni par un anglophone qui l'avait implémenté il y a longtemps. Sur ton lien on n'a que les algos communs, LZ "0x10" et LZ "0x11", l'arm9 est compressé avec un autre algo, plus exotique, que certains appellent BLZ (Bottom LZ) car c'est un LZ un peu spécial et inversé.

J'ai commencé à réorganiser le code en vu du travail à faire ensuite. Donc pour ndstool il me faudra surement des versions linux et mac ( https://github.com/devkitPro/ndstool/issues/1 ) mais j'en suis pas encore là de toutes façons.

Ribesg

  • Membre
  • 39 posts
25 juillet 2015, 16:24
Hey !

Voici la toute première release ! https://github.com/Ribesg/PkmnEditor/releases/tag/v0.0.1
Il doit y avoir des bugs, je ne l'ai pas beaucoup testée, seulement avec la version HG française.

Maintenant le prochain objectif c'est d'éditer les textes donc. Et éventuellement corriger quelque bugs.

« Modifié: 25 juillet 2015, 16:31 par Ribesg »

hremeraude

  • Membre
  • 11384 posts
25 juillet 2015, 16:59
Bien, mais du coup là c'est juste un starter editor pour le moment ?

Pages: [1] 2 3    En haut ↑