Files
2nd/00_Raw/2026-04-22_EventPass_NovaBurst_Renderer.md
T

60 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 작업 로그: Event Pass 연동 + Nova Burst Canvas 렌더러 구현
## 📋 작업 내용 (What)
1. **addEventPassPoints 실제 연결**: 보스 처치, 미션 클리어(STAGE_CLEAR), 미션 실패(부분 런) 시 Event Pass 포인트를 실제 게임플레이 이벤트에 연결.
2. **Nova Burst Canvas 링 이펙트**: `GameRenderer`에 20프레임 확장 충격파 링을 4개 레이어로 렌더링하는 `renderNovaBurstEffect` 메서드 구현.
## 🎯 왜 했는지 (Why)
- **패스 포인트가 UI에만 존재**: HangarOverlay에 PASS 탭을 만들었지만 실제 게임플레이에서 포인트를 지급하는 파이프라인이 없었음.
- **Nova Burst 시각 부재**: 스킬 논리(`ModularWeaponSystem`)는 완성됐으나 Canvas 렌더러와 연동되지 않아 플레이어가 충격파를 시각적으로 느끼지 못했음.
## 💡 기대값 (Expected Value)
- 보스 처치 시 스테이지 × 200pts 지급 (Stage 1: 200, Stage 3: 600)
- 스테이지 클리어(STAGE_CLEAR) 시 기본 500 + 스테이지 × 100pts
- 런 실패 시에도 10초당 1pt 지급 → "패배해도 진전이 있다" 심리적 보상
- Nova Burst 발동 시 20프레임(0.33초) 확장 충격파 링 + 스파이크 라인 시각화
## 🔧 처리 과정 (How)
### 1. useGameEngine.ts — 보스 처치 패스 포인트
- `PERMANENT_REWARD` intent 핸들러에 `addEventPassPoints(200 × stage)` 추가.
- 보라색 플로팅 텍스트 `+N PASS PTS` 연출.
### 2. StageDirectorSystem.ts — STAGE_CLEAR 패스 포인트
- `case 'STAGE_CLEAR'``phaseTimer === 1` 시점에 `addEventPassPoints(500 + stage × 100)` 1회 호출.
- phaseTimer === 1 조건으로 중복 지급 완전 차단.
### 3. useGameEngine.ts — 게임오버 부분 런 보상
- 최종 사망 분기에 `Math.floor(frame / 60 / 10)` pts 지급 (10초당 1pt).
- "실패해도 패스 티어가 오른다" UX 확보.
### 4. stateMachine.ts — PhaseTransitionContext 확장
- `addEventPassPoints`, `addGold` 콜백 시그니처 추가 (미래 확장성 확보).
### 5. ModularWeaponSystem.ts — novaBurstRingEffect 신호 생성
- 충격파 발동 시 `state.novaBurstRingEffect = { x, y, radius, level, timer: 20 }` 설정.
- GameRenderer가 이 신호를 읽어 20프레임 동안 링을 렌더링.
### 6. GameRenderer.ts — renderNovaBurstEffect (4레이어 렌더러)
- **레이어 1**: 외부 청록(#00e5ff) 충격파 링 — 두께 4→1px, 글로우 shadow
- **레이어 2**: 내부 흰색 보조 링 (50% 반경, 40% 투명도)
- **레이어 3**: 중심 시안 라디알 플래시 (초기 8프레임만, 빠른 소멸)
- **레이어 4**: 6/8방향 스파이크 라인 (Lv3이면 8개) — 링 바깥으로 뻗는 방출 연출
- `ring.timer--`로 자체 tick하여 별도 상태 관리 불필요.
## 🧠 사용한 지식 (Knowledge Used)
- **Canvas 2D Compositing**: globalAlpha 스택 + save/restore 패턴으로 레이어별 독립적 투명도 관리.
- **RadialGradient API**: createRadialGradient(cx, cy, r0, cx, cy, r1) 패턴으로 중심 플래시 구현.
- **Signal Pattern**: 시스템 간 결합을 최소화하기 위해 state 오브젝트에 임시 신호 필드를 기록하고 렌더러가 읽는 방식.
- **Event Pass Economics**: 보스>클리어>실패 순의 포인트 차등화로 플레이 깊이에 따른 보상 곡선 설계.
## ✅ 결과 (Result)
- TypeScript 에러 0개
- Git Commit: `226eb7c` (feat_event_pass_hooks_nova_burst_canvas_renderer)
- Push: `origin/main`
## 🔗 연결 지식 (Relevant Knowledge)
- E:\Wiki\2nd\10_Wiki\Topics\Game-Design (Event Pass Economy, Consolation Reward)
- E:\Wiki\2nd\10_Wiki\Topics\Software-Architecture (Signal Pattern, System Decoupling)
- E:\Wiki\2nd\10_Wiki\Topics\UI-UX (Canvas Compositing, Visual Feedback Loop)