fix(rules): selective channeling modeled as a policy-chosen exclusion - Action(kind=channel_energy) gains channel_exclude, honored only with the Selective Channeling feat and capped at the Charisma modifier (SRD feats/selective-channeling.md: 'choose a number of targets in the area up to your Charisma modifier... not affected by your channeled energy'); without the feat the list is ignored and logged (SRD Normal: all targets affected); observable in current data because heal mode also heals living ENEMIES in the burst (deny them the heal) and harm mode can spare an undead ally; default_policy never excludes (opt-in, like weapon_id/destination/metamagic); golden transcripts unchanged; +5 tests

This commit is contained in:
2026-09-19 22:49:40 +02:00
parent 9f0d86273a
commit 5fe2b72339
3 changed files with 209 additions and 8 deletions
+19 -6
View File
@@ -1591,8 +1591,20 @@ Règles modélisées :
`> 0` dépensée dans la méthode d'exécution : `channel_energy` (oni, énergie positive :
si un allié est < 50 % de ses PV → soigne tous les êtres vivants à 30 ft ; sinon, si au
moins 2 morts-vivants ennemis sont groupés à 30 ft → les blesse en 2d6 ; le camp de la
cible n'est pas pris en compte — seul `creature_type` compte, `selective_channeling` non
modélisé ; les créatures blessées obtiennent un jet de Volonté DD `10 +
cible n'est pas pris en compte — seul `creature_type` compte ; **Selective
Channeling** modélisé (SRD `feats/selective-channeling.md` : « you can
choose a number of targets in the area up to your Charisma modifier. These
targets are not affected by your channeled energy ») via
`Action(kind="channel_energy", channel_exclude=(ids…))` — honoré
uniquement avec le don, plafonné au modificateur de Charisme (troncature
déterministe de la liste excédentaire), sinon ignoré et journalisé
(`selective channeling ignored (no feat)` — SRD Normal : « All targets in a
30-foot burst are affected ») ; `default_policy` n'exclut jamais (opt-in
via politique personnalisée, comme `weapon_id`/`destination`/métamagie) ;
effet observable dans les données actuelles : le mode soin soigne aussi les
**ennemis vivants** dans le burst (positive energy heals every living
creature), le don permet de leur refuser le soin, et le mode blessure peut
épargner un allié mort-vivant ; les créatures blessées obtiennent un jet de Volonté DD `10 +
demi-niveau du canaliseur + modificateur de Charisme` pour demi-dégâts
— CRB Channel Energy ; le mode soin n'accorde pas de sauvegarde), sortilège `evil_eye` (nairda), deed `up_close_and_deadly`
(tammara, action bonus +1d6 à ≤ 30 ft — consommé sur la première attaque
@@ -1761,10 +1773,11 @@ Règles modélisées :
suffisent). Le couvert par paire est exposé via la clé `cover_bonus`
(calcul identique à `resolve_attack`, couvert mou des créatures inclus).
Les API de décision exposées (items L1-L8)
s'y retrouvent : `direction`/`trick_condition`/`weapon_id` sur `Action`,
ainsi que `metamagic` (dons de métamagie choisis pour cette incantation,
B7) et `cast_defensively` (incantation défensive, B24) sur l'action
`cast_spell` ;
s'y retrouvent : `direction`/`trick_condition`/`weapon_id` sur `Action`,
ainsi que `metamagic` (dons de métamagie choisis pour cette incantation,
B7) et `cast_defensively` (incantation défensive, B24) sur l'action
`cast_spell`, et `channel_exclude` (ids exclus par Selective Channeling,
plafonné au mod de Charisme, don requis) sur l'action `channel_energy` ;
`can_charge` → `ChargeResult`, kinds `retrieve_weapon`/`repair_weapon`.
Le kind `activate_power_attack` (action libre) active le don Power Attack
(`state.power_attack = True`) si le combattant possède le don ; sans le don,