게임슬라이스 — village.js 브라우저 컴패니언 + 배선 런북
개요
스카이 MVP 한선씨 정본 3종(수집물.한선/이모트.한선/악기.한선, data/*.json 산출 완료)을 village.js 게임에
연결하는 브라우저 이행보조를 만들었다. village.html/village.js는 라이브 무접촉 지시에 따라
일절
Edit/Write하지 않았고, 대신 신규 컴패니언 JS + 정확한 배선 런북(.md)만 산출했다.
무엇을 했는지
게임슬라이스.js(신규) — 3개 JSON을 fetch해 (a) 촛불 근접픽업+HUD 카운터+27칸 진열장 자동반영,
(b) 이모트 휠 UI(12종), (c) 악기 패널(음계5+화음4,
440*2^((root+반음-69)/12) Web Audio 합성) 구현.
판정 로직(근접판정/수집카운트/슬롯인덱스/레벨계산/보상설명/이모트유효/손잡기가능/음유효/노트이벤트)은
대응 .한선 파일에서
그대로 포팅(로직 변경 없음).
- 핵심 설계 제약 발견: village.js는 IIFE 클로저라
player/EYE/project()/PRESENCE가 window에
전혀 노출되지 않는다(
window.SCENE만 노출). 그래서 컴패니언은
window.VillageHook이라는 읽기전용 계약을
정의하고,
훅이 없어도 로컬전용 모드로 완결 동작하도록(수동 촛불 패널, 내 화면 전용 이모트/오디오)
구현했다 — 훅이 나중에 배선되면 코드 변경 없이 실시간 근접픽업으로 자동 승격.
- 라이브 부작용 리스크 실측:
crowny-presence/server.js(9788) 소스를 읽어 확인한 결과, t가
join/state/chat 외 값이면 그냥 드롭되고,
join 시 room 전체에
{t:"peer"}를 즉시 브로드캐스트한다.
즉 컴패니언이 이모트/노트 크로스피어 동기화를 위해
자체 WebSocket을 새로 열면 다른 실사용자 화면에
유령 피어가 뜨는 부작용이 생긴다 → 컴패니언은 자체 소켓을 절대 열지 않고, village.js 훅의
presenceSend(=이미 사용자가 직접 켠 기존 소켓 재사용, 안 켰으면 안전한 no-op)만 사용하도록 설계.
게임슬라이스.한선(신규, 컴파일+실행 검증 완료, STRICT=0경고) — 컴패니언 JS가 포팅한 판정 로직의
한선씨 동반 파일(글로벌 CLAUDE.md "한선씨 동반 필수" 훅 대응) + 신규 결정 로직
프레즌스전송판정() 1개.
연동런북.md(신규) — village.html 1줄, village.js 3~7줄(선택 훅) + 3D 렌더 3곳(선택) +
crowny-presence/server.js 3줄(선택, 별도 서비스) 정확한 스니펫. 전부 미적용.
관련 파일
/Users/ef/CrownyOS/os-site/게임슬라이스/게임슬라이스.js
/Users/ef/CrownyOS/os-site/게임슬라이스/게임슬라이스.한선
/Users/ef/CrownyOS/os-site/게임슬라이스/연동런북.md
- 소비 데이터(기존):
/Users/ef/CrownyOS/os-site/게임슬라이스/data/{수집물,이모트,악기}.json
- 참조만(미접촉):
/Users/ef/CrownyOS/os-site/village.html, /Users/ef/CrownyOS/os-site/village.js,
/Users/ef/crowny-presence/server.js잔여 이슈
- os-site를 서빙하는 정확한 도메인/포트가
crowny-ports.sh/gateway.yaml grep으로 안 잡힘 — 실제 서빙
경로 확인 필요(런북 verify_plan에 임시 로컬서버 대안 기재).
- §3(3D 촛불 billboard) 적용 시, 픽업 후
FACES 배열에서 개별 항목 제거 로직이 없음(append-only 훅이라
치워지지 않고 남을 수 있음) — 훅 계약에
removeBillboard류 추가 필요(런북 리스크에 기재).
- §4(크로스피어 노트/이모트) 적용해도 컴패니언 쪽 수신 리스너 미구현(전송 경로만 열림) — 다음 단계.
- 손잡기(hold) 시각화(두 아바타 연결선)는 판정 함수만 있고 UI 미구현.