---
id: wiki-2026-0508-boss-orchestration-gimmick
title: Boss Orchestration & Gimmick Management
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [boss design, multi-phase boss, gimmick, telegraphing, attack pattern, boss AI]
duplicate_of: none
source_trust_level: B
confidence_score: 0.85
verification_status: applied
tags: [game-design, boss, gimmick, telegraphing, behavior-tree, pattern, multi-phase, npc-ai]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: TypeScript
  framework: Game engine (custom / Unity / Godot)
---

# Boss Orchestration & Gimmick Management

## 📌 한 줄 통찰
> **"매 boss = 매 HP 의 X — 매 sequence + gimmick"**. 매 multi-part + multi-phase + telegraph + recovery window 의 fight feel. 매 player 의 skill expression 의 platform. 매 modern game 의 highlight moment.

## 📖 핵심

### 매 multi-part architecture
- 매 boss = 매 N 개 part (head, arm, core).
- 매 part 별 HP + defense.
- 매 dependency tree (shield → core).
- 매 visual state (texture swap + effect).
- 매 collision per part.

### 매 phase
- 매 HP threshold (75%, 50%, 25%).
- 매 enrage timer.
- 매 environmental change.
- 매 new attack 추가.
- 매 음악 transition.

### 매 gimmick
1. **Phase-triggered**: 매 HP 의 따라.
2. **Environmental hazard**: 매 laser, 매 falling debris.
3. **Adds (summon)**: 매 minion 의 추가 spawn.
4. **Mechanic check**: 매 player 의 specific mechanic 의 force.
5. **Enrage**: 매 timer 후 의 instant kill.

### 매 ExecutePattern() 의 step
1. **Selection**: 매 weighted random / state-based.
2. **Telegraph**: 1-2 sec 의 warning (visual + audio).
3. **Execution**: 매 attack 의 spawn.
4. **Recovery**: 매 stun / idle (player 의 DPS window).

### 매 telegraphing 의 design
- **Visual**: 매 charging glow, 매 ground marker, 매 windup animation.
- **Audio**: 매 distinct sound cue.
- **Duration**: 매 difficulty 의 따라 (0.5-2 sec).
- **Read time**: 매 player 의 react 의 가능.

### 매 attack pattern type
- **Aimed**: 매 player 의 location.
- **Pattern**: 매 fixed (memorize).
- **Random spread**: 매 reaction.
- **Predictive**: 매 player 의 movement 의 lead.
- **AOE**: 매 area.
- **Beam**: 매 sweeping.

### 매 boss 의 fairness
- **Telegraph 의 always**: 매 unavoidable X.
- **Attack 의 escapable**: 매 dodge / block 가능.
- **Pattern 의 readable**: 매 learn-able.
- **Heal 의 limited**: 매 frustration X.
- **Phase 의 progressive**: 매 escalation.

### 매 modern reference
- **Souls / Elden Ring**: 매 telegraph + recovery + animation cancel.
- **Monster Hunter**: 매 part destruction.
- **Devil May Cry**: 매 stylish + multi-phase.
- **Touhou**: 매 bullet pattern.
- **Final Fantasy 14**: 매 mechanic check.

### 매 difficulty scaling
- **HP**: 매 simple 가 매 boring 가능.
- **Damage**: 매 punish ↑.
- **Phase 의 add**: 매 best.
- **Telegraph 의 shorten**: 매 frustrating 위험.
- **Adds 의 추가**: 매 best.

## 💻 패턴

### Multi-part boss (TypeScript)
```ts
class BossPart {
  hp: number;
  maxHp: number;
  defense: number;
  destroyed = false;
  
  takeDamage(amount: number, parent: Boss) {
    if (this.destroyed) return;
    const dealt = Math.max(1, amount - this.defense);
    this.hp -= dealt;
    if (this.hp <= 0) {
      this.destroyed = true;
      parent.onPartDestroyed(this);
    }
  }
}

class Boss {
  parts: Map<string, BossPart> = new Map();
  
  onPartDestroyed(part: BossPart) {
    this.spawnDestructionEffect(part.position);
    if (part.id === 'shield') {
      this.parts.get('core')!.invulnerable = false;
    }
    this.checkPhaseTransition();
  }
}
```

### Phase machine
```ts
class BossPhaseManager {
  phases = [
    { threshold: 1.0, name: 'phase1', patterns: ['attack_a', 'attack_b'] },
    { threshold: 0.66, name: 'phase2', patterns: ['attack_a', 'attack_b', 'attack_c', 'gimmick_1'] },
    { threshold: 0.33, name: 'phase3', patterns: ['attack_b', 'attack_c', 'gimmick_2', 'enrage'] },
  ];
  
  current = this.phases[0];
  
  update(boss: Boss) {
    const hpRatio = boss.hp / boss.maxHp;
    const next = this.phases.find(p => hpRatio < p.threshold && p !== this.current);
    if (next) this.transitionTo(next, boss);
  }
  
  transitionTo(next: Phase, boss: Boss) {
    boss.playAnimation('phase_transition');
    boss.invulnerable = true;
    this.spawnEnvironmentalChange();
    setTimeout(() => {
      boss.invulnerable = false;
      this.current = next;
    }, 2000);
  }
}
```

