Уровень 1 0 / 100 XP
Сегодня
0 мин
0 вопросов
- точность
0 уроков

Завтра счёт начнётся заново

Новое достижение
Первые шаги

Механики

Обёртки над атомами: timer, hp-bar, progress, narrative

Механики

Механика оборачивает содержимое и меняет условия, в которых работают атомы. Сама она ничему не учит и ничего не проверяет.

Отличие от атома:

  • атом это взаимодействие, которое проверяет ответ (quiz, flashcard);
  • механика это правила вокруг (время, жизни, прогресс, сюжет).

Отсюда правило из философии: обучение первично, геймификация вторична. Механика ставится тогда, когда служит учебной задаче, а не ради напряжения.

Классы лежат в site/src/mechanics/, полный API в docs/MECHANICS.md. Параметры ниже сверены с layouts/shortcodes/.


timer

Ограничение времени на блок.

{{< with-timer duration="5m" warning="1m" >}}
  {{< quiz question="Какое суждение фактическое?" >}}...{{< /quiz >}}
{{< /with-timer >}}
Параметр По умолчанию Описание
duration 5m строка вида 30s, 5m, 1h. Не число секунд
warning 1m за сколько до конца показать предупреждение, тот же формат
autoStart true стартовать сразу
position top top, bottom, floating
showControls true показывать кнопки управления

События: timer:start, timer:tick с { remaining }, timer:warning, timer:end, timer:pause, timer:resume.


hp-bar

Шкала жизней, ошибка отнимает единицу.

{{< with-hp lives="3" >}}
  {{< quiz question="Вопрос 1" >}}...{{< /quiz >}}
  {{< quiz question="Вопрос 2" >}}...{{< /quiz >}}
{{< /with-hp >}}
Параметр По умолчанию Описание
lives 3 количество жизней
style hearts вид шкалы
showLabel true подпись рядом со шкалой

Логика: на ответ с correct: false отнимает жизнь. На нуле эмитит session:lose, и модуль practice-lose показывает оверлей и блокирует дальнейшие ответы.

События: hp:change с { oldHp, newHp }, hp:zero, session:lose.


progress

Полоса прохождения по уникальным идентификаторам атомов.

{{< with-progress total="5" >}}
  {{< quiz id="q1" >}}...{{< /quiz >}}
  {{< quiz id="q2" >}}...{{< /quiz >}}
{{< /with-progress >}}
Параметр По умолчанию Описание
total 10 сколько элементов считать за сто процентов
showPercent true показывать проценты
showSteps true показывать точки шагов

Логика: считает уникальные id отвеченных атомов. На ста процентах эмитит session:win.

События: progress:update с { current, total, percent }, progress:complete, session:win.


narrative

Сюжетная рамка вокруг атомов.

{{< with-narrative title="Дело о пропавшем дневнике" chapters=`[
  {"id": "scene", "title": "Глава 1: место события", "intro": "Что мы видим, а что додумали."},
  {"id": "versions", "title": "Глава 2: версии", "intro": "Какая догадка выдержит проверку."}
]` >}}
  {{< quiz question="Что здесь наблюдение, а что вывод?" >}}...{{< /quiz >}}
{{< /with-narrative >}}
Параметр По умолчанию Описание
title Story название истории
description пусто подзаголовок
chapters пусто JSON-массив глав: id, title, intro
currentChapter 0 с какой главы начать
showProgress true полоса глав
showChapterNav false навигация по главам
style minimal вид оформления

Главы передаются атрибутом chapters в виде JSON, а не YAML внутри блока.

События: narrative:chapter-complete, narrative:complete.


Комбинирование

Механики вкладываются друг в друга:

{{< with-timer duration="5m" >}}
  {{< with-hp lives="3" >}}
    {{< with-progress total="5" >}}
      {{< quiz question="..." >}}...{{< /quiz >}}
    {{< /with-progress >}}
  {{< /with-hp >}}
{{< /with-timer >}}

Каждая механика слушает свои события через EventBus, поэтому атом внутри ни о какой из них не знает.


Поток событий

Ученик отвечает неверно
        |
quiz эмитит { correct: false }
        |
hp-bar слушает и снимает жизнь
        |
hp:change
        |
если жизней ноль -> session:lose -> оверлей practice-lose