스카이촛불게임 ⑤ 수집 연출 (빛 흡수 파티클 + 카운터 팝 + 레벨 글로우)
개요
os.crowny.org 스카이류 촛불게임(게임슬라이스 모듈)에 촛불 수집 시 시각/청각 연출을 추가.
정본 산식(.한선) → JS 미러(게임슬라이스.js) → 무회귀 하니스(node) 3단 구조로, village.js는 무접촉(읽기전용 VillageHook 계약만 사용).
무엇을 했는지
수집연출.한선 — 결정론 연출 산식 정본(정수 x1000 고정소수점, float 금지).
-
파티클수(레벨) = 10+레벨
3, 상한 26
- 이징천(진행밀리,총밀리) — ease-out cubic (x1000 고정소수점, 경계 0→0/총→1000, 단조증가)
- 파티클보간천(시작좌표천,끝좌표천,이징값천) — 선형보간
- 글로우반경px(레벨) / 글로우알파천(레벨) — 레벨<2는 0, 레벨6=172px·0.168(은은하게, 과장 금지)
- 팝스케일천(경과밀리) — 0~150ms 1000→1350, 150~400ms 1350→1000, 이후 1000
- 레벨업여부(이전수집수,현재수집수) — 수집물.한선과 동일 경계(5/10/15/20/26)로 레벨 변화 판정
- 셀프테스트 30/30 PASS, STRICT 컴파일 경고 0.- 게임슬라이스.js 패치 —
CollectFX 모듈(섹션 "4) 수집 연출") 신규 + collect(id)/updateBadge() 연동.
- COLLECTFX_EXTRACT_BEGIN/END 마커로 순수 산식 블록을 감싸 하니스가 추출 가능하게 함.
- 오버레이 <canvas>(fixed, z-index:4, resize 대응) — 그릴 것 없으면 rAF 스스로 정지(스케줄틱 예산 보호).
- 훅(VillageHook) 있으면: 촛불 월드좌표(y=1.5 고정)→project()로 시작점, 매 프레임 플레이어 좌표를 다시 project()해 목표를 추적하며 파티클이 빨려감(골드 #ffd98a→#fff3c0). 훅 없으면 파티클 생략(배지 팝만 동작).
- 카운터 배지에 팝스케일천 기반 transform:scale 팝.
- 레벨≥2일 때 플레이어 중심 은은한 radial glow(sin 미세 플리커 ±8%).
- 레벨업 시 링 확장(0→글로우반경2, 600ms) + 3화음(root=69, 반음 0/4/7, 기존
Audio5.freqFromSemitone 재사용) + "Lv.N 달성!" 토스트.
- 기존 동작(removeCandle·토스트·880 핑·진열장) 전부 유지.
수집연출테스트.js — fk테스트.js 방식과 동일하게 게임슬라이스.js의 COLLECTFX_EXTRACT 블록을 추출·eval해 node로 검증. 정본 .한선 셀프테스트와 동일 기대값(파리티) 31/31 PASS.
관련 파일
/Users/ef/CrownyOS/os-site/게임슬라이스/수집연출.한선 (신규, 정본, 135줄)
/Users/ef/CrownyOS/os-site/게임슬라이스/게임슬라이스.js (수정, 341→546줄, 백업 게임슬라이스.js.bak-수집연출전)
/Users/ef/CrownyOS/os-site/게임슬라이스/수집연출테스트.js (신규, 하니스, 82줄)
- village.js — 무접촉(읽기전용 VillageHook만 사용: getPlayer/project/removeCandle)
검증 결과
- 한선씨 STRICT 컴파일: 경고 0, 셀프테스트 30/30 PASS
node --check 게임슬라이스.js: OK
node 수집연출테스트.js: 31/31 PASS (정본 파리티 확인)
- 크라우니코드: lookup MISS 1건(신규 연출 산식) / learn 추가 1건(수집연출_이징천_파티클보간_레벨글로우)
잔여 이슈
- 라이브 브라우저 검증(실제 캔버스 렌더/파티클 손맛 확인)은 메인 세션 담당 — 이 작업에서는 미실시.
수집연출테스트.js는 fk테스트.js와 동일 선례(순수 Node 마커추출 하니스)로 .한선 컴패니언 생략 — 로직은 이미 수집연출.한선 셀프테스트가 정본으로 보유(파리티 검증됨).