From 97a0a747a7e7d2d114ed97e9cc5f437c0cd3c810 Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Mon, 20 Apr 2026 22:22:03 +0700 Subject: [PATCH] =?UTF-8?q?refactor:=20address=20code=20review=20=E2=80=94?= =?UTF-8?q?=20capture/apply=20contract,=20tests,=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Guards: add capture()/apply() dynamic-state snapshot contract; removes fragile per-type field lists in previewNextTurn and game-history - TurnManager.previewNextTurn: use guard.capture/apply so new dynamic fields are picked up automatically - PrincessMechanic: add capture()/apply() and include messageShown in undo snapshots - Game.svelte: navigate to MainMenu when loadLevel returns null; track detection setTimeout for unmount cleanup - LevelSelect: use getTotalLevels() instead of hardcoded 12 - audio.js: swallow resume() promise rejections - art-scenes: norm() pads short rows with '.' transparent instead of last-char bleed - Rename controls-overlay.svelte → ControlsOverlay.svelte (match PascalCase convention) - Add vitest + tests for grid, player, guards, princess, turn-manager, game-history (46 tests) - Update docs (codebase-summary, system-architecture, code-standards, README) for pixel pipeline and capture/apply contract --- README.md | 5 +- docs/code-standards.md | 67 ++- docs/codebase-summary.md | 55 ++- docs/system-architecture.md | 34 +- package-lock.json | 384 +++++++++++++++++- package.json | 7 +- ...eviewer-260420-2203-full-project-review.md | 132 ++++++ ...-overlay.svelte => ControlsOverlay.svelte} | 0 src/lib/audio.js | 6 +- src/lib/game/game-history.js | 76 +--- src/lib/game/game-history.test.js | 117 ++++++ src/lib/game/grid-system.test.js | 48 +++ src/lib/game/guards.js | 45 ++ src/lib/game/guards.test.js | 163 ++++++++ src/lib/game/player.test.js | 42 ++ src/lib/game/princess-mechanic.js | 14 + src/lib/game/princess-mechanic.test.js | 68 ++++ src/lib/game/turn-manager.js | 33 +- src/lib/game/turn-manager.test.js | 115 ++++++ src/lib/pixel/art-scenes.js | 4 +- src/scenes/Game.svelte | 49 ++- src/scenes/LevelSelect.svelte | 3 +- 22 files changed, 1306 insertions(+), 161 deletions(-) create mode 100644 plans/reports/code-reviewer-260420-2203-full-project-review.md rename src/components/{controls-overlay.svelte => ControlsOverlay.svelte} (100%) create mode 100644 src/lib/game/game-history.test.js create mode 100644 src/lib/game/grid-system.test.js create mode 100644 src/lib/game/guards.test.js create mode 100644 src/lib/game/player.test.js create mode 100644 src/lib/game/princess-mechanic.test.js create mode 100644 src/lib/game/turn-manager.test.js diff --git a/README.md b/README.md index 7b45fb1..05c1b1e 100644 --- a/README.md +++ b/README.md @@ -79,15 +79,16 @@ The local development server runs on `http://localhost:5173` by default. Vite wi | Path | Description | |------------------------------|------------------------------------------------------------| | `index.html` | HTML entry point | -| `public/assets` | Static assets (images) served at runtime | -| `public/style.css` | Global layout styles and CSS variables | +| `public/assets` | Static assets + pixel-art authoring source (JSX canvas) | | `src/main.js` | Application bootstrap | | `src/App.svelte` | Scene router | | `src/scenes/` | Game scenes (MainMenu, Game, Guide, Settings, etc.) | | `src/components/` | Reusable UI components (GameBoard, PlayerSprite, etc.) | | `src/lib/game/` | Pure JS game engine (grid, player, guards, turns, history) | +| `src/lib/pixel/` | Pixel-art renderer + palette + sprite/tile/UI/scene art | | `src/lib/levels/` | Level definitions (12 levels) | | `src/lib/` | Audio, localization, progress persistence | +| `src/styles/theme.css` | Global layout styles and CSS variables | ## Game Architecture diff --git a/docs/code-standards.md b/docs/code-standards.md index f5b02c6..caefcd1 100644 --- a/docs/code-standards.md +++ b/docs/code-standards.md @@ -40,24 +40,34 @@ src/ │ ├── 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 +│ ├── GameBoard.svelte # Grid of pixel tiles +│ ├── GameHud.svelte # Pixel hearts + pixel icons + level/turns +│ ├── PlayerSprite.svelte # Pixel rabbit +│ ├── GuardSprite.svelte # Pixel veggie dispatched by guard.type │ ├── PauseMenu.svelte -│ └── DetectionPopup.svelte +│ ├── DetectionPopup.svelte +│ ├── LevelCompletePopup.svelte +│ └── ControlsOverlay.svelte │ ├── lib/ │ ├── game/ # Pure JS game engine (no framework) │ │ ├── grid-system.js │ │ ├── player.js -│ │ ├── guards.js # Base + 6 guard subclasses (including ChaserGuard) -│ │ ├── turn-manager.js +│ │ ├── guards.js # Base + 6 guard subclasses; capture()/apply() contract +│ │ ├── turn-manager.js # Uses guard.capture()/apply() for non-destructive preview │ │ ├── level-manager.js # GUARD_REGISTRY factory pattern │ │ ├── game-history.js # Undo/redo system -│ │ ├── princess-mechanic.js # Level 12 escalating detection +│ │ ├── princess-mechanic.js # Level 12 escalating detection; capture()/apply() │ │ └── touch-controls.js # Mobile swipe support │ │ +│ ├── pixel/ # Pixel-art rendering pipeline +│ │ ├── Pixel.svelte # String-art + palette → SVG rects +│ │ ├── palette.js # NNTV color constants +│ │ ├── art-characters.js # Rabbit, princess, 6 veggie guards +│ │ ├── art-tiles.js # 16×16 board tiles +│ │ ├── art-ui.js # Hearts, moon, logo, icons +│ │ └── art-scenes.js # 80×N act backdrops + sceneForLevel(n) +│ │ │ ├── levels/ │ │ └── levels.js # 12 level definitions │ │ @@ -166,6 +176,8 @@ All visual constants centralized in `src/styles/theme.css` as CSS variables: Component-scoped `