Claude-skill-registry demo-builder
Automatically generate playable game demos from concept documents. Parses game designs, creates Three.js prototypes with scoring, characters, textures, and music. Transforms ideas into interactive experiences.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/demo-builder" ~/.claude/skills/majiayu000-claude-skill-registry-demo-builder && rm -rf "$T"
skills/data/demo-builder/SKILL.mdDemo Builder Skill
Purpose
This skill automatically generates playable game prototypes from game concept documents. It:
- Parses concept documents to extract game mechanics, theme, genre
- Generates Three.js game code using the threejs-game skill
- Creates first playable level with scoring, objectives, characters
- Generates assets (textures, colors, basic models)
- Integrates music (Suno AI generation or 8-bit MIDI)
- Produces web-ready demo that runs in browser
Output: Fully functional game demo with HTML/JS/CSS that can be played immediately.
When to Use This Skill
Use this skill when you have:
- ✅ Game concept document (from brainstorming/design phases)
- ✅ Need to validate gameplay quickly with playable prototype
- ✅ Want to pitch game with interactive demo vs. static mockups
- ✅ Require rapid prototyping for playtesting
- ✅ Need proof-of-concept before full development investment
Prerequisites
Required Input
Game Concept Document (from brainstorming or design)
- Location:
or/docs/*-game-concepts-*.md/docs/plans/*-design.md - Must include: Title, description, genre, core mechanics, theme
- Example:
fps-game-concepts-market-driven-2025-10-26.md
Dependencies
- threejs-game skill (for 3D game implementation)
- Three.js library (loaded via CDN in generated HTML)
- Optional: Suno API key for music generation (can use MIDI fallback)
Core Workflow
Phase 1: Concept Parsing
1. Load Game Concept
GameConcept = { title: string, description: string, genre: string[], // ["FPS", "Extraction", "Co-op"] theme: string, // "cyberpunk", "military", "horror", etc. core_mechanics: string[], target_persona: string, price_point: number | "F2P" }
2. Extract Demo Requirements
DemoRequirements = { game_type: "FPS" | "third-person" | "top-down" | "side-scroller", camera_type: "first-person" | "third-person" | "fixed" | "isometric", movement_type: "WASD" | "mouse" | "touch" | "hybrid", primary_mechanic: "shooting" | "extraction" | "survival" | "puzzle", color_palette: extractColorPalette(theme), character_archetypes: extractCharacters(description), objectives: extractObjectives(description), music_style: extractMusicStyle(genre, theme) }
Phase 2: Demo Architecture Design
3. Generate Demo Specifications
Based on genre/mechanics, create demo spec:
FPS Demo Template:
{ level: { type: "arena" | "corridor" | "open-world-section", size: {x: 100, y: 50, z: 100}, geometry: "modular" // Can be expanded }, player: { type: "fps-controller", spawn: {x: 0, y: 2, z: 0}, health: 100, weapons: ["basic_rifle"], movement_speed: 5, look_sensitivity: 0.002 }, enemies: [ {type: "basic_enemy", count: 5, spawn_pattern: "random"}, {type: "patrol_enemy", count: 3, patrol_routes: [[...]]} ], objectives: [ {type: "eliminate_targets", target_count: 5, points: 100}, {type: "survive_time", duration: 60, points: 50}, {type: "collect_items", item_count: 3, points: 150} ], scoring: { enemy_kill: 20, item_collect: 50, time_bonus: 1 // per second survived }, ui: { hud: ["health", "ammo", "score", "timer"], crosshair: true, minimap: false } }
Extraction Shooter Demo Template:
{ level: { type: "extraction-zone", zones: ["hot_zone", "neutral", "extract_point"], size: {x: 80, y: 30, z: 80} }, player: { type: "tactical-controller", inventory_slots: 8, health: 100, stamina: 100 }, loot: [ {type: "resource", count: 10, value: 10}, {type: "rare_item", count: 3, value: 50} ], enemies: { type: "AI_guards", difficulty: "medium", count: 4 }, objectives: [ {type: "extract_with_loot", min_value: 100, points: 200}, {type: "extract_alive", points: 100} ], extraction_point: {x: 70, y: 1, z: 70}, time_limit: 180 // 3 minutes }
Phase 3: Asset Generation
4. Generate Color Palettes
function generateColorPalette(theme) { const palettes = { "cyberpunk": { primary: 0x00ffff, // Cyan secondary: 0xff00ff, // Magenta accent: 0xffff00, // Yellow environment: 0x1a1a2e, // Dark blue-gray enemy: 0xff0080 // Pink }, "military": { primary: 0x4a6741, // Olive green secondary: 0x8b7355, // Tan accent: 0xff6b35, // Orange environment: 0x5a6650, // Gray-green enemy: 0xb71c1c // Red }, "horror": { primary: 0x1b1b1b, // Almost black secondary: 0x8b0000, // Dark red accent: 0xffffff, // White environment: 0x2d2d2d, // Dark gray enemy: 0x4a0e0e // Blood red }, "space/sci-fi": { primary: 0x0a2e4a, // Deep blue secondary: 0x2a9d8f, // Teal accent: 0xe76f51, // Orange-red environment: 0x000814, // Space black enemy: 0xf72585 // Bright pink } }; return palettes[theme] || palettes["military"]; }
5. Generate Textures (Procedural)
function generateTexture(type, color, size = 512) { const canvas = document.createElement('canvas'); canvas.width = size; canvas.height = size; const ctx = canvas.getContext('2d'); if (type === "floor") { // Grid pattern ctx.fillStyle = `#${color.toString(16).padStart(6, '0')}`; ctx.fillRect(0, 0, size, size); ctx.strokeStyle = '#000000'; ctx.lineWidth = 2; for (let i = 0; i < size; i += size / 8) { ctx.beginPath(); ctx.moveTo(i, 0); ctx.lineTo(i, size); ctx.stroke(); ctx.beginPath(); ctx.moveTo(0, i); ctx.lineTo(size, i); ctx.stroke(); } } else if (type === "wall") { // Brick/panel pattern ctx.fillStyle = `#${color.toString(16).padStart(6, '0')}`; ctx.fillRect(0, 0, size, size); // Add panel lines const lighterColor = Math.min(color + 0x202020, 0xffffff); ctx.strokeStyle = `#${lighterColor.toString(16).padStart(6, '0')}`; ctx.lineWidth = 3; for (let i = 0; i < size; i += size / 4) { ctx.strokeRect(i, 0, size / 4, size); } } return new THREE.CanvasTexture(canvas); }
6. Generate Characters (Geometric)
function generateCharacter(type, color) { const group = new THREE.Group(); if (type === "player") { // Simple capsule body const body = new THREE.Mesh( new THREE.CapsuleGeometry(0.5, 1.5, 4, 8), new THREE.MeshPhongMaterial({ color: color }) ); body.position.y = 1; group.add(body); // Weapon (for FPS) const weapon = new THREE.Mesh( new THREE.BoxGeometry(0.1, 0.1, 0.8), new THREE.MeshPhongMaterial({ color: 0x333333 }) ); weapon.position.set(0.3, 0.8, -0.5); group.add(weapon); } else if (type === "enemy") { // Hostile NPC const body = new THREE.Mesh( new THREE.BoxGeometry(0.8, 1.6, 0.6), new THREE.MeshPhongMaterial({ color: color }) ); body.position.y = 0.8; group.add(body); // Enemy marker (head) const head = new THREE.Mesh( new THREE.SphereGeometry(0.3, 8, 8), new THREE.MeshPhongMaterial({ color: 0xff0000, emissive: 0x330000 }) ); head.position.y = 2; group.add(head); } return group; }
Phase 4: Music Generation
7. Generate Music (Suno AI or MIDI)
async function generateMusic(style, concept_name) { // Option 1: Suno API (if API key available) if (SUNO_API_KEY) { const prompt = generateMusicPrompt(style, concept_name); const musicUrl = await callSunoAPI(prompt); return musicUrl; } // Option 2: 8-bit MIDI fallback return generate8BitMIDI(style); } function generateMusicPrompt(style, concept_name) { const prompts = { "fps": `Epic action game music, intense electronic beats, military drums, adrenaline pumping, 140 BPM, game soundtrack, ${concept_name} theme`, "horror": `Dark atmospheric horror game music, eerie synths, unsettling ambience, tension building, 80 BPM, survival horror soundtrack`, "cyberpunk": `Synthwave cyberpunk game music, neon aesthetic, retro futuristic, energetic, 130 BPM, electronic game soundtrack`, "tactical": `Tactical stealth game music, suspenseful, orchestral strings, slow build tension, 90 BPM, espionage theme`, "roguelike": `Retro roguelike dungeon music, chiptune style, 8-bit adventure, upbeat tempo, 120 BPM, classic game feel` }; return prompts[style] || prompts["fps"]; } function generate8BitMIDI(style) { // Generate simple 8-bit style music pattern // Using Web Audio API for procedural chiptune const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); const patterns = { fps: { tempo: 140, notes: ["C4", "E4", "G4", "C5", "G4", "E4"], // Energetic pattern rhythm: [0.25, 0.25, 0.5, 0.25, 0.25, 0.5] }, ambient: { tempo: 80, notes: ["C3", "E3", "G3", "B3", "G3", "E3"], // Slower, eerie rhythm: [1, 1, 0.5, 0.5, 1, 1] } }; return createChiptuneLoop(audioCtx, patterns[style] || patterns.fps); }
Phase 5: Game Code Generation
8. Generate Complete Game Files
Using threejs-game skill, generate:
index.html:
<!DOCTYPE html> <html> <head> <title>[Game Title] - Demo</title> <style> body { margin: 0; overflow: hidden; font-family: Arial, sans-serif; } canvas { display: block; } #hud { position: absolute; top: 20px; left: 20px; color: white; font-size: 20px; text-shadow: 2px 2px 4px #000; pointer-events: none; z-index: 100; } #crosshair { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 20px; height: 20px; border: 2px solid white; border-radius: 50%; pointer-events: none; } #instructions { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background: rgba(0,0,0,0.8); color: white; padding: 40px; text-align: center; border-radius: 10px; } .hidden { display: none !important; } </style> </head> <body> <div id="hud"> <div>Health: <span id="health">100</span></div> <div>Score: <span id="score">0</span></div> <div>Enemies: <span id="enemies">0</span></div> <div>Time: <span id="timer">0</span></div> </div> <div id="crosshair"></div> <div id="instructions"> <h1>[Game Title]</h1> <p>[Objective description]</p> <p><strong>Controls:</strong></p> <p>WASD - Move | Mouse - Look | Left Click - Shoot</p> <p>ESC - Pause</p> <button onclick="startGame()" style="padding: 15px 30px; font-size: 18px; cursor: pointer;"> START DEMO </button> </div> <script type="importmap"> { "imports": { "three": "https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js", "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/" } } </script> <script type="module" src="game.js"></script> </body> </html>
game.js (using threejs-game patterns):
import * as THREE from 'three'; import { PointerLockControls } from 'three/addons/controls/PointerLockControls.js'; // Game state const gameState = { running: false, health: 100, score: 0, enemies: [], startTime: 0, objectives: [/* parsed from concept */] }; // Scene setup const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer = new THREE.WebGLRenderer({ antialias: true }); // FPS Controls const controls = new PointerLockControls(camera, renderer.domElement); // Input handling const input = { forward: false, backward: false, left: false, right: false, shoot: false }; // Initialize game function init() { // Renderer setup renderer.setSize(window.innerWidth, window.innerHeight); renderer.shadowMap.enabled = true; document.body.appendChild(renderer.domElement); // Lighting (themed) const ambient = new THREE.AmbientLight([color from theme], 0.4); scene.add(ambient); const directional = new THREE.DirectionalLight(0xffffff, 0.6); directional.position.set(10, 20, 10); directional.castShadow = true; scene.add(directional); // Build level buildLevel(scene, [demo spec]); // Spawn enemies spawnEnemies(scene, [demo spec enemies]); // Setup input listeners setupInputListeners(); } // Main game loop function animate(time) { requestAnimationFrame(animate); if (!gameState.running) return; const delta = clock.getDelta(); // Update player movement updatePlayer(delta); // Update enemies (AI patrol, chase) updateEnemies(delta); // Check collisions checkCollisions(); // Update HUD updateHUD(); // Check win/lose conditions checkObjectives(); renderer.render(scene, camera); } // [Additional game logic functions generated based on concept]
Phase 6: Demo Package Generation
9. Create Complete Demo Package
Generate folder structure:
demos/ [game-name]-demo/ index.html (Main entry point) game.js (Game logic using Three.js) assets/ music.mp3 (Generated music) README.md (Controls, objectives) package.json (For npm serve if needed)
10. Add Instructions README
# [Game Name] - Playable Demo Auto-generated demo from game concept document. ## How to Play 1. Open `index.html` in a modern web browser 2. Click "START DEMO" and allow pointer lock 3. Use WASD to move, mouse to look 4. [Game-specific controls] 5. Complete objectives to win! ## Objectives [Parsed from concept document] ## Controls - **W/A/S/D**: Movement - **Mouse**: Look around - **Left Click**: [Primary action - shoot/interact] - **ESC**: Pause/Menu ## About This is an auto-generated prototype demonstrating core mechanics of [Game Name]. **Concept**: [Description from doc] **Genre**: [Genre tags] **Target**: [Persona summary] Generated by demo-builder skill on [date]
Implementation Protocol
Step 1: Parse Concept Document
TodoWrite([ "Load game concept document from /docs", "Parse game title, description, genre, theme", "Extract core mechanics and objectives", "Identify camera type (FPS, third-person, etc.)", "Generate color palette from theme", "Extract character archetypes", "Determine music style", "Create demo specification document" ])
Step 2: Generate Demo Architecture
// Select appropriate demo template based on genre if (genre.includes("FPS")) { demoTemplate = FPS_DEMO_TEMPLATE; } else if (genre.includes("extraction")) { demoTemplate = EXTRACTION_DEMO_TEMPLATE; } else if (genre.includes("roguelike")) { demoTemplate = ROGUELIKE_DEMO_TEMPLATE; } // Customize template with concept-specific details demoSpec = customizeTemplate(demoTemplate, conceptData);
Step 3: Generate Assets (Parallel)
[Single Message - Parallel Asset Generation]: generateColorPalette(theme) generateTextures(palette) generateCharacterModels(archetypes, palette) generateMusicPrompt(genre, theme)
Step 4: Generate Code (Using threejs-game skill)
Leverage threejs-game skill to generate:
- Scene setup with themed lighting
- Player controller (FPS or third-person)
- Enemy AI (patrol, chase behaviors)
- Scoring system
- Collision detection
- Win/lose conditions
- HUD elements
Step 5: Package and Test
[Single Message - Package Creation]: Write("demos/[game-name]-demo/index.html", htmlContent) Write("demos/[game-name]-demo/game.js", gameJsContent) Write("demos/[game-name]-demo/assets/README.md", instructions) Bash("npx serve demos/[game-name]-demo -p 3000") // Test locally
Step 6: Generate Music (Async)
If Suno API available:
// Generate music in background while demo playable musicPrompt = generateMusicPrompt(genre, theme, concept_name); // Call Suno API (async, doesn't block demo generation) // Add music file to assets/ when ready
Otherwise:
// Use Web Audio API for procedural 8-bit music generate8BitChiptune(style, tempo); // Integrated directly in game.js
Output Structure
Minimal Demo (< 5 minutes to generate)
- 1 playable level (~100x100 units)
- Player character with basic movement
- 3-5 enemies with simple AI
- 1-2 objectives (kill targets, survive time, collect items)
- Basic scoring system
- Themed colors (no custom textures)
- Simple geometric shapes for characters/environment
- Procedural 8-bit music
Full Demo (< 15 minutes to generate)
Everything in Minimal +
- Procedural textures (floors, walls, objects)
- More varied enemies (5-10 with different behaviors)
- Multiple objectives (3-4 different types)
- Power-ups/collectibles
- Win/lose screens
- Suno-generated music (if API available)
- Particle effects (muzzle flash, explosions, impacts)
Best Practices
DO:
✅ Start with simplest playable version (iterate complexity) ✅ Use geometric primitives for speed (cubes, spheres, capsules) ✅ Generate procedural textures vs. loading image assets ✅ Implement core mechanic first (shooting, extraction, etc.) ✅ Test in browser immediately after generation ✅ Keep demo scope small (1 level, 5-10 minutes playtime) ✅ Add clear objectives and win conditions
DON'T:
❌ Try to implement every feature from concept doc ❌ Load heavy 3D models (use geometric shapes) ❌ Create open-world demos (scope to arena/corridor) ❌ Implement complex AI (use simple patrol/chase) ❌ Wait for music generation to complete (async or skip) ❌ Require build tools (pure HTML/JS/CDN)
Integration with Other Skills
Required:
- threejs-game: Core 3D game implementation
Optional:
- brainstorming: Provides concept docs as input
- market-analyst: Can prioritize which concepts to demo first
- monetization-analyzer: Demo top 3 monetizable concepts
Typical Workflow:
brainstorming → game concepts document ↓ market-analyst → identify top concepts ↓ monetization-analyzer → rank by revenue potential ↓ demo-builder → generate playable demos of top 3 ↓ playtesting → validate mechanics ↓ product-roadmap → plan full development
Example: FPS Demo from Concept
Input: Sentinel Protocol concept (tactical 5v5 extraction shooter)
Generated Demo:
- Level: 80x80 unit tactical facility with rooms and corridors
- Player: FPS controller with rifle model
- Enemies: 5 AI guards with patrol routes
- Objective: Extract data (reach marked zone) while avoiding/eliminating guards
- Scoring: +50 per guard eliminated, +200 for successful extraction, -25 per hit taken
- Theme: Near-future corporate (cyan/gray color palette)
- Music: Synthwave tactical espionage (Suno-generated)
- Win Condition: Reach extraction zone with data
- Time Limit: 3 minutes
Generation Time: ~8 minutes Playable: Yes, immediately in browser File Size: ~100KB (HTML/JS), ~3MB (music)
Summary
The Demo Builder Skill transforms game concept documents into playable prototypes by:
- ✅ Parsing concept docs to extract mechanics, theme, objectives
- ✅ Generating demo architecture using genre-specific templates
- ✅ Creating assets (procedural textures, colors, geometric models)
- ✅ Leveraging threejs-game skill for 3D implementation
- ✅ Integrating music (Suno AI or procedural 8-bit)
- ✅ Packaging web-ready demo (HTML/JS, no build required)
Output enables:
- Rapid validation of game concepts
- Interactive pitches for investors/publishers
- Playtesting core mechanics pre-production
- Demo reels for marketing
- Proof-of-concept for team alignment