463 lines
15 KiB
JavaScript
463 lines
15 KiB
JavaScript
require('dotenv').config();
|
|
const { pool } = require('../src/models/db');
|
|
const { generateGame } = require('../src/utils/claude');
|
|
|
|
// Games that need fixing (Pong ID:16 and Minesweeper ID:22 work well)
|
|
const gamesToFix = [
|
|
{
|
|
id: 14,
|
|
title: "Snake",
|
|
prompt: `Create a classic Snake game. The snake starts in the center moving right.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Snake moves continuously in current direction
|
|
- Game starts immediately when page loads
|
|
- Use requestAnimationFrame for smooth animation
|
|
|
|
CONTROLS (implement ALL):
|
|
- Desktop: Arrow keys change direction (prevent 180° turns)
|
|
- Mobile: Touch/swipe detection - swipe in any direction to turn the snake
|
|
- Add visible on-screen arrow buttons for mobile (semi-transparent, positioned at bottom)
|
|
|
|
GAMEPLAY:
|
|
- Snake is green segments on a dark grid background
|
|
- Red apple appears randomly, eating it grows snake by 1 and adds 10 points
|
|
- Game over when hitting walls or self
|
|
- Show score in top-left corner
|
|
- Game over screen shows "Game Over! Score: X" with "Tap to Restart" button
|
|
- Speed increases slightly every 50 points
|
|
|
|
MOBILE ON-SCREEN CONTROLS:
|
|
Add a d-pad style control at the bottom of the screen:
|
|
- Four arrow buttons (up, down, left, right) arranged in a cross pattern
|
|
- Buttons should be 50px, semi-transparent white with dark arrows
|
|
- Position fixed at bottom center of game area
|
|
|
|
Keep game area square and centered. Use canvas for rendering.`
|
|
},
|
|
{
|
|
id: 15,
|
|
title: "Tetris",
|
|
prompt: `Create a Tetris falling block puzzle game.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Pieces fall automatically at steady pace
|
|
- Game starts immediately when page loads
|
|
- Use requestAnimationFrame for game loop
|
|
|
|
CONTROLS (implement ALL):
|
|
- Desktop: Left/Right arrows move piece, Up arrow rotates, Down arrow soft drop, Space hard drop
|
|
- Mobile: Add visible touch buttons at bottom of screen
|
|
|
|
MOBILE CONTROLS (REQUIRED):
|
|
Create a control panel at bottom with these buttons:
|
|
- Left arrow button (move left)
|
|
- Right arrow button (move right)
|
|
- Rotate button (clockwise rotation)
|
|
- Down button (soft drop)
|
|
- Drop button (hard drop)
|
|
Buttons: 45px size, semi-transparent, arranged in a row
|
|
|
|
GAMEPLAY:
|
|
- 10 columns, 20 rows playing field
|
|
- 7 tetromino shapes (I, O, T, S, Z, J, L) with different colors
|
|
- Completed lines clear with flash effect
|
|
- Score: 1 line=100, 2=300, 3=500, 4=800 points
|
|
- Show next piece preview on the side
|
|
- Game over when pieces reach top
|
|
- Speed increases every level (10 lines = 1 level)
|
|
|
|
Use canvas rendering. Game area should be centered with controls below.`
|
|
},
|
|
{
|
|
id: 17,
|
|
title: "Breakout",
|
|
prompt: `Create a Breakout/Brick Breaker arcade game.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Ball bounces continuously once launched
|
|
- Paddle follows mouse/touch position smoothly
|
|
- Game starts with ball on paddle, click/tap to launch
|
|
|
|
CONTROLS:
|
|
- Desktop: Mouse movement controls paddle position, click to launch ball
|
|
- Mobile: Touch and drag anywhere to move paddle, tap to launch ball
|
|
- Paddle should follow finger/mouse X position instantly
|
|
|
|
GAMEPLAY:
|
|
- 8 rows of colored bricks at top (rainbow colors)
|
|
- White paddle at bottom, ball is white circle
|
|
- Ball bounces off walls, paddle, and bricks
|
|
- Each brick hit = 10 points, brick disappears
|
|
- Ball angle changes based on where it hits paddle (edges = sharper angle)
|
|
- Lose a life if ball falls below paddle (3 lives total)
|
|
- Win when all bricks destroyed
|
|
- Show score and lives at top
|
|
|
|
VISUAL:
|
|
- Black background
|
|
- Colorful bricks in rows (red, orange, yellow, green, blue, purple)
|
|
- Paddle is white rectangle, rounded corners
|
|
- Ball leaves a short trail effect
|
|
- Bricks flash when hit before disappearing
|
|
|
|
Use canvas. No on-screen buttons needed - paddle follows touch/mouse directly.`
|
|
},
|
|
{
|
|
id: 18,
|
|
title: "Space Invaders",
|
|
prompt: `Create a Space Invaders shooting game.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Aliens move and player can shoot immediately
|
|
- Smooth 60fps animation with requestAnimationFrame
|
|
|
|
CONTROLS (implement ALL):
|
|
- Desktop: Left/Right arrows move ship, Space to shoot
|
|
- Mobile: Touch left half of screen to move left, right half to move right
|
|
- Mobile: Tap center area or double-tap anywhere to shoot
|
|
- Add visible Left/Right buttons at bottom corners and Fire button in center
|
|
|
|
MOBILE CONTROLS (REQUIRED):
|
|
- Left button: bottom-left corner, 60px, arrow pointing left
|
|
- Right button: bottom-right corner, 60px, arrow pointing right
|
|
- Fire button: bottom-center, 70px, red circle with "FIRE" text
|
|
All buttons semi-transparent
|
|
|
|
GAMEPLAY:
|
|
- 5 rows of 8 aliens that move side-to-side and drop down
|
|
- Player ship at bottom can move and shoot upward
|
|
- One bullet on screen at a time
|
|
- Aliens occasionally drop bombs
|
|
- 3 lives, hit by bomb = lose life
|
|
- Bottom row aliens = 10pts, increasing 10pts per row up
|
|
- Aliens speed up as fewer remain
|
|
- Wave complete when all aliens destroyed
|
|
|
|
VISUAL:
|
|
- Black space background with twinkling stars
|
|
- Green player ship (triangle)
|
|
- Aliens are simple pixel-art style (different shapes per row)
|
|
- White bullets, red alien bombs
|
|
|
|
Use canvas rendering.`
|
|
},
|
|
{
|
|
id: 19,
|
|
title: "Pac-Man",
|
|
prompt: `Create a simplified Pac-Man maze game.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Pac-Man moves continuously in set direction
|
|
- Simple maze (not full Pac-Man complexity)
|
|
- Smooth animation at 60fps
|
|
|
|
CONTROLS (implement ALL):
|
|
- Desktop: Arrow keys set movement direction
|
|
- Mobile: Swipe in direction to change Pac-Man's direction
|
|
- Add on-screen d-pad for mobile (arrow buttons in cross pattern)
|
|
|
|
MOBILE CONTROLS (REQUIRED):
|
|
D-pad at bottom center:
|
|
- Up, Down, Left, Right buttons arranged in cross
|
|
- Each button 50px, semi-transparent
|
|
- Pac-Man turns at next opportunity when button pressed
|
|
|
|
GAMEPLAY:
|
|
- Simple maze with blue walls (use a basic grid maze, 15x15)
|
|
- Yellow dots throughout maze (10 points each)
|
|
- 4 large power pellets in corners (50 points, makes ghosts vulnerable)
|
|
- 4 colored ghosts that chase Pac-Man
|
|
- When powered up (8 seconds), ghosts turn blue and can be eaten (200 pts)
|
|
- Lose life if touched by non-blue ghost (3 lives)
|
|
- Level complete when all dots eaten
|
|
|
|
VISUAL:
|
|
- Black background, blue maze walls
|
|
- Yellow Pac-Man with chomping animation
|
|
- Ghosts: Red, Pink, Cyan, Orange with googly eyes
|
|
- Dots are small white circles, power pellets are large and flashing
|
|
|
|
Use canvas. Keep maze simple for playability.`
|
|
},
|
|
{
|
|
id: 20,
|
|
title: "Flappy Bird",
|
|
prompt: `Create a Flappy Bird style game.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Bird flaps on ANY input (tap, click, spacebar, any key)
|
|
- Gravity pulls bird down constantly
|
|
- Game starts with "Tap to Start" message
|
|
|
|
CONTROLS (SIMPLE):
|
|
- ANY tap, click, touch, or key press = bird flaps upward
|
|
- That's the only control needed
|
|
- Make sure touchstart event is captured on the entire game canvas
|
|
|
|
GAMEPLAY:
|
|
- Bird on left side of screen, pipes scroll from right
|
|
- Pipes have gap in middle to fly through
|
|
- Each pipe passed = 1 point
|
|
- Game over if bird hits pipe, ground, or ceiling
|
|
- Bird rotates based on velocity (nose up when rising, down when falling)
|
|
- After game over, show score and "Tap to Restart"
|
|
|
|
PHYSICS:
|
|
- Gravity: bird falls at accelerating rate
|
|
- Flap: gives instant upward velocity
|
|
- Bird should feel "floaty" but responsive
|
|
- Pipe gap should be generous (bird height * 4)
|
|
|
|
VISUAL:
|
|
- Light blue sky background with simple clouds
|
|
- Green pipes from top and bottom
|
|
- Yellow/orange bird with wing flap animation
|
|
- Ground at bottom with scrolling grass texture
|
|
- Large score number at top center
|
|
|
|
Use canvas. Entire canvas should respond to touch events.`
|
|
},
|
|
{
|
|
id: 21,
|
|
title: "2048",
|
|
prompt: `Create the 2048 sliding puzzle game.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Tiles slide and merge correctly
|
|
- Touch swipe detection must work reliably
|
|
- Game should feel smooth and responsive
|
|
|
|
CONTROLS:
|
|
- Desktop: Arrow keys slide all tiles in that direction
|
|
- Mobile: Swipe gestures (detect swipe direction on touchend)
|
|
- Swipe detection: track touchstart and touchend positions, determine direction
|
|
|
|
SWIPE IMPLEMENTATION:
|
|
- On touchstart: record start X,Y
|
|
- On touchend: calculate delta X,Y
|
|
- If |deltaX| > |deltaY| and |deltaX| > 30px: horizontal swipe
|
|
- If |deltaY| > |deltaX| and |deltaY| > 30px: vertical swipe
|
|
- Determine direction based on positive/negative delta
|
|
|
|
GAMEPLAY:
|
|
- 4x4 grid of tiles
|
|
- Start with two "2" tiles in random positions
|
|
- Sliding merges matching adjacent tiles (2+2=4, 4+4=8, etc)
|
|
- After each move, new tile (90% chance of 2, 10% chance of 4) appears
|
|
- Score increases by merged tile value
|
|
- Game over when no moves possible
|
|
- Win message at 2048 but allow continuing
|
|
|
|
VISUAL:
|
|
- Clean, modern design with rounded tiles
|
|
- Each number has distinct background color:
|
|
- 2: #eee4da, 4: #ede0c8, 8: #f2b179, 16: #f59563
|
|
- 32: #f67c5f, 64: #f65e3b, 128+: #edcf72 to #edc22e
|
|
- Tiles animate when sliding and merging (CSS transitions)
|
|
- Large, bold numbers on tiles
|
|
- Score display at top
|
|
|
|
Use div-based grid with CSS transitions for smooth animations.`
|
|
},
|
|
{
|
|
id: 23,
|
|
title: "Asteroids",
|
|
prompt: `Create a classic Asteroids space shooter.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Ship rotates and thrusts with momentum-based physics
|
|
- Screen wrapping (go off one edge, appear on opposite)
|
|
- Smooth 60fps gameplay
|
|
|
|
CONTROLS (implement ALL):
|
|
- Desktop: Left/Right rotate ship, Up thrusts forward, Space shoots
|
|
- Mobile: On-screen virtual joystick or buttons
|
|
|
|
MOBILE CONTROLS (REQUIRED):
|
|
Left side: Rotation buttons (two buttons: rotate left, rotate right)
|
|
Right side: Action buttons (Thrust button, Fire button)
|
|
All buttons 50-60px, semi-transparent, positioned at bottom
|
|
|
|
GAMEPLAY:
|
|
- Ship starts in center, 3 lives
|
|
- Large asteroids split into 2 medium, medium into 2 small
|
|
- Points: Large=20, Medium=50, Small=100
|
|
- Ship has inertia - keeps drifting after thrust stops
|
|
- Bullets travel straight and wrap around screen
|
|
- Collision with asteroid = lose life, brief invincibility after respawn
|
|
- Clear all asteroids = next wave with more asteroids
|
|
|
|
PHYSICS:
|
|
- Ship rotation is instant
|
|
- Thrust adds velocity in facing direction
|
|
- Small friction to eventually slow down
|
|
- Asteroids drift at random angles and speeds
|
|
|
|
VISUAL:
|
|
- Black background with small white stars
|
|
- Ship is white triangle outline (vector style)
|
|
- Asteroids are irregular polygon outlines
|
|
- Bullets are small white dots
|
|
- Explosion particles when things are destroyed
|
|
|
|
Use canvas with vector-style graphics (lines, not filled shapes).`
|
|
},
|
|
{
|
|
id: 24,
|
|
title: "Frogger",
|
|
prompt: `Create a Frogger road-crossing game.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Grid-based hop movement (one square per input)
|
|
- Cars and logs move continuously
|
|
- Simple but playable level design
|
|
|
|
CONTROLS:
|
|
- Desktop: Arrow keys to hop in that direction
|
|
- Mobile: On-screen d-pad buttons OR swipe to hop
|
|
|
|
MOBILE CONTROLS (REQUIRED):
|
|
D-pad at bottom:
|
|
- Up/Down/Left/Right buttons in cross pattern
|
|
- Each button 55px, semi-transparent
|
|
- Each tap = one hop in that direction
|
|
|
|
GAMEPLAY:
|
|
- Frog starts at bottom, goal is to reach top
|
|
- Bottom half: Road with cars/trucks moving left and right
|
|
- Top half: River with logs and turtles moving left and right
|
|
- Hit by car = lose life
|
|
- Fall in water (miss a log) = lose life
|
|
- Ride logs/turtles to cross river
|
|
- 5 home spots at top to fill
|
|
- Fill all 5 = level complete
|
|
- 3 lives, timer countdown (30 seconds per frog)
|
|
|
|
LEVEL DESIGN:
|
|
- Row 1 (bottom): Safe starting grass
|
|
- Rows 2-4: Roads with vehicles (alternate directions)
|
|
- Row 5: Safe middle grass
|
|
- Rows 6-8: River with logs/turtles
|
|
- Row 9 (top): Home bases with lily pads
|
|
|
|
VISUAL:
|
|
- Green frog (top-down view)
|
|
- Gray roads with lane markings
|
|
- Blue water
|
|
- Brown logs, green turtles
|
|
- Colorful cars/trucks
|
|
- Green grass safe zones
|
|
|
|
Use canvas, grid-based movement.`
|
|
},
|
|
{
|
|
id: 25,
|
|
title: "Simon Says",
|
|
prompt: `Create a Simon Says memory pattern game.
|
|
|
|
CRITICAL REQUIREMENTS:
|
|
- Game MUST work on both desktop and mobile
|
|
- Buttons must be large and easy to tap on mobile
|
|
- Clear visual and audio-like feedback when buttons activate
|
|
- Pattern plays automatically, then waits for player input
|
|
|
|
CONTROLS:
|
|
- Desktop: Click the colored buttons OR use keys 1,2,3,4
|
|
- Mobile: Tap the colored buttons (make them big!)
|
|
|
|
GAMEPLAY:
|
|
- Four large colored buttons (Red, Blue, Green, Yellow)
|
|
- Arranged in 2x2 grid or quadrants of a circle
|
|
- Computer shows pattern by lighting up buttons in sequence
|
|
- Player must repeat the pattern by pressing buttons
|
|
- Each round adds one more to the sequence
|
|
- Wrong button = game over, show final score (rounds completed)
|
|
- Display current round number
|
|
|
|
BUTTON BEHAVIOR:
|
|
- When showing pattern: button lights up brightly for 0.5s, 0.3s gap between
|
|
- When player presses: button lights up while pressed
|
|
- Each button should have distinct appearance when lit vs unlit
|
|
- Consider adding different tones/sounds for each button (optional)
|
|
|
|
VISUAL:
|
|
- Large, touchable buttons (at least 120px each on mobile)
|
|
- Distinct colors: Red (#ff4444), Blue (#4444ff), Green (#44ff44), Yellow (#ffff44)
|
|
- Buttons dim when inactive, bright when active
|
|
- Center area shows round number and "Watch..." or "Your turn!" message
|
|
- Dark background to make colors pop
|
|
- "Start Game" button initially, "Play Again" after game over
|
|
|
|
LAYOUT:
|
|
- Buttons should fill most of the screen
|
|
- 2x2 grid with small gaps
|
|
- Score/round display above or below buttons
|
|
- Make sure buttons are finger-friendly size
|
|
|
|
Use div-based buttons with CSS for the glow effects. No canvas needed.`
|
|
}
|
|
];
|
|
|
|
async function fixGame(gameData) {
|
|
console.log(`\nRegenerating: ${gameData.title} (ID: ${gameData.id})...`);
|
|
|
|
try {
|
|
const result = await generateGame(gameData.prompt);
|
|
|
|
if (!result.success) {
|
|
console.error(` Failed: ${result.error}`);
|
|
return false;
|
|
}
|
|
|
|
// Update the game in database
|
|
await pool.query(
|
|
`UPDATE games SET game_code = $1, prompt = $2 WHERE id = $3`,
|
|
[result.code, gameData.prompt, gameData.id]
|
|
);
|
|
|
|
console.log(` Success: ${gameData.title} updated`);
|
|
return true;
|
|
} catch (error) {
|
|
console.error(` Error: ${error.message}`);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async function main() {
|
|
console.log('Fixing games with improved controls...');
|
|
console.log(`Games to fix: ${gamesToFix.length}`);
|
|
console.log('Using Claude Sonnet 4 for generation.\n');
|
|
|
|
let successCount = 0;
|
|
|
|
for (const game of gamesToFix) {
|
|
const success = await fixGame(game);
|
|
if (success) successCount++;
|
|
|
|
// Delay between API calls
|
|
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
}
|
|
|
|
console.log('\n========================================');
|
|
console.log(`COMPLETE: ${successCount}/${gamesToFix.length} games fixed`);
|
|
console.log('========================================');
|
|
|
|
await pool.end();
|
|
process.exit(0);
|
|
}
|
|
|
|
main().catch(err => {
|
|
console.error('Fatal error:', err);
|
|
process.exit(1);
|
|
});
|