fix: choisir une action ennemie compatible avec portée et ligne de vue (#28) #32
No reviewers
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: jeux/beaulieu-sur-brume#32
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/28-choix-action-ia"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #28
L'IA ennemie considérait un monstre attaquable à partir de la portée maximale de toutes ses actions, puis déléguait à
RulesEngine.resolve_multiattack— qui, pour un monstre sans multiattaque, résout toujoursactions[0]. Le gobelin pouvait donc être autorisé à tirer tout en résolvant son cimeterre (première action). Cette MR introduit une sélection d'action pure, testable et cohérente avec la position courante.Changements
CombatController._valid_monster_attacks(actor, target): filtre pur des attaques du stat block réellement utilisables. UneMELEE_ATTACKn'est valide qu'au contact (distance ≤ reach_metres) ; uneRANGED_ATTACKqu'à portée longue et en ligne de vue (TacticalGrid.has_line_of_sight), avecdisadvantage = distance > range_normal_metres. Liste de base = entrées demultiattack(étendues viaget_action) si définies, sinonactions.CombatController._enemy_attack_plan(actor, target): pour un bloc à multiattaque, toutes les entrées spatialement valides ; sinon une action — mêlée au contact de préférence, à défaut le premier tir valide.can_attack(attacker, target)dépend maintenant de_valid_monster_attackspour les monstres (au lieu de la portée max) : ligne de vue coupée ⇒ aucune attaque valide ⇒ déplacement ou pas d'attaque. Le chemin héros (portée de l'arme équipée) est inchangé ;_attacker_reach_mest simplifié au seul cas du héros._enemy_take_turnrésout chaque action retenue viaRulesEngine.resolve_monster_action(actor, action, hero, false, disadvantage)— le moteur applique le désavantage (dnd55e 1.17.0). Le combat abstrait (sans grille) conserveresolve_multiattack.Critères d'acceptation
Tests
tests/unit/test_combat_controller.gd:test_enemy_picks_melee_at_contact,test_enemy_picks_ranged_at_distance,test_enemy_ranged_long_range_has_disadvantage,test_enemy_no_attack_when_line_of_sight_blocked,test_enemy_takes_turn_deals_ranged_damage_not_melee.--headless --importsansSCRIPT ERROR/Parse Error, puisgut_cmdln.gdsurres://tests/).