Aller au contenu

Bases aériennes — DM.Airbase

Classe définie en sources/DynamicMission.lua:1282-2076.

Suivi de coalition

Chaque instance suit localement coalition/coalitionPrevious, rafraîchis à la demande par updateCoalition(). Les méthodes isNeutral()/isRed()/isBlue()/isAlly() lisent en revanche toujours la coalition DCS live, pas la valeur mise en cache — donc fiables même entre deux updateCoalition() explicites.

Mécanique du Jerrycan (ancrage neutre)

spawnJerrycan() ne s'applique qu'aux bases neutres. Un objet statique "Jerrycan" (catégorie Fortifications) est posé sur l'un de deux emplacements pré-calculés (perpendiculaires à la piste, décalage de 50 m par défaut), choisi aléatoirement avec repli sur l'autre emplacement si le premier est obstrué. Le spawn de l'objet statique fait lui-même basculer la coalition DCS de la base — confirmé par l'appel immédiat à updateCoalition() qui suit. N'est appelé qu'une fois, au démarrage de la mission, pour les bases liées à une région et neutres.

Spawn automatique de défenses : trois déclencheurs

Atterrissage_handleLanding() sur S_EVENT_LAND. Si la coalition du joueur atterrissant diffère de celle de la base et qu'aucune défense n'est encore posée, spawn de 1 à 3 groupes (aléatoire) pour la coalition du joueur atterrissant — protège l'intrus après capture/atterrissage sur un terrain auparavant hostile ou neutre.

ProximitécheckEnemiesProximityForDefenses(), scheduler à 30 s. Pour toute base alliée — ou neutre avec Jerrycan encore présent — sans défense posée, scrute les unités air+sol ennemies dans un rayon de 20 km. Si détection, spawn de défenses pour la coalition propriétaire de la base — renfort défensif. La liste des unités ennemies (enemyUnits) est reconstruite une seule fois par tick, avant la boucle région/base, plutôt qu'une fois par base — optimisation de complexité O(unités) au lieu de O(unités × bases).

Capture_handleBaseCaptured() sur S_EVENT_BASE_CAPTURED. Ce handler n'appelle aucune fonction de spawn. Il se limite à setCoalition() + re-vérification du statut CLEARED de la région parente. La capture change la coalition sans jamais poser de défenses dans le même geste — elles n'apparaîtront qu'ensuite, via les deux chemins ci-dessus réagissant au nouvel état.

Mécanique à usage unique par base et par run de mission

Le remplacement Jerrycan → défenses (déclencheur Proximité) ne se produit qu'une fois par base : checkEnemiesProximityForDefenses() exige airbase.jerrycanStatic présent et not airbase.defenseSpawned. spawnDefensesByProximity() détruit le Jerrycan au moment où il pose les défenses — une fois consommé, le Jerrycan ne revient jamais sans un rechargement complet de la mission (DM.Manager:start() ne repose les Jerrycans qu'au chargement).

spawnAirbaseDefenses() réinitialise les compteurs d'usage des gabarits AD_ à chaque appel ; sélectionne les gabarits aléatoirement avec un plafond par gabarit (maxLocalSpawn, tiré de la nomenclature AD_[description]_[maxLocalSpawn]), avec 10 tentatives avant spawn forcé ; assigne chaque groupe à un emplacement de piste libre (6 disponibles) ; fait pivoter chaque groupe d'un cap aléatoire 0–360° avant translation, pour varier la présentation visuelle.

Emplacements de spawn

6 positions fixes autour de la piste, calculées depuis position/cap/longueur/largeur : 4 emplacements en coin (diagonale, à distance × √2 du bord) + 2 emplacements latéraux (perpendiculaires, à distance simple), distance = 100 m par défaut. En DEBUG_MODE, des cercles rouges de debug sont dessinés sur F10 pour chaque emplacement (filtrables sur une seule région).