# Lire les états pendant un combat Lua

Ces fonctions nécessitent l’API de combat avancé de Jitsuri et s’utilisent dans les callbacks du moteur Lua, par exemple `onTurn`. En équipe, elles lisent le combat du personnage dont le callback est exécuté.

## Lecture par combattant

`fightAction:getEntityStateIds(actorId)` renvoie deux valeurs : une liste Lua d’identifiants d’états observés et un booléen indiquant si le suivi est complet.

`fightAction:hasEntityState(actorId, stateId)` renvoie :

- `true` si l’état est présent dans le suivi ;
- `false` si le suivi est complet et que l’état est absent ;
- `nil` si l’absence ne peut pas être confirmée, ou si le combattant est introuvable.

```lua
local etat = fightAction:hasEntityState(cibleId, 56)
if etat == true then
    global:printMessage("Invulnérabilité générale observée : préparer le prochain tour.")
elseif etat == false then
    global:printMessage("État 56 absent. Vérifier aussi les autres conditions avant de tirer.")
else
    global:printMessage("États non synchronisés : ne pas supposer la cible vulnérable.")
end
```

L’identifiant de combattant se récupère dans `fightAction:getAllEntities()`, champ `Id`. Il s’agit de l’identifiant de l’acteur dans ce combat, pas du GID du monstre.

## Champs des entités

Les entités renvoyées par `fightAction:getAllEntities()` contiennent aussi :

- `StateIds` : liste des états observés ;
- `StatesKnown` : suivi complet ou incomplet ;
- `IsInvulnerable` : lecture de l’état **56**, avec les mêmes valeurs `true`, `false` ou `nil`.

L’état 56 désigne l’invulnérabilité générale. Son absence ne garantit pas que tous les dégâts passent : les immunités de mêlée, de distance et les autres mécaniques restent distinctes.

Le suivi utilise les ajouts, retraits et instantanés d’effets reçus du serveur. Il est réinitialisé entre les combats. Une reconnexion nécessite la réception de l’instantané de reprise ; un événement de modification dont le contenu n’est pas reconnu rend le suivi incomplet. Les états déjà observés sont conservés jusqu’à leur retrait ou au prochain instantané : consulter `StatesKnown` pour connaître cette limite.

Les durées ne sont pas décrémentées arbitrairement au tour de l’observateur : l’expiration peut dépendre du tour d’un autre combattant.

## Positions, PA et vagues

Les entités exposent également `IsPositionKnown`, `IsInvisible` et `ActionPoints` (PA connus, ou `nil` si indisponibles). Ne calculez pas un tir ou une chaîne à partir de `CellId` lorsque `IsPositionKnown` vaut `false` : cette cellule peut être une ancienne position.

`fightAction:getCurrentWave()` renvoie le dernier identifiant de vague reçu dans `FightNewWaveEvent`, ou `0` si aucun n’a été reçu. Ce n’est ni le numéro du tour ni une lecture de l’invulnérabilité. Une stratégie particulière peut prévoir sa préparation du premier tour indépendamment de ce compteur.
