Bug Hunter — игра, спрятанная в терминале

На главной странице есть терминал для связи. Если набрать в нём play, начнётся аркада про баги, которые ползут в прод. Рассказываю, как её найти, правила, боссов и пару секретов.

Содержание
  1. Как найти игру
  2. Цель игры
  3. Управление
  4. Жизни и очки
  5. Бонусы
  6. Секрет: rollback
  7. Боссы
  8. Звук и рекорд
  9. Как это сделано

Внизу главной страницы есть блок «Связаться со мной» — интерактивный терминал. В нём можно набрать telegram, mail или github и получить контакты. Но у терминала есть секрет: команда play запускает Bug Hunter — аркаду в духе Space Invaders, только вместо пришельцев здесь баги.

Как найти игру

Откройте главную страницу и прокрутите до терминала. Если набрать help, он покажет все команды, а внизу — подсказку: psst… попробуйте play.

Подсказка в справке терминала
Подсказка в справке терминала

Игра откликается на несколько команд: play, game, bugs, bughunter, а по-русски — игра и баги. Ещё её можно запустить кнопкой play в строке подсказок под терминалом.

Цель игры

Сверху строем маршируют баги — null, NaN, 404, 500, undefined, segfault, NPE, TODO, leak, race, panic, deadlock, err и -1. Они медленно ползут вниз, к проду. Внизу — корабль </>, который закрывает их патчами.

Каждая волна — новый релиз: v0.1, v0.2 и дальше. Когда все баги волны закрыты, начинается следующий релиз. С каждым релизом рядов становится больше, а баги стреляют в ответ чаще и быстрее.

Игра заканчивается экраном Prod down в двух случаях: закончились жизни или баги доползли до корабля.

Старт релиза v0.1: баги в строю, среди них зелёный rollback
Старт релиза v0.1: баги в строю, среди них зелёный rollback

Управление

  • ← → или A D — движение. В русской раскладке работают Ф В.
  • Пробел или ↑ — патч. Если держать клавишу, корабль стреляет очередью.
  • Q или Esc — выход в терминал.

На телефоне всё на касаниях: корабль едет за пальцем и стреляет, пока палец на экране. Тап по полю — старт.

Жизни и очки

В начале три жизни, максимум — пять. Очки зависят от номера релиза: чем дальше, тем дороже каждый баг.

  • Обычный баг — 10 очков × номер релиза.
  • Heisenbug — 250 × номер релиза. Время от времени он пролетает над строем и мерцает: попасть можно, только пока он виден. Из него всегда выпадает бонус.
  • Босс — 1000 очков за каждый уровень босса и одна жизнь сверху.
  • rollback — об этом ниже.

Бонусы

Иногда из закрытого бага выпадает чип. Поймайте его кораблём — и на 7 секунд патчи станут сильнее:

  • Hotfix — скорострельность;
  • Refactor — тройной патч веером;
  • Linter — пробивающий луч, который проходит насквозь через несколько багов.

Пока действует один бонус, новые выпадают реже.

Секрет: rollback

Иногда в строю прячется особенный баг — зелёный ♥ rollback. Если закрыть его патчем, вернётся одна жизнь. А если жизней уже пять, вместо жизни начислится 500 очков × номер релиза.

Rollback появляется не в каждом релизе. Но игра немного подыгрывает: когда остаётся последняя жизнь, шанс встретить его заметно выше.

Боссы

Каждый третий релиз вместо волны багов выходит босс со своим стек-трейсом. Он качается из стороны в сторону и стреляет залпами. Боссы идут по кругу, и с каждым кругом у них больше здоровья — потолка нет:

bug-hunter.tsxTypeScript
const BOSSES = [  { name: 'Legacy Monolith', trace: ['at Monolith.init (legacy.js:1)', 'at god_object.do_everything()', 'at <anonymous>:9999'] },  { name: 'Spaghetti Code', trace: ['at goto label_42', 'at callback(callback(callback()))', 'at utils_final_v2_new.js:666'] },  { name: 'Prod Incident', trace: ['at deploy (friday.sh:17:00)', 'at db.migrate(--force)', 'at pager.wake(3:00 AM)'] },  { name: 'Merge Hell', trace: ['<<<<<<< HEAD', '=======', '>>>>>>> feature/everything'] },];

Звук и рекорд

Звук по умолчанию выключен — включается кнопкой в шапке терминала. Все эффекты синтезируются прямо в браузере через Web Audio, без аудиофайлов. Выбор запоминается.

Рекорд хранится в браузере. После выхода терминал напечатает итог: до какого релиза удалось дойти, счёт и лучший результат.

Prod down: баги победили
Prod down: баги победили

Как это сделано

Игра — один React-компонент, который рисует всё на canvas в одном цикле анимации: строй багов, патчи, частицы взрывов, всплывающие очки и баннеры релизов. Шрифты те же, что на сайте, поэтому игра выглядит частью терминала, а не вставкой. Если в системе включено снижение анимации, баги перестают покачиваться, а взрывы частицами отключаются.

Если дойдёте до Merge Hell — напишите мне в Telegram, какой у вас рекорд.