sigame-shema.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { z } from "zod";
  2. import { DbShema } from "../db-shema.js";
  3. import { GameShema } from "../game-shema.js";
  4. export const SigameShema = new (class SigameShema {
  5. public ZSigameQuestion = z.object({
  6. question_id: DbShema.ZQuestions.shape.question_id,
  7. q_text: DbShema.ZQuestions.shape.q_text,
  8. q_media_filename: DbShema.ZQuestions.shape.q_media_filename,
  9. difficulty: DbShema.ZQuestions.shape.difficulty,
  10. answers: DbShema.ZQuestions.shape.answers,
  11. q_media_type: DbShema.ZQuestions.shape.q_media_type,
  12. a_media_filename: DbShema.ZQuestions.shape.a_media_filename,
  13. a_media_type: DbShema.ZQuestions.shape.a_media_type,
  14. price: z.union([
  15. z.literal(100),
  16. z.literal(200),
  17. z.literal(300),
  18. z.literal(400),
  19. z.literal(500),
  20. ]),
  21. isPassed: z.boolean(),
  22. isEnabledOptions: z.boolean(),
  23. type: z.enum(["cat", "auction"]).optional(),
  24. });
  25. public sigameStages = [
  26. "guide", // ролик с правилами игры
  27. "players-questions-before-game", //вопросы игроков
  28. "question-selection", // игрок выбирает вопрос
  29. "reading-question", // ведущий зачитывает вопрос
  30. "question-timer", // игроки нажимают на кнопку
  31. "player-answer", // игрок отвесает на вопрос
  32. "answer-discussion", // показ правильного ответа
  33. "cat-select", // кот в мешке выбор игрока
  34. "auction-betting", // аукцион ставки
  35. "type-player-answer", // ответ игрока для типового вопроса
  36. "final-intro", // интро перед финалом
  37. "final-category-select", // выбор категории для финала
  38. "final-betting", // ставки игроков
  39. "final-reading-question", // ведущий читает вопрос
  40. "final-game", // игроки отвечают на вопрос
  41. "final-answer", // ведущий выставляет правильные ответы
  42. "extra-questions", // перестрелка на случай нескольких победителей
  43. "outro", // результаты
  44. ] as const;
  45. private ZSigameStages = z.enum(this.sigameStages);
  46. public ZSigame = GameShema.ZGame.extend({
  47. categories: z
  48. .array(
  49. z.object({
  50. category_id: DbShema.ZCategories.shape.category_id,
  51. name: DbShema.ZCategories.shape.name,
  52. questions: z.array(this.ZSigameQuestion),
  53. finalQuestion: z.object({
  54. question_id: DbShema.ZQuestions.shape.question_id,
  55. q_text: DbShema.ZQuestions.shape.q_text,
  56. q_media_filename: DbShema.ZQuestions.shape.q_media_filename,
  57. difficulty: DbShema.ZQuestions.shape.difficulty,
  58. answers: DbShema.ZQuestions.shape.answers,
  59. q_media_type: DbShema.ZQuestions.shape.q_media_type,
  60. a_media_filename: DbShema.ZQuestions.shape.q_media_filename,
  61. a_media_type: DbShema.ZQuestions.shape.q_media_type,
  62. }),
  63. extraQuestions: z.array(this.ZSigameQuestion).nullable(),
  64. }),
  65. )
  66. .min(1),
  67. categoryBlocks: z.array(z.array(z.number())).min(1),
  68. currentBlockIdx: z.number(),
  69. gameStage: this.ZSigameStages,
  70. currentPlayerIdx: z.number().nullable(),
  71. playersScore: z.array(z.number()).min(1),
  72. currentQuestion: z
  73. .object({
  74. categoryIdx: z.number(),
  75. questionIdx: z.number(),
  76. })
  77. .nullable(),
  78. answeringPlayerIdx: z.number().nullable(),
  79. auctionBets: z.array(
  80. z
  81. .object({
  82. bet: z.number(),
  83. isAllIn: z.boolean(),
  84. })
  85. .nullable(),
  86. ),
  87. finalCategoriesIds: z.array(z.number()).min(1),
  88. excludedFinalCategoriesIds: z.array(z.number()),
  89. finalPlayersIdxs: z.array(
  90. z.object({
  91. answer: z.string(),
  92. isReady: z.boolean(),
  93. bet: z.number(),
  94. isRight: z.boolean().nullable(),
  95. }),
  96. ),
  97. finalCategoryId: z.number().nullable(),
  98. winnerIdx: z.number().nullable(),
  99. extraCategoryId: z.number(),
  100. extraPlayersIdxs: z.array(z.number()),
  101. });
  102. })();