# ╔═════════════════════════════════════════════════════════════════╗
# ║         SHOWCASE JDR-BOT — Tutoriel syntaxe YAML v4.7           ║
# ║                                                                 ║
# ║  Ce scénario présente TOUTES les fonctionnalités du moteur.     ║
# ║  Chaque salle est commentée pour servir de référence aux        ║
# ║  auteurs qui débutent avec la syntaxe YAML JDR-Bot.             ║
# ║                                                                 ║
# ║  Structure :                                                    ║
# ║    Salle 1  — Accueil & Navigation                              ║
# ║    Salle 2  — Objets, Inventaire, Réactions                     ║
# ║    Salle 3  — Actions personnalisées & Craft                    ║
# ║    Salle 4  — Événements automatiques & Aléatoire               ║
# ║    Salle 5  — Variables & Conditions avancées                   ║
# ║    Salle 6  — Texte, Sons, Images, Formatage                    ║
# ║    Salle 7  — Timers                                            ║
# ║    Salle 8  — Variables online & Leaderboard                    ║
# ║    Salle 9  — Fins (victoire / défaite)                         ║
# ║    Salles intermédiaires de résultat                            ║
# ╚═════════════════════════════════════════════════════════════════╝


# ─────────────────────────────────────────────────────────────────
# TITRE
# Le titre est affiché au lancement. Il peut contenir des variables
# online (v_nom_o_v) pour afficher des stats en temps réel.
# ⚠️ Interdit d'utiliser | dans le titre — utiliser · ou —
# ─────────────────────────────────────────────────────────────────
titre: "🎓 Showcase JDR-Bot · v4.7 · (v_nbparties_o_v parties jouées)"


# ─────────────────────────────────────────────────────────────────
# MARKDOWN
# Contrôle le rendu du texte. "fix" = bloc code Discord (monospace).
# "none" = texte brut sans formatage.
# Valeur par défaut si absent : "fix"
# ─────────────────────────────────────────────────────────────────
markdown: fix


# ─────────────────────────────────────────────────────────────────
# OPTIONS GLOBALES
# Boutons permanents affichés en haut du jeu.
#   rafraichir  → réaffiche la salle courante
#   inventaire  → affiche l'inventaire
#   precedent   → retour à la salle précédente
#                 (n'apparaît que si la salle a vers: precedent dans ses choix)
#   v_nom_v     → affiche la valeur d'une variable avec son emoji
#   id_salle    → accès direct à une salle (n'apparaît pas si on y est déjà)
# ─────────────────────────────────────────────────────────────────
options:
  rafraichir: "🔄"
  inventaire: "🎒"
  precedent: "↩️"
  v_score_v: "⭐"    # affiche la valeur de la variable "score" avec l'emoji ⭐
  accueil: "🏠"      # accès direct à la salle d'accueil depuis n'importe où


# ─────────────────────────────────────────────────────────────────
# VARIABLES NUMÉRIQUES GLOBALES
# Initialisées au lancement de la partie.
# Deux formes : courte (valeur seule) ou longue (avec description).
# ⚠️ Éviter v_, _v, t_, _t, o_, _o dans le nom (délimiteurs du système)
#    seul _o est autorisé, uniquement comme suffixe (variables online)
# ─────────────────────────────────────────────────────────────────
vars:
  # Forme courte
  score: 0

  # Forme longue (avec description — visible dans l'inventaire via v_score_v§⭐)
  pv:
    valeur: 10
    description: "Points de vie"

  pvmax:
    valeur: 10
    description: "PV maximum"

  force:
    valeur: 3
    description: "Force du personnage"

  chance:
    valeur: 5
    description: "Indice de chance"

  desresultat:
    valeur: 0
    description: "Résultat du dernier lancer de dé"

  # Variable utilisée dans les conditions avancées
  compteur:
    valeur: 0
    description: "Compteur de passages"

  # Flag pour le timer global comptebombe (0 = inactif, 1 = en cours)
  bombe_en_cours:
    valeur: 0


# ─────────────────────────────────────────────────────────────────
# VARIABLES TEXTUELLES GLOBALES
# Stockent du texte (nom du joueur, état narratif, etc.)
# Référencées dans les textes avec t_nom_t
# ─────────────────────────────────────────────────────────────────
vars_texte:
  nomjoueur:
    valeur: "Aventurier"
    description: "Nom du joueur"

  # Variable de combinaison pour le craft (salle 3)
  combinaison:
    valeur: "rien"
    description: "Ingrédient en attente de combinaison"


# ─────────────────────────────────────────────────────────────────
# VARIABLES ONLINE
# Persistées entre toutes les parties, sur tous les serveurs.
# Le nom DOIT finir par _o.
# nb_parties_o existe automatiquement — pas besoin de le déclarer.
# ─────────────────────────────────────────────────────────────────
vars_online:
  nbparties_o:
    valeur: 0
    description: "Nombre de parties jouées (toutes confondues)"

  recordscore_o:
    valeur: 0
    description: "Meilleur score jamais atteint"


