Chapitre 9 Autres caractéristiques du matériel roulant de la OR

Autres caractéristiques du matériel roulant Open Rails


Pour une liste complète des paramètres, voir Développement de contenu OU - Paramètres et jetons


9.1 Feux de locomotive


OU prend en charge l'ensemble des lumières acceptées par MSTS.


9.2 Trains pendulaires



OU prend en charge les trains pendulaires. Un train s'incline lorsque son nom de fichier .con contient la chaîne inclinée : par ex. ETR460_tilted.con.

9.3 Animations et ramassages de fret


9.3.1 OU mise en œuvre des animations et ramassages de fret MSTS


OR prend en charge les animations fret comme le fait MSTS (ravitaillement eau, charbon et gasoil) ; lors d'un ravitaillement depuis une colonne d'eau l'animation du bras de colonne est supportée ; le niveau de charbon dans le tender de la locomotive du joueur diminue avec la consommation et augmente lors du ravitaillement.


Les paramètres de détection suivants sont pris en compte par OR pour les animations MSTS :


• Type de micro


• Plage de vitesse


• Longueur de l'animation


La fréquence d'images de l'animation de capture est calculée comme le rapport entre le nombre d'images définies dans le fichier .s, divisé par la longueur de l'animation.


Comme dans MSTS, les animations de fret sont traitées différemment pour les appels d'offres que pour les autres véhicules.


Appels d'offres :


• Premier paramètre numérique : position verticale de la forme lorsqu'elle est pleine, par rapport à son origine, en mètres


• Deuxième paramètre numérique : position verticale de la forme à vide, par rapport à son origine, en mètres.


• Troisième paramètre numérique : défini sur n'importe quelle valeur positive, ou omis, la forme disparaît - voir ci-dessous.


– Tant que le deuxième paramètre est inférieur au premier et que le troisième paramètre est omis ou a une valeur non nulle, la forme chutera, en fonction de la consommation de carburant.


– Si le second paramètre n'est pas inférieur au premier, aucun mouvement n'aura lieu quel que soit le 3ème paramètre.


Autres véhicules :


• Les paramètres numériques ne sont pas utilisés.


9.3.2 OU animations et ramassages de fret spécifiques


Général


En plus de la prise en charge des animations de fret MSTS, Open Rails fournit une grande extension pour les animations de fret (appelées OR fretanims ci-dessous) et les ramassages.


Voici les fonctionnalités natives offertes par Open Rails :


• deux types d'anims de fret OU : continus et statiques


• les animations de fret OR continues sont liées aux charges de marchandises, comme le charbon ou les pierres : le niveau de charge dans la rame varie en fonction de la quantité de charge


• les animations OR statiques sont en fait des formes supplémentaires qui peuvent être attachées à la forme de la rame principale. Ces formes peuvent également inclure une animation (indépendante du comportement du train) ;


• les deux types d'animations de fret OR peuvent être présents dans la même rame et peuvent coexister avec les animations de fret MSTS originales


• les deux types de fretanims OR peuvent être liés à des locomotives ou à des wagons


• plus d'un statique OU cargoanim peut être présent dans une seule rame


• un wagon peut être chargé de différentes marchandises à différents moments


• les marchandises peuvent être chargées (dans les stations de ramassage) et déchargées (dans les stations de déchargement).


• les wagons supportant des animations de fret OR continues peuvent être dotés d'une animation physique qui se déclenche lors du déchargement du wagon (comme l'ouverture de son fond ou une rotation complète)


• Les OR FreightAnims sont définis avec un bloc ORTSFreightAnims () dans le .wag ou dans la section wagon d'un fichier .eng. Il est suggéré que ce bloc soit défini dans un fichier inclus comme décrit ici.


Freightanims OR continus


Une description de cette fonctionnalité est mieux réalisée en montrant un exemple de fichier inclus (dans ce cas nommé AECX1636.wag et situé dans un sous-dossier Openrails dans le dossier du wagon). Notez que la première ligne du fichier doit être vide. :


include ( ../AECX1636.wag )

Wagon (

ORTSFreightAnims

(

MSTSFreightAnimEnabled (0)

WagonEmptyWeight(22t)

IsGondola(1)

UnloadingStartDelay (7)

FreightAnimContinuous

(

IntakePoint ( 0.0 6.0 FreightCoal )

Shape(Coal.s)

MaxHeight(0.3)

MinHeight(-2.0)

FreightWeightWhenFull(99t)

FullAtStart(0)

)

FreightAnimContinuous

(

IntakePoint ( 0.0 6.0 FuelCoal )

Shape(Coal.s)

MaxHeight(0.3)

MinHeight(-2.0)

FreightWeightWhenFull(99t)

FullAtStart(0)

)

)

)


Le bloc ORTSFreightAnims est composé d'un ensemble de paramètres généraux suivi de la description des OU Freightanims. Ci-dessous, les paramètres généraux sont décrits :


• MSTSFreightAnimEnabled spéci e si les éventuelles animations de fret MSTS au sein de la rame sont activées (1) ou non (0). Ceci est utile si l'on souhaite utiliser un wagon où le chargement est déjà affiché avec une animation de fret MSTS (statique). Dans un tel cas, l'animation de fret MSTS doit être désactivée, pour utiliser l'animation OU fret, qui permet de modifier la position verticale de la forme du fret.


• WagonEmptyWeight définit la masse du wagon à vide. Si le paramètre est manquant, le poids du chargement n'est pas pris en compte et le poids du wagon est toujours la valeur présente dans le fichier racine .eng.


• IsGondola spécifie (au cas où il est réglé sur 1) si la charge doit être tournée pendant le déchargement, comme cela se produit dans un wagon gondole. S'il est absent, le paramètre est mis à 0.


• UnloadingStartDelay spécifie, s'il est présent, après combien de secondes après l'appui sur la touche T le déchargement commence. Cela est dû au fait que quelques secondes peuvent être nécessaires avant que le wagon ne soit placé dans une configuration de déchargement. Par exemple, une nacelle doit tourner de plus d'un certain nombre de degrés avant que la charge ne commence à tomber.


Il peut y avoir plus d'un sous-bloc FreightAnimContinuous, un pour chaque type de charge possible. Les paramètres du sous-bloc sont décrits ci-dessous :


• IntakePoint a le même format et la même signification que la ligne IntakePoint dans les animations de fret MSTS standard. Les types de charges suivants sont acceptés : FreightGrain, FreightCoal, FreightGravel, FreightSand, FuelWater, FuelCoal, FuelDiesel, FuelWood, FuelSand, FreightGeneral, FreightLivestock, FreightFuel, FreightMilk, SpecialMail. Tous ces types de charges peuvent être définis. Certains des types de camionnettes (à droite de FuelDiesel) doivent être codés dans des fichiers Wtext.


• Forme définit le chemin de la forme à afficher pour la charge


• MaxHeight définit la hauteur de la forme sur sa position 0 à pleine charge


• MinHeight définit la hauteur de la forme sur sa position 0 à charge nulle


• FreightWeightWhenFull définit la masse du fret lorsque le wagon est plein ; la masse du wagon est calculée en ajoutant la masse du wagon vide à la masse réelle du fret


• FullAtStart définit si le wagon est complètement chargé (1) ou vide au début du jeu ; s'il y a plus d'anims de fret OR continus qui ont FullAtStart défini sur 1, seul le premier est pris en compte.


Comme déjà évoqué, le wagon peut avoir une animation physique liée à l'opération de déchargement.


Dans une gondole, cela pourrait être utilisé pour faire pivoter l'ensemble du wagon, tandis que dans une trémie, il pourrait être utilisé pour ouvrir le bas du wagon. La matrice de base dans la forme du wagon qui doit être animée doit avoir un nom qui commence par UNLOADINGPARTS. Il peut y en avoir plusieurs, comme UNLOADINGPARTS1, UNLOADINGPARTS2 et ainsi de suite. Sa fréquence d'images est fixe, et est de 1 image par seconde comme pour les autres types d'animations de rame OR.


Pour définir un point de ramassage comme point de déchargement, sa forme doit être insérée dans le fichier .ref de l'itinéraire en tant qu'objet de ramassage. Voici un exemple du bloc .ref :


Pickup (

FileName ( rotary_dump.s )

Shadow ( DYNAMIC )

Class ( "Track Objects" )

PickupType ( _FUEL_COAL_ )

Description ( "Rotary dumper" )

)


Lorsqu'il est déposé dans l'itinéraire avec l'éditeur d'itinéraire MSTS, son taux de remplissage doit être défini sur une valeur négative.


Un tel pick-up (qui en réalité est un déchargeur) peut également être animé. La matrice de base dans la forme du wagon qui doit être animée doit avoir un nom qui commence par ANIMATED_PARTS. Il peut y en avoir plusieurs, comme ANIMATED_PARTS1, ANIMATED_PARTS2, etc. Comme pour les captures standard MSTS, la fréquence d'images de l'animation de capture est calculée comme le rapport entre le nombre d'images définies dans le fichier .s, divisé par la longueur Anim.


