11 points par colus001 2026-03-26 | Aucun commentaire pour le moment. | Partager sur WhatsApp

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
  • 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

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 \r s’insérait au milieu d’un caractère sur 2 octets, corrompant tout le texte suivant, qui s’affichait alors en « gagagaga »
    • Lors du chargement des scripts de scène, une erreur dans la partie qui référence _scriptLangExt provoquait 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 getFontOffset renvoyait 0 lorsqu’un caractère était introuvable ; il a fallu corriger cela pour obtenir un fonctionnement normal
  • 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.FNT est présent, de l’enregistrer dans fanLang pour le traitement. C’est la bonne approche
  • Bug Chunk overread
    • Lors du parsing du script de scène coréanisé KMC, le IFFParser de ScummVM produisait une erreur Chunk overread
    • En empaquetant KMC selon le standard IFF avec form_size = file_size - 8, le fichier restait valide sur le papier, mais Westwood enregistre uniquement form_size = file_size
      • Les offsets ne correspondaient donc pas, d’où l’erreur

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.cpp permet 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 DLE et l’allemand DLG
    • Comme le travail avait commencé sur la base de FM Towns avant de s’étendre à DOS, de l’allemand est soudainement apparu
  • Si KMC n’est pas présent, EMC est 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

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.