NRF SDK 0.9

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.

src/main/kotlin/Entry.kt
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.

assets/closed.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="15" r="7" fill="#ef4444"/><path d="M16 50v14" stroke="#888" stroke-width="4"/></svg>
assets/open.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

Terminal à la racine du projet
.\gradlew.bat assembleReleaseMod verifyNativeMod

Le 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éclarationResponsabilité
signalModelIdentité du modèle, types d’indication et repli.
checkbox → enabledRéglage déclaré puis lu dans une règle.
rules → IndicationDécision expliquée par un aspect et un motif.
imagesImage correspondant à la décision.
drivingConsigne correspondant à la décision.
signalMod → signalAssemblage des modèles dans le mod.

Développer le modèle