require('dotenv').config(); const { pool } = require('../src/models/db'); const { generateGame } = require('../src/utils/claude'); const ADMIN_USER_ID = 2; // arcade_master const classicGames = [ { title: "Snake", prompt: `Create a classic Snake game where the player controls a snake that grows longer each time it eats food. GAMEPLAY MECHANICS: - The snake moves continuously in the current direction - Arrow keys (desktop) or swipe gestures (mobile) change direction - A food item (apple or dot) appears randomly on the screen - When the snake eats food, it grows by one segment and score increases by 10 - The game ends if the snake hits the wall or its own body - Snake should start with 3 segments moving to the right - Speed should gradually increase every 50 points VISUAL DESIGN: - Use a grid-based playing field with a subtle grid pattern - Snake head should be slightly different color than body (dark green head, lighter green body) - Food should be red and visually distinct (like an apple) - Display score prominently in the top-left corner - Show a "Game Over" screen with final score and "Play Again" button CONTROLS: - Desktop: Arrow keys for direction - Mobile: Swipe in any direction to change snake direction - Prevent 180-degree turns (can't go directly backward)` }, { title: "Tetris", prompt: `Create a Tetris-style falling block puzzle game. GAMEPLAY MECHANICS: - Seven different tetromino shapes (I, O, T, S, Z, J, L) fall from the top - Player can move pieces left/right and rotate them - Pieces fall automatically at a steady pace - When a horizontal line is completely filled, it clears and awards points - Clearing multiple lines at once awards bonus points (1 line=100, 2=300, 3=500, 4=800) - Game ends when pieces stack to the top - Show the next piece that will appear VISUAL DESIGN: - 10 columns wide, 20 rows tall playing field - Each tetromino type has a distinct bright color - Ghost piece shows where current piece will land - Clear lines with a satisfying flash animation - Display score, level, and lines cleared - Level increases every 10 lines, increasing fall speed CONTROLS: - Left/Right arrows or A/D: Move piece horizontally - Up arrow or W: Rotate piece clockwise - Down arrow or S: Soft drop (faster fall) - Space: Hard drop (instant drop) - Mobile: On-screen buttons for all actions` }, { title: "Pong", prompt: `Create a classic Pong game - the original video game tennis. GAMEPLAY MECHANICS: - Two paddles on opposite sides of the screen (left and right) - A ball bounces between them - Players score when the ball passes the opponent's paddle - Ball speed increases slightly after each paddle hit - Ball angle changes based on where it hits the paddle (edges = sharper angles) - First player to 11 points wins - Ball resets to center after each point, launching toward the player who was scored on VISUAL DESIGN: - Black background with white elements (classic arcade look) - Dotted line down the center of the screen - Paddles are simple white rectangles - Ball is a small white square - Large score display at top for both players - "Player 1 Wins!" or "Player 2 Wins!" message at game end CONTROLS: - Player 1 (left): W/S keys to move up/down - Player 2 (right): Up/Down arrow keys - Mobile: Touch left side to control left paddle, right side for right paddle - Alternatively, make Player 2 a simple AI opponent` }, { title: "Breakout", prompt: `Create a Breakout/Brick Breaker arcade game. GAMEPLAY MECHANICS: - Rows of colored bricks at the top of the screen - Player controls a paddle at the bottom - Ball bounces around, breaking bricks on contact - Different colored bricks may take multiple hits (green=1, yellow=2, orange=3, red=4) - Some bricks drop power-ups: wider paddle, multi-ball, slow ball - Player has 3 lives, loses one if ball falls below paddle - Level complete when all bricks are destroyed - Ball angle changes based on where it hits the paddle VISUAL DESIGN: - Colorful brick arrangement (rainbow pattern from top to bottom) - Bricks should visibly crack or change color when damaged - Particle effects when bricks break - Paddle has a metallic/shiny appearance - Display score at top, lives as small ball icons - Power-ups are falling capsules with distinct colors CONTROLS: - Mouse movement or Left/Right arrows move the paddle - Click or Space to launch the ball from paddle at game start - Mobile: Touch and drag to move paddle` }, { title: "Space Invaders", prompt: `Create the classic Space Invaders alien shooting game. GAMEPLAY MECHANICS: - Grid of alien invaders (5 rows of 11) march left and right, dropping down each time they hit an edge - Player ship at bottom can move left/right and shoot upward - Aliens occasionally drop bombs downward - Player has 3 lives, loses one if hit by bomb - Killing aliens awards points (bottom row=10, increasing by 10 per row up) - Mystery UFO occasionally flies across the top (bonus 50-300 points) - Aliens speed up as fewer remain - Game over if aliens reach the bottom VISUAL DESIGN: - Classic pixel-art style aliens (3 different designs for variety) - Aliens animate between 2 frames as they move - Green player ship with white bullets - Four destructible shields/bunkers that erode when hit - Black space background with stars - Score and high score at top, lives shown as ship icons CONTROLS: - Left/Right arrows or A/D to move ship - Space bar to shoot (limit: one bullet on screen at a time for authenticity, or allow 3) - Mobile: Touch left/right sides to move, tap center to shoot` }, { title: "Pac-Man", prompt: `Create a Pac-Man style maze chase game. GAMEPLAY MECHANICS: - Player controls Pac-Man through a maze eating dots - Four ghosts chase Pac-Man with different behaviors - Small dots = 10 points, large power pellets = 50 points - Power pellets make ghosts vulnerable (blue) for 8 seconds - eating them = 200, 400, 800, 1600 points - Player has 3 lives, loses one if touched by a non-vulnerable ghost - Level complete when all dots are eaten - Tunnels on sides wrap around to opposite side - Ghosts get faster with each level VISUAL DESIGN: - Classic maze layout with blue walls - Pac-Man is yellow circle with animated chomping mouth - Four colorful ghosts: red (Blinky), pink (Pinky), cyan (Inky), orange (Clyde) - Ghosts have cute eyes that look in their direction of travel - Dots are small, power pellets are large and flashing - Display score, high score, and lives CONTROLS: - Arrow keys for direction (Pac-Man turns at next intersection) - Mobile: Swipe in direction to turn - Pac-Man continues moving in current direction until wall` }, { title: "Flappy Bird", prompt: `Create a Flappy Bird-style endless flying game. GAMEPLAY MECHANICS: - Bird automatically falls due to gravity - Tapping/clicking makes the bird flap and rise - Pipes (or obstacles) scroll from right to left with gaps to fly through - Each pipe passed = 1 point - Game over if bird hits pipe or ground/ceiling - Pipe gap size stays constant, but spacing between pipes can vary - Bird rotates based on velocity (nose up when rising, nose down when falling) - High score is saved and displayed VISUAL DESIGN: - Cute, simple bird with flapping wing animation - Colorful green pipes coming from top and bottom - Scrolling background with clouds and simple scenery - Ground at bottom with scrolling texture - Large score display in center-top during play - Game over screen shows score vs best score with "Tap to Retry" CONTROLS: - Spacebar, click, or tap anywhere to flap - That's it - one-button gameplay! - Bird should feel floaty with satisfying physics` }, { title: "2048", prompt: `Create the 2048 sliding number puzzle game. GAMEPLAY MECHANICS: - 4x4 grid of tiles - Tiles contain powers of 2 (2, 4, 8, 16... up to 2048+) - Swiping/arrow key slides ALL tiles in that direction - When two tiles with same number collide, they merge into their sum - After each move, a new tile (2 or 4) appears in a random empty spot - Goal: Create a 2048 tile (though game continues after) - Game over when no more moves are possible - Score increases by the value of each merged tile VISUAL DESIGN: - Clean, modern design with rounded tile corners - Each number has a distinct background color (2=light, higher=darker/warmer) - Smooth sliding and merging animations - Tiles should pop/scale when they appear and merge - Display current score and best score - Large, clear numbers on tiles - "You Win!" celebration when reaching 2048, with option to continue CONTROLS: - Arrow keys to slide all tiles in a direction - Mobile: Swipe gestures in any direction - Consider adding "Undo" button for last move` }, { title: "Minesweeper", prompt: `Create the classic Minesweeper puzzle game. GAMEPLAY MECHANICS: - Grid of covered cells (start with 10x10 with 15 mines for beginner) - Left-click reveals a cell - Numbers show how many adjacent cells (including diagonals) contain mines - Empty cells auto-reveal adjacent empty cells (flood fill) - Right-click places a flag to mark suspected mines - First click is always safe (never a mine) - Win by revealing all non-mine cells - Lose by clicking a mine (reveal all mines, show X on wrong flags) - Timer starts on first click VISUAL DESIGN: - Clean grid with beveled 3D-style unrevealed cells - Revealed cells are flat with clear numbers - Numbers colored by value (1=blue, 2=green, 3=red, etc.) - Mines shown as black circles/bombs when revealed - Flags are red - Smiley face button to restart (changes expression: smile, surprised on click, dead on loss, cool on win) - Display mine count remaining and timer CONTROLS: - Left-click to reveal cell - Right-click to toggle flag - Mobile: Tap to reveal, long-press to flag - Include toggle button for flag mode on mobile` }, { title: "Asteroids", prompt: `Create the classic Asteroids space shooter game. GAMEPLAY MECHANICS: - Player ship in center of screen can rotate and thrust - Ship wraps around screen edges (appears on opposite side) - Shoot bullets to destroy asteroids - Large asteroids split into 2 medium, medium split into 2 small - Points: Large=20, Medium=50, Small=100 - Player has 3 lives, loses one if hit by asteroid - Ship has brief invincibility after respawning - UFOs occasionally appear and shoot at player (Small=1000pts, Large=200pts) - Hyperspace: random teleport as escape (risky - might teleport into asteroid) VISUAL DESIGN: - Vector graphics style (white lines on black background) - Ship is a simple triangle that rotates smoothly - Asteroids are irregular polygons that rotate as they drift - Bullets are small dots/lines - Thrust shows small particles behind ship - Ship explosion is satisfying particle burst - Display score and lives (ship icons) CONTROLS: - Left/Right arrows or A/D to rotate ship - Up arrow or W to thrust forward - Space to shoot - Shift or X for hyperspace - Mobile: On-screen joystick for rotation/thrust, fire button` }, { title: "Frogger", prompt: `Create a Frogger-style road and river crossing game. GAMEPLAY MECHANICS: - Frog starts at bottom, must reach one of 5 home bases at top - Bottom half: Cross road with cars/trucks moving at different speeds - Top half: Cross river by jumping on logs and turtles - Falling in water or getting hit by vehicle = lose a life - Turtles occasionally submerge (warning animation first) - Bonus items appear on logs (flies for points, female frog for bonus) - Time limit per frog (30 seconds) - bonus points for time remaining - Fill all 5 home bases to complete level - Each level, traffic and logs move faster VISUAL DESIGN: - Colorful top-down view - Cute pixel-art frog that faces direction of last move - Road section: gray with lane markings, colorful vehicles - River section: blue water, brown logs, green turtles - Safe zones: green grass/lily pads - Home bases at top with flowers when empty, frog when filled - Display score, time bar, and lives CONTROLS: - Arrow keys for hopping in four directions - Each press = one hop (grid-based movement) - Mobile: Swipe in direction to hop, or on-screen d-pad` }, { title: "Simon Says", prompt: `Create a Simon Says memory pattern game. GAMEPLAY MECHANICS: - Four colored buttons arranged in quadrants (red, blue, green, yellow) - Computer plays a sequence by lighting up buttons with sounds - Player must repeat the sequence by clicking buttons in same order - Sequence grows by one each successful round - Wrong button = game over, show final score (rounds completed) - Speed increases gradually as sequence gets longer - Each color has a distinct tone/sound - High score is saved and displayed VISUAL DESIGN: - Large circular or rounded square device - Four bright colored quadrants that light up when active (glow effect) - Center shows current round number - Buttons dim when inactive, bright when pressed/shown - "Simon Says" title at top - Satisfying button press animations (press down effect) - Game over screen with score and "Play Again" - Consider a "strict mode" toggle (one mistake = restart from beginning vs. one mistake = retry same sequence) CONTROLS: - Click/tap on colored buttons to repeat sequence - Each button should have hover effect on desktop - Consider keyboard shortcuts (1,2,3,4 or Q,W,A,S for the four colors) - "Start" button to begin new game` } ]; async function createGame(gameData, index) { console.log(`\n[${index + 1}/12] Generating: ${gameData.title}...`); try { const result = await generateGame(gameData.prompt); if (!result.success) { console.error(` Failed to generate ${gameData.title}: ${result.error}`); return null; } // Insert into database with prompt const dbResult = await pool.query( `INSERT INTO games (creator_id, title, description, game_code, prompt, status, published_at) VALUES ($1, $2, $3, $4, $5, 'published', NOW()) RETURNING id`, [ ADMIN_USER_ID, gameData.title, gameData.prompt.split('\n\n')[0], // Use first paragraph as description result.code, gameData.prompt ] ); console.log(` Created: ${gameData.title} (ID: ${dbResult.rows[0].id})`); return dbResult.rows[0].id; } catch (error) { console.error(` Error creating ${gameData.title}:`, error.message); return null; } } async function main() { console.log('Creating 12 classic games with detailed prompts...\n'); console.log('Using Claude Sonnet 4 for high-quality game generation.'); console.log('This will take several minutes...\n'); const createdGames = []; for (let i = 0; i < classicGames.length; i++) { const gameId = await createGame(classicGames[i], i); if (gameId) { createdGames.push({ title: classicGames[i].title, id: gameId }); } // Small delay between API calls if (i < classicGames.length - 1) { await new Promise(resolve => setTimeout(resolve, 2000)); } } console.log('\n========================================'); console.log('SUMMARY'); console.log('========================================'); console.log(`Successfully created: ${createdGames.length}/12 games\n`); createdGames.forEach(g => { console.log(` - ${g.title} (ID: ${g.id})`); }); await pool.end(); process.exit(0); } main().catch(err => { console.error('Fatal error:', err); process.exit(1); });