TRADUCTION VALKYRIE NO DENSETSU

Introduction & mini repair log

Valkyrie no Densetsu est un jeu que j’adore! J’y ai beaucoup joué mais malheureusement ma PCB présentait des bugs sonores dans certains niveaux. Par exemple, la ligne de basse dans le Stage 3 était bizarre et il manquait des notes dans la mélodie du Stage 4.

Un jour je me dis qu’il est grand temps que je tente de réparer tout ça !

Vu à quel point ces bugs sont spécifiques, je soupçonne une corruption de données dans la rom de son. Je la dumpe, la compare avec Mame et en effet elle est défectueuse !

Je programme une nouvelle rom avec les bonnes données et voici ma PCB réparée !

J’y joue un peu et je me dis qu’il serait peut être temps aussi de fabriquer l’adaptateur pour profiter du jeu en stéréo.  Le connecteur est difficile à trouver de nos jours mais par chance j’en ai un sous la main. Un peu de soudure et je constate alors que les sorties stéréo ne sont pas amplifiées. Ne possédant pas d’ampli dans mes bornes je tente de faire la connectique pour un casque. Et oui, les Namco System 1 et 2 ont non seulement une connectique HP stéréo mais aussi casque !

Cette fois c’est parfait, le son est amplifié. Je le fais passer par un petit set d’enceintes PC pour régler le son et je profite enfin du jeu avec la qualité sonore maximale ! Puis après quelques heure de jeu je réalise une chose : malgré le fait que je comprenne le japonais, je n’ai jamais pris le temps de traduire l’histoire… et je me rend compte aussi que les gens ne comprenant pas du tout cette langue ne doivent pas vraiment profiter du jeu. Quel dommage ! Je me souviens avoir vu quelques personnes faire des hacks sous Mame pour mettre des jeux en Freeplay notamment. Je n’ai aucune connaissance là dedans mais ce n’est pas grave, le défi est lancé : essayons de traduire le jeu !


Des débuts difficiles

Je trouve donc quelques tutos concernant le hacking sous Mame, mais il n’y a pas grand chose pour être honnête. Je lance le jeu sous Debuggeur et je commence à rechercher des textes anglais pour essayer de comprendre un peu comment c’est programmé. J’essaie de trouver le texte « PLEASE PRESS ONLY 1P BUTTON » qui s’affiche après avoir inséré un crédit. Mais j’ai beau utiliser la fonction de recherche « find » je ne trouve rien. (find 0x0, 0x10000,« PLEASE » )

Intrigué je regarde le code source avec le Debuggeur et il ne correspond pas avec le code dans les eproms du jeu… je suis complètement perdu. Je mets de côté le Debuggeur et je continue de chercher directement dans les fichiers des roms pendant un bon moment. Grâce à un script trouvé sur le net je finis enfin par trouver un texte anglais ! Il est dans la rom du main program numéro 1 (MPR1) les caractères sont codés en hexadécimal sur un octet (de 00 à FF). Ici je fais disparaître le mot « PLEASE » en mettant des FF à la place.

C’est une avancé mais je ne sais toujours pas comment chercher les mots en japonais… jusqu’à ce que je découvre qu’il existe un moyen de voir les Sprites et Tiles sous Mame avec la touche F4 !

On peut y voir tous les caractères utilisés et par chance les lettres de l’alphabet latin correspondent exactement au code ASCII en hexa ! Ce qui veut dire que j’ai peut être trouvé ma pierre de rosette pour le japonais ! J’essaie de chercher dans le code le premier mot du jeu : « SHIAWASE ». Selon la table cela donnerait BC B1 DC BE, je m’empresse de le chercher dans la rom MPR1 et je trouve en effet cette string. Je la modifie avec le mot « TEST » en ASCII, je relance le jeu et bingo !

Je peux alors commencer à traduire les textes en remplaçant simplement les caractères japonais par des caractères anglais. Le saut de ligne se fait grâce à l’octet 0D, et le séparateur de bulle est 0D FF. Jusque là rien de bien compliqué. Sauf que je me frotte à mon premier gros souci : je ne peux pas mettre plus de caractères que ceux d’origines car tous les textes sont les uns à la suite des autres et je ne peux pas déplacer les séparateurs de bulles… L’exercice de traduction devient compliqué car l’anglais nécessite généralement plus de place que le japonais pour dire la même chose. Je dois donc faire des coupes franches et des arrangements pour que le sens principal soit conservé.

Tout se passe bien jusqu’à ce que je tombe sur les premiers mots utilisant le second alphabet japonais : les katakanas.

Le résultat n’est pas du tout le bon ! Je remarque que les katakanas sont au delà du simple octet (de 100 à 13F), c’est donc une histoire d’offset différent mais comment cela marche-t-il ?

