- STACK.md - Technologies and dependencies - ARCHITECTURE.md - System design and patterns - STRUCTURE.md - Directory layout - CONVENTIONS.md - Code style and patterns - TESTING.md - Test structure - INTEGRATIONS.md - External services - CONCERNS.md - Technical debt and issues
7.0 KiB
7.0 KiB
Codebase Structure
Analysis Date: 2026-02-04
Directory Layout
whalehunting/
├── src/ # Game source code
│ ├── main.js # Phaser game initialization and configuration
│ └── scenes/ # Game scene implementations
│ ├── IntroScene.js
│ ├── ShipDeckScene.js
│ ├── MapScene.js
│ ├── TransitionScene.js
│ └── HuntingScene.js
├── tests/ # Test suites
│ ├── unit/ # Unit tests (Vitest)
│ │ └── game-logic.test.js
│ └── e2e/ # End-to-end tests (Playwright)
│ └── game-flow.spec.js
├── .planning/ # GSD planning documents
│ └── codebase/ # Architecture analysis
├── index.html # HTML entry point
├── package.json # Dependencies and scripts
├── vitest.config.js # Unit test configuration
├── playwright.config.js # E2E test configuration
├── nginx.conf # Web server config for deployment
├── Dockerfile # Container image definition
├── docker-compose.yml # Multi-container orchestration
└── deploy.sh # Automated deployment script
Directory Purposes
src/:
- Purpose: All game source code
- Contains: Main game initialization and scene implementations
- Key files:
main.jsis the entry point that configures Phaser
src/scenes/:
- Purpose: Game scene implementations
- Contains: Five scene classes, one per major game location/mode
- Key files: IntroScene starts the game, HuntingScene has most complex logic
tests/:
- Purpose: All test code separated from source
- Contains: Unit tests and E2E tests in separate subdirectories
- Key files:
game-logic.test.jsfor game mechanics,game-flow.spec.jsfor user flows
tests/unit/:
- Purpose: Logic testing without Phaser
- Contains: Vitest tests for inventory calculations, fuel costs, barrel logic
- Key files:
game-logic.test.js
tests/e2e/:
- Purpose: Full application flow testing
- Contains: Playwright tests simulating user interactions on actual game canvas
- Key files:
game-flow.spec.js
.planning/codebase/:
- Purpose: Analysis documents for code navigation
- Contains: ARCHITECTURE.md, STRUCTURE.md, CONVENTIONS.md, TESTING.md, CONCERNS.md
- Generated by: GSD mapping processes
Key File Locations
Entry Points:
index.html: Browser loads this, contains game-container div and script importsrc/main.js: Phaser game configuration and scene list initialization
Configuration:
vitest.config.js: Unit test runner with jsdom environment, port 51204 for UI serverplaywright.config.js: E2E test runner with Chromium and iPhone 12 profilespackage.json: Dependencies (Phaser 3.80.1, Vite, Vitest, Playwright)nginx.conf: Web server routing (not actively used in dev)docker-compose.yml: Local dev: port 5173 for Vite serverDockerfile: Production build with multi-stage for size optimization
Core Logic:
src/scenes/IntroScene.js: Game entry, starts with fuel=100, oil=0, penguins=0src/scenes/ShipDeckScene.js: Inventory display, barrel visualization, penguin cage revealsrc/scenes/MapScene.js: Location selection (Hunting Grounds, Antarctic, Port)src/scenes/TransitionScene.js: Atmospheric journey scenes, destination-specific visualssrc/scenes/HuntingScene.js: Core gameplay - whale spawning, harpoon mechanics, fuel consumption
Testing:
tests/unit/game-logic.test.js: Barrel calculations, inventory limits, fuel costs, whale health, crosshair clampingtests/e2e/game-flow.spec.js: Full flows (intro→ship→map→hunting), mobile viewport, desktop scaling
Naming Conventions
Files:
- PascalCase + Scene suffix:
IntroScene.js,ShipDeckScene.js - camelCase for non-scene modules: Would apply if utilities existed
- Test files: Matched source with
.test.jsor.spec.jssuffix - Config files: kebab-case:
playwright.config.js,vitest.config.js
Directories:
- lowercase plural:
src/scenes/,tests/unit/,tests/e2e/ - camelCase for compound: Not currently used
Class Names:
- PascalCase:
IntroScene,ShipDeckScene,MapScene,TransitionScene,HuntingScene - Extend
Phaser.Scenedirectly
Methods:
- camelCase:
create(),update(),init(),createDeck(),createBarrels(),updateInventoryDisplay() - Lifecycle methods (create, update) are Phaser conventions
- Helper methods prefix with action:
create*(),update*(),show*(),draw*()
Variables:
- camelCase for instance:
this.inventory,this.currentWhale,this.harpoons - camelCase for local:
barrelCount,swimSpeedX,healthPercent - UPPERCASE for constants:
FUEL_COST = 2,MAX_HEALTH = 3
Game State Objects:
- Inventory structure:
{ whaleOil: number, fuel: number, penguins: number } - Whale data stored via
setData():health,alive,diving,swimSpeedX,swimSpeedY,direction
Where to Add New Code
New Scene/Location:
- Create
src/scenes/NewScene.jsextending Phaser.Scene - Implement
init(data)to receive inventory - Implement
create()for rendering - Implement
update()if frame-by-frame logic needed - Call
this.scene.start('MapScene', { inventory: this.inventory })to transition - Add to scene list in
src/main.jsconfig array - Add location marker in
MapScene.jsthat routes to new scene
New Game Mechanic:
- Hunting scene has most game logic: HuntingScene.js handles whale spawning, harpoon firing, collision detection, health tracking
- Add mechanics as methods in relevant scene class
- Store persistent state in
this.inventoryobject - Display UI changes via
updateInventoryDisplay()pattern
Utilities (if needed):
- Create
src/utils/directory for shared helpers - Example:
src/utils/inventory.jsfor max capacity functions - Example:
src/utils/collision.jsfor distance calculations - Import in scenes:
import { calculateBarrels } from '../utils/inventory.js';
New UI Component Pattern:
- Create methods in scene:
createInventoryDisplay(),createMessageBox() - Return reference to element for later updates
- Update via methods:
updateInventoryDisplay(),showMessage(text) - Use semi-transparent rectangles for panels with
.setFillStyle(0x000000, 0.7)
Special Directories
node_modules/:
- Purpose: Installed dependencies
- Generated: Yes (via npm install)
- Committed: No (.gitignore)
dist/:
- Purpose: Vite production build output
- Generated: Yes (via npm run build)
- Committed: No (.gitignore)
- Files: Optimized JS/CSS for deployment
.git/:
- Purpose: Git repository metadata
- Generated: Yes (git init)
- Committed: Meta repository
- Notable: Recent commits track feature additions and testing infrastructure
.planning/:
- Purpose: GSD orchestration files and analysis documents
- Generated: Yes (via /gsd commands)
- Committed: Yes (tracked in git)
- Structure:
codebase/contains ARCHITECTURE.md, STRUCTURE.md, etc.
Structure analysis: 2026-02-04