En combinant une animation physique du wagon avec une animation de déchargeur, des effets comme celui d'un wagon dans un dumper rotatif peuvent être obtenus, comme le montre l'image ci-dessous.

L'embarquement et le débarquement d'une rame sont déclenchés par l'appui sur la touche <T> lorsque la rame est à l'emplacement de ramassage/déchargement.


Statique OU Freightanims


Seuls les deux paramètres généraux indiqués ci-dessous sont utilisés pour les fretanims OR statiques :


MSTSFreightAnimEnabled (0)

WagonVidePoids(22t)


Le sous-bloc (à insérer dans le bloc ORTSFreightAnims) a le format suivant :


FreightAnimStatic

(

SubType(Default)

Shape(xxshape.s)

Offset(XOffset, YOffset, ZOffset)

FreightWeight(weight)

Flip()

Visibility ( "Outside,Cab2D,Cab3D" )

)


Où:


• Le sous-type n'est pas utilisé actuellement


• Shape est le chemin du fichier shape.


• XOffset, YOffset et ZOffset sont les décalages de la forme par rapport à sa position zéro, et sont utiles pour placer la forme avec précision.


• FreightWeight est le poids du chargement spécifique. Ce poids est ajouté à la valeur WagonEmptyWeight (si présente) pour fournir le poids total du wagon. Si plus d'animations de fret statiques OU sont présentes, chacun de leurs poids est ajouté pour définir le poids total du wagon.


• Flip(), s'il est présent, retourne la forme autour de son point de pivot.


• La visibilité, si elle est présente, modifie la visibilité par défaut de l'animation de fret statique. Le défaut n'est visible que depuis les caméras extérieures et depuis n'importe quelle caméra intérieure des locomotives différentes de celle hébergeant l'animation de fret statique. Si la sous-chaîne Outside est présente, l'animation de fret statique est visible depuis les caméras extérieures et depuis toute caméra intérieure des locomotives différentes de celle hébergeant l'anim de fret statique ; si Cab2D est présent, le cargoanim statique est visible depuis la caméra 2D cabview de la locomotive hébergeant le cargoanim ; si Cab3D est présent, l'animation de fret statique est visible depuis la caméra 3D de la cabine de la locomotive hébergeant l'animation de fret. 1, 2 ou 3 de ces sous-chaînes peuvent être insérées dans la ligne Visibilité permettant toute combinaison de visibilité.


Parce que plus d'anims de fret OR statiques peuvent être définis pour un wagon, dans le cas d'un wagon porte-conteneurs capable de transporter plus d'un conteneur, même en tant que double pile, il est possible d'utiliser un anim de fret OR statique pour chaque conteneur, définissant son position à l'intérieur du wagon.


9.3.3 Variation physique avec les charges


Charges variables (animation de fret continu)


Open Rails supports the variation of key physics parameters in the wagon as the load varies within the wagon. The parameters which can be changed are:


• Mass


• Brake and handbrake force


• Friction (general and wind)


• Centre of Gravity (impacts on curve performance)


• Drive wheel weight (impacts upon locomotive adhesve weight)


Locomotives and tenders that are also configured will have their loads, and the above physics parameters adjusted as coal and water is used. The adhesive weight (Drive wheel weight) will also be adjusted as the load changes.


To support the correct operation of this feature a known physics starting and finishing point is required, ie the state of these parameters under empty conditions, and the state of these parameters when the wagon or locomotive is full.


To configure the stock correctly the following empty and full parameters need to be included in the ORTSFreightAnims file. Empty values are included in the first block, and full values are included in the second code block. A sample code block is shown below.:


ORTSFreightAnims

(

MSTSFreightAnimEnabled (0)

WagonEmptyWeight(10.0t-uk)

EmptyMaxBrakeForce ( 29.892kN )

EmptyMaxHandbrakeForce ( 9.964kN )

EmptyORTSDavis_A ( 580.71 )

EmptyORTSDavis_B ( 5.0148 )

EmptyORTSDavis_C ( 0.694782 )

EmptyORTSWagonFrontalArea ( 10.0m )

EmptyORTSDavisDragConstant ( 0.0003 )

EmptyCentreOfGravity_Y ( 1.41 )

IsGondola(0)

UnloadingStartDelay (5)


FreightAnimContinuous

(

IntakePoint ( 0.0 6.0 FreightCoal )

Shape(H_Coal.s)

MaxHeight(0.1)

MinHeight(-0.85)

FreightWeightWhenFull(26.0t-uk)

FullAtStart( 0 )

FullMaxBrakeForce ( 89.676kN )

FullMaxHandbrakeForce ( 9.964kN )

FullORTSDavis_A ( 748.61 )

FullORTSDavis_B ( 18.0157 )

FullORTSDavis_C ( 0.838530 )

FullORTSWagonFrontalArea ( 15.0m )

FullORTSDavisDragConstant ( 0.005 )

FullCentreOfGravity_Y ( 1.8 )

)

)


Remarque pour les wagons fermés, tels que les fourgons couverts, la forme d'animation de fret peut ne pas être requise et, par conséquent, les paramètres Shape, MaxHeight et MinHeight peuvent être omis du fichier.


L'instruction IntakePoint est nécessaire pour garantir le bon fonctionnement de la fonctionnalité.


Open Rails prend en charge les types de chargement de fret ou de carburant suivants :


• FreightGrain = 1,


• FreightCoal = 2,


• FreightGravel = 3,


• FreightSand = 4,


• FuelWater = 5,


• FuelCoal = 6,


• FuelDiesel = 7,


• FuelWood = 8,


• FuelSand = 9,


• FreightGeneral = 10,


• FreightLivestock = 11,


• FreightFuel = 12,


• FreightMilk = 13,


• SpecialMail = 14


