# Configuration des échelles

Ce chapitre explique `config/ladders.lua` : la liste des véhicules à échelle reconnus par le script, avec leurs props, leurs butées, leurs extras et leurs places. C'est le chapitre le plus technique, mais c'est lui qui permet d'utiliser MasterLadder avec n'importe quel véhicule à échelle.

## Principe

- Une entrée par véhicule. **La clé est le nom de spawn du véhicule** (ex. `['epan']`).
- Tout réglage absent d'une entrée reprend celui de **`Config.LadderDefaults`** (en bas du fichier). Une entrée peut donc se limiter à son nom, ses props et ce qui diffère.
- **Unités** : angles en degrés, distances en mètres, durées en millisecondes.
- **Repère de rotation** : 0° = échelle vers l'avant (au-dessus de la cabine), sens horaire vu de dessus.

```lua
Config.Ladders = {
    ['epabspp'] = {
        label = "EPA BSPP",
        props = {
            turntable = "prop_tl2_base",
            D         = "prop_tl2_ladder1",
            C         = "prop_tl2_ladder2",
            B         = "prop_tl2_ladder3",
            A         = "prop_tl2_ladder4",
            S         = "prop_tl2_ladder5",
            basket    = "prop_tl2_cage",
            stab      = "prop_tl2_outriggers",
        },
        interface = { theme = nil, forced = false, model = "ML 32", serial = "N° de série 2004-1187" },
        seat = { angle = 143.24, distance = 1.3, height = 0.24 },
        -- le reste reprend Config.LadderDefaults
    },
}
```

## Identité et props

- **`label`** : nom affiché (pupitre, messages).
- **`props`** : noms des modèles de l'échelle, streamés par la ressource du véhicule. **Les 8 sont obligatoires** ; une entrée incomplète est ignorée, avec un avertissement dans la console.
  - `turntable` : tourelle
  - `D` : plan fixe
  - `C`, `B`, `A` : plans coulissants
  - `S` : bras de nacelle
  - `basket` : nacelle
  - `stab` : stabilisateur (utilisé 4 fois)

## Déploiement

- **`deployTime`** : durée totale de la mise en station et du repli (ms). `0` = durées réalistes de `Config.Stabilization.timing` (environ 9 s) ; une autre valeur ramène toute la séquence à cette durée.
- **`maxSlope`** (défaut `8.0`) : pente **et** dévers maximaux du véhicule (°) pour caler. Ils sont corrigés par la mise à niveau.

## Butées

- **`elevation`** (défaut `{ min = -15.0, max = 75.0 }`) : inclinaison de l'échelle (°).
- **`length`** (défaut `{ min = 0.0, max = 23.0 }`) : longueur sortie (m), en plus de la longueur repliée.
- **`arm`** (défaut `{ min = -90.0, max = 0.0, floor = -35.0 }`) : bras de nacelle (°). `floor` : le bras ne pointe jamais plus bas que `floor` sous l'horizontale, quelle que soit l'inclinaison de l'échelle. Plus bas que -35° environ, la nacelle heurte le bras.
- **`light`** (défaut `{ left = -90.0, right = 90.0, down = -85.0, up = 85.0 }`) : débattement du projecteur (°).
- **`rotation`** : zone interdite à l'arrière du véhicule.
  - `stopRight` / `stopLeft` : butées en tournant à droite / à gauche.
  - `resumeRight` / `resumeLeft` : au-delà, la rotation est de nouveau possible (pour ressortir de la zone).
- **`cabZone`** (défaut `{ from = 324.0, to = 34.0 }`) : secteur au-dessus de la cabine où l'échelle ne peut pas descendre sous l'horizontale.

## Extras du véhicule

- **`extras`** : numéros des extras du modèle.
  - `ladder` (défaut `{ 5, 10 }`) : extras de l'échelle repliée, masqués quand elle est déployée.
  - `left` / `right` (défaut `{ open = 6, closed = 7 }` / `{ open = 12, closed = 11 }`) : coffres gauche / droite.
  - `screen` (défaut `{ on = 9, off = 8 }`) : écran de commande arrière.
- **`spawnExtras`** : état du véhicule à sa première apparition.
  - `left`, `right` : `"open"` ou `"closed"`
  - `screen` : `"on"` ou `"off"`
  - `others` : autres extras, `[numéro] = true` (visible) ou `false` (masqué). Ex. `{ [1] = true, [3] = false }`.

