diff --git a/packages/shared/src/game-types.ts b/packages/shared/src/game-types.ts index 0474264..6de2ddd 100644 --- a/packages/shared/src/game-types.ts +++ b/packages/shared/src/game-types.ts @@ -87,6 +87,22 @@ export const bingoCardSchema = z.object({ export type BingoCard = z.infer +// ─── Quiz ──────────────────────────────────────────────────────── + +export const quizQuestionSchema = z.object({ + index: z.number(), + total: z.number(), + difficulty: z.enum(["easy", "medium", "hard"]), + text: z.string(), + answer: z.string(), + status: z.enum(["buzzing", "judging", "resolved"]), + buzzerPlayerId: z.string().nullable(), + buzzerName: z.string().nullable(), + wasCorrect: z.boolean().nullable(), +}) + +export type QuizQuestion = z.infer + // ─── Scoring ──────────────────────────────────────────────────────── export const leaderboardEntrySchema = z.object({ @@ -95,6 +111,7 @@ export const leaderboardEntrySchema = z.object({ juryPoints: z.number(), bingoPoints: z.number(), predictionPoints: z.number(), + quizPoints: z.number(), totalPoints: z.number(), }) @@ -117,6 +134,9 @@ export const gameStateSchema = z.object({ playerId: z.string(), displayName: z.string(), })), + // Quiz + currentQuizQuestion: quizQuestionSchema.nullable(), + myQuizBuzzStatus: z.enum(["can_buzz", "already_buzzed", "excluded", "waiting"]).nullable(), actualResults: actualResultsSchema.nullable(), // Leaderboard leaderboard: z.array(leaderboardEntrySchema), diff --git a/packages/shared/src/ws-messages.ts b/packages/shared/src/ws-messages.ts index eea49e8..3f3497f 100644 --- a/packages/shared/src/ws-messages.ts +++ b/packages/shared/src/ws-messages.ts @@ -62,6 +62,23 @@ export const submitActualResultsMessage = z.object({ last: z.string(), }) +export const startQuizQuestionMessage = z.object({ + type: z.literal("start_quiz_question"), +}) + +export const buzzMessage = z.object({ + type: z.literal("buzz"), +}) + +export const judgeQuizAnswerMessage = z.object({ + type: z.literal("judge_quiz_answer"), + correct: z.boolean(), +}) + +export const skipQuizQuestionMessage = z.object({ + type: z.literal("skip_quiz_question"), +}) + export const clientMessage = z.discriminatedUnion("type", [ joinRoomMessage, reconnectMessage, @@ -74,6 +91,10 @@ export const clientMessage = z.discriminatedUnion("type", [ submitJuryVoteMessage, tapBingoSquareMessage, submitActualResultsMessage, + startQuizQuestionMessage, + buzzMessage, + judgeQuizAnswerMessage, + skipQuizQuestionMessage, ]) export type ClientMessage = z.infer