Три года делал аркаду про кубики. Началось всё с того, что мне стало скучно в собственном платформере
Идея завелась ещё в университете. Хотел платформер: прыжки, уровни, секретки, всё как положено. Написал прототип, погонял его пару вечеров и поймал неприятную мысль — мне в нём скучно.
Причём скучно не потому, что криво сделано. А потому, что в платформере ты половину времени просто идёшь. Дошёл до интересного места, три секунды экшена, дальше опять идёшь. Мне хотелось, чтобы месиво начиналось сразу.
Плюс был сугубо бытовой аргумент. Я каждый день ехал в универ на метро, минут двадцать в одну сторону. И вот в эти двадцать минут не хочется проходить уровень с сохранениями. Хочется сыграть три коротких забега. Умер — заново, без обид.
Так платформер превратился в аркаду. С этого момента у меня появилось правило, которое я держал все три года: если в игру неудобно играть стоя в вагоне одной рукой — значит, сделано неправильно.
Ниже расскажу, что из этого выросло и обо что я убился по дороге. Всё делал сам: код, графику, музыку, звуки.
Первое, что улетело в мусор — кнопки. Любые.
В аркаде на телефоне у тебя нет второй руки. Одна держит поручень, вторая играет. Значит, управление — только движение. Стрельба идёт сама: враг попал на линию огня, куб по нему выстрелил.
Технически это работает так. Каждый кадр игра берёт список живых врагов и ищет ближайшего, который находится правее игрока и попадает в узкий коридор по вертикали. Нашёлся — полетел снаряд. Коридор специально сделан с запасом: если требовать идеального попадания в пиксель, играть в трясущемся вагоне невозможно, ты просто не попадаешь никогда.
Звучит как упрощение, но на деле это меняет всю игру. Раз стрельбой ты не управляешь, единственное твоё решение — куда встать. Вся тактика превращается в позиционирование: подобраться так, чтобы под линию огня попало сразу трое, и при этом не влететь в четвёртого.
Второе, что улетело — обучение текстом. Никаких «нажмите сюда, чтобы сделать то». Если человек запустил игру в метро, у него нет настроения читать. Игра должна объясняться первыми десятью секундами.
Тут честно: сначала это была заглушка.
Мне нужно было хоть что-то на экране, чтобы проверить механику. Открыл Aseprite, нарисовал квадрат, приделал глаза. Потом второй квадрат, врага. Погонял — и понял, что квадрат с глазами внезапно обаятельный. Он не выглядит как недоделка, он выглядит как персонаж.
Вот они, самые первые. Дальше я уже осознанно держал простые формы и жирные контуры: на экране телефона в трясущемся вагоне ничего сложнее просто не читается, мелкая детализация превращается в грязь.
Девяносто врагов, и все должны различаться
К третьему году в игре набралось шесть миров, тридцать уровней и девяносто видов врагов. Плюс тридцать боссов.
И вот тут я налетел на главную проблему.
Первый заход был такой: берём один шаблон кубика и лепим на него отличия. Этому рожки, этому кратер, этому корону, всем разные цвета. Логично же?
Запустил уровень с толпой — на экране каша. Тридцать одинаковых квадратиков, отличающихся оттенком. Игрок не видит, кто перед ним. А в аркаде это критично: ты должен за долю секунды понять, этот сейчас взорвётся или этот тебя таранит.
Пришлось переделывать с другого конца. Правила получились такие.
Враг узнаётся силуэтом, а не наклейкой. Не квадрат с рожками, а вообще другая форма.
Слева направо: приземистый клин — таранщик, он визуально прёт вперёд ещё до того, как двинулся. Круг в шипах — не подходи вплотную. Острый ромб, бур со стрелой, снеговик из двух шаров, плоская линза. Ни одной пары, которую можно перепутать в бою.
Одна деталь, не больше. Это второе правило, купленное кровью. Две характерные мелочи на одном враге — и он превращается в мусор, взгляд не цепляется ни за что. Рог. Или кратер. Или корона. Выбирай одно.
Цвет — принадлежность к миру, а не к врагу. Лава оранжевая, крио голубое, гравитация фиолетовая. Игрок сразу видит, где он находится. Различать врагов между собой цветом бесполезно, эту работу делает форма.
Вот финальный мир в бою. Палитра общая, золото с чернью, но каждого противника видно отдельно.
Поведение: не сто скриптов, а семь
Девяносто видов врагов — это не девяносто программ. Иначе я бы не дожил до релиза.
На деле у меня семь небольших скриптов поведения, и почти все враги — это они с разными числами:
- рывок — прёт на игрока по прямой;
- турель — стоит и стреляет с упреждением;
- мина — ждёт, взрывается при сближении;
- след — оставляет за собой опасную полосу;
- навесной — кидает снаряд по дуге через препятствия;
- телепорт — исчезает и появляется рядом;
- рост — со временем становится больше и злее.
Дальше начинается интересное. Мина с крошечным радиусом и огромным уроном — это одно чувство. Мина с большим радиусом и слабым уроном — совсем другое, она не убивает, а выдавливает тебя с удобной позиции. Скрипт тот же, враг ощущается новым.
Плюс поверх накидывается слой множителей на мир: здоровье, скорость, урон, оттенок под палитру. Один и тот же таранщик в первом мире — назойливая мелочь, в пятом — реальная угроза.
Уровни и миры лежат отдельными файлами настроек: кто спавнится, как часто, с каким бюджетом сложности, какая музыка, какой фон. Добавить уровень — это заполнить поля, а не писать код. Когда впереди тридцать уровней, это единственный способ не сойти с ума.
Живые лица оказались важнее, чем я думал
Каждый враг умеет корчить рожи. Шесть состояний в одном файле-ленте, игра просто переключает кадр.
Нейтраль, довольный, злой, удивление, x_x и снова удивление. Изначально это была чистая баловня, я делал её для себя. А потом заметил, что она работает как игровая информация.
Враг попёр на тебя — он злится. Ты его затормозил — удивился. Толпа собралась вокруг и все довольные — это уже тревожный сигнал. Ты считываешь состояние боя по лицам, вообще об этом не задумываясь.
Плюс — это то, из-за чего игра не выглядит злой. Она про то, как кубик отбивается от армии кубиков, а не про войну. Мордочки задают тон.
Боссы: главное — предупредить
Босс в аркаде легко превращается в несправедливость. Прилетело неизвестно откуда, ты умер, переигрывать не хочется.
Поэтому у каждой атаки есть телеграф — заранее подсвеченная зона, куда сейчас ударит. Зелёный сектор на кадре означает: через мгновение здесь будет больно, уходи. Смерть должна быть твоей ошибкой, а не сюрпризом.
Работают все боссы на одном общем конечном автомате: выбор атаки, предупреждение, удар, откат, при потере здоровья — переход в ярость с ускоренными таймингами. Разница между ними — в наборе атак и числах. Тридцать боссов на одной такой машине сделать реально, тридцать отдельных программ — нет.
Обо что я убился
Три года — это много ошибок. Три самые дорогие.
Я долго делал игру для себя. Я в неё наигрался так, что проходил на автомате, и соответственно крутил сложность вверх. Дал поиграть другу — он помер на втором уровне и сказал, что ничего не понял. Пришлось честно признать, что я откалибровал игру под единственного человека в мире, который знает в ней каждый угол.
Первый живой отзыв бьёт больно и по делу. Тот же друг, наигравшись, сказал: «музыка монотонная». Я обиделся. Потом послушал сам, подряд, минут двадцать — и переделал целый мир с нуля. Он был прав.
Контента много не значит хорошо. В какой-то момент я гнался за количеством врагов. Наделал их, засунул в уровни, посмотрел — и половину выкинул, потому что они ничего не добавляли к бою. Враг должен менять твоё поведение. Если он просто ещё одна мишень, его быть не должно.
Что в итоге
Шесть миров, тридцать уровней кампании и режим бесконечных забегов — для тех самых двадцати минут в метро. Один палец, полностью офлайн, без регистрации и интернета.
Три года спустя правило из университета никуда не делось: если неудобно играть одной рукой стоя — значит, сделано неправильно. По-моему, получилось.
Игра называется Cube Battle 2093.