Commencer
Votre premier mod
Construisez un signal pédagogique à deux indications, avec images, réglage et conduite.
Déclarer le signal en Kotlin
Prérequis : le projet et mod.json du guide d’installation. Ajoutez le fichier complet ci-dessous. Ce modèle ouvre lorsque son canton est connu libre et que ses autres conditions sont satisfaites ; sinon, il ferme. C’est un point de départ pédagogique, pas la définition d’un système de signalisation complet.
package nimby.mod
import nimby.*
// Les noms décrivent vos indications, pas des codes natifs.
enum class Aspect { Closed, Open }
enum class Reason { Unknown, Disabled, Occupied, Clear }
val firstSignal = signalModel(
id = "monmod.signal",
title = "Mon premier signal",
textures = "mon_premier_signal",
fallback = Indication(Aspect.Closed, Reason.Unknown)
) {
construction(states = listOf("closed.svg", "open.svg"))
val active = checkbox("active", "Activer le signal", defaultValue = true)
rules {
when {
settingsStatus == SettingsStatus.Unavailable -> Indication(Aspect.Closed, Reason.Unknown)
!enabled(active) -> Indication(Aspect.Closed, Reason.Disabled)
!fresh || !routeKnown || observation.lampFailed || observation.forcedStop ->
Indication(Aspect.Closed, Reason.Unknown)
block == Occupancy.Clear -> Indication(Aspect.Open, Reason.Clear)
block == Occupancy.Occupied -> Indication(Aspect.Closed, Reason.Occupied)
else -> Indication(Aspect.Closed, Reason.Unknown)
}
}
// Les deux fichiers SVG sont déclarés une seule fois dans construction.
images { indication ->
when (indication.aspect) {
Aspect.Closed -> "closed.svg"
Aspect.Open -> "open.svg"
}
}
driving { indication ->
when (indication.aspect) {
Aspect.Closed -> AutomaticDriving.stop()
Aspect.Open -> AutomaticDriving.clear()
}
}
}
// Le mod est le paquet ; le modèle ci-dessus garde ses propres types et règles.
fun createMod(): SignallingMod = signalMod(modInfo) {
metadata(author = "Votre nom", description = "Mon premier mod de signalisation.")
signal(firstSignal)
}
Ajouter les deux images
Les noms de fichiers dans construction et images sont relatifs à la racine du paquet. assets est copié à cette racine : assets/closed.svg devient donc closed.svg. Le catalogue mod.txt est généré à partir de la déclaration Kotlin.
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="64" viewBox="0 0 32 64"><rect x="6" y="2" width="20" height="48" rx="10" fill="#161616"/><circle cx="16" cy="15" r="7" fill="#ef4444"/><path d="M16 50v14" stroke="#888" stroke-width="4"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="64" viewBox="0 0 32 64"><rect x="6" y="2" width="20" height="48" rx="10" fill="#161616"/><circle cx="16" cy="37" r="7" fill="#22c55e"/><path d="M16 50v14" stroke="#888" stroke-width="4"/></svg>Vous pouvez remplacer les dessins. Si vous changez un nom de fichier, mettez à jour toutes ses références Kotlin. Conservez l’ordre d’un catalogue déjà utilisé par des sauvegardes.
Construire et essayer le signal
.\gradlew.bat assembleReleaseMod verifyNativeModLe paquet est créé dans build/gradle/mod/release. verifyNativeMod vérifie son chargement, son arrêt et son rechargement sans ouvrir le jeu. Ajoutez ensuite le projet à votre profil développeur du Hub, construisez-le avec le même kit et activez le profil lorsque le jeu est fermé.
- Lancez une partie de test avec les ressources du mod activées et placez le signal.
- Sur un canton connu libre, vérifiez l’image verte ; avec un canton occupé ou une donnée manquante, vérifiez la fermeture.
- Décochez « Activer le signal » : cet exemple demande explicitement la fermeture. Vérifiez aussi la consigne de conduite, pas seulement la couleur.
Lire les responsabilités du modèle
| Déclaration | Responsabilité |
|---|---|
| signalModel | Identité du modèle, types d’indication et repli. |
| checkbox → enabled | Réglage déclaré puis lu dans une règle. |
| rules → Indication | Décision expliquée par un aspect et un motif. |
| images | Image correspondant à la décision. |
| driving | Consigne correspondant à la décision. |
| signalMod → signal | Assemblage des modèles dans le mod. |