Le mot clé, par ex. FreightMilk, est utilisé pour définir le type de fret dans l'instruction IntakePoint, tandis que le nombre est utilisé pour définir le point de ramassage dans l'itinéraire (remplace le premier nombre dans l'instruction PickupType ( 1 0 )).


Pour la variation de charge dans une locomotive, une configuration similaire est utilisée en ce qui concerne les paramètres plein et vide, mais comme la déclaration IntakePoint est normalement incluse ailleurs dans le fichier ENG ou le fichier d'appel d'offres (ou appel d'offres auxiliaire) WAG, ces déclarations peuvent être omises. la rubrique animation fret. Par exemple, le bloc de code suivant s'appliquerait à une locomotive à vapeur (notez l'absence de l'instruction IntakePoint):


ORTSFreightAnims

(

WagonEmptyWeight(76.35t-uk)

EmptyMaxBrakeForce ( 29.892kN )

EmptyMaxHandbrakeForce ( 9.964kN )

EmptyORTSDavis_A ( 580.71 )

EmptyORTSDavis_B ( 5.0148 )

EmptyORTSDavis_C ( 0.694782 )

EmptyCentreOfGravity_Y ( 1.41 )

FreightAnimContinuous

(

FreightWeightWhenFull(10.34t-uk)

FullMaxBrakeForce ( 89.676kN )

FullMaxHandbrakeForce ( 9.964kN )

FullORTSDavis_A ( 748.61 )

FullORTSDavis_B ( 18.0157 )

FullORTSDavis_C ( 0.838530 )

FullCentreOfGravity_Y ( 1.8 )

)

)

Remarques:


• Les points d'admission doivent être définis dans le fichier rootWAG


• Les points d'admission, les animations de fret ne doivent pas être définies dans le fichier INCLUDE


• Le poids à vide de l'offre sera la masse totale moins le poids du charbon et de l'eau


• FreightWeightWhenFull sera la somme du poids du charbon et de l'eau.


• Les valeurs physiques complètes seront les valeurs pour le poids combiné de l'offre, de l'eau et du charbon.


• Les paramètres de résistance au vent ( ORTSWagonFrontalArea et ORTSDavisDragConstant ) peuvent


être omis si la zone et le glissement ne changent pas entre les états plein et vide.


Wagons statiques (animations de fret statique)


Les wagons statiques peuvent être définis avec un état plein et vide, cependant une seule animation de fret doit avoir


les valeurs complètes qui lui sont attribuées, car OR ne peut alors pas calculer l'état complet connu.


Un bloc de code de configuration typique sera le suivant :


FreightAnims

(

MSTSFreightAnimEnabled (0)

WagonEmptyWeight(6.5t-uk)


FreightAnimStatic

(

SubType(Default)

Shape( 15ft_3p_HumpSheet2.s )

Offset( 0, 0, 0)

FreightWeight( 9.0t-uk )

FullMaxBrakeForce ( 19.43kN )

FullMaxHandbrakeForce ( 6.477kN )

FullORTSDavis_A ( 358.37 )

FullORTSDavis_B ( 7.7739 )

FullORTSDavis_C ( 0.718740 )

FullORTSWagonFrontalArea ( 15.0m )

FullORTSDavisDragConstant ( 0.005 )

FullCentreOfGravity_Y ( 1.8 )

)

)


Les valeurs vides pour le wagon seront lues à partir des paramètres normaux du fichier baseWAG.


9.4 Gestion des conteneurs


9.4.1 Général


Avec cette caractéristique, les conteneurs ne sont pas des objets statiques posés sur le sol ou sur des wagons, mais peuvent être chargés d'une station de conteneurs sur un wagon, ou déchargés d'un wagon et posés sur une station de conteneurs. Les opérations de chargement/déchargement sont réalisées grâce à une grue, qui est le cœur de la station conteneurs.

L'autre composant de la station de conteneurs est l'ensemble des emplacements de pile, c'est-à-dire les emplacements où les conteneurs peuvent se trouver. Les conteneurs de même longueur peuvent être empilés les uns sur les autres.


Les wagons peuvent être vides au début du jeu, ou partiellement ou totalement pré-chargés avec des conteneurs, en insérant les données correspondantes soit dans le fichier consist (.con) soit dans les fichiers .wag.


De plus, les stations de conteneurs peuvent être vides au début du jeu, ou partiellement ou totalement remplies de conteneurs, insérant les données associées dans le fichier d'activité (.act).


Les opérations de chargement et de déchargement sont lancées par le joueur, en appuyant sur la touche <T> pour le chargement, et sur la touche <Shift-T> . L'opération est effectuée sur le premier wagon (en partant de la locomotive) qui se trouve dans la plage de déplacement de la grue à conteneurs et qui remplit les conditions requises (par exemple, espace de chargement disponible pour le chargement, conteneur présent pour le déchargement).


Les wagons à double pile sont gérés.


Du point de vue de la structure du code interne, Open Rails gère les stations de conteneurs comme des collectes spéciales.


9.4.2 Comment définir les données du conteneur


Les fichiers de forme de conteneur (.s) doivent être situés dans des sous-dossiers (ou sous-sous-dossiers) du dossier Trainset. Les conteneurs pouvant être gérés doivent être fournis avec un fichier Json .load-or. Les fichiers .load-or doivent se trouver dans un sous-dossier du dossier Trainset. Il est vivement conseillé de conserver tous les fichiers .load-or dans un seul dossier : Common.ContainerData est suggéré. Il est également conseillé de nommer les fichiers .load-or de manière cohérente : 40HCtriton.load-or est suggéré, où 40HC est le type de conteneur et triton la marque peinte sur le conteneur.


Format du fichier .load-or


Ci-dessous un exemple de fichier .load-or :


{

"Container":

{

"Name" : "triton",

"Shape" : "COMMON_Container_3d\\Cont_40ftHC\\container-40ftHC_Triton.s",

"ContainerType" : "C40ftHC",

"IntrinsicShapeOffset": [0,1.175,0],

"EmptyMassKG": 2100.,

"MaxMassWhenLoadedKG": 28000.,

}

}


• « Conteneur » est un mot-clé fixe.


• « Name » a pour valeur une chaîne utilisée par Open Rails lorsque le conteneur doit être identifié dans un message au joueur.


• « Shape » a comme valeur le chemin de la forme du conteneur, ayant Trainset comme base.


• "ContainerType" identifie le type de conteneur, qui peut être l'un des suivants :


* C20ft

* C40ft

* C40ftHC

* C45ft

* C45ftHC

* C48ft

* C53ft


C48ft et C53ft ont une hauteur HC (2.90m)


• « IntrinsicShapeOffset » a pour valeur le décalage en mètres du centre du rectangle inférieur du conteneur par rapport aux coordonnées du fichier de forme du conteneur. Malheureusement, souvent, ce décalage n'est pas [0,0,0], ce qui serait conseillé pour les conteneurs nouvellement produits. Un moyen simple d'indiquer un tel décalage consiste à utiliser Afficher les informations de délimitation de Shape Viewer.


• « EmptyMassKG » est un paramètre facultatif qui définit la tare (poids à vide) du récipient. Si le paramètre n'est pas présent, OR utilise un paramètre par défaut, spécifique à ce ContainerType.


• "MaxMassWhenLoadedKG" est un paramètre facultatif qui définit la somme de la tare plus la charge utile maximale autorisée. Comme ci-dessus, si le paramètre n'est pas présent, OR utilise un paramètre par défaut, spécifique à ce ContainerType.


9.4.3 Préconfigurer un fichier .wag pour accueillir les conteneurs


Au minimum, le bloc suivant doit être présent dans le fichier .wag pour un empileur double :


ORTSFreightAnims (

WagonEmptyWeight ( 12.575t )

LoadingAreaLength ( 12.20 )

AboveLoadingAreaLength ( 12.20 )

DoubleStacker ()

Offset( 0 0.34 0 )

IntakePoint ( 0 6.0 Container)

)


• WagonEmptyWeight est le poids du wagon, lorsqu'il n'a ni conteneurs ni autres animations de pesée de fret à bord


• LoadingAreaLength est la longueur en mètres de la zone de chargement disponible pour les conteneurs


• AboveLoadingAreaLength est la longueur en mètres de la zone de chargement ci-dessus disponible pour les conteneurs (paramètre non nécessaire s'il n'y a pas de double gerbeur)


• DoubleStacker doit être présent si le wagon permet le double gerbage


• Décalage est le décalage du centre du rectangle de la zone de chargement par rapport au fichier de forme du wagon.


• Les premier et troisième paramètres IntakePoint ont la même signification que ceux utilisés pour les collectes génériques. Le premier paramètre doit être égal à la valeur Z du décalage. Le contenant est obligatoire. Ce bloc ORTSFreightAnims peut également inclure des animations de fret statiques comme décrit dans le paragraphe correspondant.


9.4.4 Affectation des conteneurs sur les wagons


Un conteneur peut avoir les positions suivantes dans la zone de chargement du wagon : Arrière, CentreArrière, Centre, CentreAvant, Avant et Au-dessus. L'image suivante montre où se trouvent les cinq premières positions sur le wagon, tandis que Above est la position ci-dessus dans les configurations à double pile. La position Au-dessus est toujours centrée.

Certaines configurations de chargement sont illustrées dans l'image suivante :

De gauche à droite les configurations de chargement sont présentes (locomotive à gauche) :


• CentreAvant, CentreArrière, Au-dessus


• Centre


• Avant, arrière


• Avant, Centre, Arrière


• Avant, arrière


• Avant, CentreAvant, CentreArrière, Arrière.


Les vraies règles d'attribution des conteneurs gerbés doivent être respectées :


• pas de 20 pieds empilés au-dessus


• un seul conteneur au-dessus


• au moins 40 pieds de conteneurs en dessous.


9.4.5 Comment répartir les conteneurs sur les wagons au début du jeu


Les conteneurs peuvent être alloués soit en éditant le fichier .con, soit en éditant le fichier .wag, soit en mode mixte (certains wagons dans un mode, d'autres dans un autre mode).


Allocation via le fichier .con


Ce mode d'allocation est celui recommandé, car il est plus flexible et offre une visibilité plus facile.


Une entrée de wagon complète avec les données sur les conteneurs chargés au démarrage est affichée ici :


Wagon (

WagonData ( DTTX_620040_A ATW.DTTX_620040 )

LoadData ( 20cmacgm common.containerdata CenterFront Empty)

LoadData ( 20hamburgsud common.containerdata CenterRear Loaded)

LoadData ( 40msc common.containerdata Above Random)

UiD ( 11 )

)


Comme on peut le voir, pour chaque conteneur chargé au démarrage, une entrée LoadData doit être présente. La signification des paramètres est la suivante :


• Le premier paramètre est le nom du fichier .load-or


• Le deuxième paramètre est le chemin (ayant Trainset comme chemin de base) où réside le fichier .load-or


• Le troisième paramètre indique où le conteneur est affecté sur le wagon


• Le quatrième paramètre, qui est facultatif, définit l'état de chargement du conteneur associé, qui est utilisé pour dériver le poids du conteneur. Si Empty est présent, le poids du conteneur vide est utilisé comme poids réel ; si Chargé est présent, le poids maximum (tare + charge utile) du conteneur est utilisé ; si Aléatoire est présent, le poids est calculé comme suit : un nombre aléatoire entre 0 et 100 est généré. Si le nombre est inférieur à 31, le conteneur est considéré comme vide ; sinon, le nombre est utilisé comme pourcentage du poids maximum du conteneur (tare + charge utile). Le poids des conteneurs est ajouté au poids à vide du wagon pour calculer le poids total du wagon. Si le paramètre n'est pas présent, la valeur Aléatoire est supposée.


L'entrée pour le conteneur alloué ci-dessus doit être la dernière.


Les entrées CenterFront et CenterRear doivent être saisies après les entrées Front ou Rear.


L'avantage de ce type d'allocation est que, pour un seul fichier .wag (dans l'exemple DTTX_620040_A.wag), plusieurs configurations de conteneurs possibles sont possibles, ce qui évite de créer de nombreux fichiers .wag qui ne diffèrent que par les conteneurs chargés.


Ci-dessous une image avec un exemple d'entrée dans le fichier .con :

Attribution via le fichier .wag


Les créateurs de contenu pourraient préférer fournir des packs de wagons préchargés. Par conséquent, il est également possible de définir dans le fichier .wag les conteneurs à charger au démarrage.


Une entrée FreightAnimations minimale dans un fichier .wag pour avoir le même ensemble de conteneurs préchargés que dans le paragraphe précédent est la suivante :


ORTSFreightAnims (

WagonEmptyWeight ( 12.575t )

LoadingAreaLength ( 14.6 )

AboveLoadingAreaLength ( 16.15 )

DoubleStacker ()

Offset( 0 0.34 0 )

IntakePoint ( 0 6.0 Container)

LoadData ( 20cmacgm common.containerdata CenterFront Empty)

LoadData ( 20hamburgsud common.containerdata CenterRear Loaded)

LoadData ( 40msc common.containerdata Above Random)

)


Comme on peut le voir, la syntaxe des entrées LoadData est la même que dans le cas du fichier .con. Ici aussi, le quatrième paramètre est facultatif.


Évidemment, en utilisant des fichiers .wag pour ce type d'informations, un fichier .wag différent doit être créé pour chaque ensemble de conteneurs préchargé souhaité.


Un seul fichier .con peut inclure des entrées Wagon pour les deux types de définition d'allocation.


9.4.6 Station de conteneurs


La Container Station est composée d'une grue à conteneurs et d'une zone de stockage de conteneurs.


Pour insérer une Station Conteneur dans un itinéraire, son objet doit être présent dans le fichier .ref en tant qu'objet Pickup. Un exemple d'entrée de fichier .ref est le suivant :


Pickup (

Class ( "Animated loader" )

Filename ( RMG_45.s )

PickupType ( _FUEL_COAL_ )

Description ( "Animated container crane" )

)


PickupType est défini sur _FUEL_COAL, mais cela sera écrasé par les données insérées dans le fichier d'extension .w (voir ici) dans le sous-dossier Openrails du dossier World.


Ce fichier d'extension .w est formé d'une partie générale, d'une partie liée à la grue à conteneurs et d'une partie liée aux emplacements de pile, comme dans l'exemple suivant (parties séparées par des lignes vides)


SIMISA@@@@@@@@@@JINX0w0t______


Tr_Worldfile (

Pickup (

UiD ( 21 )

PickupType ( 15 1 )

ORTSPickingSurfaceYOffset ( 2.25 )

ORTSPickingSurfaceRelativeTopStartPosition ( 0 6.75 0 )

ORTSGrabberArmsParts ( 2 )

ORTSCraneSound ( "ContainerCrane.sms" )

ORTSMaxStackedContainers ( 2 )

ORTSStackLocationsLength ( 12.19 )

ORTSStackLocations ( 12

StackLocation (

Position ( -10 0 26 )

Length ( 16.15 )

)

StackLocation (

Position ( -10 0 26 )

MaxStackedContainers ( 1 )

Flipped ( 1 )

)

StackLocation (

Position ( -10 0 0 )

MaxStackedContainers ( 2 )

)

StackLocation (

Position ( -10 0 0 )

Flipped ( 1 )

)

StackLocation (

Position ( -10 0 -26 )

)

StackLocation (

Position ( -10 0 -26 )

Flipped ( 1 )

Length ( 16.15 )

)

StackLocation (

Position ( -7 0 26 )

Length ( 16.15 )

)

StackLocation (

Position ( -7 0 26 )

Flipped ( 1 )

)

StackLocation (

Position ( -7 0 0 )

)

StackLocation (

Position ( -7 0 0 )

Flipped ( 1 )

)

StackLocation (

Position ( -7 0 -26 )

)

StackLocation (

Position ( -7 0 -26 )

Flipped ( 1 )

Length ( 16.15 )

)

)

)

)


• Le numéro UiD doit correspondre au numéro uiD que le pick-up a dans le fichier principal .w.


• PickupType ( 15 1 ) identifie ce pick-up comme étant un poste à conteneurs.


Plus d'un bloc Pickup() peut être présent dans un tel fichier d'extension, un pour chaque station de conteneur présente dans l'itinéraire.


Les données liées à la grue à conteneurs et à l'emplacement de la pile sont décrites à un endroit pratique ci-dessous.


Règles de développement du fichier de forme de la station de conteneurs (y compris la grue à conteneurs)


• Le fichier de forme doit avoir son axe Z aligné avec la voie où les wagons à charger ou à décharger restent.


• Le zéro Z du fichier de forme doit être au milieu du segment que la grue peut couvrir dans son mouvement (par exemple, la portée Z de la grue peut être de -30 mètres à 30 mètres).


• L'animation de la partie de la grue se déplaçant le long de l'axe Z doit s'appeler ZAXIS.


• L'animation de la partie de la grue se déplaçant transversalement le long de l'axe X doit s'appeler XAXIS, et doit être hiérarchiquement dépendante de ZAXIS.


• L'animation de la partie de la grue se déplaçant verticalement le long de l'axe Y doit s'appeler YAXIS, et doit être hiérarchiquement dépendante de XAXIS.


• Les pinces sont les bras extensibles qui saisissent le conteneur. Dans le cas le plus simple, il y a deux sections, une s'étendant vers Z positif pour les conteneurs plus longs, et une s'étendant vers Z négatif. La première doit être appelée GRABBER01 et la seconde GRABBER02. Les deux doivent être hiérarchiquement dépendants de YAXIS. Dans le cas le plus complexe, chacun des deux "bras" est composé de deux parties, qui se déplacent comme un télescope. Ce second couple de bras doit s'appeler GRABBER01_O2 et GRABBER02_02. Ils doivent être hiérarchiquement dépendants de GRABBER01 et GRABBER02. Les plages de GRABBER01 et GRABBER02 doivent être symétriques, et il en va de même pour les autres paires de plages. De plus les portées de GRABBER01 et GRABBER01_02 doivent être égales (et symétriquement aussi l'autre couple).


• Les noms des parties du câble qui ont un mouvement partiellement autonome le long de l'axe Y (pour simuler l'enroulement et le déroulement du câble) doivent commencer par CABLE et doivent être hiérarchiquement dépendants de YAXIS.


Le diagramme suivant, extrait de Shape Viewer, résume les règles ci-dessus.

Voici les entrées d'animation significatives du fichier de formes d'une grue :


animations ( 1

animation ( 2 30

anim_nodes ( 30

anim_node MAIN (

controllers ( 0 )

)

...

anim_node ZAXIS (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 -139.5 )

linear_key ( 12 0 0 139.5 )

linear_key ( 24 0 0 -139.5 )

)

)

)

anim_node XAXIS (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 0 )

linear_key ( 3 26.4 0 0 )

linear_key ( 6 0 0 0 )

)

)

)

