Référence
ToolContext
Lire le réseau, préparer une pose, publier des boutons et écrire dans le journal depuis un outil.
Contexte d’utilisation
| Module | Package | Source SDK |
|---|---|---|
| Kotlin/Native | nimby | kotlin/src/nimby/ToolContext.kt |
API publique du SDK 0.9.0-alpha.2. Chaque entrée donne la signature Kotlin et son contrat : sens de la valeur, conditions d’utilisation et effets à connaître. Choisissez les imports du module indiqué ci-dessus.
import nimby.ToolTrack
import nimby.ToolJunction
import nimby.ToolSignal
import nimby.ToolNetwork
import nimby.SignalPosition
import nimby.ConstructionState
import nimby.ConstructionResult
import nimby.ToolButton
import nimby.ToolNumberInput
import nimby.LogLevel
import nimby.ToolContextContexte, unités et opérations
Le contexte est prêt à utiliser dans service et onTick. Il appartient au callback courant : conservez les valeurs copiées et les tickets, jamais ce contexte. Le SDK refuse les appels après le retour du callback.
| Valeur | Contrat |
|---|---|
| ToolTrack.lengthM | Mètres, optionnel ; null impose d’arrêter le parcours. |
| SignalPosition.fraction | Fraction native strictement entre 0 et 1 pour une pose. |
| SignalPosition.direction | Sens natif -1 ou 1 ; distinct du sens visuel de certains modèles. |
| ConstructionResult.reason | Code de refus du pont natif ; à conserver dans le journal. |
| ToolButton | Identifiant, libellé, état activé ; au maximum 12 boutons par panneau. |
| ToolNumberInput | Champ entier saisissable au clavier : id, label, value, minimum, maximum, enabled. Sélection, effacement et collage sont possibles. Un texte vide, incomplet ou hors limites reste un brouillon local et bloque les commandes ; seul un entier valide est transmis au mod. Quatre champs maximum, avec des identifiants distincts de ceux des boutons. |
| SignalActionRequest.value | Nouvelle valeur entière pour une édition de champ (action contient son id) ; null pour un bouton. Une édition bloque les boutons jusqu’à la republication du panneau. |
| showPanel | Message UTF-8 limité à 256 octets ; remplace l’action qui a ouvert l’outil. |
ToolTrack
data class ToolTrack(val id: Long, val linkA: Long?, val linkB: Long?, val lengthM: Double?)Géométrie copiée d’une voie pour un outil. lengthM peut être indisponible ; utilisez topology pour des raccordements typés et arrêtez un parcours inconnu.
ToolTrack.id
val id: LongIdentifiant de voie dans cette partie. Conserver avec worldId et generation de la copie, sans le traiter comme un index de liste.
ToolTrack.linkA
val linkA: Long?Identifiant du raccord observé côté A, ou null si indisponible. Utilisez ToolTopology pour vérifier un raccord réciproque exploitable.
ToolTrack.linkB
val linkB: Long?Identifiant du raccord observé côté B, ou null si indisponible. null ne prouve pas que la voie se termine ici.
ToolTrack.lengthM
val lengthM: Double?Longueur observée finie et strictement positive, en mètres, ou null. Ne remplacez pas null par une longueur calculée approximativement pour une pose.
ToolJunction
data class ToolJunction(val branchTrack: Long, val mainTrack: Long, val fraction: Double, val mainDirection: Int, val branchDirection: Int)Raccordement copié d’une branche à une voie principale, avec position et orientations. Ne définit pas une branche actuellement autorisée ; ToolTopology évite de choisir une route implicitement.
ToolJunction.branchTrack
val branchTrack: LongIdentifiant de la voie de branche de ce raccordement, distinct de mainTrack.
ToolJunction.mainTrack
val mainTrack: LongIdentifiant de la voie principale portant la position fraction.
ToolJunction.fraction
val fraction: DoublePosition du raccord sur la voie principale, de 0 à 1 depuis A vers B. Multiplier par sa longueur donne une distance depuis A.
ToolJunction.mainDirection
val mainDirection: IntOrientation observée de la voie principale au raccord, −1 ou +1. Ce signe ne choisit pas la route à suivre ; utilisez les connexions de ToolTopology.
ToolJunction.branchDirection
val branchDirection: IntOrientation observée de la branche, −1 ou +1. ToolTopology s’en sert pour reconnaître son extrémité d’aiguille ; aucun trajet n’est autorisé par cette valeur.
ToolSignal
data class ToolSignal(val id: Long, val track: Long, val fraction: Double, val direction: Int, val kind: Int)Signal copié avec voie, position et modèle. Utilisez travelDirection pour le sens des trains et placementAt pour copier l’orientation correctement.
ToolSignal.id
val id: LongIdentifiant du signal dans la copie, à revalider dans une nouvelle lecture avant une construction.
ToolSignal.track
val track: LongIdentifiant de la voie portant le signal. Recherchez sa longueur avec topology.track(track).
ToolSignal.fraction
val fraction: DoublePosition du signal sur la voie, de 0 à 1 depuis A vers B. Une position destinée à la pose doit être strictement intérieure.
ToolSignal.direction
val direction: IntOrientation stockée du signal, dépendante de son modèle. Ne l’utilisez pas comme sens des trains ; préférez travelDirection.
ToolSignal.kind
val kind: IntType observé du signal fourni pour les données de la copie. Ne codez pas de conversion de sens à partir de ce nombre : placementAt la prend en charge.
ToolSignal.travelDirection
val travelDirection: IntSens normalisé des trains : +1 de A vers B, −1 de B vers A. Lève une exception si l’orientation de la copie est invalide.
ToolSignal.placementAt
fun placementAt(trackId: Long, fraction: Double, travelDirection: Int = this.travelDirection): SignalPositionConstruit la position d’une copie du signal source, en convertissant le sens des trains pour son modèle. Exige une voie valide, une fraction finie strictement entre 0 et 1 et un sens ±1. Même valeur pour aperçu et pose.
ToolNetwork
data class ToolNetwork(val worldId: String, val generation: Long, val tracks: List<ToolTrack>, val junctions: List<ToolJunction>, val signals: List<ToolSignal>)Copie de travail des voies, aiguilles et signaux d’une session. Les listes restent consultables après le callback ; elles ne prouvent pas que le monde est encore inchangé.
ToolNetwork.worldId
val worldId: StringIdentité du monde dont proviennent toutes les listes de cette copie.
ToolNetwork.generation
val generation: LongGénération de session de la copie. Abandonnez un plan si elle ne correspond plus au contexte actif.
ToolNetwork.tracks
val tracks: List<ToolTrack>Voies copiées ; chacune peut avoir une longueur inconnue. Préparez topology une fois pour les recherches répétées.
ToolNetwork.junctions
val junctions: List<ToolJunction>Raccordements d’aiguilles copiés, y compris ceux à l’intérieur d’une voie. Les ignorer peut faire traverser une aiguille au planificateur.
ToolNetwork.signals
val signals: List<ToolSignal>Signaux présents dans la lecture. Une liste copiée n’est pas une autorisation de construire entre eux.
SignalPosition
data class SignalPosition(val trackId: Long, val fraction: Double, val direction: Int)Position proposée pour un aperçu ou une pose. Préférez source.placementAt(...) pour convertir le sens selon le modèle ; le constructeur seul n’effectue pas de validation du jeu.
SignalPosition.trackId
val trackId: LongVoie cible issue du réseau relu. Elle doit encore exister au moment de la commande.
SignalPosition.fraction
val fraction: DoublePosition cible strictement entre 0 et 1 depuis A vers B pour la pose ; ni extrémité ni distance en mètres.
SignalPosition.direction
val direction: IntOrientation attendue par le modèle source. Obtenez-la via placementAt plutôt qu’en recopiant aveuglément travelDirection.
ConstructionState
enum class ConstructionState {
Ready,
Applied,
Undone,
Rejected,
Partial,
Pending
}Étape ou résultat d’une opération suivie par ticket. Distinguez préparation, attente et résultat terminal ; un délai ne signifie jamais que rien n’a été posé.
ConstructionState.Ready
ReadyTicket préparé, sans création. Capturez ensuite le réseau et validez le plan avant une confirmation explicite.
ConstructionState.Applied
AppliedCommande appliquée. Inspectez createdIds et canUndo ; une nouvelle action ne doit pas répéter cette pose.
ConstructionState.Undone
UndoneAnnulation de l’opération effectuée. Terminez son suivi et présentez ce résultat au joueur.
ConstructionState.Rejected
RejectedOpération refusée. Présentez le motif et invalidez la confirmation ; ne transformez pas le refus en nouvelle tentative automatique.
ConstructionState.Partial
PartialRésultat incomplet avec effets possibles. Inspectez createdIds, reason et canUndo ; ne présumez ni succès complet ni absence de modification.
ConstructionState.Pending
PendingRésultat encore en attente. Conservez le ticket original et utilisez pollConstruction ; ne soumettez pas une nouvelle commande.
ConstructionResult
data class ConstructionResult(val state: ConstructionState, val token: Long, val createdIds: List<Long>, val reason: Int, val canUndo: Boolean)Résultat copié d’une préparation, pose, annulation ou interrogation de ticket. Consultez state avant les autres champs ; une opération incertaine continue d’être suivie sur son ticket.
ConstructionResult.state
val state: ConstructionStateÉtape ou issue de l’opération. Pending exige un suivi ; Partial exige un examen des effets obtenus.
ConstructionResult.token
val token: LongTicket opaque à conserver pour createSignals, pollConstruction et undoConstruction. Un ticket nul n’est pas une préparation exploitable.
ConstructionResult.createdIds
val createdIds: List<Long>Identifiants des signaux créés rapportés par l’opération. Une liste vide doit être interprétée avec state, jamais seule comme preuve d’absence d’effet.
ConstructionResult.reason
val reason: IntCode de diagnostic du résultat à conserver dans les journaux. Ne le présentez pas comme une enum métier déduite de sa valeur.
ConstructionResult.canUndo
val canUndo: BooleanIndique qu’une annulation SDK était disponible lors de la réponse. L’historique peut changer ensuite ; undoConstruction peut encore refuser.
ToolButton
data class ToolButton(val id: String, val label: String, val enabled: Boolean = true)Bouton temporaire d’un panneau ou d’une fenêtre. Son libellé n’exécute aucune action ; le handler traite l’identifiant reçu. Sa suppression ne modifie pas les réglages persistants des signaux.
ToolNumberInput
data class ToolNumberInput(val id: String, val label: String, val value: Int,
val minimum: Int, val maximum: Int, val enabled: Boolean = true)Champ entier temporaire avec valeur et bornes explicites. Un panneau envoie chaque édition valide dans request.value ; une fenêtre envoie tous les champs au clic. Un brouillon invalide bloque les commandes.
ToolNumberInput.id
val id: StringClé du champ dans action ou ToolWindowEvent.values, distincte des autres contrôles du formulaire.
ToolNumberInput.label
val label: StringLibellé du champ entier, affiché avec la saisie ; accepte tr.
ToolNumberInput.value
val value: IntEntier proposé lors de la publication du formulaire. Doit appartenir à minimum..maximum ; une republication doit respecter le brouillon validé de l’outil.
ToolNumberInput.minimum
val minimum: IntBorne inférieure incluse de la saisie. Doit être inférieure ou égale à maximum.
ToolNumberInput.maximum
val maximum: IntBorne supérieure incluse de la saisie ; la valeur publiée et les éditions acceptées doivent la respecter.
ToolNumberInput.enabled
val enabled: Boolean = truefalse rend la saisie non modifiable dans ce formulaire ; ne supprime pas la valeur de l’état local de l’outil.
LogLevel
enum class LogLevel {
Info,
Warning,
Error
}Niveau de gravité d’un message écrit par ToolContext.log. Choisissez le niveau selon le résultat métier et évitez de répéter un message à chaque tick.
LogLevel.Info
InfoÉvénement de fonctionnement normal, par exemple une opération terminée ou un changement de phase.
LogLevel.Warning
WarningSituation inhabituelle dont l’outil peut rendre compte sans la classer comme une erreur définitive.
LogLevel.Error
ErrorÉchec à diagnostiquer. Gardez le message utile et borné ; écrire un journal peut lui-même être temporairement refusé.
ToolContext
class ToolContextAccès au jeu fourni uniquement pendant un callback de l’outil. Ne conservez ni ce contexte ni une fermeture qui le capture. Les valeurs copiées, identifiants de session et tickets peuvent être conservés pour le callback suivant.
ToolContext.worldId
val worldId: StringIdentité de la partie active pour cet appel. Comparez-la à celle du plan ou de l’événement avant de réutiliser des données.
ToolContext.generation
val generation: LongGénération de session active pour cet appel. Un changement invalide les plans et les présentations de l’ancienne génération.
ToolContext.log
fun log(message: String, level: LogLevel = LogLevel.Info): UnitÉcrit un message persistant de 1 à 4096 octets UTF-8, sans caractère nul. Ne pas journaliser de secrets ni chaque tick ; traiter un éventuel refus sans boucle de diagnostics.
ToolContext.clock
fun clock(): ToolClockLit uniquement calendrier et temps simulé, sans capturer le réseau. Utilisez cette lecture légère pour un affichage d’heure ; le résultat copié ne se met pas à jour tout seul.
ToolContext.trains
fun trains(query: TrainQuery = TrainQuery()): TrainSnapshotLit les groupes de données demandés pour les trains. Réutilise une lecture du même callback si elle couvre la requête ; un besoin supplémentaire déclenche une lecture élargie. Les copies restent lisibles après le callback.
ToolContext.linePlan
fun linePlan(trainId: Long): TrainLinePlan?Lit le plan complet de la ligne du train identifié, ou null si absent/instable. Les horaires sont des offsets, pas des dates commerciales absolues. Réutilisé dans le callback ; network renouvelle la lecture.
ToolContext.linePlan
fun linePlan(train: TrainId): LinePlan?Même lecture de plan avec un identifiant de train typé. Retourne LinePlan ou null lorsque le plan est absent/instable ; ne déduit pas la date d’une circulation.
ToolContext.changeTime
fun changeTime(utcSeconds: Long, recalculateTrains: Boolean = false): ToolTimeChangeChange le calendrier UTC, années 1 à 9999, en conservant la fraction de seconde. Par défaut, conserve positions et délais relatifs. recalculateTrains peut déplacer des trains et coûter de l’argent : choix explicite requis. Après erreur incertaine, relire plutôt que rejouer.
ToolContext.changeTime
fun changeTime(date: GameDateTime, recalculateTrains: Boolean = false): ToolTimeChangeConvertit la date validée en secondes UTC puis applique changeTime. Même mutation et même nécessité de relire après un résultat incertain ; calculer la date seul ne changeait pas la partie.
ToolContext.showWindow
fun showWindow(request: ToolWindowEvent, message: String, buttons: List<ToolButton>, inputs: List<ToolNumberInput> = emptyList()): UnitPublie le formulaire de la fenêtre ayant produit l’événement, dans la même session : jusqu’à 12 boutons et 8 entiers, IDs distincts. Valeurs envoyées ensemble au clic ; 4096 octets UTF-8 par chaîne sans caractère nul, et 8192 au total.
ToolContext.network
fun network(): ToolNetworkCapture une nouvelle copie de voies, aiguilles et signaux ; invalide les lectures de trains réutilisées dans ce contexte sans les relire immédiatement. À appeler après prepareConstruction pour calculer le plan à confirmer, pas à chaque renouvellement d’aperçu.
ToolContext.prepareConstruction
fun prepareConstruction(sourceSignal: Long): ConstructionResultPrépare un ticket pour copier le signal source, sans poser de signal. Faire ensuite une nouvelle capture et valider les positions. Une commande d’édition ou un changement de session peut invalider ce ticket.
ToolContext.showSignalPreview
fun showSignalPreview(request: SignalActionRequest, positions: List<SignalPosition>): UnitPublie jusqu’à 64 positions avec le modèle source, sans construction. Renouveler pendant l’usage : expiration après deux secondes. Visible pendant l’édition de la source ; couches et cadrage restent applicables. Un refus Busy ne renouvelle pas l’ancien aperçu et interdit une confirmation locale.
ToolContext.clearSignalPreview
fun clearSignalPreview(): UnitDemande le retrait de l’aperçu de l’outil, sans annuler une construction. En cas de Busy, révoquez immédiatement la confirmation locale puis retentez le nettoyage dans un callback ultérieur.
ToolContext.createSignals
fun createSignals(ticket: Long, sourceSignal: Long, positions: List<SignalPosition>): ConstructionResultSoumet une seule fois 1 à 64 positions distinctes avec ticket préparé et signal source. Validez une nouvelle capture contre le plan approuvé avant l’appel. Pending ou erreur incertaine impose de suivre le même ticket, jamais de rejouer la pose.
ToolContext.undoConstruction
fun undoConstruction(ticket: Long): ConstructionResultDemande explicitement l’annulation du ticket lorsque canUndo le permet. L’historique peut avoir changé ; un refus reste possible. Marquez l’opération en attente avant l’appel et suivez son résultat sans la répéter.
ToolContext.pollConstruction
fun pollConstruction(ticket: Long): ConstructionResultInterroge le ticket non nul original sans resoumettre la commande. Continuez pendant Pending, même si le panneau est fermé. Un ticket devenu indisponible ne prouve pas une absence d’effet.
ToolContext.showPanel
fun showPanel(request: SignalActionRequest, message: String, buttons: List<ToolButton>, inputs: List<ToolNumberInput> = emptyList()): UnitRemplace l’action d’origine par un panneau temporaire : jusqu’à 12 boutons et 4 entiers, IDs distincts. Chaque chaîne doit respecter 256 caractères et 256 octets UTF-8, sans caractère nul. Utilisez la requête de la même session. Un refus de présentation ne valide pas les anciens clics ; les réglages persistants du signal ne sont pas modifiés.