# ═════════════════════════════════════════════════════════════════
# SALLES
# ═════════════════════════════════════════════════════════════════
salles:

  # ───────────────────────────────────────────────────────────────
  # SALLE 1 — ACCUEIL & NAVIGATION
  #
  # Montre :
  #   - choix avec bouton (commande + bouton + vers)
  #   - choix sans bouton (navigation textuelle uniquement)
  #   - bouton sur la salle elle-même (bouton:)
  #   - variables dans le texte (v_nom_v et t_nom_t)
  #   - option "accueil" dans les options globales (id de cette salle)
  # ───────────────────────────────────────────────────────────────
  - id: accueil
    # bouton: définit le label du bouton associé à CETTE salle
    # (utilisé par les autres salles qui ont vers: accueil)
    bouton: "🏠 Accueil"

    texte: |
      **🎓 Bienvenue dans le Showcase JDR-Bot !**
      Bonjour t_nomjoueur_t ! Score actuel : v_score_v ⭐

      Choisissez une démonstration :

    choix:
      # Choix avec bouton Discord (commande + bouton + vers)
      - commande: "1"
        bouton: "📦 Objets & Inventaire"
        vers: demo_objets

      - commande: "2"
        bouton: "⚙️ Actions personnalisées"
        vers: demo_actions

      - commande: "3"
        bouton: "🎲 Événements & Aléatoire"
        vers: demo_events

      - commande: "3g"
        bouton: "✨ Événements globaux"
        vers: demo_events_globaux

      - commande: "4"
        bouton: "🔢 Variables & Conditions"
        vers: demo_variables

      - commande: "5"
        bouton: "🔊 Sons, Images, Formatage"
        vers: demo_media

      # Pas de bouton: ici → le bouton affiché vient du bouton: de la salle demo_timers elle-même.
      # C'est une alternative : définir le bouton dans la salle plutôt que dans le choix.
      - commande: "6"
        vers: demo_timers

      - commande: "7"
        bouton: "🌐 Variables Online"
        vers: demo_online

      - commande: "8"
        bouton: "🏆 Fins de partie"
        vers: demo_fins

      # Choix sans commande ni bouton : accessible uniquement par id ("avancer aide")
      # ou par numéro de salle. Aucun alias textuel, aucun bouton affiché.
      - vers: aide


  # ───────────────────────────────────────────────────────────────
  # SALLE AIDE — sans commande ni bouton dans le choix de l'accueil
  # Accessible par id ("avancer aide") ou numéro — aucun bouton affiché.
  # ───────────────────────────────────────────────────────────────
  - id: aide
    texte: |
      **💡 Comment naviguer dans ce showcase ?**

      Tapez un numéro ou cliquez un bouton pour avancer.
      Pour interagir : tapez le verbe directement (ex: prendre clé)
      Sur Discord : commandes slash dédiées (/prendre, /examiner, /jeter)
      ou /action pour les verbes personnalisés (/action combiner cristal)
      Le bouton ↩️ retourne à la salle précédente.
      Le bouton 🏠 retourne à l'accueil depuis n'importe où.

    choix:
      # vers: precedent → retour à la salle d'où on vient
      # Active aussi l'affichage du bouton permanent "precedent" dans options:
      - commande: "retour"
        bouton: "↩️ Retour"
        vers: precedent


  # ───────────────────────────────────────────────────────────────
  # SALLE 2 — OBJETS & INVENTAIRE
  #
  # Montre :
  #   - objets: (déclaration à l'entrée de salle)
  #   - endroit visible vs invisible
  #   - desc_meuble vs description (meuble ≠ objet)
  #   - reaction_meuble, reaction_prise, reaction_objet
  #   - retirer: true pour retirer un objet
  #   - même nom plusieurs fois sur le même meuble → stock qui diminue
  #   - sortie conditionnelle (si objet présent)
  # ───────────────────────────────────────────────────────────────
  - id: demo_objets
    texte: |
      **📦 Démonstration — Objets & Inventaire**

      Une table trône au centre de la pièce.
      Sur le sol, une clé brille faiblement.
      Un vieux coffre contient des pièces d'or — examinez-le et prenez une pièce à la fois.
      (Le coffre se vide progressivement, mais vous ne pouvez porter qu'une pièce.)

      prendre [objet] · examiner [objet] · jeter [objet]
      (Discord : /prendre · /examiner · /jeter)

    # objets: sont déclarés ici et s'appliquent à l'entrée dans la salle.
    # Format : nom, endroit, description, msg_ramassage (+ réactions optionnelles)
    objets:
      # Objet sur un meuble visible — le joueur voit "une table" dans la salle
      - nom: grimoire
        endroit: "table"
        # desc_meuble : affiché quand le joueur examine le MEUBLE (ex: examiner table)
        desc_meuble: "Une vieille table en bois. Un grimoire poussiéreux y est posé."
        # description : affiché quand le joueur examine L'OBJET (ex: examiner grimoire)
        description: "Un vieux grimoire aux pages jaunies, couvert de formules alchimiques."
        msg_ramassage: "Vous prenez le grimoire sur la table."
        # reaction_meuble : bouton affiché pour examiner le meuble
        reaction_meuble: "🪑 Examiner la table"
        # reaction_prise : bouton affiché pour prendre l'objet
        reaction_prise: "📖 Prendre le grimoire"
        # reaction_objet : bouton affiché pour examiner l'objet lui-même
        reaction_objet: "🔎 Examiner le grimoire"

      # Objet invisible — présent dans le jeu mais non visible directement
      - nom: cle
        endroit: "invisible"
        description: "Une petite clé en argent."
        msg_ramassage: "Vous ramassez la clé."

      # ── Objets multiples sur le même meuble ──────────────────────
      # Déclarer le même nom plusieurs fois sur le même endroit :
      # à chaque prise, le slot suivant devient actif → desc_meuble change.
      # Idéal pour simuler une pile, un stock qui diminue, etc.
      - nom: piece
        endroit: "coffre"
        desc_meuble: "Un vieux coffre. Il contient trois pièces d'or !"
        description: "Une pièce d'or étincelante."
        msg_ramassage: "Vous prenez une pièce. Il en reste deux."
        reaction_meuble: "💰 Examiner le coffre"
        reaction_prise: "🪙 Prendre une pièce"

      # Même nom "piece", même endroit "coffre" → slot 2
      # desc_meuble différente : le coffre se vide progressivement
      - nom: piece
        endroit: "coffre"
        desc_meuble: "Un vieux coffre. Il reste deux pièces d'or."
        description: "Une pièce d'or étincelante."
        msg_ramassage: "Vous prenez une pièce. Il en reste une."

      # Slot 3 : dernière pièce
      - nom: piece
        endroit: "coffre"
        desc_meuble: "Un vieux coffre. Il reste une dernière pièce."
        description: "Une pièce d'or étincelante."
        msg_ramassage: "Vous prenez la dernière pièce. Le coffre est vide."

      # Slot 4 : objet "caché" révélé une fois toutes les pièces prises
      # Le joueur peut encore examiner le coffre — il verra ce message.
      # Nom différent pour distinguer cet état dans les conditions (si coffreVide)
      - nom: coffreVide
        endroit: "coffre"
        desc_meuble: "Le coffre est complètement vide. Mais... un double fond ?"
        description: "Un compartiment secret ! Vous y trouvez un parchemin."
        msg_ramassage: "Vous découvrez le compartiment secret !"

      # Objet qu'on retire à l'entrée (équivalent -nom en .txt)
      # Utile pour "consommer" un objet ou réinitialiser un état
      - nom: vieillepotion
        retirer: true
        endroit: invisible

    # Pas d'actions: ici — prendre/examiner/jeter sont des commandes de base du bot.
    # Elles fonctionnent automatiquement grâce aux objets: déclarés ci-dessus,
    # sans qu'on ait besoin de les redéfinir comme actions personnalisées.
    # → /prendre grimoire · /examiner grimoire · /jeter grimoire (Discord)
    # → prendre grimoire · examiner grimoire · jeter grimoire (terminal/web/desktop)
    # Les descriptions d'examen viennent de desc_meuble: et description: des objets.

    evenements:
      # Événement conditionnel multi-critères (ET) : cle présente ET compteur > 2
      - si: "cle v_compteur_v > 2"
        faire: "score.+.5"
        texte: "🗝️ Vous avez la clé ET visité 3 fois — bonus +5 score !"

    choix:
      - commande: "retour"
        vers: accueil


  # ───────────────────────────────────────────────────────────────
  # SALLE 3 — ACTIONS PERSONNALISÉES & CRAFT
  #
  # Montre :
  #   - action:cible simple avec condition
  #   - action:all avec t_action_cible_ok_t et t_action_cible_t
  #   - même verbe/cible plusieurs fois (première condition vraie gagne)
  #   - action avec bouton attaché (bouton:)
  #   - craft : combinaison de 2 ingrédients → résultat
  #   - variable textuelle comme "slot" de combinaison (t_combinaison_t)
  #   - actions_globales (définies plus bas, dispo partout)
  # ───────────────────────────────────────────────────────────────
  - id: demo_actions
    texte: |
      **⚙️ Démonstration — Actions personnalisées**

      Un alambic attend sur l'établi.
      Des ingrédients sont disponibles : herbe, cristal.

      examiner [objet] · prendre [herbe / cristal]
      combiner [ingrédient] · aller [destination]
      (Discord : /examiner · /prendre · /action combiner · /action aller)
      "aller" est une action globale — fonctionne dans toutes les salles !

    # Objets disponibles dans cette salle
    objets:
      - nom: herbe
        endroit: "établi"
        description: "Herbe verte aux propriétés magiques."
        msg_ramassage: "Vous prenez l'herbe."
        reaction_prise: "🌿 Prendre l'herbe"

      - nom: cristal
        endroit: "établi"
        description: "Un cristal bleu translucide."
        msg_ramassage: "Vous prenez le cristal."
        reaction_prise: "💎 Prendre le cristal"

    actions:
      # ── Prendre avec condition objet absent (-nom) ──
      - verbe: prendre
        cible: herbe
        si: "-herbe"
        faire:
          - objet: herbe
            vers: inventaire
        texte_ok: "Vous prenez l'herbe."
        texte_ko: "Vous avez déjà l'herbe."

      - verbe: prendre
        cible: cristal
        si: "-cristal"
        faire:
          - objet: cristal
            vers: inventaire
        texte_ok: "Vous prenez le cristal."
        texte_ko: "Vous avez déjà le cristal."

      # ── Examiner : même verbe, cibles différentes ──
      - verbe: examiner
        cible: herbe
        si: ~
        texte_ok: "Une herbe aux vertus apaisantes. Idéale comme premier ingrédient."

      - verbe: examiner
        cible: cristal
        si: ~
        texte_ok: "Le cristal vibre légèrement. Il amplifie les potions."

      - verbe: examiner
        cible: alambic
        si: ~
        texte_ok: "L'alambic central. Utilisez 'combiner [ingrédient]' pour créer des potions."

      # ── Craft : même verbe/cible, plusieurs conditions (première vraie gagne) ──
      # Étape 1 : déposer l'herbe en premier
      - verbe: combiner
        cible: herbe
        si: "herbe t_combinaison_t.=.rien"
        faire:
          - "-herbe&&inventaire&&null"
          - var_texte: combinaison
            valeur: "herbe"
            description: "En attente du cristal"
        texte_ok: "🌿 L'herbe entre dans l'alambic. Ajoutez maintenant : combiner cristal"
        texte_ko: "Vous n'avez pas d'herbe."

      # Étape 2 : ajouter le cristal → création de la potion
      - verbe: combiner
        cible: cristal
        si: "cristal t_combinaison_t.=.herbe"
        faire:
          - "-cristal&&inventaire&&null"
          - var_texte: combinaison
            valeur: "rien"
          - "potion&&inventaire&&Potion verte scintillante (+5 PV)"
          - "score.+.10"
          - var_texte: combinaison
            valeur: "rien"
        texte_ok: "💚 L'alambic s'illumine ! Potion créée ! (+10 score)"
        texte_ko: "Vous n'avez pas de cristal."

      # Fallback : ingrédient inconnu — t_action_cible_t = ce que le joueur a tapé
      - verbe: combiner
        cible: all
        si: ~
        texte_ok: "«t_action_cible_t» n'est pas un ingrédient connu. Essayez : herbe, cristal."

      # ── Action avec bouton attaché ──
      # bouton: affiche une réaction Discord cliquable pour cette action
      - verbe: utiliser
        cible: potion
        bouton: "💚 Utiliser la potion"
        si: "potion"
        faire:
          - "-potion&&inventaire&&null"
          - "pv.+.5"
          - "score.+.5"
        texte_ok: "Vous buvez la potion. +5 PV, +5 score ! (PV : v_pv_v/v_pvmax_v)"
        texte_ko: "Vous n'avez pas de potion."

    choix:
      - commande: "retour"
        vers: accueil


  # ───────────────────────────────────────────────────────────────
  # SALLE 4 — ÉVÉNEMENTS AUTOMATIQUES & ALÉATOIRE
  #
  # Montre :
  #   - init: avec %=X:Y (aléatoire à l'entrée)
  #   - init: avec variables comme bornes (%=v_a_v:v_b_v)
  #   - événements 997 séquentiels (chaque dé → texte différent)
  #   - comportement séquentiel : chaque 997 voit les valeurs des précédents
  #   - table de loot pondérée (redirection)
  #   - table de valeur pondérée (variable)
  # ───────────────────────────────────────────────────────────────
  - id: demo_events
    texte: |
      **🎲 Démonstration — Événements automatiques & Aléatoire**

      À l'entrée de cette salle, un dé est lancé automatiquement.
      Résultat du dernier lancer : v_desresultat_v 🎲
      (0 à la première visite — le tirage s'affiche à la prochaine entrée)

      Cliquez sur un bouton pour voir d'autres exemples.

    # init: s'exécute à chaque entrée dans la salle (équivalent L3 en .txt)
    # %=1:6 tire un entier aléatoire entre 1 et 6
    init:
      - var: desresultat
        valeur: "%=1:6"
        description: "Résultat du lancer de dé (1-6)"

      # Aléatoire avec variables comme bornes
      - var: chance
        valeur: "%=v_force_v:v_pvmax_v"
        description: "Chance recalculée selon force et PV max"

    # evenements: s'exécutent dans l'ordre après init
    # ⚠️ CRITIQUE : comportement séquentiel — chaque 997 voit les valeurs
    # modifiées par les précédents. Un 997 qui redirige stoppe les suivants.
    evenements:
      # Chaque face du dé affiche un texte différent
      - si: "v_desresultat_v = 1"
        faire: "score.+.1"
        texte: "🎲 Face 1 — Malchance ! (+1 score quand même)"

      - si: "v_desresultat_v = 2"
        faire: "score.+.2"
        texte: "🎲 Face 2 — Pas terrible... (+2 score)"

      - si: "v_desresultat_v = 3"
        faire: "score.+.3"
        texte: "🎲 Face 3 — Correct. (+3 score)"

      - si: "v_desresultat_v = 4"
        faire: "score.+.4"
        texte: "🎲 Face 4 — Bien joué ! (+4 score)"

      - si: "v_desresultat_v = 5"
        faire: "score.+.5"
        texte: "🎲 Face 5 — Excellent ! (+5 score)"

      - si: "v_desresultat_v = 6"
        faire: "score.+.10"
        texte: "🎲 Face 6 — CRITIQUE ! Score doublé ! (+10 score)"

    choix:
      - commande: "relancer_de"
        bouton: "🎲 Relancer le dé"
        vers: demo_events  # retourner dans la même salle relance init

      - commande: "globaux"
        bouton: "✨ Événements globaux"
        vers: demo_events_globaux

      - commande: "loot"
        bouton: "🎁 Table de loot"
        vers: demo_loot

      - commande: "retour"
        vers: accueil


  # ───────────────────────────────────────────────────────────────
  # SALLE 4b — TABLE DE LOOT PONDÉRÉE
  #
  # Montre :
  #   - redirection pondérée : %=salle1:poids,salle2:poids,...
  #   - valeur pondérée : var.=.%val1:poids,val2:poids,...
  #   - poids avec variables
  # ───────────────────────────────────────────────────────────────
  - id: demo_loot
    texte: |
      **🎁 Démonstration — Tables de loot pondérées**

      Un coffre mystérieux s'ouvre...

    init:
      # Valeur pondérée : degats vaut 1 (70%), 2 (20%), 3 (10%)
      - var: desresultat
        valeur: "%=1:6"

    evenements:
      # Redirection pondérée : 60% commun, 30% rare, 10% légendaire
      # Les poids sont relatifs (pas besoin de totaliser 100)
      - si: ~
        faire: "%=loot_commun:60,loot_rare:30,loot_legendaire:10"
        texte: "Vous ouvrez le coffre..."


  # ── Salles de résultat de loot ──
  - id: loot_commun
    texte: |
      **🪨 Loot Commun**
      Vous trouvez quelques pièces de cuivre. (+2 score)
    evenements:
      - si: ~
        faire: "score.+.2"
    choix:
      - commande: "relancer"
        bouton: "🔄 Relancer"
        vers: demo_loot
      - commande: "accueil"
        vers: accueil

  - id: loot_rare
    texte: |
      **💎 Loot Rare !**
      Une gemme bleue scintillante ! (+10 score)
    evenements:
      - si: ~
        faire: "score.+.10"
    choix:
      - commande: "relancer"
        bouton: "🔄 Relancer"
        vers: demo_loot
      - commande: "accueil"
        vers: accueil

  - id: loot_legendaire
    texte: |
      **🌟 LOOT LÉGENDAIRE !!**
      Un artefact ancien ! Incroyable ! (+50 score)
    evenements:
      - si: ~
        faire: "score.+.50"
    choix:
      - commande: "relancer"
        bouton: "🔄 Relancer"
        vers: demo_loot
      - commande: "accueil"
        vers: accueil


  # ───────────────────────────────────────────────────────────────
  # SALLES — ÉVÉNEMENTS GLOBAUX
  #
  # Montre :
  #   - event_global: ON/OFF/SWITCH pour activer/désactiver un 997 global
  #   - Les événements globaux s'exécutent dans toutes les salles
  #   - Déclarés dans evenements_globaux: en bas du fichier
  # ───────────────────────────────────────────────────────────────
  - id: demo_events_globaux
    texte: |
      **✨ Démonstration — Événements globaux**

      Les événements globaux s'exécutent à chaque salle visitée
      (après les événements locaux par défaut).

      Ici, vous pouvez activer un bonus de +1 score par salle visitée.
      Une fois activé, naviguez dans d'autres salles pour le voir s'appliquer.

    evenements:
      # event_global:id:ON active l'événement global "bonus_visite"
      # Déclaré dans evenements_globaux: en bas du fichier
      - si: ~
        faire: "event_global:bonus_visite:ON"
        texte: "✨ Bonus global activé ! (+1 score à chaque salle visitée)"

    choix:
      - commande: "desactiver"
        bouton: "🚫 Désactiver le bonus"
        vers: demo_events_globaux_off
      - commande: "retour"
        vers: accueil

  - id: demo_events_globaux_off
    texte: |
      **✨ Bonus global désactivé**

    evenements:
      # event_global:id:OFF désactive l'événement global
      # SWITCH inverserait l'état : ON→OFF ou OFF→ON
      - si: ~
        faire: "event_global:bonus_visite:OFF"
        texte: "🚫 Bonus global désactivé."

    choix:
      - commande: "reactiver"
        bouton: "✨ Réactiver"
        vers: demo_events_globaux
      - commande: "retour"
        vers: accueil

  # ───────────────────────────────────────────────────────────────
  # SALLE 5 — VARIABLES & CONDITIONS AVANCÉES
  #
  # Montre :
  #   - condition = != > >= < <=
  #   - condition .in. (intervalle inclus) et .out. (intervalle exclus)
  #   - comparer deux variables entre elles (v_a_v > v_b_v)
  #   - conditions multiples ET (v_a_v = 1 v_b_v = 2)
  #   - condition objet présent / absent (-objet)
  #   - variable textuelle t_nom_t dans les textes et conditions
  #   - modification enchaînée @@ (plusieurs actions dans faire:)
  #   - num: explicite (cas migration depuis .txt — rare en YAML natif)
  # ───────────────────────────────────────────────────────────────
  - id: demo_variables
    texte: |
      **🔢 Démonstration — Variables & Conditions**

      Score : v_score_v ⭐ | PV : v_pv_v/v_pvmax_v ❤️
      Nom : t_nomjoueur_t | Compteur : v_compteur_v

      Les événements ci-dessous s'exécutent automatiquement à l'entrée.

    init:
      # Incrémenter le compteur à chaque visite
      - var: compteur
        valeur: "+1"

    evenements:
      # ── Opérateurs de comparaison ──
      - si: "v_score_v = 0"
        texte: "📊 Score nul — vous débutez !"

      - si: "v_score_v > 0"
        texte: "📊 Score positif : v_score_v points !"

      - si: "v_pv_v < v_pvmax_v"
        texte: "❤️ Vous n'êtes pas à pleine santé (v_pv_v/v_pvmax_v)"

      - si: "v_pv_v = v_pvmax_v"
        texte: "❤️ Vous êtes à pleine santé !"

      # ── Intervalle .in. (inclus) ──
      - si: "v_score_v in 1-9"
        texte: "⭐ Score entre 1 et 9 — continuez !"

      # ── Intervalle .out. (exclus) ──
      - si: "v_score_v out 1-99"
        texte: "🏆 Score hors de la plage 1-99 (≤0 ou ≥100) !"

      # ── Conditions multiples ET ──
      - si: "v_compteur_v > 1 v_score_v > 0"
        texte: "🔁 Vous avez visité cette salle plusieurs fois ET avez des points !"

      # ── Condition objet présent / absent ──
      - si: "grimoire"
        texte: "📖 Vous avez le grimoire de la salle Objets !"

      - si: "-grimoire"
        texte: "📖 Vous n'avez pas le grimoire (allez en salle Objets pour le prendre)."

      # ── Actions multiples enchaînées @@ (ou liste YAML) ──
      - si: "v_score_v > 50"
        faire:
          - "pv.+.2"
          - "score.+.5"
        texte: "🌟 Score > 50 ! Bonus : +2 PV et +5 score !"

    actions:
      # Modifier le nom du joueur (variable textuelle)
      - verbe: renommer
        cible: all
        si: ~
        faire:
          - var_texte: nomjoueur
            valeur: "t_action_cible_t"
            description: "Nom du joueur"
        texte_ok: "Votre nom est maintenant : t_nomjoueur_t"

      - verbe: soigner
        cible: all
        si: ~
        faire:
          - "pv.=.v_pvmax_v"
        texte_ok: "❤️ PV restaurés à v_pvmax_v !"

    choix:
      - commande: "retour"
        vers: accueil


  # ───────────────────────────────────────────────────────────────
  # SALLE 6 — SONS, IMAGES, FORMATAGE
  #
  # Montre :
  #   - <<url>> son audio (remplace le son en cours)
  #   - <<N:url>> sons simultanés sur canaux séparés
  #   - <<stop>> arrête tous les sons
  #   - <<stop:N>> arrête uniquement le canal N
  #   - [[url]] image
  #   - [[texte]] bloc markdown Discord
  #   - **gras** dans le texte
  #   - +n+ saut de ligne (accepté pour migration .txt)
  #   - variables dans les textes (v_nom_v et t_nom_t)
  # ───────────────────────────────────────────────────────────────
  - id: demo_media
    texte: |
      **🔊 Démonstration — Sons, Images, Formatage**

      <<https://cyril-fiesta.fr/jdr-bot/scenarios/sounds/sulimo/balade.mp3>>

      Une mélodie apaisante joue. (<<url>> lance un son)
      🎵 *Musique issue du scénario "Une galerie pour Sulimo" (Virginie Chaillou)*

      [[**📖 Bloc markdown Discord**
      Ce texte est dans un bloc [[texte]] — affiché en code block.
      Utile pour les tableaux ou les données structurées.]]

      **Texte en gras** avec **markdown** natif.
      Score actuel : v_score_v ⭐ | Joueur : t_nomjoueur_t

    evenements:
      - si: ~
        faire: "score.+.3"
        texte: "+3 score pour avoir exploré la salle média !"

    actions:
      # Sons simultanés sur canaux séparés (v4.6+)
      - verbe: tester
        cible: canaux
        bouton: "🎵 Sons simultanés"
        si: ~
        texte_ok: |
          <<1:https://cyril-fiesta.fr/jdr-bot/scenarios/sounds/sulimo/balade.mp3>>
          <<2:https://cyril-fiesta.fr/jdr-bot/scenarios/sounds/combat/kotor-hit.wav>>
          Deux sons jouent simultanément sur les canaux 1 et 2 !

      # Arrêter tous les sons
      - verbe: stopper
        cible: sons
        bouton: "🔇 Stop tous les sons"
        si: ~
        texte_ok: "<<stop>>Tous les sons sont arrêtés."

      # Arrêter un canal précis
      - verbe: stopper
        cible: canal1
        si: ~
        texte_ok: "<<stop:1>>Canal 1 arrêté."

    choix:
      - commande: "retour"
        vers: accueil


  # ───────────────────────────────────────────────────────────────
  # SALLE 7 — TIMERS
  #
  # Montre :
  #   - {{timer:N}} pause visuelle (bloque N secondes avec affichage)
  #   - timer: dans un événement (timer asynchrone → redirige à expiration)
  #   - plusieurs timers simultanés
  #   - annulation de timer
  # ───────────────────────────────────────────────────────────────
  - id: demo_timers
    # bouton: défini ici plutôt que dans le choix: de l'accueil.
    # Alternative à mettre bouton: dans le choix — le résultat est identique.
    bouton: "⏱️ Timers"
    texte: |
      **⏱️ Démonstration — Timers**

      Trois types de timers existent :

      1. {.{timer:N}.} (sans les points) — pause visuelle
         Bloque le jeu N secondes, puis affiche les choix.

      2. timer: dans un événement — timer local (lié à la salle)
         Se lance à l'entrée de la salle. Si vous quittez la salle,
         il s'annule. Utile pour des compte-à-rebours in-situ.

      3. timer_global: ON/OFF/SWITCH — timer global
         Continue même si vous changez de salle. Déclenche les
         événements globaux quand il atteint 0.

      Cliquez un bouton pour tester :

    choix:
      - commande: "pause"
        bouton: "⏳ Pause visuelle (3s)"
        vers: demo_timer_block

      - commande: "local"
        bouton: "⏱️ Timer local (5s)"
        vers: demo_timer_local

      - commande: "global"
        bouton: "🌐 Timer global (10s)"
        vers: demo_timer_global

      - commande: "retour"
        vers: accueil


  - id: demo_timer_block
    texte: |
      **⏳ Timer block — pause visuelle**

      Le jeu est suspendu pendant 3 secondes...
      {{timer:3}}
      Reprise ! La pause visuelle est terminée.

    evenements:
      - si: ~
        faire: "score.+.2"
        texte: "+2 score pour votre patience !"

    choix:
      - commande: "timers"
        bouton: "↩️ Retour aux timers"
        vers: demo_timers
      - commande: "accueil"
        vers: accueil


  - id: demo_timer_local
    texte: |
      **⏱️ Timer local — lié à la salle**

      Un timer de 5 secondes démarre à l'entrée de cette salle.
      Restez ici — si vous partez, il s'annule.

    evenements:
      # timer: dans un événement → timer local lié à la salle
      # Déclenché à l'entrée (init implicite via 997 null)
      # Si le joueur quitte la salle, le timer s'annule automatiquement
      - si: ~
        timer: sablier
        duree: "5"
        vers: timer_local_expire
        texte: "⏱️ Timer 'sablier' lancé — v_sablier_v secondes restantes."

    choix:
      - bouton: "🌐 Tester le timer global"
        vers: demo_timer_global
      - commande: "retour"
        vers: accueil


  - id: timer_local_expire
    texte: |
      **⏱️ Timer local expiré !**

      Les 5 secondes se sont écoulées sans que vous partiez.
      (+3 score pour votre patience !)

    evenements:
      - si: ~
        faire: "score.+.3"
        vers: demo_timers


  - id: demo_timer_global
    texte: |
      **🌐 Timer global — survit aux changements de salle**

      Un timer global de 10 secondes est activé.
      Contrairement au timer local, il continue même si vous
      naviguez vers d'autres salles !

      Quand il atteint 0, l'événement global "alarme" se déclenche
      dans la salle où vous serez à ce moment-là.

      Naviguez librement — le timer tourne en fond.

    evenements:
      # Si le timer est déjà en cours, afficher le temps restant sans le relancer
      - si: "v_bombe_en_cours_v = 1"
        texte: "🌐 Timer 'comptebombe' en cours — v_comptebombe_v secondes restantes."

      # timer_global: ON → active le timer global "comptebombe"
      # event_global: ON → active l'alarme qui se déclenche à l'expiration
      # bombe_en_cours passe à 1 → empêche ce 997 de se réexécuter à l'expiration
      # (à l'expiration, verifier_cases_speciales repasse par cette salle avant les globaux)
      - si: "v_bombe_en_cours_v = 0"
        faire:
          - "bombe_en_cours.=.1"
          - "timer_global:comptebombe:ON"
          - "event_global:alarme_bombe:ON"
        texte: "🌐 Timer global 'comptebombe' activé — v_comptebombe_v secondes restantes."

    choix:
      - commande: "retour"
        vers: accueil


  # ───────────────────────────────────────────────────────────────
  # SALLE 8 — VARIABLES ONLINE & LEADERBOARD
  #
  # Montre :
  #   - vars_online dans le titre (v_nbparties_o_v)
  #   - mise à jour conditionnelle du record (afficher source, pas destination)
  #   - nb_parties_o automatique (incrémenté à chaque lancement)
  #   - variable online textuelle
  # ───────────────────────────────────────────────────────────────
  - id: demo_online
    texte: |
      **🌐 Démonstration — Variables Online**

      Les variables online persistent entre TOUTES les parties,
      sur TOUS les serveurs Discord.

      📊 Statistiques globales :
      • Parties jouées : v_nbparties_o_v
      • Record de score : v_recordscore_o_v ⭐

      Votre score actuel : v_score_v ⭐

    evenements:
      # ⚠️ PIÈGE CLASSIQUE : le texte d'un 997 est évalué AVANT l'action.
      # Pour afficher le NOUVEAU record, afficher v_score_v (la source),
      # pas v_recordscore_o_v (la destination qui n'est pas encore mise à jour).
      - si: "v_score_v > v_recordscore_o_v"
        faire: "recordscore_o.=.v_score_v"
        texte: "🏆 Nouveau record mondial : v_score_v ⭐ (ancien : v_recordscore_o_v)"

      - si: "v_score_v <= v_recordscore_o_v"
        texte: "📊 Record actuel : v_recordscore_o_v ⭐ — essayez de le battre !"

    choix:
      - commande: "retour"
        vers: accueil


  # ───────────────────────────────────────────────────────────────
  # SALLE 9 — FINS DE PARTIE
  #
  # Montre :
  #   - fin: victoire (→ salle 999 interne)
  #   - fin: defaite  (→ salle 998 interne)
  #   - fin directe dans un événement (pas via salle intermédiaire)
  #   - salle intermédiaire avec texte avant la fin
  #   - condition sur le score pour choisir quelle fin
  # ───────────────────────────────────────────────────────────────
  - id: demo_fins
    texte: |
      **🏆 Démonstration — Fins de partie**

      Score final : v_score_v ⭐

      Choisissez votre fin :

    choix:
      - commande: "victoire"
        bouton: "🏆 Fin Victoire"
        vers: fin_victoire

      - commande: "defaite"
        bouton: "💀 Fin Défaite"
        vers: fin_defaite

      - commande: "auto"
        bouton: "🎲 Fin automatique (selon score)"
        vers: fin_auto

      - commande: "retour"
        vers: accueil


  - id: fin_victoire
    texte: |
      <<https://cyril-fiesta.fr/jdr-bot/scenarios/sounds/chateau/congratulations.ogg>>
      **🏆 VICTOIRE !**

      Félicitations t_nomjoueur_t !
      Score final : v_score_v ⭐
      Record mondial : v_recordscore_o_v ⭐

    evenements:
      # fin: victoire → déclenche la fin de partie (équivalent 999 en .txt)
      # fin: et faire: sont exclusifs — on ne peut pas les mettre ensemble.
      # Si on veut faire une action ET terminer, utiliser une salle intermédiaire.
      - si: ~
        faire: "recordscore_o.=.v_score_v"
      - si: ~
        fin: victoire
        texte: "🏆 Vous avez terminé le Showcase avec v_score_v points !"


  - id: fin_defaite
    texte: |
      **💀 DÉFAITE**

      Vous abandonnez t_nomjoueur_t...
      Score : v_score_v ⭐

    evenements:
      # fin: defaite → équivalent 998 en .txt
      - si: ~
        fin: defaite
        texte: "💀 Partie terminée. Recommencez pour améliorer votre score !"


  - id: fin_auto
    texte: |
      **🎲 Fin automatique selon votre score...**
      Score : v_score_v ⭐

    evenements:
      # Fin conditionnelle : victoire si score > 20, défaite sinon
      # ⚠️ Les événements s'arrêtent au premier qui redirige ou termine.
      # Donc : mettre le cas "victoire" en premier avec sa condition,
      # puis le cas "défaite" sans condition (toujours vrai si on arrive là).
      - si: "v_score_v > 20"
        fin: victoire
        texte: "🏆 Score suffisant (>20) — Victoire !"

      - si: ~
        fin: defaite
        texte: "💀 Score insuffisant (≤20) — Défaite ! Score : v_score_v"


# ═════════════════════════════════════════════════════════════════
# ALIAS GLOBAUX
# Déclarés une fois ici — réutilisables dans toutes les salles via commande: nom.
# Le label s'affiche automatiquement en bouton sans avoir à répéter bouton: partout.
# ═════════════════════════════════════════════════════════════════
alias_globaux:
  retour: "🏠 Accueil"
  accueil: "🏠 Accueil"


# ═════════════════════════════════════════════════════════════════
# ACTIONS GLOBALES
# Disponibles dans TOUTES les salles, pas seulement dans une salle.
# Idéales pour les commandes universelles (aller, examiner, aide...).
# ═════════════════════════════════════════════════════════════════
actions_globales:
  # Navigation libre : aller [destination] (Discord : /action aller [destination])
  # t_action_cible_ok_t = dernière cible valide tapée (= nom de salle reconnu)
  # t_action_cible_t    = dernière cible tapée (valide ou non)
  - verbe: aller
    cible: all
    si: ~
    faire: "t_action_cible_ok_t"
    texte_ko: "Destination «t_action_cible_t» inconnue."

  # Score : afficher le score depuis n'importe où
  - verbe: score
    cible: all
    si: ~
    texte_ok: "⭐ Score actuel : v_score_v | Record : v_recordscore_o_v"

# ═════════════════════════════════════════════════════════════════
# ÉVÉNEMENTS GLOBAUX
# S'exécutent dans TOUTES les salles (après les 997 locaux par défaut).
# État OFF par défaut — activables via event_global:id:ON dans n'importe quelle salle.
# Option 997_globaux: avant → les exécute AVANT les 997 locaux.
# ═════════════════════════════════════════════════════════════════
# 997_globaux: apres   # "avant" ou "apres" (défaut : apres)

evenements_globaux:
  # Bonus visite : +1 score à chaque salle visitée
  # Activé/désactivé depuis demo_events_globaux
  - id: bonus_visite
    etat: OFF          # OFF par défaut — activé via event_global:bonus_visite:ON
    si: ~
    faire: "score.+.1"
    texte: "✨ Bonus visite : +1 score ! (Total : v_score_v)"

  # Exemple avec condition : ne s'applique que si PV < 5
  - id: soin_urgence
    etat: OFF
    si: "v_pv_v < 5"
    faire: "pv.+.2"
    texte: "🚑 Soin d'urgence ! +2 PV (PV : v_pv_v/v_pvmax_v)"

  # Alarme liée au timer global "comptebombe"
  # Activé automatiquement avec le timer depuis demo_timer_global
  # Se déclenche quand comptebombe atteint 0 (verifier_cases_speciales appelé par le renderer)
  - id: alarme_bombe
    etat: OFF
    si: "v_comptebombe_v = 0"
    faire:
      - "event_global:alarme_bombe:OFF"
      - "score.+.10"
      - "bombe_en_cours.=.0"
    vers: demo_timers
    texte: "💥 BOOM ! Le timer 'comptebombe' a expiré — où que vous soyez ! (+10 score)"


# ═════════════════════════════════════════════════════════════════
# TIMERS GLOBAUX
# Continuent même après un changement de salle.
# Activés via timer_global:id:ON — désactivés via timer_global:id:OFF.
# À expiration (deadline atteinte), déclenche verifier_cases_speciales
# (997 locaux + globaux) dans la salle courante du joueur.
# ═════════════════════════════════════════════════════════════════
timers_globaux:
  # Timer "comptebombe" : utilisé dans demo_timer_global
  # Activé via timer_global:comptebombe:ON depuis demo_timer_global
  - id: comptebombe
    duree: 10          # durée en secondes
    etat: OFF          # OFF par défaut
