[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -1,122 +1,318 @@
|
||||
---
|
||||
id: wiki-2026-0508-boss-orchestration-and-gimmick-m
|
||||
title: Boss Orchestration and Gimmick Management
|
||||
id: wiki-2026-0508-boss-orchestration-gimmick
|
||||
title: Boss Orchestration & Gimmick Management
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: []
|
||||
aliases: [boss design, multi-phase boss, gimmick, telegraphing, attack pattern, boss AI]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
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-08
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
language: TypeScript
|
||||
framework: Game engine (custom / Unity / Godot)
|
||||
---
|
||||
|
||||
# Boss Orchestration and Gimmick Management
|
||||
# Boss Orchestration & Gimmick Management
|
||||
|
||||
Skybound의 보스전은 단순한 체력 깎기가 아닌, 복합적인 기믹과 부위 파괴 로직이 결합된 시퀀스입니다. `BossSystem`은 보스의 생명주기와 패턴 실행을 조율(Orchestration)합니다.
|
||||
## 📌 한 줄 통찰
|
||||
> **"매 boss = 매 HP 의 X — 매 sequence + gimmick"**. 매 multi-part + multi-phase + telegraph + recovery window 의 fight feel. 매 player 의 skill expression 의 platform. 매 modern game 의 highlight moment.
|
||||
|
||||
## 1. Multi-Part Architecture
|
||||
보스는 여러 개의 독립적인 **Part Object**로 구성됩니다. 각 파츠는 고유의 HP와 방어력을 가집니다.
|
||||
## 📖 핵심
|
||||
|
||||
- **Dependency Tree**: 특정 파츠(예: Shield Generator)가 파괴되어야만 본체(Core)에 데미지를 입힐 수 있는 트리 구조를 지원합니다.
|
||||
- **Visual Feedback**: 파츠 파괴 시 텍스처 교체 및 스파크 이펙트 발생과 같은 시각적 상태 변화를 실시간으로 렌더링 시스템에 전달합니다.
|
||||
### 매 multi-part architecture
|
||||
- 매 boss = 매 N 개 part (head, arm, core).
|
||||
- 매 part 별 HP + defense.
|
||||
- 매 dependency tree (shield → core).
|
||||
- 매 visual state (texture swap + effect).
|
||||
- 매 collision per part.
|
||||
|
||||
## 2. Gimmick Activation System
|
||||
보스전의 긴장감을 유지하기 위해 특정 조건 기반의 기믹이 발동됩니다.
|
||||
### 매 phase
|
||||
- 매 HP threshold (75%, 50%, 25%).
|
||||
- 매 enrage timer.
|
||||
- 매 environmental change.
|
||||
- 매 new attack 추가.
|
||||
- 매 음악 transition.
|
||||
|
||||
- **Phase-Triggered Gimmicks**: HP 임계값(Threshold) 도달 시, 보스의 외형 또는 배경 환경이 변화하며 새로운 기믹이 추가됩니다.
|
||||
- **Environmental Hazard**: 보스가 화면의 레이저 트랩이나 전자기 폭풍을 호출하여 플레이어의 이동 영역을 제한하는 로직입니다.
|
||||
### 매 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.
|
||||
|
||||
## 3. Implementation Process: ExecutePattern()
|
||||
보스의 패턴 실행은 다음과 같은 단계를 거칩니다.
|
||||
1. **Selection**: `BossAIService`가 가중치에 따라 다음 행동(Intent)을 결정합니다.
|
||||
2. **Telegraphing**: 공격 전 예고 로직(Warning sign, Audio cue)을 1.5~2초간 출력합니다.
|
||||
3. **Execution**: 실제 탄막을 생성하거나 물리적 돌진 로직을 실행합니다.
|
||||
4. **Cooldown/Recovery**: 패턴 종료 후 잠시 'Stun' 또는 'Idle' 상태로 전환하여 플레이어의 딜링 타임을 제공합니다.
|
||||
### 매 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).
|
||||
|
||||
## 4. Key Implementation References
|
||||
- `src/features/game/systems/BossSystem.ts`: 멀티 파츠 관리 및 패턴 실행 코어.
|
||||
- `src/features/game/ai/bossAIService.ts`: 패턴 선택 지능 로직.
|
||||
### 매 telegraphing 의 design
|
||||
- **Visual**: 매 charging glow, 매 ground marker, 매 windup animation.
|
||||
- **Audio**: 매 distinct sound cue.
|
||||
- **Duration**: 매 difficulty 의 따라 (0.5-2 sec).
|
||||
- **Read time**: 매 player 의 react 의 가능.
|
||||
|
||||
---
|
||||
**Status**: Managed by Skybound Protocol
|
||||
**Context**: Boss Engineering / Pattern Orchestration
|
||||
### 매 attack pattern type
|
||||
- **Aimed**: 매 player 의 location.
|
||||
- **Pattern**: 매 fixed (memorize).
|
||||
- **Random spread**: 매 reaction.
|
||||
- **Predictive**: 매 player 의 movement 의 lead.
|
||||
- **AOE**: 매 area.
|
||||
- **Beam**: 매 sweeping.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
### Related Concepts (Auto-Linked)
|
||||
* [[Architecture]]
|
||||
* [[Management]]
|
||||
* [[_system]]
|
||||
### 매 boss 의 fairness
|
||||
- **Telegraph 의 always**: 매 unavoidable X.
|
||||
- **Attack 의 escapable**: 매 dodge / block 가능.
|
||||
- **Pattern 의 readable**: 매 learn-able.
|
||||
- **Heal 의 limited**: 매 frustration X.
|
||||
- **Phase 의 progressive**: 매 escalation.
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
### 매 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.
|
||||
|
||||
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
|
||||
### 매 difficulty scaling
|
||||
- **HP**: 매 simple 가 매 boring 가능.
|
||||
- **Damage**: 매 punish ↑.
|
||||
- **Phase 의 add**: 매 best.
|
||||
- **Telegraph 의 shorten**: 매 frustrating 위험.
|
||||
- **Adds 의 추가**: 매 best.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
## 💻 패턴
|
||||
|
||||
**추출된 패턴:**
|
||||
> *(TODO)*
|
||||
### 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
**세부 내용:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
|
||||
- **과거 데이터와의 충돌:** 없음
|
||||
- **정책 변화:** 없음
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
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();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
### 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);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
### 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;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
### 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';
|
||||
}
|
||||
```
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
### 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); }
|
||||
}
|
||||
```
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
### 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
### 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]] · [[NPC-AI]] · [[Encounter-Design]]
|
||||
- 변형: [[Multi-Phase-Boss]] · [[Mechanic-Check]] · [[Bullet-Hell]] · [[Souls-like-Boss]]
|
||||
- 응용: [[Telegraph]] · [[Pattern-Selection]] · [[Environmental-Hazard]] · [[Enrage-Timer]]
|
||||
- Adjacent: [[Behavior-Tree]] · [[Combat-AI]] · [[Difficulty-Curve]] · [[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) |
|
||||
|
||||
Reference in New Issue
Block a user