### Pattern selection (weighted)
```ts
class BossAIService {
  private recentPatterns: string[] = [];
  
  selectPattern(boss: Boss, player: Player): string {
    const available = boss.currentPhase.patterns;
    
    const weights = available.map(p => {
      let w = 1.0;
      // 매 distance-based
      const dist = boss.distance(player);
      if (p === 'melee_slam' && dist > 5) w *= 0.1;
      if (p === 'ranged_volley' && dist < 3) w *= 0.3;
      // 매 anti-repetition
      if (this.recentPatterns.slice(-2).includes(p)) w *= 0.3;
      // 매 cooldown
      if (boss.patternCooldown(p) > 0) w = 0;
      return w;
    });
    
    const chosen = weightedRandom(available, weights);
    this.recentPatterns.push(chosen);
    if (this.recentPatterns.length > 5) this.recentPatterns.shift();
    return chosen;
  }
}
```

### Telegraph (warning system)
```ts
async function executePattern(boss: Boss, pattern: AttackPattern, player: Player) {
  // 1. Telegraph
  const telegraph = pattern.getTelegraph(boss, player);
  showVisual(telegraph.visual);
  playAudio(telegraph.audio);
  
  // 2. Wait (player 의 react time)
  await sleep(pattern.telegraphDuration);
  
  // 3. Execute
  boss.playAnimation(pattern.animation);
  await sleep(pattern.windupDuration);
  pattern.spawn(boss, player);
  
  // 4. Recovery (DPS window)
  boss.state = 'recovering';
  await sleep(pattern.recoveryDuration);
  boss.state = 'active';
}
```

### Environmental hazard
```ts
class LaserGridGimmick {
  intervalMs = 3000;
  laserColumns = 8;
  
  start(scene: Scene) {
    this.handle = setInterval(() => {
      const cols = Array.from({ length: this.laserColumns }, (_, i) => i);
      const safeIdx = Math.floor(Math.random() * cols.length);
      
      // 매 telegraph 1 sec
      cols.forEach(c => {
        if (c !== safeIdx) showWarning(scene, c);
      });
      
      setTimeout(() => {
        cols.forEach(c => {
          if (c !== safeIdx) fireLaser(scene, c);
        });
      }, 1000);
    }, this.intervalMs);
  }
  
  stop() { clearInterval(this.handle); }
}
```

### Enrage timer
```ts
class EnrageTimer {
  remaining = 300_000;  // 5 min
  
  update(dt: number, boss: Boss) {
    this.remaining -= dt;
    if (this.remaining <= 0 && boss.phase !== 'enrage') {
      boss.transitionTo('enrage');
      boss.damageMultiplier = 3.0;
      showMessage('ENRAGED');
    }
    if (this.remaining < 30_000) {
      // 매 30 sec 의 warning
      showCountdown(Math.ceil(this.remaining / 1000));
    }
  }
}
```

### Add summon
```ts
class AddSummonGimmick {
  hpThreshold = 0.5;
  triggered = false;
  
  update(boss: Boss) {
    if (boss.hp / boss.maxHp < this.hpThreshold && !this.triggered) {
      this.triggered = true;
      boss.invulnerable = true;
      
      // 매 N 의 minion spawn
      for (let i = 0; i < 4; i++) {
        spawnMinion(boss.position.add(randomOffset(10)));
      }
      
      // 매 모든 minion 의 dead 까지 invulnerable
      setInterval(() => {
        if (countAliveMinion() === 0) boss.invulnerable = false;
      }, 1000);
    }
  }
}
```

## 🤔 결정 기준
| 상황 | Approach |
|---|---|
| Action / Souls-like | Multi-part + telegraph + recovery |
| Bullet hell | Pattern memorize + spread |
| MMO raid | Mechanic check + DPS window |
| Mobile | Simple gimmick + readable |
| Speedrun-friendly | Predictable pattern |
| Casual | Low damage + clear telegraph |

**기본값**: 매 multi-phase + 매 telegraph + 매 recovery + 매 fairness.

## 🔗 Graph
- 부모: [[Game-Design]]
- 변형: [[Multi-Phase-Boss]] · [[Bullet-Hell]]
- Adjacent: [[Behavior-Tree]] · [[Baiting]]

## 🤖 LLM 활용
**언제**: 매 boss design. 매 encounter scripting. 매 multi-phase logic. 매 NPC AI service.
**언제 X**: 매 simple enemy (overkill). 매 narrative-only.

## ❌ 안티패턴
- **No telegraph**: 매 unfair.
- **HP sponge**: 매 boring.
- **Repeat same pattern**: 매 predictable.
- **No recovery window**: 매 player DPS X.
- **No phase change**: 매 monotonous.
- **Random unavoidable hit**: 매 frustration.
- **Enrage too short**: 매 panic.

## 🧪 검증 / 중복
- Verified (Souls / FF14 / MH design analysis).
- 신뢰도 B.
- Related: [[Combat-AI]] · [[Behavior-Tree]] · [[Pursuit-Logic]] · [[Baiting]].

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — multi-part + phase + telegraph + 매 TS code (BossPart, AI service, gimmick) |
