# Jump 'n Run - Game Design Document

## Concept

2D side-scrolling platformer with run-and-gun combat.
Inspired by **Jazz Jackrabbit 2**, **Metal Slug**, **Mega Man**, and classic 90s side-scrollers.

**Theme:** Sci-fi / space western (think *Cowboy Bebop*).
The player is a bounty hunter traveling between planets and space stations,
taking on jobs that play out as platformer levels.

---

## Game Structure

### Two Main Modes

**1. World Map (Spacecraft Navigation)**
- Top-down or side-view map showing planets, stations, asteroids
- Player pilots a spacecraft between locations
- Each location is a level (or hub with multiple levels)
- Map could be a simple node graph or free-flight between points
- Unlocking new areas as the story progresses
- Ship could have upgrades (fuel range, shields, scanner)

**2. Platformer Levels**
- Core gameplay: run, jump, shoot, explore
- Each level is a self-contained planet/station/ship with its own atmosphere
- Levels end with reaching an exit zone (or defeating a boss)
- Collectibles: currency (bounty credits), health pickups, weapon upgrades
- Optional objectives for bonus rewards

---

## Atmosphere System

Each level defines its own atmosphere, affecting gameplay feel:

| Property       | Effect                                      | Example Values          |
|----------------|---------------------------------------------|-------------------------|
| `GRAVITY`      | Fall speed and jump arc                     | 980 (earth), 400 (moon) |
| `WIND`         | Constant horizontal force on entities       | -50 to 50 px/s^2        |
| `STORM`        | Visual effect + periodic strong wind gusts  | 0 (calm) to 3 (severe)  |
| `DRAG`         | Air resistance (underwater, thick atmo)     | 0.0 (none) to 0.9       |
| `BG_COLOR`     | Background clear color                      | hex color               |
| `PARALLAX_FAR` | Far background image path                   | assets/bg/stars.png     |
| `PARALLAX_NEAR`| Near background image path                  | assets/bg/nebula.png    |
| `MUSIC`        | Level music track                           | assets/music/level1.ogg |
| `PALETTE`      | Color mood (warm, cold, toxic, void)        | tint/filter values      |

Already implemented: `GRAVITY`, `WIND`, `BG_COLOR`, `MUSIC`, `PARALLAX_FAR`, `PARALLAX_NEAR` (all per-level). Parallax backgrounds are procedurally generated (starfield + nebula) when no image path is specified.

---

## Player

- **Size:** 12x16 px hitbox, 16x16 sprite
- **Movement:** Run, jump (variable height, coyote time, jump buffer)
- **Dash:** C key, directional (horizontal, up, diagonal, down while airborne).
  Brief i-frames during dash. 0.15s duration, 0.4s cooldown.
- **Combat:** Shoot projectiles (X or Space), directional aiming with UP key
  (straight up, or diagonal when combined with LEFT/RIGHT)
- **Camera:** Holding UP while standing still pans the camera upward
- **Health:** 3 HP (expandable), invincibility frames + knockback on hit
- **Death / Respawn:** Death animation plays, then 1s delay before respawning at level spawn with full HP, charges, and brief invincibility. Falling off the level kills instantly with 0.3s delay.
- **Future abilities:**
  - Wall slide / wall jump
  - Weapon switching (multiple projectile types from the def system)
  - Double jump (upgrade)
  - Melee attack (close range, stronger)

---

## Enemies

### Implemented
- **Grunt** — Red spiky ground patrol. Walks back and forth, turns at edges/walls. 2 HP.
- **Flyer** — Purple bat-like. Bobs in air, chases player when close, shoots fireballs. 1 HP.
- **Turret** — Stationary, rotates to aim at player, fires periodically

- **Charger** — Ground patrol, detects player in 200 px horizontal LOS, ALERT → CHARGE (150 px/s) → STUNNED on wall hit. 2 HP.
- **Spawner** — Stationary, spawns grunts every 4.5 s (max 3 alive). 3 HP, destructible.
- **Laser Turret** — State machine (IDLE → CHARGING → FIRING → COOLDOWN). Per-pixel beam raycast. Fixed variant aims left; tracking variant rotates toward player at 1.5 rad/s.

### Planned
- **Shielder** — Has a directional shield, must be hit from behind or above
- **Boss** — Large, multi-phase encounters. One per world area.

---

## Weapons / Projectiles

Data-driven system: each weapon type is a `ProjectileDef` struct describing speed,
damage, lifetime, hitbox, behavior flags, and animations. Adding a new weapon =
adding a new def. See `src/game/projectile.h` for the full definition.

### Behavior flags
- `PROJ_PIERCING` — Passes through enemies (up to `pierce_count` times)
- `PROJ_BOUNCY` — Ricochets off walls (up to `bounce_count` times)
- `PROJ_GRAVITY` — Affected by level gravity (scaled by `gravity_scale`)
- `PROJ_HOMING` — Steers toward nearest valid target