Les octets des lettres sont collés les uns aux autres, comment spécifier un complément d’adresse dans ce cas ? Je ne trouve aucune réponse et je finis par opter pour une solution de fortune : je remplace en mémoire les Tiles des katakanas par les Tiles de notre alphabet. Ces Tiles sont situées dans la rom CHAR0, je copie donc les caractères de 40 à 7F et je les colle entre 100 et 13F.

Cela me permet de continuer ma traduction mais le problème est triple :

– je dois modifier une rom supplémentaire (CHAR0),
– les nouveaux caractères ne correspondent pas au code ASCII,
– je ne peux pas faire de saut de ligne à l’endroit où un katakana se trouve.

Dans l’attente de trouver une meilleure solution, je continue avec ce système. J’arrive à la fin du premier niveau et je rencontre un nouveau format de texte sur fond noir

Ces textes sont gérés de la même façon que les bulles. Par contre les balises changent : le saut de ligne devient FF 05 1D, et la début d’un texte devient FF 0x 05 1B (x étant le nombre de lignes de ce que j’ai compris). C’est plus complexe et surtout je n’arrive pas à déplacer les sauts de ligne sans créer de gros bugs ! Je suis obligé de les laisser à leur place et cela me rajoute une difficulté supplémentaire dans mes traductions.

Pour compliquer le tout, je ne peux pas utiliser de Save State pour retourner rapidement à un niveau avancé après un changement de traduction. Les Save States conservent bien sûr en mémoire l’état des rams mais aussi celle des roms du programme principal ! Je ne comprends pas trop pourquoi mais du coup je dois recommencer une partie après chaque modification, ce qui devient vite fatiguant. Mais je continue malgré tout et je finis par traduire le jeu en entier.

Je suis à la fois content et déçu de cette première version. J’ai du faire des manipulations pas très propres et surtout je manque d’espace à de nombreux endroits pour mettre la traduction idéale.


La vraie V1.0

Un peu plus tard, lors d’un week-end arcade fort sympathique je rencontre Neocps1 qui s’y connaît bien en hacking et je lui parle de ma problématique. Il me donne alors une solution simple mais géniale : il y a souvent des zones non remplies dans les roms, je peux alors y mettre mes nouveaux textes sans me soucier du nombre de lettres. Il faut ensuite réussir à trouver la table d’adressage contenant les adresses de tous les textes et les modifier pour faire pointer vers les nouveaux textes !

Je relance le Debugger pour essayer de trouver la table. Je ne sais pas si c’est cette petite pause qui m’a aidé mais je comprends rapidement mon erreur initiale. Je pensais que les codes des deux roms (MPR0 et MPR1) étaient mis à la suite pour n’en former qu’un. Mais en fait les codes sont imbriqués ensembles octet par octet. Les instructions et mémoires du Debugger font enfin sens pour moi !

Cela me permet de comprendre comment marche les katakanas : à chaque octet dans MPR1 que je modifie pour mettre une autre lettre, il y a aussi un autre octet lié dans MPR0 qui est à 00 la plupart du temps et à 01 dans le cas des katakanas. Voilà donc l’offset que je cherchais et qu’il me suffit de modifier pour avoir un code plus propre et éviter de modifier la rom CHAR0.

Je localise rapidement deux grands espaces vides dans le code qui me laissent assez de place pour mettre tous les textes, il ne me reste plus qu’à trouver la table d’adressage…

Pour cela j’ai utilise un Breakpoint pour stopper Mame quand l’adresse de la première lettre de la première bulle est accédé par le code (wp 0x32A54,1,r). Cela me permet de connaître l’adresse de l’instruction qui accède à cette valeur (0x0246FC). J’utilise alors la fonction trace qui exporte dans un fichier toutes les instructions du CPU dans l’ordre et en format clair (trace >>instruction.tr). Je couple cela avec un Breakpoint pour stopper Mame à l’instruction trouvée précédemment (bp 0x0246FC). J’obtiens ainsi le code exécuté juste avant d’afficher la première lettre

Il suffit de remonter les instructions pour trouver l’adresse de la table d’adressage. Malheureusement je ne connais rien à la programmation sous 68000… je place donc des Breakpoints pour remonter progressivement dans le code et en observant les registres je finis enfin par trouver ce que je cherche ! Le registre A1 qui contenait l’adresse de la première lettre contient ici l’adresse de la table, soit 0x0325B8.

J’ai maintenant toutes cartes en main pour faire une vraie V1.0 digne de ce nom. Mais plutôt que de coder à nouveau directement dans les roms, je me dis qu’il faut peut-être passer directement à l’étape finale : créer un script qui va aller modifier à ma place le code. Cela demande plus d’efforts au départ mais après la maintenance devient très facile et surtout je peux le partager car ce n’est qu’un simple patch !

Je me lance donc dans l’apprentissage express du Python qui semble le langage idéal pour ce job. C’est une entreprise fastidieuse mais une fois terminée, je suis enfin satisfait de mon travail !

