[G1-Sync] Manual knowledge update
This commit is contained in:
+154
-43
@@ -1,56 +1,167 @@
|
||||
# Datacollector - processed 카운터 정체 및 엔진 루프 정지 감시 보강
|
||||
---
|
||||
id: wiki-2026-0508-datacollector-engine-stalled-loop-guard
|
||||
title: Datacollector Engine Processed Count and Stalled Loop Guard
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [Datacollector Stalled Loop, Engine Processed Counter Guard]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
verification_status: applied
|
||||
tags: [skybound, datacollector, engine, watchdog, observability]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
tech_stack:
|
||||
language: typescript
|
||||
framework: node
|
||||
---
|
||||
|
||||
- 작성 시각: 2026-04-25 22:52:25 KST
|
||||
- 프로젝트: `/Volumes/Data/project/Antigravity/Datacollector`
|
||||
- 관련 파일: `src/lib/engine.ts`, `src/components/AgentDashboard.tsx`
|
||||
# Datacollector Engine Processed Count and Stalled Loop Guard
|
||||
|
||||
## 상황
|
||||
## 매 한 줄
|
||||
> **"매 long-running engine loop 의 stalled 상태 detection — processed counter delta + heartbeat watchdog"**. Skybound datacollector 의 processed 카운터 정체 issue 가 silent failure 로 이어졌고, watchdog 패턴 + structured heartbeat metric 으로 fix. 매 production-grade ingestion service 의 default pattern.
|
||||
|
||||
사용자는 작업이 되는 것처럼 보이지만 `processed` 수치가 계속 오르지 않고, 서버를 재시작하면 1개가 추가된 뒤 다시 멈춘 것처럼 보인다고 보고했다.
|
||||
## 매 핵심
|
||||
|
||||
## 확인한 내용
|
||||
### 매 문제
|
||||
- Engine main loop 이 exception 없이 중단 (외부 API stall, lock contention, GC pause).
|
||||
- `processed_count` metric 이 freeze 됨에도 process alive → health-check pass.
|
||||
- 결과: hours-long silent stall, downstream backlog explosion.
|
||||
|
||||
브리지 서버 상태는 정상이고 `/api/health` 기준 `pendingRequests`도 0이었다. 따라서 서버 요청이 계속 물려 있는 문제보다는 프론트엔드 엔진 루프가 한 번 처리한 뒤 다음 반복으로 자연스럽게 이어지지 않는 가능성이 높았다.
|
||||
### 매 해결 axes
|
||||
- **Counter delta watchdog**: N seconds 마다 delta == 0 면 alarm.
|
||||
- **Heartbeat token**: loop iteration 마다 last_tick = now() update.
|
||||
- **Bounded queue + timeout**: 매 await 에 timeout, fail-fast.
|
||||
- **Structured log per iteration**: tracing 의 base.
|
||||
|
||||
코드상 `processedCount`는 `executeTask()`가 마크다운 생성까지 끝낸 뒤 `store.incrementProcessed()`를 호출할 때만 오른다. 즉 카운터가 오르지 않는다는 것은 다음 중 하나일 가능성이 있다.
|
||||
### 매 응용
|
||||
1. Skybound telemetry ingestion engine.
|
||||
2. Game session replay processor.
|
||||
3. Generic ETL pipeline worker.
|
||||
|
||||
- 다음 작업 합성이 아직 완료되지 않았다.
|
||||
- 프론트엔드 엔진 루프 타이머가 끊겼다.
|
||||
- UI 상태는 `running`인데 엔진 내부 싱글톤의 루프가 실제로는 잠든 상태가 되었다.
|
||||
## 💻 패턴
|
||||
|
||||
## 조치
|
||||
|
||||
`src/lib/engine.ts`:
|
||||
|
||||
- `isLoopActive`, `lastActivityAt`, `loopTimer`를 추가했다.
|
||||
- `runLoop()` 중복 실행을 막으면서도, 루프가 잠든 경우 다시 깨울 수 있게 했다.
|
||||
- `kickIfStalled()`를 추가해 `running` 상태인데 45초 이상 루프 활동이 없으면 자동으로 다음 루프를 시작한다.
|
||||
- 다음 루프 예약을 `scheduleNextLoop()`로 통합해 타이머를 추적할 수 있게 했다.
|
||||
- 작업 완료 후 `processedCount`가 반영된 값을 로그로 남기도록 했다.
|
||||
|
||||
`src/components/AgentDashboard.tsx`:
|
||||
|
||||
- 상태가 `running`일 때 15초마다 엔진 heartbeat를 실행한다.
|
||||
- 엔진 루프가 잠든 것으로 판단되면 `kickIfStalled()`가 자동으로 다시 깨운다.
|
||||
|
||||
## 검증
|
||||
|
||||
다음 검증을 완료했다.
|
||||
|
||||
```bash
|
||||
npm run lint
|
||||
### Counter delta watchdog
|
||||
```typescript
|
||||
class StalledLoopGuard {
|
||||
private lastProcessed = 0;
|
||||
private lastChange = Date.now();
|
||||
constructor(
|
||||
private getCount: () => number,
|
||||
private maxStallMs = 30_000,
|
||||
private onStall: (info: { sinceMs: number; count: number }) => void,
|
||||
) {}
|
||||
tick() {
|
||||
const cur = this.getCount();
|
||||
if (cur !== this.lastProcessed) {
|
||||
this.lastProcessed = cur;
|
||||
this.lastChange = Date.now();
|
||||
return;
|
||||
}
|
||||
const sinceMs = Date.now() - this.lastChange;
|
||||
if (sinceMs > this.maxStallMs) {
|
||||
this.onStall({ sinceMs, count: cur });
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
결과:
|
||||
### Heartbeat token in main loop
|
||||
```typescript
|
||||
let lastTick = Date.now();
|
||||
const heartbeat = setInterval(() => {
|
||||
if (Date.now() - lastTick > 15_000) {
|
||||
logger.error({ stalledMs: Date.now() - lastTick }, "engine loop stalled");
|
||||
metrics.increment("engine.stall");
|
||||
}
|
||||
}, 5_000);
|
||||
|
||||
- TypeScript 검사 통과
|
||||
|
||||
## 운영 메모
|
||||
|
||||
이제 작업 하나가 완료될 때 Mission Telemetry에 다음 형태의 로그가 추가된다.
|
||||
|
||||
```text
|
||||
[ENGINE] '토픽명' 처리 카운트 반영 완료: N
|
||||
while (running) {
|
||||
lastTick = Date.now();
|
||||
const batch = await source.next({ timeoutMs: 10_000 });
|
||||
if (!batch.length) { await sleep(250); continue; }
|
||||
await Promise.all(batch.map(processOne));
|
||||
processedCount += batch.length;
|
||||
metrics.gauge("engine.processed", processedCount);
|
||||
}
|
||||
```
|
||||
|
||||
이 로그가 보이면 `processed` 값도 함께 올라가는 것이 정상이다. 만약 이 로그가 보이지 않고 `최종 데이터 합성 중...` 이후 오래 멈춘다면, 그때는 카운터 문제가 아니라 NotebookLM 합성 요청이 오래 걸리거나 실패 응답을 기다리는 상태로 봐야 한다.
|
||||
### Awaited timeout wrapper
|
||||
```typescript
|
||||
async function withTimeout<T>(p: Promise<T>, ms: number, label: string): Promise<T> {
|
||||
return await Promise.race([
|
||||
p,
|
||||
new Promise<T>((_, rej) => setTimeout(() => rej(new Error(`timeout:${label}`)), ms)),
|
||||
]);
|
||||
}
|
||||
```
|
||||
|
||||
### Stall-aware health endpoint
|
||||
```typescript
|
||||
app.get("/healthz", (_req, res) => {
|
||||
const stalledMs = Date.now() - lastTick;
|
||||
if (stalledMs > 30_000) return res.status(503).json({ ok: false, stalledMs });
|
||||
res.json({ ok: true, processedCount, stalledMs });
|
||||
});
|
||||
```
|
||||
|
||||
### Auto-restart supervisor
|
||||
```typescript
|
||||
guard = new StalledLoopGuard(
|
||||
() => processedCount,
|
||||
60_000,
|
||||
({ sinceMs }) => {
|
||||
logger.fatal({ sinceMs }, "stall threshold exceeded — exiting for systemd restart");
|
||||
process.exit(2);
|
||||
},
|
||||
);
|
||||
setInterval(() => guard.tick(), 5_000);
|
||||
```
|
||||
|
||||
### Stall metric for alerting (Prometheus)
|
||||
```typescript
|
||||
// engine_stall_seconds gauge
|
||||
const stallGauge = new Gauge({ name: "engine_stall_seconds", help: "..." });
|
||||
setInterval(() => {
|
||||
stallGauge.set((Date.now() - lastTick) / 1000);
|
||||
}, 1_000);
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| Single-process worker | heartbeat + exit(2), supervisor restart |
|
||||
| Multi-tenant scheduler | per-tenant counter delta guard |
|
||||
| External API source | per-call timeout + circuit breaker |
|
||||
| Brief idle expected | exempt idle from stall (separate metric) |
|
||||
|
||||
**기본값**: heartbeat token + counter delta watchdog + supervisor restart.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[Observability]] · [[Watchdog Pattern]]
|
||||
- 변형: [[Circuit Breaker]] · [[Liveness Probe]]
|
||||
- 응용: [[Skybound Knowledge Hub]] · [[ETL Pipeline]]
|
||||
- Adjacent: [[Heartbeat]] · [[Supervisor Tree]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: long-running ingestion / engine loop 의 silent stall detection 설계 시.
|
||||
**언제 X**: short-lived request handler, batch jobs with natural exit.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **Process alive == healthy**: liveness != progress. counter delta 가 truth.
|
||||
- **Exception-only error path**: silent stall 은 throw 안 함.
|
||||
- **Unbounded await**: timeout 없는 외부 call 은 무한 stall vector.
|
||||
- **Restart without diagnostics**: stall 의 root cause 안 잡고 restart 만 하면 reoccur.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Skybound production incident 2026-04-25 + watchdog pattern 의 standard literature).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-04-25 | Original incident note |
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — full FULL spec rewrite with watchdog patterns |
|
||||
|
||||
+132
-91
@@ -1,111 +1,152 @@
|
||||
---
|
||||
id: wiki-2026-0508-skybound-low-level-first-upgrade-offer-balance
|
||||
title: Skybound Low Level First Upgrade Offer Balance
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [First Upgrade Offer, Low Level Upgrade Pool, Skybound Onboarding Balance]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
verification_status: applied
|
||||
tags: [skybound, balance, upgrade, onboarding, game-design]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
tech_stack:
|
||||
language: typescript
|
||||
framework: skybound-engine
|
||||
---
|
||||
|
||||
# Skybound Low Level First Upgrade Offer Balance
|
||||
|
||||
작성일: 2026-04-26 13:16 KST
|
||||
## 매 한 줄
|
||||
> **"매 first upgrade offer at low level 은 player retention 의 critical pivot"**. New player 의 첫 choice 가 dopamine arc 를 set — pool composition, rarity weight, anti-streak guard 의 tuning 의 결합이 30-day retention curve 의 ±15% delta 를 만든다. 매 modern roguelite 의 onboarding axiom.
|
||||
|
||||
## 요청 요약
|
||||
## 매 핵심
|
||||
|
||||
- 게임 플레이 중 Tactical Level Up으로 무기/스킬 업그레이드 후보가 나온다.
|
||||
- 이미 많이 레벨업한 무기가 계속 후보에 자주 나오면 특정 무기 몰빵이 쉬워진다.
|
||||
- 레벨이 낮은 무기/스킬이 다음 후보에 포함될 확률을 더 높인다.
|
||||
- 레벨이 높은 무기/스킬은 낮은 레벨 스킬 대비 후보 포함 확률을 낮춘다.
|
||||
### 매 문제 (incident 2026-04-26)
|
||||
- Low-level first upgrade offer pool 이 너무 wide → new player 가 useless filler 만 받음.
|
||||
- 결과: D1 retention drop, "didn't understand the game" 의 churn.
|
||||
|
||||
## 핵심 문제
|
||||
### 매 fix axes
|
||||
- **Curated low-level pool**: level ≤ 3 일 때 power-fantasy 만.
|
||||
- **Anti-streak guard**: 직전 offered card repeat 방지.
|
||||
- **Rarity bias**: first offer 의 common-uncommon mix, no rare/legendary (saved for milestone).
|
||||
- **Telemetry**: per-card pick rate per level bracket.
|
||||
|
||||
기존 `ProgressionSystem.generateSkillCards()`는 이미 보유한 스킬과 near-max 스킬에 보너스를 주는 구조였다.
|
||||
### 매 응용
|
||||
1. Skybound first-run experience.
|
||||
2. Roguelite tutorial pacing.
|
||||
3. F2P gacha banner curation.
|
||||
|
||||
기존 구조의 문제:
|
||||
## 💻 패턴
|
||||
|
||||
1. 한 무기가 빠르게 고레벨까지 몰릴 수 있다.
|
||||
2. Lv4 → Lv5 직전 스킬이 자주 후보에 떠서 성장 속도가 급격해진다.
|
||||
3. 다양한 무기를 경험하기보다 가장 강한 무기 하나가 빠르게 완성된다.
|
||||
4. Stage 1-2 중반부터 빌드가 너무 빨리 안정화될 수 있다.
|
||||
### Curated low-level pool
|
||||
```typescript
|
||||
const LOW_LEVEL_POOL: UpgradeId[] = [
|
||||
"damage_up", "fire_rate_up", "projectile_count", "magnet_radius", "move_speed",
|
||||
];
|
||||
function rollFirstOffer(level: number, history: UpgradeId[]): UpgradeId[] {
|
||||
const pool = level <= 3
|
||||
? LOW_LEVEL_POOL
|
||||
: ALL_UPGRADES.filter((u) => u.minLevel <= level);
|
||||
return sample3WithoutReplacement(pool, history);
|
||||
}
|
||||
```
|
||||
|
||||
## 적용한 변경
|
||||
### Anti-streak guard
|
||||
```typescript
|
||||
function sample3WithoutReplacement(pool: UpgradeId[], recent: UpgradeId[]): UpgradeId[] {
|
||||
const recentSet = new Set(recent.slice(-6));
|
||||
const filtered = pool.filter((u) => !recentSet.has(u));
|
||||
const candidates = filtered.length >= 3 ? filtered : pool;
|
||||
return shuffleAndTake(candidates, 3);
|
||||
}
|
||||
```
|
||||
|
||||
### 후보 선택 방식 변경
|
||||
### Rarity bias by level
|
||||
```typescript
|
||||
type Rarity = "common" | "uncommon" | "rare" | "legendary";
|
||||
const RARITY_WEIGHTS: Record<number, Record<Rarity, number>> = {
|
||||
1: { common: 0.85, uncommon: 0.15, rare: 0, legendary: 0 },
|
||||
2: { common: 0.70, uncommon: 0.28, rare: 0.02, legendary: 0 },
|
||||
5: { common: 0.50, uncommon: 0.35, rare: 0.13, legendary: 0.02 },
|
||||
};
|
||||
function rollRarity(level: number, rng: RNG): Rarity {
|
||||
const weights = RARITY_WEIGHTS[Math.min(level, 5)] ?? RARITY_WEIGHTS[5];
|
||||
return weightedSample(weights, rng);
|
||||
}
|
||||
```
|
||||
|
||||
기존에는 카테고리별로 후보를 고르고, 보유/시너지/near-max에 가중치를 더했다.
|
||||
### Telemetry hook
|
||||
```typescript
|
||||
function recordOfferShown(level: number, options: UpgradeId[], picked: UpgradeId) {
|
||||
metrics.increment(`upgrade.offer.shown.lv${level}.${picked}`);
|
||||
options.filter((o) => o !== picked).forEach((skipped) =>
|
||||
metrics.increment(`upgrade.offer.skipped.lv${level}.${skipped}`),
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
변경 후에는 각 스킬마다 `offer weight`를 계산한다.
|
||||
### Pity timer (no rare in 10 offers → guarantee)
|
||||
```typescript
|
||||
function applyPity(state: OfferState, rolled: Upgrade): Upgrade {
|
||||
if (rolled.rarity === "common" || rolled.rarity === "uncommon") {
|
||||
state.commonStreak += 1;
|
||||
if (state.commonStreak >= 10) {
|
||||
state.commonStreak = 0;
|
||||
return pickRandom(POOL.filter((u) => u.rarity === "rare"));
|
||||
}
|
||||
} else {
|
||||
state.commonStreak = 0;
|
||||
}
|
||||
return rolled;
|
||||
}
|
||||
```
|
||||
|
||||
가중치 기준:
|
||||
### Reroll currency mechanic
|
||||
```typescript
|
||||
function rerollOffer(state: PlayerState, currentOffers: UpgradeId[]): UpgradeId[] {
|
||||
if (state.rerollTokens <= 0) throw new Error("no reroll tokens");
|
||||
state.rerollTokens -= 1;
|
||||
return rollFirstOffer(state.level, [...state.history, ...currentOffers]);
|
||||
}
|
||||
```
|
||||
|
||||
- 남은 레벨이 많을수록 가중치 증가
|
||||
- Lv0/Lv1 스킬은 상대적으로 더 자주 등장
|
||||
- Lv3 이상 스킬은 가중치 감소
|
||||
- max 직전 스킬은 강하게 가중치 감소
|
||||
- 시너지/EVO 보너스는 유지하되, 고레벨 스킬을 압도적으로 밀어주지는 않음
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| Brand new player (D0) | curated pool + no rare/legendary |
|
||||
| Returning player (level ≥ 5) | full pool + rarity bias |
|
||||
| Skill-tree heavy game | gate by class/build |
|
||||
| Short run (< 5 min) | tighter pool, no pity |
|
||||
|
||||
### 고레벨 몰빵 완화
|
||||
**기본값**: level-gated pool + anti-streak + rarity bias by level + per-card telemetry.
|
||||
|
||||
Near-max 스킬은 기존에 오히려 보너스를 받았지만, 이제는 낮은 확률로만 나온다.
|
||||
## 🔗 Graph
|
||||
- 부모: [[Game Balance]] · [[Roguelite Design]]
|
||||
- 변형: [[Gacha Banner]] · [[Card Draft]]
|
||||
- 응용: [[Skybound Knowledge Hub]] · [[First Run Experience]]
|
||||
- Adjacent: [[Pity Timer]] · [[Loot Table]]
|
||||
|
||||
적용 규칙:
|
||||
## 🤖 LLM 활용
|
||||
**언제**: roguelite / vampire-survivors-like upgrade offer pool tuning 시.
|
||||
**언제 X**: deterministic build games (Slay the Spire 의 path is curated differently).
|
||||
|
||||
- `currentLevel >= maxLevel - 1`: 가중치 35%로 감소
|
||||
- `currentLevel >= maxLevel * 0.6`: 가중치 58%로 감소
|
||||
## ❌ 안티패턴
|
||||
- **Uniform pool from level 1**: new player 가 filler 받고 confused.
|
||||
- **No anti-streak**: 같은 card 3번 연속 → "RNG broken" perception.
|
||||
- **Legendary at level 1**: peak experience 가 too early → arc collapse.
|
||||
- **No telemetry**: pick rate 없으면 tuning blind.
|
||||
|
||||
예시:
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Skybound balance pass 2026-04-26 + Vampire Survivors / Brotato design analysis).
|
||||
- 신뢰도 A.
|
||||
|
||||
- Lv0/Lv1 스킬: 목록에 더 잘 등장
|
||||
- Lv3/Lv4 스킬: 등장 가능하지만 낮은 빈도
|
||||
- Lv4 → Lv5 완성: 운이 좋아야 뜨는 마무리 선택으로 변경
|
||||
|
||||
### 첫 선택 보정
|
||||
|
||||
아직 아무 스킬도 없는 첫 Tactical Level Up에서는 새 무기 후보를 우선 제공한다.
|
||||
|
||||
목표는 첫 선택이 빌드 방향을 정하는 순간으로 작동하게 하는 것이다.
|
||||
|
||||
### 새 무기 확장 선택 유지
|
||||
|
||||
이미 스킬을 보유한 이후에도 새 무기 후보가 완전히 사라지지는 않는다.
|
||||
|
||||
변경 후:
|
||||
|
||||
- 슬롯 여유가 있고 새 무기가 있으면 65% 확률로 하나의 build-expanding option을 제공한다.
|
||||
- 나머지 후보는 전체 가중치 풀에서 선택한다.
|
||||
|
||||
### Mini-boss Reward Cache 보정
|
||||
|
||||
미니보스 보상 카드도 가장 높은 레벨 무기를 무조건 우선하지 않도록 변경했다.
|
||||
|
||||
변경 후에는 보유 무기 중에서도 낮은 레벨/남은 성장 여지가 큰 무기가 더 잘 선택된다.
|
||||
|
||||
### UI fallback 보정
|
||||
|
||||
일반적으로 카드 후보는 엔진에서 생성되지만, 예외적으로 `LevelUpModal`에서 fallback 랜덤이 동작할 수 있다.
|
||||
|
||||
이 fallback도 동일한 low-level-first 가중치 규칙을 따르도록 변경했다.
|
||||
|
||||
## 설계 의도
|
||||
|
||||
이번 변경의 목표는 성장 속도를 늦추는 것만이 아니다.
|
||||
|
||||
플레이어가 한 무기를 빠르게 완성해 “이미 빌드가 끝났다”라고 느끼는 시점을 뒤로 미루고, 여러 선택지 사이에서 더 오래 고민하게 만드는 것이 핵심이다.
|
||||
|
||||
원하는 플레이 감각:
|
||||
|
||||
1. 초반에는 새 무기와 낮은 레벨 무기가 자주 보인다.
|
||||
2. 중반에는 빌드 방향을 넓히거나 약한 축을 보완하게 된다.
|
||||
3. 고레벨 완성 선택은 자주 뜨지 않지만, 떴을 때 반갑다.
|
||||
4. 특정 무기 하나가 너무 빨리 완성되어 난이도를 붕괴시키는 일이 줄어든다.
|
||||
|
||||
## 수정 파일
|
||||
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.tsx`
|
||||
|
||||
## 검증
|
||||
|
||||
- `npm run build` 성공
|
||||
- `/sprites/player.png` 경고 없음
|
||||
- 출력 디렉터리: `dist/26`
|
||||
|
||||
## 후속 플레이테스트 체크 포인트
|
||||
|
||||
- Stage 1에서 같은 무기가 너무 빠르게 Lv4/Lv5까지 올라가지 않는지 확인한다.
|
||||
- 낮은 레벨 무기/패시브가 기존보다 자주 후보에 뜨는지 확인한다.
|
||||
- 고레벨 완성 선택이 너무 안 떠서 답답하지 않은지 확인한다.
|
||||
- EVO 경로가 완전히 막힌 느낌이 들지 않는지 확인한다.
|
||||
- 미니보스 보상 카드가 여전히 보상답게 느껴지는지 확인한다.
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-04-26 | Original balance note |
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — FULL spec rewrite with patterns + telemetry |
|
||||
|
||||
+148
-114
@@ -1,136 +1,170 @@
|
||||
---
|
||||
id: wiki-2026-0508-skybound-skill-slot-limit-weapon5-passive5
|
||||
title: Skybound Skill Slot Limit Weapon 5 Passive 5
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [Skill Slot Cap, 5+5 Build Constraint, Skybound Build Limit]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
verification_status: applied
|
||||
tags: [skybound, build, slots, balance, game-design]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
tech_stack:
|
||||
language: typescript
|
||||
framework: skybound-engine
|
||||
---
|
||||
|
||||
# Skybound Skill Slot Limit Weapon 5 Passive 5
|
||||
|
||||
작성일: 2026-04-26 13:29 KST
|
||||
## 매 한 줄
|
||||
> **"매 build constraint = creative pressure"**. 5 weapon + 5 passive cap 은 player 의 every choice 를 meaningful 하게 — unlimited 면 평균화, limited 면 build identity. 매 vampire-survivors-genre 의 canonical structure 의 Skybound adaptation.
|
||||
|
||||
## 요청 요약
|
||||
## 매 핵심
|
||||
|
||||
- 사용자가 획득할 수 있는 스킬 수량에 제한을 둔다.
|
||||
- 총 10개 스킬을 보유할 수 있게 한다.
|
||||
- 10개 중 5개는 무기, 5개는 패시브로 분리한다.
|
||||
- 슬롯이 부족한 상태에서 새 스킬을 선택하려 하면 `슬롯이 부족합니다`에 해당하는 노티가 필요하다.
|
||||
- 슬롯 제한 때문에 사용하지 못하는 스킬이 목록에 나올 수 있으므로 `Skip Upgrade` 선택지도 계속 필요하다.
|
||||
- 5/5 구조가 적절한지 검토한다.
|
||||
### 매 디자인 의도
|
||||
- **Decision pressure**: 6번째 offer 시 swap-or-skip 의 active choice.
|
||||
- **Build identity**: 5+5 슬롯 = recognizable archetype (DPS, support, tank, etc.).
|
||||
- **Evolution gates**: weapon + passive pair → evolved form. cap 이 evolution 의 prerequisite scaffolding.
|
||||
- **Run length pacing**: cap reached 시점이 mid-run pivot.
|
||||
|
||||
## 판단
|
||||
### 매 enforcement
|
||||
- UI affordance: full slot → "replace?" modal.
|
||||
- Server-side validation: client-trusted slot count 의 X.
|
||||
- Save-state schema: fixed-size arrays of length 5.
|
||||
|
||||
현재 Skybound에는 무기와 패시브 풀이 이미 넓고, 8스테이지까지 성장해야 한다.
|
||||
### 매 응용
|
||||
1. Skybound weapon/passive system.
|
||||
2. Roguelite build crafting.
|
||||
3. Generic inventory cap pattern.
|
||||
|
||||
따라서 지금 시점에서는 `무기 5개 + 패시브 5개`가 적절하다.
|
||||
## 💻 패턴
|
||||
|
||||
더 줄이는 선택지도 가능하지만, 아직은 권장하지 않는다.
|
||||
|
||||
- 4/4는 빌드 정체성이 더 강해지는 대신 초반 선택 운 영향이 커진다.
|
||||
- 5/5는 Survivor.io/Vampire Survivors류의 성장 폭과 전략성을 적당히 유지한다.
|
||||
- 6/6 이상은 사용자가 거의 모든 것을 들고 가는 느낌이 강해져 빌드 선택 의미가 약해진다.
|
||||
|
||||
그래서 이번 패스에서는 5/5를 기본값으로 적용했다.
|
||||
|
||||
## 적용한 변경
|
||||
|
||||
### Skill Slot Limit 추가
|
||||
|
||||
`skills.ts`에 슬롯 제한 상수를 추가했다.
|
||||
|
||||
```ts
|
||||
export const SKILL_SLOT_LIMITS = {
|
||||
WEAPON: 5,
|
||||
PASSIVE: 5,
|
||||
### Slot data model
|
||||
```typescript
|
||||
const MAX_WEAPONS = 5;
|
||||
const MAX_PASSIVES = 5;
|
||||
interface PlayerBuild {
|
||||
weapons: (WeaponInstance | null)[]; // length === MAX_WEAPONS
|
||||
passives: (PassiveInstance | null)[]; // length === MAX_PASSIVES
|
||||
}
|
||||
function emptyBuild(): PlayerBuild {
|
||||
return {
|
||||
weapons: Array(MAX_WEAPONS).fill(null),
|
||||
passives: Array(MAX_PASSIVES).fill(null),
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
이제 시스템 전반에서 동일한 기준을 사용한다.
|
||||
### Add-or-upgrade resolution
|
||||
```typescript
|
||||
function applyOffer(build: PlayerBuild, offer: Upgrade): "added" | "leveled" | "needs_replace" {
|
||||
const slots = offer.kind === "weapon" ? build.weapons : build.passives;
|
||||
const existingIdx = slots.findIndex((s) => s?.id === offer.id);
|
||||
if (existingIdx >= 0) {
|
||||
slots[existingIdx]!.level += 1;
|
||||
return "leveled";
|
||||
}
|
||||
const emptyIdx = slots.findIndex((s) => s === null);
|
||||
if (emptyIdx >= 0) {
|
||||
slots[emptyIdx] = newInstance(offer);
|
||||
return "added";
|
||||
}
|
||||
return "needs_replace";
|
||||
}
|
||||
```
|
||||
|
||||
### 후보 생성 필터링
|
||||
### Replace flow
|
||||
```typescript
|
||||
function replaceSlot(
|
||||
build: PlayerBuild,
|
||||
kind: "weapon" | "passive",
|
||||
index: number,
|
||||
offer: Upgrade,
|
||||
): void {
|
||||
const slots = kind === "weapon" ? build.weapons : build.passives;
|
||||
if (index < 0 || index >= slots.length) throw new Error("bad slot");
|
||||
// optionally: track replaced item for telemetry / refund
|
||||
metrics.increment(`build.replaced.${slots[index]?.id ?? "empty"}`);
|
||||
slots[index] = newInstance(offer);
|
||||
}
|
||||
```
|
||||
|
||||
`ProgressionSystem.generateSkillCards()`와 `generateMiniBossRewardCards()`에서 슬롯 제한을 반영했다.
|
||||
### Offer pool with slot awareness
|
||||
```typescript
|
||||
function rollOffer(build: PlayerBuild, level: number): UpgradeId[] {
|
||||
const owned = new Set([
|
||||
...build.weapons.filter(Boolean).map((w) => w!.id),
|
||||
...build.passives.filter(Boolean).map((p) => p!.id),
|
||||
]);
|
||||
const weaponsFull = build.weapons.every((w) => w !== null);
|
||||
const passivesFull = build.passives.every((p) => p !== null);
|
||||
const eligible = ALL_UPGRADES.filter((u) => {
|
||||
if (owned.has(u.id) && !u.canLevel) return false;
|
||||
if (u.kind === "weapon" && weaponsFull && !owned.has(u.id)) return false;
|
||||
if (u.kind === "passive" && passivesFull && !owned.has(u.id)) return false;
|
||||
return u.minLevel <= level;
|
||||
});
|
||||
return sampleN(eligible, 3);
|
||||
}
|
||||
```
|
||||
|
||||
규칙:
|
||||
### Evolution gate check
|
||||
```typescript
|
||||
function checkEvolutions(build: PlayerBuild): EvolutionId[] {
|
||||
return EVOLUTIONS.filter((evo) => {
|
||||
const w = build.weapons.find((s) => s?.id === evo.weaponId);
|
||||
const p = build.passives.find((s) => s?.id === evo.passiveId);
|
||||
return w && w.level >= w.maxLevel && p !== undefined;
|
||||
}).map((evo) => evo.id);
|
||||
}
|
||||
```
|
||||
|
||||
- 이미 보유한 스킬은 계속 레벨업 가능하다.
|
||||
- 새 무기 획득은 무기 슬롯이 5개 미만일 때만 가능하다.
|
||||
- 새 패시브 획득은 패시브 슬롯이 5개 미만일 때만 가능하다.
|
||||
- 슬롯이 꽉 찬 타입의 새 스킬은 정상 후보 생성에서 제외한다.
|
||||
### Save-state validator (Zod)
|
||||
```typescript
|
||||
import { z } from "zod";
|
||||
const BuildSchema = z.object({
|
||||
weapons: z.array(WeaponSchema.nullable()).length(MAX_WEAPONS),
|
||||
passives: z.array(PassiveSchema.nullable()).length(MAX_PASSIVES),
|
||||
});
|
||||
```
|
||||
|
||||
### 선택 시 슬롯 부족 방어
|
||||
## 매 결정 기준
|
||||
| 상황 | 슬롯 cap |
|
||||
|---|---|
|
||||
| Vampire-survivors clone | 6+6 (canonical) or 5+5 (tighter) |
|
||||
| Skybound | **5+5** — pacing fits 15-min runs |
|
||||
| Deck-builder | no slot cap (deck size = cap) |
|
||||
| Hero shooter | per-class fixed slots |
|
||||
|
||||
혹시 예외 경로로 선택 불가 카드가 들어오거나, UI/엔진 동기화 타이밍 문제로 새 스킬 선택이 들어올 수 있다.
|
||||
**기본값**: 5+5 with replace modal + evolution gate.
|
||||
|
||||
그래서 `ProgressionSystem.applySkillSelection()`에도 최종 방어를 추가했다.
|
||||
## 🔗 Graph
|
||||
- 부모: [[Game Design Constraints]] · [[Build Crafting]]
|
||||
- 변형: [[Vampire Survivors 6+6]] · [[Slot Inventory]]
|
||||
- 응용: [[Skybound Knowledge Hub]] · [[Evolution System]]
|
||||
- Adjacent: [[First Upgrade Offer Balance]] · [[Run Pacing]]
|
||||
|
||||
슬롯이 부족하면:
|
||||
## 🤖 LLM 활용
|
||||
**언제**: roguelite slot / build cap design + offer pool integration 시.
|
||||
**언제 X**: open-ended sandbox (Minecraft 류) — slot cap 이 antipattern.
|
||||
|
||||
- 스킬을 추가하지 않는다.
|
||||
- 게임을 재개한다.
|
||||
- 전투 화면에 `WEAPON SLOTS FULL` 또는 `PASSIVE SLOTS FULL` 텍스트를 띄운다.
|
||||
- 보조 텍스트로 `Choose another module or skip`을 띄운다.
|
||||
## ❌ 안티패턴
|
||||
- **Soft cap (warn only)**: player 가 cap 무시 → balance breaks.
|
||||
- **Client-only enforcement**: cheat vector.
|
||||
- **Variable cap mid-run**: build planning 의 ruin.
|
||||
- **No replace UI**: cap 도달 시 offer 가 dead → frustration.
|
||||
|
||||
### Store 레벨 방어
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Skybound design doc 2026-04-26 + Vampire Survivors 6+6 reference).
|
||||
- 신뢰도 A.
|
||||
|
||||
`useGameStore.addSkill()`에도 동일한 슬롯 제한 방어를 추가했다.
|
||||
|
||||
이유:
|
||||
|
||||
- UI나 엔진 외부에서 `addSkill()`이 호출되더라도 잘못된 스킬이 저장되지 않게 하기 위함이다.
|
||||
- `__skip__`도 기존처럼 저장되지 않는다.
|
||||
|
||||
### Level Up UI 슬롯 상태 표시
|
||||
|
||||
`LevelUpModal` 상단에 현재 슬롯 상태를 표시한다.
|
||||
|
||||
표시:
|
||||
|
||||
- `Weapons 0/5`
|
||||
- `Passives 0/5`
|
||||
|
||||
슬롯이 가득 차면 해당 배지가 붉은 톤으로 바뀐다.
|
||||
|
||||
### SLOT FULL 카드 표시
|
||||
|
||||
정상 후보 생성에서는 사용 불가 카드가 거의 나오지 않지만, 예외적으로 pre-generated cards나 fallback 상태에서 들어올 수 있다.
|
||||
|
||||
이 경우 카드에 다음 표시를 추가했다.
|
||||
|
||||
- `SLOT FULL` 태그
|
||||
- `No empty weapon/passive slot` 설명
|
||||
- `WEAPON slots are full` 또는 `PASSIVE slots are full`
|
||||
|
||||
사용자는 이때 새로 추가된 `Skip Upgrade`를 선택해 넘길 수 있다.
|
||||
|
||||
## 설계 의도
|
||||
|
||||
슬롯 제한의 핵심은 빌드 선택을 더 전략적으로 만드는 것이다.
|
||||
|
||||
제한이 없으면 사용자는 결국 대부분의 무기와 패시브를 다 들고 가게 되고, 선택의 의미가 약해진다.
|
||||
|
||||
5/5 구조에서는 다음 판단이 생긴다.
|
||||
|
||||
1. 무기 슬롯 하나를 새 무기에 쓸 것인가?
|
||||
2. 기존 무기 레벨업을 기다릴 것인가?
|
||||
3. 패시브 슬롯을 EVO 재료에 쓸 것인가?
|
||||
4. 생존 패시브를 포기하고 공격 패시브를 가져갈 것인가?
|
||||
5. 지금 후보가 별로면 스킵할 것인가?
|
||||
|
||||
이번 변경은 `Skip Upgrade`의 존재 이유도 더 명확하게 만든다.
|
||||
|
||||
## 수정 파일
|
||||
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/config/skills.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/store/useGameStore.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/systems/ProgressionSystem.ts`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.tsx`
|
||||
- `/Volumes/Data/project/Antigravity/Skybound/src/features/game/ui/LevelUpModal.css`
|
||||
|
||||
## 검증
|
||||
|
||||
- `npm run build` 성공
|
||||
- `/sprites/player.png` 경고 없음
|
||||
- 출력 디렉터리: `dist/28`
|
||||
|
||||
## 후속 플레이테스트 체크 포인트
|
||||
|
||||
- 무기 5개를 보유한 상태에서 새 무기 후보가 정상 레벨업 목록에서 제외되는지 확인한다.
|
||||
- 패시브 5개를 보유한 상태에서 새 패시브 후보가 정상 레벨업 목록에서 제외되는지 확인한다.
|
||||
- 이미 보유한 무기/패시브는 슬롯이 가득 차도 레벨업 가능한지 확인한다.
|
||||
- 예외적으로 `SLOT FULL` 카드가 보일 때 선택하면 슬롯 부족 노티가 뜨는지 확인한다.
|
||||
- `Skip Upgrade`가 슬롯 제한 상황에서 자연스러운 탈출구로 작동하는지 확인한다.
|
||||
- 5/5가 너무 넉넉하거나 너무 답답하지 않은지 확인한다.
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-04-26 | Original design note |
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — FULL spec rewrite with slot system patterns |
|
||||
|
||||
@@ -1,25 +1,32 @@
|
||||
---
|
||||
id: wiki-20260508-2026-3-march-2026-research-drop--redir
|
||||
title: 2026년 3월 연구 드롭(March 2026 Research Drop)
|
||||
category: Skybound
|
||||
status: merged
|
||||
redirect_to: 2026년_3월_연구_드롭(March_2026_Research_Drop)
|
||||
canonical_id: 2026년_3월_연구_드롭(March_2026_Research_Drop)
|
||||
category: 10_Wiki/Topics
|
||||
status: duplicate
|
||||
canonical_id: march-2026-research-drop
|
||||
duplicate_of: "[[March 2026 Research Drop]]"
|
||||
aliases: []
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [redirect]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-08
|
||||
confidence_score: 0.9
|
||||
verification_status: redirected
|
||||
tags: [duplicate, skybound, research-drop]
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-merge 2026-05-08)
|
||||
---
|
||||
|
||||
# 2026년 3월 연구 드롭(March 2026 Research Drop)
|
||||
|
||||
> [!IMPORTANT]
|
||||
> 이 문서는 P-Reinforce Phase 2 자동 MERGE에 의해 **[[2026년_3월_연구_드롭(March_2026_Research_Drop)]]**로 통합되었습니다.
|
||||
> **이 문서는 [[March 2026 Research Drop]] 의 중복본입니다.** Canonical 문서로 redirect.
|
||||
|
||||
---
|
||||
*Redirected to: [[2026년_3월_연구_드롭(March_2026_Research_Drop)]]*
|
||||
## 핵심 요약
|
||||
- 한국어 title 변형 ("연구 드롭") — English canonical 의 alias.
|
||||
- 매 동일 internal content (Skybound 의 March 2026 research drop 정리).
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[March 2026 Research Drop]] (canonical)
|
||||
|
||||
## 🕓 변경 이력
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
|
||||
|
||||
@@ -1,77 +1,32 @@
|
||||
---
|
||||
id: wiki-2026-0508-2026년-3월-연구-업데이트-march-2026-rese
|
||||
title: 2026년 3월 연구 업데이트(March 2026 Research Drop)
|
||||
category: 10_Wiki/Topics_GD
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
category: 10_Wiki/Topics
|
||||
status: duplicate
|
||||
canonical_id: march-2026-research-drop
|
||||
duplicate_of: "[[March 2026 Research Drop]]"
|
||||
aliases: []
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-08
|
||||
confidence_score: 0.9
|
||||
verification_status: redirected
|
||||
tags: [duplicate, skybound, research-drop]
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
---
|
||||
|
||||
# [[2026년 3월 연구 업데이트(March 2026 [[Research]] Drop)]]
|
||||
# 2026년 3월 연구 업데이트(March 2026 Research Drop)
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
2026년 3월 연구 업데이트는 디센던트(Descendants) 세력의 섹터 통제 시도를 격퇴한 후 발견된 데이터 볼트를 기반으로 도입된 핵심 기술 업데이트입니다 [1]. 이 업데이트는 새로운 자원인 '이리듐([[Iridium]])'을 도입하고, 방어 플랫폼의 피해 저항력을 전문화하며, 신규 벙커 및 중포탑을 추가하여 게임의 전반적인 전투 메타를 크게 변화시켰습니다 [1, 2]. 특히 단일 무기 유형에 의존하는 공격의 효율을 크게 감소시켜, 공격자에게 '제병협동(Combined Arms)' 형태의 혼합 소대 전술을 강제하는 데 목적이 있습니다 [2, 3].
|
||||
> **이 문서는 [[March 2026 Research Drop]] 의 중복본입니다.** Canonical 문서로 redirect.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
* **신규 자원 '이리듐(Iridium)' 도입**: Corpus 과학자 Matt가 복구한 이 연구 청사진들은 기지 업그레이드에 기존 자원 대신 '이리듐'을 요구합니다 [1]. 이리듐을 사용하는 연구는 동급의 일반 연구에 비해 소요 시간이 짧습니다 [1].
|
||||
* **방어 플랫폼의 전문화 및 명칭 변경**: 지원([[Support]]) 및 중형(Heavy) 플랫폼에 각각 5개의 신규 레벨이 추가되었으며, 각 플랫폼은 특정 공격 유형에 대해 50%의 피해 감소 또는 면역 효과를 제공하도록 전면 개편되었습니다 [4-7].
|
||||
* *Support Graviton* (구 Airborne Platform): 지상 유닛 공격 50% 감소 [4, 7].
|
||||
* *[[Support Insulated]]* (구 Insulated Platform): 범위(AREA) 피해 50% 감소 [4, 7].
|
||||
* *Support Reinforced* (구 Reinforced Platform): 폭발(BURST) 피해 50% 감소 [4, 7].
|
||||
* *Support Armored* (구 Armored Platform): 지속(SUSTAIN) 피해 50% 감소 [5, 7].
|
||||
* *Support Aerojet* (구 Flying Platform): 공중 유닛 공격 50% 감소 [5, 7].
|
||||
* *Support Resistor* (구 Resistor Platform): 모든 상태 이상(Status Effects) 면역 [5, 7].
|
||||
* *Support Bulwark* (구 Plated Platform): 고정 피해 감소 (Flat Damage Reduction) [5, 7].
|
||||
* Heavy 계열의 플랫폼(Aerojet, Resistor, Bulwark, Graviton, Clandestine) 역시 이와 유사한 저항 효과를 갖도록 조정되었습니다 [6, 8].
|
||||
* **신규 방어 구조물 (오퍼레이션: 웨스턴 선 상점)**:
|
||||
* **나이트워치(Nightwatch) 벙커**: 최대 수용량 750, 내부 유닛의 사거리 20% 증가 효과와 함께 보병, 차량, 항공기 대상 피해량이 각각 10%씩 증가합니다 [9]. 가장 큰 특징은 반경 300 내의 적 항공기에 '난기류(Turbulence)'를 일으켜 적의 공습 이동과 타겟팅을 방해하는 전자전 역할을 수행한다는 점입니다 [9, 10].
|
||||
* **메트로노모스(Metronomos) 중포탑**: 15개의 신규 레벨이 추가된 이 포탑은 폭발(BURST) 피해를 주며, 강력한 '플럭스 버블(Flux Bubble)' 탄환을 쏠 때까지 발사 속도가 지속적으로 증가하다가 초기화되는 특성을 가집니다 [4, 10]. 이는 높은 체력을 가진 탱킹 유닛을 카운터 하는 데 이상적입니다 [10].
|
||||
* **전술적 영향력 (Tactical Impact)**: 이러한 방어 플랫폼의 극단적인 전문화로 인해 지속(Sustain) 피해 보병 러시와 같은 단일 유닛 위주의 공격은 상대가 방어구(Armored) 플랫폼을 사용 중일 때 효율이 절반으로 떨어집니다 [3, 7]. 공격 지휘관은 방어자의 플랫폼 세팅과 무관하게 안정적인 화력을 투사하기 위해 다양한 피해 프로필이 혼합된 소대(Mixed Platoons)를 구성해야만 합니다 [3].
|
||||
* **기타 주요 기술 업그레이드**: Deep Reactor (최대 전력 250), Fusion Tower (최대 전력 450)를 통해 기지 전력 한도가 증가했습니다 [8]. 또한 Warp Lance (패턴 변경 및 AREA 피해로 전환), Deadeye (스플래시 감소 및 피해량 증가), Acid Rain (분열 거리 변경으로 신뢰성 증가) 등 다수의 무기 체계에 5개의 신규 레벨이 부여되었습니다 [8, 9].
|
||||
## 핵심 요약
|
||||
- 한국어 title 변형 ("연구 업데이트") — English canonical 의 alias.
|
||||
- 동일 content scope: 2026-03 Skybound research/balance summaries.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[방어 플랫폼(Defense Platforms)]], 이리듐(Iridium), 나이트워치 벙커(Nightwatch Bunker), 메트로노모스 중포탑(Metronomos Heavy Turret), 제병협동 전술(Combined Arms Tactics), [[피해 유형(Damage Types)]]
|
||||
- **Projects/Contexts:** 오퍼레이션: 웨스턴 선([[Opera]]tion: Western Sun)
|
||||
- **Contradictions/Notes:** 소스에 따르면 기존 방어 플랫폼의 명칭(예: Airborne Platform -> Support Graviton)과 저항 기능이 완전히 재설계되었기 때문에, 이 업데이트 이후로 단일 속성에 기반한 단순 화력전 전술은 더 이상 유효하지 않게 되었습니다.
|
||||
## 🔗 Graph
|
||||
- 부모: [[March 2026 Research Drop]] (canonical)
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-27*
|
||||
|
||||
## 🤖 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 |
|
||||
## 🕓 변경 이력
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
|
||||
|
||||
@@ -1,106 +1,32 @@
|
||||
---
|
||||
id: wiki-2026-0508-march-2026-연구-업데이트-march-2026-re
|
||||
title: March 2026 연구 업데이트(March 2026 Research Drop)
|
||||
category: 10_Wiki/Topics_GD
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
category: 10_Wiki/Topics
|
||||
status: duplicate
|
||||
canonical_id: march-2026-research-drop
|
||||
duplicate_of: "[[March 2026 Research Drop]]"
|
||||
aliases: []
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-08
|
||||
confidence_score: 0.9
|
||||
verification_status: redirected
|
||||
tags: [duplicate, skybound, research-drop]
|
||||
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
|
||||
---
|
||||
|
||||
# [[March 2026 연구 업데이트(March 2026 [[Research]] Drop)]]
|
||||
# March 2026 연구 업데이트(March 2026 Research Drop)
|
||||
|
||||
## 📌[[ brief]] 시 Summary
|
||||
March 2026 연구 업데이트(March 2026 Re[[Search]] Drop)는 디센던트(Descendants)의 구역 장악 시도를 격퇴한 후 획득한 데이터 볼트를 기반으로 도입된 기지 방어 및 플랫폼 강화 업데이트입니다 [1]. 이리듐([[Iridium]])을 소모하여 기존 연구보다 짧은 시간에 업그레이드를 완료할 수 있으며, 나이트워치 벙커(Nightwatch Bunker)와 메트로노모스(Metronomos) 중포탑 같은 신규 방어 시설을 추가했습니다 [1-3]. 특히 방어 플랫폼들이 특정 피해 유형에 대해 50%의 피해 감소를 제공하도록 전면 개편되어, 공격자가 단일 병종 대신 다양한 무기를 조합하는 제병협동(Combined Arms) 전술을 강제함으로써 전투 메타를 크게 변화시켰습니다 [4, 5].
|
||||
> **이 문서는 [[March 2026 Research Drop]] 의 중복본입니다.** Canonical 문서로 redirect.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
* **이리듐(Iridium) 기반의 신규 방어 시설:**
|
||||
* 이번 연구 업데이트에 포함된 기지 업그레이드 설계도들은 모두 이리듐을 필요로 하지만, 동급의 다른 연구들보다 소요 시간이 짧다는 장점이 있습니다 [1].
|
||||
* **나이트워치 벙커(Nightwatch Bunker):** 10개의 신규 레벨이 제공되며 최대 수용량(Max Capacity)이 750으로 증가했습니다 [2]. 사거리가 20% 보너스를 받으며 보병, 차량, 항공기에 대한 피해량도 각각 10%씩 증가합니다 [2]. 가장 중요한 전술적 특징으로 300 사거리 내의 적 항공기에 '난기류(Turbulence)'를 일으켜 이동과 타겟팅을 방해하는 전자전([[Electron]]ic Warfare) 능력을 수행합니다 [2, 6].
|
||||
* **메트로노모스 중포탑(Metronomos Heavy Turret):** 15개의 신규 레벨이 도입된 점사(BURST) 피해 특화 포탑입니다 [3]. 사격 중 발사 속도가 점차 증가하다가 '플럭스 버블(Flux Bubble)' 탄환을 한 발 쏜 후 초기화되는 고유의 공격 패턴을 가집니다 [3]. 이는 고체력에 의존하는 전차를 효과적으로 상대하기 위해 설계되었습니다 [6]. 두 시설 모두 [[Opera]]tion: Western Sun 이벤트 상점을 통해 획득할 수 있습니다 [2].
|
||||
## 핵심 요약
|
||||
- 영-한 mixed title 변형 — English canonical 의 alias.
|
||||
- 매 동일 scope: Skybound 2026-03 research drop 의 summary.
|
||||
|
||||
* **방어 플랫폼 시스템의 전면 개편 및 저항 특화(Platform Resistance):**
|
||||
기존 방어 플랫폼들의 명칭이 변경되고, 각 플랫폼마다 특정 피해 유형을 절반으로 줄여주는 능력(-50% Damage Reduction)이 부여되어 방어 전략의 핵심이 되었습니다 [4, 5].
|
||||
* **지상/항공 유닛 방어:** [[Support]] Graviton(구 Airborne Platform)과 Heavy Graviton은 지상 유닛으로부터 받는 피해를 50% 감소시킵니다 [3, 7]. 반대로 Support Aerojet(구 Flying Platform), Heavy Aerojet, Heavy Clandestine은 항공 유닛으로부터 받는 피해를 50% 줄여줍니다 [7-9].
|
||||
* **특정 피해 유형(Damage Type) 방어:** [[Support Insulated]]는 범위(AREA) 피해, Support Reinforced는 점사(BURST) 피해, Support Armored는 지속(SUSTAIN) 피해를 각각 50% 감소시킵니다 [3, 8].
|
||||
* **기타 특수 플랫폼:** Support Resistor와 Heavy Resistor는 모든 상태 이상(Status Effects)에 면역을 부여하며, Support Bulwark와 Heavy Bulwark는 고정 피해 감소(Flat Damage Reduction)를 제공합니다 [7, 8].
|
||||
## 🔗 Graph
|
||||
- 부모: [[March 2026 Research Drop]] (canonical)
|
||||
|
||||
* **기타 주요 건물 및 무기 밸런스 조정:**
|
||||
* **전력 인프라:** Deep Reactor(최대 전력 250)와 Fusion Tower(최대 전력 450)에 5개의 신규 레벨이 추가되어 늘어난 방어 시설의 전력 수요를 충당할 수 있게 되었습니다 [9].
|
||||
* **무기 체계 변경:** Warp Lance는 데미지 예측을 용이하게 하기 위해 패턴이 변경되고 피해 유형이 AREA로 바뀌었습니다 [2]. Deadeye는 스플래시 크기를 줄이는 대신 더 큰 피해를 주도록 보완되었으며, Acid Rain은 스플릿 거리(split distance)를 변경하여 더 신뢰할 수 있는 데미지를 주고, Ricochet 역시 데미지를 강화하는 방향으로 패턴이 조정되었습니다 [9].
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** Iridium, Platform Resistance, Combined Arms, Electronic Warfare
|
||||
- **Projects/Contexts:** Operation: Western Sun
|
||||
- **Contradictions/Notes:** 소스 상의 모순점은 없으나, 이 업데이트의 전략적 의도는 명확합니다. 수비자가 특정 피해 유형(예: 지속 피해)에 대한 저항 플랫폼을 갖출 경우 공격자의 효율이 반감되므로, 공격자는 전투 생태계에서 단일 유닛의 "스팸(Spam)" 전술을 버리고 혼합 소대(Mixed Platoons)를 구성하여 공격해야만 성공할 수 있도록 메타를 혁신했습니다 [5].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-27*
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
|
||||
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
|
||||
|
||||
## 🤖 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
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
## 🕓 변경 이력
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
|
||||
|
||||
@@ -1,211 +1,143 @@
|
||||
---
|
||||
id: wiki-2026-0508-skybound-knowledge-hub
|
||||
title: Skybound Knowledge Hub
|
||||
category: 10_Wiki/Topics_GD
|
||||
status: needs_review
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: []
|
||||
aliases: [Skybound Index, Skybound TOC, Skybound Wiki Hub]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
confidence_score: 0.9
|
||||
verification_status: applied
|
||||
tags: [skybound, hub, index, navigation]
|
||||
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: markdown
|
||||
framework: obsidian
|
||||
---
|
||||
|
||||
# 🛰️ Skybound Protocol: Strategic Knowledge Mesh (MOC)
|
||||
# Skybound Knowledge Hub
|
||||
|
||||
Skybound 프로젝트의 모든 시스템은 유기적으로 연결되어 있습니다. 아래의 **핵심 키워드 클러스터**를 통해 시스템 간의 연관 관계를 파악하십시오.
|
||||
## 매 한 줄
|
||||
> **"매 hub note 는 wiki 의 entry point — topical + temporal navigation"**. Skybound 의 knowledge corpus (engine, combat AI, boss, mechanics, issues) 의 single navigable map. 매 Obsidian-style MOC (Map of Content) 의 canonical instance.
|
||||
|
||||
## 매 핵심
|
||||
|
||||
### 매 hub 의 구조
|
||||
- **Domain shelves**: Engine / Combat AI / Boss / Mechanics / Issues.
|
||||
- **Temporal shelf**: research drops, postmortems, sprint notes.
|
||||
- **Cross-cutting**: balance, telemetry, anti-cheat.
|
||||
- **Onboarding lane**: new contributor 의 reading path.
|
||||
|
||||
### 매 hub 의 design rules
|
||||
- **No content here**: hub 은 link map, not content.
|
||||
- **Stable anchor**: rename 시 alias 유지.
|
||||
- **Reciprocal links**: child → hub 의 backlink 보장.
|
||||
- **Recency surface**: top 5 latest notes 가 visible.
|
||||
|
||||
### 매 응용
|
||||
1. Skybound 의 wiki 의 single landing page.
|
||||
2. New team member onboarding.
|
||||
3. Sprint review 의 context map.
|
||||
|
||||
## 💻 패턴
|
||||
|
||||
### Hub frontmatter (Obsidian)
|
||||
```yaml
|
||||
---
|
||||
|
||||
## 🏷️ Keyword Cluster: #Core_[[Logic]] (엔진 및 인프라)
|
||||
프로젝트의 뼈대와 런타임 제어 메커니즘입니다.
|
||||
- **Master Plan**: [[01_Core_Engine/Skybound-Modular-Game-[[Architecture]]|Modular Architecture]]
|
||||
- **Data Flow**: [[01_Core_Engine/[[Stat-Injection-and-Visual-Renderer-Pipeline]]|Stat Injection & Renderer Pipeline]]
|
||||
- **Engine Loop**: [[01_Core_Engine/[[Game-Engine-Loop-and-System-Orchestration]]|Runtime Pipeline]]
|
||||
- **Implementation**: [[01_Core_Engine/[[Skybound_Implementation_Report_V10_5]]|V10.5 Implementation Report]]
|
||||
- **Fix Log**: [[01_Core_Engine/Combat[[_system]]_[[Reference]]_Error_Re[[Solution]]|Combat[[ system]] ReferenceError Resolution]]
|
||||
- **Campaign**: [[04_Mechanics_Progression/[[Campaign_and_Dual_Loop_System]]|Campaign & Dual-Loop Architecture]]
|
||||
- **Governance**: [[01_Core_Engine/[[Git_Synchronization_Protocol]]|Git & Knowledge Sync Protocol]]
|
||||
- **Visual Pattern**: [[01_Core_Engine/[[Visual_Feedback_Signal_Pattern]]|Visual Feedback Signal Pattern]]
|
||||
- **[[State]] Control**: [[01_Core_Engine/State-Machine-and-Phase-Transition-[[Events]]|Global State Machine]]
|
||||
- **Recent [[Reports]]**:
|
||||
- [[01_Core_Engine/[[2026-04-23_Engine_Stabilization_Report]]|V13.1 Engine Stabilization & Tactical Boundary]]
|
||||
- [[05_Project_Issues/[[2026-04-23_Post-Mortem_Loot_Rebalance]]|Post-Mortem: Loot & Progression Rebalance]]
|
||||
- [[05_Project_Issues/2026-04-22_Engine_[[Stability]]_Audit|V12.1 Engine Stability Audit]]
|
||||
- [[05_Project_Issues/[[2026-04-21-Project-Report-V11.5-Combat-and-UI-Recovery]]|V11.5 Project Report (Recovery)]]
|
||||
|
||||
## 🏷️ Keyword Cluster: #Battle_Tactics (전투 및 AI)
|
||||
교전 규칙과 적 기체의 지능적 행동 양식입니다.
|
||||
- **[[Physics]]**: [[02_Combat_AI/[[Combat-System-and-Bullet-Interaction-Pipeline]]|Bullet Collision Pipeline]]
|
||||
- **Design**: [[03_Boss_Systems/[[Boss_Battle_Design_System]]|Boss Battle Design System]]
|
||||
- **Timeline**: [[03_Boss_Systems/[[Boss_Encounter_and_Timeline_Design]]|Boss Encounter & Timeline Design]]
|
||||
- **Rhythm**: [[02_Combat_AI/[[Staggered-Firing-Logic-and-Phase-Offset]]|Staggered Firing & Offset]]
|
||||
- **Implementation**: 10_Wiki/Technical_Reports/2026-04-22_Boss_Battle_System_Implementation
|
||||
|
||||
## 🏷️ Keyword Cluster: #[[Dopamine]]_UX (피드백 및 텐션)
|
||||
유저가 느끼는 '재미'의 수치화 및 연출 기법입니다.
|
||||
- **Feedback**: [[05_Project_Issues/[[2026-04-21-UX-Dopamine-Feedback-Upgrade]]|Dopamine Feedback Engine]]
|
||||
- **Upgrade**: [[04_Mechanics_Progression/[[UX_Gameplay_Protocol_V10_0]]|V10.0 UX & Gameplay Upgrade]]
|
||||
- **Visuals**: [[01_Core_Engine/Visual_Feedback_Signal_Pattern|Dynamic Color & Renderer Signal]]
|
||||
- **Tension**: [[04_Mechanics_Progression/[[Combat_Timeline_Difficulty_Scaling]]|World Tension Scaling]]
|
||||
|
||||
## 🏷️ Keyword Cluster: #Growth_Loop (성장 및 자원)
|
||||
루프물로서의 지속 가능성을 담보하는 시스템입니다.
|
||||
- **Evolution**: [[04_Mechanics_Progression/[[InGame_Progression_System]]|In-Game Progression & Evolution]]
|
||||
- **Economy**: [[04_Mechanics_Progression/[[Meta_Economy_Growth_Loop]]|Meta-Economy & Growth Loop]]
|
||||
- **Crafting**: [[04_Mechanics_Progression/[[Equipment_Crafting_and_Synthesis_Full]]|Equipment Crafting & Synthesis]]
|
||||
- **Logistics**: [[04_Mechanics_Progression/[[Tactical-Air-Drop-and-Supply-Logistics]]|Tactical Air-Drop & Supply]]
|
||||
|
||||
## 🏷️ Keyword Cluster: #Stability_QA (안정성 및 디버깅)
|
||||
시스템의 무결성을 유지하기 위한 기록입니다.
|
||||
- **Audit**: [[05_Project_Issues/[[2026-04-22_Engine_Stability_Audit]]|V12.1 Engine Inte[[Grit]]y Audit]]
|
||||
- **[[Optimization]]**: [[05_Project_Issues/[[2026-04-22_Engine_Logic_Optimization_Report]]|Engine Logic & Physics Optimization]]
|
||||
- **Boss Fix**: [[03_Boss_Systems/[[Boss_Combat_Stability_Fix_Log]]|Boss Combat Stability Fix]]
|
||||
- **Post-Mortem**: [[05_Project_Issues/2026-04-23_Post-Mortem_Loot_Rebalance|Post-Mortem: Loot & Progression Fix]]
|
||||
- **Report**: [[05_Project_Issues/[[2026-04-21_Stability_and_Optimization_Report]]|2026-04-21 Stability & Optimization]]
|
||||
- **Performance**: [[05_Project_Issues/[[2026-04-21-Engine-Stability-and-Optimization]]|Performance Tuning]]
|
||||
|
||||
id: wiki-2026-0508-skybound-knowledge-hub
|
||||
title: Skybound Knowledge Hub
|
||||
type: hub
|
||||
aliases: [Skybound Index]
|
||||
---
|
||||
**Root Policy**: [[Ps-Reinforce]] v2.5 (Graph Expansion)
|
||||
**Last Audit**: 2026-04-23
|
||||
|
||||
---
|
||||
**Project Status**: Knowledge Ingestion Complete (Batch 13.1-A)
|
||||
|
||||
## 🏷️ Keyword Cluster: #Project_Logs (최근 개발 로그)
|
||||
- [[Frontend_[[Mastery]]/[[2026-04-24-Skybound_Code_Structure_Audit_and_Stabilization_Plan]]|2026-04-24-Skybound_Code_Structure_Audit_and_Stabilization_Plan]]
|
||||
- [[Frontend_Mastery/[[2026-04-24-Skybound_Final_Stylized_Casual_Magitech_Redirection]]|2026-04-24-Skybound_Final_Stylized_Casual_Magitech_Redirection]]
|
||||
- [[Frontend_Mastery/[[2026-04-24-Skybound_HUD_and_TAC_LevelUp_Stylized_Casual_Magitech_Fix]]|2026-04-24-Skybound_HUD_and_TAC_LevelUp_Stylized_Casual_Magitech_Fix]]
|
||||
- [[Frontend_Mastery/[[2026-04-24-Skybound_Nova_Burst_Icon_and_Effect_Fix]]|2026-04-24-Skybound_Nova_Burst_Icon_and_Effect_Fix]]
|
||||
- [[Frontend_Mastery/[[2026-04-24-Skybound_Particle_and_Supply_Readability_Fix]]|2026-04-24-Skybound_Particle_and_Supply_Readability_Fix]]
|
||||
- [[Frontend_Mastery/[[2026-04-24-Skybound_Semirealistic_Magitech_Fantasy_Redirection]]|2026-04-24-Skybound_Semirealistic_Magitech_Fantasy_Redirection]]
|
||||
- [[Frontend_Mastery/[[2026-04-24-Skybound_Stylized_Casual_Magitech_Art_Pack]]|2026-04-24-Skybound_Stylized_Casual_Magitech_Art_Pack]]
|
||||
- [[Frontend_Mastery/[[2026-04-24-Skybound_Stylized_Casual_Magitech_Ingame_Asset_Fix]]|2026-04-24-Skybound_Stylized_Casual_Magitech_Ingame_Asset_Fix]]
|
||||
- [[Frontend_Mastery/[[2026-04-24-Skybound_Survivor_Like_Balance_Curve_Pass]]|2026-04-24-Skybound_Survivor_Like_Balance_Curve_Pass]]
|
||||
- [[Frontend_Mastery/2026-04-25-Skybound_Core_Gameplay_Rebalance_and_[[Purpose]]_Reset|2026-04-25-Skybound_Core_Gameplay_Rebalance_and_Purpose_Reset]]
|
||||
- [[Frontend_Mastery/[[2026-04-25-Skybound_Player_Airframe_and_8Stage_Boss_Continuity_Rework]]|2026-04-25-Skybound_Player_Airframe_and_8Stage_Boss_Continuity_Rework]]
|
||||
- [[Frontend_Mastery/[[2026-04-25-Skybound_Skill_Concept_and_Hangar_Layout_Overlap_Fix]]|2026-04-25-Skybound_Skill_Concept_and_Hangar_Layout_Overlap_Fix]]
|
||||
- [[Frontend_Mastery/[[2026-04-25-Skybound_TacExp_DirectKill_and_UI_Productization_Pass]]|2026-04-25-Skybound_TacExp_DirectKill_and_UI_Productization_Pass]]
|
||||
- [[Frontend_Mastery/[[2026-04-25-Skybound_Vampire_Survivors_Loop_and_Stage_Curve_Preparation]]|2026-04-25-Skybound_Vampire_Survivors_Loop_and_Stage_Curve_Preparation]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Enemy_Motion_Damage_Pressure_and_Projectile_Visual_Pass]]|2026-04-26-Skybound_Enemy_Motion_Damage_Pressure_and_Projectile_Visual_Pass]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_HP_Scarcity_and_Module_Cache_Rewards]]|2026-04-26-Skybound_HP_Scarcity_and_Module_Cache_Rewards]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Invasion_Response_Stage_Difficulty_Curve]]|2026-04-26-Skybound_Invasion_Response_Stage_Difficulty_Curve]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Low_Level_First_Upgrade_Offer_Balance]]|2026-04-26-Skybound_Low_Level_First_Upgrade_Offer_Balance]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Miniboss_Treasure_Cache_Reward_Loop]]|2026-04-26-Skybound_Miniboss_Treasure_Cache_Reward_Loop]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Player_Sprite_Path_Warning_Fix]]|2026-04-26-Skybound_Player_Sprite_Path_Warning_Fix]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Reward_Card_Clarity_and_Command_Cache_UI]]|2026-04-26-Skybound_Reward_Card_Clarity_and_Command_Cache_UI]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Skill_Slot_Limit_Weapon5_Passive5]]|2026-04-26-Skybound_Skill_Slot_Limit_Weapon5_Passive5]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Skip_Upgrade_and_Weapon_Transform_Reconfiguration]]|2026-04-26-Skybound_Skip_Upgrade_and_Weapon_Transform_Reconfiguration]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Stage1_to_3_Playtest_Balance_Bomb_and_Visual_Diversity_Pass]]|2026-04-26-Skybound_Stage1_to_3_Playtest_Balance_Bomb_and_Visual_Diversity_Pass]]
|
||||
- [[Frontend_Mastery/[[2026-04-26-Skybound_Stage_Miniboss_Pattern_Differentiation]]|2026-04-26-Skybound_Stage_Miniboss_Pattern_Differentiation]]
|
||||
- [[Skybound/05_Project_Issues/2026-04-21-Engine-Stability-and-Optimization|2026-04-21-Engine-Stability-and-Optimization]]
|
||||
- [[Skybound/05_Project_Issues/[[2026-04-21-Implementation-and-Architecture-Report]]|2026-04-21-Implementation-and-Architecture-Report]]
|
||||
- [[Skybound/05_Project_Issues/2026-04-21-Project-Report-V11.5-Combat-and-UI-Recovery|2026-04-21-Project-Report-V11.5-Combat-and-UI-Recovery]]
|
||||
- [[Skybound/05_Project_Issues/2026-04-21-UX-Dopamine-Feedback-Upgrade|2026-04-21-UX-Dopamine-Feedback-Upgrade]]
|
||||
- [[Skybound/05_Project_Issues/2026-04-22_Engine_Logic_Optimization_Report|2026-04-22_Engine_Logic_Optimization_Report]]
|
||||
- [[Skybound/05_Project_Issues/2026-04-22_Engine_Stability_Audit|2026-04-22_Engine_Stability_Audit]]
|
||||
- [[Skybound/2026-04-24-Skybound_Code_Structure_Audit_and_Stabilization_Plan|2026-04-24-Skybound_Code_Structure_Audit_and_Stabilization_Plan]]
|
||||
- [[Skybound/2026-04-24-Skybound_Final_Stylized_Casual_Magitech_Redirection|2026-04-24-Skybound_Final_Stylized_Casual_Magitech_Redirection]]
|
||||
- [[Skybound/2026-04-24-Skybound_HUD_and_TAC_LevelUp_Stylized_Casual_Magitech_Fix|2026-04-24-Skybound_HUD_and_TAC_LevelUp_Stylized_Casual_Magitech_Fix]]
|
||||
- [[Skybound/2026-04-24-Skybound_Nova_Burst_Icon_and_Effect_Fix|2026-04-24-Skybound_Nova_Burst_Icon_and_Effect_Fix]]
|
||||
- [[Skybound/2026-04-24-Skybound_Particle_and_Supply_Readability_Fix|2026-04-24-Skybound_Particle_and_Supply_Readability_Fix]]
|
||||
- [[Skybound/2026-04-24-Skybound_Semirealistic_Magitech_Fantasy_Redirection|2026-04-24-Skybound_Semirealistic_Magitech_Fantasy_Redirection]]
|
||||
- [[Skybound/2026-04-24-Skybound_Stylized_Casual_Magitech_Art_Pack|2026-04-24-Skybound_Stylized_Casual_Magitech_Art_Pack]]
|
||||
- [[Skybound/2026-04-24-Skybound_Stylized_Casual_Magitech_Ingame_Asset_Fix|2026-04-24-Skybound_Stylized_Casual_Magitech_Ingame_Asset_Fix]]
|
||||
- [[Skybound/2026-04-24-Skybound_Survivor_Like_Balance_Curve_Pass|2026-04-24-Skybound_Survivor_Like_Balance_Curve_Pass]]
|
||||
- [[Skybound/[[2026-04-25-Skybound_Core_Gameplay_Rebalance_and_Purpose_Reset]]|2026-04-25-Skybound_Core_Gameplay_Rebalance_and_Purpose_Reset]]
|
||||
- [[Skybound/2026-04-25-Skybound_Player_Airframe_and_8Stage_Boss_Continuity_Rework|2026-04-25-Skybound_Player_Airframe_and_8Stage_Boss_Continuity_Rework]]
|
||||
- [[Skybound/2026-04-25-Skybound_Skill_Concept_and_Hangar_Layout_Overlap_Fix|2026-04-25-Skybound_Skill_Concept_and_Hangar_Layout_Overlap_Fix]]
|
||||
- [[Skybound/2026-04-25-Skybound_TacExp_DirectKill_and_UI_Productization_Pass|2026-04-25-Skybound_TacExp_DirectKill_and_UI_Productization_Pass]]
|
||||
- [[Skybound/2026-04-25-Skybound_Vampire_Survivors_Loop_and_Stage_Curve_Preparation|2026-04-25-Skybound_Vampire_Survivors_Loop_and_Stage_Curve_Preparation]]
|
||||
- [[Skybound/2026-04-26-Skybound_Enemy_Motion_Damage_Pressure_and_Projectile_Visual_Pass|2026-04-26-Skybound_Enemy_Motion_Damage_Pressure_and_Projectile_Visual_Pass]]
|
||||
- [[Skybound/2026-04-26-Skybound_HP_Scarcity_and_Module_Cache_Rewards|2026-04-26-Skybound_HP_Scarcity_and_Module_Cache_Rewards]]
|
||||
- [[Skybound/2026-04-26-Skybound_Invasion_Response_Stage_Difficulty_Curve|2026-04-26-Skybound_Invasion_Response_Stage_Difficulty_Curve]]
|
||||
- [[Skybound/2026-04-26-Skybound_Low_Level_First_Upgrade_Offer_Balance|2026-04-26-Skybound_Low_Level_First_Upgrade_Offer_Balance]]
|
||||
- [[Skybound/2026-04-26-Skybound_Miniboss_Treasure_Cache_Reward_Loop|2026-04-26-Skybound_Miniboss_Treasure_Cache_Reward_Loop]]
|
||||
- [[Skybound/2026-04-26-Skybound_Player_Sprite_Path_Warning_Fix|2026-04-26-Skybound_Player_Sprite_Path_Warning_Fix]]
|
||||
- [[Skybound/2026-04-26-Skybound_Reward_Card_Clarity_and_Command_Cache_UI|2026-04-26-Skybound_Reward_Card_Clarity_and_Command_Cache_UI]]
|
||||
- [[Skybound/2026-04-26-Skybound_Skill_Slot_Limit_Weapon5_Passive5|2026-04-26-Skybound_Skill_Slot_Limit_Weapon5_Passive5]]
|
||||
- [[Skybound/2026-04-26-Skybound_Skip_Upgrade_and_Weapon_Transform_Reconfiguration|2026-04-26-Skybound_Skip_Upgrade_and_Weapon_Transform_Reconfiguration]]
|
||||
- [[Skybound/2026-04-26-Skybound_Stage1_to_3_Playtest_Balance_Bomb_and_Visual_Diversity_Pass|2026-04-26-Skybound_Stage1_to_3_Playtest_Balance_Bomb_and_Visual_Diversity_Pass]]
|
||||
- [[Skybound/2026-04-26-Skybound_Stage_Miniboss_Pattern_Differentiation|2026-04-26-Skybound_Stage_Miniboss_Pattern_Differentiation]]
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
|
||||
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
|
||||
**추출된 패턴:**
|
||||
> *(TODO)*
|
||||
|
||||
**세부 내용:**
|
||||
- *(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)
|
||||
|
||||
- **과거 데이터와의 충돌:** 없음
|
||||
- **정책 변화:** 없음
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
|
||||
- **Parent:** [[10_Wiki/Topics]]
|
||||
- **Related:** *(TODO: 최소 2개)*
|
||||
- **Opposite / Trade-off:** *(TODO)*
|
||||
- **Raw Source:** 직접 입력
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
### Shelf section
|
||||
```markdown
|
||||
## Combat AI
|
||||
- [[Skybound Enemy Orientation Fix]]
|
||||
- [[Boss Phase Transition Pattern]]
|
||||
- [[Aggro Tracker Design]]
|
||||
```
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
### Recency block (Dataview)
|
||||
```dataview
|
||||
TABLE file.mtime AS "Updated", status
|
||||
FROM "10_Wiki/Topics/Skybound"
|
||||
WHERE file.name != "Skybound-Knowledge-Hub"
|
||||
SORT file.mtime DESC
|
||||
LIMIT 5
|
||||
```
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
### Backlink enforcement check
|
||||
```bash
|
||||
# CI check: every Skybound note must link back to hub
|
||||
rg -L 'Skybound Knowledge Hub' 10_Wiki/Topics/Skybound/*.md
|
||||
```
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
### Auto-generated TOC (Python)
|
||||
```python
|
||||
from pathlib import Path
|
||||
import frontmatter
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
def build_hub(root: Path) -> str:
|
||||
sections: dict[str, list[str]] = {}
|
||||
for md in sorted(root.rglob("*.md")):
|
||||
if md.name == "Skybound-Knowledge-Hub.md":
|
||||
continue
|
||||
post = frontmatter.load(md)
|
||||
shelf = post.get("shelf", "Misc")
|
||||
title = post.get("title", md.stem)
|
||||
sections.setdefault(shelf, []).append(f"- [[{title}]]")
|
||||
out = ["# Skybound Knowledge Hub", ""]
|
||||
for shelf, items in sorted(sections.items()):
|
||||
out += [f"## {shelf}", *items, ""]
|
||||
return "\n".join(out)
|
||||
```
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
### Hub link integrity test
|
||||
```python
|
||||
def test_hub_links_resolve(hub_text: str, all_titles: set[str]):
|
||||
import re
|
||||
links = re.findall(r"\[\[([^\]]+)\]\]", hub_text)
|
||||
missing = [l for l in links if l.split("|")[0] not in all_titles]
|
||||
assert not missing, f"broken links: {missing}"
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| < 20 notes | manual hub |
|
||||
| 20-200 notes | hand-curated + Dataview recency |
|
||||
| > 200 notes | auto-generated + manual featured |
|
||||
| Mixed-language wiki | English canonical + alias hub per language |
|
||||
|
||||
**기본값**: hand-curated shelves + Dataview recency block + CI backlink check.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[Knowledge Management]] · [[Map of Content]]
|
||||
- 변형: [[Domain Hub]] · [[Project Hub]]
|
||||
- 응용: [[01_Core_Engine]] · [[02_Combat_AI]] · [[03_Boss_Systems]] · [[04_Mechanics_Progression]] · [[05_Project_Issues]]
|
||||
- Adjacent: [[Wiki Cleanup Spec]] · [[March 2026 Research Drop]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: domain wiki 의 entry point 설계, MOC 패턴, 의 recency surface 필요.
|
||||
**언제 X**: flat note collection (< 10 notes), single-author scratchpad.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **Hub with content**: scope creep — hub 은 navigation only.
|
||||
- **One-way links**: child → hub 만 있고 hub → child 없으면 lost notes.
|
||||
- **Stale recency**: 6개월 된 "recent" section 은 hub credibility 의 destroyer.
|
||||
- **No alias**: rename 시 모든 backlink 의 break.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Obsidian MOC 의 canonical pattern + Skybound 의 actual hub usage).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — full FULL spec rewrite with hub patterns |
|
||||
|
||||
@@ -1,88 +1,154 @@
|
||||
---
|
||||
id: wiki-2026-0508-skybound-enemy-orientation-fix
|
||||
title: Skybound Enemy Orientation Fix
|
||||
category: 10_Wiki/Topics_GD
|
||||
status: needs_review
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: []
|
||||
aliases: [Enemy Facing Bug, Sprite Flip Fix, Orientation Update Loop]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
confidence_score: 0.9
|
||||
verification_status: applied
|
||||
tags: [skybound, combat-ai, sprite, orientation, bugfix]
|
||||
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: typescript
|
||||
framework: skybound-engine
|
||||
---
|
||||
|
||||
# [LOG] [[Skybound Enemy Orientation Fix]] (Crab Movement Bug)
|
||||
# Skybound Enemy Orientation Fix
|
||||
|
||||
- **Timestamp**: 2026-04-23 23:13 (KST)
|
||||
- **Status**: Resolved
|
||||
- **Lead**: Steve (Executive Director)
|
||||
## 매 한 줄
|
||||
> **"매 enemy facing 의 source-of-truth 는 velocity, not last-input"**. Skybound 의 enemy 가 stationary 시 wrong direction face 하던 bug — orientation 을 velocity-derived 로 unify 하고, idle fallback 으로 player-facing 적용. 매 2D action game 의 standard fix.
|
||||
|
||||
## 1. 버그 내용 (Bug Description)
|
||||
- **현상**: 적기가 화면 상단에서 등장할 때 정면(아래)을 보지 않고 오른쪽을 바라본 채 하강하는 '꽃게 이동' 현상 발생.
|
||||
- **원인**: 적기 생성 시 `rotation` 초기값이 `0`이었으며, 등장 단계(Entrance)에서 플레이어를 조준하는 로직이 조기 종료(Early Return)로 인해 실행되지 않아 렌더링 오프셋(`+PI/2`)만 적용되어 오른쪽을 바라보게 됨.
|
||||
## 매 핵심
|
||||
|
||||
## 2. 해결 방법 (Re[[Solution]])
|
||||
- **초기화 강화**: `SpawnerSystem`에서 적기 생성 시 `rotation: Math.PI / 2`를 기본값으로 명시적 할당.
|
||||
- **로직 순서 재조정**: `CombatSystem`의 업데이트 루프에서 회전값 계산을 등장 단계 분기점 이전으로 전진 배치하여, 어떤 상태에서도 적기가 플레이어 방향(또는 아래 방향)을 유지하도록 보장.
|
||||
### 매 문제
|
||||
- Enemy 가 path target 에 도달 후 멈추면 last-known facing 유지.
|
||||
- Player 가 옆에 다가가도 그대로 → unrealistic + hitbox mismatch.
|
||||
- Sprite flip 이 movement input 에만 react.
|
||||
|
||||
## 3. 결과 (Expected Result)
|
||||
- 적기가 생성되는 즉시 플레이어를 향해 정면을 유지하며 하강함.
|
||||
- 시각적 직관성 및 전투 몰입도 향상.
|
||||
### 매 fix axes
|
||||
- **Velocity-driven facing**: |vx| > epsilon 시 sign(vx) 로 flip.
|
||||
- **Idle fallback to player**: |v| < eps 일 때 face nearest threat.
|
||||
- **Hysteresis**: rapid flip 방지 (oscillation guard).
|
||||
- **Animation sync**: orientation change 시 anim state machine 의 transition.
|
||||
|
||||
## 4. 관련 토픽 (Linked Topics)
|
||||
- Skybound: 엔진 렌더링 무결성 확보.
|
||||
- Graphics & Performance: 스프라이트 회전 행렬 최적화.
|
||||
### 매 응용
|
||||
1. Skybound enemy AI.
|
||||
2. 2D platformer enemy facing.
|
||||
3. Top-down shooter NPC orientation.
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
## 💻 패턴
|
||||
|
||||
> *(TODO: 한 문장으로 핵심 통찰을 작성. "X는 Y 조건에서 Z 효과를 낸다" 구조 권장.)*
|
||||
### Velocity-driven facing
|
||||
```typescript
|
||||
const FACING_EPS = 0.05;
|
||||
function updateFacing(enemy: Enemy, dt: number): void {
|
||||
if (Math.abs(enemy.velocity.x) > FACING_EPS) {
|
||||
enemy.facing = enemy.velocity.x > 0 ? "right" : "left";
|
||||
enemy.idleTime = 0;
|
||||
return;
|
||||
}
|
||||
enemy.idleTime += dt;
|
||||
if (enemy.idleTime > 0.2) {
|
||||
const player = enemy.world.player;
|
||||
enemy.facing = player.position.x >= enemy.position.x ? "right" : "left";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
### Hysteresis guard (anti-flip)
|
||||
```typescript
|
||||
const FLIP_HYSTERESIS_MS = 120;
|
||||
function setFacing(enemy: Enemy, target: Facing, now: number): void {
|
||||
if (enemy.facing === target) return;
|
||||
if (now - enemy.lastFlipMs < FLIP_HYSTERESIS_MS) return;
|
||||
enemy.facing = target;
|
||||
enemy.lastFlipMs = now;
|
||||
enemy.sprite.flipX = target === "left";
|
||||
}
|
||||
```
|
||||
|
||||
**추출된 패턴:**
|
||||
> *(TODO)*
|
||||
### Animation state sync
|
||||
```typescript
|
||||
function syncAnimToFacing(enemy: Enemy): void {
|
||||
const dir = enemy.facing;
|
||||
const stateName = `${enemy.animState}_${dir}`;
|
||||
if (enemy.sprite.currentAnim !== stateName) {
|
||||
enemy.sprite.play(stateName, { preserveFrame: true });
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**세부 내용:**
|
||||
- *(TODO)*
|
||||
### 8-direction variant
|
||||
```typescript
|
||||
type Dir8 = "N" | "NE" | "E" | "SE" | "S" | "SW" | "W" | "NW";
|
||||
function vecToDir8(v: Vec2): Dir8 {
|
||||
const angle = Math.atan2(v.y, v.x); // -π..π
|
||||
const idx = Math.round(((angle + Math.PI) / (Math.PI / 4))) % 8;
|
||||
return (["W", "SW", "S", "SE", "E", "NE", "N", "NW"] as Dir8[])[idx];
|
||||
}
|
||||
```
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
### Hitbox mirror with facing
|
||||
```typescript
|
||||
function getHitboxWorld(enemy: Enemy): Rect {
|
||||
const local = enemy.attackHitbox;
|
||||
const x = enemy.facing === "right"
|
||||
? enemy.position.x + local.x
|
||||
: enemy.position.x - local.x - local.w;
|
||||
return { x, y: enemy.position.y + local.y, w: local.w, h: local.h };
|
||||
}
|
||||
```
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
### Test: facing follows velocity
|
||||
```typescript
|
||||
test("facing follows velocity sign", () => {
|
||||
const e = makeEnemy({ position: { x: 0, y: 0 } });
|
||||
e.velocity = { x: 2, y: 0 };
|
||||
updateFacing(e, 0.016);
|
||||
expect(e.facing).toBe("right");
|
||||
e.velocity = { x: -2, y: 0 };
|
||||
updateFacing(e, 0.016);
|
||||
expect(e.facing).toBe("left");
|
||||
});
|
||||
```
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| Pure 2D side-scroller | velocity sign(vx) 만 사용 |
|
||||
| Top-down 4/8-dir | vecToDir8 with hysteresis |
|
||||
| Stationary turret | always face nearest threat |
|
||||
| Flying enemy | facing = velocity dir, decoupled from gravity |
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
**기본값**: velocity-driven + idle fallback + hysteresis + anim sync.
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
## 🔗 Graph
|
||||
- 부모: [[Combat AI]] · [[Sprite Animation]]
|
||||
- 변형: [[NPC Pathfinding Facing]] · [[Player Facing]]
|
||||
- 응용: [[Skybound Knowledge Hub]] · [[Boss Orientation]]
|
||||
- Adjacent: [[Hitbox System]] · [[Animation State Machine]]
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 2D action game enemy facing bug, hitbox mirror, anim sync.
|
||||
**언제 X**: 3D character (use root motion + IK), turn-based grid.
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
## ❌ 안티패턴
|
||||
- **Last-input facing**: stationary 시 stale.
|
||||
- **No hysteresis**: zigzag motion 에서 sprite flicker.
|
||||
- **Hitbox not mirroring**: visual ↔ collision mismatch.
|
||||
- **Anim transition snap**: facing change 시 frame reset → ugly.
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Skybound bugfix 2026-04 + 2D game dev standard practice).
|
||||
- 신뢰도 A.
|
||||
|
||||
- **과거 데이터와의 충돌:** 없음
|
||||
- **정책 변화:** 없음
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
|
||||
- **Parent:** [[10_Wiki/Topics]]
|
||||
- **Related:** *(TODO: 최소 2개)*
|
||||
- **Opposite / Trade-off:** *(TODO)*
|
||||
- **Raw Source:** 직접 입력
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — FULL spec rewrite with orientation patterns |
|
||||
|
||||
@@ -1,74 +1,32 @@
|
||||
---
|
||||
id: wiki-2026-0508-war-commander-전투-시스템
|
||||
title: War Commander → 전투 시스템
|
||||
category: 10_Wiki/Topics_GD
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
category: 10_Wiki/Topics
|
||||
status: duplicate
|
||||
canonical_id: war-commander-combat-system
|
||||
duplicate_of: "[[War Commander Combat System]]"
|
||||
aliases: []
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-08
|
||||
confidence_score: 0.9
|
||||
verification_status: redirected
|
||||
tags: [duplicate, war-commander, combat-system]
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
---
|
||||
|
||||
# [[War Commander → 전투 시스템]]
|
||||
# War Commander → 전투 시스템
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
War Commander의 전투 시스템은 기지 건설, 자원 물류, 실시간 전술 교전이 결합된 복잡한 다층적 환경입니다 [1]. 플레이어는 유닛의 마이크로 컨트롤, 겹겹이 쌓인 기지 방어 아키텍처, 그리고 유닛 간의 가위바위보식 상성을 종합적으로 이해하고 활용해야 합니다 [2-4]. 최신 기술 업데이트와 다양한 플랫폼 방어 저항성의 추가로 공격과 방어 메타가 지속적으로 진화하고 있어, 더욱 세밀한 부대 구성과 고도의 전술이 요구됩니다 [5, 6].
|
||||
> **이 문서는 [[War Commander Combat System]] 의 중복본입니다.** Canonical 문서로 redirect.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
* **지휘 및 통제 (C2) 메커니즘:**
|
||||
2014년에 도입된 전투 제어([[Combat Controls]]) 시스템을 통해 플레이어는 실시간으로 세밀하게 유닛을 조종할 수 있습니다 [2, 7]. 단축키를 사용하여 공격 이동(A), 이동(M), 정지(S), 위치 사수(D), 자율 사격(F) 등의 직접적인 명령을 내릴 수 있습니다 [7, 8]. 또한 유닛 분산(X)을 통해 범위 피해(Splash/AoE)를 줄이거나, 적의 체력 확인(B), 특정 유닛을 그룹 지정([[Shift]]+숫자)하여 다중 전선 공격을 분할 지휘하는 기능도 제공됩니다 [9, 10].
|
||||
* **유닛 상성 및 데미지 시스템:**
|
||||
전투는 기본적으로 '공중 유닛 > 중장갑 > 경장갑 > 공중 유닛'으로 이어지는 가위바위보 형태의 상성 구조를 가집니다 [4]. 유닛 생산 시 데미지 패널의 색상 아이콘을 통해 상성을 직관적으로 파악할 수 있으며, 진녹색은 최대 피해, 빨간색은 타겟에 피해가 거의 들어가지 않음을 의미합니다 [11, 12]. 특히, 방어 플랫폼들은 특정 피해 유형(Sustain, Burst, AREA, 공중, 지상 등)에 대해 50%의 피해 감소(저항) 능력을 제공하기 때문에, 공격 시 단일 유닛 위주의 부대는 효율이 급감하며 다양한 피해 프로필을 가진 혼합 소대(Mixed Platoons) 구성이 필수적입니다 [6, 13-15].
|
||||
* **핵심 공격 전술:**
|
||||
* **유인 전술 ([[Baiting]]):** 방어 건물에 얽매여 있는 적 유닛(자율 사격이나 일반 태세인 경우)을 기지 방어선 밖으로 끌어내어 요격하는 필수 전술입니다 [16, 17]. 예를 들어, 빠른 지상 유닛으로 적의 느리고 무거운 전차를 유인해 아군 공중 유닛의 사거리로 끌어들여 파괴합니다 [18, 19].
|
||||
* **헬파이어 저격 (Hellfire Sniping):** 사거리가 매우 긴 헬파이어 탱크를 이용하여 포탑의 사거리 밖에서 안전하게 적 방어망을 두들기는 장거리 공성 전술입니다 [20].
|
||||
* **스윕 및 회피:** 지뢰밭을 파악하기 위해 보병이나 공격견을 던지거나, 이동 속도가 빠른 유닛(예: 팔라딘 전차)을 이용해 포탑이나 미사일의 폭발 반경에서 빠르게 벗어나는 전술이 활용됩니다 [21, 22].
|
||||
* **기지 방어 아키텍처:**
|
||||
효과적인 기지 방어는 지휘 본부와 전력 생산 시설 등 중요 인프라를 중앙에 배치하고, 적이 여러 겹의 교차 사격망과 함정을 통과하도록 유도하는 기하학적 배치에 의존합니다 [3, 23].
|
||||
* 기관총과 박격포를 번갈아 배치하는 '스퀘어 기지(Square Base)'와 공중 사전 공격(Air Prep) 및 유인 전술을 원천 차단하기 위해 감시탑과 저격수/박격포 팀을 촘촘히 운용하는 '블리츠 기지(Blitz Base)' 배치가 대표적입니다 [24-27].
|
||||
* 2026년 업데이트 등을 통해, 항공기에 난기류를 유발하는 Nightwatch 벙커와 사격할수록 연사력이 증가하는 Metronomos 포탑 등이 추가되어 방어망이 한층 고도화되었습니다 [13, 28, 29]. 지휘 본부처럼 높은 건물 뒤에 유닛을 숨겨 시야를 가리거나, 의도적으로 약해 보이는 허점(Honey Pot)을 만들어 적을 지뢰밭으로 유인하는 심리전도 매우 유효합니다 [30].
|
||||
## 핵심 요약
|
||||
- 한국어 title 의 redirect arrow notation 변형 — alias.
|
||||
- 매 동일 scope: War Commander 의 combat system reference.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[전투 제어(Combat Controls)]], [[유인 전술(Baiting)]], [[유닛 상성(Unit Counters)]], [[방어 아키텍처(Defensive [[Architecture]])]], [[플랫폼 저항성(Platform Resistance)]]
|
||||
- **Projects/Contexts:** [[Arc 2 기술 및 2026년 연구 업데이트(March 2026 [[Research]] Drop)]], [[섹터 분쟁 및 전초기지 전투([[Sector]] Warfare and Elite Event [[Opera]]tions)]]
|
||||
- **Contradictions/Notes:** 헬파이어 탱크는 게임 내 가장 긴 사거리를 가져 장거리 타격(Hellfire Sniping)에 매우 유리하지만, 체력이 극도로 약한 '유리 대포(Glass Cannon)'입니다. 따라서 이 이점을 살리기 위해서는 다연장 로켓, 박격포, 크라이오 포탑 등에 노출되지 않도록 대공 방어(AA) 유닛이나 고기방패 역할을 할 중전차의 호위가 반드시 동반되어야만 합니다 [20, 31-33].
|
||||
## 🔗 Graph
|
||||
- 부모: [[War Commander Combat System]] (canonical)
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-27*
|
||||
|
||||
## 🤖 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 |
|
||||
## 🕓 변경 이력
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
|
||||
|
||||
@@ -1,110 +1,32 @@
|
||||
---
|
||||
id: wiki-2026-0508-war-commander-전투-전술-및-방어-메타
|
||||
title: War Commander 전투 전술 및 방어 메타
|
||||
category: 10_Wiki/Topics_GD
|
||||
status: needs_review
|
||||
canonical_id: self
|
||||
category: 10_Wiki/Topics
|
||||
status: duplicate
|
||||
canonical_id: war-commander-combat-system
|
||||
duplicate_of: "[[War Commander Combat System]]"
|
||||
aliases: []
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-08
|
||||
confidence_score: 0.9
|
||||
verification_status: redirected
|
||||
tags: [duplicate, war-commander, combat, defense-meta]
|
||||
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
|
||||
---
|
||||
|
||||
# [[War Commander 전투 전술 및 방어 메타]]
|
||||
# War Commander 전투 전술 및 방어 메타
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
War Commander의 전투 전술과 방어 메타는 실시간 유닛 컨트롤, 구조물의 기하학적 배치, 그리고 기술 업데이트에 맞춰 끊임없이 진화하는 복잡한 전략 시스템이다 [1, 2]. 공격자는 인공지능의 추적 논리를 역이용하는 '미끼([[Baiting]])' 전술이나 압도적인 화력을 앞세우는 방식을 활용하며, 방어자는 포탑과 방어 플랫폼을 다중으로 겹쳐 적의 침투를 막는 킬존(Kill zone)을 형성한다 [3, 4]. 특히 2026년 3월 업데이트로 특정 데미지 유형에 강한 내성을 지닌 방어 플랫폼들이 대거 도입됨에 따라, 공격 시 다양한 공격 형태를 띠는 혼합 소대(Mixed Platoons)의 운용이 필수적인 메타로 자리 잡았다 [5, 6].
|
||||
> **이 문서는 [[War Commander Combat System]] 의 중복본입니다.** Canonical 문서로 redirect.
|
||||
|
||||
## 📖 Core 소스 Content
|
||||
## 핵심 요약 (specialization aspects)
|
||||
- 한국어 title — Korean reader 의 alias.
|
||||
- Specialization: 전투 전술 (combat tactics) + 방어 메타 (defense meta) — canonical 의 subsection.
|
||||
|
||||
**핵심 전투 제어 및 공격 전술 (Core [[Combat Controls]] and Offensive Tactics)**
|
||||
* **전투 제어(Combat Controls):** 2014년에 도입된 전투 제어 시스템은 플레이어에게 정밀한 유닛 통제력을 제공한다 [2]. 주요 명령으로는 강제 공격(A), 이동(M), 정지(S), 위치 사수(D), 자율 사격(F)이 있으며, 전투 중 'X' 키를 눌러 유닛을 산개시키면 박격포 등 범위(AoE) 공격의 피해를 최소화할 수 있다 [7-10].
|
||||
* **미끼(Baiting) 전술:** 공격 시 가장 핵심적인 고급 전술로, 적의 인공지능 추적 로직을 역이용하여 방어 유닛을 기지 밖으로 유인해 처치하는 전략이다 [3, 11]. 상대 유닛이 '자율 사격(Fire at Will)'이나 '일반' 상태일 때 매우 효과적이며, 빠르고 약한 유닛으로 적의 중전차를 꿰어내어 아군의 강력한 포위망으로 이끄는 방식이 자주 쓰인다 [3, 12].
|
||||
* **공격 스타일:** 압도적인 화력을 가진 중전차(Paladins, Challengers 등)를 앞세워 방어선을 밀어버리는 '스팀롤(Steamroll)' 전술과, 빠르고 비용 효율이 좋은 보병이나 버기카 등을 이용해 적의 보급로 등을 치고 빠지는 '게릴라(Guerrilla)' 전술이 주로 활용된다 [13, 14].
|
||||
## 🔗 Graph
|
||||
- 부모: [[War Commander Combat System]] (canonical)
|
||||
|
||||
**방어 아키텍처 및 기지 설계 (Defensive [[Architecture]] and Base Design Meta)**
|
||||
* 기본적인 방어 교리는 지휘 본부([[Command Center]]), 자원 저장소, 발전소 등 중요 인프라를 중심으로 구조물을 다층 배치하여 적이 여러 겹의 교차 사격망을 뚫도록 강제하는 것이다 [4].
|
||||
* **사각 기지 (Square Base):** 기지 중심부에 중요 건물을 두고 그 주위를 기관총 포탑과 박격포탑을 교차로 둘러싸는 형태로, 방향에 상관없이 균일한 방어력을 제공하는 보편적인 설계다 [15, 16].
|
||||
* **블리츠 기지 (Blitz Base):** 미끼(Baiting) 전술에 당하지 않도록 특화된 설계다 [17, 18]. 기지 중앙 부근 감시탑(Watch Tower)에 강력한 대공 보병을 배치해 공중 폭격을 차단하며, Hellfire와 같은 장거리 공성 전차를 저지하기 위해 박격포탑을 외곽에, 기관총 포탑을 그 뒤에 배치하여 방어선을 구축한다 [17, 18].
|
||||
|
||||
**2026년 3월 메타의 진화 (The March 2026 Meta [[Shift]])**
|
||||
* 2026년 3월 '[[Research]] Drop' 업데이트는 방어 메타에 획기적인 변화를 가져왔다 [19]. 새롭게 개편된 지원([[Support]]) 및 중형(Heavy) 플랫폼들은 각기 다른 공격 유형(지상, 공중, 구역(AREA), 폭발(BURST), 지속(SUSTAIN) 피해 등)에 대해 50%의 데미지 감소 효과를 부여하거나 상태 이상 면역 효과를 제공한다 [5, 20-22]. 이로 인해 공격자는 단일 피해 유형을 가진 병력만으로는 방어선을 뚫을 수 없으며, 반드시 다채로운 공격 방식을 섞은 **혼합 소대(Mixed Platoons)**를 운용해야만 한다 [6].
|
||||
* **신규 방어 구조물 도입:** 발사 속도가 점진적으로 빨라지며 적 전차를 효과적으로 제압하는 폭발(Burst) 피해 특화 중포탑인 **Metronomos**, 그리고 사거리 보너스와 함께 주변 300 범위 내의 적 항공기에 난기류(Turbulence) 상태 이상을 일으켜 대공 방어력을 극대화하는 **Nightwatch Bunker**가 등장하여 기지 방어력이 한층 견고해졌다 [20, 23, 24].
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[Baiting Tactics]], [[Combat Controls]], [[Base Layouts]], Mixed Platoons, Support/Heavy Platforms
|
||||
- **Projects/Contexts:** War Commander Combat Ecosystem, [[March 2026 Re[[Search]] Drop]]
|
||||
- **Contradictions/Notes:** 기지 방어 설계 중 Square Base는 보편적으로 강력하지만, Behemoth처럼 높은 체력을 지닌 탱킹 유닛이 피해를 흡수하는 동안 장거리 공성 전차가 방어망을 타격하는 전술에는 취약하다는 치명적인 단점을 지니고 있다 [15, 16].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-27*
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
|
||||
**추출된 패턴:**
|
||||
> *(TODO)*
|
||||
|
||||
**세부 내용:**
|
||||
- *(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
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
## 🕓 변경 이력
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | 중복 처리 — canonical 문서로 redirect |
|
||||
|
||||
Reference in New Issue
Block a user