### Implemented weapon defs
| Weapon          | Speed | Damage | Special                  | Owner  |
|-----------------|-------|--------|--------------------------|--------|
| `WEAPON_PLASMA` | 400   | 1      | Default player weapon    | Player |
| `WEAPON_SPREAD` | 350   | 1      | Short range, fan pattern | Player |
| `WEAPON_LASER`  | 600   | 1      | Pierces 3 enemies        | Player |
| `WEAPON_ROCKET` | 200   | 3      | Slight gravity drop      | Player |
| `WEAPON_BOUNCE` | 300   | 1      | 3 wall bounces + gravity | Player |
| `WEAPON_ENEMY_FIRE` | 180 | 1    | Enemy fireball           | Enemy  |

### Directional aiming
- Forward (default) — shoots horizontally in facing direction
- Up — hold UP to shoot straight up
- Diagonal up — hold UP + LEFT/RIGHT to shoot at 45 degrees

---

## Levels

### Format (.lvl)
Current directives: `TILESET`, `SIZE`, `SPAWN`, `GRAVITY`, `WIND`, `BG_COLOR`, `MUSIC`, `PARALLAX_FAR`, `PARALLAX_NEAR`, `TILEDEF`, `ENTITY`, `EXIT`, `LAYER`

**Needed additions:**
- `STORM`, `DRAG` — Remaining atmosphere settings

### Level Ideas

0. **Intro Level (Moon)** - Low gravity, bright surface, spacey/no obstacles
1. **Mars Surface** - Low gravity, red surface, spacey, little to no obstacles, transition area is entry to base
2. **Mars Base** - Normal gravity, very vertical, narrow, 90 degree turns, lots of enemies 
3. **Derelict Station** — Low gravity, dark, flickering lights, abandoned corridors
4. **Desert Planet (Saturn)** — High gravity, sand storm wind, bright orange palette
5. **Gas Giant (Jupiter)** — Very low gravity, floating platforms, toxic atmosphere
6. **Asteroid Belt** — Zero-G sections, small disconnected platforms
7. **Space Freighter** — Normal gravity, tight corridors, turret enemies
8. **Ice World** — Normal gravity, strong winds, slippery surface

---

## World Map

### Structure
- Graph of nodes (planets/stations) connected by routes
- Player selects destination, spacecraft flies there (short animation or instant)
- Some routes may require fuel/upgrades to unlock
- Map reveals new nodes as levels are completed

### Implementation Notes
- Separate game state from the platformer (own update/render)
- Needs: node data structure, spacecraft position, route rendering
- Could start simple: linear level select, evolve into open map

---

## Technical TODO

### High Priority
- [x] Entity spawn directives in .lvl format (`ENTITY` directive)
- [x] Level exit zones and level transitions
- [x] Dash mechanic
- [x] Particle system (death puffs, landing dust, projectile impact sparks, wall slide dust)
- [x] Screen shake on damage / enemy kills
- [x] Sound effects (jump, shoot, hit, enemy death, dash)
- [x] Basic HUD (health hearts + jetpack charges)

### Medium Priority
- [x] In-game level editor (tile/entity placement, save/load, test play)
- [x] Wind atmosphere property (`WIND` directive, affects all entities/particles/projectiles)
- [ ] Drag atmosphere property
- [x] Parallax scrolling backgrounds (procedural stars + nebula, or from image files)
- [x] Per-level background color (`BG_COLOR` directive)
- [x] Music playback per level (`MUSIC` directive)
- [ ] Weapon switching system
- [x] Pickup entities (health, jetpack refill, drone companion)
- [ ] Better tileset art (space-themed)
- [ ] Player sprite polish (more animation frames)
- [x] Death / respawn system
- [x] Pause menu

### Low Priority (Future)
- [ ] World map mode
- [ ] Spacecraft navigation
- [ ] Boss encounters
- [ ] Dialogue / mission briefing system
- [ ] Save system
- [ ] Controller support (SDL_GameController is initialized)
- [ ] Multiple playable characters

---

## Art Direction

- Pixel art, 16x16 tile grid
- Logical resolution: 640x360 (rendered at 2x = 1280x720)
- Nearest-neighbor scaling for crisp pixels
- Dark, moody color palettes with bright projectile/effect accents
- Inspired by: Cowboy Bebop color grading, retro sci-fi, neon-on-dark

---

## Controls

| Action    | Key          | Status        |
|-----------|--------------|---------------|
| Move      | Arrow keys   | Implemented   |
| Jump      | Z / Space    | Implemented   |
| Shoot     | X            | Implemented   |
| Aim up    | UP (+ shoot) | Implemented   |
| Aim diag  | UP+LEFT/RIGHT (+ shoot) | Implemented |
| Dash      | C            | Implemented   |
| Look up   | UP (stand still) | Implemented |
| Pause     | Escape       | Implemented   |

---

## Reference Games
- Jazz Jackrabbit 2 (movement feel, weapon variety, level design)
- Metal Slug (run-and-gun, enemy variety, visual flair)
- Mega Man X (dash, tight controls)
- Cowboy Bebop (aesthetic, tone, music style)
