크라우니 마을 — 상점 실내 진입(콘텐츠) + NPC 배회 WASM (병행)
개요
사용자 지시 "둘 다 병행, 콘텐츠 우선". 걸어다니는 마을(
village.js)에
트랙A: 상점·실내 진입(콘텐츠 우선)과
트랙B: NPC 이동 WASM 이관을 함께 구현. 데이터·계산은 한선씨 정본, 렌더는 village.js 미러 원칙 유지.
트랙A — 상점 + 실내 진입 (콘텐츠)
crownyc/libs/상점.한선 (정본, 신규): 마을 상점 6채 카탈로그(이름/종류/아이콘/문좌표/색/인사/아이템) + 상점JSON스트림() (대화.한선과 동일 평행배열·스트리밍 패턴). 문 좌표는 메인거리 앞줄 건물(z=-12) 앞면에 맞춤(z=-9).
- 마들렌(빵집) 페이지(책방) 피어라(꽃집) 느리게(카페) 손끝(공방) 이것저것(잡화점).
마을월드.한선(정본 생성기)에 결선: 가져오기 "상점.한선", 실내 오버레이 CSS(아늑한 가게: 배지/간판/선반 그리드/점원 인사/아이템 카드), #shopHint·#shopOverlay 마크업, window.SHOPS= 임베드, 이동-wasm.js·액터-wasm.js 스크립트 태그 → village.html 재생성.
village.js (렌더): drawShopSigns()(마을 위 떠있는 빌보드 간판), findNearShop()(문 근접 ~2.6), enterShop()/exitShop()(SHOPS로 실내 DOM 조립, paused 토글 = 렌더 정지), 스페이스/클릭/ESC 결선(NPC 우선 → 상점). 간판은 가게색 테두리 + 아이콘+이름.
트랙B — NPC 배회 WASM
- 함정:
사인/코사인(opcode)도 루트처럼 MCU/WASM 런타임 패스스루(WASM 사인(1)=1 vs 네이티브 841). → 삼각도.한선의 Bhaskara 사인도/코사인도(순수산술 ×1000) 사용.
libs/액터.한선(정본): 배회X/배회Z(중심,반경,도) 원형 산책. 액터_입력.한선: 한 프레임 전체 NPC를 배치(n + n×4줄)로 받아 위치 출력 → 액터.wasm(60KB).
액터-wasm.js 브릿지: ActorEngine.wander([{cx,cz,r,deg}])→[{x,z}], WASM 배치 + JS폴백.
- village.js:
computeNpcPositions(T) 프레임당 1회 호출 → 모든 NPC 위치를 한선씨 기계어로 산출, a._wx/_wz/_cacheT 캐시. npc actorPos가 현재프레임(T 일치) 시 캐시 사용, 펫의 지연추적(T-0.6) 호출은 _cacheT 가드로 JS 폴백(충돌 회피).
검증
- 상점: 6/6 실내 HTML well-formed(div 균형·아이템/인사/이름 포함), 근접판정 정확(문앞(-12,-8.8)→마들렌, 원거리→없음).
- NPC 배회: 네이티브=WASM 배치 바이트 일치. 브라우저경로 300프레임 WASM vs JS폴백 최대편차 0.0064 월드유닛(Bhaskara 근사차, 시각적 동일).
- 통합 DOM 스모크(node, canvas/DOM 모킹): village.js IIFE 4프레임 예외 없이 진행 — drawSky/건물/간판/액터/이동/근접 전부 정상. 두 브릿지 WASM 로드.
- DOM ID 11종 전부 village.html에 존재.
관련 파일
crownyc/libs/상점.한선 (신규) · crownyc/libs/액터.한선·액터_입력.한선 (신규)
시작화면/마을월드.한선 (정본 생성기, 상점+브릿지 결선)
시작화면/액터.wasm·액터-wasm.js (신규)
시작화면/village.html(재생성)·village.js(상점+NPC캐시)
- 배포: 6파일 →
os-site/ (village.html/js, 이동.wasm, 이동-wasm.js, 액터.wasm, 액터-wasm.js)
함정 (학습)
- 인라인
; 주석은 hanseonc_high에서 코드로 파싱됨(; 2D: 각 원소가... → 변수 미정의 에러). 인라인 주석은 반드시 //. (standalone ; 줄은 OK)
- 사인/코사인/루트 등 수학 opcode는 MCU/WASM 런타임 미구현 → 삼각도/정수루트 등 한선씨 자립 구현. [[feedback_wasm_mcu_sqrt_passthrough]]
- 정본 생성기(마을월드.한선)와 산출물(village.html)의 동기화: 손편집(이동-wasm 태그 등)은 반드시 생성기에도 반영 후 재생성.
잔여 이슈
- 펫/새/나비/차량은 여전히 JS(특수모션·장식성, 결정성 가치 낮음). 필요시 동일 배치 패턴으로 확장 가능.
- 상점 아이템은 현재 "구경"만 — 구매/소지품/배치(상태창 27큐브 연동)는 다음 콘텐츠 트랙.
- 실내를 별도 3D 룸으로 만들 수도 있으나 현재 CSS 오버레이가 가볍고 온브랜드.