...

anim_node YAXIS (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 11.7 0 )

linear_key ( 2 0 0 0 )

linear_key ( 4 0 11.7 0 )

)

)

)

anim_node GRABBER02 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 -2.515 )

linear_key ( 1 0 0 0 )

linear_key ( 2 0 0 -2.515 )

)

)

)

anim_node GRABBER02_02 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 -2.513 )

linear_key ( 1 0 0 0 )

linear_key ( 2 0 0 -2.513 )

)

)

)

anim_node GRABBER01 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 2.515 )

linear_key ( 1 0 0 0 )

linear_key ( 2 0 0 2.515 )

)

)

)

anim_node GRABBER01_02 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 0 2.513 )

linear_key ( 1 0 0 0 )

linear_key ( 2 0 0 2.513 )

)

)

)

...

anim_node CABLE02 (

controllers ( 1

linear_pos ( 3

linear_key ( 0 0 22.32 0 )

linear_key ( 1 0 15.72 0 )

linear_key ( 2 0 22.32 0 )

)

)

)

...

)

)

)


On peut noter que le nombre d'images est différent pour différents nœuds d'animation, par ex. le ZAXIS a 0, 12, 24. Cela permet de réduire la vitesse de mouvement le long de cet axe à une valeur réaliste.


Paramètres du fichier d'extension .w liés à la grue et à ses animations


• ORTSPickingSurfaceYO set ( 0.0 ) : le décalage en Y de la face inférieure des pinces (celle qui entre en contact avec la face supérieure du conteneur) lorsque YAXIS est égal à 0


