Aller au contenu

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 BoriginCoalition 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à ACTIVE ou si CLEARED (état terminal, jamais réactivable). Sinon : passe à ACTIVE, remet idleTime à 0, démarre le scheduler de cycle à la fréquence de la région, démarre l'alerte de menace si THREAT_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 (depuis ACTIVE), repasse à IDLE sans détruire les groupes — ils persistent et sont repris à la prochaine activation.
  • CLEARED — décidé par checkClearedStatus() : une région devient CLEARED quand 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 appelle inactivate(), 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).

  1. Détection des joueurs ennemis — parcourt coalition.getPlayers(), teste l'appartenance au polygone (point-in-quad) ; inclut aussi bien les joueurs air que sol.
  2. Mise à jour de la disponibilité Force Balancing (mode FB uniquement).
  3. Décision de spawn / comptage d'inactivité — sans ennemi, idleTime s'accumule ; au-delà de IDLE_LIMIT (300 s par défaut), la région repasse automatiquement en IDLE (groupes conservés). Avec ennemi, idleTime se 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 (maxGroups est ignoré).
    • Mode NOFB : un groupe par tick tant que le plafond simultané maxGroups et le plafond d'attrition maxCycles le permettent.
  4. 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.
  5. Maintenance — retrait des groupes morts/vides de activeGroups.
  6. Vérification CLEARED.
  7. Redessin F10 si la région est toujours ACTIVE et 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équence DM.Config.AUTO_ACTIVATION_CHECK_INTERVAL (60 s par défaut, mais paramétrable — pas une constante en dur) et active automatiquement toute région IDLE contenant au moins un joueur humain de coalition ennemie.
  • "MANUEL" — aucune activation automatique ; déclenchement uniquement via DM.Manager:activateRegion()/inactivateRegion(), le menu F10, ou DM.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).