♣_______Page mise à jour le 30 janvier 2018 vers 10h30 TUC |
Quand on parle de format de fichier .s ou .w, on oppose généralement deux états : décompressé (lisible dans le bloc-notes) et compressé (dans lequel un il humain ne peut rien distinguer d'intelligible, en dehors de l'en-tête).
Maintenant, si l'on observe l'interface de Tk_Zipper, |
Ces trois formats sont aussi ceux dont Martyn T. Griffin et Paul Gausden comparent les avantages et les inconvénients dans le Hits and Tips de Steam4Me [⇒], sous les noms respectifs de uncompressed, compressed et tokenised.
Pourtant, le fichier TSUtil_en.txt contenant l'aide pour TSUtil de Carl-Heinz Rive, fait état de quatre formats différents : Unicode text (UT), Compressed binary (CB), Unicode binary (UB) et Compressed text (CT). C'est ce document qui est repris ci-dessous, sous forme de deux tableaux annotés.
Nom TS-Util | UT | UB | CT | CB |
Unicode Text Texte Unicode | Unicode Binary Binaire Unicode | Compressed Text Texte compressé | Compressed Binary Binaire compressé | |
TK Zipper | Unicode /u | Binary /b | · | Compressed /c |
autres noms | décompressé | texte uncompressed | compilé tokenized | reduced | · | compressé | binaire compressed |
128 premiers octets · ·Ⓐ·· |
ÿþS·I·M·I·S·A·@· @·@·@·@·@·@·@·@· @·J·I·N·X·0·s·1· t·_·_·_·_·_·_··· ······s·h·a·p·e· ··(· ·······s·h· a·p·e·_·h·e·a·d· e·r· ·(· ·0·0·0· 0·0·0·0·0· ·)· · |
SIMISA@@@@@@@@@@ JINX0s1b______·· G·······F······ ······D···¯····· ···E············ ·····îÎ>ÿ©?·· ¾eÇ:@E·········· ·······îÎ>ÿ©?· ·¾â1E········ |
ÿþS·I·M·I·S·A·@· F·Ä·ê·····@·@·@· @·xí]Koå¸ræv·Üÿ ` ô·zol·ä±É" »··í±=pÛF·Ï`úßb ±·)zØÇoW"··ñ% JÔG²X,þMý«úOõ?ª PG¥Õ«:D¿¿©·pÿ£ºW WêEݪ·õO·ç(ï`c· |
SIMISA@F···@@@@ xí]·pVÕ·>Y·IØB ·)[·@BX·°,·Éÿ··A ÙÜjª EŨ·ÔºÔ @ ¡Ö·ÅVµVe··¥ÕJ1i §ètqÔ:L§·*Lí··· ´µ·Ñ¡éùÞ·ßÿ¿÷Îû/ ÷·qb½Ï9ÿ÷½û¾{ß =÷Ý{ß5g~Kíõu] |
en-tête | Unicode long | Ansi long | Unicode court | Ansi court |
Filiation ·Ⓑ·· |
||||
Avantages | · ·Peut être lu ou modifié · · ·par vous et moi | Exploitable par Train.exe | ? | · Occupe moins de place · · ·sur le disque · Chargement un peu · · ·plus rapide |
Taille sur le disque ·Ⓒ·· |
Ⓑ··En remplaçant les quatre colonnes en ligne par deux colonnes sur deux lignes, on peut aussi représenter cette filiation de cette façon· · ·aaa
Malheureusement, comme on le verra dans la note Ⓕ·, le chemin imposé par MSTS n'est pas toujours aussi simple que sur ce schéma. q··Il n'est pas sûr que compilation· soit le terme le plus couramment employé ; comme mentionné plus haut, en anglais, Carl-Heinz Rive utilise l'expression Unicode Binary (qui se justifie mais n'est pas très intuitive) et d'autres, Tokenized file (difficile à traduire) ; or, dans leur texte sur Steam4Me·, Griffins et Gausden écrivent à ce propos :
|
L'annexe 1 contient une comparaison illustrée et commentée des deux versions UT et UB d'un (court) fichier de parcelle (fichier .w placé dans le répertoire \World d'une ligne).
Pour son fonctionnement (dans le jeu ou dans les éditeurs), MSTS utilise un grand nombre de fichiers (l'installation de base en compte plus de dix-huit mille), que l'on peut répartir en divers types d'après leur extension (une bonne soixantaine, au total) : .s (fichiers de forme), .w (parcelles), .t (tuiles), .act (activités), .pat (chemins), .eng (motrices), .con (rames), .env (environnement), .sms (gestion des sons), .dat (gestion des objets interactifs), .ace (textures), etc.
Or toute la première partie ci-dessus ne vaut que pour les trois types .s, .w et .t . Si l'on excepte les fichiers de texture .ace (qui contiennent des images, un peu comme les fichiers .bmp ou .tga), la grande majorité des autres est constituée de textes en Unicode 16, autrement dit au format UT ; mais FFEditc_Unicode.exe (l'utilitaire de MSTS permettant de passer d'un format à l'autre) limite son action aux fichiers .s, .w et .t, tout comme ses équivalents TK_Zipper ou la fonction fmgr de TSUtil ; si on leur soumet un fichier .sd, par exemple, aucun fichier compilé ou compressé n'est produit.
Le programme SDenUB.exe (écrit en VB6) essaie donc de reproduire le fonctionnement de FFEditc_Unicode.exe dans un cas très spécifique: la compilation UT → UB d'un fichier .sd (et encore faut-il préciser que les ESD_Complex_Box· ne sont pas supportés) ; l'utilité pratique est donc quasiment nulle, mais l'expérience ne manque pas d'intérêt, et le résultat est positif puisque MSTS accepte la version UB du fichier aussi bien dans le jeu que dans l'Éditeur d'activité (mais elle entraîne un plantage complet d'OpenRails).
Exemple de conversion :
Quelques remarques :
Comme il a déjà été indiqué, ni ffeditc_unicode ni TK_Zipper ni TSUtil (et, par conséquent, RouteRiter) ne prennent en charge les fichiers autres que .s, .w et .t ; il existe pourtant un utilitaire capable de convertir les quatre formats pour tous les types de fichiers Unicode 16 : Simis-Editor, de James Ross.·Ce programme fait donc (en mieux et en beaucoup plus grand) ce que fait SdEnUB. On peut le télécharger à cette adresse [⇒] ou trouver le site ici [⇒].
L'un des éléments les plus intéressants de cet utilitaire se trouve dans son répertoire Resources, qui contient les fichiers .bnf (donc la syntaxe des mots-clés) de tous les types de fichiers supportant ce genre de conversions. L'annexe 3 donne quelques exemples empruntés aux fichiers de parcelle.
Token (sur 4 octets) | Mot-clé (de longueur variable) | |
Longueur du bloc (sur 4 octets) | Bloc (de la parenthèse ouvrante à la parenthèse fermante) | |
Paramètres (juxtaposés) | Paramètres (séparés par une espace ou un saut-de-ligne) |
Pour la division en sections (d'un mot-clé au suivant), le fichier UT emploie des séparateurs (parenthèses, espaces, tabulations, sauts-de-ligne -- ces trois derniers étant quasiment interchangeables et pouvant être redondants) ; le fichier UB, lui, enregistre seulement la taille (en octets) de chaque section.
Le même principe s'applique aux paramètres.
Quand, dans la fenêtre [Enregistrer sous ] du bloc-notes (Notepad.exe·), on déroule la liste [Encodage], on obtient les options suivantes : · · ·aaa On retrouve sous l'appellation UTF-16 le format que nous avons déjà nommé de façon récurrente UT (dans lequel chaque caractère du texte est codé sur deux octets) ; mais on peut voir que la liste distingue deux variantes dans ce format : LE et BE, pour Little Endian· et Big Endian, plus ou moins officiellement traduit en français par Petit boutisme· et Gros boutisme·. |
Dans la variante BE, le premier octet écrit ou lu (c.-à-d. celui qui a l'adresse la plus basse en mémoire ou sur le disque) est le code de l'alphabet ; vient ensuite celui du caractère.·Et inversement dans la variante LE.
· | · | UTF-16·BE | UTF-16·LE |
Par exemple, l'ensemble des caractères nécessaires pour afficher un document en arménien se trouve dans l'alphabet 05 (partagé avec d'autres langues, dont l'hébreu) ; dans cet ensemble, la lettre BÉ Պ porte le numéro 4A ; on aura donc · ·aaa | 05·4A | 4A 05 | |
L'indication de la variante utilisée se trouve dans l'en-tête constitué · · ·par les deux premiers caractères du fichier | Ansi | ÿþ | þÿ |
hexadécimal | FF FE | FE FF |
Mais pourquoi accorder tant d'importance à ce qui peut apparaître comme très anecdotique ? C'est que
· | Big Endian | Little Endian |
quatre couples codant un caractère Unicode | 01··02··03··04··05··06··07··08 | 02··01··04··03··06··05··08··07 |
deux valeurs numériques sur quatre octets · ·(comme les nombres à virgule flottante courants) | 01··02··03··04··05··06··07··08 | 04··03··02··01··08··07··06··05 |
une valeur numérique sur huit octets · ·(par ex. un nombre à virgule flottante en haute précision) | 01··02··03··04··05··06··07··08 | 08··07··06··05··04··03··02··01 |
Pour un qu'un il humain puisse interpréter cette suite au format Big Endian· (ou qu'un esprit humain puisse la traiter), il suffit de savoir où placer les limites des différentes valeurs ; il en va autrement du format Little Endian, qui nécessite tout un travail préalable de reconstruction.
Pour plus de détails (et de pondération) sur le boutisme·, on peut se référer à cette page de Wikipédia [⇒].
Lors de son installation, MSTS crée (entre autres choses) un répertoire \UTILS et un sous-répertoire \UTILS\FFEDIT dans lequel est placé le programme ffeditc_unicode.exe accompagné de divers fichiers complémentaires ; c'est ce programme qui permet de changer le format d'un fichier du jeu comme on a pu l'observer dans la première partie.
Aujourd'hui, il n'est plus guère employé puisque TSUtils et TK_Zipper en offrent des équivalents plus faciles à manier, mais l'étude des fossiles reste une activité pleine d'intérêt.
Première précision : le programme s'exécute dans une fenêtre de la console MS-Dos ; par ailleurs, la seule aide dont on dispose est ce qui s'affiche quand on entre la commande ffeditc_unicode.exe /?, que l'on peut traduire ainsi :
Ci-dessus, la ligne Utilisation indique la syntaxe de la commande ; les paramètres obligatoires figurent entre < >, les paramètres facultatifs entre [ ] et | sépare plusieurs éléments entre lesquels il faut choisir. Ainsi, le seul paramètre obligatoire est le nom du fichier à convertir ; encore faut-il que ffeditc_unicode.exe et le nom du fichier soient précédés de leurs chemins respectifs s'ils ne se trouvent pas dans le répertoire courant de MS-Dos (celui qui est indiqué en début de ligne, avant le < et le curseur clignotant). Les paramètres /k et /o: sont assez clairs ; reste [/c|/u] ; les crochets indiquent un élément facultatif ; on aura donc trois formes (et trois effets) possibles :
Comme on peut le deviner, c'est ce paramètre qui permet de fixer le format de sortie de la conversion (pour plus de clarté, nous l'appellerons commutateur) ; et, puisque nous avons quatre formats possibles en entrée (UT, UB, CT et CB), il y aura douze cas de figure à considérer, rassemblés dans ce tableau· · ·aaa S'il a l'avantage d'être complet, ce tableau est difficile à appréhender dans sa globalité ; d'où le second schéma moins détaillé mais peut-être plus « parlant » · ·d d· ·d d | · |
· | La logique qui régit l'emploi de ce commutateur peut surprendre à plus d'un titre :
|
Quand on décompresse un fichier .w de CB en UT ou de CB en UB, le fichier obtenu peut contenir une erreur qui rend son utilisation problématique.
Quand les objets à placer sur la parcelle atteignent une certaine densité, MSTS divise cette parcelle en zones plus petites ; pour cela, il définit en début de fichier un ensemble de ViewDbSpheres, de forme circulaire comme leur nom le suggère. Dans la suite du fichier, chaque objet contient une ligne VDbId ( # ) indiquant le numéro de la ViewDbSphere dans laquelle il se trouve (ou, s'il est en dehors de toute ViewDbSphere, 4294967294 ou 4294967295 -- soit les valeurs maximales que peut prendre un entier non signé sur quatre octets).
Le problème se situe dans ces ViewDbSpheres (ce qui vaccine les parcelles dépourvues de telles zones). Un exemple simple figure dans le schéma ci-contre · ·aaa · · · On dispose donc d'une sorte de structure gigogne où deux ViewDbSpheres peuvent être soit surs·(comme 1 et 2) soit dans un rapport mère-fille· (comme 0 et 1).·Dans le fichier de format UT, cette structure est matérialisée par l'indentation et les parenthèses. · ·aaa Mais (comme cela apparaît dans la première annexe) le format UB ne dispose pas de cette ressource et tout se passe dans la longueur assignée à chaque bloc. Dans notre exemple, la longueur déclarée pour la VDbS(0) englobera toute la suite de la section encadrée en violet alors que celle des VDbS(1) et VDbS(2) correspondra aux trois lignes de chacune. L'erreur de ffeditc_unicode est qu'il considère systématiquement que chaque nouvelle VDbS est la fille de la précédente, aboutissant à cet état · ·aaa La dernière copie d'écran montre un dernier exemple encore plus caricatural. Au-delà du simple aspect, deux conséquences néfastes dans le jeu ou l'Éditeur d'itinéraires :
Avant l'arrivée de TK_Zipper, TSUtils ou Simis-Editor, la seule solution sûre consistait à ouvrir la ligne dans l'Éditeur d'itinéraires, aller sur la parcelle à décompresser, déplacer légèrement un objet puis enregistrer la ligne : l'Éditeur d'itinéraires enregistre toujours au format UT -- et sans erreur. Mais le procédé devenait vite fastidieux quand on avait besoin de décompresser, par exemple, les deux mille huit cent deux parcelles de la Ligne du Grand Est. Plus inquiétant que cette erreur elle-même, ce qu'elle révèle : Trains.exe (qui gère le jeu et les éditeurs à l'exception de l'extracteur de géométrique) convertit correctement les quatre formats de tous les fichiers qu'il a à utiliser ; pourquoi avoir choisi de réinventer la roue en créant un nouveau programme pour faire la même chose en plus rabougri (fichiers .s, .w et .t seulement) et avec une erreur gênante ? Compétition entre deux équipes de Kuju ? amnésie des créateurs ? |
··· |
Mais à quelque chose malheur peut être bon : l'autonomie de ffeditc_unicode a nécessité la création de tables et de listes ; les deux plus utiles sont newshape.bnf et worldfile.bnf qui contiennent la syntaxe des mots-clés utilisés dans les fichiers .s et .w, et livrent donc deux sortes d'informations particulièrement intéressantes :
uint | entier non signé (quatre octets) | sint | entier signé (quatre octets) |
float | nombre à virgule flottante (quatre octets) | string | chaîne (longueur variable dans les deux premiers octets) |
Reste à déterminer ce que représente ce mot-clé ; la logique voudrait qu'il permette d'indiquer la distance à laquelle l'objet reste visible ; mais les essais dans l'Éditeur d'Itinéraires n'ont pas été concluants ; de plus, cette fonction fait (ou ferait) double emploi avec les lods (level of detail·) qui, dans le fichier .s de l'objet, déterminent son apparence en fonction de l'éloignement ; avantage ou inconvénient, les lods· s'appliquent automatiquement à toutes les instances de l'objet alors que MaxVisDist· ne porte que sur l'objet précis dans lequel la commande est placée.
·Direction : le mot-clé ne doit pas être confondu avec l'omniprésent QDirection qui, comme l'indique son initiale, correspond à un quaternion et a donc en paramètres quatre valeurs de type {float} ; Direction, lui, a comme paramètre trois nombre {float} qui sont sans doute les angles de lacet, roulis et tangage exprimés en radian, comme on les trouve dans les fichiers .tdb et .rdb. Sans pouvoir vérifier toutes les occurrences (qui apparaissent dans une cinquantaine de fichiers des six lignes originales de MSTS), il semble bien que Direction remplace QDirection dans tous les objets Telepole et eux seuls.
Pour donner rapidement une idée du problème que peuvent représenter les arbres dans la simulation, il suffit de comparer ces deux objets · · aaa Au format UB, l'arbuste occupe 274 kO en mémoire quand le bâtiment n'en consomme que 31 (quasiment un rapport de 9 à 1) ; il était donc impérieux de réduire le poids des fichiers des objets constituant la végétation, d'autant plus que les lignes d'origine sont des lignes rurales (à l'exception de USA1 et, pour moitié, de JAPAN1) ; pour y parvenir, on a créé les arbres au moyen de deux (ou trois voire quatre) plans verticaux se coupant en leur milieu, comme on peut le voir dans l'image ci-dessous. |
Bien sûr, la vue en plongée n'est pas du meilleur effet mais, de face et à distance raisonnable, le résultat est correct, surtout pour un poids d'à peine 3 kO. bbb · · Placer le curseur de la souris sur l'image pour afficher ce résultat. Mais il arrive que le mieux soit l'ennemi du bien ; pour améliorer le réalisme du décor, MSTS a prévu de varier l'éclairage des surfaces en fonction à la fois de l'heure et de leur orientation, comme on peut l'observer dans la copie d'écran ci-dessous, prise vers 18 heures : |
Hélas ! ce qui convient aux bâtiments produit un effet nettement moins heureux sur les arbres cruciformes · · aaa · · ; Placer le curseur de la souris sur l'image pour voir cet aspect · ·aaa C'est ce changement d'éclairage que devait permettre NoDirLight ; mais il s'est retrouvé dans la même situation que MaxVisDistance : plutôt que d'avoir à préciser pour chacun des milliers d'arbres un type particulier d'éclairage, mieux valait fixer ce type à la source dans le fichier .s de l'arbre ; c'est ce que fait l'un des paramètres du mot-clé vtx_state : pour -5, l'éclairage dépend de l'heure et de l'orientation (cas général) ; pour -9, il ne dépend que de l'heure (arbres cruciformes) ; avec -8, la surface est éclairée au maximum quelles que soient l'heure et l'orientation (pour l'éclairage nocturne, notamment) ; on trouve aussi quelques autres valeurs intermédiaires. | · |
D'après worldfile.bnf, on pourrait rencontrer quelque chose comme
UId ( 12 )
WagonData ( Labor ) (1)
CoupledWith ( 0 )
CollideFlags ( 0 )
FileName ( Labor.s )
StaticFlags ( 00008000 ) (2)
Position ( 75.427 1 -312.452 )
QDirection ( 0 0 0 1 )
MaxVisDistance ( 100 )
VDbId ( 0 )
NotCoupledToActiveTrain ( 0 )
UId ( 13 )
Camera ()
WagonData ( Labor ) (1) (3)
EngineData ( Labor ) (1) (3)
CoupledWith ( 0 )
Flip () (3)
Inverse () (3)
FileName ( Labor.s )
Position ( 175.427 1 -312.452 )
Direction ( 0 0 0 )
EngineVariables ( 0 -1.56 8 0 0 -4 )
MaxVisDistance ( 100 )
NotCoupledToActiveTrain ( -1 )
UId ( 14 )
FirstWagon ( 3 )
TrainData ( Labor )
Si l'on place dans un fichier de parcelle les trois objets Wagon, Engine et Train tels qu'ils sont présentés ci-dessus,
e··par contre, si le fichier .w ne contient que l'objet Wagon (sans Engine ni Train), l'Éditeur conserve Wagon lors de l'enregistrement de la parcelle modifiée, en « corrigeant » certaines lignes · · aaa e··Enfin, ni le jeu ni Simis Editor n'acceptent ces objets (pas même la version corrigée de Wagon) mais OpenRails, lui, s'accommode des trois, à la façon de l'Éditeur d'Itinéraires. | ··· |