• ORTSPickingSurfaceRelativeTopStartPosition ( 0 11.7 0 ) : les valeurs de XAXIS, YAXIS et ZAXIS au début du jeu (doivent être centrées sur l'axe Z, au-dessus des rails et à hauteur maximale)


• ORTSGrabberArmsParts ( 4 ) : vaut 4 s'il y a les quatre animations GRABBER01, GRABBER02, GRABBER01_02 et GRABBER02_02 ; vaut 2 s'il n'y a que GRABBER01 et GRABBER02


• ORTSCraneSound ( "ContainerCrane.sms" ) : nom et chemin du fichier son de la grue ; le chemin est basé sur le dossier SOUND de la route ; si le fichier n'y est pas trouvé, le chemin devient basé sur le dossier SOUND de TRAIN SIMULATOR. Les déclencheurs sonores discrets spécifiques disponibles sont répertoriés ici.


Emplacements des piles


Dans la zone accessible par la grue à conteneurs (zone des rails à part), les emplacements de pile où les conteneurs peuvent être déposés peuvent être définis dans le fichier d'extension .w.


Les emplacements de pile sont définis par les paramètres suivants :


• Position : les coordonnées du point central d'un des petits côtés de l'emplacement de la pile ; si aucune ligne inversée (1) n'est présente, la zone de localisation s'étend vers l'axe Z croissant ; si à la place une telle ligne est présente, la zone de localisation s'étend vers l'axe Z décroissant. Si deux emplacements de pile ont la même position, et que l'un est retourné et l'autre non, les conteneurs seront posés dos à dos, optimisant ainsi l'espace utilisé.


• Longueur : la longueur maximale des conteneurs pouvant être déposés sur cet emplacement de pile


• MaxStackedContainers : le nombre maximal de conteneurs pouvant être empilés les uns au-dessus des autres sur cet emplacement de pile


Les paramètres Length et MaxStackedContainers sont facultatifs et, lorsqu'ils sont présents, remplacent les valeurs par défaut présentes dans ORTSStackLocationsLength et ORTSMaxStackedContainers.


Si ORTSStackLocationsLength est supérieur ou égal à 12,20 m, soit deux fois la longueur d'un conteneur de 20 pieds, Open Rails applique une stratégie d'optimisation de l'espace : pour chaque emplacement de pile (appelons-le l'emplacement de la pile mère), un autre (appelons-le l'enfant emplacement de la pile) est créé sur une position avec une valeur Z supérieure de 6,095 m à l'emplacement de la pile mère (si cette dernière est inversée, la valeur Z est inférieure de 6,095 m). Cet emplacement de pile enfant ne peut être occupé que par un conteneur de 20 pieds, et uniquement si l'emplacement de pile mère est vide ou occupé également par un conteneur de 20 pieds. L'emplacement de pile enfant a un index qui est égal à l'index d'emplacement de pile mère plus le nombre total d'emplacements de pile mère. Une fois que les emplacements de pile mère et enfant sont vides, l'emplacement de pile mère est à nouveau disponible pour tout type de conteneur de longueur appropriée.


Un autre exemple d'un code d'attribution d'emplacements de pile et de sa contrepartie physique dans la station de conteneur suit. On peut noter que l'emplacement de pile 0 contient un conteneur de 20 pieds, ainsi que son emplacement de pile enfant 10. Il en va de même pour l'emplacement de pile 3 et son emplacement de pile enfant 13.

Population des stations de conteneurs au début du jeu


Les stations de conteneurs peuvent être peuplées au début du jeu. Cela se produit en insérant un fichier .load-stations-loads-or dans le sous-dossier Openrails du dossier "Activities" de l'itinéraire, et en insérant la ligne suivante au bas de Tr_Activity_Header dans les fichiers .act


ORTSLoadStationsPopulation ( BigContainerStationPopulation )


où BigContainerStationPopulation est le nom du fichier .load-stations-loads-or . Pour le moment, la population au début du jeu n'est possible qu'en mode Activité.


Le fichier .load-stations-loads-or est un fichier Json. Un exemple est montré ci-dessous


"ContainerStationsPopulation": [

{

"LoadStationID" : { "wfile" : "w-005354+014849.w", "UiD" : 21, },

"LoadData" : [

{ "File" : "40HCcai", "Folder" : "common.containerdata",

˓→"StackLocation" : 0, "LoadState" : "Empty"},

{ "File" : "40HCcai", "Folder" : "common.containerdata",

˓→"StackLocation" : 0, "LoadState" : "Loaded"},

{ "File" : "20cmacgm", "Folder" : "common.containerdata",

˓→"StackLocation" : 2, "LoadState" : "Random"},

{ "File" : "20kline", "Folder" : "common.containerdata",

˓→"StackLocation" : 2, },

{ "File" : "45HCtriton", "Folder" : "common.containerdata",

˓→"StackLocation" : 5, },

{ "File" : "45HCtriton", "Folder" : "common.containerdata",

˓→"StackLocation" : 5, },

{ "File" : "48emp", "Folder" : "common.containerdata",

˓→"StackLocation" : 6, },

{ "File" : "20maersk", "Folder" : "common.containerdata",

˓→"StackLocation" : 14, },

{ "File" : "20maersk3", "Folder" : "common.containerdata",

˓→"StackLocation" : 14, },

]

},

{

"LoadStationID" : { "wfile" : "w-005354+014849.w", "UiD" : 210, },

"LoadData" : [

...

]

},

...

]

}


Le fichier peut définir la population au démarrage de plusieurs stations de conteneurs.


• Le LoadStationID contient les informations nécessaires pour identifier la station de conteneur.


• Le tableau LoadData contient les données pour remplir la station conteneur.


• La valeur de File est le nom du fichier .load-or identifiant le conteneur.


• La valeur de Dossier est le chemin où le .load-or peut être trouvé, à partir de la TRAINSET.


• La valeur de StackLocation est l'index de Stack Location. Si l'index est égal ou supérieur au nombre d'emplacements de pile défini dans le fichier d'extension .w, l'index fait référence à un emplacement de pile enfant.


• Si plusieurs conteneurs sont définis pour un emplacement de pile, ils sont empilés les uns au-dessus des autres.


• Le paramètre LoadState est facultatif et a la même signification et les mêmes valeurs que le paramètre du même nom qui peut être présent dans les fichiers .con ou .wag.


