В марте 2025, когда анонсировали сбор активностей для кэмпа, я решил попробовать намутить квест, переняв эстафету у @mrVerge: вот его пост о первом квесте.
Я, как и Андрей, тоже не пальцем делан: был капитаном команды в Дозоре и в Энке в Казани, написал несколько авторских игр и несколько игр в качестве помощника организаторов. С тех времён в маминой квартире до сих пор валяются трафареты от меток и горы засохших краскомаркеров.
В общем, я подал заявку на активность на кэмпе. Её аппрувнули. И всё заверте...
Планирование
На прошлом кэмпе было очень много активностей, связанных с технологиями, которые можно пощупать: паяльный мастер-класс, возможность поуправлять дроном и поиграть в VR — эти темы запали мне в душу. Я же на прошлом кэмпе читал лекцию по навигации в лесу.
Поэтому первоначальный план был — совместить всё воедино. Наделать всяких разных девайсов, развешать их по близлежащему лесу и отправиться ориентироваться по нему, решая там разные задания. В идеале — ночью, увешанными всякими неоновыми лентами и гирляндами.
В общем, с этим планом я заполнил формочку и стал ждать ответа.
Разделение
Когда появился общий чатик, я описал свою активность и попробовал найти единомышленников. Откликнулись @NotYetBenGan и @SonyaGerman, сказав, что хотят делать ориентирование, а квест не хотят)) (но в целом готовы помочь)
Через недельку-другую @KaterinaPetrova и @vnvdm завели нам чат для активности. Мы пообсуждали наши планы, посмотрели на опросы и решили разделиться: ориентирование будет отдельной движухой, а квест будет попроще. Ну, это организаторы думали, что попроще, хехехе...
На самом деле, идея разделения была удачной — она позволила сделать ориентирование быстрым и динамичным, а квест более наполненным.
Роковая встреча
В один прекрасный апрельский день я пришёл в белградский хакспейс послушать доклады о высокоточной навигации и картографии и внезапно встретил там @rostegozavr. После недолгих уговоров, Ростислав согласился помочь с разработкой. Эта встреча стала событием, определившим весь дальнейший путь разработки квеста.
С этого момента разработка вошла в активную фазу. Мы накидывали абстрактных идей для заданий, а первым вызовом оказался выбор сеттинга.
Технотайз: Эдит и я
Из всех предложенных Ростиславом вариантов, этот мультфильм набрал больше всего голосов: целых три.
Это добротный киберпанк, весьма прилично сделанный для своего времени и бюджета: его производство началось примерно в 2004 году и обошлось меньше чем в миллион долларов. Действие мультфильма происходит в Белграде, что делает его идеальным кандидатом для кэмпа в формате кибер-села в Сербии.
Я не буду много рассказывать про фильм — почитайте сами статью из раздела «Культовое кино» на Кинопоиске.
В общем, если вы играли в квест, но не смотрели — посмотрите обязательно, иначе как-то уж совсем странно... А если посмотрели — можете ещё найти комикс Гайича с названием «Технотайз», дабы сравнить и понять, что вообще-то мультфильм вышел вполне в рамках приличия.
Итак, у нас появился киберпанк-сеттинг, а значит, мы уже были не так привязаны к лесу. Дима сказал, что территория кэмпа будет большой, так что можно спокойно развернуться на нём. И мы сосредоточились на кибер-составляющей: квестовых заданиях
Заказываем железо
Пошерстив доступные варианты на алике и тему, мы решили использовать несколько базовых контроллеров. Это была ещё и диверсификация рисков — почта стала подтормаживать, заказы с алика подвисали, и на случай, если что-то не дойдёт, у нас были бы хоть какие-то альтернативы.
Для устройств без экранов мы выбрали самые обычные Arduino Uno, которые давным давно были закуплены мной в Казани под какой-то квест.
Для устройств с экранами мы взяли платы на базе ESP32 в нескольких вариантах от Waveshare: семь девайсов поменьше заказали из Китая и три девайса побольше заказали в Белграде чуть позже. На самом деле, ещё с родины мне привезли еспшку с монохромным дисплеем, а в Белграде мы заказали есп с экраном побольше. Но поскольку они были в единственном экземпляре, их отложили в резерв — под них надо было всё делать с нуля.
Также заказали десяток аккумуляторов типоразмера 18650 и столько же корпусов для них в формате компактных пауэрбанков. У плат побольше есть разъёмы для прямого подключения аккумов — заказали четыре плоских аккума.
И самое главное — заказали ворох разных сенсоров. Двадцать одну штуку. На всякий случай, с запасом.
И началось мучительное ожидание, сопровождавшееся растущей тревогой: вдруг вообще ничего не дойдёт вовремя. Или дойдёт, но слишком мало.
Пилим бота
Сидеть сложа руки было тяжко, и я решил вложиться в разработку бота. Благо, у меня даже был опыт поддержки движка дозора, так что пул задач был вполне понятным.
Принимать задания вручную, по опыту прошлого квеста, было не самой оптимальной стратегией: слишком высок был риск накосячить.
С другой стороны, нам нужно было принимать не только текстовые коды, но ещё и фотки и видео. А ещё структура квеста должна была позволять выполнять задания в любом порядке, что обычно нехарактерно для классических городских или корпоративных квестов, и поэтому готовые движки нам не подходили.
Благо, есть Cursor, который может нагенерить приличную реализацию. Так что почти весь бот был написан LLM.
Другие задания
Помимо заданий с электроникой, нам нужны были и другие варианты. Ростислав занялся загадками, а также закупил головоломок и пазлов и отобрал из них самые удачные.
А я снова сходил в хакспейс и собрал у них футуристичного вида клавиатуру. Она не входила в мои изначальные планы, идея заиграть её родилась и сформировалась во время тренировки навыка слепой печати.
А ещё, вспомнив, что у меня есть чековый принтер, решил заиграть его мини-квестом внутри квеста. Необходимо было собрать строгое количество игровой валюты, спрятанной по всему кэмпу, чтобы получить чек со спрятанным в нём кодом. И пиво, конечно.
Мастерим прототипы
К середине мая начали приходить посылочки. К моему удивлению, первыми доставили аккумуляторы — особо опасный груз, который не каждая курьерская служба готова перевозить (так заявляет Temu)
Но ещё раньше ко мне приехали с родины простенькая платка на базе ESP32 и простенький монохромный дисплейчик. На них я восстанавливал свои навыки разработки под ардуино-совместимые платы, чтобы по прибытии основных девайсов быстрее вливаться в процесс. Эффект был сомнительным — под цветные экраны всё-таки рисовать сложнее. Особенно кириллицей.
Потом приехали платы, но без сенсоров они были бесполезны. А семнадцать сенсоров приехали в самое потрясающее время: в субботу в 11:50 — за 10 минут до закрытия отделения почты. Выходные насмарку.
Итак, минимальный набор есть — сенсоры и платы. Можно засесть за разработку. И, как оказалось, в этом деле LLM дают маху — при попытке сгенерить проект с нуля с указанием используемого оборудования, результат выходит абсолютно несовместимым с рекомендованными библиотеками. Сносим и начинаем кодить на базе примеров, предоставленных разработчиком библиотеки. Даже несложные задачи вида «проанализировать имеющуюся кодовую базу и повернуть экран на 90 градусов» давались модели с большим трудом, и намного проще было бы повернуть его самостоятельно, почитав исходники. Штош, если боитесь, что роботы заберут вашу работу — попробуйте вкатиться в железки, документация к которым мало попадала в датасеты.
Досадно вышло с подключением аккумуляторов напрямую к платам с контроллерами заряда: разъёмы не сходились. На аккуме пины были в обратном порядке и на четверть миллиметра меньше. Кое-как переделал, но это, конечно, адский костыль.
Кстати, видели выше в табличке мои оптимистичные оценки «полчаса вайбкодинга»? А вот фиг там. Минимум часа полтора, и то, если уже есть какая-то основа для вывода данных на экран.
В течение последней недели перед кэмпом приехали вообще абсолютно все заказы с алика и тему. Даже те, которые я заказывал в марте для себя и жены. Поэтому в последние выходные мы с Ростиславом засели за сборку и тестирование.
Корпуса были максимально всратые — это были распредкоробки с дурацким винтом ровно посередине. Из-за такой конструкции в них не влезли аккумуляторы, но переделывать что-то было поздно.
Но процесс этот не обошёлся без потерь. При попытке прорезать очередной кусок довольно крепкого пластика, Ростислав воткнул себе нож в палец.
И ещё один удивительный прикол: изначально я закупил пачку тач-сенсоров, чтобы все девайсы висели в режиме ожидания с потушенным экраном и не жрали заряд. Но оказалось, что плата пауэрбанка, увидев низкий ток, решала, что ей никто не пользуется, и отключала питание. Пришлось сделать странное — отказаться от экономии электричества, чтобы девайсы продолжали работать. Благо, за пять часов непрерывной работы с прослушиваемым сенсором большинство из них разряжали аккум меньше чем на половину.
Выход в город
Впрочем, помимо электронных девайсов у нас ещё собрались задачки других форматов. Две из них мы успешно оцифровали и разместили в облаке — Cloudflare Pages оказался просто офигеннейшим решением для таких целей — мержим в мастер, и через 20 секунд изменения на проде, девопс не нужен. Ещё несколько задач были подготовлены в формате бумажек или физических объектов.
Но самая коварная задача такого плана была размещена в Белграде. Я распечатал код на стикере и вечером четверга, за неделю до кэмпа, после тренировки по стрельбе из лука прошёлся по крепости и наклеил его ровно в то место, которое фигурировало в фильме.
Принцип его взятия был довольно простым: вместо того, чтобы тащиться три часа в город, достаточно было найти знакомых в Белграде или написать свою просьбу где-нибудь, например, в чате «Вастрик.Балканы». Три команды справились с задачей. Правда, одна сделала это относительно читерским способом — они обратились к @thirteen810 за помощью. Полина вообще-то была на квесте, но так сложилось, что она уже видела этот код: я просил её перед отъездом на кэмп сбегать и проверить, жив ли стикер. Команды об этом не знали.
Деплоимся в кэмп
Итак, наступает четверг, я привожу две коробки всякого разного стаффа на кэмп. Незаметно подкрадывается вечер пятницы и мы начинаем финальный этап подготовки к квесту. К нам на помощь приходит Мы нагло крадём с посиделки у костра с Сансарой @vorona_karabuta, которую заставляем на сонную голову в два часа ночи решать наши загадки. А ей дополнительно помогают ещё @tetelevm, @kutovoys и периодически набегающие волонтёры, которым предстоит быть агентами.
По результату тестов мы перепаиваем один сенсор, одну задачку исключаем, в субботу фиксим пару багов, правим несколько текстов и в целом получаем более-менее готовое состояние. Инструктируем агентов по поводу их ролей в квесте, дописываем руководства в канале квеста и вроде практически готово.
Субъективно, самая сложная агентская роль досталась и без того загруженному Владу @vladles — он «продавал» в баре пиво, и к каждой банке должен был выбивать чек. При этом, не отрываясь от других барных дел.
За десять минут до формального начала, т.е. в 14:50, Ростислав с Володей взяли в охапку все девайсы, бумажки и карточки и побежали их развешивать по всему кэмпу. Агенты со своим оборудованием тоже были на низком старте. Я продолжал вносить правки и начал подозревать неладное: сообщения отправлялись всё дольше, запросы к серверу квеста долетали всё хуже — сеть кэмпа переставала справляться с нагрузкой от обилия людей в главном доме и вокруг него. С этими страшными наблюдениями мы с Катей выдвинулись проводить брифинг.
Ход квеста
Кое-как собравшись под палящим солнцем возле сцены, команды прослушали (причём, как мне кажется, именно «пропустили мимо ушей») вводный инструктаж и начали готовиться к старту. Сеть еле держалась, и команда на старт квеста отправилась лишь через две минуты после запланированного старта. Но получив задания, команды разбежались, и стало полегче.
Ростислав взял пачку купюр для задания с пивом, а также пачку пазлов и отправился прятать эти ништяки по всей территории. Мне достались только купюры, поэтому я попутно ходил и тестил девайсы, а также отвечал на вопросы и справлялся у агентов об их делах.
Квест шёл бодренько, команды активно бегали и выполняли задачки. Ближе к концу ко мне обратились с предложением продлить квест, но такие решения нельзя принимать без консультации с организаторами — расписание съедет. Посоветовавшись с оргами, решили, что объявленное время финиша останется неизменным.
Факап
Однако в последний момент всё пошло не по плану. Несмотря на все наши уговоры на стартовом брифинге, команды решили отложить сдачу видео и фото на последний момент, и таким образом вновь нагрузить еле живую сеть кэмпа.
В этот момент я стоял у сцены, готовый к вопросам в последние пять минут, и держал палец на рубильнике, чтобы вовремя выключить квест. И как только часы показали 18:00, я нажал на кнопку.
Минуту спустя раздалось объявление, что квест продлевается из-за проблем с сетью. Но я его не услышал, потому что как раз только-только зашёл в штаб. А бот уже был остановлен, и перезапуск его потребовал бы некоторого времени.
Лучшим выходом для игроков из этой ситуации было позволить досдавать задания в дополнительное время мне в личку. В первую очередь, конечно, фото и видео — с их отправкой проблем было больше всего.
Мы вернулись к тому, от чего хотели уйти — к ручной проверке и сортировке ответов. Штош. Такова наша плата за недостаток коммуникации.
Подведение итогов
Быстро поужинав и подискутировав с игроками, пытавшимися отвоевать баллы через апелляции, мы с Ростиславом отправились на чердак подводить итоги. Всё, что было принято ботом, проверялось довольно легко — я обнаружил всего две ошибки при создании заданий, одну из которых было очень легко исправить, а вторую можно было просто держать в уме при подсчёте.
Но когда дело дошло до подсчёта досдач, процесс стал медленнее и сложнее. Посреди него пришлось прерваться, чтобы поучаствовать в награждениях за кэмп и часочек потусить на рейве (пока на чердаке шла медитация), после чего мы вернулись к подсчётам и где-то к половине второго ночи их завершили полностью, включая оценку фото- и видеозаданий.
Наутро состоялось награждение команд и на этом квест практически завершился. Дома после кэмпа я ещё раз перепроверил итоги и собрал сводную таблицу по всем заданиям и всем командам.
Выводы
- Начинать подготовку надо заранее. Сильно заранее. Если начать за полтора месяца, то на самое сложное, сборку и программирование девайсов, останется пара недель — это всё-таки маловато. И нам очень повезло, что всё приехало достаточно быстро.
- Коммуникация — это важно. Если бы решение о продлении было принято хоть немного заранее, проверка заданий заняла бы от силы часа полтора.
- Задания надо перепроверять тщательнее. Мы обнаружили пару проблем в текстах заданий, которые нельзя было бы исправлять после начала квеста, поскольку это создало бы серьёзное неравенство между командами
- Довольно сложно подготовить локацию к квесту заранее, но так, чтобы никто не начал преждевременно играть. Если этого не делать — будут нестыковки. Как быть — пока не знаю.
- Но идеально сделать всё равно не получится, как ни старайся. Всё равно будут какие-то факторы, которые нельзя контролировать. Например, местами нас подводило API ботов в телеграме, да и предвидеть такие серьёзные проблемы с сетью мы не могли.
Несмотря на всё это, было весело. Читерить было разрешено в пределах разумного, и команды обманывали сенсоры как могли: закрывали датчик движения, брызгали разными аэрозолями в алкотестер, а датчик дыма запихивали в тлеющие угольки от костра.
(На самом деле, у нас ещё есть видосики, но если выложить самый топовый, то пост придётся делать закрытым)
Зато вот могу поделиться исходниками всего проекта: это всё написано курсором, но как-то работает. Там есть бот, есть веб-таски (которые можно деплоить в клаудфлейр) и есть таски для Arduino IDE. Мб кому-то пригодится.
Благодарности
Такую работу совершенно невозможно провернуть в одиночку. Поэтому я считаю своим долгом отметить вклад всех, кто участвовал:
- @rostegozavr — человек, вклад которого в квест просто невозможно переоценить
- @vnvdm — с самого начала планирования консультировал и поддерживал нашу инициативу, а на квесте сидел на самой жаркой локации
- @vorona_karabuta — превозмогая усталость тестировала наши безумные загадки и находила варианты их улучшить, а также принимала пазлы и вместе с Ростиславом оценивала фотки и видео
- @KaterinaPetrova — организовывала нам подмогу, согласовывала активность и выдавала командам «оружие»
- @NotYetBenGan — помогал Ростиславу обвешивать кэмп сенсорами за считанные минуты перед стартом
- @thirteen810 — проверяла состояние стикера в Белграде и оплачивала командам их развлекательные номера
- @tetelevm — помогал Лене тестить и подкидывал идеи разной степени безумности, нарезал купюры
- @vladles — считал денежки команд и угощал их пивом
- @mixbez — исполнял роль профессора Гослинга, принимая у команд зачёты по слепому чистописанию
- @kutovoys — загадывал задачку со спичками, не отрываясь от радиовещания
- @vas3k — был тайным агентом, что
неиграет в кости - @IgorSlinko — стерёг бункер, чтобы команды не могли в него прорваться до апокалипсиса
- За фотки и видео в посте спасибо @ilyaluk, @annmuor, @ivanbut, @OnlineCodeBase, @m0rtyn, а также уже перечисленным ранее Ростиславу, Кате, Лене и Мише.
- Всей команде организаторов кэмпа за сам кэмп и за возможность вложиться в его активности
- И, конечно, спасибо 94 игрокам из 19 команд, которые приняли участие в этом безумстве: без вас это всё просто не имело бы смысла
Я просто не могу не отметить, что Данис блин какой-то невероятный чувак (не знаю насколько сильно Ростислав невероятный чувак), который пожертвовал своим участием в движухах во имя чужих движух!
Данис — лучший!
Класс! Безумно рад, что квесты на вастрик.сборищах живут и развиваются!
Круто, что вы сделали то, что я побоялся - большую техническую часть с техно-артефактами и ботом. И спасибо за выводы, подписываюсь под каждым. Надеюсь это поможет авторам следующих квестов.
Квест топ! Спасибо за организацию всей движухи)
У меня только остался вопрос - на многих заданиях агенты требовали присутствия всей команды для прохождения и говорили "вы потом поймете, почему это важно". Но я в итоге не понял!
Да, это наверное первая активность (кроме покера кек), на которой я присутствовал от начала и до конца, и она была мегакрута.
Конечно, жаль, что так вышло с концовкой, наша команда могла бы ещё пару фрагов залутать, но мы решили, что раз время всё, то чилим... Ничего, в следующий раз не будем верить никому, и решать задачки до последнего.
Спасибо, Данис, ты отлично поработал.
Это был потрясающий экспириенс: готовить и проводить этот квест!
Кстати, про датчик дыма, он был приклеен к заду деревянного бычка - и многие команды носили его к костру (это не было изначально так задумано, это участники случайно изобрели)