Бессерверный детектив: создание ARG с пятью шифрами без регистрации и бюджета

Прокомментировать Просмотры: 8

Привет, SE7EN. Я независимый разработчик, представляющий собой тандем одиночки и ИИ-ассистента. Наш проект — tempapp.ru, где разворачивается сюжет «дела № 031», сезонного детектива в жанре ARG (альтернативная реальность). Пользователю предстоит отыскать затерянную папку с документами, перехватить весточку от пернатого информатора, изучить чужой дневник образца 1999 года, распутать клубок головоломок и в кульминации осознать, что само расследование таило в себе куда больше смыслов, чем казалось на первый взгляд.

Вся архитектура держится на статическом хостинге. Никаких серверных скриптов, процедур регистрации или баз данных. Затраты на содержание инфраструктуры равны нулю. Ниже я подробно распишу внутреннее устройство проекта и те компромиссные решения, на которые пришлось пойти.

Цели и исходные ограничения

Хотелось реализовать: многоуровневое повествование на 6 эпизодов, персистентность пользовательского прогресса, атмосферный тайминг релизов (тематические ивенты по пятницам), сквозную продуктовую аналитику и устойчивость к паузам — возможность пройти сезон в любой момент без вмешательства администратора.

Технические рамки: статика на базе Object Storage + CDN, единственный разработчик в штате и абсолютное доминирование мобильных устройств у аудитории.

Проблема первая: синхронизация прогресса без учетных записей

Бэкенд отсутствует как класс. Сохранение идет через localStorage хаба, однако вспомогательным страницам с уликами нужно как-то сигнализировать главному модулю о прохождении этапа. Теоретически можно было завязаться на общее хранилище браузера в рамках одного домена, но это напрочь ломает сценарии вроде «улика найдена со смартфона, а сводный хаб открыт на ПК», да и в целом выглядит довольно хрупко.

Найденное решение: кодовые слова выступают в роли декларативного протокола синхронизации. Завершая главу, сателлит выдает игроку кодовую фразу. Пользователь вводит ее на хабе, после чего система фиксирует улику. Такой подход органично вплетен в лор, превращая служебный механизм интерфейса в элемент расследования.

Логика валидации на хабе выглядит примерно так:

function checkCode(word){  const w = (word || '').toLowerCase().trim();  if (w === 'клевета'){ /* улики 3-5, цель case031_kleveta_hub */ }  else if (w === 'протокол'){ /* улики 6-7, цель case031_protokol_hub */ }  else if (w === 'голубь'){ /* уже сработало раньше */ }  else { /* ложный след, цель case031_wrong_code */ }}

Побочный эффект превзошел ожидания: необходимость вручную переносить слово между вкладками или девайсами создает мощный тактильный эффект работы с реальными вещественными доказательствами.

Проблема вторая: головоломки для человеческого ума

Кампания выстроена так, чтобы заставлять менять когнитивные паттерны, но при этом каждая задача решается подручными средствами:

Шаг

Шифр

Разгадка

1

Цезарь +3: «ЁСОЦДЯ»

ГОЛУБЬ (алфавит 33 буквы, с Ё)

2

Морзянка -.- .-.. . .-- . - .-

КЛЕВЕТА

3

Акростих из 8 записей дневника

ПРОТОКОЛ

4

Перестановка «УПШСОИ», ключ 1-7-0-9-1-9

ТИШИНА (ключ: дата газеты 17.09.1999)

5

Дверь из пяти слов

ОТДЕЛ

Азбуку Морзе пернатый вестник отстукивает визуально через мерцание прозрачности изображений (длительность импульса — 170 мс). Ключ шифрограммы зашит в окружение: датировка газетного выпуска 17.09.1999 совпадает с реальной пятницей по календарю. Каноничное время пропасти персонажа — ночь на пятницу. Аудитория замечает и высоко оценивает такие детали.

Проблема третьих: расписание без серверного планировщика

Регулярные ивенты обычно требуют настройки cron-задач в облаке. В нашем случае временная шкала рассчитывается прямо в браузере:

const d = new Date();const isSignal = d.getDay() === 5 && d.getHours() >= 19;

В пятницу в 19:00 интерфейс папки подсвечивается «сигналом», а сателлиты открывают доступ к секретным записям. Никаких таймеров на бэкенде. Да, системное время на устройстве можно изменить, но это сюжетное приключение, а не киберспортивный турнир: честность игрока здесь является частью правил игры.

Проблема четвертая: адаптация под смартфоны

Для десктопных пользователей предусмотрена приятная пасхалка — тайп-трап. Игрок может вводить ключевое слово на клавиатуре в любой точке интерфейса, а кольцевой буфер последних 8 нажатий считывает команду:

buf = (buf + e.key.toLowerCase()).slice(-8);

На мобильных устройствах физической клавиатуры нет, поэтому данный метод не применим. Выходом стали стилизованные элементы ввода: «полевая рация» на сателлитах и консоль ввода кодов на хабе. Тайп-трап остался приятным бонусом для владельцев ПК, никак не блокирующим основной игровой процесс.

Сбор аналитики в бессерверной среде

Вся воронка завязана на кастомные цели Яндекс.Метрики: case031_open, case031_ep1, case031_morse, case031_kleveta_hub, case031_friday9 и так далее. Вызовы обернуты в блоки try/catch, чтобы блокировщики рекламы не нарушали стабильность работы скриптов:

function caseGoal(name){  try { ym(111******, 'reachGoal', name); } catch(e) {}}

Это позволяет отслеживать зоны, где пользователи теряют темп, не собирая при этом лишней чувствительной информации. Идеальный баланс: полная анонимность для аудитории и детальная воронка для автора.

Резюме

На текущий момент готовы три эпизода из шести, суммарный вес которых составляет около 80 КБ статического кода (HTML/JS). Содержание проекта обходится дешевле стоимости минимального VPS. Главные практические выводы:

  1. Кодовые слова в качестве протокола синхронизации — это простое, отказоустойчивое кроссплатформенное решение, гармонично вписанное в контекст.

  2. Клиентский расчет расписаний отлично работает везде, где манипуляции с часами не ломают игровую экономику.

  3. Шифры должны поддаваться разгадке «на коленке». Появление необходимости использовать сторонние утилиты вроде CyberChef резко повышает порог входа.

  4. Трекинг через цели аналитики заменяет сложный бэкенд, исключает сбор персональных данных и полностью покрывает продуктовые потребности.

Адрес проекта: https://tempapp.ru (папку с делом предстоит обнаружить самостоятельно). Сезон доступен для прохождения в любой момент, а трансляция сигналов традиционно стартует по пятницам после 19:00.

Готов ответить на любые технические вопросы в комментариях. Вопросы по сюжету оставим за кадром — расследование продолжается, никаких спойлеров.

 

Источник

Поделиться:

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов