feat: IA des alliés automatiques (#56) #66

Merged
Reliodas merged 2 commits from feature/56-ally-ai into develop 2026-06-22 06:57:10 +00:00
Owner

Closes #56.

Donne une décision automatique aux alliés du groupe en combat : un compagnon AUTO_ALLY (ou SCRIPTED_GUEST) agit désormais de lui-même au lieu de passer son tour. Huitième pierre du jalon 0.16.0 (s'appuie sur la boucle multi-acteurs de #54). Le compagnon de démonstration combat enfin aux côtés du héros.

Changements

  • CombatController._ally_take_turn() : un PJ allié automatique vise l'ennemi vivant le plus proche (_nearest_enemy), se rapproche du contact si nécessaire (_move_toward, partagé avec l'IA ennemie), puis attaque à l'arme si une action valide existe. Il ne se conclut jamais par une fin de tour passive quand une attaque est possible.
  • Cible uniquement hostile : l'IA alliée ne considère que enemies — jamais le héros ni un coéquipier.
  • Intention partagée : dans la boucle de tours automatiques, ennemis (stat block, _enemy_take_turn) et alliés automatiques (arme, _ally_take_turn) suivent la même logique « viser l'équipe adverse et agir ». La politique reste pour l'instant dans le contrôleur (simple et claire) ; son extraction n'est faite que lorsque le contrat le justifiera.
  • Le compagnon de démonstration Bran (AUTO_ALLY) combat donc aux côtés du héros.

Critères / garde-fous (plan)

  • l'IA sélectionne uniquement une cible d'équipe hostile ;
  • ennemi et allié automatique partagent une interface de décision (même intention/boucle) ;
  • aucune action valide ne se conclut par une fin de tour automatique (l'allié agit quand il peut) ;
  • cas solo inchangé.

Tests

Suite GUT complète verte : 264 tests / 868 assertions (depuis 260 / 858).

  • tests/unit/test_ally_ai.gd : le compagnon démo est AUTO_ALLY ; l'IA ne vise qu'une cible hostile (jamais le héros ni elle-même) ; au contact, l'allié consomme son Action (il agit, ne passe pas) ; un allié automatique remporte une rencontre seul pendant que le joueur reste passif (héros vivant à la fin).
  • Tests de combat solo restent verts.

Validation manuelle (différée au #58)

Le suivi visuel du jeton du compagnon pendant qu'il se déplace/attaque en combat (les jetons suiveurs ne sont pas encore animés en phase de combat) sera vérifié dans Godot au #58, avec l'UI dynamique de #57.

Closes #56. Donne une décision automatique aux alliés du groupe en combat : un compagnon `AUTO_ALLY` (ou `SCRIPTED_GUEST`) agit désormais de lui-même au lieu de passer son tour. Huitième pierre du jalon 0.16.0 (s'appuie sur la boucle multi-acteurs de #54). Le compagnon de démonstration combat enfin aux côtés du héros. ## Changements - **`CombatController._ally_take_turn()`** : un PJ allié automatique vise l'ennemi vivant **le plus proche** (`_nearest_enemy`), se rapproche du contact si nécessaire (`_move_toward`, partagé avec l'IA ennemie), puis **attaque à l'arme** si une action valide existe. Il ne se conclut **jamais** par une fin de tour passive quand une attaque est possible. - **Cible uniquement hostile** : l'IA alliée ne considère que `enemies` — jamais le héros ni un coéquipier. - **Intention partagée** : dans la boucle de tours automatiques, ennemis (stat block, `_enemy_take_turn`) et alliés automatiques (arme, `_ally_take_turn`) suivent la même logique « viser l'équipe adverse et agir ». La politique reste pour l'instant dans le contrôleur (simple et claire) ; son extraction n'est faite que lorsque le contrat le justifiera. - Le compagnon de démonstration **Bran** (`AUTO_ALLY`) combat donc aux côtés du héros. ## Critères / garde-fous (plan) - [x] l'IA sélectionne uniquement une cible d'équipe hostile ; - [x] ennemi et allié automatique partagent une interface de décision (même intention/boucle) ; - [x] aucune action valide ne se conclut par une fin de tour automatique (l'allié agit quand il peut) ; - [x] cas solo inchangé. ## Tests Suite GUT complète verte : **264 tests / 868 assertions** (depuis 260 / 858). - `tests/unit/test_ally_ai.gd` : le compagnon démo est `AUTO_ALLY` ; l'IA ne vise qu'une cible hostile (jamais le héros ni elle-même) ; au contact, l'allié consomme son Action (il agit, ne passe pas) ; un allié automatique remporte une rencontre **seul** pendant que le joueur reste passif (héros vivant à la fin). - Tests de combat solo restent verts. ### Validation manuelle (différée au #58) Le suivi visuel du jeton du compagnon pendant qu'il se déplace/attaque en combat (les jetons suiveurs ne sont pas encore animés en phase de combat) sera vérifié dans Godot au #58, avec l'UI dynamique de #57.
feat: IA des alliés automatiques en combat (#56)
Some checks failed
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline failed
173801655a
Un allié AUTO_ALLY/SCRIPTED_GUEST n'est plus inerte : CombatController.
_ally_take_turn lui fait viser l'ennemi vivant le plus proche
(_nearest_enemy), se rapprocher du contact si besoin, puis attaquer à
l'arme si une action valide existe. Il ne conclut jamais par une fin de
tour passive quand une attaque est possible, et ne cible que l'équipe
hostile. Ennemis (stat block) et alliés auto (arme) partagent la même
intention dans la boucle de tours automatiques.

Le compagnon de démonstration (Bran, AUTO_ALLY) combat donc aux côtés du
héros.

Tests : test_ally_ai.gd (compagnon démo AUTO_ALLY ; cible uniquement
hostile, jamais un coéquipier ; agit quand une attaque est valide ;
remporte une rencontre seul pendant que le joueur reste passif). Cas solo
inchangé. Suite 264 tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
test: fiabilise test_ally_starts_on_its_world_cell face à l'IA alliée (#56)
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
3698530aa5
Le helper _controller_with_ally inscrivait l'allié en AUTO_ALLY sans graine
de dé : depuis l'IA alliée (#56), un allié automatique non au contact avance
vers l'ennemi au démarrage, donc l'ordre d'initiative (non déterministe ici)
faisait parfois bouger l'allié avant l'assertion de position.

L'allié devient PLAYER (ces tests vérifient l'inscription et le placement,
pas l'IA) : un acteur contrôlable ne se déplace pas seul au démarrage, la
position est donc déterministe. Suite verte 8/8 exécutions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit 66f3ea8968 into develop 2026-06-22 06:57:10 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: jeux/beaulieu-sur-brume#66
No description provided.