f8b21af4be
10_Wiki/Topics 대규모 정리: - 오류 캡처/미완성 stub 문서 227개 제거 - 교차폴더 중복 43클러스터 병합 (63파일 → redirect) - 링크명 정규화: 깨진 링크 수정·redirect 직결·개념 매핑 ~2,400건 - 카테고리 MOC 6개 신규 생성 - Graph 섹션 미해결 related-keyword 링크 10,058건 제거 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.8 KiB
8.8 KiB
id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
| id | title | category | status | canonical_id | aliases | duplicate_of | source_trust_level | confidence_score | verification_status | tags | raw_sources | last_reinforced | github_commit | tech_stack | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| wiki-2026-0508-boss-orchestration-gimmick | Boss Orchestration & Gimmick Management | 10_Wiki/Topics | verified | self |
|
none | B | 0.85 | applied |
|
2026-05-10 | pending |
|
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
- Phase-triggered: 매 HP 의 따라.
- Environmental hazard: 매 laser, 매 falling debris.
- Adds (summon): 매 minion 의 추가 spawn.
- Mechanic check: 매 player 의 specific mechanic 의 force.
- Enrage: 매 timer 후 의 instant kill.
매 ExecutePattern() 의 step
- Selection: 매 weighted random / state-based.
- Telegraph: 1-2 sec 의 warning (visual + audio).
- Execution: 매 attack 의 spawn.
- 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)
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
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)
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)
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
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
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
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) |