Le fichier de population de la station de conteneurs doit être écrit en tenant compte des contraintes des emplacements de pile (la longueur du conteneur doit être inférieure à la longueur de l'emplacement de la pile, les conteneurs empilés ne peuvent pas dépasser le nombre autorisé, un emplacement de pile doit contenir des conteneurs de même longueur).


9.5 Plusieurs points de vue des passagers


Des points de vue passagers supplémentaires peuvent être ajoutés dans une voiture qui est dotée d'un point de vue passager.


Ces points de vue passagers supplémentaires sont définis dans un fichier inclus au format indiqué dans l'exemple suivant pour l'ancien wagon MSTS oebarcar.wag (situé dans le dossier 380) :


include ( ../oebarcar.wag )

Wagon (

ORTSAlternatePassengerViewPoints (

ORTSAlternatePassengerViewPoint (

PassengerCabinHeadPos ( -0.0 2.85801 -6.091 )

RotationLimit ( 50 270 0 )

StartDirection ( 0 0 0 )

)

ORTSAlternatePassengerViewPoint (

PassengerCabinHeadPos ( -0.5 2.35801 -1.791 )

RotationLimit ( 50 270 0 )

StartDirection ( 0 0 0 )

)

ORTSAlternatePassengerViewPoint (

PassengerCabinHeadPos ( 0.9 2.35801 -1.791 )

RotationLimit ( 50 270 0 )

StartDirection ( -5 -90 0 )

)

)

)


A l'exécution, en vue passager, le joueur peut passer d'un point de vue à l'autre en appuyant sur Maj-5.


9.6 Animation de cloche


Open Rails prend en charge l'animation de cloche. La matrice d'animation de cloche doit être nommée ORTSBELL dans le fichier .s du moteur. Sa fréquence d'images par défaut est de 8 images par seconde. La fréquence d'images par défaut peut être modifiée via le paramètre facultatif ESD_ORTSBellAnimationFPS (n), à insérer dans le fichier .sd lié au fichier .s. n définit le FPS de l'animation. Il est conseillé que le flux sonore associé dans le fichier .sms soit synchronisé avec l'animation visible. Pour ce faire, le fichier .wav doit contenir deux coups de cloche, dont l'intervalle de temps est égal à l'intervalle de temps d'une oscillation de cloche d'un point d'extrémité d'oscillation au point d'extrémité opposé. Comme le premier coup de cloche ne doit pas commencer immédiatement, mais lorsque la cloche est à peu près au maximum de la balançoire, le premier coup dans le fichier .wav doit être à la distance temporelle équivalente à l'oscillation du point central à un point final d'oscillation. Le fichier doit avoir un point de repère au début et un après l'intervalle de temps d'un mouvement de cloche complet vers l'avant et vers l'arrière, et doit avoir un fondu final pour un meilleur résultat.


9.7 Animation du coupleur et du tuyau d'air


Open Rails prend en charge l'animation des coupleurs et des tuyaux d'air. L'animation du coupleur déplacera les coupleurs et les flexibles d'air au fur et à mesure que le train se déplace et que le jeu du coupleur augmente ou diminue. Les attelages tourneront également lorsque le train se déplacera dans une courbe.


Pour mettre en œuvre cela, des modèles séparés doivent être fournis pour les coupleurs et les tuyaux d'air. Un modèle distinct pour l'état couplé et découplé est proposé.


Pour activer l'animation du coupleur, les paramètres suivants doivent être inclus dans la section du code du coupleur du fichier WAG :


FrontCouplerAnim - Forme du coupleur à afficher à l'avant de la voiture lorsqu'elle est couplée.


FrontCouplerOpenAnim - Forme du coupleur à afficher à l'avant de la voiture lorsqu'elle est désaccouplée.


RearCouplerAnim - Forme du coupleur à afficher à l'arrière de la voiture lorsqu'elle est couplée.


RearCouplerOpenAnim - Forme du coupleur à afficher à l'arrière de la voiture lorsqu'elle est désaccouplée


Les quatre éléments ci-dessus auront le format suivant :


CouplerAnimation ( couplershape.s, x, y, z ) où le nom du fichier de la forme du coupleur est inclus avec les valeurs x, y, z qui décalent le coupleur sur les trois axes.


Pour l'animation du tuyau d'air, les paramètres suivants doivent être inclus dans la section du code de coupleur du fichier WAG :


FrontAirHoseAnim - Forme du tuyau d'air à afficher à l'avant de la voiture lorsqu'elle est couplée. FrontAirHoseDisconnectedAnim - Forme du tuyau d'air à afficher à l'avant de la voiture lorsqu'elle est désaccouplée. RearAirHoseAnim - Forme du tuyau d'air à afficher à l'arrière de la voiture lorsqu'elle est couplée. RearAirHoseDisconnectedAnim - Forme du tuyau d'air à afficher à l'arrière de la voiture lorsqu'elle est désaccouplée.


Chacun de ces paramètres aura le même format que celui indiqué ci-dessus pour les formes de coupleur.


Les rails ouverts utilisent certaines valeurs par défaut pour calculer le mouvement et les angles requis pour le mouvement de la forme du coupleur et du tuyau d'air, mais pour une plus grande précision, le modélisateur peut ajouter des valeurs spécifiques telles que ORTSLengthAirHose. De plus, les valeurs de longueur suggérées dans le coefficient de déraillement doivent également être ajoutées.


9.8 Portes passagers


Les portes passagers s'ouvrent et se ferment (par défaut) à l'aide des touches <Q> et <Maj+Q>. Il est possible d'ajouter des retards d'ouverture et de fermeture, ce qui peut être utile pour retarder l'indication « Portes fermées » jusqu'à ce que toutes les portes soient complètement fermées. Les retards peuvent être ajoutés en insérant le bloc suivant dans la section wagon de n'importe quel fichier ENG ou WAG :


ORTSDoors (

ClosingDelay ( 5s )

OpeningDelay ( 1s )

)


9.9 Scripts du moteur C#


Pour simuler un comportement particulièrement complexe, Open Rails fournit une interface de script C# pour un certain nombre de systèmes sur la locomotive du joueur. Comme le programme Open Rails lui-même, ces scripts sont écrits dans des fichiers .cs contenant des classes C #, mais ils sont compilés et liés au moment de l'exécution, de sorte qu'ils ne dépendent pas des modifications apportées au programme principal lui-même et peuvent être distribués avec le contenu du matériel roulant. Les scripts s'exécuteront s'ils sont référencés par des champs spécifiques OR dans le fichier .eng.


Tableau 1 : Systèmes de locomotives actuellement scriptables

Système C# class .eng block
Contrôleur de frein de train ORTS.Scripting.Api. BrakeController Engine ( ORTSTrainBrakeController ( "DemoBrakes.cs" ) )
Contrôleur de frein moteur ORTS.Scripting.Api. BrakeController Engine ( ORTSEngineBrakeController ( "DemoBrakes.cs" ) )
Disjoncteur ORTS.Scripting.Api. CircuitBreaker Engine ( ORTSCircuitBreaker ( "DemoBreaker.cs" ) )
Relais de coupure de traction ORTS.Scripting.Api. TractionCutOffRelay Engine ( ORTSTractionCutOffRelay ( "DemoRelay.cs" ) )
Alimentation diesel ORTS.Scripting.Api. DieselPowerSupply Engine ( ORTSPowerSupply ( "DemoPower.cs" ) )
Alimentation électrique ORTS.Scripting.Api. ElectricPowerSupply Engine ( ORTSPowerSupply ( "DemoPower.cs" ) )
Alimentation électrique des voitures de tourisme ORTS.Scripting.Api. PassengerCarPowerSupply Wagon ( ORTSPowerSupply ( "DemoPower.cs" ) )
Système de contrôle des trains ORTS.Scripting.Api. TrainControlSystem Engine ( ORTSTrainControlSystem ( "DemoTCS.cs" ) )

Les scripts résident dans un sous-dossier Script du dossier du moteur et doivent contenir une classe nommée d'après le nom de fichier du script. Par exemple, si le nom de fichier du script est AmtrakTCS.cs, OU recherchera une seule classe nommée AmtrakTCS. (Il est également possible de placer le script dans un autre emplacement, tel qu'un dossier Common.Script dans le dossier TRAINSET, en ajoutant le nombre approprié de jetons de répertoire parent ..\ par rapport au dossier Script du moteur.) Le code du script s'exécute sur le fil UpdaterProcess. Cet exemple, qui devrait être placé dans un fichier nommé DemoTCS.cs, illustre le code minimum requis pour un script Train Control System :


using System;

using ORTS.Scripting.Api;

namespace ORTS.Scripting.Script

{

class DemoTCS : TrainControlSystem

{

public override void HandleEvent(TCSEvent evt, string message) {}

public override void Initialize()

{

Console.WriteLine("TCS activated!");

}

public override void SetEmergency(bool emergency) {}

public override void Update() {}

}

}


Notez que la classe du script doit résider dans l'espace de noms ORTS.Scripting.Script et qu'elle sous-classe la classe abstraite du système souhaité. Il fait également référence à des assemblys externes avec des directives using. OR rend les assemblys .NET suivants disponibles pour les scripts :


• System


• System.Core


• ORTS.Common


• Orts.Simulation


Les scripts communiquent avec le simulateur en appelant des méthodes dans la classe de base. Par exemple, ce script peut invoquer la méthode TrainLengthM() de la classe TrainControlSystem, qui renvoie la longueur du train du joueur. D'autres méthodes sont disponibles dans la classe ORTS.Scripting.Api.AbstractScriptClass, dont TrainControlSystem est lui-même une sous-classe.


Enfin, si un script contient une erreur de syntaxe ou de frappe, OR enregistrera une exception pendant le processus de chargement et exécutera la simulation sans elle.


9.9.1 Développement de scripts avec Visual Studio


Bien qu'il soit certainement possible de développer des scripts avec un éditeur de texte brut, les aides à la complétion de code et au débogage disponibles dans un IDE comme Visual Studio permettent une expérience de programmation beaucoup plus confortable. Si vous avez un environnement de développement configuré pour créer Open Rails, vous pouvez utiliser Visual Studio pour modifier votre


scripts avec ces conforts de créature. Voici une suggestion de flux de travail :


1. Tout d'abord, dans votre copie du code source OR, faites une copie de votre fichier Source\ORTS.sln. Conservez-le dans le dossier Source\, mais donnez-lui un nouveau nom comme ORTS_Scripts.sln. (Vous pouvez également modifier la solution ORTS d'origine, mais vous devez alors vous rappeler de ne pas l'enregistrer dans le contrôle de code source.) Ajoutez un nouveau projet à la solution et sélectionnez le projet .NET vide.


