크라우니 마을 — 구매·소지품·27큐브 + 3D 실내 룸 + 전 액터 WASM (3트랙 병렬)
개요
사용자 "병렬로 같이 다 하자". 걸어다니는 마을(
village.js)에 세 트랙을 함께 구현. village.js가 공통 수렴점이라
독립 한선씨 백엔드(액터 전타입·3D 실내 지오메트리)는 병렬 서브에이전트(sonnet, 가드레일 주입)로, village.js 통합·소지품/27큐브는 메인 세션이 직렬로 처리해 충돌 차단.
트랙2 — 전 액터 WASM (서브에이전트 A + 메인 결선)
사인/코사인도 루트처럼 MCU/WASM 런타임 패스스루(실측 WASM 사인(1)=1) → 삼각도 Bhaskara 사인도/코사인도.
액터.한선: 배회X2/배회Z2(중심,반경,각) — X/Z 각 분리(나비 대응). 액터_입력.한선: 배치 5줄 프로토콜 n / cx cz r degX degZ → x z(밀리유닛). 액터.wasm(63KB) 재빌드.
액터-wasm.js: ActorEngine.wander([{cx,cz,r,degX,degZ}]). village.js computeActorPositions(T)가 npc/새/차량/나비 전부 프레임당 1배치로 한선씨 기계어 계산, _cacheT 가드(펫 지연추적은 JS).
- 검증: 네이티브=WASM 바이트 일치(5케이스+배치3), 300프레임 WASM vs JS폴백 편차 0.0034 월드유닛.
트랙3 — 3D 실내 룸 (서브에이전트 B + 메인 결선)
실내.한선(서브에이전트 B): 실내장면(상점색)/실내JSON스트림(경로,상점색) → {objects(20개 path/box),spawn,door}. village.js SCENE 스키마 호환(벽/카운터/선반/상품/조명), 상점색은 카운터·포인트에만.
마을월드.한선: 상점색 6개 루프로 window.INTERIORS=[6룸] 임베드.
village.js: buildFacesFrom(objects) 분리(마을 const FACES 불변), drawInterior(dt)가 실내 카메라(완만 회전)로 project/faceDepth/drawQuadTri/drawKeeper/drawVignette 재사용. enterShop→mode="interior" 3D 룸 렌더 + 우측 구매패널, exitShop→마을 복귀. frame 루프 상단 분기.
트랙1 — 구매 → 소지품 → 27큐브 배치 (메인)
소지품.한선(정본): 27칸(3×3×3) 진열장 + 상점종류별 구역(빵집0/책방4/꽃집8/카페12/공방16/잡화점20, 각 4칸) + 다음빈슬롯/진열장채움. 네이티브 검증 통과.
village.js: 구매패널 담기→buyItem→localStorage crowny.소지품. 🎒 소지품 dock 버튼→오버레이(가진 것 칩 + 27칸 진열장 그리드). 놓기→placeItem→구역 다음 빈칸 배치→crowny.진열장(상태창 27큐브와 공유). 토스트 피드백.
검증
- 구매패널 6/6 상점 담기버튼=아이템수. 실내 6룸×20 오브젝트 전부 렌더가능(path/box).
- 27큐브 배치 플로우: 빵집 5개→4개 진열(슬롯0~3)+1개 구역가득 거부, 카페→슬롯12. ✓
- DOM 스모크(canvas/DOM/localStorage 모킹): village.js 전체 초기화+프레임+소지품 열기+힌트 핸들러 무throw. 두 브릿지 WASM 로드.
- 배포 6파일 시작화면==os-site 바이트 동기.
관련 파일
- 신규 정본:
crownyc/libs/실내.한선·소지품.한선. 확장: 액터.한선·액터_입력.한선.
시작화면/마을월드.한선(INTERIORS+소지품 UI 결선) → village.html 재생성
시작화면/village.js(buildFacesFrom·drawInterior·enterShop 3D·구매·소지품·27큐브·전액터캐시)
시작화면/액터.wasm(재빌드)·액터-wasm.js(degX/degZ)
- 배포: village.html/js, 이동.wasm, 이동-wasm.js, 액터.wasm, 액터-wasm.js → os-site
함정 (학습)
JSON스트림 함수가 첫 줄에 쓰기(truncate)면 스트리밍 임베드 시 앞 내용을 통째로 덮는다 → 스트림 함수는 전부 덧쓰기로, 파일 시작은 호출자가 보장. (서브에이전트 B 산출물 실내JSON스트림 쓰기→덧쓰기 수정)
- 사인/코사인/루트 등 수학 opcode는 MCU/WASM 런타임 미구현 → 삼각도/정수루트 자립. [[feedback_wasm_mcu_sqrt_passthrough]]
- 인라인
; 주석 코드 파싱 → //.
잔여 이슈
- 실내 3D 룸은 디오라마(완만 회전) — 워크인(걸어 들어가기)은 다음 단계(이동/충돌 씬스왑).
- 27큐브 상태창(world-desktop.html)은 localStorage
crowny.진열장을 공유만; 큐브 윈도우에 진열품 시각화는 미연동(다음).
- 소지품.한선은 규칙 정본+JS 미러(런타임 상태는 localStorage).