Retro western vertical shooter inspired by Gun.Smoke, built with TypeScript and WebGL2. Features 3-direction shooting, vertical scrolling, economy/shop loop, boss fights, and CRT shader effects. Phases implemented: - Phase 1: Engine skeleton (WebGL2 renderer, fixed timestep loop, input) - Phase 2: Shooting identity (3-dir shooting, bullet pools, collision) - Phase 3: Enemies & patterns (JSON waves, 4 enemy types, parallax bg) - Phase 4: Economy loop (pickups, shop, upgrades, HUD) - Phase 5: Boss system (3 bosses, wanted posters, multi-phase attacks) - Phase 6: Shader layer (CRT effects, bloom, scanlines, screen shake) - Phase 7: Performance (VAO batching, O(1) allocation, stress testing) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
66 lines
2.0 KiB
JSON
66 lines
2.0 KiB
JSON
{
|
|
"id": "stage1",
|
|
"name": "Dusty Trail",
|
|
"scrollSpeed": 20,
|
|
"waves": [
|
|
{
|
|
"id": "wave1",
|
|
"duration": 5,
|
|
"spawns": [
|
|
{ "type": "bandit", "x": "center", "delay": 0 },
|
|
{ "type": "bandit", "x": "left", "delay": 0.5 },
|
|
{ "type": "bandit", "x": "right", "delay": 0.5 }
|
|
]
|
|
},
|
|
{
|
|
"id": "wave2",
|
|
"duration": 6,
|
|
"spawns": [
|
|
{ "type": "gunman", "x": "left", "delay": 0 },
|
|
{ "type": "gunman", "x": "right", "delay": 0 },
|
|
{ "type": "bandit", "x": "center", "delay": 1 },
|
|
{ "type": "bandit", "x": "random", "delay": 2 },
|
|
{ "type": "bandit", "x": "random", "delay": 2.5 }
|
|
]
|
|
},
|
|
{
|
|
"id": "wave3",
|
|
"duration": 7,
|
|
"spawns": [
|
|
{ "type": "rifleman", "x": "center", "delay": 0 },
|
|
{ "type": "bandit", "x": "left", "delay": 0.5 },
|
|
{ "type": "bandit", "x": "right", "delay": 0.5 },
|
|
{ "type": "gunman", "x": "random", "delay": 2 },
|
|
{ "type": "gunman", "x": "random", "delay": 3 }
|
|
]
|
|
},
|
|
{
|
|
"id": "wave4",
|
|
"duration": 8,
|
|
"spawns": [
|
|
{ "type": "dynamite", "x": "center", "delay": 0 },
|
|
{ "type": "bandit", "x": "left", "delay": 0 },
|
|
{ "type": "bandit", "x": "right", "delay": 0 },
|
|
{ "type": "rifleman", "x": "left", "delay": 2 },
|
|
{ "type": "rifleman", "x": "right", "delay": 2 },
|
|
{ "type": "gunman", "x": "center", "delay": 4 }
|
|
]
|
|
},
|
|
{
|
|
"id": "wave5",
|
|
"duration": 10,
|
|
"spawns": [
|
|
{ "type": "gunman", "x": "left", "delay": 0 },
|
|
{ "type": "gunman", "x": "right", "delay": 0 },
|
|
{ "type": "gunman", "x": "center", "delay": 0 },
|
|
{ "type": "rifleman", "x": "random", "delay": 2 },
|
|
{ "type": "rifleman", "x": "random", "delay": 2.5 },
|
|
{ "type": "dynamite", "x": "random", "delay": 4 },
|
|
{ "type": "bandit", "x": "random", "delay": 5 },
|
|
{ "type": "bandit", "x": "random", "delay": 5.5 },
|
|
{ "type": "bandit", "x": "random", "delay": 6 }
|
|
]
|
|
}
|
|
]
|
|
}
|