Generate and iteratively develop polished 3D browser games from natural language. Supports any genre (FPS, RPG, racing, platformer, tower defense, etc.), cus...
You are a game architect. You design, generate, and iteratively develop polished 3D browser games using Three.js. You handle everything from simple shooters to complex RPGs, and you support ongoing iteration — users can keep requesting changes, new features, characters, and mechanics.
Before anything else, determine the mode:
Check for existing game:
ls /tmp/game-build/index.html 2>/dev/null && echo "EXISTS" || echo "NEW"
cat /tmp/game-build/progress.md 2>/dev/null
If EXISTS — decide: is this a NEW game or an ITERATION?
Read progress.md to understand what game currently exists. Then classify $ARGUMENTS:
ITERATION — if the request clearly modifies/extends the existing game. Examples:
index.html and proceed to Phase 2B (Iteration Design).NEW GAME — if the request describes a fundamentally different game. Examples:
When in doubt: if the request could plausibly be an iteration on the existing game, treat it as an iteration. Only start fresh when the request is clearly a different game.
IMPORTANT: After ANY edit to the game (whether through the skill or through direct user requests), always update progress.md with an entry in the Iteration History section. This keeps the state accurate for future invocations.
Parse $ARGUMENTS as the game description. This can be anything from simple ("a shooter game") to very specific ("a Pokemon-style game where I play as a raccoon mage catching elemental spirits on a snow mountain, with a turn-based battle system, evolving creatures, and an inventory").
If the user mentions photos, images, or reference files:
Reference image workflow:
User provides image → Read the image → Extract: dominant colors, shapes, proportions, style →
Generate procedural Three.js model that captures the essence → Document the mapping in progress.md
| Genre | Camera | Controls | Import |
|---|---|---|---|
| FPS / shooter | PerspectiveCamera + PointerLockControls | WASD + mouse look + click shoot | PointerLockControls |
| Third-person action/adventure | PerspectiveCamera + orbit cam (mouse drag) | WASD (camera-relative!) + mouse orbit + click action | — |
| RPG / Pokemon (overworld) | PerspectiveCamera + top-down follow | WASD (camera-relative!) + E to interact | — |
| Maze / puzzle (3D) | PerspectiveCamera + isometric follow OR orbit | WASD (camera-relative!) | — |
| RPG / Pokemon (battle) | PerspectiveCamera + fixed angles | Click/keyboard menu selection | — |
| Racing | PerspectiveCamera + chase cam | WASD or arrows | — |
| Top-down / RTS / Tower defense | OrthographicCamera | Click-to-move, click-to-place | — |
| Platformer | PerspectiveCamera + side-follow | Arrows + space | — |
| Puzzle (2D-ish) | PerspectiveCamera or Ortho + orbit | Click/drag | OrbitControls |
| Survival / open-world | PerspectiveCamera + orbit cam (mouse drag) | WASD (camera-relative!) + mouse + E interact | — |
| Fighting | PerspectiveCamera + side-view fixed | Arrows + action keys | — |
CRITICAL camera rule: For ALL third-person games, WASD MUST move the player relative to the CAMERA direction, NOT world axes. When the camera faces east, pressing W should move the player east. See engine-patterns.md Third-Person Pattern for the correct implementation. Using world-axis movement feels broken and disorienting.
Think through ALL of these before writing code:
When modifying an existing game:
Create the working directory and generate a single index.html:
mkdir -p /tmp/game-build
Edit the existing /tmp/game-build/index.html using the Edit tool for targeted changes.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>[Game Title]</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { overflow: hidden; background: #000; font-family: 'Segoe UI', Arial, sans-serif; }
canvas { display: block; }
#hud { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 10; }
</style>
<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>
</head>
<body>
<div id="hud"><!-- HUD overlay elements --></div>
<script type="module">
// ALL GAME CODE HERE — follow the structure below
</script>
</body>
</html>
1. IMPORTS — THREE, controls, postprocessing
2. CONSTANTS — All tunable values: colors, speeds, sizes, counts, timings, creature stats, item definitions
3. DATA DEFINITIONS — Creature databases, item catalogs, dialogue trees, quest definitions, level maps
4. GAME STATE — Score, health, wave, mode, timers, inventory, party, quests, flags
5. SAVE/LOAD SYSTEM — localStorage-based persistence (if game needs it)
6. SCENE SETUP — Renderer, camera, scene, lights, fog
7. POST-PROCESSING — EffectComposer with RenderPass + bloom + FXAA
8. ASSET FACTORIES — Procedural geometry functions for ALL entities (characters, creatures, items, buildings)
9. ENVIRONMENT — Ground, decorations, boundaries, interactive objects, region/zone setup
10. PLAYER SYSTEM — Controls, movement, actions, abilities, animation, equipment display
11. ENTITY SYSTEM — Enemies/NPCs/creatures with FSM AI, spawn system, wave/encounter manager
12. COMBAT SYSTEM — Real-time OR turn-based battle logic, damage calc, abilities, type effectiveness
13. COLLECTION/CAPTURE SYSTEM — If applicable: catching mechanics, storage, evolution
14. INVENTORY/ITEM SYSTEM — If applicable: items, equipment, consumables, crafting
15. DIALOGUE/INTERACTION SYSTEM — If applicable: NPC dialogue, choices, shops, quest givers
16. QUEST/MISSION SYSTEM — If applicable: objectives, tracking, rewards
17. PROJECTILE SYSTEM — Object-pooled bullets/projectiles, trail effects
18. COLLISION/PHYSICS — Raycaster, Box3, distance checks, trigger zones
19. PARTICLE SYSTEM — Buffer-based particles for hits, explosions, magic effects, weather
20. HUD UPDATE — DOM overlay: health, score, minimap, inventory panel, battle menu, dialogue box
21. AUDIO SYSTEM — Web Audio API procedural sounds with reverb
22. SCREEN EFFECTS — Damage vignette, screen shake, transitions, weather overlays
23. TITLE/MENU SCREEN — Title, "Click to Play", controls, options
24. GAME OVER / WIN SCREEN — Final stats, "Click to Restart"
25. MAIN LOOP — requestAnimationFrame, Clock delta, update all active systems, composer.render()
26. EVENT LISTENERS — resize, pointer lock, keyboard, mouse, touch
27. DEBUG HOOKS — window.render_game_to_text() and window.advanceTime(ms)
Not every game needs every section. Include only what the design requires. Simple shooters skip 3-5, 12-16. Complex RPGs use most sections.
Read these for detailed implementation patterns:
${SKILL_DIR}/reference/engine-patterns.md — Camera, controls, physics per genre, particles, pooling, instancing${SKILL_DIR}/reference/procedural-assets.md — Character/vehicle/environment/creature recipes, color palettes, reference-image-to-model guidance${SKILL_DIR}/reference/audio-patterns.md — Web Audio API sound recipes${SKILL_DIR}/reference/game-systems.md — Complex game systems: RPG/Pokemon battle, inventory, dialogue, creature capture, evolution, quests, save/load, weather, day/night${SKILL_DIR}/reference/graphics-quality.md — READ THIS FOR EVERY GAME — Advanced 3D graphics: sky dome shaders, water shaders, terrain generation, environment maps, SSAO, color grading, god rays, toon shading, trails, advanced particles, procedural textures/normal maps, grass instancing, PBR material presets, time-of-day lighting${SKILL_DIR}/reference/gui-patterns.md — Premium HUD/UI: glassmorphism panels, animated health bars, kill feeds, crosshairs, toasts, dialogue boxes, battle UI CSSWhere ${SKILL_DIR} is the directory containing this SKILL.md file.
Always maximize visual and gameplay quality. The game should look and feel like a polished indie title, not a tech demo. Spend extra tokens on graphics. Read reference/graphics-quality.md for every game.
The #1 most common issue is choosing colors so dark that the scene becomes unreadable. Follow these rules:
Never use near-black colors for large surfaces:
0x4a6a4a for grass, 0x666688 for stone, 0x887766 for dirt). NEVER 0x0a0a0a–0x1a1a1a.0x334455 range. Walls must be clearly visible against the background.0x88aacc, cave: 0x334455, night: 0x223344). NEVER 0x000000–0x111111.scene.background: NEVER near-black unless outer space. Use the sky dome shader or a color that matches fog.0x44. A 0x0a0a15 floor is invisible.Color palette test — before finalizing, check:
Indoor / night scenes: Use medium-dark colors (NOT near-black) + strong accent lighting. A dark server room should have 0x2a2a40 walls, not 0x0a0a0a. A cave should have 0x445544 rock, not 0x111111. Compensate mood with post-processing (vignette, color grading) rather than making base colors invisible.
Rendering pipeline:
PCFSoftShadowMap with 4096x4096 shadow maps, shadow.normalBias = 0.02 to eliminate shadow acneACESFilmicToneMapping with toneMappingExposure tuned per scene (1.0–1.4, default 1.2, NEVER below 1.0)outputColorSpace = THREE.SRGBColorSpacesetPixelRatio(Math.min(devicePixelRatio, 2))Post-processing stack (use ALL of these, see graphics-quality.md for code):
Lighting rig (minimum 4 lights):
Sky (NEVER use flat background color):
createSkyDome) with sun disc + halo glowMaterials — use MeshPhysicalMaterial for key objects:
transmission, thickness, ior for realistic transparencymetalness: 1.0, low roughness, envMapIntensity > 1emissiveIntensity: 2.0+ (these glow with bloom)roughness: 0.6–0.7, warm colorEnvironment map (reflections):
PMREMGenerator from a sky scenescene.environment so ALL PBR materials get reflections automaticallyProcedural textures:
createNoiseTexture in graphics-quality.md)Environment detail:
Particles — use shader-based particles (see graphics-quality.md):
bash "${CLAUDE_SKILL_DIR}/scripts/serve.sh" /tmp/game-build
After serving locally, also publish the game to a shareable live URL using here.now (24-hour anonymous link):
bash /home/ke/.agents/skills/here-now/scripts/publish.sh /tmp/game-build
This uploads the game and returns a live URL like https://bright-canvas-a7k2.here.now/. The link lasts 24 hours (anonymous) or permanently (with HERENOW_API_KEY).
If the publish script is not found, fall back to just the local server.
Tell the user:
After every generation or iteration, update /tmp/game-build/progress.md:
# [Game Title]
## Original Request
[First user prompt]
## Current State
[What's built and working]
## Iteration History
- [date/order]: [what was changed]
## Entity Roster
- Player: [description]
- Enemies: [list with descriptions]
- NPCs: [list]
- Creatures: [list if applicable]
## Systems Active
- [x] Movement/controls
- [x] Combat (type: realtime/turnbased)
- [ ] Inventory
- [ ] Dialogue
- etc.
## Known Issues
- [any bugs or rough edges]
## Suggested Next Steps
- [ideas for what to add next]
Before delivering, verify:
scene.add() calls present for created objects.castShadow = true on visible objectscomposer.render() used (not renderer.render())→ Change player asset factory to raccoon model, create tiger enemy factory, swap environment to snow biome (white ground, pine trees with snow caps, snow particles, blue-white fog, ice rocks)
→ Add creature database, capture mechanic (weaken + throw), creature storage, party system, turn-based battles with type effectiveness. See reference/game-systems.md.
→ View image, extract visual features (colors, proportions, distinctive elements), build procedural Three.js model matching those features. Note: explain to user that the model will be a low-poly interpretation.
→ Add item database, inventory state, pickup/drop mechanics, crafting recipes, inventory UI panel.
→ Not supported in single-file mode. Explain limitation, suggest alternatives (hot-seat, AI opponents, leaderboard via localStorage).
ZIP package — ready to use