← Все продукты
🧠Сценарный движок квеста

BarabakaQuestcontroller

Сердце современного квеста: один движок дирижирует всеми комнатами, светом, звуком, видео и механикой — по сценарию, который вы пишете в простом YAML. Слушает устройства по MQTT, исполняет правила «событие → условие → действие» и ведёт конечный автомат квеста.

Python MQTT Docker YAML-сценарий

Мозг, который управляет всем железом

Вся логика квеста — в одном месте, а не размазана по контроллерам в стенах. Устройства остаются «глупыми» и заменяемыми, а весь ум живёт в сценарии.

событие от устройства условие (статус, переменные) действия: свет · звук · видео · механика

Конечный автомат под контролем движка: idle → prepare → active → win, игровой таймер, переменные и десятки отложенных действий — всё в одном согласованном состоянии.

Что умеет движок

Триггеры

MQTT-сообщение (regex с именованными группами) или изменение переменной (from→to); список = ИЛИ.

Условия

Безопасный мини-язык (не eval): статус квеста, переменные, статус и «пройдена ли» каждой задачи, таймеры.

Действия

Публикация в любые топики, смена переменных, переход статуса, отмена; шаблоны {vars.x}, {match.n}.

Отложенные и именованные действия

«Через 87 с включить лазер» — можно перепланировать и отменять по имени.

Лимит срабатываний max_fires

«Только один раз за игру» — без флагов-костылей.

Встроенные команды

restart, set:players:5, vars_dump; свои команды — правилами сценария.

Одно событие — целая режиссёрская сцена

Свет, звук, видео и механика разных комнат — синхронно, с точностью до миллисекунд.

scenario.yaml — игрок кладёт жука с меткой
# запускается оркестровка на 90 секунд
- id: положили жука с меткой
  on: {topic: eye_table/report, match: "^bug_tag$"}
  if: quest.status == 'active'
  max_fires: 1
  do:
    - pub: {to: entrance-mp/command, msg: "play:f2.mp4"}        # видео
    - pub: {to: [lamp1/command, lamp2/command], msg: "fire:set_brightness,10,2000"}
    - pub: {to: eye_table/command, msg: "laser:on"}
      delay: 87000  name: лазер            # лазер — ровно через 87 с
    - pub: {to: sun_bug/command, msg: "set_status:active"}
      delay: 87000  name: вторая_комната   # и одновременно оживает 2-я комната

Операция на живом сердце

Правки сценария — на работающем квесте

Движок следит за файлом сценария и применяет изменения на лету — команду не нужно останавливать, игру прерывать не нужно.

Логи и надёжность

  • Разрыв с брокером → авто-переподключение, пере-подписка, повторная публикация статуса; исходящие копятся в очереди.
  • Ошибка в одном правиле логируется и не влияет на остальные.
  • Docker: restart: unless-stopped + healthcheck по heartbeat — зависший процесс перезапустится сам.
  • Логи в docker logs и в дневные файлы; каждое правило именовано (видно, что сработало).

Минимум железа

  • Linux-хост с Docker (Docker Compose) + MQTT-брокер.
  • Лёгкий Python-сервис — почти не грузит машину.
  • Требования низкие: движку хватает Raspberry Pi — плата размером с ладонь тянет весь квест.
# запуск — три команды
cp .env.example .env
cp scenario.example.yaml scenario.yaml
docker compose up -d --build

Соберём сердце вашего квеста?

Расскажите о проекте — предложим сценарий и внедрение под ключ.

Написать нам