Gérer attaques à distance, portée et ligne de vue en combat monde (#6) #23

Merged
Reliodas merged 1 commit from feature/6-attaques-distance-portee into develop 2026-06-20 01:47:24 +00:00
Owner

Closes #6.

Rend les armes à distance utilisables sur la grille issue de la zone et partage la ligne de vue avec la détection (#4). La portée longue applique le désavantage via le moteur, sans réimplémenter la résolution d'attaque : un paramètre advantage/disadvantage a été ajouté à resolve_weapon_attack côté dnd55e (release 1.17.0, MR dnd/dnd55e!2).

Changements

  • CombatController.can_attack(attacker, target) : API commune mêlée/distance. Mêlée → contact ; distance → portée (longue incluse) et ligne de vue (TacticalGrid.has_line_of_sight, un mur masque). Utilisée par le ciblage du joueur (_attackable_targets) et par l'IA.
  • Portée longue → désavantage : player_attack passe disadvantage au moteur au-delà de la portée normale de l'arme (dans la limite de la portée longue).
  • IA ennemie : tire à distance quand le héros est en vue plutôt que de foncer au contact (le gobelin emploie son arc court 24/96 m) ; sinon se rapproche puis tire s'il est à portée.
  • World : surbrillance dorée des jetons attaquables au tour du joueur (Enemy.set_targetable).
  • Sous-module dnd55e : 1.16.0 → 1.17.0 (sources externes d'avantage/désavantage sur resolve_weapon_attack, rétro-compatible).

Critères d'acceptation

  • une cible visible à portée peut être attaquée ;
  • une cible masquée ou hors portée ne peut pas l'être ;
  • la portée longue applique les règles fournies par dnd55e sans les réimplémenter ;
  • mêlée et distance utilisent une API commune de validation ;
  • cas limite murs, diagonales et portée longue couverts par GUT.

Tests

Suite complète 146/146. Nouveau test_ranged_combat.gd (cible en vue à portée, masquage par mur, au-delà de la portée longue, diagonales, désavantage de portée longue propagé au moteur, mêlée au contact) ; IA à distance vs mêlée ajoutées à test_combat_controller.gd.

Closes #6. Rend les armes à distance utilisables sur la grille issue de la zone et partage la **ligne de vue** avec la détection (#4). La portée longue applique le désavantage via le moteur, **sans réimplémenter** la résolution d'attaque : un paramètre `advantage`/`disadvantage` a été ajouté à `resolve_weapon_attack` côté dnd55e (release **1.17.0**, MR dnd/dnd55e!2). ## Changements - **`CombatController.can_attack(attacker, target)`** : API commune mêlée/distance. Mêlée → contact ; distance → portée (longue incluse) **et** ligne de vue (`TacticalGrid.has_line_of_sight`, un mur masque). Utilisée par le ciblage du joueur (`_attackable_targets`) **et** par l'IA. - **Portée longue → désavantage** : `player_attack` passe `disadvantage` au moteur au-delà de la portée normale de l'arme (dans la limite de la portée longue). - **IA ennemie** : tire à distance quand le héros est en vue plutôt que de foncer au contact (le gobelin emploie son arc court 24/96 m) ; sinon se rapproche puis tire s'il est à portée. - **`World`** : surbrillance dorée des jetons attaquables au tour du joueur (`Enemy.set_targetable`). - **Sous-module dnd55e** : 1.16.0 → **1.17.0** (sources externes d'avantage/désavantage sur `resolve_weapon_attack`, rétro-compatible). ## Critères d'acceptation - [x] une cible visible à portée peut être attaquée ; - [x] une cible masquée ou hors portée ne peut pas l'être ; - [x] la portée longue applique les règles fournies par dnd55e sans les réimplémenter ; - [x] mêlée et distance utilisent une API commune de validation ; - [x] cas limite murs, diagonales et portée longue couverts par GUT. ## Tests Suite complète **146/146**. Nouveau `test_ranged_combat.gd` (cible en vue à portée, masquage par mur, au-delà de la portée longue, diagonales, désavantage de portée longue propagé au moteur, mêlée au contact) ; IA à distance vs mêlée ajoutées à `test_combat_controller.gd`.
Reliodas added this to the 0.15.0 milestone 2026-06-20 01:45:55 +00:00
feat: attaques à distance, portée et ligne de vue en combat monde (#6)
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_metadata/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
1f3444ff28
Rend les armes à distance utilisables sur la grille de la zone et partage la
ligne de vue avec la détection (#4).

- CombatController.can_attack(attacker, target) : API commune mêlée/distance.
  Mêlée = contact ; distance = portée (longue incluse) + ligne de vue
  (TacticalGrid.has_line_of_sight). Le ciblage du joueur et l'IA s'en servent.
- Portée longue → désavantage, appliqué par le moteur via le nouveau paramètre
  de RulesEngine.resolve_weapon_attack (dnd55e 1.17.0), sans le réimplémenter.
- IA ennemie : tire à distance quand le héros est en vue plutôt que de foncer
  au contact (le gobelin emploie son arc court) ; sinon se rapproche puis tire
  s'il est à portée.
- World : jetons attaquables mis en surbrillance au tour du joueur
  (Enemy.set_targetable).
- Sous-module dnd55e 1.16.0 -> 1.17.0 (param advantage/disadvantage).
- Tests : test_ranged_combat (murs, diagonales, portée longue + désavantage,
  mêlée au contact) ; IA à distance et mêlée dans test_combat_controller.
  Suite complète verte (146 tests).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit c1a026c0ca into develop 2026-06-20 01:47:24 +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#23
No description provided.