diff --git a/apps/web/src/games/catchmind/index.tsx b/apps/web/src/games/catchmind/index.tsx index ac8483d..50db193 100644 --- a/apps/web/src/games/catchmind/index.tsx +++ b/apps/web/src/games/catchmind/index.tsx @@ -874,7 +874,7 @@ function GuessPanel({ v, me, players, act, pending }: { v: CatchmindView; me: st }, [lastId, v.chat, me]); useEffect(() => () => void (closeTimer.current && clearTimeout(closeTimer.current)), []); const enabled = v.canGuess || v.canChat; - // Enter anywhere focuses this box (not the room chat, so answers don't end up in the open room chat). + // Enter anywhere focuses this box (the room chat is closed during the game: ownChat). useEffect(() => { if (!enabled) return; const onKey = (e: KeyboardEvent) => { @@ -1239,6 +1239,7 @@ const ui: GameUI = { Options, optionsSummary, Rules, + ownChat: true, }; export default ui; diff --git a/docs/12-roadmap.md b/docs/12-roadmap.md index cf6564a..e5c971e 100644 --- a/docs/12-roadmap.md +++ b/docs/12-roadmap.md @@ -71,6 +71,13 @@ ## M8. 파티 게임 - 도블, 그림 맞히기(붓질 스트리밍), 마피아(채팅 채널). +- **진행 결과(2026-10-06)**: 세 게임 규칙 + 화면 완료. 규칙 테스트 도블 47(+방 단위 4·그림 1)·그림 맞히기 34(+방 단위 4)·마피아 43(+방 단위 1), + 게임마다 무작위 플레이 1,000판(구성물·점수 보존, 비공개 정보 유출 없음, 시간 초과 행동 합법). + 엔진 선택 훅 추가(기존 게임 영향 없음): `validate`의 `ctx.now`(채팅·추측 속도 제한), 붓질 스트리밍용 `isStreamAction`·`syncView` + (그림 획은 view 재계산 없이 `stream` 메시지로 중계, 1초마다 묶어 저장, 재접속 시 그림 전체 전송), `disconnectGraceMs`, + `ownChat`(게임 진행 중 방 채팅·빠른 반응을 닫음 — 마피아의 밤 대화, 그림 맞히기의 정답이 방 채팅으로 새지 않게). + E2E: 도블 탑 쌓기 한 판(정답 53번·오답 잠금), 그림 맞히기 두 턴(실제 마우스 획 전달·오답·아까워요·정답) → 결과, + 마피아 4인(PC 방장 + 휴대폰 3명) 밤 행동 → 아침 발표 → 투표·반론·찬반 → 시민 팀 승리(마피아·죽은 사람 채팅이 다른 화면에 안 보임). ## M9. 다듬기 - PWA(홈 화면 추가, 오프라인 안내), 게임 기록 다시 보기, 게임별 튜토리얼 강화. diff --git a/packages/games/src/catchmind/index.ts b/packages/games/src/catchmind/index.ts index ce8393d..3dfbaad 100644 --- a/packages/games/src/catchmind/index.ts +++ b/packages/games/src/catchmind/index.ts @@ -548,6 +548,8 @@ export const catchmind: GameDefinition = defaultOptions: catchmindOptionsSchema.parse({}), optionsSchema: catchmindOptionsSchema as unknown as GameDefinition['optionsSchema'], actionSchema: catchmindActionSchema as unknown as GameDefinition['actionSchema'], + /** Guesses and talk go through the game's own filtered chat (§4·§7); the open room chat would leak answers. */ + ownChat: true, playerCountError(options, count) { const have = buildPool(options).length;