mirror of
https://github.com/cliffe/BreakEscape.git
synced 2026-02-21 11:18:08 +00:00
845 lines
29 KiB
Markdown
845 lines
29 KiB
Markdown
# BreakEscape Game Design Documentation
|
|
|
|
This document provides a comprehensive overview of the BreakEscape codebase architecture, file organization, and component systems. It serves as a guide for developers who want to understand, modify, or extend the game.
|
|
|
|
## Table of Contents
|
|
|
|
1. [Architecture Overview](#architecture-overview)
|
|
2. [File Layout](#file-layout)
|
|
3. [Core Components](#core-components)
|
|
4. [Recent Refactoring (2024)](#recent-refactoring-2024)
|
|
5. [Game Systems](#game-systems)
|
|
6. [Asset Organization](#asset-organization)
|
|
7. [Implementing New Mini-Games](#implementing-new-mini-games)
|
|
8. [CSS Architecture](#css-architecture)
|
|
9. [Development Workflow](#development-workflow)
|
|
10. [Architecture Notes](#architecture-notes)
|
|
|
|
## Architecture Overview
|
|
|
|
BreakEscape is built using modern web technologies with a modular architecture:
|
|
|
|
- **Game Engine**: Phaser.js 3.x for 2D game rendering and physics
|
|
- **Module System**: ES6 modules with explicit imports/exports
|
|
- **Architecture Pattern**: Component-based with clear separation of concerns
|
|
- **Asset Loading**: JSON-based scenario configuration with dynamic asset loading
|
|
- **UI Framework**: Custom HTML/CSS overlay system integrated with game canvas
|
|
|
|
### Key Design Principles
|
|
|
|
1. **Modularity**: Each system is self-contained with clear interfaces
|
|
2. **Extensibility**: New mini-games, rooms, and scenarios can be added easily
|
|
3. **Maintainability**: Clean separation between game logic, UI, and data
|
|
4. **Performance**: Efficient asset loading and memory management
|
|
|
|
### Recent Improvements (2024)
|
|
|
|
The codebase recently underwent significant refactoring:
|
|
- ✅ **Reduced code duplication** - Eliminated ~245 lines of duplicate code
|
|
- ✅ **Better organization** - Split monolithic files into focused modules
|
|
- ✅ **Fixed critical bugs** - Biometric and Bluetooth locks now work correctly
|
|
- ✅ **Single source of truth** - Unified unlock system for all lock types
|
|
- ✅ **Improved robustness** - Better handling of dynamic room loading
|
|
|
|
See [Recent Refactoring (2024)](#recent-refactoring-2024) for details.
|
|
|
|
## File Layout
|
|
|
|
```
|
|
BreakEscape/
|
|
├── index.html # Main game entry point
|
|
├── index_new.html # Updated main entry point with modern UI
|
|
├── scenario_select.html # Scenario selection interface
|
|
├──
|
|
├── css/ # Styling and UI components
|
|
│ ├── main.css # Core game styles
|
|
│ ├── panels.css # Side panel layouts
|
|
│ ├── modals.css # Modal dialog styles
|
|
│ ├── inventory.css # Inventory system styles
|
|
│ ├── minigames.css # Mini-game UI styles
|
|
│ ├── notifications.css # Notification system styles
|
|
│ └── utilities.css # Utility classes and helpers
|
|
│
|
|
├── js/ # JavaScript source code
|
|
│ ├── main.js # Application entry point, init, and game state variables
|
|
│ │
|
|
│ ├── core/ # Core game engine components
|
|
│ │ ├── game.js # Main game scene (preload, create, update)
|
|
│ │ ├── player.js # Player character logic and movement
|
|
│ │ ├── rooms.js # Room management and layout system
|
|
│ │ └── pathfinding.js # A* pathfinding for player movement
|
|
│ │
|
|
│ ├── systems/ # Game systems and mechanics
|
|
│ │ ├── interactions.js # Core interaction routing - refactored!
|
|
│ │ ├── unlock-system.js # Centralized unlock logic for all lock types
|
|
│ │ ├── key-lock-system.js # Key-lock mapping and validation
|
|
│ │ ├── biometrics.js # Fingerprint collection and dusting
|
|
│ │ ├── minigame-starters.js # Minigame initialization
|
|
│ │ ├── inventory.js # Inventory management and item handling
|
|
│ │ ├── doors.js # Door sprites, interactions, and transitions
|
|
│ │ ├── collision.js # Wall collision detection and management
|
|
│ │ ├── object-physics.js # Chair physics and object collisions
|
|
│ │ ├── player-effects.js # Visual effects for player interactions
|
|
│ │ ├── notifications.js # In-game notification system
|
|
│ │ └── debug.js # Debug tools and development helpers
|
|
│ │
|
|
│ ├── ui/ # User interface components
|
|
│ │ ├── panels.js # Side panels (biometrics, bluetooth, notes)
|
|
│ │ └── modals.js # Modal dialogs and popup windows
|
|
│ │
|
|
│ ├── utils/ # Utility functions and helpers
|
|
│ │ ├── constants.js # Game configuration and constants
|
|
│ │ ├── helpers.js # General utility functions
|
|
│ │ └── crypto-workstation.js # CyberChef integration
|
|
│ │
|
|
│ └── minigames/ # Mini-game framework and implementations
|
|
│ ├── index.js # Mini-game registry and exports
|
|
│ ├── framework/ # Mini-game framework
|
|
│ │ ├── base-minigame.js # Base class for all mini-games
|
|
│ │ └── minigame-manager.js # Mini-game lifecycle management
|
|
│ ├── lockpicking/ # Lockpicking mini-game
|
|
│ │ └── lockpicking-game-phaser.js
|
|
│ ├── dusting/ # Fingerprint dusting mini-game
|
|
│ │ └── dusting-game.js
|
|
│ ├── biometrics/ # Biometric scanner minigame
|
|
│ │ └── biometrics-minigame.js
|
|
│ ├── bluetooth/ # Bluetooth scanner minigame
|
|
│ │ └── bluetooth-scanner-minigame.js
|
|
│ ├── notes/ # Notes viewing minigame
|
|
│ │ └── notes-minigame.js
|
|
│ └── lockpick/ # Lockpick set minigame
|
|
│ └── lockpick-set-minigame.js
|
|
│
|
|
├── assets/ # Game assets and resources
|
|
│ ├── characters/ # Character sprites and animations
|
|
│ ├── objects/ # Interactive object sprites
|
|
│ ├── rooms/ # Room layouts and images
|
|
│ ├── scenarios/ # Scenario configuration files
|
|
│ ├── sounds/ # Audio files (sound effects)
|
|
│ └── tiles/ # Tileset graphics
|
|
│
|
|
└── scenarios/ # JSON scenario definitions
|
|
├── ceo_exfil.json # CEO data exfiltration scenario
|
|
├── biometric_breach.json # Biometric security breach scenario
|
|
└── scenario[1-4].json # Additional numbered scenarios
|
|
```
|
|
|
|
## Core Components
|
|
|
|
### 1. Game Engine (`js/core/`)
|
|
|
|
#### game.js
|
|
- **Purpose**: Main Phaser scene with preload, create, and update lifecycle
|
|
- **Key Functions**:
|
|
- `preload()`: Loads all game assets (sprites, maps, scenarios)
|
|
- `create()`: Initializes game world, player, rooms, and systems
|
|
- `update()`: Main game loop for movement, interactions, and system updates
|
|
- **Dependencies**: All core systems and utilities
|
|
|
|
#### player.js
|
|
- **Purpose**: Player character movement, animation, and state management
|
|
- **Key Features**:
|
|
- Click-to-move with pathfinding integration
|
|
- Sprite animation for movement directions
|
|
- Room transition detection
|
|
- Position tracking and state management
|
|
|
|
#### rooms.js
|
|
- **Purpose**: Room layout calculation, creation, and management
|
|
- **Key Features**:
|
|
- Dynamic room positioning based on JSON connections
|
|
- Room revelation system (fog of war)
|
|
- Door validation and collision detection
|
|
- Multi-room layout algorithms for complex scenarios
|
|
|
|
#### pathfinding.js
|
|
- **Purpose**: A* pathfinding implementation for intelligent player movement
|
|
- **Key Features**:
|
|
- Obstacle avoidance
|
|
- Efficient path calculation
|
|
- Path smoothing and optimization
|
|
|
|
### 2. Game Systems (`js/systems/`)
|
|
|
|
The game systems have been refactored into specialized, focused modules for better maintainability and code organization.
|
|
|
|
#### interactions.js (Recently Refactored!)
|
|
- **Purpose**: Core interaction routing and object handling
|
|
- **Key Features**:
|
|
- Click detection on game objects
|
|
- Routes interactions to appropriate systems
|
|
- Object state management (opened, unlocked, etc.)
|
|
- Container object support (safes, suitcases)
|
|
- Takeable item handling
|
|
- **Architecture**: Lean routing layer that delegates to specialized systems
|
|
- **Improvement**: Reduced from 1,605 lines (81% reduction) by extracting specialized functionality
|
|
|
|
#### unlock-system.js (New!)
|
|
- **Purpose**: Centralized unlock logic for all lock types
|
|
- **Key Features**:
|
|
- Unified unlock handling for doors and items
|
|
- Supports 5 lock types: key, PIN, password, biometric, Bluetooth
|
|
- Comprehensive biometric validation (fingerprint quality thresholds)
|
|
- Bluetooth device matching with signal strength validation
|
|
- Dynamic lockpick difficulty per object
|
|
- Single source of truth for all unlock logic
|
|
- **Benefits**: Eliminates code duplication, consistent behavior across all locked objects
|
|
|
|
#### key-lock-system.js (New!)
|
|
- **Purpose**: Key-lock mapping and pin height generation
|
|
- **Key Features**:
|
|
- Global key-lock mapping system
|
|
- Predefined lock configurations
|
|
- Key cut generation for visual representation
|
|
- Pin height validation
|
|
- Lock-key compatibility checking
|
|
- **Integration**: Used by lockpicking minigame for accurate pin representation
|
|
|
|
#### biometrics.js (New!)
|
|
- **Purpose**: Fingerprint collection and analysis
|
|
- **Key Features**:
|
|
- Fingerprint collection from objects
|
|
- Quality-based fingerprint data generation
|
|
- Integration with dusting minigame
|
|
- Biometric scan handling
|
|
- Owner-specific fingerprint matching
|
|
- **Workflow**: Collect → Dust → Store → Validate against locks
|
|
|
|
#### minigame-starters.js (New!)
|
|
- **Purpose**: Minigame initialization and setup
|
|
- **Key Features**:
|
|
- Lockpicking minigame launcher
|
|
- Key selection minigame launcher
|
|
- Callback management for minigame completion
|
|
- Timing coordination with game scene cleanup
|
|
- **Architecture**: Handles the bridge between game objects and minigame framework
|
|
|
|
#### inventory.js
|
|
- **Purpose**: Item collection, storage, and usage management
|
|
- **Key Features**:
|
|
- Item addition and removal
|
|
- Visual inventory display with item icons
|
|
- Drag-and-drop item interaction
|
|
- Item identifier creation
|
|
- Notepad integration
|
|
- **Exports**: Now properly exports functions for use by other systems
|
|
|
|
#### doors.js
|
|
- **Purpose**: Door sprites, interactions, and room transitions
|
|
- **Key Features**:
|
|
- Door sprite creation and management
|
|
- Door interaction handling
|
|
- Door opening animations
|
|
- Room transition detection
|
|
- Door visibility management
|
|
- Collision processing
|
|
- **Recent Improvement**: Removed duplicate unlock logic, now uses unlock-system.js
|
|
|
|
#### collision.js
|
|
- **Purpose**: Wall collision detection and tile management
|
|
- **Key Features**:
|
|
- Wall collision box creation
|
|
- Tile removal under doors
|
|
- Room-specific collision management
|
|
- Player collision registration
|
|
- **Robustness**: Uses window.game fallback for dynamic room loading
|
|
|
|
#### object-physics.js
|
|
- **Purpose**: Chair physics and object collisions
|
|
- **Key Features**:
|
|
- Swivel chair rotation mechanics
|
|
- Chair-to-chair collision detection
|
|
- Chair-to-wall collision setup
|
|
- Collision management for newly loaded rooms
|
|
- **Robustness**: Handles collisions for dynamically loaded rooms
|
|
|
|
#### player-effects.js
|
|
- **Purpose**: Visual effects for player interactions
|
|
- **Key Features**:
|
|
- Bump effects when colliding with objects
|
|
- Plant sway animations
|
|
- Sprite depth management
|
|
- **Polish**: Adds visual feedback to enhance player experience
|
|
|
|
### 3. UI Framework (`js/ui/`)
|
|
|
|
#### panels.js
|
|
- **Purpose**: Side panel management for game information
|
|
- **Key Features**:
|
|
- Collapsible panel system
|
|
- Dynamic content updates
|
|
- Panel state persistence
|
|
|
|
#### modals.js
|
|
- **Purpose**: Modal dialog system for important interactions
|
|
- **Key Features**:
|
|
- Scenario introductions
|
|
- Item examination
|
|
- System messages and confirmations
|
|
|
|
## Recent Refactoring (2024)
|
|
|
|
The codebase underwent a major refactoring to improve maintainability, eliminate code duplication, and fix critical bugs in the lock system.
|
|
|
|
### What Changed
|
|
|
|
#### 1. interactions.js - Massive Reduction (81% smaller!)
|
|
- **Before**: 1,605 lines of mixed responsibilities
|
|
- **After**: 289 lines of focused interaction routing
|
|
- **Extracted**:
|
|
- Unlock logic → `unlock-system.js`
|
|
- Key-lock mapping → `key-lock-system.js`
|
|
- Biometric collection → `biometrics.js`
|
|
- Minigame initialization → `minigame-starters.js`
|
|
- Inventory functions → `inventory.js`
|
|
|
|
#### 2. doors.js - Eliminated Duplication
|
|
- **Before**: 1,004 lines with duplicate unlock logic
|
|
- **After**: 880 lines using centralized unlock system
|
|
- **Improvement**: Removed 124 lines of duplicate code, now uses `unlock-system.js`
|
|
|
|
#### 3. Unified Unlock System
|
|
- **Problem**: Door unlock logic was duplicated in two places with inconsistent behavior
|
|
- **Solution**: Created `unlock-system.js` as single source of truth
|
|
- **Impact**:
|
|
- Fixed broken biometric locks (now validates specific fingerprints with quality thresholds)
|
|
- Fixed broken Bluetooth locks (now validates specific devices with signal strength)
|
|
- Eliminated ~120 lines of duplicate code
|
|
- Consistent behavior for all lock types
|
|
|
|
#### 4. Fixed Dynamic Room Loading
|
|
- **Problem**: Collisions and references broke when rooms loaded after minigames
|
|
- **Solution**: Updated `collision.js`, `object-physics.js`, and `doors.js` to use `window.game` and `window.rooms` fallbacks
|
|
- **Impact**: Proper collision detection in dynamically loaded rooms
|
|
|
|
### Benefits of Refactoring
|
|
|
|
1. **Better Code Organization**
|
|
- Clear separation of concerns
|
|
- Easier to locate specific functionality
|
|
- Reduced cognitive load when reading code
|
|
|
|
2. **Eliminated Bugs**
|
|
- Biometric locks now work correctly (specific fingerprint + quality validation)
|
|
- Bluetooth locks now work correctly (device matching + signal strength)
|
|
- Collision system robust to async room loading
|
|
|
|
3. **Improved Maintainability**
|
|
- Single source of truth for unlock logic
|
|
- No code duplication to keep in sync
|
|
- Easier to add new lock types or features
|
|
|
|
4. **Better Testing**
|
|
- Smaller, focused modules are easier to test
|
|
- Clear interfaces between components
|
|
- Fewer dependencies to mock
|
|
|
|
## Game Systems
|
|
|
|
### Scenario System
|
|
- **Configuration**: JSON-based scenario definitions
|
|
- **Components**: Rooms, objects, locks, and victory conditions
|
|
- **Flexibility**: Complete customization without code changes
|
|
|
|
### Lock System (Recently Improved!)
|
|
- **Types**: Key, PIN, password, biometric, Bluetooth proximity
|
|
- **Architecture**: Centralized in `unlock-system.js` for consistency
|
|
- **Features**:
|
|
- Biometric locks validate specific fingerprints with quality thresholds
|
|
- Bluetooth locks validate specific devices with signal strength requirements
|
|
- Dynamic lockpick difficulty per object
|
|
- Comprehensive error messaging
|
|
- **Integration**: Works with rooms, objects, and containers
|
|
- **Progression**: Supports complex unlocking sequences
|
|
|
|
### Asset Management
|
|
- **Loading**: Dynamic asset loading based on scenario requirements
|
|
- **Caching**: Efficient resource management with Phaser's asset cache
|
|
- **Organization**: Logical separation by asset type and purpose
|
|
|
|
## Asset Organization
|
|
|
|
### Images (`assets/`)
|
|
- **characters/**: Player character sprite sheets
|
|
- **objects/**: Interactive object sprites (organized by type)
|
|
- **rooms/**: Room background images and tiled map data
|
|
- **tiles/**: Individual tile graphics for maps
|
|
|
|
### Data (`assets/` and `scenarios/`)
|
|
- **Room Maps**: Tiled JSON format for room layouts
|
|
- **Scenarios**: JSON configuration files defining game content
|
|
- **Audio**: Sound effects for mini-games and interactions
|
|
|
|
## Implementing New Mini-Games
|
|
|
|
BreakEscape uses a flexible mini-game framework that allows developers to create new interactive challenges. Here's a comprehensive guide:
|
|
|
|
### 1. Framework Overview
|
|
|
|
The mini-game framework consists of:
|
|
- **Base Class**: `MinigameScene` provides common functionality
|
|
- **Manager**: `MinigameFramework` handles lifecycle and registration
|
|
- **Integration**: Automatic UI overlay and game state management
|
|
|
|
### 2. Creating a New Mini-Game
|
|
|
|
#### Step 1: Create the Mini-Game Class
|
|
|
|
Create a new file: `js/minigames/[minigame-name]/[minigame-name]-game.js`
|
|
|
|
```javascript
|
|
import { MinigameScene } from '../framework/base-minigame.js';
|
|
|
|
export class MyMinigame extends MinigameScene {
|
|
constructor(container, params) {
|
|
super(container, params);
|
|
|
|
// Initialize your game-specific state
|
|
this.gameData = {
|
|
score: 0,
|
|
timeLimit: params.timeLimit || 30000, // 30 seconds default
|
|
difficulty: params.difficulty || 'medium'
|
|
};
|
|
}
|
|
|
|
init() {
|
|
// Call parent init to set up basic UI structure
|
|
super.init();
|
|
|
|
// Customize the header
|
|
this.headerElement.innerHTML = `
|
|
<h3>${this.params.title || 'My Mini-Game'}</h3>
|
|
<p>Game instructions go here</p>
|
|
`;
|
|
|
|
// Set up your game-specific UI
|
|
this.setupGameInterface();
|
|
|
|
// Set up event listeners
|
|
this.setupEventListeners();
|
|
}
|
|
|
|
setupGameInterface() {
|
|
// Create your game's HTML structure
|
|
this.gameContainer.innerHTML = `
|
|
<div class="my-minigame-area">
|
|
<div class="score">Score: <span id="score-display">0</span></div>
|
|
<div class="game-area" id="game-area">
|
|
<!-- Your game content here -->
|
|
</div>
|
|
<div class="timer">Time: <span id="timer-display">30</span>s</div>
|
|
</div>
|
|
`;
|
|
|
|
// Get references to important elements
|
|
this.gameArea = document.getElementById('game-area');
|
|
this.scoreDisplay = document.getElementById('score-display');
|
|
this.timerDisplay = document.getElementById('timer-display');
|
|
}
|
|
|
|
setupEventListeners() {
|
|
// Add your game-specific event listeners using this.addEventListener
|
|
// This ensures proper cleanup when the mini-game ends
|
|
|
|
this.addEventListener(this.gameArea, 'click', (event) => {
|
|
this.handleGameClick(event);
|
|
});
|
|
|
|
this.addEventListener(document, 'keydown', (event) => {
|
|
this.handleKeyPress(event);
|
|
});
|
|
}
|
|
|
|
start() {
|
|
// Call parent start
|
|
super.start();
|
|
|
|
// Start your game logic
|
|
this.startTimer();
|
|
this.initializeGameContent();
|
|
|
|
console.log("My mini-game started");
|
|
}
|
|
|
|
startTimer() {
|
|
this.startTime = Date.now();
|
|
this.timerInterval = setInterval(() => {
|
|
const elapsed = Date.now() - this.startTime;
|
|
const remaining = Math.max(0, this.gameData.timeLimit - elapsed);
|
|
const seconds = Math.ceil(remaining / 1000);
|
|
|
|
this.timerDisplay.textContent = seconds;
|
|
|
|
if (remaining <= 0) {
|
|
this.timeUp();
|
|
}
|
|
}, 100);
|
|
}
|
|
|
|
handleGameClick(event) {
|
|
if (!this.gameState.isActive) return;
|
|
|
|
// Handle clicks in your game area
|
|
// Update score, check win conditions, etc.
|
|
|
|
this.updateScore(10);
|
|
this.checkWinCondition();
|
|
}
|
|
|
|
handleKeyPress(event) {
|
|
if (!this.gameState.isActive) return;
|
|
|
|
// Handle keyboard input if needed
|
|
switch(event.key) {
|
|
case 'Space':
|
|
event.preventDefault();
|
|
// Handle space key
|
|
break;
|
|
}
|
|
}
|
|
|
|
updateScore(points) {
|
|
this.gameData.score += points;
|
|
this.scoreDisplay.textContent = this.gameData.score;
|
|
}
|
|
|
|
checkWinCondition() {
|
|
// Check if the player has won
|
|
if (this.gameData.score >= 100) {
|
|
this.gameWon();
|
|
}
|
|
}
|
|
|
|
gameWon() {
|
|
this.cleanup();
|
|
this.showSuccess("Congratulations! You won!", true, 3000);
|
|
|
|
// Set game result for the callback
|
|
this.gameResult = {
|
|
success: true,
|
|
score: this.gameData.score,
|
|
timeRemaining: this.gameData.timeLimit - (Date.now() - this.startTime)
|
|
};
|
|
}
|
|
|
|
timeUp() {
|
|
this.cleanup();
|
|
this.showFailure("Time's up! Try again.", true, 3000);
|
|
|
|
this.gameResult = {
|
|
success: false,
|
|
score: this.gameData.score,
|
|
reason: 'timeout'
|
|
};
|
|
}
|
|
|
|
initializeGameContent() {
|
|
// Set up your specific game content
|
|
// This might involve creating DOM elements, starting animations, etc.
|
|
}
|
|
|
|
cleanup() {
|
|
// Clean up timers and intervals
|
|
if (this.timerInterval) {
|
|
clearInterval(this.timerInterval);
|
|
}
|
|
|
|
// Call parent cleanup (handles event listeners)
|
|
super.cleanup();
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Step 2: Add Styles
|
|
|
|
Add CSS to `css/minigames.css`:
|
|
|
|
```css
|
|
/* My Mini-Game Specific Styles */
|
|
.my-minigame-area {
|
|
display: flex;
|
|
flex-direction: column;
|
|
height: 400px;
|
|
padding: 20px;
|
|
}
|
|
|
|
.my-minigame-area .score,
|
|
.my-minigame-area .timer {
|
|
background: rgba(0, 255, 0, 0.1);
|
|
padding: 10px;
|
|
margin: 5px 0;
|
|
border-radius: 5px;
|
|
text-align: center;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.my-minigame-area .game-area {
|
|
flex: 1;
|
|
background: #1a1a1a;
|
|
border: 2px solid #00ff00;
|
|
border-radius: 10px;
|
|
margin: 10px 0;
|
|
cursor: crosshair;
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* Add any additional styles your mini-game needs */
|
|
```
|
|
|
|
#### Step 3: Register the Mini-Game
|
|
|
|
Add your mini-game to `js/minigames/index.js`:
|
|
|
|
```javascript
|
|
// Add this import
|
|
export { MyMinigame } from './my-minigame/my-minigame-game.js';
|
|
|
|
// Add this at the bottom with other registrations
|
|
import { MyMinigame } from './my-minigame/my-minigame-game.js';
|
|
MinigameFramework.registerScene('my-minigame', MyMinigame);
|
|
```
|
|
|
|
#### Step 4: Integrate with Game Objects
|
|
|
|
To trigger your mini-game from an object interaction, modify the object in your scenario JSON:
|
|
|
|
```json
|
|
{
|
|
"type": "special_device",
|
|
"name": "Puzzle Device",
|
|
"takeable": false,
|
|
"observations": "A strange device with buttons and lights.",
|
|
"requiresMinigame": "my-minigame",
|
|
"minigameParams": {
|
|
"title": "Decode the Pattern",
|
|
"difficulty": "hard",
|
|
"timeLimit": 45000
|
|
}
|
|
}
|
|
```
|
|
|
|
Or trigger it programmatically in the interactions system:
|
|
|
|
```javascript
|
|
// In interactions.js or a custom system
|
|
window.MinigameFramework.startMinigame('my-minigame', {
|
|
title: 'My Custom Challenge',
|
|
difficulty: 'medium',
|
|
onComplete: (success, result) => {
|
|
if (success) {
|
|
console.log('Mini-game completed successfully!', result);
|
|
// Unlock something, add item to inventory, etc.
|
|
} else {
|
|
console.log('Mini-game failed', result);
|
|
}
|
|
}
|
|
});
|
|
```
|
|
|
|
### 3. Mini-Game Best Practices
|
|
|
|
#### UI Guidelines
|
|
- Use the framework's built-in message system (`showSuccess`, `showFailure`)
|
|
- Maintain consistent styling with the game's retro-cyber theme
|
|
- Provide clear instructions in the header
|
|
- Use progress indicators when appropriate
|
|
|
|
#### Performance
|
|
- Clean up timers and intervals in the `cleanup()` method
|
|
- Use `this.addEventListener()` for proper event listener management
|
|
- Avoid creating too many DOM elements for complex animations
|
|
|
|
#### Integration
|
|
- Return meaningful results in `this.gameResult` for scenario progression
|
|
- Support different difficulty levels through parameters
|
|
- Provide visual feedback for player actions
|
|
|
|
#### Accessibility
|
|
- Include keyboard controls when possible
|
|
- Use clear visual indicators for interactive elements
|
|
- Provide audio feedback through the game's sound system
|
|
|
|
### 4. Advanced Mini-Game Features
|
|
|
|
#### Canvas-based Games
|
|
For more complex graphics, you can create a canvas within your mini-game:
|
|
|
|
```javascript
|
|
setupGameInterface() {
|
|
this.gameContainer.innerHTML = `
|
|
<canvas id="minigame-canvas" width="600" height="400"></canvas>
|
|
`;
|
|
|
|
this.canvas = document.getElementById('minigame-canvas');
|
|
this.ctx = this.canvas.getContext('2d');
|
|
}
|
|
```
|
|
|
|
#### Animation Integration
|
|
Use requestAnimationFrame for smooth animations:
|
|
|
|
```javascript
|
|
start() {
|
|
super.start();
|
|
this.animate();
|
|
}
|
|
|
|
animate() {
|
|
if (!this.gameState.isActive) return;
|
|
|
|
// Update game state
|
|
this.updateGame();
|
|
|
|
// Render frame
|
|
this.renderGame();
|
|
|
|
requestAnimationFrame(() => this.animate());
|
|
}
|
|
```
|
|
|
|
#### Sound Integration
|
|
Add sound effects using the main game's audio system:
|
|
|
|
```javascript
|
|
// In your mini-game
|
|
playSound(soundName) {
|
|
if (window.game && window.game.sound) {
|
|
window.game.sound.play(soundName);
|
|
}
|
|
}
|
|
```
|
|
|
|
## CSS Architecture
|
|
|
|
### File Organization
|
|
- **main.css**: Core game styles and layout
|
|
- **panels.css**: Side panel layouts and responsive design
|
|
- **modals.css**: Modal dialog styling
|
|
- **inventory.css**: Inventory system and item display
|
|
- **minigames.css**: Mini-game overlay and component styles
|
|
- **notifications.css**: In-game notification system
|
|
- **utilities.css**: Utility classes and responsive helpers
|
|
|
|
### Design System
|
|
- **Color Scheme**: Retro cyber theme with green (#00ff00) accents
|
|
- **Typography**: Monospace fonts for technical elements
|
|
- **Spacing**: Consistent padding and margin scale
|
|
- **Responsive**: Mobile-friendly with flexible layouts
|
|
|
|
## Development Workflow
|
|
|
|
### Adding New Features
|
|
1. Create feature branch
|
|
2. **Identify the right module**: Use the refactored structure
|
|
- Interaction routing → `interactions.js`
|
|
- Lock logic → `unlock-system.js`
|
|
- Key mapping → `key-lock-system.js`
|
|
- Biometrics → `biometrics.js`
|
|
- Minigames → `minigame-starters.js`
|
|
- Inventory → `inventory.js`
|
|
3. Implement in appropriate module
|
|
4. Add necessary styles to CSS files
|
|
5. Update scenario JSON if needed
|
|
6. Test with multiple scenarios
|
|
7. Document changes
|
|
|
|
### Code Organization Best Practices
|
|
|
|
Based on the recent refactoring, follow these principles:
|
|
|
|
1. **Keep files focused and small** (< 500 lines is ideal, < 1000 is acceptable)
|
|
2. **Single Responsibility Principle**: Each module should have one clear purpose
|
|
3. **Avoid duplication**: Create shared modules for common functionality
|
|
4. **Use proper imports/exports**: Make dependencies explicit
|
|
5. **Handle async operations**: Use `window.game` and `window.rooms` fallbacks for dynamic content
|
|
6. **Clean up resources**: Always implement proper cleanup in lifecycle methods
|
|
|
|
### Refactoring Guidelines
|
|
|
|
When a file grows too large or has mixed responsibilities:
|
|
|
|
1. **Identify distinct concerns**: Look for natural separation points
|
|
2. **Extract to new modules**: Create focused files for each concern
|
|
3. **Update imports**: Ensure all references are updated
|
|
4. **Test thoroughly**: Verify all functionality still works
|
|
5. **Document changes**: Update this README and create migration notes
|
|
|
|
### Common Patterns
|
|
|
|
**Global State Access:**
|
|
```javascript
|
|
// Use fallbacks for dynamic content
|
|
const game = gameRef || window.game;
|
|
const allRooms = window.rooms || {};
|
|
```
|
|
|
|
**Minigame Integration:**
|
|
```javascript
|
|
// Use minigame-starters.js for consistency
|
|
import { startLockpickingMinigame } from './minigame-starters.js';
|
|
startLockpickingMinigame(lockable, window.game, difficulty, callback);
|
|
```
|
|
|
|
**Lock Handling:**
|
|
```javascript
|
|
// Use centralized unlock system
|
|
import { handleUnlock } from './unlock-system.js';
|
|
handleUnlock(lockable, 'door'); // or 'item'
|
|
```
|
|
|
|
### Testing Mini-Games
|
|
1. Create test scenario with your mini-game object
|
|
2. Test success and failure paths
|
|
3. Verify cleanup and state management
|
|
4. Test on different screen sizes
|
|
5. Ensure integration with main game systems
|
|
6. Test minigame → room loading transition (timing)
|
|
|
|
### Performance Considerations
|
|
- Use efficient asset loading
|
|
- Implement proper cleanup in all systems
|
|
- Monitor memory usage with browser dev tools
|
|
- Optimize for mobile devices
|
|
- Use `setTimeout` delays for minigame → room transitions (100ms recommended)
|
|
|
|
### Debugging Tips
|
|
|
|
**Module Reference Issues:**
|
|
- If collisions fail in newly loaded rooms, check for `gameRef` vs `window.game`
|
|
- If rooms aren't found, use `window.rooms` instead of local `rooms` variable
|
|
|
|
**Lock System Issues:**
|
|
- All lock logic should be in `unlock-system.js` (single source of truth)
|
|
- Check `doorProperties` for doors, `scenarioData` for items
|
|
|
|
**Minigame Timing:**
|
|
- Use `setTimeout` callbacks to allow cleanup before room operations
|
|
- Default 100ms delay works well for most cases
|
|
|
|
## Architecture Notes
|
|
|
|
### Module Dependencies
|
|
|
|
Current clean architecture (no circular dependencies):
|
|
|
|
```
|
|
interactions.js → unlock-system.js → minigame-starters.js
|
|
doors.js → unlock-system.js → minigame-starters.js
|
|
unlock-system.js → doors.js (for unlockDoor callback only)
|
|
```
|
|
|
|
**Avoid creating new circular dependencies!** If two modules need each other, create an intermediary module.
|
|
|
|
### Global State Pattern
|
|
|
|
The game uses `window.*` for shared state:
|
|
- `window.game` - Phaser game instance
|
|
- `window.rooms` - Room data
|
|
- `window.player` - Player sprite
|
|
- `window.inventory` - Inventory system
|
|
- `window.gameState` - Game progress data
|
|
|
|
This pattern works well for a game of this size and simplifies debugging (accessible from console).
|
|
|
|
This documentation provides a comprehensive foundation for understanding and extending the BreakEscape codebase. For specific implementation questions, refer to the existing code examples in the repository. |