Durcir les invariants de déplacement et de placement de TacticalGrid (#15) #20

Merged
Reliodas merged 1 commit from feature/15-invariants-tacticalgrid into develop 2026-06-19 21:49:05 +00:00
Owner

Closes #15.

TacticalGrid autorisait un coupe-coin diagonal entre deux murs et place() acceptait silencieusement une case hors-limites, un mur ou une case occupée. Ces comportements deviennent problématiques avec plusieurs participants (#7) et de nouvelles zones.

Changements

  • Pas de coupe-coin : un pas diagonal n'est permis que si aucune des deux cases orthogonales traversées ne bloque (mur/hors-limites). Règle extraite dans _can_step et partagée par reachable_cells() et step_toward().
  • place() validé : refuse explicitement hors-limites, mur et occupation par une autre créature (renvoie un booléen) ; se replacer sur sa propre case reste permis ; aucune corruption des tables position/occupation.

Critères d'acceptation

  • un pas diagonal est interdit si l'une des cases orthogonales traversées bloque ;
  • reachable_cells() et step_toward() partagent la même règle de franchissement ;
  • place() refuse hors-limites, mur et occupation incompatible ;
  • déplacer une créature ne corrompt jamais les tables position/occupation ;
  • tests GUT dédiés aux coins, occupations, déplacements et placements invalides.

Tests

Suite complète 119/119 (+4 ; un test d'atteignabilité ajusté pour refléter les coins désormais bloqués).

Closes #15. `TacticalGrid` autorisait un coupe-coin diagonal entre deux murs et `place()` acceptait silencieusement une case hors-limites, un mur ou une case occupée. Ces comportements deviennent problématiques avec plusieurs participants (#7) et de nouvelles zones. ## Changements - **Pas de coupe-coin** : un pas diagonal n'est permis que si **aucune** des deux cases orthogonales traversées ne bloque (mur/hors-limites). Règle extraite dans `_can_step` et **partagée** par `reachable_cells()` et `step_toward()`. - **`place()` validé** : refuse explicitement hors-limites, mur et occupation par une autre créature (renvoie un booléen) ; se replacer sur sa propre case reste permis ; aucune corruption des tables position/occupation. ## Critères d'acceptation - [x] un pas diagonal est interdit si l'une des cases orthogonales traversées bloque ; - [x] `reachable_cells()` et `step_toward()` partagent la même règle de franchissement ; - [x] `place()` refuse hors-limites, mur et occupation incompatible ; - [x] déplacer une créature ne corrompt jamais les tables position/occupation ; - [x] tests GUT dédiés aux coins, occupations, déplacements et placements invalides. ## Tests Suite complète **119/119** (+4 ; un test d'atteignabilité ajusté pour refléter les coins désormais bloqués).
Reliodas added this to the 0.15.0 milestone 2026-06-19 21:47:19 +00:00
fix: durcit les invariants de déplacement et de placement de TacticalGrid (#15)
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pull_request_metadata/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
5a6096a8a0
- Coupe-coin diagonal interdit : un pas diagonal n'est permis que si aucune des
  deux cases orthogonales traversées ne bloque (mur/hors-limites). Règle de
  franchissement extraite dans _can_step et partagée par reachable_cells() et
  step_toward().
- place() valide explicitement la cible : refuse hors-limites, mur et occupation
  par une autre créature (renvoie un booléen), et ne corrompt jamais les tables
  position/occupation (replacer une créature sur sa propre case reste permis).

Tests : suite complète 119/119 — coins (une/deux orthogonales murées), partage
de la règle par step_toward, placements invalides, intégrité d'un déplacement ;
le test d'atteignabilité avec mur reflète désormais les coins bloqués.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit 2f26bbe39c into develop 2026-06-19 21:49:05 +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#20
No description provided.