[GBA] Shonen Jump's One Piece : Tutoriel Romhacking

Le groupe de ceux qui n'ont pas de groupe. Vous vous êtes mis à plusieurs sur un projet et souhaitez en discuter ? Vous voulez montrer l'avancement de votre traduction ? Cette partie vous est dédiée !
Avatar de l’utilisateur
pinktagada
Mauvaise ROMhackeuse débutarte
Messages : 2276
Inscription : 10 mars 2010, 10:39
Localisation : Midgard
Contact :

[GBA] Shonen Jump's One Piece : Tutoriel Romhacking

Message non lu par pinktagada » 23 févr. 2018, 16:16

Bon, j'ai été faible. Un type est venu me demander de faire le hack d'un jeu GBA. Il est super chaud pour traduire et vu que c'est un jeu de plate-formes avec peu de texte, j'y ai dit d'accord. En fait, j'y ai dit d'accord quand le type qui avait fait la trad en espagnol m'a sorti qu'il avait tout fait à l'éditeur hexa et que c'était sa première trad. Du coup, je refais le hack propre, dans les règles du lard (et du cochon) histoire que ça soit pas fait à la méthode bourrin.

J'ai donc récupéré des outils sur la TRAF :
--> No$GBA version gratuite
--> WindHex32 comme éditeur hexa (j'ai pas trouvé de version Hexworkshop pas pourrie par des virus russes)
--> Monkey Moore (je préfère searchRX, mais il ne fonctionne pas sur mon Win10)
--> Notepad ++ pour tout ce qui est fichier txt

Étape 1 : Chercher les textes.

On lance l'émulateur pour voir ce qu'il y a comme texte. Tiens, voyons. On commence par les textes de menu, "Press START". Et on lance Monkey Moore. Cool, trouvé. (Ne pas oublier de noter les adresses dans un fichier de notes sur le projet) Et commencer à faire sa table. A=41, B=42,... sans oublier qu'on est en hexadécimal et qu'après 49 il n'a a pas 50 mais 4A. (Sinon, Monkey Moore peut créer automatiquement la table en .tbl)

Note : un fichier .tbl est un simple fichier texte avec l'extension renommée.

Image

On remarque que 20= espace et 27='

Bon, je ne vais rompre le suspense, la table est en ASCII. Alors c'est facile de la compléter ^^ Mais dans le principe, on va ajouter en déduisant les caractères qui correspondent aux "trous" qu'on a dans les valeurs hexadécimales.
:
Hex Caractère
--- ------
00 NUL (Null char.)
01 SOH (Start of Header)
02 STX (Start of Text)
03 ETX (End of Text)
04 EOT (End of Transmission)
05 ENQ (Enquiry)
06 ACK (Acknowledgment)
07 BEL (Bell)
08 BS (Backspace)
09 HT (Horizontal Tab)
0A LF (Line Feed)
0B VT (Vertical Tab)
0C FF (Form Feed)
0D CR (Carriage Return)
0E SO (Shift Out)
0F SI (Shift In)
10 DLE (Data Link Escape)
11 DC1 (XON)(Device Control 1)
12 DC2 (Device Control 2)
13 DC3 (XOFF)(Device Control 3)
14 DC4 (Device Control 4)
15 NAK (Negative Acknowledgement)
16 SYN (Synchronous Idle)
17 ETB (End of Trans. Block)
18 CAN (Cancel)
19 EM (End of Medium)
1A SUB (Substitute)
1B ESC (Escape)
1C FS (File Separator)
1D GS (Group Separator)
1E RS (Request to Send)(Record Separator)
1F US (Unit Separator)
20 SP (Space)
21 ! (exclamation mark)
22 " (double quote)
23 # (number sign)
24 $ (dollar sign)
25 % (percent)
26 & (ampersand)
27 ' (single quote)
28 ( (left opening parenthesis)
29 ) (right closing parenthesis)
2A * (asterisk)
2B + (plus)
2C , (comma)
2D - (minus or dash)
2E . (dot)
2F / (forward slash)
30 0
31 1
32 2
33 3
34 4
35 5
36 6
37 7
38 8
39 9
3A : (colon)
3B ; (semi-colon)
3C < (less than sign)
3D = (equal sign)
3E > (greater than sign)
3F ? (question mark)
40 @ (AT symbol)
41 A
42 B
43 C
44 D
45 E
46 F
47 G
48 H
49 I
4A J
4B K
4C L
4D M
4E N
4F O
50 P
51 Q
52 R
53 S
54 T
55 U
56 V
57 W
58 X
59 Y
5A Z
5B [ (left opening bracket)
5C \ (back slash)
5D ] (right closing bracket)
5E ^ (caret cirumflex)
5F _ (underscore)
60 `
61 a
62 b
63 c
64 d
65 e
66 f
67 g
68 h
69 i
6A j
6B k
6C l
6D m
6E n
6F o
70 p
71 q
72 r
73 s
74 t
75 u
76 v
77 w
78 x
79 y
7A z
7B { (left opening brace)
7C | (vertical bar)
7D } (right closing brace)
7E ~ (tilde)
7F DEL (delete)
De là, on va charger la table que MM a crée. Dans windHex : File >open table file > table 1 et on charge notre joli fichier tout neuf. Jai aussi cherché "Data" dans MM (histoire de caler les minuscules) et j'ai noté l'adresse dans mon fichier de notes. Et magie magie, je suis allée voir à l'adresse dans WindHex (Edit> go to offset > file position sans oublier de bien cocher valeur en hexa). On peut ranger (pour l'instant, on sait jamais) Monkey Moore.

Image

On va pouvoir compléter un poil la table avec des ponctuations grâce au texte qui s'affiche juste en dessous. On peut en déduire les valeurs pour un retour à la ligne et une fin de réplique (sur deux octets).

Image

Dans le bloc de texte "No Data" il y a quelque chose de super intéressant. Juste après, il y a une série de valeurs récurrentes. Quand on voit ça, en général c'est super bon signe et super cool. C'est ce qu'on appelle une table des pointeurs. Elle est bizarrement foutue, c'est la première fois que j'en vois une comme ça.

Image

On a donc en rouge 98 FC 56. On est sur GBA, les adresses se lisent de droite à gauche, )c'est du little endian. (note pour moi-même : retrouver la discussion IRC avec Meradrin à ce sujet et la mettre dans le tutorial). Si on inverse les trois valeurs, ça nous donne 56 FC 98. Et là, didoudidonc... Ça nous amène à une adresse tout pas loin. On se rend compte aussi que ces trois octets (avec le 08) reviennent une fois sur deux. Si on regarde ensuite, en vers clair, on a A8 FC 56. Comme tout le monde a suivi, voyons à l'adresse 56 FC A8 et là... Hoooo... le texte d'après ! Et pareil pour la valeur violette 56 FC B8 et ainsi de suite. Si on veut changer la longueur des mots, décaler le texte, c'est là qu'il faudra modifier. Mais ne ne pense pas que ce soit utile, on verra.

Ce qui est intéressant c'est la structure :

[Adresse de début du bloc]08[Adresse de début du pointeur 1]08[Adresse de début du bloc]08[Adresse de début du pointeur 2]08 et ainsi de suite. Chose intéressante aussi, c'est que la table est placée juste après le texte à traduire. Si on a d'autres tables à chercher, cette info peut être utile ;)

Étape suivante, jouer un peu pour chercher des dialogues, maintenant qu'on a une table et trouvé des adresses de textes secondaires.

Après avoir joué, je me suis rendue compte que question texte, y'avait pas grand chose (pour l'instant). Beaucoup de choses sont graphiques (surtout d'ailleurs). Et chose étrange, il y avait un "Saving..." que MM n'a pas trouvé, graphique lui aussi alors ? Ou pas de bol, c'est compressé ? Une chose est sûre, suite au prochain numéro.
MAIS Y A PLUS DE PLACE A L'ÉCRAN! NON DE MERDE MÊME SI JE TE DONNE TOUS LA PLACE DU MONDE DANS LA ROM!! TU POURRAIS PAS EN FAIRE AFFICHÉ PLUS A L'ÉCRAN!!!
Un grand philosophe...

Image

Avatar de l’utilisateur
RyleFury
Maître en Flood
Messages : 366
Inscription : 16 janv. 2012, 12:48
Contact :

Re: [GBA] Shonen Jump's One Piece : Tutoriel Romhacking

Message non lu par RyleFury » 23 févr. 2018, 18:40

C'est une table de pointeurs en 32 bits tout à fait classique en little endian, tu as toutes les infos ici sur la "GBA Memory Map" : ;)

http://problemkaputt.de/gbatek.htm

En particulier, voilà ce qui t'intéresse :

External Memory (Game Pak)
08000000-09FFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 0

Ex-Nihylo
Amateur Floodeur
Messages : 80
Inscription : 25 oct. 2016, 18:45

Re: [GBA] Shonen Jump's One Piece : Tutoriel Romhacking

Message non lu par Ex-Nihylo » 24 févr. 2018, 13:51

Tu devrais te méfier de ce genre de type chelou, Pinkette xD

Avatar de l’utilisateur
pinktagada
Mauvaise ROMhackeuse débutarte
Messages : 2276
Inscription : 10 mars 2010, 10:39
Localisation : Midgard
Contact :

Re: [GBA] Shonen Jump's One Piece : Tutoriel Romhacking

Message non lu par pinktagada » 24 févr. 2018, 15:21

Ex-Nihylo a écrit :
24 févr. 2018, 13:51
Tu devrais te méfier de ce genre de type chelou, Pinkette xD
En fait, il a déjà traduit quasi tous les textes... Je lui ai donné ce que l'espagnol m'a filé, deux heures après, c'était fait. Je n'aurais qu'à relire et corriger en même temps que j'adapterai le texte à ce que j'aurai extrait.
MAIS Y A PLUS DE PLACE A L'ÉCRAN! NON DE MERDE MÊME SI JE TE DONNE TOUS LA PLACE DU MONDE DANS LA ROM!! TU POURRAIS PAS EN FAIRE AFFICHÉ PLUS A L'ÉCRAN!!!
Un grand philosophe...

Image

Avatar de l’utilisateur
pinktagada
Mauvaise ROMhackeuse débutarte
Messages : 2276
Inscription : 10 mars 2010, 10:39
Localisation : Midgard
Contact :

Re: [GBA] Shonen Jump's One Piece : Tutoriel Romhacking

Message non lu par pinktagada » 26 févr. 2018, 19:03

Étape 2 : Extraire les textes (TL;DR je ne peux pas le faire moi)

Image

Comment fonctionne le jeu ? Alors nous avons vu hier qu'il y avait des tables de pointeurs juste après les textes. Prenons cet exemple à 3 pointeurs. Encadré en rouge, on a donc l'adresse dans la table qui indique au jeu où lire dans la ROM. Comme l'ont dit Ryle (et Baha sur IRC), le 08 dans l'adresse, c'est parce que c'est une adresse en RAM, du coup faut ajouter 0x08 00 00 00 à chaque adresse. Et on a donc une alternance texte/table/texte/table ect...

Pour ma part, je ne sais utiliser que les fonctions basiques du Hareng (Hareng tool, dispo dans les outils extractions sur le site de la TRAF) mais il ne pourra pas être utilisé sans coder de script, donc pas de mon niveau.

Comment marche le hareng ? C'est une ligne de commande en LUA qui doit être remplie comme suivant :
extraire"nom de la ROM", "table d'extraction", "Nom du texte de sortie", Adresse de début du texte, adresse de fin du texte, Adresse début table de pointeurs, Nombre de pointeurs, Nombre d'octets des pointeurs, "Formule de calculs pour les pointeurs", little_endian (mais ça peut être aussi big_endian)
Exemple pour un autre jeu :
extraire("0432 - Tactics Ogre - The Knight of Lodis (U).gba", "table_1.tbl", "Script2.txt", 0x784D6C, 0x7873B8, 0x784C9A, 104, 2, "X+$784C9A", little_endian
)

La formule c'est "adresse du début de la table" + "valeur du pointeur" dans ce cas. Mais dans le notre cas ce sera "0x08000000" + "adresse du pointeur" (je suis pas super sûre de ça par contre mais comme on peut pas utiliser le Hareng en l'état, on s'en fout)

Pour notre cas ça serait :
extraire("2157-Shonen-Jumps-One-Piece-UTrashman.gba", "EXTRACTION.tbl", "Texte 18.txt", 0x5710C4, 0x571138, 0x57113C, 3, 4, "X+0x08000000", little_endian
Pourquoi ça ne peut pas marcher :

Comme on peut le voir dans la capture d'écran, les pointeurs ne sont pas collés mais ont des données entre eux. Ça pourrait ne pas être un problème si la taille de ces données était fixe ou définie par une règle qu'on connait. Mais je n'ai pas trouvé. Hors, entre le pointeur 1 et le pointeur 2, on a 8 octets de données, entre le pointeur 2 et le pointeur 3 il y en a 12 et il y en a 12 aussi après le pointeur 3. Cette taille varie de 0 à 16.
Revenons à la formule du Hareng. Les pointeurs sont calculés automatiquement parce qu'on donne le début de la table, leur nombre et leur taille. Et quand un pointeur est fini, c'est le suivant. Mais dans notre cas, quand un pointeur est fini, on ne sait pas quand commence le suivant.

La solution serait de coder un programme maison qui permette de ne pas utiliser la table des pointeurs à l'extraction (et déplacer les textes à la fin de la ROM). Comment il fonctionnerait ? La balise de fin :0x5C00 permet de délimiter les répliques. Le programme devrait compter le nombre d'octets de la réplique. Dans le cas de notre exemple, c'est 51 octets (0x33 en hexadécimal). 0x5710C4+0x33 octets=0x5710F7, soit l'adresse de notre pointeur. En ajoutant 0x08000000 et en mettant les valeurs en little endian, on obtient la valeur du pointeur suivant soit 0xF7105708.

À l'extraction, le programme devra calculer la valeur du pointeur en analysant le script et les balises de fin.

À l'insertion, le programme devra chercher dans la table la valeur du pointeur (pas son adresse en ROM) ce qui lui permettra de savoir où écrire, et écrire la nouvelle valeur en RAM à la place de l'ancienne.

Le risque de cette méthode c'est que le pointeur soit aussi ailleurs. Comme le texte sera déplacé à la fin, le pointeur pas corrigé fera afficher la phrase originelle en anglais. Ce sera facile à corriger. Si on fait un rechercher/remplacer dans toute la ROM, ça risque d'écraser des données qui ne sont pas des pointeurs.

Maintenant que j'ai bien tout expliqué (ça me semble super clair), est-ce quelqu'un aurait l'immense gentillesse de me faire cet outil ?

J'ai listé tous les textes et les tables associés dans un google doc dispo ici :

https://docs.google.com/spreadsheets/d/ ... sp=sharing

Suite au prochain numéro.
MAIS Y A PLUS DE PLACE A L'ÉCRAN! NON DE MERDE MÊME SI JE TE DONNE TOUS LA PLACE DU MONDE DANS LA ROM!! TU POURRAIS PAS EN FAIRE AFFICHÉ PLUS A L'ÉCRAN!!!
Un grand philosophe...

Image

Avatar de l’utilisateur
pinktagada
Mauvaise ROMhackeuse débutarte
Messages : 2276
Inscription : 10 mars 2010, 10:39
Localisation : Midgard
Contact :

Re: [GBA] Shonen Jump's One Piece : Tutoriel Romhacking

Message non lu par pinktagada » 30 mai 2018, 16:57

L'outil étant créé, il faut maintenant trouver la font (la police de caractère) et lui ajouter les accents. (TL;DR elle est compressée et je n'ai pas réussi à la localiser et elle contenait les accents).

Ce que je fais en temps normal, c'est ouvrir la ROM dans Tilemolester et je scrolle de début à la fin en cherchant ce qui ressemble à une font soit un fichier avec toutes les lettres de l'alphabet dans l'ordre de la table de caractères. Sur GBA, en général, c'est une palette de 16 couleurs, et la font est en 4bpp. Dans notre cas, elle est en 4bpp linear reverse order. Je l'ai faite afficher dans la VRAM (c'est à dire la mémoire graphique du jeu où sont stockées toutes les tiles qui servent de matière première à l'affichage à l'écran) vu que je ne l'ai pas trouvée dans la ROM.

Image

En fait, il s'avère que c'est pas la bonne font, mais on va faire comme si. Il nous faut rajouter les caractères accentués dont nous allons avoir besoin : la font étant limitée, on va devoir remplacer les caractères symboles et on fera autrement dans le jeu à la place. On va choisir juste les plus importants car la font étant limitée en nombre de caractères, on va devoir faire un choix. En général, je le limite au strict minimum : éèêàçù donc il nous faut 6 caractères à dézinguer : #%&*+/ par exemple, Il va bien évidemment vérifier qu'ils ne sont pas employés ailleurs, et le cas échéant, faire en sorte qu'on puisse s'en passer.

Une fois les caractères à remplacer choisis, on extrait la font (on extrait un bpm dans TM et on l'édite dans ce qu'on veut, perso j'aime bien paint.net) et on remplace en faisant du pixel art. Une fois ça fait, on remplace dans le fichier tbl d'insertion les symboles dézingués par les valeurs des lettres accentuées.

Une fois le texte traduit avec nos 6 caractères essentiels, on n'a plus qu'à insérer avec l'outil, et hop, on a un jeu traduit. Mais pas les graphismes, ça c'est une autre histoire.


-------------------------------------


En fait dans la vraie vie, ça ne s'est pas passé comme ça. Je n'ai pas trouvé la font dans TM. Je ne l'ai pas copiée, et je n'ai rien modifié du tout. RyleFury l'a trouvée compressée, elle contenait tous les caractères acentués, sauf qu'on peut pas les afficher comme ça. Il a aussi trouvé la table de correspondance entre les valeurs en ascii et la font ainsi que la table de largeur des caractères (appelée vwf communément). Il a fallu ajouter la valeur en ascii de ces caractères dans la table de correspondance et changer la VWF.

Pour ceux que ça intéresserait, la font compressée est à 0x8775C dans la ROM et elle est compressée en LZ10.

-------------------------------------


Les outils et le dossier de travail sont là.

RyleFury a écrit :
Dans "Traduction Textes\Texts\Data\" tu as tous les textes à traduire et tu peux mettre les caractères accentués sans problème.

Dans "Traduction Textes\" tu lances "Insert_texts_SJOP.bat" pour insérer le tout dans le fichier "Shonen-Jumps-One-Piece_modif.gba" à la racine et la fenêtre devrait se quitter automatiquement si le logiciel d'insertion ne rencontre pas de problème.

Surtout tu gardes bien tous les fichiers tels quels sinon il pourrait y avoir des problèmes. Le fichier "Shonen-Jumps-One-Piece_orig.gba" est important, tu ne dois pas le supprimer.

Si tu veux tu as le template Notepad++ pour mes fichiers de traduction dans "Informations\" pour mettre des couleurs.
Avancée du projet : Tous les textes sont traduits et relus, il ne manque que celui des textes secondaires qui est en cours de traduction pas l'initiateur du projet. J'attends après lui.

Concernant la traduction des graphismes, j'ai HORREUR de ces machinsbidules de pixels, des palettes (c'est ce qui dit 00=noir par exemple, la table des caractères pour les couleurs, quoi) et tilemaps (c'est ce qui dit quelle tile à quel endroit, une table des pointeurs mais pour les tiles). On les cherche dans TM en scrollant, ça s'affiche si c'est pas compressé, on extrait en bpm, on modifie, on recolle dedans. Ça c'est quand tout se passe bien. Moi, j'aime pas ça. Ça me fait chier et j'ai pas envie de passer plus de temps sur ce projet. Si quelqu'un a envie de continuer à jouer avec ce jeu, et a envie de se taper la partie graphique et continuer le tutoriel, c'est cool :)

Il me faudra également un testeur pour vérifier qu'on n'a pas trop fait de la merde à la traduction (mais ça devrait être pas si pire). Vu que j'aime pas ce jeu, et que j'ai autre chose à tester en ce moment, si y'a un volontaire...

Voilà voilà :-D :-D :-D
MAIS Y A PLUS DE PLACE A L'ÉCRAN! NON DE MERDE MÊME SI JE TE DONNE TOUS LA PLACE DU MONDE DANS LA ROM!! TU POURRAIS PAS EN FAIRE AFFICHÉ PLUS A L'ÉCRAN!!!
Un grand philosophe...

Image

Répondre