Créer un mod
Consignes de conduite
Choisissez les cibles, les vitesses, les permissions et les conditions de fin de chaque restriction.
Associer une consigne à une indication
Ce guide complète un modèle dont les règles et les images sont déjà définies. AutomaticDriving construit une DrivingRule sans lire le jeu. Retournez cette valeur depuis driving : fabriquer une consigne dans une variable ne la publie pas. Votre mod définit les vitesses et la signification de chaque aspect et motif.
| Fonction | Cible et durée |
|---|---|
| stop() | Arrêt au signal courant, sans autorisation de le franchir. |
| clear() | Libération des restrictions dont la politique attend Clear ; ne prouve pas une voie physiquement libre. |
| announceStop(…) | Arrêt mémorisé à un ou deux signaux en aval ; la permission de la cible peut le remplacer par la vitesse de passage jusqu’à la tête. |
| limitAtSignal(…) | Plafond ponctuel au signal courant, sans restriction conservée après franchissement. |
| limitUntilClearThenRear(…) | Plafond au signal courant ou à un/deux signaux en aval, retenu jusqu’au dégagement par la queue d’un Clear effectivement franchi. |
| restrictedUntilNextSignal(…) | Après entrée, plafond et freinage sur l’espace physiquement libre jusqu’au passage de la tête au signal suivant. |
Les couleurs ne déterminent aucune permission. Deux indications qui partagent le même aspect peuvent choisir des consignes différentes selon leur motif. Une fonction driving qui renvoie null ne fournit aucune consigne ; null ne doit pas être assimilé à clear().
Choisir des vitesses et permissions explicites
Toutes les vitesses de ces helpers sont en mètres par seconde. Convertissez une valeur choisie en km/h en la divisant par 3,6, une seule fois à la frontière de votre configuration. Les valeurs doivent être finies ; zéro désigne un arrêt, jamais une vitesse de circulation implicite.
| Paramètre | Interprétation et limites |
|---|---|
| signalsAhead | 1 ou 2 pour announceStop ; 0, 1 ou 2 pour limitUntilClearThenRear. Zéro vise le signal courant. |
| passableHere | Permission du signal courant selon la politique choisie ; ne donne aucune permission au signal cible et ne retire pas les autres restrictions. |
| followTargetSpeed | Autorise le suivi de la vitesse numérique déclarée par la cible d’une annonce. |
| cancelAtNextClear | Option d’annonce acceptée seulement avec followTargetSpeed=true et signalsAhead=2. |
| limitAtSignal | Vitesse positive ou nulle ; passableHere=true exige une vitesse strictement positive. |
| limitUntilClearThenRear | Vitesse strictement positive. Une réouverture ne suffit pas à effacer une restriction mémorisée. |
| restrictedUntilNextSignal | maximumSpeedMps > 0 et 0 ≤ entrySpeedMps ≤ maximumSpeedMps ; stopFirst=true exige entrySpeedMps=0. |
Avec stopFirst, l’entrée restreinte attend une preuve d’arrêt. Sans cette option, la vitesse d’entrée peut être choisie explicitement. Choisissez la condition de libération selon votre règle : une libération par la tête et une libération par la queue ne couvrent pas la même longueur de train.
Une politique fictive que vous pouvez tester
package wiki.driving
import nimby.*
enum class Aspect { Closed, Warning, Restricted, Open }
// These values are policy chosen by this fictional mod, never SDK defaults.
data class Speeds(val passageKmh: Double, val restrictedKmh: Double) {
init {
require(passageKmh.isFinite() && passageKmh > 0)
require(restrictedKmh.isFinite() && restrictedKmh > 0)
}
}
fun instruction(aspect: Aspect, speeds: Speeds): DrivingRule = when (aspect) {
Aspect.Closed -> AutomaticDriving.stop()
Aspect.Warning -> AutomaticDriving.announceStop(
signalsAhead = 1,
passageSpeedMps = speeds.passageKmh / 3.6,
passableHere = true,
followTargetSpeed = true
)
Aspect.Restricted -> AutomaticDriving.restrictedUntilNextSignal(
entrySpeedMps = speeds.restrictedKmh / 3.6,
maximumSpeedMps = speeds.restrictedKmh / 3.6,
stopFirst = false
)
Aspect.Open -> AutomaticDriving.clear()
}
// In your signalModel builder:
// driving { indication -> instruction(indication.aspect, Speeds(25.0, 12.0)) }
// The model must use this Aspect enum; its Reason enum remains its own.
Ce fichier définit une fonction pure instruction. Intégrez-la dans un signalModel utilisant cet enum Aspect et son propre enum de motifs. Closed impose l’arrêt ; Warning annonce le signal suivant ; Restricted choisit ici une entrée sans arrêt préalable ; Open émet Clear. Ces choix et vitesses appartiennent uniquement à cet exemple.
val speeds = wiki.driving.Speeds(passageKmh = 25.0, restrictedKmh = 12.0)
val rule = wiki.driving.instruction(wiki.driving.Aspect.Warning, speeds)
check(rule.signalsAhead == 1)
check(rule.reopenedSpeedMps == 25.0 / 3.6)
check(DrivingFlag.ApproachPassable in rule.flags)Complétez les tests avec la cible fermée puis autorisée, le passage de la tête, le dégagement de la queue pour une restriction HoldToClear et une observation devenue inconnue. Vérifiez aussi qu’une permission au signal courant ne donne pas une permission à la cible.
Comprendre les effets qui dépassent l’affichage
maximumLineSpeed est une option du mod, désactivée par défaut. Elle permet d’utiliser le maximum du matériel comme plafond de marche tout en conservant une cible native active ; son effet peut aussi concerner des trains sans contrainte de signal de votre mod. N’activez cette option que si elle fait partie du comportement voulu et testé.
drivingPlan prend Vehicle, DrivingSettings, DrivingInput et des Constraint et retourne un DrivingPlan de calcul ou de diagnostic. Ce résultat n’actionne pas directement le train. Pour la conduite en partie, définissez les DrivingRule des signaux ; ne supposez pas qu’un plan consultatif remplace ces consignes.