chore: add code formatting config and pre-commit hooks (#450)
This commit is contained in:
@@ -197,8 +197,8 @@ template:
|
||||
version: 2.0
|
||||
output:
|
||||
format: markdown
|
||||
filename: "docs/{{game_name}}-game-architecture.md"
|
||||
title: "{{game_title}} Game Architecture Document"
|
||||
filename: 'docs/{{game_name}}-game-architecture.md'
|
||||
title: '{{game_title}} Game Architecture Document'
|
||||
|
||||
workflow:
|
||||
mode: interactive
|
||||
@@ -207,7 +207,7 @@ sections:
|
||||
- id: initial-setup
|
||||
instruction: |
|
||||
This template creates a comprehensive game architecture document specifically for Phaser 3 + TypeScript projects. This should provide the technical foundation for all game development stories and epics.
|
||||
|
||||
|
||||
If available, review any provided documents: Game Design Document (GDD), Technical Preferences. This architecture should support all game mechanics defined in the GDD.
|
||||
|
||||
- id: introduction
|
||||
@@ -215,7 +215,7 @@ sections:
|
||||
instruction: Establish the document's purpose and scope for game development
|
||||
content: |
|
||||
This document outlines the complete technical architecture for {{game_title}}, a 2D game built with Phaser 3 and TypeScript. It serves as the technical foundation for AI-driven game development, ensuring consistency and scalability across all game systems.
|
||||
|
||||
|
||||
This architecture is designed to support the gameplay mechanics defined in the Game Design Document while maintaining 60 FPS performance and cross-platform compatibility.
|
||||
sections:
|
||||
- id: change-log
|
||||
@@ -234,7 +234,7 @@ sections:
|
||||
title: Architecture Summary
|
||||
instruction: |
|
||||
Provide a comprehensive overview covering:
|
||||
|
||||
|
||||
- Game engine choice and configuration
|
||||
- Project structure and organization
|
||||
- Key systems and their interactions
|
||||
@@ -322,23 +322,23 @@ sections:
|
||||
title: Scene Management System
|
||||
template: |
|
||||
**Purpose:** Handle game flow and scene transitions
|
||||
|
||||
|
||||
**Key Components:**
|
||||
|
||||
|
||||
- Scene loading and unloading
|
||||
- Data passing between scenes
|
||||
- Transition effects
|
||||
- Memory management
|
||||
|
||||
|
||||
**Implementation Requirements:**
|
||||
|
||||
|
||||
- Preload scene for asset loading
|
||||
- Menu system with navigation
|
||||
- Gameplay scenes with state management
|
||||
- Pause/resume functionality
|
||||
|
||||
|
||||
**Files to Create:**
|
||||
|
||||
|
||||
- `src/scenes/BootScene.ts`
|
||||
- `src/scenes/PreloadScene.ts`
|
||||
- `src/scenes/MenuScene.ts`
|
||||
@@ -348,23 +348,23 @@ sections:
|
||||
title: Game State Management
|
||||
template: |
|
||||
**Purpose:** Track player progress and game status
|
||||
|
||||
|
||||
**State Categories:**
|
||||
|
||||
|
||||
- Player progress (levels, unlocks)
|
||||
- Game settings (audio, controls)
|
||||
- Session data (current level, score)
|
||||
- Persistent data (achievements, statistics)
|
||||
|
||||
|
||||
**Implementation Requirements:**
|
||||
|
||||
|
||||
- Save/load system with localStorage
|
||||
- State validation and error recovery
|
||||
- Cross-session data persistence
|
||||
- Settings management
|
||||
|
||||
|
||||
**Files to Create:**
|
||||
|
||||
|
||||
- `src/systems/GameState.ts`
|
||||
- `src/systems/SaveManager.ts`
|
||||
- `src/types/GameData.ts`
|
||||
@@ -372,23 +372,23 @@ sections:
|
||||
title: Asset Management System
|
||||
template: |
|
||||
**Purpose:** Efficient loading and management of game assets
|
||||
|
||||
|
||||
**Asset Categories:**
|
||||
|
||||
|
||||
- Sprite sheets and animations
|
||||
- Audio files and music
|
||||
- Level data and configurations
|
||||
- UI assets and fonts
|
||||
|
||||
|
||||
**Implementation Requirements:**
|
||||
|
||||
|
||||
- Progressive loading strategy
|
||||
- Asset caching and optimization
|
||||
- Error handling for failed loads
|
||||
- Memory management for large assets
|
||||
|
||||
|
||||
**Files to Create:**
|
||||
|
||||
|
||||
- `src/systems/AssetManager.ts`
|
||||
- `src/config/AssetConfig.ts`
|
||||
- `src/utils/AssetLoader.ts`
|
||||
@@ -396,23 +396,23 @@ sections:
|
||||
title: Input Management System
|
||||
template: |
|
||||
**Purpose:** Handle all player input across platforms
|
||||
|
||||
|
||||
**Input Types:**
|
||||
|
||||
|
||||
- Keyboard controls
|
||||
- Mouse/pointer interaction
|
||||
- Touch gestures (mobile)
|
||||
- Gamepad support (optional)
|
||||
|
||||
|
||||
**Implementation Requirements:**
|
||||
|
||||
|
||||
- Input mapping and configuration
|
||||
- Touch-friendly mobile controls
|
||||
- Input buffering for responsive gameplay
|
||||
- Customizable control schemes
|
||||
|
||||
|
||||
**Files to Create:**
|
||||
|
||||
|
||||
- `src/systems/InputManager.ts`
|
||||
- `src/utils/TouchControls.ts`
|
||||
- `src/types/InputTypes.ts`
|
||||
@@ -422,22 +422,22 @@ sections:
|
||||
repeatable: true
|
||||
sections:
|
||||
- id: mechanic-system
|
||||
title: "{{mechanic_name}} System"
|
||||
title: '{{mechanic_name}} System'
|
||||
template: |
|
||||
**Purpose:** {{system_purpose}}
|
||||
|
||||
|
||||
**Core Functionality:**
|
||||
|
||||
|
||||
- {{feature_1}}
|
||||
- {{feature_2}}
|
||||
- {{feature_3}}
|
||||
|
||||
|
||||
**Dependencies:** {{required_systems}}
|
||||
|
||||
|
||||
**Performance Considerations:** {{optimization_notes}}
|
||||
|
||||
|
||||
**Files to Create:**
|
||||
|
||||
|
||||
- `src/systems/{{system_name}}.ts`
|
||||
- `src/gameObjects/{{related_object}}.ts`
|
||||
- `src/types/{{system_types}}.ts`
|
||||
@@ -445,65 +445,65 @@ sections:
|
||||
title: Physics & Collision System
|
||||
template: |
|
||||
**Physics Engine:** {{physics_choice}} (Arcade Physics/Matter.js)
|
||||
|
||||
|
||||
**Collision Categories:**
|
||||
|
||||
|
||||
- Player collision
|
||||
- Enemy interactions
|
||||
- Environmental objects
|
||||
- Collectibles and items
|
||||
|
||||
|
||||
**Implementation Requirements:**
|
||||
|
||||
|
||||
- Optimized collision detection
|
||||
- Physics body management
|
||||
- Collision callbacks and events
|
||||
- Performance monitoring
|
||||
|
||||
|
||||
**Files to Create:**
|
||||
|
||||
|
||||
- `src/systems/PhysicsManager.ts`
|
||||
- `src/utils/CollisionGroups.ts`
|
||||
- id: audio-system
|
||||
title: Audio System
|
||||
template: |
|
||||
**Audio Requirements:**
|
||||
|
||||
|
||||
- Background music with looping
|
||||
- Sound effects for actions
|
||||
- Audio settings and volume control
|
||||
- Mobile audio optimization
|
||||
|
||||
|
||||
**Implementation Features:**
|
||||
|
||||
|
||||
- Audio sprite management
|
||||
- Dynamic music system
|
||||
- Spatial audio (if applicable)
|
||||
- Audio pooling for performance
|
||||
|
||||
|
||||
**Files to Create:**
|
||||
|
||||
|
||||
- `src/systems/AudioManager.ts`
|
||||
- `src/config/AudioConfig.ts`
|
||||
- id: ui-system
|
||||
title: UI System
|
||||
template: |
|
||||
**UI Components:**
|
||||
|
||||
|
||||
- HUD elements (score, health, etc.)
|
||||
- Menu navigation
|
||||
- Modal dialogs
|
||||
- Settings screens
|
||||
|
||||
|
||||
**Implementation Requirements:**
|
||||
|
||||
|
||||
- Responsive layout system
|
||||
- Touch-friendly interface
|
||||
- Keyboard navigation support
|
||||
- Animation and transitions
|
||||
|
||||
|
||||
**Files to Create:**
|
||||
|
||||
|
||||
- `src/systems/UIManager.ts`
|
||||
- `src/gameObjects/UI/`
|
||||
- `src/types/UITypes.ts`
|
||||
@@ -719,7 +719,7 @@ sections:
|
||||
instruction: Break down the architecture implementation into phases that align with the GDD development phases
|
||||
sections:
|
||||
- id: phase-1-foundation
|
||||
title: "Phase 1: Foundation ({{duration}})"
|
||||
title: 'Phase 1: Foundation ({{duration}})'
|
||||
sections:
|
||||
- id: phase-1-core
|
||||
title: Core Systems
|
||||
@@ -737,7 +737,7 @@ sections:
|
||||
- "Basic Scene Management System"
|
||||
- "Asset Loading Foundation"
|
||||
- id: phase-2-game-systems
|
||||
title: "Phase 2: Game Systems ({{duration}})"
|
||||
title: 'Phase 2: Game Systems ({{duration}})'
|
||||
sections:
|
||||
- id: phase-2-gameplay
|
||||
title: Gameplay Systems
|
||||
@@ -755,7 +755,7 @@ sections:
|
||||
- "Physics and Collision Framework"
|
||||
- "Game State Management System"
|
||||
- id: phase-3-content-polish
|
||||
title: "Phase 3: Content & Polish ({{duration}})"
|
||||
title: 'Phase 3: Content & Polish ({{duration}})'
|
||||
sections:
|
||||
- id: phase-3-content
|
||||
title: Content Systems
|
||||
@@ -1045,7 +1045,7 @@ interface GameState {
|
||||
interface GameSettings {
|
||||
musicVolume: number;
|
||||
sfxVolume: number;
|
||||
difficulty: "easy" | "normal" | "hard";
|
||||
difficulty: 'easy' | 'normal' | 'hard';
|
||||
controls: ControlScheme;
|
||||
}
|
||||
```
|
||||
@@ -1086,12 +1086,12 @@ class GameScene extends Phaser.Scene {
|
||||
private inputManager!: InputManager;
|
||||
|
||||
constructor() {
|
||||
super({ key: "GameScene" });
|
||||
super({ key: 'GameScene' });
|
||||
}
|
||||
|
||||
preload(): void {
|
||||
// Load only scene-specific assets
|
||||
this.load.image("player", "assets/player.png");
|
||||
this.load.image('player', 'assets/player.png');
|
||||
}
|
||||
|
||||
create(data: SceneData): void {
|
||||
@@ -1116,7 +1116,7 @@ class GameScene extends Phaser.Scene {
|
||||
this.inputManager.destroy();
|
||||
|
||||
// Remove event listeners
|
||||
this.events.off("*");
|
||||
this.events.off('*');
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -1125,13 +1125,13 @@ class GameScene extends Phaser.Scene {
|
||||
|
||||
```typescript
|
||||
// Proper scene transitions with data
|
||||
this.scene.start("NextScene", {
|
||||
this.scene.start('NextScene', {
|
||||
playerScore: this.playerScore,
|
||||
currentLevel: this.currentLevel + 1,
|
||||
});
|
||||
|
||||
// Scene overlays for UI
|
||||
this.scene.launch("PauseMenuScene");
|
||||
this.scene.launch('PauseMenuScene');
|
||||
this.scene.pause();
|
||||
```
|
||||
|
||||
@@ -1175,7 +1175,7 @@ class Player extends GameEntity {
|
||||
private health!: HealthComponent;
|
||||
|
||||
constructor(scene: Phaser.Scene, x: number, y: number) {
|
||||
super(scene, x, y, "player");
|
||||
super(scene, x, y, 'player');
|
||||
|
||||
this.movement = this.addComponent(new MovementComponent(this));
|
||||
this.health = this.addComponent(new HealthComponent(this, 100));
|
||||
@@ -1195,7 +1195,7 @@ class GameManager {
|
||||
|
||||
constructor(scene: Phaser.Scene) {
|
||||
if (GameManager.instance) {
|
||||
throw new Error("GameManager already exists!");
|
||||
throw new Error('GameManager already exists!');
|
||||
}
|
||||
|
||||
this.scene = scene;
|
||||
@@ -1205,7 +1205,7 @@ class GameManager {
|
||||
|
||||
static getInstance(): GameManager {
|
||||
if (!GameManager.instance) {
|
||||
throw new Error("GameManager not initialized!");
|
||||
throw new Error('GameManager not initialized!');
|
||||
}
|
||||
return GameManager.instance;
|
||||
}
|
||||
@@ -1252,7 +1252,7 @@ class BulletPool {
|
||||
}
|
||||
|
||||
// Pool exhausted - create new bullet
|
||||
console.warn("Bullet pool exhausted, creating new bullet");
|
||||
console.warn('Bullet pool exhausted, creating new bullet');
|
||||
return new Bullet(this.scene, 0, 0);
|
||||
}
|
||||
|
||||
@@ -1352,14 +1352,12 @@ class InputManager {
|
||||
}
|
||||
|
||||
private setupKeyboard(): void {
|
||||
this.keys = this.scene.input.keyboard.addKeys(
|
||||
"W,A,S,D,SPACE,ESC,UP,DOWN,LEFT,RIGHT",
|
||||
);
|
||||
this.keys = this.scene.input.keyboard.addKeys('W,A,S,D,SPACE,ESC,UP,DOWN,LEFT,RIGHT');
|
||||
}
|
||||
|
||||
private setupTouch(): void {
|
||||
this.scene.input.on("pointerdown", this.handlePointerDown, this);
|
||||
this.scene.input.on("pointerup", this.handlePointerUp, this);
|
||||
this.scene.input.on('pointerdown', this.handlePointerDown, this);
|
||||
this.scene.input.on('pointerup', this.handlePointerUp, this);
|
||||
}
|
||||
|
||||
update(): void {
|
||||
@@ -1386,9 +1384,9 @@ class InputManager {
|
||||
class AssetManager {
|
||||
loadAssets(): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.scene.load.on("filecomplete", this.handleFileComplete, this);
|
||||
this.scene.load.on("loaderror", this.handleLoadError, this);
|
||||
this.scene.load.on("complete", () => resolve());
|
||||
this.scene.load.on('filecomplete', this.handleFileComplete, this);
|
||||
this.scene.load.on('loaderror', this.handleLoadError, this);
|
||||
this.scene.load.on('complete', () => resolve());
|
||||
|
||||
this.scene.load.start();
|
||||
});
|
||||
@@ -1404,8 +1402,8 @@ class AssetManager {
|
||||
private loadFallbackAsset(key: string): void {
|
||||
// Load placeholder or default assets
|
||||
switch (key) {
|
||||
case "player":
|
||||
this.scene.load.image("player", "assets/defaults/default-player.png");
|
||||
case 'player':
|
||||
this.scene.load.image('player', 'assets/defaults/default-player.png');
|
||||
break;
|
||||
default:
|
||||
console.warn(`No fallback for asset: ${key}`);
|
||||
@@ -1432,11 +1430,11 @@ class GameSystem {
|
||||
|
||||
private attemptRecovery(context: string): void {
|
||||
switch (context) {
|
||||
case "update":
|
||||
case 'update':
|
||||
// Reset system state
|
||||
this.reset();
|
||||
break;
|
||||
case "render":
|
||||
case 'render':
|
||||
// Disable visual effects
|
||||
this.disableEffects();
|
||||
break;
|
||||
@@ -1456,7 +1454,7 @@ class GameSystem {
|
||||
|
||||
```typescript
|
||||
// Example test for game mechanics
|
||||
describe("HealthComponent", () => {
|
||||
describe('HealthComponent', () => {
|
||||
let healthComponent: HealthComponent;
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -1464,18 +1462,18 @@ describe("HealthComponent", () => {
|
||||
healthComponent = new HealthComponent(mockEntity, 100);
|
||||
});
|
||||
|
||||
test("should initialize with correct health", () => {
|
||||
test('should initialize with correct health', () => {
|
||||
expect(healthComponent.currentHealth).toBe(100);
|
||||
expect(healthComponent.maxHealth).toBe(100);
|
||||
});
|
||||
|
||||
test("should handle damage correctly", () => {
|
||||
test('should handle damage correctly', () => {
|
||||
healthComponent.takeDamage(25);
|
||||
expect(healthComponent.currentHealth).toBe(75);
|
||||
expect(healthComponent.isAlive()).toBe(true);
|
||||
});
|
||||
|
||||
test("should handle death correctly", () => {
|
||||
test('should handle death correctly', () => {
|
||||
healthComponent.takeDamage(150);
|
||||
expect(healthComponent.currentHealth).toBe(0);
|
||||
expect(healthComponent.isAlive()).toBe(false);
|
||||
@@ -1488,7 +1486,7 @@ describe("HealthComponent", () => {
|
||||
**Scene Testing:**
|
||||
|
||||
```typescript
|
||||
describe("GameScene Integration", () => {
|
||||
describe('GameScene Integration', () => {
|
||||
let scene: GameScene;
|
||||
let mockGame: Phaser.Game;
|
||||
|
||||
@@ -1498,7 +1496,7 @@ describe("GameScene Integration", () => {
|
||||
scene = new GameScene();
|
||||
});
|
||||
|
||||
test("should initialize all systems", () => {
|
||||
test('should initialize all systems', () => {
|
||||
scene.create({});
|
||||
|
||||
expect(scene.gameManager).toBeDefined();
|
||||
|
||||
Reference in New Issue
Block a user