---
id: wiki-2026-0508-2026-04-25-skybound-player-airfr
title: Skybound — Player Airframe and 8-Stage Boss Continuity Rework
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Skybound Airframe, 8-Stage Boss]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [skybound, gamedev, player-design, boss-design, progression]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: typescript
  framework: phaser3
---

# Skybound — Player Airframe and 8-Stage Boss Continuity Rework

## 매 한 줄
> **"매 8-stage progression 의 continuity 는 boss roster 의 thematic escalation 과 player airframe 의 unlock pacing 의 product"**. 매 Skybound 는 aerial-themed VSL — player 의 airframe (jet/biplane/UFO 등) 이 stage clear 마다 unlock, boss 는 stage 별 thematic escalation (small drone → carrier → kraken-airship 등). 매 4-25 작업은 8 stage 의 boss list 와 airframe unlock 의 mapping 을 reconcile.

## 매 핵심

### 매 Airframe System
- 매 airframe 은 base stat (HP/speed/pickup radius) + signature passive 의 set.
- 매 stage clear 마다 1 unlock — total 8 airframes.
- 매 in-run 에서 airframe 변경 의 X — meta layer.

### 매 8-Stage Boss Roster
1. **Stage 1**: Recon Drone — tutorial, predictable strafe.
2. **Stage 2**: Patrol Squadron — multi-target intro.
3. **Stage 3**: Heavy Bomber — bullet hell intro.
4. **Stage 4**: Lightning Wraith — speed test.
5. **Stage 5**: Stormcaller (miniboss x2) — phase mechanic intro.
6. **Stage 6**: Sky Carrier — minion wave + main body.
7. **Stage 7**: Tempest Knight — mirror-match style.
8. **Stage 8**: Voidwhale — final, all mechanics combined.

### 매 Continuity Rework
- 매 stage 8 의 final boss 가 stage 1 enemy 의 evolved form 의 reveal — narrative thread.
- 매 airframe 8 (unlock at stage 8 clear) = stage 8 boss 의 "stolen" frame — meta loop.

## 💻 패턴

### Airframe Definition
```typescript
type Airframe = {
  id: string;
  name: string;
  baseHp: number;
  baseSpeed: number;
  pickupRadius: number;
  signature: Passive;
  unlockStage: number;
};

const AIRFRAMES: Airframe[] = [
  { id: 'biplane', name: 'Biplane', baseHp: 100, baseSpeed: 200, pickupRadius: 60, signature: { kind: 'crit', value: 0.1 }, unlockStage: 0 },
  { id: 'jet',     name: 'Jet',     baseHp: 80,  baseSpeed: 280, pickupRadius: 50, signature: { kind: 'cooldown', value: -0.15 }, unlockStage: 1 },
  // ...
  { id: 'voidframe', name: 'Voidframe', baseHp: 200, baseSpeed: 240, pickupRadius: 100, signature: { kind: 'lifesteal', value: 0.05 }, unlockStage: 8 },
];
```

### Boss Phase State Machine
```typescript
type BossPhase = 'intro' | 'p1' | 'transition' | 'p2' | 'enrage' | 'death';

class BossController {
  phase: BossPhase = 'intro';

  update(dt: number, hpRatio: number) {
    switch (this.phase) {
      case 'p1':
        if (hpRatio < 0.66) this.transitionTo('transition');
        break;
      case 'p2':
        if (hpRatio < 0.2) this.transitionTo('enrage');
        break;
    }
    this.runPattern(this.phase, dt);
  }
}
```

### Unlock Persistence
```typescript
interface MetaSave {
  airframesUnlocked: string[];
  highestStageCleared: number;
  bossDefeats: Record<string, number>;
}

function onStageClear(stageId: number, save: MetaSave): void {
  if (stageId > save.highestStageCleared) {
    const newFrame = AIRFRAMES.find(a => a.unlockStage === stageId);
    if (newFrame) save.airframesUnlocked.push(newFrame.id);
    save.highestStageCleared = stageId;
    persist(save);
  }
}
```

### Boss Continuity Reveal
```typescript
class VoidwhaleScene extends Phaser.Scene {
  showContinuityCutscene() {
    const boss = this.add.sprite(W/2, H/2, 'voidwhale');
    this.tweens.add({
      targets: boss, alpha: 0.3, duration: 1500,
      onComplete: () => {
        // morph reveal: stage 1 recon drone evolved
        boss.setTexture('recon-drone-evolved');
        this.add.text(W/2, H*0.8, '"It was watching from the start."', { fontSize: '32px' }).setOrigin(0.5);
      }
    });
  }
}
```

### Signature Passive Application
```typescript
function applySignature(player: Player, frame: Airframe): void {
  switch (frame.signature.kind) {
    case 'crit': player.stats.critChance += frame.signature.value; break;
    case 'cooldown': player.stats.cooldownMul *= (1 + frame.signature.value); break;
    case 'lifesteal': player.stats.lifesteal += frame.signature.value; break;
  }
}
```

## 매 결정 기준
| 상황 | Approach |
|---|---|
| Roster size > 8 | Tier groups (early/mid/late) — UI scalability |
| Boss too repetitive | Phase mechanic 차별화 (mirror, summon, terrain) |
| Unlock pacing too slow | Optional secondary unlock condition (achievement) |
| Continuity hard to read | Cutscene + audio motif callback |

**기본값**: 매 8-frame roster, 1-frame-per-stage unlock, final boss = continuity reveal.

## 🔗 Graph
- 부모: [[Boss-Design]] · [[Player-Progression]]
- 변형: [[Skybound-Skill-Concept-and-Hangar-Layout-Overlap-Fix]]
- 응용: [[Meta-Progression-Loops]]
- Adjacent: [[Skybound-Stage-Miniboss-Pattern-Differentiation]] · [[Phase-State-Machine]]

## 🤖 LLM 활용
**언제**: roster brainstorm, narrative continuity ideation, balance spreadsheet generation.
**언제 X**: animation timing, hitbox tuning (manual playtesting 필요).

## ❌ 안티패턴
- **Bosses identical mechanics**: mirror/summon/terrain 의 lack — flat fight feel.
- **Unlock at first 2 stages all**: pacing 망 — late-stage motivation 의 X.
- **Continuity reveal text-only**: weak impact — visual morph + audio motif 의 사용.
- **Airframe stat 차이만**: signature passive 없음 — identity collapse.

## 🧪 검증 / 중복
- Verified (Hades roster design, Vampire Survivors character roster).
- 신뢰도 A.

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — airframe + 8-stage boss continuity 정리 |
