Régions — DM.Region¶
Classe définie en sources/DynamicMission.lua:2142-3311 (section complète, entête incluse :
2077-3311).
Nomenclature de zone¶
Le nom de la zone est découpé en 8 segments, séparés par _ ou - (interchangeables, mais deux
séparateurs ne peuvent pas se toucher) :
RG_[R/B]_[NOM]_[FREQ]_[FB/NOFB]_[SEG6]_[MAX_C]_[VIS]
1 2 3 4 5 6 7 8
| Seg. | Rôle | Règle de parsing vérifiée |
|---|---|---|
| 1 | Préfixe | Doit être RG (insensible à la casse) — rejeté sinon |
| 2 | Coalition | R ou B → originCoalition 1 (Rouge) ou 2 (Bleu) ; erreur sinon |
| 3 | Nom court | Alphanumérique strict ; erreur sinon |
| 4 | FREQ (fréquence de cycle, s) | Si invalide/≤0, retombe sur DM.Config.REGION_TICK_INTERVAL (30 s) avec avertissement — non bloquant |
| 5 | Mode | FB ou NOFB — erreur bloquante si autre valeur |
| 6 | Double sens selon segment 5 | Voir ci-dessous |
| 7 | MAX_C (cycles de spawn max) | Si invalide, retombe sur 10 avec avertissement |
| 8 | Visibilité carte F10 | 1 → visible ; toute autre valeur → invisible (avertissement si ce n'était pas littéralement 0) |
Segment 6 — sens conditionné par le mode
Mode FB : segment 6 = ratioFB, un ratio décimal de Force Balancing (ex. 1.5).
maxGroups est alors figé à 999 (effectivement illimité) — la capacité est gouvernée
uniquement par le ratio.
Mode NOFB : segment 6 = maxGroups, un entier de plafond de groupes simultanés.
ratioFB est mis à 0 (inutilisé).
Le parsing réellement exécuté est DM.Region:_parseNomenclature (méthode d'instance).
Machine à états¶
Trois états seulement sont utilisés : "IDLE", "ACTIVE", "CLEARED".
- IDLE (état initial) — scheduler arrêté, la région ne fait rien avant activation.
- activate() — no-op si déjà
ACTIVEou siCLEARED(état terminal, jamais réactivable). Sinon : passe àACTIVE, remetidleTimeà 0, démarre le scheduler de cycle à la fréquence de la région, démarre l'alerte de menace siTHREAT_ALERT_ENABLED, dessine le polygone F10 si visible. - inactivate() — arrête toujours les schedulers. Si l'état était
CLEARED, purge complètement les groupes actifs. Sinon (depuisACTIVE), repasse àIDLEsans détruire les groupes — ils persistent et sont repris à la prochaine activation. - CLEARED — décidé par
checkClearedStatus(): une région devientCLEAREDquand toutes les bases qu'elle contient appartiennent à la coalition opposée àoriginCoalition(une région sans base liée ne peut jamais l'atteindre). La transition appelleinactivate(), qui purge tous les groupes.
runCycle() : le tick en 7 phases¶
Ne tourne que si status == "ACTIVE", sur un timer.scheduleFunction auto-replanifié à la
fréquence de la région (segment 4).
- Détection des joueurs ennemis — parcourt
coalition.getPlayers(), teste l'appartenance au polygone (point-in-quad) ; inclut aussi bien les joueurs air que sol. - Mise à jour de la disponibilité Force Balancing (mode FB uniquement).
- Décision de spawn / comptage d'inactivité — sans ennemi,
idleTimes'accumule ; au-delà deIDLE_LIMIT(300 s par défaut), la région repasse automatiquement enIDLE(groupes conservés). Avec ennemi,idleTimese remet à zéro et :- Mode FB : effectif cible =
arrondi_sup(nb_ennemis × ratioFB); un groupe de plus est spawné si le compte actuel est inférieur, sous réserve du seul plafond d'attrition (maxGroupsest ignoré). - Mode NOFB : un groupe par tick tant que le plafond simultané
maxGroupset le plafond d'attritionmaxCyclesle permettent.
- Mode FB : effectif cible =
- Récupération (scavenge) —
landedUnitDelete()tourne à chaque cycle, ennemi présent ou non. Supprime les unités aériennes (avion/hélico) posées (vitesse < 1 m/s) et hors d'un rayon de 100 m de toute base de la région. Les unités sol sont explicitement exclues de ce nettoyage. - Maintenance — retrait des groupes morts/vides de
activeGroups. - Vérification CLEARED.
- Redessin F10 si la région est toujours
ACTIVEet visible.
Déclenchement d'activation¶
Deux modes, réglés par DM.Config.TYPE_CONTROL :
"TERRAIN"(valeur par défaut réellement configurée) —DM.Manager:_checkAutoActivation()tourne à la fréquenceDM.Config.AUTO_ACTIVATION_CHECK_INTERVAL(60 s par défaut, mais paramétrable — pas une constante en dur) et active automatiquement toute régionIDLEcontenant au moins un joueur humain de coalition ennemie."MANUEL"— aucune activation automatique ; déclenchement uniquement viaDM.Manager:activateRegion()/inactivateRegion(), le menu F10, ouDM.TestUtils.
Un menu F10 toujours présent (indépendant de TYPE_CONTROL) expose « + Activer » /
« − Désactiver » par région sous F10 → DM → RG → [nom court] — c'est un levier de contrôle
mission-maker/joueur distinct du menu de test.
Visibilité carte F10 (segment 8)¶
Si activée, un quadrilatère (trigger.action.quadToAll) est dessiné, coloré selon la coalition
majoritaire actuelle des bases de la région (pas la coalition d'origine) — remplissage 20 %
d'opacité, bordure 100 %, épaisseur de trait 8. Le redessin est ignoré si la coalition n'a pas
changé depuis le dernier tracé (optimisation).