---
id: wiki-2026-0508-skybound-skill-asset-integration
title: Skybound Skill Asset Integration
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Skybound Skill Pipeline, Skill Asset Pipeline, Faction Skill Integration]
duplicate_of: none
source_trust_level: B
confidence_score: 0.85
verification_status: applied
tags: [game-design, asset-pipeline, skill-system, war-commander, skybound]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: typescript
  framework: asset-pipeline
---

# Skybound Skill Asset Integration

## 매 한 줄
> **"매 skill 은 매 asset bundle 의 contract 다."**. Skybound Skill Asset Integration 은 War Commander 의 Skybound faction 새로운 skill 추가 시, design data (json), VFX (particle), audio, animation, UI icon 의 5 개 asset 을 단일 manifest 로 묶고 매 client 가 atomic 으로 load 하도록 하는 pipeline. 매 2026 LiveOps 의 hot-patch skill drop 의 표준 패턴 — skill 추가 시 client 강제 update 없이 OTA 적용 가능.

## 매 핵심

### 매 Pipeline Stages
1. **Design**: skill stat json (cooldown, damage, type)
2. **VFX**: particle effect bundle (Unity/Unreal addressable)
3. **Audio**: SFX wav + mixer routing
4. **Animation**: skeletal anim clip + state machine entry
5. **UI**: icon, tooltip locale strings

### 매 Manifest Contract
- 매 skill = 매 unique skillId
- manifest 는 asset hash + version + dependencies
- client 가 매 skill 사용 시 manifest verify → fallback to default if missing
- 매 OTA delivery: CDN-backed, signed manifest

### 매 응용
1. War Commander Skybound expansion: monthly new skill drop.
2. Generic faction-DLC pipeline.
3. Live event one-shot skills.

## 💻 패턴

### Pattern 1 — Manifest schema
```typescript
interface SkillManifest {
  skillId: string;
  version: string;
  designJson: AssetRef;
  vfxBundle: AssetRef;
  audioBundle: AssetRef;
  animClip: AssetRef;
  uiIcon: AssetRef;
  signature: string; // 매 server-signed
}
interface AssetRef { url: string; hash: string; sizeBytes: number; }
```

### Pattern 2 — Atomic loader
```typescript
async function loadSkill(manifest: SkillManifest): Promise<Skill> {
  await verifySignature(manifest);
  const [design, vfx, audio, anim, icon] = await Promise.all([
    fetchAsset(manifest.designJson),
    fetchAsset(manifest.vfxBundle),
    fetchAsset(manifest.audioBundle),
    fetchAsset(manifest.animClip),
    fetchAsset(manifest.uiIcon),
  ]);
  for (const [a, ref] of [
    [design, manifest.designJson], [vfx, manifest.vfxBundle],
    [audio, manifest.audioBundle], [anim, manifest.animClip], [icon, manifest.uiIcon],
  ] as const) {
    if (sha256(a) !== ref.hash) throw new Error('HASH_MISMATCH');
  }
  return assembleSkill(design, vfx, audio, anim, icon);
}
```

### Pattern 3 — Fallback to default
```typescript
async function loadSkillSafe(skillId: string): Promise<Skill> {
  try {
    const manifest = await fetchManifest(skillId);
    return await loadSkill(manifest);
  } catch (e) {
    logger.warn('Skill load failed; falling back', { skillId, err: e });
    return loadDefaultSkill();
  }
}
```

### Pattern 4 — Hot-patch detection
```typescript
async function checkForSkillUpdate(skillId: string, currentVersion: string): Promise<boolean> {
  const remote = await fetchManifestHead(skillId);
  return remote.version !== currentVersion;
}
```

### Pattern 5 — Server-side signing
```typescript
function signManifest(manifest: Omit<SkillManifest, 'signature'>, key: PrivateKey): string {
  const payload = canonicalJson(manifest);
  return ed25519.sign(key, payload).toString('hex');
}
```

### Pattern 6 — CDN cache prewarming
```typescript
async function prewarmManifests(skillIds: string[]): Promise<void> {
  const manifests = await Promise.all(skillIds.map(fetchManifest));
  const refs = manifests.flatMap(m => [m.designJson, m.vfxBundle, m.audioBundle, m.animClip, m.uiIcon]);
  await Promise.all(refs.map(r => prefetch(r.url)));
}
```

### Pattern 7 — Localization fallback
```typescript
function resolveTooltip(localeStrings: Record<string, string>, locale: string): string {
  return localeStrings[locale] ?? localeStrings['en'] ?? '<missing>';
}
```

## 매 결정 기준
| 상황 | Approach |
|---|---|
| Mobile + bandwidth concern | Lazy-load: only fetch on first use |
| Frequent hot-drop skill | Prewarm all active manifests on app start |
| Dev/testing | Local override manifest |
| Highly competitive PvP | Mandatory pre-load to prevent visual desync |

**기본값**: lazy-load + prewarm popular skills, mandatory hash verify, ed25519 signature, fallback to default skill.

## 🔗 Graph
- 부모: [[Live Operations (LiveOps)]] · [[CI_CD Pipeline]]
- 변형: [[Sarkis-Cloning-Technology]] · [[Beresnev Studio]]
- 응용: [[War-Commander-Combat-Ecosystem]] · [[War-Commander-Event-Operations]]
- Adjacent: [[Code Splitting  Lazy Loading (코드 분할 및 지연 로딩)]] · [[Server Architecture]]

## 🤖 LLM 활용
**언제**: skill OTA 파이프라인 설계, manifest schema 검토, asset versioning.
**언제 X**: built-in only static skill 게임 — pipeline overhead 불필요.

## ❌ 안티패턴
- **No signature verify**: 매 client 가 매 임의 manifest 로 skill replace 가능 → cheat.
- **No hash check**: 매 corrupted asset → 매 silent crash.
- **All-or-nothing load**: 매 single asset 실패 → 매 entire skill 사용 불가 (fallback 누락).
- **Cache poisoning**: CDN edge 의 stale manifest → version drift.

## 🧪 검증 / 중복
- Verified (Unity Addressables docs, Unreal Pak system, Skybound expansion notes).
- 신뢰도 B.

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — manifest schema + 7 patterns + OTA flow |
