В R.U.M.B. два этапа: тест стилей DISC, где каждый отвечает, как обычно поступает, и квесты, где видно, как человек действует на деле. С чего начать, решает ведущий. Проблема была в том, что квесты ничем не отличались от теста: восемь ситуаций с четырьмя вариантами ответа, которые каждый проходил в одиночку. По сути это была та же анкета.
Что значит «увидеть стиль в действии»
В тесте человек отвечает так, как видит себя. На тренингах по DISC это дополняют групповыми упражнениями. Самое известное — «Выживание на Луне» из NASA: команда ранжирует предметы, которые возьмёт с собой, а ведущий смотрит, кто ведёт обсуждение, кто приносит идеи, кто поддерживает других и кто проверяет факты.
Мне нужно было то же самое, но на телефонах: команда сидит в одной комнате (живой или онлайн), решает задачу вместе, а приложение само замечает, как каждый в ней участвует.
Механика: четыре действия — четыре стиля
Каждый квест — общая задача: выбрать из колоды несколько лучших карт. Лунная экспедиция — 3 вещи из 10, горящий релиз — 2 меры из 8, командный выезд — 2 занятия при ограниченном бюджете.
- Карты на руках. Сервер раздаёт каждому 2–3 карты, которые видит только он. Без обмена информацией задачу не решить.
- Жетоны. На квест у каждого 4 хода. Ходить можно сколько угодно быстро, но выбор действия ограничен — а значит, информативен.
- Действия. «Предложить» — выложить свою карту на доску. «Проверить» — открыть всем факт о карте. «Поддержать» — добавить вес чужой карте. «Настоять» — двойной вес и финальный отсчёт на 15 секунд.
- Ловушки. Часть карт выглядит отлично, но проваливает задачу: магнитный компас на Луне бесполезен, дешёвый подрядчик сорвёт срок. Без проверок команда их берёт.
Каждое действие соответствует стилю DISC: предлагать — влияние (I), проверять — добросовестность (C), поддерживать — стабильность (S), настаивать — доминирование (D). Одним действием задачу не решить: если никто не проверяет карты, команда берёт ловушки, а карта без поддержки не набирает вес. После последнего квеста коллеги ещё и отмечают друг друга: кто был Капитаном, Вдохновителем, Опорой и Аналитиком. Эти голоса дают четверть итога.
Ловушка в самом подсчёте
Первая версия считала просто: какую долю ходов человек потратил на каждое действие. На ревью стало видно, что правила игры дают стилям неравные шансы:
- «Предложить» можно не больше, чем карт на руках;
- каждую карту проверяет только один человек — кто первым нажал;
- поддержать нельзя, пока никто, кроме тебя, ничего не выложил;
- «Настоять» доступно почти всегда.
Получалось, что человек со стилем C мог просто не успеть ничего проверить и выглядел «не аналитиком». Подсчёт отражал правила игры, поведение тут было ни при чём.
Решение — нормировать по возможностям. Перед каждым ходом сервер запоминает, какие действия человеку были доступны. Доля стиля — это как часто он выбирал его действие, когда мог: (выборы + 0,25) / (доступно + 1).
Сглаживание решает две задачи. Стиль, для которого возможностей не было вовсе, получает небольшую ненулевую долю, а не ноль. А одна-единственная возможность не превращается в 100 %. Пример из тестов: участник дважды выложил карту, а поддерживать ему было нечего. Раньше выходило 100 % I, теперь D 10 / I 60 / S 20 / C 10 — I явно ведёт, но без вывода «других стилей у человека нет».
Всё решает сервер
Квест — это игра в реальном времени, поэтому всё решает сервер, а клиенты только показывают состояние:
- Таймер на сервере. Часы на телефонах врут, поэтому сервер присылает своё время, а приложение считает поправку. Ход после дедлайна в квест уже не попадёт.
- Перезапуск не ломает игру. Состояние комнат сохраняется на диск, а таймеры идущих квестов заново взводятся при запуске. Квест, который успел истечь, пока сервер стоял, сразу завершается.
- Содержимое карт присылает ведущий. Обновления из магазинов доходят не сразу, и у ведущего с участником версии приложения могут отличаться. Если бы тексты квестов брались из приложения участника, новый квест у него просто не отобразился бы. Факт и ценность карты сервер раздаёт, только когда её проверили или квест закончился.
Что нашло ревью
Перед выкладкой я прошёлся по всему изменению как по чужому коду. Самая неприятная находка не касалась квестов напрямую: исключение в обработчике одного сообщения роняло весь процесс лобби, а с ним все комнаты на сервере. Воспроизвелось это случайно — на снимке комнаты в старом формате. Теперь ошибка логируется, отправитель получает отказ, остальные комнаты живут дальше.
Остальное мельче, но на встрече было бы заметно:
- двойное нажатие отправляло второй ход — кнопки теперь ждут ответа сервера;
- таймер перерисовывал всё приложение четыре раза в секунду — теперь он тикает вне Angular и обновляет только экран квеста раз в секунду;
- финальный отсчёт не было видно на полосе таймера — глобальный стиль перекрашивал её в градиент.
Что в итоге
- Три квеста и «Кто есть кто» занимают 6–7 минут.
- Стиль в квестах считается по ходам и отметкам коллег.
- Если самооценка и поведение расходятся, отчёт это показывает. Обычно с этого и начинается разговор на встрече.
Для себя я запомнил: прежде чем считать проценты по игре, надо проверить, у всех ли стилей были одинаковые шансы проявиться.
Обновление от 26 октября
С тех пор квесты заметно изменились. Квестов теперь пять, время на каждый выбирает ведущий. Квест больше не заканчивается сам: когда выходит время или кончаются ходы, ведущий решает, принять выбор команды или дать ей ещё 30 секунд.
- Если на границе выбора карты набрали поровну, ведущий не может сразу принять исход: сначала команда получает ещё шанс выбрать сама. Раньше такую ничью тихо решал порядок выкладки, а в синтетике это случалось в каждом шестом квесте.
- Одному игроку можно выложить не больше двух карт за квест, чтобы доску не заваливал кто-то один.
- Доска больше не сортируется по весу: карты лежат в порядке выкладки, а вес крупно виден на каждой.