Lire et agir
Relier les trains, les lignes et les tags
Lire les lignes de la partie et distinguer leurs tags déclarés des tags hérités de leurs parents.
Demander le catalogue utile
Ce guide prolonge les requêtes de trains. Pour afficher une ligne, demandez includeLines ; pour ses tags, demandez includeTags, qui inclut déjà les lignes. Un train peut avoir un lineId sans que le catalogue ait été demandé : une jointure manquante ne signifie pas que le train n’a pas de ligne.
| Information | Native | JVM |
|---|---|---|
| Identité de ligne du train | train.service?.line?.lineId | record.service?.line |
| Rechercher la ligne | snapshot.line(lineId) | snapshot.line(lineId) |
| Parent observé | line.parentLineId | line.parentId |
| Dépôt | line.isDepot | line.type == LineType.Depot |
LineType distingue Depot et Other. Other ne signifie ni « voyageurs » ni « marchandises ». Le nom est une propriété de présentation ; conservez LineId comme clé même après un renommage. La fiche Line n’expose ni fréquence commerciale, ni liste calculée de prochains départs.
Lire les tags réellement déclarés
Tag associe un TagId à un libellé. Line.declaredTags décrit uniquement les tags de cette ligne. Une liste vide obtenue indique aucune déclaration locale ; null indique que la déclaration n’a pas été fournie. Pour tester un tag, comparez son identité au lieu de comparer un nom susceptible d’être modifié.
Résoudre un héritage sans masquer l’inconnu
snapshot.tagsForLine(lineId) regroupe les tags de la ligne et de ses parents, sans doublons. Pour les seuls tags locaux, utilisez line.declaredTags. Ces lectures travaillent sur le lot déjà copié ; elles ne complètent pas silencieusement un catalogue incomplet en relisant le jeu.
| Cas | Interprétation |
|---|---|
| parentInformationAvailable = false | Relation parentale inconnue, même si parentId est null. |
| Parent disponible et null | Racine observée : aucun parent déclaré. |
| Parent absent du catalogue, cycle ou limite atteinte | Résolution incomplète : le résultat reste null. |
| Résultat non nul et vide | Aucun tag dans la chaîne résolue demandée. |
Gardez un résultat d’appartenance ternaire : true, false ou null. Réduire null à false ferait passer une lecture incomplète pour une absence de tag certaine, ce qui peut inverser une règle de votre mod.
Comparer tags locaux et hérités
package wiki.trainlines
import nimby.*
data class LineTags(
val line: Line,
val declared: List<Tag>?,
val includingParents: List<Tag>?,
)
fun readLineTags(context: ToolContext, id: LineId): LineTags? {
val snapshot = context.trains(TrainQuery(
includeService = false,
includeLocations = false,
includeTags = true,
))
val line = snapshot.line(id) ?: return null
return LineTags(line, line.declaredTags, snapshot.tagsForLine(id))
}
// Résultat ternaire : true, false ou appartenance inconnue.
fun hasTag(tags: List<Tag>?, id: TagId): Boolean? =
tags?.any { it.id == id }
package wiki.jvmtrainlines
import fr.nimby.sdk.*
data class LineTags(
val line: Line,
val declared: List<Tag>?,
val includingParents: List<Tag>?,
)
fun readLineTags(game: Game, id: LineId): LineTags? {
val snapshot = game.trains.snapshot(query = TrainQuery(
includeService = false,
includeLocations = false,
includeTags = true,
))
val line = snapshot.line(id) ?: return null
return LineTags(line, line.declaredTags, snapshot.tagsForLine(id))
}
// Un nom traduit ou renommé ne remplace pas l'identifiant du tag.
fun hasTag(tags: List<Tag>?, id: TagId): Boolean? =
tags?.any { it.id == id }
La fiche renvoie la ligne, ses déclarations locales et l’ensemble résolu. Appelez hasTag avec le TagId choisi dans votre configuration. Si le résultat est null, l’écran peut expliquer « tags indisponibles » et la règle métier peut appliquer explicitement son comportement en cas d’inconnu.