- New turn order: produce -> transfer -> move -> collision resolution - Collisions now destroy weaker pieces (status > level > mutual destruction) instead of halting the simulation. SimPhase.Collision removed. - Add piece Level property (all level 1 in proto, prepared for future) - Production fires every turn (interval concept removed), buffer = Amount (default 1, future 2-4), leftovers overwritten each turn - Transfer tiebreaker: status > level > clockwise direction (alternating even/odd turns in y-up coords), replaces distance-to-production - Demands always accept matching cargo even when already satisfied - TurnNumber added to all turn events for animation grouping - Simultaneous animations: produce flash, cargo slide, parallel piece moves - Camera centering fix + middle-click pan - GDD updated with new rules + lore section added Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1.5 KiB
Chessistics
Jeu de logistique sur echiquier en Godot 4 / C#. Le joueur place des pieces d'echecs sur un plateau ; elles se deplacent automatiquement et transportent des ressources entre des productions et des demandes.
Architecture : Black-Box Simulation
Ref: https://samuel-bouchet.fr/posts/2026-04-08-black-box-sim/
Le moteur de jeu (chessistics-engine/) est une boite noire sans aucune dependance vers Godot. Il recoit des Commands, mute son etat interne, et retourne des Events. Le code Godot (Scripts/) ne fait que traduire l'input en commands et les events en visuels/animations.
Input → Command → GameSim (state + rules) → Events → Presentation
- Commands (
PlacePieceCommand,StartSimulationCommand, …) : seul moyen de modifier l'etat. - Events (
PiecePlacedEvent,CargoDeliveredEvent, …) : seul output du moteur. Le presenteur les consomme pour animer. - GameSim : point d'entree unique.
ProcessCommand()retourne la liste d'events. - Tests :
chessistics-tests/teste le moteur en headless, sans Godot.
Pieges Godot a eviter
MouseFilter sur les Controls enfants de Node2D
Tout Control (ColorRect, Label…) a MouseFilter = Stop par defaut. Quand un Control est enfant d'un Node2D (ex: les ColorRect dans CellView, les Labels dans PieceView), il participe quand meme au systeme GUI et consomme les clics, empechant _UnhandledInput de recevoir l'evenement.
Regle : toujours mettre MouseFilter = Control.MouseFilterEnum.Ignore sur les Controls purement visuels enfants de Node2D.