diff --git a/docs/code-standards.md b/docs/code-standards.md index fc1a705..072e7a2 100644 --- a/docs/code-standards.md +++ b/docs/code-standards.md @@ -2,17 +2,17 @@ ## Naming Conventions -### JavaScript Files -- **Scenes**: PascalCase (e.g., `Boot.js`, `Game.js`, `MainMenu.js`) -- **Classes/Objects**: PascalCase (e.g., `GridSystem.js`, `Player.js`, `Guard.js`) -- **Utilities**: camelCase (e.g., `localization.js`, `progress.js`, `theme.js`) +### Files +- **Svelte components**: PascalCase (`Game.svelte`, `GameBoard.svelte`, `PlayerSprite.svelte`) +- **JS modules**: kebab-case (`grid-system.js`, `turn-manager.js`, `level-manager.js`) +- **JSON/config**: kebab-case (`en.json`, `vi.json`, `theme.css`) ### Variables & Functions -- **Classes**: PascalCase (`class GridSystem {}`, `class Player {}`) +- **Classes**: PascalCase (`GridSystem`, `Player`, `RotatingGuard`) - **Methods & Functions**: camelCase (`updateLight()`, `nextTurn()`, `getText()`) -- **Constants**: camelCase in exports (`COLORS`, `FONTS`, `LEVELS`) -- **Variables**: camelCase (`playerRow`, `guardColor`, `cellSize`) -- **Parameters**: camelCase (`row`, `col`, `guard`) +- **Constants**: UPPER_CASE for arrays (`LEVELS`), camelCase for others +- **Svelte state**: camelCase (`renderVersion`, `isPaused`, `detected`) +- **Props**: camelCase (`cellSize`, `oncellclick`, `onplayagain`) ### Grid Coordinates - **row**: Vertical axis (0 = top, increases downward) @@ -25,99 +25,111 @@ ``` src/ -├── main.js # Entry point, Phaser config -└── game/ - ├── scenes/ # 8 scene files - │ ├── Boot.js - │ ├── Preloader.js - │ ├── MainMenu.js - │ ├── StoryIntro.js - │ ├── LevelSelect.js - │ ├── Game.js # Main gameplay scene - │ ├── GameOver.js - │ ├── Settings.js - │ └── Guide.js - ├── objects/ # Core game objects - │ ├── GridSystem.js - │ ├── Player.js - │ ├── Guard.js # Base + 4 guard subclasses - │ ├── TurnManager.js - │ └── LightingSystem.js - ├── levels/ # Level data & management - │ ├── Levels.js # 12 level definitions - │ ├── LevelManager.js - │ └── LevelTester.js # Debug utility - ├── locales/ # Localization JSON - │ ├── en.json - │ └── vi.json - ├── theme.js # UI constants & factory - ├── localization.js # String management - ├── progress.js # Progress persistence - └── (additional utilities as needed) +├── main.js # Entry point, mounts App.svelte +├── App.svelte # Scene router ({#key} + fade) +│ +├── scenes/ # Full-page scene components +│ ├── MainMenu.svelte +│ ├── StoryIntro.svelte +│ ├── LevelIntro.svelte +│ ├── LevelSelect.svelte +│ ├── Game.svelte # Main gameplay (state owner) +│ ├── GameOver.svelte +│ ├── Settings.svelte +│ └── Guide.svelte +│ +├── components/ # Reusable UI components +│ ├── Button.svelte +│ ├── GameBoard.svelte # CSS grid rendering +│ ├── GameHud.svelte # Level/lives/turns display +│ ├── PlayerSprite.svelte # Positioned player div +│ ├── GuardSprite.svelte # Colored guard circle/diamond +│ ├── PauseMenu.svelte +│ └── DetectionPopup.svelte +│ +├── lib/ +│ ├── game/ # Pure JS game engine (no framework) +│ │ ├── grid-system.js +│ │ ├── player.js +│ │ ├── guards.js # Base + 5 guard subclasses +│ │ ├── turn-manager.js +│ │ └── level-manager.js +│ │ +│ ├── levels/ +│ │ └── levels.js # 12 level definitions +│ │ +│ ├── locales/ +│ │ ├── en.json +│ │ └── vi.json +│ ├── localization.js +│ └── progress.js +│ +└── styles/ + └── theme.css # CSS variables (colors, fonts) ``` ### File Size Limits -- **Maximum 200 lines per file** (before considering split) -- Scenes with heavy logic → extract objects to `objects/` -- Utility functions → consolidate into focused modules +- **Maximum 200 lines per file** before considering split +- Scenes with heavy logic → extract to `lib/game/` +- Shared UI → extract to `components/` + +## Svelte 5 Patterns + +### State Management +```javascript +// Primitive state +let isPaused = $state(false); + +// Class instances (NOT auto-proxied — use renderVersion pattern) +let grid = $state(null); +let player = $state(null); +let renderVersion = $state(0); + +// Derived values depend on renderVersion to pick up class mutations +let cells = $derived((renderVersion, grid ? grid.getAllCells() : [])); +``` + +### Props +```javascript +let { navigate, level = 1, lives = 3 } = $props(); +``` + +### Event Handlers +```svelte + + + + +