diff --git a/docs/GamePatterns.md b/docs/GamePatterns.md index c9d4734..ea98751 100644 --- a/docs/GamePatterns.md +++ b/docs/GamePatterns.md @@ -13,7 +13,7 @@ packages/my-game/ │ ├── game/ # Pure game logic (re-exported from boardgame-core) │ ├── scenes/ # Phaser scenes (MenuScene, GameScene) │ ├── spawners/ # Data-driven object lifecycle -│ ├── renderers/ # Renderers for game objects +│ ├── gameobjects/ # Phaser GameObject or Container extensions │ ├── state/ # UI-only reactive state │ ├── config.ts # Centralized layout & style constants │ └── ui/App.tsx # Preact root component @@ -24,7 +24,7 @@ packages/my-game/ | `game/` | State, commands, prompts, validation (pure logic) | | `scenes/` | Phaser lifecycle, input handling, visual composition | | `spawners/` | Reactive game object spawn/update/despawn | -| `renderers/` | Phaser visual representation of game objects | +| `gameobjects/` | Phaser GameObjects or containers | | `state/` | UI-only reactive state (selection, hover, etc.) | | `ui/` | Preact components bridging Phaser and DOM | @@ -51,9 +51,9 @@ Use `MutableSignal` for UI-only state, separate from game state. - Clean up effects on object `'destroy'` to prevent leaks. - See: `packages/onitama-game/src/state/ui.ts` -### 4. Custom Containers +### 4. Custom GameObjects / Containers Extend `Phaser.GameObjects.Container` to encapsulate visuals and state. -- Store logical state as private signals. +- Use signals from `states/`, avoid relying on complex interal state. - Use `effect()` for reactive highlights/selections. ### 5. Tween Interruption @@ -66,6 +66,12 @@ Otherwise the game logic will hang. Use `await this.sceneController.launch('SceneKey')`. Register scenes in `App.tsx` via ``. Pass data via `data` prop. +### 7. Central Config +Use `src/config/layout.ts` for shared constants like `CELL_SIZE`, `BOARD_OFFSET`, etc. +Use `src/config/colors.ts` for shared colors. +Use `src/config/text.ts` for text styles. + + ## Best Practices - **Centralize Config**: Keep `CELL_SIZE`, `BOARD_OFFSET`, colors, etc., in `src/config.ts` with `as const`. Avoid magic numbers.