Les traductions sont de meilleure qualité et n’importe qui peut facilement changer les textes. J’ai pour cela implémenté des codes de vérifications qui empêchent toute erreur de dépassement.

De plus si vous avez un programmateur d’eprom vous pouvez profiter du jeu traduit sur la PCB originale ! Il n’y a que 2 eproms à remplacer, toutes les instructions sont dans le fichier read me.

Voilà, j’espère que vous apprécierez ce super jeu dorénavant accessible à tous !

Vous pouvez vous procurer le script ici :

Valkyrie_to_english


Bonus : des découvertes dans le code !

En fouillant dans le code, j’ai fait quelques découvertes intéressantes. Il y a par exemple des dialogues qui n’ont pas été implémentés dans la version finale du jeu :

La déesse :

どうか、あなたの
ちからで
ひとびとを
すくってください

Please save the people with your strength (at 0x032AEE)

Il s’agit d’une variante de la deuxième bulle de la déesse au début du jeu qui demande de sauver les gens. Dans la version finale elle demande de sauver le monde.

Le mammouth :

さっさっといくがよい。

Go now/quickly (at 0x01F00C)

Vu son emplacement dans le code, il s’agit sûrement d’un phrase dites après que le joueur ait échoué au test mental (juste après « Terrible! Only a miracle can save us »). J’ignore pourquoi elle a été retirée.

ここでさんびきの
かいぶつと
たたかって
ちからをみせてもらおう!

Fight here against those three monsters and show me your strength! (at 0x033D46)

Cette phrase devait accompagner le joueur quand il entrait dans la salle du test de force. Mais le nombres d’ennemis a été revu à la hausse depuis !

よくここまできた。しかし きょうは
ここまでで おわりじゃ!
またつぎのきかいにあおう!
さらばじゃ!

Well done. But that’s all for today! We’ll meet again! Bye! (at 0x033CCE)

Une fois les ennemis du test de force vaincus, le mammouth devait sûrement dire cela.

Le marchand :

まいど
ありがとう
ございました。

Thank you very much (at 0x0336F4)

Le marchand devait à l’origine nous dire merci après chaque achat ! Mais je pense que cela devait un peu trop casser le rythme.

なんでも
あく かぎ だよ

This key opens everything (at 0x033888)

Les deux seules porte verrouillées du jeu sont dans le donjon du château. La clé se trouve dans un coffre à proximité mais peut être que les développeurs voulaient au départ nous la faire acheter…

やみよをてらす
ランプ
つかえるかもよ?

Maybe you can use a lamp to light the darkness? (at 0x0337F0)

Oho ! Un objet intéressant qui laisse supposer qu’un endroit devait être plongé dans le noir ! Je pense que l’endroit idéal devait être le marécage à la fin du Stage 5. Le jeu s’assombrit un peu à cet endroit d’ailleurs et j’imagine bien Namco faire un clin d’œil à The Tower of Druaga avec ce labyrinthe plongé dans le noir. En plus il y a un marchand juste avant…

スピ-ドアップする
スーパーシューズ
やすく しとくぜ

I’ll sell you those speed boost Super Shoes for a good price (at 0x033984)

Ça c’est dingue ! Des chaussures augmentant la vitesse de déplacement étaient prévues à l’origine ! Je ne sais pas pour quelles raisons elles n’ont jamais vu le jour dans la version finale mais j’aimerais bien les essayer:)

Enfin, grâce à l’outil qui permet de voir les Sprites j’ai trouvé d’autres choses plutôt cools :

Il y a beaucoup d’animations de personnage non utilisées, mais la plus marquante est sans doute Quarckman qui dispose de tout un panel d’attaque notamment ! Était il censé nous attaquer ? Nous aider au combat ?

On peut aussi voir ces lettres qui se lisent ougon no tane (The Gold Seed). Là ils ne sont pas bien colorés car certains Sprites voient leurs couleurs modifiées selon les besoins du jeu. Mais vu le travail porté sur ces caractères je me demande s’il ne s’agissait pas d’un sous titre du jeu finalement abandonné ? (Valkyrie no Densetsu – Ougon no Tane)

Enfin j’ai trouvé les Sprites de la clé, de la lampe et des chaussures que le marchand aurait pu nous vendre. Et il y a visiblement une arme qui n’a pas été implémentée. On dirait un boomerang et il ressemble fortement à ceux utilisés par certains monstres.

Voilà, c’est tout ce que j’ai trouvé. Si quelqu’un de doué et motivé arrive à voir si on peut activer les bottes de vitesse je suis preneur ! J’aimerais vraiment voir ce que cela aurait pu donner…

A.M. aka A-M

Une réflexion au sujet de « TRADUCTION VALKYRIE NO DENSETSU »

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. Apprenez comment les données de vos commentaires sont utilisées.