Усиление, которое не трогает пещеру
Лазер в TUNL прожигает кристаллы, мины и целые каменные острова. Добавить его, не изменив ни одного камня ни в чьей пещере дня, означало, что он вообще не мог быть новой монетой. Он должен был стать старой монетой с новой этикеткой.
До лазера валуны были единственным препятствием, которое нельзя было сбить. Пули отскакивают от них с искрами, разбить валун может только бомба, и так задумано: валун - это каменный остров с двумя гарантированными проходами, и пролететь проход - это и есть мастерство. Запрос был на что-то сильнее пули, что всё же может их разбить. Само оружие было лёгкой частью.
Оружие
Подбери лазер, и на две секунды от носа корабля до первой стены протянется луч. Кристаллы, мины и снаряды пушек на его линии исчезают сразу и приносят очки, как попадание пулей. Валун останавливает луч, начинает светиться и рассыпается обломками. Сначала я на бумаге попробовал две другие формы - очередь пробивающих зарядов и один заряженный выстрел, - и обе слишком напоминали уже существующую монету патронов. Луч безошибочно читается как другое оружие.
Ограничение: одна пещера для всех
В конкретный день все игроки летят по одной и той же пещере. Пещера нигде не хранится; она вычисляется из даты генераторами случайных чисел с сидом, по одному потоку на каждый вид объектов, как я описывал в записи о пещере дня. Подвох в том, что потоки - это последовательности. Если генератор монет вытянет одно лишнее случайное число, каждая следующая монета выпадет иначе, и два игрока на разных версиях приложения в один день полетят по двум разным пещерам.
Это исключило очевидный дизайн. Дать лазеру собственный вес в розыгрыше монет значило бы сдвинуть долю каждой другой монеты и перебросить каждую монету начиная с четвёртого сектора. Я также отказался от улучшения монеты патронов, которое было бы нечитаемым, ведь патроны расходуются меньше чем за две секунды, и от способности корабля в ангаре, которая превратила бы усиление в то, что покупают.
Новая этикетка, а не новый бросок
Вышла новая этикетка. Игра хранит курсор - позицию дальше по пещере. Как только пещера его прошла, следующая монета, которая выпала бы оранжевой монетой патронов, выпадает вместо этого лазером, после того как каждое правило размещения уже сказало своё слово. Затем курсор сдвигается примерно на двадцать секунд полёта.
Разброс этого шага тоже берётся не из генератора случайных чисел. Он берётся из хеша позиции, поэтому так же воспроизводим, но ничего не тратит ни из одного потока. Итог: геометрия пещеры идентична сборке без лазера. Тест пещеры переигрывает каждый день обоими способами и требует побайтового совпадения, за исключением того, что на некоторых оранжевых монетах теперь написано «лазер».
Измеряй частоту, а не считывай её из константы. Поскольку лазер ждёт оранжевую монету, его реальный интервал - это шаг курсора плюс это ожидание. С шагом 35 секунд прогон двадцати дней показал лазеры лишь раз в 40-95 секунд, первый около 400 очков. С шагом 20 секунд: примерно каждые 17 секунд в четвёртом секторе, каждые 28-40 секунд глубже, первый при медианном счёте около 340.
Лазер начинается в секторе 4 вместе с валунами, ради которых он и существует. Каждый забег ниже 233 очков остался ровно таким же. Есть цена: лазер занимает место оранжевой монеты, так что глубоко в забеге ты видишь чуть меньше патронов. Это честный обмен на более сильное оружие.
«Лазер не разбивает валуны»
Таким был первый отзыв после настоящей игры, и он был верен. Первой версии нужно было держать луч на камне около трети секунды, чтобы прожечь его. Но луч прямой и находится на высоте корабля, а игроки не влетают в валун - они пролетают его проход. Поэтому луч лишь задевал край на десятую или четверть секунды. Из двенадцати настоящих валунов, мимо которых пролетели с включённым лазером, разбился один.
Исправление: решает первое касание. Валун, которого луч хоть немного коснулся, загорается, светится и шипит мгновение, а затем разлетается. Из тех же двенадцати разбились восемь; остальных четырёх луч так и не коснулся. Другим вариантом было автоматически наводить луч на ближайший камень, но я его не взял, потому что лазер и так достаточно силён. Урок для меня: проверять препятствие вдоль линий, по которым игроки действительно летают, а не вдоль линии корабля в тесте.
Мелочи, которые оказались важны
- Монета. Первая монета лазера была рубиновым стержнем в муфте, и на первом скриншоте она выглядела как шприц. Теперь это огранённый рубин, выпускающий короткий луч.
- Конец. Раньше луч в последние мгновения угасал плавной пульсацией, которую легко было пропустить. Теперь он мерцает, как фонарик с севшей батарейкой: короткие нерегулярные провалы, которых к концу всё больше, и гудение запинается вместе с ними. Мерцание - только картинка. Луч продолжает попадать сквозь каждый провал, а рисунок берётся из хеша часов, а не вытягивается из генератора случайных чисел.
- Длительность. Сначала было 2,5 секунды, в игре это казалось слишком долгим, теперь 2.
- Эффект. В прогоне с автопилотом за восемь дней лазер был включён в 0-7% кадров, а попаданий по щиту стало примерно на 3% меньше. Это момент силы, а не рычаг сложности, и именно этого я хотел.
Приём, к которому я возвращаюсь снова и снова
Лазер - не первая функция, которую сформировало это правило. Ремкомплекты - гаечный ключ, который роняет мина или снаряд пушки, когда ты их сбиваешь, - по той же причине живут в собственном списке, а не среди монет: положи их к монетам, и пещера дня раскалывается. В игре, чьё обещание - одна общая пещера в день, вопрос к каждой новой функции один и тот же: тянет ли она случайное число, и если да, то из чьего потока?
Первый лазер дня обычно появляется где-то после 300 очков в сегодняшней пещере.