# Architecture du workspace ## Vue générale ```text games.sasedev/ ├── crates/ │ ├── common/ │ │ ├── game-assets-lib/ │ │ └── game-logging-lib/ │ ├── engines/ │ │ ├── engine-v1-common/ │ │ ├── engine-v1-platform-api/ │ │ └── engine-v1-sdl/ │ ├── games/ │ │ ├── game-reflex-poc/ │ │ └── game-snake-poc/ │ └── apps/ │ ├── game-reflex-poc-desktop/ │ ├── game-snake-poc-desktop/ │ ├── game-reflex-poc-tauri/ │ ├── game-reflex-poc-wasm/ │ └── game-snake-poc-wasm/ ├── assets/ │ ├── common/ │ ├── game-reflex-poc/ │ └── game-snake-poc/ ├── Android/ │ ├── common/ │ ├── game-reflex-poc/ │ └── game-snake-poc/ ├── docs/ ├── deltas/ ├── prompts/ └── scripts/ ``` ## Générations du moteur Une génération `engine-vN` est une ligne de compatibilité. Un jeu peut rester sur `engine-v1` pendant qu'un nouveau jeu expérimente `engine-v2`. Les anciens jeux sont ensuite migrés individuellement. Les capacités transverses réutilisables sont séparées des générations moteur. `game-assets-lib` porte la résolution logique des assets et `game-logging-lib` le tracing commun. Les subdivisions moteur sont exprimées par crates afin de ne pas forcer un jeu à dépendre de capacités inutiles. La baseline sépare déjà : - `engine-v1-common` : types et comportements génériques indépendants des plateformes ; - `engine-v1-platform-api` : contrats abstraits des services plateforme ; - `engine-v1-sdl` : frontière d'intégration SDL3, volontairement minimale dans la baseline. ## Jeux Chaque jeu est une crate indépendante sous `crates/games/`. Un jeu ne duplique pas une crate moteur. Il sélectionne explicitement la génération qu'il consomme. ## Assets Les assets sont extérieurs aux crates. Le packaging compose : ```text assets/common/ + assets// ``` Le runtime devra conserver une distinction logique entre ressources communes et ressources spécifiques afin d'éviter les collisions silencieuses. ## Runners Desktop Chaque crate de jeu reste une bibliothèque. Une crate binaire Desktop séparée sous `crates/apps/` la consomme pour permettre les itérations locales rapides. Cette séparation évite d’introduire `main`, des choix de plateforme ou du code de lancement dans le gameplay réutilisable. ## Adapters WebAssembly et variante Tauri Les adapters WASM sont distincts des runners SDL3 natifs et ne déplacent aucune règle de gameplay hors des crates de jeu. `game-reflex-poc-wasm` adapte le POC Reflex à `wasm-bindgen` pour le host Tauri/WebView existant. `game-snake-poc-wasm` adapte séparément Snake pour le premier host navigateur direct de `0.3.0`. Dans les deux cas, l'adapter expose l'état et la scène portable ; il ne possède pas les règles du jeu. `game-reflex-poc-tauri` reste le binaire natif Tauri qui héberge la WebView Reflex locale. Son frontend Vite/TypeScript pilote un Canvas et appelle l'adapter Reflex WASM. La crate Tauri suit le modèle des apps Desk KSP : façade `lib.rs`, pont `tauri.rs`, modules propriétaires séparés et frontend local à la crate. Le futur host Web Snake direct consommera `game-snake-poc-wasm` depuis son propre frontend Vite/TypeScript ; ce frontend n'est pas introduit par la tranche WASM elle-même.