2. Dans la boîte de dialogue de configuration, définissez le nouveau projet à ajouter à la solution existante, définissez son emplacement sur le dossier du moteur que vous créez et définissez son nom sur "Script". (Pour l'instant, vous devez utiliser "Script", mais vous pouvez renommer le projet après sa création.) Vous pouvez laisser la version du framework .NET définie sur sa valeur par défaut. Ensuite, créez le projet.

3. Le nouveau dossier de projet devient le sous-dossier Script dans lequel OU recherchera les scripts. Ajoutez des références aux assemblys ORTS.Common et Orts.Simulation, qui activeront les fonctionnalités IntelliSense dans votre éditeur lorsque vous modifiez des scripts. Vous pouvez maintenant renommer le projet comme vous le souhaitez (ce qui ne renommera pas le dossier) et supprimer le fichier App.config prégénéré.

4. Enfin, ouvrez le Build Configuration Manager et définissez le nouveau projet de script pour qu'il ne soit pas généré pour les configurations Debug et Release.

Avec cette configuration, Visual Studio vérifie le type de vos scripts et fait des suggestions lorsque vous utilisez l'API Open Rails. Vous pouvez également définir des points d'arrêt dans votre script, qui seront interceptés par RunActivity.exe s'il est exécuté dans Visual Studio.

Notez que Visual Studio utilise des chemins relatifs, donc si jamais vous déplacez des dossiers, vous devrez corriger les références à la main.


9.9.2 Contrôleur de frein


Le script du contrôleur de frein personnalise le comportement des freins du train, permettant une bien plus grande fidélité des systèmes par rapport à ce qui est possible avec le modèle hérité de MSTS. À cette fin, le script peut lire l'état des commandes de frein et régler les pressions d'air des réservoirs de frein.


Utilisez le paramètre .eng suivant pour charger un script de contrôleur de frein :


Engine (

ORTSTrainBrakeController ( "YourBrakes.cs" )

)


or:


Engine (

ORTSEngineBrakeController ( "YourBrakes.cs" )

)


L'extension .cs est facultative. "MSTS" charge l'implémentation compatible MSTS par défaut, n'utilisez donc pas ce nom pour votre propre script.


9.9.3 Disjoncteur


Disponible uniquement pour les locomotives électriques. Le script du disjoncteur contrôle le comportement du disjoncteur de la locomotive.


Utilisez le paramètre .eng suivant pour charger un script de disjoncteur :


Engine (

ORTSCircuitBreaker ( "YourCB.cs" )

ORTSCircuitBreakerClosingDelay ( 2s )

)


ORTSCircuitBreaker fait référence au script du disjoncteur dans le sous-dossier Script du moteur. Pour ce champ, l'extension .cs est facultative. « Automatique » et « Manuel » chargent l'implémentation du disjoncteur OU générique, donc n'utilisez pas ces noms pour votre propre script.


ORTSCircuitBreakerClosingDelay fait référence au retard entre la commande de fermeture du disjoncteur et la fermeture effective du disjoncteur.


9.9.4 Relais de coupure de traction


Disponible uniquement pour les locomotives diesel. Le script du relais de coupure de traction contrôle le comportement du relais de coupure de traction de la locomotive.


Utilisez le paramètre .eng suivant pour charger un script de relais de coupure de traction :


Engine (

ORTSTractionCutOffRelay ( "YourTCOR.cs" )

ORTSTractionCutOffRelayClosingDelay ( 2s )

)


ORTSTractionCutOffRelay fait référence au script de relais de coupure de traction dans le sous-dossier Script du moteur. Pour ce champ, l'extension .cs est facultative. "Automatique" et "Manuel" chargent l'implémentation générique du relais de coupure de traction OU, n'utilisez donc pas ces noms pour votre propre script.


ORTSTractionCutOffRelayClosingDelay fait référence au délai entre la commande de fermeture du relais de coupure de traction et la fermeture effective du relais.


9.9.5 Alimentation diesel et électrique


Disponible uniquement pour les locomotives diesel et électriques. Le script d'alimentation détermine si la locomotive est utilisable ou non (voir aussi la description de l'alimentation diesel et de l'alimentation électrique) compte tenu de la tension de ligne actuelle, de la position du pantographe, de l'état du disjoncteur, etc. Il est également capable de


interdisant certaines opérations liées à l'alimentation si certaines conditions ne sont pas remplies.


Utilisez le paramètre .eng suivant pour charger un script d'alimentation :


Engine (

ORTSPowerSupply ( "YourEPS.cs" )

ORTSPowerOnDelay ( 5s )

ORTSAuxPowerOnDelay ( 10s )

)


ORTSPowerSupply fait référence au script d'alimentation dans le sous-dossier Script du moteur. Pour ce champ, l'extension .cs est facultative. "Default" chargera l'implémentation générique de l'alimentation OU, donc n'utilisez pas ce nom pour votre propre script.


ORTSPowerOnDelay fait référence au délai entre la fermeture du disjoncteur ou du relais de coupure de traction et la disponibilité de la puissance pour la traction.


ORTSAuxPowerOnDelay fait référence au délai entre la fermeture du disjoncteur ou du relais de coupure de traction et la disponibilité de l'alimentation pour les systèmes auxiliaires.


9.9.6 Alimentation VP


Disponible pour les voitures particulières utilisant le chauffage électrique. Le script d'alimentation détermine si les systèmes des voitures sont alimentés ou non et calcule la consommation d'énergie sur l'alimentation du train électrique.


Si la locomotive est une locomotive diesel, la puissance consommée par les voitures n'est plus disponible pour la traction.


Utilisez le paramètre .wag suivant pour charger un script d'alimentation :


Wagon (

ORTSPowerSupply ( "YourEPS.cs" )

ORTSPowerOnDelay ( 5s )

ORTSPowerSupplyContinuousPower ( 500W )

ORTSPowerSupplyHeatingPower ( 2kW )

ORTSPowerSupplyAirConditioningPower ( 3kW )

ORTSPowerSupplyAirConditioningYield ( 0.9 )

ORTSHeatingCompartmentTemperatureSet ( 20degC )

)


ORTSPowerSupply fait référence au script d'alimentation dans le sous-dossier Script du wagon. Pour ce champ, l'extension .cs est facultative. "Default" chargera l'implémentation générique de l'alimentation OU, donc n'utilisez pas ce nom pour votre propre script.


ORTSPowerOnDelay fait référence au délai entre la disponibilité de l'alimentation sur le câble d'alimentation du train électrique et la disponibilité de l'alimentation pour les systèmes (par exemple, le démarrage du convertisseur de puissance statique).


ORTSPowerSupplyContinuousPower fait référence à la puissance consommée en continu (par exemple, chargeurs de batterie, lumières, etc.).


ORTSPowerSupplyHeatingPower fait référence à la puissance consommée lorsque le chauffage est actif.


ORTSPowerSupplyAirConditioningPower fait référence à la puissance consommée lorsque la climatisation (refroidissement) est active.


ORTSPowerSupplyAirConditioningYield fait référence au rendement de la climatisation (rapport du débit thermique par la puissance électrique du système de climatisation).


ORTSHeatingCompartmentTemperatureSet fait référence à la température souhaitée à l'intérieur de la voiture.


9.9.7 Système de contrôle des trains


Général


Le script Train Control System, ou TCS, est destiné à modéliser les systèmes de sécurité des trains et de signalisation en cabine. Il peut manipuler les commandes et les affichages de limite de vitesse de la locomotive, imposer des freinages de pénalité, lire les aspects des signaux et les limites de vitesse à venir et émettre des sons d'avertissement. Utilisez les paramètres .eng suivants pour charger un script TCS :


Engine (

ORTSTrainControlSystem ( "YourTCS.cs" )

ORTSTrainControlSystemParameters ( "YourTCS.ini" )

ORTSTrainControlSystemSound ( "YourTCSSounds.sms" )

)


ORTSTrainControlSystem fait référence au script TCS dans le sous-dossier Script du moteur. Pour ce champ, l'extension .cs est facultative.


ORTSTrainControlSystemParameters, un champ facultatif, fait référence à un fichier .ini, également dans le sous-dossier Script, dont les paramètres seront mis à la disposition du script TCS via les méthodes GetBoolParameter(), GetIntParameter(), GetFloatParameter() et GetStringParameter() du Classe TrainControlSystem. Ce fichier .ini permet une personnalisation aisée du comportement du script TCS par les utilisateurs finaux.


Voici un extrait d'un fichier .ini :


[General]

AWSMonitor=true

EmergencyStopMonitor=false

VigilanceMonitor=true

OverspeedMonitor=false

DoesBrakeCutPower=true

BrakeCutsPowerAtBrakeCylinderPressureBar=

[AWS]

Inhibited=false

WarningTimerDelayS=3

BrakeImmediately=false

TrainStopBeforeRelease=false

ActivationOnSpeedLimitReduction=true

SpeedLimitReductionForActivationMpS=11.176

BeaconDistanceToPostM=1186

AppliesCutsPower=true


Comme on peut le voir, le fichier .ini est divisé en sous-groupes. Par exemple, le paramètre [AWS]Inhibited serait lu par la ligne de code suivante dans le script :


AWSInhibited = GetBoolParameter("AWS", "Inhibited", false);


où le faux final est la valeur par défaut, si le paramètre est introuvable.


ORTSTrainControlSystemSound, un champ facultatif, fait référence à un fichier .sms soit dans le dossier SOUND du moteur, soit dans le dossier global SOUND. Si elle est fournie, OR chargera cette bibliothèque de sons avec les sons de cabine standard de la locomotive. Le script TCS peut lire des sons à l'aide de l'une des méthodes TriggerSound... de la classe de base, qui à leur tour activent les déclencheurs discrets liés au TCS numérotés de 109 à 118.


8 déclencheurs sonores discrets génériques supplémentaires sont disponibles, nommés GenericEvent1 à GenericEvent8 et accessibles au script par des lignes comme celle-ci :


SignalEvent(Event.GenericEvent1);


Accès aux méthodes et variables de simulation


La classe abstraite pour les scripts TCS fournit un nombre important de méthodes pour accéder aux variables d'intérêt pour le TCS : par exemple :


public Func<int, Aspect> NextSignalAspect ;


peut être appelé dans le script comme suit :


var NextSignalAspect = NextSignalAspect(1);


qui renverrait l'aspect du deuxième signal normal devant le train du joueur.


Cependant, il est tout à fait impossible de prévoir tous les besoins d'un script TCS et de fournir une méthode pour chacun de ces besoins. Pour cette raison, la méthode suivante est disponible :


public Func<MSTSLocomotive> Locomotive ;


qui renvoie un handle pour l'instance de locomotive du joueur de la classe MSTSLocomotive. Grâce à ce handle, toutes les classes, méthodes et variables publiques de l'environnement OR Simulation sont accessibles dans le script.


La classe Train Control System fournit le champ ETCSStatus, qui contrôle les informations à afficher dans l'ETCS DMI. Par exemple, le bloc suivant ordonne au DMI d'afficher l'indicateur de vitesse circulaire en jaune lorsque le train approche d'une limitation de vitesse :


ETCSStatus.CurrentMonitor = Monitor.TargetSpeed;

ETCSStatus.CurrentSupervisionStatus = SupervisionStatus.Indication;

ETCSStatus.TargetDistanceM = 1234.5f;

ETCSStatus.AllowedSpeedMpS = 50;

ETCSStatus.InterventionSpeedMpS = 52.5f;

ETCSStatus.TargetSpeedMpS = 25;


Freinage d'urgence déclenché par le simulateur


Les freinages d'urgence déclenchés par le simulateur sont toujours envoyés au script TCS.


Deux fonctions sont utilisées pour transmettre ces informations :


public override void HandleEvent(TCSEvent evt, string message)


Les événements envoyés sont EmergencyBrakingRequestedBySimulator, EmergencyBrakingReleasedBySimulator et ManualResetOutOfControlMode. Pour le premier événement, la raison du freinage d'urgence est également envoyée :


• SPAD : le train a dépassé un signal de danger à l'avant du train


• SPAD_REAR : le train a dépassé un signal de danger à l'arrière du train


• MISALIGNED_SWITCH : le train a suivi un aiguillage mal aligné


• OUT_OF_AUTHORITY : le train a dépassé la limite d'autorité


• OUT_OF_PATH : le train a quitté le chemin qui lui a été attribué


• SLIPPED_INTO_PATH : le train est revenu sur la trajectoire d'un autre train


• SLIPPED_TO_ENDOFTRACK : le train a dérapé en bout de voie


• OUT_OF_TRACK : le train est sorti de la voie


Les systèmes de contrôle ont une DMI (interface conducteur-machine) assez sophistiquée, qui peut inclure un écran (écran tactile) et des boutons. Étant donné que les champs d'affichage, les icônes et les boutons sont spécifiques à chaque TCS, un ensemble de commandes génériques de cabview sont disponibles, qui peuvent être personnalisées dans le script TCS. Des contrôles cabview génériques, nommés ORTS_TCS1, ORTS_TCS2, etc. sont disponibles. Tous peuvent être utilisés comme commandes à deux états ou multi-états, comme par exemple :


MultiStateDisplay (

Type ( ORTS_TCS13 MULTI_STATE_DISPLAY )

Position ( 405 282.3 36.3 20.8 )

Graphic ( ../../Common.Cab/Cruscotto_SCMT/Ripetizioni_estese.ace )

States ( 6 3 2

State (

Style ( 0 )

SwitchVal ( 0 )

)

State (

Style ( 0 )

SwitchVal ( 1 )

)

State (

Style ( 0 )

SwitchVal ( 2 )

)

State (

Style ( 0 )

SwitchVal ( 3 )

)

State (

Style ( 0 )

SwitchVal ( 4 )

)

State (

Style ( 0 )

SwitchVal ( 5 )

)

)

)


Ils peuvent également être utilisés comme commandes/affichages à deux états, comme par exemple :


TwoState (

Type ( ORTS_TCS7 TWO_STATE )

Position ( 377 298 9 7.8 )

Graphic ( ../../Common.Cab/Cruscotto_SCMT/Button_SR.ace )

NumFrames ( 2 2 1 )

Style ( PRESSED )

MouseControl ( 1 )

)


Les commandes sont reçues de manière asynchrone par le script via cette méthode :


public override void HandleEvent(TCSEvent evt, string message)


Où evt peut être TCSEvent.GenericTCSButtonPressed ou TCSEvent.GenericTCSButtonReleased et message est une chaîne représentant le numéro de contrôle avec indexation de base zéro (par exemple, "5" correspond à ORTS_TCS6). Les commandes ne peuvent être déclenchées que par la souris, sauf les deux premières qui peuvent également être déclenchées par les combinaisons de touches Ctrl, (virgule) et Ctrl. (période). Voici un extrait de code du script qui gère les commandes :


public override void HandleEvent(TCSEvent evt, string message)

{

if (message == String.Empty)

{

switch (evt)

{

case ...

...

break;

case ...

...

break;

}

}

else

{

var commandEvent = TCSCommandEvent.None;

var messageIndex = 0;

if (Int32.TryParse(message, out messageIndex))

{

commandEvent = (TCSCommandEvent)(messageIndex + 1);

switch (evt)

{

case TCSEvent.GenericTCSButtonPressed:

TCSButtonPressed[(int)commandEvent] = true;

break;

case TCSEvent.GenericTCSButtonReleased:

TCSButtonPressed[(int)commandEvent] = false;

TCSButtonReleased[(int)commandEvent] = true;

break;

}

}

}

}


Dans la méthode Update du script, TCSButtonPressed et TCSButtonReleased peuvent être testés, par exemple :


si (TCSButtonPressed[(int)(TCSCommandEvent.Button_Ric)])


Après l'avoir testé, TCSButtonPressed doit être défini sur false par le code du script.


Vous pouvez également utiliser TCSEvent.GenericTCSSwitchOff et TCSEvent.GenericTCSSwitchOn pour un contrôle cabview représentant un commutateur (style ONOFF au lieu de PRESSED dans le fichier CVF).


Pour demander l'affichage d'un contrôle cabview, méthode :


public Action<int, float> SetCabDisplayControl ;


doit être utilisé, où int est l'indice du contrôle cab (en partant de 0 qui correspond à ORTS_TCS1), et float est la valeur à utiliser pour sélectionner parmi les trames.


Lorsque le joueur déplace la souris sur les commandes de la cabine liées aux commandes, le nom de ces commandes apparaît brièvement à l'écran, comme par ex. « compteur de vitesse », en guise de rappel au joueur. Dans le cas de ces commandes génériques, des chaînes comme "ORTS_TCS1" ou "ORTS_TCS32" apparaîtraient, qui ne sont pas du tout mnémotechniques. Par conséquent, la méthode suivante est disponible :


public Action<int, string> SetCustomizedCabviewControlName ;


qui peut être utilisé de cette manière dans le script :


// Initialize customized TCS cabview control names

SetCustomizedCabviewControlName(0, "AWS acknowledge"); // Sets the name "AWS acknowledge"␣

˓→for the cabview control ORTS_TCS1


de sorte qu'au lieu de ORTS_TCSnn, la chaîne mnémonique associée s'affiche.


9.9.8 Classes auxiliaires


3 classes d'assistance sont disponibles dans l'espace de noms Orts.Scripting.Api :


• Une classe de minuterie


• Une classe d'odomètre


• Une classe clignotante


Minuteur


Le minuteur peut être utilisé pour exécuter du code après un certain temps. Pour utiliser la minuterie, vous devez créer une propriété dans votre classe de script afin de stocker l'objet.


minuterie publique MyTimer ;


Dans le constructeur de votre classe de script, vous devez instancier l'objet et définir le délai du minuteur.


MyTimer = new Timer(this);

MyTimer.Setup(5f); // Sets the timer's delay to 5 seconds


Ensuite, lorsque vous souhaitez démarrer la minuterie, utilisez la fonction Start.


MonTimer.Start();


Si vous souhaitez réinitialiser la minuterie, utilisez la fonction Stop.


MonTimer.Stop();


Lorsque le délai est atteint, la propriété Triggered du temporisateur devient vraie.


si (MyTimer.Triggered)

{

// Faire quelque chose

}


Veuillez noter que lorsque le minuteur est arrêté, la propriété Triggered est fausse.


Odomètre


L'odomètre peut être utilisé pour exécuter du code après qu'une distance a été parcourue par le train. Pour utiliser l'odomètre, vous devez créer une propriété dans votre classe de script afin de stocker l'objet.


compteur kilométrique public MyOdometer ;


Dans le constructeur de votre classe de script, vous devez instancier l'objet et définir la distance à laquelle l'odomètre sera déclenché.


MyOdometer = nouvel odomètre (ceci);


MyOdometer.Setup(200f); // Définit la valeur de déclenchement de l'odomètre à 200 mètres


Ensuite, lorsque vous souhaitez démarrer le compteur kilométrique, utilisez la fonction Start.


MyOdometer.Start();


Si vous souhaitez réinitialiser le compteur kilométrique, utilisez la fonction Stop.


MonOdomètre.Stop();


Lorsque la distance est atteinte, la propriété Triggered de l'odomètre devient vraie.


si (MyOdometer.Triggered)

{

// Faire quelque chose

}


Veuillez noter que lorsque l'odomètre est arrêté, la propriété Triggered est fausse.


Clignotant


Le clignotant peut être utilisé pour faire clignoter une commande de cabine. Pour utiliser le clignotant, vous devez créer une propriété dans votre classe de script afin de stocker l'objet.


Clignotant public MyBlinker ;


Dans le constructeur de votre classe de script, vous devez instancier l'objet et définir la fréquence à laquelle le contrôle cabview clignotera.


MyBlinker = new Blinker(this);


MyBlinker.Setup(6f); // Règle la fréquence du clignotant à 6 Hz


Ensuite, lorsque vous souhaitez démarrer le clignotant, utilisez la fonction Start.


MyBlinker.Start();


Si vous souhaitez réinitialiser le clignotant, utilisez la fonction Stop.


MyBlinker.Stop();


La propriété clignotant On alternera entre vrai et faux à la fréquence définie.


SetCabDisplayControl(0, MyBlinker.On ? 1 : 0);


Veuillez noter que lorsque le clignotant est arrêté, la propriété On est fausse.

Share by: