En faisant plusieurs tests avec les fichiers .pda de Doom 3, j'ai remarqué que les messages qui s'affichaient dans le PDA de Doomguy étaient toujours en français, même lorsque je démarrais le jeu en anglais (ce qui affectait pourtant la langue des menus). Comment la langue des PDA est-elle décidée ? La réponse est compliquée, mais la solution à mon problème était relativement simple.
Les fichiers .pda
Ces fichiers contiennent les données des PDA que le joueur trouvera au cours du jeu. Ils peuvent contenir divers types d'éléments, tels :
- des définitions de PDA, qui renferment des informations dont le nom et le poste du propriétaire
- des définitions de courriel (qui ont comme données une date, un expéditeur, un destinataire, et bien sûr le message)
La gestion de la langue
Les fichiers aux extensions .gui, .map et .def profitent de variables au format #str_01234
; celles-ci sont définies dans les fichiers english.lang, french.lang, etc. qui associent chaque variable à une chaîne dans la langue voulue.
Le problème
Contrairement aux fichiers énumérés ci-haut, les fichiers .pda ne permettent pas l'usage de variables « #str_ ».
Dans Doom 3, les archives de ressources (pak000.pk4, pak001.pk4...) sont lues en ordre alphanumérique. Si pak003.pk4 et pak005.pk4 contiennent tous les deux un fichier du même nom, la version de pak005.pk4 prendra la priorité, et l'autre sera ignorée. Le choix du fichier à utiliser ne dépend que de ce système, et aucunement sur les réglages de langue.
Si on installe Doom 3 en français, par exemple, l'installation ajoutera deux archives nommées zpak000.pk4 et zpak003.pk4. Évidement, ces archives seront lues en dernier, et les fichiers .pda (français) qu'on y trouve remplaceront les fichiers (anglais) provenant des archives présentes par défaut.
En conséquence, il n'est pas possible de changer le texte d'un PDA suivant la langue sans modifier le code C++ de Doom 3. Heureusement, il s'agit là d'une tâche plutôt facile.
Commençons par le message principal des courriels, qui est représenté par la donnée text.
Dans le fichier neo/framework/DeclPDA.cpp, trouver la fonction idDeclEmail::Parse(). Comme l'indique le nom, les courriels des PDA sont interprétés ici.
Trouver la section qui traite la donnée text :
if ( !token.Icmp( "text") ) { src.ReadToken( &token ); if ( token != "{" ) { src.Warning( "Email decl '%s' had a parse error", GetName() ); return false; } while ( src.ReadToken( &token ) && token != "}" ) { text += token; } continue; }
Dans la boucle while, il suffit de vérifier si la chaîne est une variable ; si oui, on peut récupérer sa valeur :
while ( src.ReadToken( &token ) && token != "}" ) { if ( idStr::Cmpn( token, STRTABLE_ID, STRTABLE_ID_LENGTH ) == 0 ) { text += common->GetLanguageDict()->GetString( token ); } else { text += token; } }
STRTABLE_ID
est tout simplement la chaîne « #str_ », et STRTABLE_ID_LENGTH
est sa longueur, soit 5 caractères.
Une fois compilé, ce code permettra de traduire le texte des PDA dans toutes les langues supportées, de la même façon que les fichiers de map et de gui.