From 347dfc1f4a331dc6547554789a093b5fb32f9755 Mon Sep 17 00:00:00 2001 From: kimyu Date: Mon, 21 Sep 2026 12:50:22 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=8C=EC=9E=84=C2=B7=EC=9E=85=EC=9E=A5=20UX?= =?UTF-8?q?=EC=99=80=20=EB=AC=BC=EB=A6=AC/=EA=B3=A0=EC=A7=80=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=EC=9D=84=20=EB=B0=98=EC=98=81=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 비행기(세계여행) 칸 선택 이동, 주사위 무게감, 설정 패널·주사위 초기화, 개인정보 고지·파비콘·탭 제목을 정리하고 런타임 로그는 추적에서 제외한다. Co-authored-by: Cursor --- .gitignore | 3 + app/api/chzzk/callback/route.ts | 8 ++ app/api/chzzk/login/route.ts | 2 + app/api/rooms/join/route.ts | 8 ++ app/apple-icon.png | Bin 0 -> 11334 bytes app/favicon.ico | Bin 25931 -> 4500 bytes app/game/board-config.ts | 35 ++++---- app/game/cell-event.ts | 2 +- app/game/chat-feed.tsx | 10 +-- app/game/dice.tsx | 148 ++++++++++++++++++++++++++------ app/game/diceplane.tsx | 22 ++--- app/icon.png | Bin 0 -> 41374 bytes app/layout.tsx | 4 +- app/page.tsx | 62 +++++++++---- app/privacy/page.tsx | 82 ++++++++++++++++++ lib/auth/session.ts | 3 + lib/rooms/store.ts | 8 ++ logs/build.log | 31 ------- logs/drinkmarble.log | 26 ------ logs/drinkmarble.pid | 1 - logs/release.log | 9 -- 21 files changed, 316 insertions(+), 148 deletions(-) create mode 100644 app/apple-icon.png create mode 100644 app/icon.png create mode 100644 app/privacy/page.tsx delete mode 100644 logs/build.log delete mode 100644 logs/drinkmarble.log delete mode 100644 logs/drinkmarble.pid delete mode 100644 logs/release.log diff --git a/.gitignore b/.gitignore index 5ef6a52..64f2fe0 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,9 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env* +# local runtime logs / pids +/logs/ + # vercel .vercel diff --git a/app/api/chzzk/callback/route.ts b/app/api/chzzk/callback/route.ts index 1fa5a68..22209d3 100644 --- a/app/api/chzzk/callback/route.ts +++ b/app/api/chzzk/callback/route.ts @@ -18,9 +18,11 @@ import { ensureRoomChat, } from '@/lib/chzzk/chat-session'; import { + clearDiceQueue, createRoom, findRoomByChannelId, getRoom, + notifyRoom, } from '@/lib/rooms/store'; export const runtime = 'nodejs'; @@ -87,6 +89,12 @@ export async function GET(request: Request) { } cancelScheduledDisconnectRoomChat(room.id); + + if (decodedState.resetDiceQueue) { + clearDiceQueue(room.id); + notifyRoom(room.id); + } + try { await ensureRoomChat(room.id); } catch { diff --git a/app/api/chzzk/login/route.ts b/app/api/chzzk/login/route.ts index 60efbcb..f800e9c 100644 --- a/app/api/chzzk/login/route.ts +++ b/app/api/chzzk/login/route.ts @@ -28,11 +28,13 @@ export async function GET(request: Request) { const cheesePerDice = Number(url.searchParams.get('cheesePerDice') || 1000); const multiplyByCheese = url.searchParams.get('multiplyByCheese') !== '0'; const maxMultiplier = Number(url.searchParams.get('maxMultiplier') || 0); + const resetDiceQueue = url.searchParams.get('resetDiceQueue') === '1'; const { state, sealed } = createOAuthState({ cheesePerDice: Number.isFinite(cheesePerDice) ? cheesePerDice : 1000, multiplyByCheese, maxMultiplier: Number.isFinite(maxMultiplier) ? maxMultiplier : 0, + resetDiceQueue, }); const res = NextResponse.redirect(buildChzzkLoginUrl(state)); diff --git a/app/api/rooms/join/route.ts b/app/api/rooms/join/route.ts index 170f82f..45dfb65 100644 --- a/app/api/rooms/join/route.ts +++ b/app/api/rooms/join/route.ts @@ -11,9 +11,11 @@ import { ensureRoomChat, } from '@/lib/chzzk/chat-session'; import { + clearDiceQueue, createRoom, findRoomByChannelId, getRoom, + notifyRoom, toPublicRoom, } from '@/lib/rooms/store'; @@ -30,6 +32,7 @@ export async function POST(request: Request) { cheesePerDice?: number; multiplyByCheese?: boolean; maxMultiplier?: number; + resetDiceQueue?: boolean; }; const session = await getRequestAuthSession(request); @@ -92,6 +95,11 @@ export async function POST(request: Request) { cancelScheduledDisconnectRoomChat(room.id); + if (body.resetDiceQueue) { + clearDiceQueue(room.id); + notifyRoom(room.id); + } + if (room.settings.chzzkEnabled) { try { await ensureRoomChat(room.id); diff --git a/app/apple-icon.png b/app/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a67e7d268f166f46ad746ba126909fa21791d30b GIT binary patch literal 11334 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 GRsRD<`C*O# literal 25931 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 LrJugUA?W`A8`#=m diff --git a/app/game/board-config.ts b/app/game/board-config.ts index 6c8b86a..591a41b 100644 --- a/app/game/board-config.ts +++ b/app/game/board-config.ts @@ -12,10 +12,16 @@ export const CELL_TYPE_PRESETS = [ '다같이한잔', '영어금지 3분', '두잔마셔', - '애교/매도 100자', + '애교/매도 50자', '무인도', '역방향', '세계여행', + 'TMI 알려주기', + '뒤로 3칸', + '앞으로 4칸', + '방어권', + '방어권 전부삭제', + '물한잔', ] as const; export type CellEventOption = { @@ -36,7 +42,7 @@ export type BoardCellConfig = { eventId?: string | null; /** 칸 전용 이미지 (data URL 또는 상대 경로) */ imageSrc?: string | null; - /** false면 게임에서 이름·이미지를 숨김 (기본 true) */ + /** false면 게임에서 칸 이름(텍스트)만 숨김 (이미지는 유지) */ contentVisible?: boolean; }; @@ -59,27 +65,27 @@ const DEFAULT_BOARD_LAYOUT: ReadonlyArray<{ { type: '시작', eventId: null }, { type: '한잔마셔' }, { type: '~~체 3분' }, - { type: '안주 한입' }, + { type: '방어권' }, { type: '노래 1절' }, { type: '다같이한잔' }, - { type: '영어금지 3분' }, - { type: '애교/매도 100자' }, + { type: '앞으로 4칸' }, + { type: '애교/매도 50자' }, { type: '무인도', eventId: 'island' }, { type: '안주 한입' }, { type: '두잔마셔' }, - { type: '~~체 3분' }, + { type: '물한잔' }, { type: '한잔마셔' }, - { type: '애교/매도 100자' }, + { type: 'TMI 알려주기' }, { type: '역방향', eventId: 'reverse' }, - { type: '영어금지 3분' }, + { type: '뒤로 3칸' }, { type: '안주 한입' }, { type: '다같이한잔' }, - { type: '노래 1절' }, + { type: '방어권 전부삭제' }, { type: '한잔마셔' }, { type: '~~체 3분' }, { type: '두잔마셔' }, { type: '세계여행', eventId: 'airplane' }, - { type: '애교/매도 100자' }, + { type: '애교/매도 50자' }, { type: '안주 한입' }, { type: '영어금지 3분' }, { type: '다같이한잔' }, @@ -439,12 +445,7 @@ export function buildPlaneCells(config: BoardConfig = getOrCreateBoardConfig()): export function cellColorFor( eventId: string | null | undefined, index: number, - options?: { contentVisible?: boolean }, ) { - // 내용 숨김이면 종류가 색으로도 드러나지 않게 통일 - if (options?.contentVisible === false && index !== 0) { - return '#be123c'; - } if (index === 0) return '#059669'; switch (eventId) { case 'island': @@ -458,7 +459,9 @@ export function cellColorFor( } } -/** 주사위 UI를 안쪽 빈 칸에 배치할 때 쓰는 span (1~2) */ +/** 주사위 UI를 안쪽 빈 칸에 배치할 때 쓰는 span (1~2) + * 세로 7칸 기준: 시작 행을 건너뛰고 안쪽 2칸 = 절대 위치 3칸까지 + */ export function diceAreaSpan(width: number, height: number) { return Math.min(2, Math.max(1, width - 2), Math.max(1, height - 2)); } diff --git a/app/game/cell-event.ts b/app/game/cell-event.ts index 51193ca..a9e1a27 100644 --- a/app/game/cell-event.ts +++ b/app/game/cell-event.ts @@ -10,7 +10,7 @@ export type PlaneCell = { eventId?: string | null; /** 칸 이미지 (없으면 텍스트만) */ imageSrc?: string | null; - /** false면 게임 판에서 이름·이미지를 숨김 */ + /** false면 게임 판에서 이름(텍스트)만 숨김 */ contentVisible?: boolean; }; diff --git a/app/game/chat-feed.tsx b/app/game/chat-feed.tsx index 38329c4..6c295fc 100644 --- a/app/game/chat-feed.tsx +++ b/app/game/chat-feed.tsx @@ -34,15 +34,15 @@ export default function ChatFeedPanel({
채팅 @@ -51,8 +51,8 @@ export default function ChatFeedPanel({ ref={listRef} className={ compact - ? 'min-h-0 flex-1 space-y-0.5 overflow-y-auto px-1.5 py-1 text-[10px] leading-snug' - : 'min-h-0 flex-1 space-y-1 overflow-y-auto px-2 py-1.5 text-[11px] leading-snug' + ? 'min-h-0 flex-1 space-y-0.5 overflow-y-auto px-1.5 py-1 text-[20px] leading-snug' + : 'min-h-0 flex-1 space-y-1 overflow-y-auto px-2 py-1.5 text-[22px] leading-snug' } > {items.length === 0 ? ( diff --git a/app/game/dice.tsx b/app/game/dice.tsx index e3f5acf..ae551b8 100644 --- a/app/game/dice.tsx +++ b/app/game/dice.tsx @@ -18,6 +18,7 @@ import { type RapierRigidBody, } from '@react-three/rapier'; import { + Euler, Quaternion, SRGBColorSpace, TextureLoader, @@ -40,10 +41,33 @@ const WALL_HEIGHT = 8; const WALL_HALF_T = WALL_THICKNESS / 2; const WALL_HALF_H = WALL_HEIGHT / 2; -const STILL_SPEED_SQ = 0.05; -const STILL_FRAMES = 18; +const STILL_SPEED_SQ = 0.035; +const STILL_FRAMES = 24; const MIN_VIEW_PX = 16; +/** + * 과한 회전감 원인: + * 1) 시작 자세가 완전 랜덤 → 처음부터 면이 빙글 + * 2) 마찰이 선속도를 각속도로 바꿈 + * 3) 충돌 접점이 COM에서 벗어나며 각속도 발생 + * 대응: 세워 두고 벽 쪽 병진을 강하게, 각감쇠+각속도 상한으로 억제. + */ +const DICE_MASS = 4.5; +const DICE_RESTITUTION = 0.06; +const DICE_FRICTION = 0.38; +const DICE_LINEAR_DAMPING = 0.18; +const DICE_ANGULAR_DAMPING = 3.4; +const DICE_GRAVITY_SCALE = 1.2; +const FLOOR_FRICTION = 0.42; +const FLOOR_RESTITUTION = 0.03; +const WALL_FRICTION = 0.22; +const WALL_RESTITUTION = 0.28; +const PHYSICS_GRAVITY: [number, number, number] = [0, -12.5, 0]; +/** 각속도 상한(rad/s) */ +const MAX_ANGULAR_SPEED = 7.5; +/** 벽 방향 초기 선속도 */ +const WALL_PUSH_SPEED = 11.5; + const DEFAULT_DICE_FACE_TEXTURES = getDiceFaceTextureList(DEFAULT_ASSETS.dice); const DICE_FACES = [ @@ -56,6 +80,7 @@ const DICE_FACES = [ ]; const _quat = new Quaternion(); +const _euler = new Euler(); const _normal = new Vector3(); const WORLD_UP = new Vector3(0, 1, 0); @@ -105,10 +130,30 @@ function InvisibleWalls() { return ( <> - - - - + + + + ); } @@ -231,12 +276,23 @@ function DiceSettleWatcher({ const bodies = diceRefs.map((ref) => ref.current); if (bodies.some((body) => !body)) return; + // 각속도만 과도하면 잘라서, 벽으로 미는 병진은 유지한 채 회전기만 줄임 + for (const body of bodies) { + if (!body) continue; + const a = body.angvel(); + const mag = Math.hypot(a.x, a.y, a.z); + if (mag > MAX_ANGULAR_SPEED) { + const s = MAX_ANGULAR_SPEED / mag; + body.setAngvel({ x: a.x * s, y: a.y * s, z: a.z * s }, false); + } + } + if (bodies.every((body) => isBodyStill(body!))) { stillFrames.current += 1; if (stillFrames.current >= STILL_FRAMES && !reported.current) { reported.current = true; const faces = bodies.map((body) => readTopFace(body!)); - const sum = faces.reduce((a, b) => a + b, 0); + const sum = faces.reduce((acc, value) => acc + value, 0); onSettled({ sum, faces }); } } else { @@ -280,14 +336,19 @@ function RapierDiceExample({ - + - + @@ -296,10 +357,14 @@ function RapierDiceExample({ key={`die-${index}-${diceCount}-${canvasKey}`} ref={diceRefs[index]} type="dynamic" - position={[x, 4, index === 0 ? 0 : 0.15]} + position={[x, 0.65, index === 0 ? 0 : 0.15]} colliders="cuboid" - restitution={0.2} - friction={0.6} + mass={DICE_MASS} + restitution={DICE_RESTITUTION} + friction={DICE_FRICTION} + linearDamping={DICE_LINEAR_DAMPING} + angularDamping={DICE_ANGULAR_DAMPING} + gravityScale={DICE_GRAVITY_SCALE} > = [ + [1, 0], + [-1, 0], + [0, 1], + [0, -1], + ]; + const [wx, wz] = wallDirs[Math.floor(Math.random() * wallDirs.length)]!; + let dx = wx + (Math.random() - 0.5) * 0.35; + let dz = wz + (Math.random() - 0.5) * 0.35; + const dLen = Math.hypot(dx, dz) || 1; + dx /= dLen; + dz /= dLen; + + // 완전 랜덤 자세 대신: 세워 둔 채 약한 기울기 + 진행 방향 쪽 살짝 기울임 + // (위에서 볼 때 면이 빙글빙글 도는 느낌을 크게 줄임) + const yaw = Math.random() * Math.PI * 2; + const tipToward = 0.18 + Math.random() * 0.22; // ~10–23° + const tipSide = (Math.random() - 0.5) * 0.16; + // 진행 방향이 +X면 Z축 회전으로 기울고, +Z면 X축 회전으로 기울게 + _euler.set(-dz * tipToward + tipSide, yaw, dx * tipToward + tipSide, 'YXZ'); + _quat.setFromEuler(_euler); + body.setRotation({ x: _quat.x, y: _quat.y, z: _quat.z, w: _quat.w }, true); + + // 병진 위주: 선속도로 벽을 향해 밀기 (토크 임펄스 없음) + const speed = WALL_PUSH_SPEED + Math.random() * 3.5; + body.setLinvel({ x: dx * speed, y: 0.35 + Math.random() * 0.45, z: dz * speed }, true); + + // 질량 대비 추가 밀기(COM). 회전 임펄스는 넣지 않음 + const pushImpulse = DICE_MASS * (2.8 + Math.random() * 1.2); + body.applyImpulse({ x: dx * pushImpulse, y: 0.4, z: dz * pushImpulse }, true); return true; } @@ -436,10 +528,13 @@ export default memo(function Dice({ rolling || disabled || !canvasReady || (requireDiceQueue && diceQueue <= 0); return ( -
+
{canvasReady ? ( )} +
+ +
-
+
{queueHint ? queueHint : !canvasReady diff --git a/app/game/diceplane.tsx b/app/game/diceplane.tsx index d82af86..dcb8e12 100644 --- a/app/game/diceplane.tsx +++ b/app/game/diceplane.tsx @@ -52,11 +52,7 @@ export default function DicePlane({ const [chessmanSrc, setChessmanSrc] = useState('/chessman/default.png'); const [hopKey, setHopKey] = useState(0); const [moving, setMoving] = useState(false); - const [chatOpen, setChatOpen] = useState(true); - - useEffect(() => { - if (showChatFeed) setChatOpen(true); - }, [showChatFeed]); + const [chatOpen, setChatOpen] = useState(false); const [landedLabel, setLandedLabel] = useState(null); const [landedKey, setLandedKey] = useState(0); const [statusText, setStatusText] = useState('시계방향'); @@ -243,7 +239,7 @@ export default function DicePlane({ {dicePlaneArray.map((plane, index) => { const isStart = index === 0; const isLanded = !moving && index === chessmanIndex && landedLabel != null; - const showContent = plane.contentVisible !== false; + const showText = plane.contentVisible !== false; return (
- {showContent ? (isStart ? '시작' : plane.type) : null} + {showText ? (isStart ? '시작' : plane.type) : null}
); })} diff --git a/app/icon.png b/app/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..57701e8f6a282cffb0058bb75ed2dccd1aa16fcb GIT binary patch literal 41374 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 literal 0 HcmV?d00001 diff --git a/app/layout.tsx b/app/layout.tsx index 9852c15..6617fe0 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -13,8 +13,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "알코올 마블!", + description: "치지직 온라인 주루마블", }; export default function RootLayout({ children }: LayoutProps<"/">) { diff --git a/app/page.tsx b/app/page.tsx index ed159c4..d766b1c 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,5 +1,6 @@ 'use client'; +import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { useEffect, useRef, useState } from 'react'; import { @@ -147,7 +148,7 @@ function BoardEditor({

주사위판 칸 (board)

- 가로·세로로 판 크기를 바꾸고, 칸마다 이름·효과·이미지·내용 표시를 설정합니다. 0번(시작) 이름은 + 가로·세로로 판 크기를 바꾸고, 칸마다 이름·효과·이미지·텍스트 표시를 설정합니다. 0번(시작) 이름은 고정입니다.

@@ -157,14 +158,14 @@ function BoardEditor({ className="rounded bg-white/15 px-3 py-1.5 text-xs font-medium text-white hover:bg-white/25" onClick={() => onChange(setAllCellsContentVisible(true, board))} > - 전체 내용 표시 + 전체 텍스트 표시 @@ -305,10 +303,10 @@ function BoardEditor({ ) } /> - 게임에서 이 칸 내용(이름·이미지) 표시 + 게임에서 이 칸 이름(텍스트) 표시

- 끄면 판에는 색만 보이고, 착지 시 효과·안내는 그대로 동작합니다. + 끄면 판에서 이름 글자만 숨깁니다. 이미지·색·착지 효과는 그대로입니다.

@@ -376,6 +374,7 @@ export default function Home() { const [roomCheesePerDice, setRoomCheesePerDice] = useState(1000); const [roomMultiplyByCheese, setRoomMultiplyByCheese] = useState(true); const [roomMaxMultiplier, setRoomMaxMultiplier] = useState(10); + const [resetDiceQueueOnJoin, setResetDiceQueueOnJoin] = useState(false); const [joinChannelInput, setJoinChannelInput] = useState(''); const [roomBusy, setRoomBusy] = useState(false); const [roomError, setRoomError] = useState(null); @@ -436,6 +435,7 @@ export default function Home() { cheesePerDice: roomCheesePerDice, multiplyByCheese: roomMultiplyByCheese, maxMultiplier: roomMultiplyByCheese ? roomMaxMultiplier : 0, + resetDiceQueue: resetDiceQueueOnJoin, }); const startChzzkLogin = () => { @@ -444,6 +444,7 @@ export default function Home() { cheesePerDice: String(opts.cheesePerDice), multiplyByCheese: opts.multiplyByCheese ? '1' : '0', maxMultiplier: String(opts.maxMultiplier), + resetDiceQueue: opts.resetDiceQueue ? '1' : '0', }); window.location.href = `/api/chzzk/login?${q.toString()}`; }; @@ -658,6 +659,15 @@ export default function Home() { )} +
@@ -790,10 +800,10 @@ export default function Home() {
-

+ {/*

ZIP: manifest.json, board.json, cells/N.*, background.*, chessman.*, dice/1|2/면.*, dice-floor.* -

+

*/} {error && (

{error}

@@ -943,6 +953,26 @@ export default function Home() {
)} + +
); diff --git a/app/privacy/page.tsx b/app/privacy/page.tsx new file mode 100644 index 0000000..6c99688 --- /dev/null +++ b/app/privacy/page.tsx @@ -0,0 +1,82 @@ +import Link from 'next/link'; + +export const metadata = { + title: '개인정보·쿠키 고지 | 알코올 마블', + description: '알코올 마블 서비스의 쿠키 및 저장 정보 안내', +}; + +export default function PrivacyPage() { + return ( +
+
+
+ + ← 홈 + +

개인정보·쿠키 고지

+

+ 본 서비스(알코올 마블)에서 사용하는 저장 정보와 연락처를 안내합니다. +

+
+ +
+

1. 수집·이용하는 정보

+

+ 광고·분석용 추적 쿠키나 마케팅 SDK는 사용하지 않습니다. 서비스 제공에 필요한 + 범위에서만 아래 정보를 사용합니다. +

+
    +
  • + 인증 쿠키: 치지직 로그인 후 + 본인 채널 확인용 세션입니다. 브라우저에서만 쓰이며(HttpOnly), 치지직 + 액세스/리프레시 토큰은 저장하지 않습니다. +
  • +
  • + 로그인 보안 쿠키: OAuth + 진행 중 CSRF 방지용으로 짧은 시간만 유지됩니다. +
  • +
  • + 브라우저 로컬 저장소: 주사위판 + 칸 설정·이미지 에셋 등은 서버가 아니라 사용자 브라우저에만 저장됩니다. +
  • +
  • + 룸·채팅 연동: 입장한 치지직 + 채널의 채팅/후원 이벤트는 해당 방송 룸 진행을 위해 서버 메모리에서 일시적으로 + 처리됩니다. +
  • +
+
+ +
+

2. 쿠키 안내

+

+ 위에 적은 쿠키는 로그인·보안 등 서비스 제공에 필요한 항목입니다. 선택형 + 광고/통계 쿠키는 두지 않습니다. 브라우저에서 쿠키를 차단하면 치지직 로그인 + 입장이 동작하지 않을 수 있습니다. +

+
+ +
+

3. 문의

+

+ 개인정보·쿠키 관련 문의는 아래로 연락해 주세요. +

+

+ 이메일:{' '} + + kimyu@kimyu.xyz + +

+
+ +

최종 안내일: 2026-09-21

+
+
+ ); +} diff --git a/lib/auth/session.ts b/lib/auth/session.ts index 8928c8d..b280672 100644 --- a/lib/auth/session.ts +++ b/lib/auth/session.ts @@ -17,6 +17,7 @@ export type OAuthStatePayload = { cheesePerDice?: number; multiplyByCheese?: boolean; maxMultiplier?: number; + resetDiceQueue?: boolean; /** unix ms */ exp: number; }; @@ -116,6 +117,7 @@ export function createOAuthState(input: { cheesePerDice?: number; multiplyByCheese?: boolean; maxMultiplier?: number; + resetDiceQueue?: boolean; }) { const state = b64urlEncode(randomBytes(24)); const payload: OAuthStatePayload = { @@ -123,6 +125,7 @@ export function createOAuthState(input: { cheesePerDice: input.cheesePerDice, multiplyByCheese: input.multiplyByCheese, maxMultiplier: input.maxMultiplier, + resetDiceQueue: input.resetDiceQueue, exp: Date.now() + 10 * 60 * 1000, }; return { state, sealed: seal(payload) }; diff --git a/lib/rooms/store.ts b/lib/rooms/store.ts index da3930a..02d502b 100644 --- a/lib/rooms/store.ts +++ b/lib/rooms/store.ts @@ -270,6 +270,14 @@ export function addDice(roomId: string, count = 1) { return room; } +/** 남은 주사위 큐를 0으로 초기화 */ +export function clearDiceQueue(roomId: string) { + const room = getRoom(roomId); + if (!room) return null; + room.diceQueue = 0; + return room; +} + export function toPublicRoom(room: RoomRecord): PublicRoomState { return { id: room.id, diff --git a/logs/build.log b/logs/build.log deleted file mode 100644 index f8f2be6..0000000 --- a/logs/build.log +++ /dev/null @@ -1,31 +0,0 @@ - -> drinkmarble@0.1.0 build -> next build - -▲ Next.js 16.3.3 (Turbopack) -⚠ Warning: Next.js ignored package-lock.json in /home/kimyu because it is outside the current Git repository (/home/kimyu/workspace/nextjs/drinkmarble). - To use this directory, set `turbopack.root` in your Next.js config. - -✓ Running next.config.ts took 25ms - - Creating an optimized production build ... -✓ Compiled successfully in 3.6s - Running TypeScript ... - Finished TypeScript in 2.6s ... - Collecting page data using 7 workers ... - Generating static pages using 7 workers (0/6) ... - Generating static pages using 7 workers (1/6) - Generating static pages using 7 workers (2/6) - Generating static pages using 7 workers (4/6) -✓ Generating static pages using 7 workers (6/6) in 677ms - Finalizing page optimization ... - -Route (app) -┌ ○ / -├ ○ /_not-found -├ ○ /game -└ ○ /main - - -○ (Static) prerendered as static content - diff --git a/logs/drinkmarble.log b/logs/drinkmarble.log deleted file mode 100644 index 449ae23..0000000 --- a/logs/drinkmarble.log +++ /dev/null @@ -1,26 +0,0 @@ - -> drinkmarble@0.1.0 start -> next start -p 13000 - -▲ Next.js 16.3.3 -- Local: http://localhost:13000 -- Network: http://172.30.1.31:13000 -✓ Ready in 149ms -⚠ Warning: Next.js ignored package-lock.json in /home/kimyu because it is outside the current Git repository (/home/kimyu/workspace/nextjs/drinkmarble). - To use this directory, set `outputFileTracingRoot` in your Next.js config. - -✓ Running next.config.ts took 30ms -Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id - at ignore-listed frames - -> drinkmarble@0.1.0 start -> next start -p 13000 - -▲ Next.js 16.3.3 -- Local: http://localhost:13000 -- Network: http://172.30.1.31:13000 -✓ Ready in 151ms -⚠ Warning: Next.js ignored package-lock.json in /home/kimyu because it is outside the current Git repository (/home/kimyu/workspace/nextjs/drinkmarble). - To use this directory, set `outputFileTracingRoot` in your Next.js config. - -✓ Running next.config.ts took 30ms diff --git a/logs/drinkmarble.pid b/logs/drinkmarble.pid deleted file mode 100644 index 3fff9e9..0000000 --- a/logs/drinkmarble.pid +++ /dev/null @@ -1 +0,0 @@ -2448360 diff --git a/logs/release.log b/logs/release.log deleted file mode 100644 index 1e46aba..0000000 --- a/logs/release.log +++ /dev/null @@ -1,9 +0,0 @@ - -> drinkmarble@0.1.0 start -> next start -H 0.0.0.0 -p 13000 - -▲ Next.js 16.3.3 -- Local: http://localhost:13000 -- Network: http://0.0.0.0:13000 -✓ Ready in 153ms -✓ Running next.config.ts took 31ms