feat: CombatController multi-acteurs et équipes (#54) #64
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#64
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/54-multi-actor-combat"
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 #54.
Retire du cœur du combat l'hypothèse selon laquelle le seul tour contrôlable est celui de
hero. Sixième pierre du jalon 0.16.0 (dépend de #49 et #53). Le contrôleur raisonne désormais en acteur actif et en équipes, ouvrant la voie à la résolution par équipe (#55), aux acteurs automatiques (#56) et à l'UI dynamique (#57). Le cas solo 0.15.0 reste strictement inchangé.Changements
active_actor()expose le combattant courant ; une table de contrôleCreature -> PartyMember.ControlModedistingue les acteurs pilotés par le joueur (héros + alliésPLAYER) des automatiques (ennemis, alliésAUTO_ALLY/SCRIPTED_GUEST).is_controllable()en découle. Le mode de contrôle n'est jamais l'équipe.player_attack/player_move/player_dodge/player_second_wind, le ciblage (select_target,_resolve_attack_target,_attackable_targets), Second Wind et les cases atteignables portent suractive_actor(). L'économie d'action vient demanager.get_economy(actor)(plus de_hero_economyunique) : chaque tour a sa propre Action, Action bonus et distance, et une action n'affecte que l'acteur actif._resume()rend la main à tout acteur contrôlable et enchaîne les tours automatiques jusqu'au prochain (ennemis joués par l'IA ; alliés automatiques encore inertes jusqu'à #56). L'IA ennemie cible un membre vivant de l'équipe du héros (_enemy_target()), plusherocodé en dur._finish()calcule la victoire via_team_has_living(HERO_TEAM)— le contrôleur ne dépend plus de la seule survie deheropour la victoire, le ciblage ou le tour joueur. (La distinction fine victoire/défaite/survivants reste #55.)hero_*(ex.hero_reachable_cells) restent en place et délèguent aux versions génériques.Critères d'acceptation
Tests
Suite GUT complète verte : 255 tests / 824 assertions (depuis 249 / 801).
tests/unit/test_combat_multi_actor.gd: deux PJ agissent dans la même initiative ; l'acteur actif est toujours contrôlable quand la main revient ; économie propre à chaque tour ; une attaque ne consomme que l'Action de l'acteur actif (pas celle de l'autre PJ) ; les tours automatiques s'enchaînent jusqu'au prochain contrôlable ; un alliéAUTO_ALLYn'est jamais piloté ni joué comme ennemi ; victoire calculée par survie d'équipe.test_combat_controller,test_world_combat_*) restent verts.Note d'intégration
Les API génériques cohabitent avec les façades
hero_*(transition progressive demandée par le ticket). CôtéWorld/overlay, le pilotage d'un alliéPLAYERfonctionne déjà (les actions visent l'acteur actif), mais l'affichage « à qui le tour » et les descripteurs d'action dynamiques relèvent de #57 ; le ressenti UI sera validé manuellement au #58.