From 6f462b8cb1f7847c96fedaae5267ebaca58d0544 Mon Sep 17 00:00:00 2001 From: EJClaw Date: Tue, 6 Oct 2026 00:58:59 +0900 Subject: [PATCH] =?UTF-8?q?M8:=20=ED=8C=8C=ED=8B=B0=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=203=EC=A2=85=20=ED=95=A9=EC=B9=98=EA=B8=B0,=20=EA=B7=B8?= =?UTF-8?q?=EB=A6=BC=20=EB=A7=9E=ED=9E=88=EA=B8=B0=EB=8F=84=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A4=91=20=EB=B0=A9=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EB=8B=AB=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 도블·그림 맞히기·마피아 브랜치 병합 (validate ctx 타입은 ValidateContext로 통일) - 그림 맞히기에 ownChat 적용: 출제자 채팅 금지(§4), 정답이 방 채팅으로 새는 문제 차단 - '곧 나와요' 목록이 비면 숨김, 로드맵 M8 결과 기록 Co-Authored-By: Claude Opus 5.5 --- apps/web/src/games/catchmind/index.tsx | 3 ++- docs/12-roadmap.md | 7 +++++++ packages/games/src/catchmind/index.ts | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) 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;