{
  "_lisez_moi": "Contrat des capacites speciales (ligne 59). Ce n'est PAS une donnee d'auteur: chaque genre est du code du jeu (scripts/combat/abilities.gd). PHP le lit pour valider, le gestionnaire pour dessiner les formulaires, Godot pour charger et completer les reglages. Ajouter un genre: le coder dans abilities.gd, puis le declarer ici.",
  "contract_version": 1,
  "param_types": ["int", "number", "bool", "choice", "enemy"],
  "triggers": {
    "spawn": {"label": "À l'apparition", "hint": "Une fois, quand la créature entre dans la salle."},
    "death": {"label": "À la mort", "hint": "Au moment où elle tombe, à l'endroit où elle tombe."},
    "health_below": {"label": "Sous un seuil de PV", "hint": "Une seule fois par vie, quand ses PV passent sous le seuil.", "threshold": true}
  },
  "kinds": {
    "summon": {
      "label": "Invoquer des acolytes",
      "hint": "Fait apparaître des créatures autour du lanceur, autour du héros ou le long des bords de la salle.",
      "params": {
        "creature": {"type": "enemy", "label": "Créature invoquée", "default": ""},
        "count": {"type": "int", "label": "Nombre par invocation", "min": 1, "max": 12, "default": 2},
        "max_alive": {"type": "int", "label": "Acolytes vivants au plus", "hint": "Ceux de ce lanceur, toutes invocations confondues. 0 = sans plafond.", "min": 0, "max": 40, "default": 4},
        "placement": {"type": "choice", "label": "Où ils apparaissent", "default": "around_caster",
          "options": {"around_caster": "Autour du lanceur", "around_hero": "Autour du héros", "room_edges": "Le long des bords de la salle"}},
        "radius": {"type": "number", "label": "Rayon (px)", "hint": "Distance au lanceur ou au héros.", "min": 0, "max": 1200, "default": 140},
        "holds_room": {"type": "bool", "label": "Retiennent la salle", "hint": "La sortie reste fermée tant qu'ils vivent.", "default": true},
        "die_with_caster": {"type": "bool", "label": "Disparaissent avec le lanceur", "hint": "Sans butin ni compte de victime.", "default": true},
        "drops_loot": {"type": "bool", "label": "Lâchent leur butin", "default": false}
      }
    },
    "flee": {
      "label": "Fuir",
      "hint": "La créature quitte la salle en courant par le bord le plus proche. Elle compte comme vaincue pour la porte, et son crochet « à la fuite » s'exécute.",
      "params": {
        "speed_multiplier": {"type": "number", "label": "Vitesse de fuite (× sa vitesse)", "min": 0.5, "max": 5, "default": 1.6},
        "drops_loot": {"type": "bool", "label": "Lâche son butin", "hint": "Par défaut non : elle n'est pas tombée.", "default": false}
      }
    },
    "companion_gesture": {
      "label": "Geste d'un compagnon",
      "hint": "Le combat final : si sa quête est faite, le compagnon intervient — une réplique en bandeau, puis son geste. Sinon, rien : son seuil passe.",
      "params": {
        "gesture": {"type": "choice", "label": "Geste", "default": "claw",
          "options": {"claw": "La pince (l'entité ne frappe plus)", "swarm": "L'essaim (l'entité aveuglée)", "jays": "Tous les Jay (un coup groupé)", "micro": "Le micro (l'entité encaisse plus)", "diversion": "La fête-surprise (l'entité se détourne)", "tune": "L'air du toit (l'entité étourdie)", "shield": "Le bouclier (le héros ne prend rien)", "bob": "Bob s'interpose (le héros ne prend rien)"}},
        "requires": {"type": "choice", "label": "Quête faite", "hint": "Le fait qui dit la quête du compagnon accomplie.", "default": "gab_port_evening_done",
          "options": {"gab_port_evening_done": "Gab : la soirée du port", "eltuna_honey_made": "eLTuna : le miel royal", "jay_dinner_done": "Jay : le dîner aux chandelles", "mld_election_done": "MLD : le référendum", "abominable_diversion": "L'Abominable : sa fête", "roof_tune": "Le Saule : le concert", "gars_rond_shield": "Gars-Rond : la structure du Mont", "true_end_ready": "La vraie fin réunie (Bob)"}},
        "marks": {"type": "choice", "label": "Fait posé", "hint": "Un fait que le geste pose en agissant (le micro arraché : le présentateur quitte le toit).", "default": "none",
          "options": {"none": "Aucun", "roof_mic_taken": "Le micro arraché", "roof_bob_sacrifice": "Bob s'est interposé"}},
        "seconds": {"type": "number", "label": "Durée (s)", "hint": "Le micro et le bouclier ; les autres gestes durent ce que dure leur effet.", "min": 0, "max": 30, "default": 4},
        "power": {"type": "number", "label": "Force", "hint": "Tous les Jay : part de la vie de l'entité (0,05 = 5 %). Le micro : dégâts en plus (0,5 = +50 %).", "min": 0, "max": 5, "default": 0.5}
      }
    }
  }
}
