|
| 1 | +# AI CONTEXT - RoboBlaster Game |
| 2 | +# Para uso exclusivo del asistente de IA |
| 3 | + |
| 4 | +## PROYECTO: Juego de plataformas Phaser 3 (MegaMan-style) |
| 5 | +**Tipo**: Videojuego educativo/capstone assessment |
| 6 | +**Estado**: Completado, funcional |
| 7 | +**Live URL**: https://robo-blaster-game.netlify.app/ |
| 8 | + |
| 9 | +## ESTRUCTURA CLAVE (quick reference) |
| 10 | + |
| 11 | +### PUNTO DE ENTRADA |
| 12 | +- `src/index.js` → Clase Game extiende Phaser.Game |
| 13 | +- `window.game = new Game()` → Instancia global |
| 14 | +- `this.globals = { model, bgMusic: null }` → Estado global |
| 15 | + |
| 16 | +### CONFIGURACIÓN PHASER |
| 17 | +- `src/Config/config.js` → type: Phaser.AUTO, 1000x630, physics: arcade |
| 18 | +- NO gravity por defecto (y: 0), debug: false |
| 19 | + |
| 20 | +### JERARQUÍA DE CLASES |
| 21 | +``` |
| 22 | +Entity (base class) |
| 23 | +├── Player (hp: 1000, damage: 10) |
| 24 | +├── ChaserDude (enemy) |
| 25 | +└── JumperDude (enemy) |
| 26 | +
|
| 27 | +Game extends Phaser.Game |
| 28 | +└── 8 Scenes (Boot, Preloader, Menu, Game, GameOver, etc.) |
| 29 | +
|
| 30 | +Componentes: |
| 31 | +- Laser/LaserGroup (disparos) |
| 32 | +- Slash/SlashGroup (ataques melee) |
| 33 | +- Sound (audio management) |
| 34 | +- Button (UI) |
| 35 | +``` |
| 36 | + |
| 37 | +### ESCENAS (8 total) |
| 38 | +1. BootScene → PreloaderScene → MenuScene |
| 39 | +2. MenuScene → GameScene (main gameplay) |
| 40 | +3. GameScene → GameOverScene (on death) |
| 41 | +4. Side scenes: LeaderBoardScene, CreditsScene, OptionsScene |
| 42 | + |
| 43 | +### ARCHIVOS CRÍTICOS PARA MODIFICAR |
| 44 | +- `src/Js/Player.js` → Lógica del jugador, sistema de corazones, doble salto |
| 45 | +- `src/Scenes/GameScene.js` → Gameplay principal, tile world, rampas, UI corazones |
| 46 | +- `src/Js/Entity.js` → Clase base para todas las entidades |
| 47 | +- `src/Config/config.js` → Configuración Phaser |
| 48 | +- `src/Scenes/PreloaderScene.js` → Carga de assets de tiles, corazones, splat.png |
| 49 | +- `src/Js/Laser.js` → Proyectiles con splat.png |
| 50 | + |
| 51 | +## PATRONES DE CÓDIGO DETECTADOS |
| 52 | + |
| 53 | +### IMPORT/EXPORT |
| 54 | +```javascript |
| 55 | +// Todos usan ES6 modules |
| 56 | +import Phaser from 'phaser'; |
| 57 | +import Entity from './Entity'; |
| 58 | +export default class Player extends Entity |
| 59 | +``` |
| 60 | + |
| 61 | +### CONSTRUCTORES TÍPICOS |
| 62 | +```javascript |
| 63 | +constructor(config) { |
| 64 | + super({ ...config, texture: 'stand' }); |
| 65 | + this.body.setSize(160, 200); |
| 66 | + this.setScale(0.5); |
| 67 | + // Player-specific |
| 68 | + this.hp = 1000; |
| 69 | + this.damage = 10; |
| 70 | + // Sistema de corazones |
| 71 | + this.maxHearts = 3; |
| 72 | + this.hearts = 3; |
| 73 | + this.isInvulnerable = false; |
| 74 | + // Sistema de doble salto |
| 75 | + this.jumpsAvailable = 2; |
| 76 | + this.jumpForce = -470; |
| 77 | + this.doubleJumpForce = -350; |
| 78 | +} |
| 79 | +``` |
| 80 | + |
| 81 | +### MÉTODOS COMUNES EN ENTITIES |
| 82 | +- `damageOrKill(damage)` → Aplica daño, retorna true si muere |
| 83 | +- `die()` → Maneja muerte |
| 84 | +- `update()` → Lógica por frame (override de Phaser) |
| 85 | +- `activateInvulnerability(duration)` → Activa invulnerabilidad con parpadeo |
| 86 | +- `updateJumpState(onGround)` → Actualiza estado de saltos |
| 87 | +- `tryJump()` → Intenta realizar salto (doble salto) |
| 88 | +- `addHeart()` → Añade corazón al jugador |
| 89 | + |
| 90 | +### CONVENCIONES DE NOMBRES |
| 91 | +- Clases: PascalCase (Player, GameScene, ChaserDude) |
| 92 | +- Métodos: camelCase (damageOrKill, update) |
| 93 | +- Variables: camelCase (bgMusic, touchDamage) |
| 94 | +- Archivos: PascalCase para clases, camelCase para utilidades |
| 95 | + |
| 96 | +## SISTEMA DE ARCHIVOS RELEVANTE |
| 97 | + |
| 98 | +### src/Js/ (core game logic) |
| 99 | +``` |
| 100 | +Entity.js # Base class for all game entities |
| 101 | +Player.js # Main player (extends Entity) |
| 102 | +ChaserDude.js # Chasing enemy |
| 103 | +JumperDude.js # Jumping enemy |
| 104 | +Laser.js # Projectile class |
| 105 | +LaserGroup.js # Projectile group management |
| 106 | +Slash.js # Melee attack |
| 107 | +SlashGroup.js # Melee attack group |
| 108 | +Sound.js # Audio management |
| 109 | +Button.js # UI buttons |
| 110 | +``` |
| 111 | + |
| 112 | +### src/Scenes/ (game states) |
| 113 | +``` |
| 114 | +BootScene.js # Initialization |
| 115 | +PreloaderScene.js # Asset loading |
| 116 | +MenuScene.js # Main menu |
| 117 | +GameScene.js # Main gameplay |
| 118 | +GameOverScene.js # Game over screen |
| 119 | +LeaderBoardScene.js# Score leaderboard |
| 120 | +CreditsScene.js # Credits |
| 121 | +OptionsScene.js # Game options |
| 122 | +``` |
| 123 | + |
| 124 | +### UTILITIES |
| 125 | +``` |
| 126 | +src/Js/api.js # API calls (leaderboard) |
| 127 | +src/Js/dom.js # DOM manipulation |
| 128 | +src/Js/localStorage.js # Local storage wrapper |
| 129 | +``` |
| 130 | + |
| 131 | +## DEPENDENCIAS Y BUILD |
| 132 | + |
| 133 | +### package.json highlights |
| 134 | +```json |
| 135 | +"scripts": { |
| 136 | + "test": "jest", |
| 137 | + "build": "webpack --config webpack/prod.js", |
| 138 | + "start": "webpack-dev-server --config webpack/base.js --open" |
| 139 | +}, |
| 140 | +"dependencies": { |
| 141 | + "phaser": "^3.24.1" |
| 142 | +} |
| 143 | +``` |
| 144 | + |
| 145 | +### Webpack configs |
| 146 | +- `webpack/base.js` → Desarrollo |
| 147 | +- `webpack/prod.js` → Producción |
| 148 | + |
| 149 | +### Testing setup |
| 150 | +- Jest con `jest-canvas-mock` |
| 151 | +- Mocks para assets (.gif, .png, etc.) |
| 152 | +- `test/mocks/fileMock.js` |
| 153 | + |
| 154 | +## VARIABLES DE ESTADO GLOBAL |
| 155 | +```javascript |
| 156 | +// En src/index.js |
| 157 | +this.globals = { |
| 158 | + model: new Sound(), // Audio state |
| 159 | + bgMusic: null // Current background music |
| 160 | +}; |
| 161 | + |
| 162 | +// En Player.js (SISTEMA DE CORAZONES) |
| 163 | +this.maxHearts = 3; // Máximo de corazones (3 corazones completos = 6 medios) |
| 164 | +this.hearts = 3; // Corazones actuales |
| 165 | +this.isInvulnerable = false; // Estado de invulnerabilidad |
| 166 | +this.invulnerabilityTimer = null; // Temporizador de invulnerabilidad |
| 167 | +this.alive = true; // Estado de vida |
| 168 | +this.damage = 10; // Base damage |
| 169 | + |
| 170 | +// Sistema de doble salto |
| 171 | +this.jumpsAvailable = 2; // Saltos disponibles (doble salto) |
| 172 | +this.jumpForce = -470; // Fuerza del primer salto |
| 173 | +this.doubleJumpForce = -350; // Fuerza del segundo salto (75% del primero) |
| 174 | +this.wasOnGround = true; // Para detectar cuando toca el suelo |
| 175 | +``` |
| 176 | + |
| 177 | +## PHYSICS CONFIGURATION |
| 178 | +- Arcade physics (no gravity default) |
| 179 | +- Player: `setGravityY(520)` → Custom gravity |
| 180 | +- `setCollideWorldBounds(true)` → No salir de pantalla |
| 181 | +- Body size: 160x200 (Player), scaled 0.5 |
| 182 | + |
| 183 | +## EVENTOS Y COLISIONES |
| 184 | +- Phaser built-in collision system |
| 185 | +- Groups para manejo de múltiples entidades |
| 186 | +- Scene events para transiciones |
| 187 | + |
| 188 | +## ASSETS Y MEDIA |
| 189 | +- Directorio `images/` para sprites y UI |
| 190 | +- Sonidos manejados por clase `Sound` |
| 191 | +- PreloaderScene carga todos los assets |
| 192 | +- **Tile assets**: `/home/pablo/Documentos/spreets/kenney_new-platformer-pack-1.1/Sprites/Tiles/Double/` |
| 193 | +- **Ramp tiles**: `terrain_stone_ramp_long_a`, `terrain_stone_ramp_long_b`, `terrain_stone_ramp_long_c` |
| 194 | +- **Heart system**: `hud_heart`, `hud_heart_half`, `hud_heart_empty`, `heart` (collectible) |
| 195 | +- **Projectile**: `splat.png` usado como `redlight` y `splat` |
| 196 | + |
| 197 | +## COMMON TASKS & LOCATIONS |
| 198 | + |
| 199 | +### Añadir nuevo enemigo |
| 200 | +1. Crear clase en `src/Js/` que extienda `Entity` |
| 201 | +2. Añadir a `GameScene.js` en `create()` method |
| 202 | +3. Configurar física y comportamiento en `update()` |
| 203 | + |
| 204 | +### Modificar jugador |
| 205 | +- `src/Js/Player.js` → Stats, movimiento, habilidades |
| 206 | +- `src/Scenes/GameScene.js` → Input handling, game logic |
| 207 | + |
| 208 | +### Añadir nueva escena |
| 209 | +1. Crear archivo en `src/Scenes/` |
| 210 | +2. Importar en `src/index.js` |
| 211 | +3. Añadir a `this.scene.add()` |
| 212 | +4. Configurar transiciones desde otras escenas |
| 213 | + |
| 214 | +### Modificar UI |
| 215 | +- `src/Js/Button.js` → Botones reutilizables |
| 216 | +- Cada Scene tiene sus propios elementos UI |
| 217 | +- DOM manipulation en `src/Js/dom.js` |
| 218 | + |
| 219 | +## GOTCHAS Y NOTAS TÉCNICAS |
| 220 | + |
| 221 | +1. **NO gravity por defecto** → Player tiene gravity personalizada (520) |
| 222 | +2. **Entity es clase abstracta** → Todas las entidades la extienden |
| 223 | +3. **window.game es global** → Acceder desde cualquier lugar |
| 224 | +4. **Scene management** → Phaser maneja transiciones automáticas |
| 225 | +5. **Audio via Sound class** → No usar Phaser audio directamente |
| 226 | +6. **Testing requiere mocks** → Canvas y assets mockeados |
| 227 | +7. **Arcade physics solo rectángulos/círculos** → Rampas implementadas con múltiples cuerpos pequeños |
| 228 | +8. **Sistema de corazones** → 3 corazones = 6 medios, invulnerabilidad 3 segundos tras daño |
| 229 | +9. **Doble salto** → 2 saltos disponibles, segundo salto 75% fuerza del primero |
| 230 | +10. **Shooting while running** → Separado de lógica de movimiento en GameScene.js |
| 231 | + |
| 232 | +## QUICK COMMANDS |
| 233 | +```bash |
| 234 | +# Ver estado actual |
| 235 | +git status |
| 236 | +npm run test |
| 237 | + |
| 238 | +# Desarrollo |
| 239 | +npm start # http://localhost:8080 |
| 240 | + |
| 241 | +# Build |
| 242 | +npm run build # Output en dist/ |
| 243 | + |
| 244 | +# Ver estructura |
| 245 | +find src -name "*.js" | grep -v node_modules |
| 246 | +``` |
| 247 | + |
| 248 | +## CONTACT POINTS FOR MODIFICATIONS |
| 249 | +- **Game balance**: `Player.js` (hp, damage), enemy classes |
| 250 | +- **Graphics**: `images/` directory, Scene preload methods |
| 251 | +- **Audio**: `Sound.js`, Scene create methods |
| 252 | +- **UI**: `Button.js`, Scene create methods |
| 253 | +- **Game flow**: Scene transition methods |
| 254 | +- **Physics**: `config.js`, Entity constructors |
| 255 | +- **Tile system**: `GameScene.js` createTileWorld(), PreloaderScene.js |
| 256 | +- **Ramp physics**: `GameScene.js` createRealRamp() |
| 257 | +- **Heart system**: `Player.js` damageOrKill(), `GameScene.js` createHeartsUI() |
| 258 | +- **Double jump**: `Player.js` tryJump(), `GameScene.js` update() jump logic |
| 259 | +- **Shooting**: `Laser.js`, `LaserGroup.js`, `GameScene.js` shooting logic |
0 commit comments