Pourquoi cela n’existait-il pas jusqu’à présent ?
- The Legend of Kyrandia, une série de jeux d’aventure en point-and-click sortie il y a 35 ans. Dans la série, seul l’épisode 2, Hand of Fate, n’avait jamais été localisé en coréen
- Parmi les moteurs implémentés dans ScummVM, les jeux utilisant le SCUMM de Lucas ou le SCI de Sierra ont eu pas mal de localisations coréennes faites par des fans, mais c’est rarement le cas pour le moteur Kyra de Westwood
- Format binaire propriétaire, rendu de police pensé uniquement pour 1 octet, absence des polices nécessaires
- Pour réaliser la localisation coréenne, il ne suffisait pas d’extraire et de traduire le texte : il fallait aussi modifier le code de rendu du texte dans le moteur Kyra de ScummVM
Traduction
- La traduction en elle-même n’a pas été particulièrement difficile ; les scripts extraits ont été passés à un LLM
- Seul un prompt simple a été utilisé pour conserver le ton du jeu, et le résultat semble globalement satisfaisant
- En revanche, les passages subtils comme les jeux de mots ou les traits d’esprit semblent moins bien traduits
Reverse engineering
- Les formats propriétaires de Westwood : PAK (package), EMC (script de scène), DLG (dialogue), ENG (texte d’interface)
- Chaque format a été rétroconçu puis transformé en outils Python
- EMC -> KMC, DLG -> DLK, ENG -> KOR, puis stockage des fichiers traduits dans
OTHER.PAK
- EMC -> KMC, DLG -> DLK, ENG -> KOR, puis stockage des fichiers traduits dans
- Le code de ScummVM a été modifié pour que, dans le cas d’une traduction fan, les fichiers traduits soient chargés depuis
OTHER.PAK - Sans dépendance externe, tout se build avec une seule commande,
$ python tools/build_korean.py, qui génère une archive.zip; il suffit ensuite d’écraser les fichiers du jeu d’origine
Police
- Il n’existait pas de police coréenne par défaut, il a donc fallu en trouver une
- Une police coréenne récupérée depuis le jeu rétro officiellement distribué en Corée The Dig était déjà disponible
- Comme la structure de la police était légèrement différente, son en-tête a été retiré
- Ajout d’un moteur de rendu de police coréenne à ScummVM
- Heureusement, le système de polices destiné aux traductions chinoises de fans disposait déjà du chargement bitmap, du rendu 1bpp, du traitement des contours et de la combinaison 1 octet + 2 octets (
MultiSubsetFont) - Il existait aussi dans Kyrandia 1 un système de police coréenne compositionnelle, avec déjà la logique de lecture sur 2 octets
- Il a donc suffi d’ajouter la logique de conversion des paires d’octets EUC-KR vers un index de glyphe
- Il y avait aussi une police japonaise dans la version FM-Towns, envisagée au départ comme piste de solution, mais le problème a finalement été résolu plus simplement
- Heureusement, le système de polices destiné aux traductions chinoises de fans disposait déjà du chargement bitmap, du rendu 1bpp, du traitement des contours et de la combinaison 1 octet + 2 octets (
La guerre contre les bugs
- Le bug « gagagaga »
- La fonction
preprocessString(), qui reformate les longues répliques pour les adapter à la largeur de l’écran, avait été conçue pour une police sur 1 octet- Un
\rs’insérait au milieu d’un caractère sur 2 octets, corrompant tout le texte suivant, qui s’affichait alors en « gagagaga »
- Un
- Lors du chargement des scripts de scène, une erreur dans la partie qui référence
_scriptLangExtprovoquait le chargement de la version japonaise à la place- Comme la police correspondante était elle aussi absente, le texte s’affichait encore en « gagagaga »
- Dans les deux cas, le problème venait du fait que
getFontOffsetrenvoyait0lorsqu’un caractère était introuvable ; il a fallu corriger cela pour obtenir un fonctionnement normal
- La fonction
Game data not found- À partir du deuxième lancement, le jeu plantait de manière étrange
- Dans ScummVM, au moment de quitter le jeu, la langue était enregistrée en coréen, ce qui empêchait ensuite la détection correcte
- La solution a été de laisser la détection en anglais, puis, si
KOREAN.FNTest présent, de l’enregistrer dansfanLangpour le traitement. C’est la bonne approche
- Bug
Chunk overread- Lors du parsing du script de scène coréanisé
KMC, leIFFParserde ScummVM produisait une erreurChunk overread - En empaquetant
KMCselon le standard IFF avecform_size = file_size - 8, le fichier restait valide sur le papier, mais Westwood enregistre uniquementform_size = file_size- Les offsets ne correspondaient donc pas, d’où l’erreur
- Lors du parsing du script de scène coréanisé
Contribuer à ScummVM
- Les traductions fan sont officiellement prises en charge par ScummVM via
FLAGS_FAN(KO_KOR, EN_ANY)- Le premier paramètre indique la traduction fan, le second la langue d’origine
- Après le démarrage du moteur, une bascule dans
kyra_hof.cpppermet d’activer le vrai mode coréen et de charger les fichiers de traduction - Le système d’extensions de fichiers varie selon la langue : pour les fichiers DLG, en version DOS, l’anglais utilise
DLEet l’allemandDLG- Comme le travail avait commencé sur la base de FM Towns avant de s’étendre à DOS, de l’allemand est soudainement apparu
- Si
KMCn’est pas présent,EMCest utilisé à la place, ce qui permet au jeu de fonctionner même si la traduction n’est pas complète - Une PR a été soumise ; les retours ont été moins sévères que redouté, et il a surtout fallu réorganiser les commits
Le potentiel de l’IA
- Dans les faits, la majeure partie du travail a été réalisée par OpenCode et Opus / Sonnet
- Mon rôle a surtout ressemblé à celui d’un chef de projet : encourager, tester, déboguer et soutenir (c’est-à-dire fournir les prompts)
- Tous les éléments étaient déjà réunis, et il aurait peut-être été possible de tout faire à la main, mais il aurait sans doute été difficile ne serait-ce que de savoir par où commencer
- Je n’ai quasiment pas écrit une seule ligne de code Python ou C++, et cela donne vraiment l’impression de découvrir ce qu’est l’ingénierie avec l’IA
- Grâce à cette expérience, je suis devenu plus positif vis-à-vis du AI coding
3 commentaires
Waouh, on ressent vraiment le parfum d’une autre époque à l’écran du jeu ;;
On dirait un jeu comme The Secret of Monkey Island. Ça a l’air sympa.
Exact. Sans aller jusqu’à parler de rival, The Legend of Kyrandia a lui aussi connu un certain succès grâce à sa traduction en coréen. Haha.