diff --git a/src/lib/components/QuestionModal.svelte b/src/lib/components/QuestionModal.svelte index 11b3d56..52f6090 100644 --- a/src/lib/components/QuestionModal.svelte +++ b/src/lib/components/QuestionModal.svelte @@ -4,26 +4,42 @@ interface Props { category: Category; question: Question; + /** Раскрывал ли ведущий подсказку для этого вопроса (из состояния). */ + hintUsed: boolean; + /** Сообщить, что ведущий раскрыл подсказку (сохраняется в состоянии). */ + onMarkHintUsed: () => void; onAward: (points: number) => void; onReject: () => void; onClose: () => void; } - let { category, question, onAward, onReject, onClose }: Props = $props(); + let { + category, + question, + hintUsed, + onMarkHintUsed, + onAward, + onReject, + onClose + }: Props = $props(); let answerShown = $state(false); - let hintShown = $state(false); - // При смене вопроса — сбрасываем локальное состояние показа. + // При смене вопроса — сбрасываем локальное состояние показа ответа. + // Подсказка живёт в состоянии игры (`hintUsed`), поэтому отдельно не сбрасывается. $effect(() => { question.id; answerShown = false; - hintShown = false; }); // Творческие вопросы — мягкие формулировки. const isCreative = $derived(question.type === 'creative'); + // Половина стоимости — для частично правильного ответа или ответа с подсказкой. + const halfPoints = $derived(Math.round(question.points / 2)); + // Сколько очков даёт основное «Засчитать»: с подсказкой — половину, иначе полное. + const awardPoints = $derived(hintUsed ? halfPoints : question.points); + // Управление с клавиатуры: Esc — вернуться (если ответ скрыт — закрыть модал, // иначе просто убрать фокус с кнопки). Удобно ведущему. function onKeydown(e: KeyboardEvent) { @@ -83,10 +99,10 @@ {#if question.optionalHint}
- {#if !hintShown} + {#if !hintUsed} + + {#if !hintUsed} + + {/if} +
+ {#if hintUsed} +

+ 💡 Подсказка показана — ответ засчитывается за половину стоимости. +

+ {/if} +