Jours 18 à 25 : restauration des sprites japonais pour la version française de SoulBlazer, première démo de Dragon Quest 5
Ces derniers jours ont été consacrés à la restauration des sprites de la version japonaise de SoulBlazer pour la version française. En effet, à la fin du jeu, le personnage de Lisa a été redessiné : ses bras en position de prière ont été supprimés, et sa bouche ainsi que ses yeux ont été redessinés. J'ai donc commencé à fouiller la ROM et à déboguer afin de trouver où se situaient les données et les instructions impliquées. J'ai finalement localisé les sprites, mais ceux-ci étaient compressés. En examinant l'OAM (Object Attribute Memory), je me suis aussi rendu compte que les zones correspondant à la bouche n'étaient pas délimitées de la même manière que dans la version japonaise.
En effectuant quelques recherches sur Internet, j'ai découvert un outil très utile : SNES Tiles Kitten, qui permet d'afficher, décompresser et réinjecter directement des sprites. Cerise sur le gâteau, cet outil gère la compression propre aux jeux Quintet ! J'ai donc rapidement pu reconstituer les sprites nécessaires en migrant les parties du sprite japonais (yeux et bouche) pour correspondre à l'arrangement des sprites français. Une agréable surprise : les mains étaient bien présentes dans les sprites de la version française.
Lors de mes recherches précédentes, j'avais identifié la routine qui gérait le chargement des sprites dans l'OAM, mais sans savoir exactement quel sprite était concerné. Cependant, j'avais découvert que cette partie du code déterminait la position des sprites dans le fond d'écran. J'ai donc repris mes essais dans cette zone, espérant réinjecter les bras supprimés. J'étais quelque peu découragé, car ces bras étaient composés de 10 tuiles, et je me disais que réécrire une routine de chargement et d'animation des bras dépassait mes compétences. En poursuivant mes tests, j'ai compris qu'une adresse, dans la routine qui gère la position des tuiles, menait à une sous-routine, et que celle-ci lisait une zone de mémoire spécifique.
En expérimentant sur cette zone, j'ai découvert qu'elle correspondait à un identifiant qui permettait de charger l'ensemble des sprites d'un élément (bouche, yeux). En modifiant cet identifiant, j'ai pu réinjecter les bras en entier et identifier l'ID "7" qui correspondait aux bras ! J'étais soulagé de ne pas avoir à réécrire tout le code de chargement des tuiles. Cependant, un problème demeurait : l'instruction qui charge les yeux et celle qui charge la bouche se suivaient, ainsi que toutes les autres instructions qui gèrent cette scène. Je me demandais donc comment insérer l'instruction pour positionner les bras.
En analysant le code, j'ai découvert une routine existante avec l'indice "7", et encore mieux, grâce au débogueur, j'ai constaté que cette zone de code n'était pas utilisée. En redirigeant l'instruction des yeux vers cette sous-routine, cela a permis d'afficher les bras, mais l'animation bloquait la scène. Après de nouveaux essais, j'ai découvert qu'un octet permettait de définir le moment de déclenchement de l'animation, et j'ai réalisé que l'animation était complète ! Quelle chance !
Il me restait cependant un problème à résoudre : rajouter les tuiles sans remplacer celles des yeux. J'ai donc recréé l'instruction d'ajout des bras et l'ai insérée à la fin de celles qui chargent les yeux et la bouche, ce qui ajoutait 11 octets. Cela a décalé le reste du code vers une instruction d'animation inutilisée, longue d'une vingtaine d'octets. J'ai alors déplacé cette instruction dans une zone vide et mis à jour l'adresse dans l'instruction de chargement des bras. J'ai ensuite modifié toutes les adresses des instructions suivantes en y ajoutant ces 11 octets, et tout a fonctionné !
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Pour Dragon Quest, je me suis confronté à l'immense tâche de traduire le jeu. Au-delà de l'aspect technique, le script contient plus de 85 000 mots ! J'ai donc accepté l'idée d'avoir besoin d'aide et j'ai modifié l'outil que j'avais créé pour exporter tout le script du jeu, ainsi que pour réinjecter les parties traduites. Il gère désormais les conflits de traduction avec un système de verrouillage des parties validées. J'ai également ajouté des fonctionnalités tel que la recherche et le remplacement. Une fois cet outil en place, mon frère est venu me donner un coup de main, et nous avons pu avancer sur la traduction des dialogues du jeu, que je vous propose aujourd'hui en démo. À ce jour, environ 15 % des dialogues sont traduits.
Vous trouverez ici un patch IPS à appliquer sur une version sans header, ainsi que les scripts du jeu.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Pour la suite, je prévois d'aider à la traduction des scènes entre les niveaux de Go Go Ackman 3, mais ce sera pour un prochain épisode !
Dq5-eng-sh.ips raw_text-v3.txt trad_text-v3.txt