fix: appliquer le désavantage aux attaques à distance au contact (#37) #47

Merged
Reliodas merged 1 commit from fix/37-ranged-contact-disadvantage into develop 2026-06-20 11:39:07 +00:00
Owner

Closes #37

Le calcul du désavantage à distance ne couvrait que la portée longue. Une arme ou action à distance utilisée alors qu'un adversaire est au contact n'appliquait donc pas le désavantage prévu par les règles, ni pour le héros ni pour les monstres.

Changements

  • CombatController._ranged_contact_disadvantage(attacker) : helper spatial côté jeu — vrai si un adversaire vivant et non neutralisé (RulesEngine.is_incapacitated, API du moteur réutilisée) occupe une case adjacente à l'attaquant. Adversaires : les enemies pour le héros, le héros pour un monstre. Pas de contrainte de ligne de vue (non requise au corps-à-corps).
  • Héros : _attack_has_disadvantage (arme à distance uniquement) renvoie portée_longue OR _ranged_contact_disadvantage(hero).
  • Monstres : la branche RANGED_ATTACK de _valid_monster_attacks pose disadvantage = (dist > range_normal) OR _ranged_contact_disadvantage(actor).
  • Le désavantage reste un booléen transmis au moteur (resolve_weapon_attack / resolve_monster_action) : portée longue et contact se combinent sans double pénalité ; la résolution (et l'éventuelle annulation par un avantage) reste au moteur. La mêlée n'est pas affectée.

Critères d'acceptation

  • une attaque à distance avec un ennemi hostile adjacent reçoit le désavantage approprié ;
  • la règle s'applique au héros et aux monstres ;
  • portée longue et menace au contact se combinent sans double pénalité ni annulation incorrecte ;
  • une attaque de mêlée n'est pas affectée ;
  • la détermination spatiale reste côté jeu, la résolution du désavantage reste déléguée à dnd55e ;
  • tests couvrent distance normale, portée longue, contact et combinaison contact/portée longue.

Tests

  • tests/unit/test_combat_controller.gd (héros) : distance normale (pas de désavantage), portée longue, contact, contact + portée longue, mêlée non affectée, adversaire adjacent mort sans désavantage.
  • (monstres) : test_monster_ranged_at_contact_has_disadvantage, test_monster_ranged_at_distance_no_disadvantage.
  • Suite GUT complète verte : 174 tests, 542 assertions.
Closes #37 Le calcul du désavantage à distance ne couvrait que la portée longue. Une arme ou action à distance utilisée alors qu'un adversaire est au contact n'appliquait donc pas le désavantage prévu par les règles, ni pour le héros ni pour les monstres. ## Changements - `CombatController._ranged_contact_disadvantage(attacker)` : helper **spatial côté jeu** — vrai si un adversaire **vivant et non neutralisé** (`RulesEngine.is_incapacitated`, API du moteur réutilisée) occupe une case **adjacente** à l'attaquant. Adversaires : les `enemies` pour le héros, le héros pour un monstre. Pas de contrainte de ligne de vue (non requise au corps-à-corps). - **Héros** : `_attack_has_disadvantage` (arme à distance uniquement) renvoie `portée_longue OR _ranged_contact_disadvantage(hero)`. - **Monstres** : la branche `RANGED_ATTACK` de `_valid_monster_attacks` pose `disadvantage = (dist > range_normal) OR _ranged_contact_disadvantage(actor)`. - Le désavantage reste un **booléen** transmis au moteur (`resolve_weapon_attack` / `resolve_monster_action`) : portée longue et contact se combinent sans double pénalité ; la résolution (et l'éventuelle annulation par un avantage) reste au moteur. La mêlée n'est pas affectée. ## Critères d'acceptation - [x] une attaque à distance avec un ennemi hostile adjacent reçoit le désavantage approprié ; - [x] la règle s'applique au héros et aux monstres ; - [x] portée longue et menace au contact se combinent sans double pénalité ni annulation incorrecte ; - [x] une attaque de mêlée n'est pas affectée ; - [x] la détermination spatiale reste côté jeu, la résolution du désavantage reste déléguée à dnd55e ; - [x] tests couvrent distance normale, portée longue, contact et combinaison contact/portée longue. ## Tests - `tests/unit/test_combat_controller.gd` (héros) : distance normale (pas de désavantage), portée longue, contact, contact + portée longue, **mêlée non affectée**, **adversaire adjacent mort** sans désavantage. - (monstres) : `test_monster_ranged_at_contact_has_disadvantage`, `test_monster_ranged_at_distance_no_disadvantage`. - Suite GUT complète verte : **174 tests, 542 assertions**.
fix: appliquer le désavantage aux attaques à distance au contact (#37)
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
0c26ced76d
Le désavantage à distance ne couvrait que la portée longue. Nouveau helper
spatial CombatController._ranged_contact_disadvantage : un adversaire vivant et
non incapacité (RulesEngine.is_incapacitated) adjacent à l'attaquant impose le
désavantage. Appliqué au héros (_attack_has_disadvantage) et aux monstres
(branche RANGED de _valid_monster_attacks). Portée longue et contact se
combinent en un seul désavantage booléen ; la mêlée n'est pas affectée ; la
résolution reste déléguée au moteur.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit 2a14775aea into develop 2026-06-20 11:39:07 +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#47
No description provided.