💡 Les extras sont appliqués sans réparer le véhicule : les dégâts et les portes ouvertes sont conservés.

## Places

- **`seat`** (défaut `{ angle = 131.78, distance = 1.0, height = -0.28 }`) : position du poste de commande autour de la tourelle (angle en °, distance et hauteur en m).
- **`basketPlaces`** (défaut `3`) : nombre de places dans la nacelle (1 à 3).
- **`basketSpots`** : position de chaque place autour du centre de la nacelle (`angle` en °, `distance` en m).

## Logements des stabilisateurs

- **`stabilizers`** (défaut `{ front = 1.5, rear = -2.3, side = 0.02, height = -0.2 }`) : emplacement des stabilisateurs rentrés, dans le repère du véhicule (m). C'est leur position au repos (`Config.StowedStabilizers`) et le point de départ du déploiement.
  - `front` / `rear` : position le long du véhicule (+ vers l'avant, - vers l'arrière)
  - `side` : écart latéral rentré
  - `height` : hauteur (négatif = plus bas)

💡 Réglage en direct : `Config.Debug = true`, approchez-vous du véhicule replié et tapez par exemple `/mlstab front 1.9` (valeur absolue), `/mlstab out +0.02` (sortir un peu plus) ou `/mlstab rear -0.05 rel` (relatif). Les stabilisateurs se replacent immédiatement et la console F8 affiche la ligne `stabilizers = { … }` à copier dans `config/ladders.lua`.

## Abaque

- **`abaque`** : déport maximal de la nacelle (m), c'est-à-dire la distance horizontale entre l'axe de la tourelle et la nacelle.
  - `enabled` (défaut `true`)
  - `persons` (défaut `{ 23.0, 20.0, 17.0, 14.0 }`) : nacelle vide, 1, 2, 3 personnes, en **calage complet**.
  - `reduced` (défaut `{ 15.0, 13.0, 11.0, 9.0 }`) : les mêmes en **calage réduit**.
  - `monitor` (défaut `3.0`) : mètres retirés quand la lance débite.
  - Calage asymétrique : la courbe `reduced` s'applique **par le travers du côté réduit** ; au-dessus de l'avant et de l'arrière du camion, la courbe `persons` reste valable, avec une transition progressive entre les deux.
  - `reducedWidth` (défaut `1.0`) : sortie latérale des stabilisateurs en calage réduit (m ; calage complet : 2,02 m).

Les valeurs doivent aller du plus grand (nacelle vide) au plus petit (3 personnes). Elles sont dessinées sur le pupitre sous forme de courbes.

## Lance canon

- **`monitor`**
  - `enabled` (défaut `true`) : lance présente sur cette échelle.
  - `offset` (défaut `{ side = 0.0, forward = 0.85, height = 1.05 }`) : position de la lance par rapport au centre de la nacelle (m ; `forward` = vers l'avant de l'échelle).
  - `yaw` (défaut `60.0`) : débattement en degrés de part et d'autre de l'axe de l'échelle.
  - `pitch` (défaut `{ down = -60.0, up = 45.0 }`) : débattement vertical (°).

## Collisions des props

- **`collisions`** (défaut `{ sections = false, basket = true, stabs = true }`) : active les collisions des sections, de la nacelle et des stabilisateurs. À n'activer que si les modèles en possèdent.

## Interface

- **`interface`**
  - `theme` : `nil` (choix du joueur), `"modern"` ou `"retro"` (interface suggérée pour cette échelle).
  - `forced` : `true` impose `theme` à tous les joueurs pour cette échelle.
  - `model`, `serial` : textes de la plaque constructeur du pupitre années 2000.

## Ajouter un véhicule

1. Vérifiez que la ressource du véhicule stream bien **le véhicule et les 8 props** de l'échelle.
2. Copiez une entrée existante et renommez la clé avec le **nom de spawn** du véhicule.
3. Renseignez `label` et `props`.
4. Ajustez les **numéros d'extras** du modèle (`extras`) et l'état de spawn (`spawnExtras`).
5. Redémarrez la ressource, déployez, puis ajustez en jeu `seat`, `basketSpots` et les butées.

💡 Avec `Config.Debug = true`, la console signale les props introuvables par leur nom, et `/mldebug` affiche au-dessus de l'échelle son état complet.