# Bots et simulations asynchrones By Year

## Quand les bots sont utilisés

Dans `generateResultsJob()`, si `actData.isAsync` est vrai, `takeBotsDecision(actData)` est appelé avant la génération des events et résultats.

## Jeux avec bots explicites

Le routeur commun instancie actuellement `BotsEnt1`, `BotsMk1` ou `BotsMk2`. Les équipes marquées `isBot` reçoivent alors des décisions générées avant le calcul des résultats.

```mermaid
flowchart LR
JOB[generateResultsJob] --> ASYNC{isAsync?}
ASYNC -->|oui| B[takeBotsDecision]
B --> BOT[Bot game-specific]
BOT --> TD[Team decisions]
ASYNC -->|non| EV[Events]
TD --> EV[Events]
EV --> RES[Generate Results]

```

## ENT1

`BotsEnt1` gère notamment prêts, capacité de production, construction d'usines, employés, matières premières, choix de pays et création/lancement de produit.

## MK1/MK2

Les bots Marketing construisent des décisions de produit/marché selon un niveau et des heuristiques game-specific.

## Attention

Le code désactive temporairement l'envoi de messages pendant la boucle bots afin d'éviter de spammer les clients avec chaque décision artificielle. Les documents équipes sont ensuite sauvegardés.

## Ajouter ou modifier une décision de bot

Les bots sont exécutés par `takeBotsDecision(actData)` avant la génération de résultats des activités async. Une nouvelle décision métier qui est obligatoire doit être supportée par le bot du jeu.

### Procédure

1. Ajouter la logique dans `Bots<Game>.takeDecisions()` ou un helper spécialisé.
2. Réutiliser les mêmes fonctions de coût/validation que les humains lorsque possible.
3. Éviter de modifier directement les résultats : le bot doit produire des **décisions**, puis passer dans le même moteur de génération.
4. Respecter le `botLevel` si le jeu simule plusieurs niveaux.
5. Vérifier cash/stock/capacité après chaque décision en chaîne.
6. Ajouter une garde si une static data attendue manque.

## Jeux actuellement supportés

Le socle crée explicitement des bots pour ENT1, MK1 et MK2. HR1/MGT1 ne doivent pas être supposés bot-compatible sans implémentation dédiée.

## Messages pendant les bots

Le framework peut désactiver temporairement certains messages pendant la boucle bot. C'est voulu : on ne veut pas envoyer à chaque client un RTT pour chaque micro-décision artificielle. Vérifier la synchronisation finale après sauvegarde/génération.

## Tester un bot

- cash très bas;
- année 1 et année suivante;
- marché/segment déjà utilisé;
- static data manquante ou vide;
- plusieurs bots ensemble;
- mêmes inputs avec seed/config stable;
- génération complète après décisions.