27 July 2018

Каково это — создавать игру для Game Boy в 2017 году

Game developmentGames and game consoles
Translation
Original author: Doctor Ludos
image

У всех была детская мечта. Лично я мечтал создать игру для моей первой консоли: Nintendo Game Boy. Сегодня моя мечта реализовалась — я выпустил первую игру для Game Boy на настоящем картридже: Sheep It Up!

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


Игра


«Sheep It Up!» — это аркадная игра, в которой овца должна взбираться вверх, приклеиваясь к летающим полоскам липучки. Концепция проста, но игра быстро становится довольно сложной: как далеко вы сможете забраться, не упав?


Я сам являюсь коллекционером игр, поэтому не хотел, чтобы при создании моего проекта пострадали какие-нибудь винтажные игры для Game Boy. Поэтому всё было создано специально для игры: печатная плата, ROM, оболочка, защитный корпус и даже наклейка! Также мы стремились сохранить разумную цену, чтобы игрой мог насладиться каждый: 15 долларов (+ доставка). Она запустится на любой модели Game Boy, от самой первой до GBA SP, в том числе и на Super Game Boy.


Если у вас всё ещё есть Game Boy, то вы можете купить картридж на веб-сайте издателя:

https://catskullgames.com/sheep-it-up

Звуковые ограничения


Как мы поняли из первой части статьи, у Game Boy есть очевидные ограничения мощности ЦП и графики. Но то же самое можно сказать и о звуке. И в самом деле, в отличие от современных машин, Game Boy не может воспроизводить MP3-музыку или считывать звуковые файлы WAV. Чтобы создавать звуки и музыку для Game Boy, необходимо динамически генерировать их с помощью встроенных в консоль четырёх «звуковых каналов». Каждый канал имеет собственную функцию:

  • Канал 1 — Tone & Sweep: мы можем воспроизводить звук (тон) с повышающейся или понижающейся высотой звука.
  • Канал 2 — Tone: воспроизводит тон без спецэффекта.
  • Канал 3 — Waveform: может воспроизводить очень простые волнообразные сигналы (закодированные в 4 битах).
  • Канал 4 — Noise: может генерировать звуки взрывов или двигателей.

Давайте повторим ещё раз: для воспроизведения звука в Game Boy необходимо генерировать его вручную, непосредственно управляя этими четырьмя звуковыми каналами. К счастью, сделать это довольно просто: достаточно всего лишь изменять значения нескольких аппаратных регистров. Каждый звуковой канал управляется 4-5 аппаратными регистрами (8-битными переменным), определяющими громкость, высоту, спецэффекты и т.д. Задавая различные значения регистров, управляющих каналом, мы можем заставить Game Boy воспроизводить широкий диапазон звуков. Для примера, вот три звука из Sheep It Up!, которые я создал с помощью звукового канала 1, и соответствующие значения аппаратных регистровa:

Прыжок



NR10_REG = 0x15;
NR11_REG = 0x96;
NR12_REG = 0x73;
NR13_REG = 0xBB;
NR14_REG = 0x85;

Приземление



NR10_REG = 0x79;
NR11_REG = 0x8D;
NR12_REG = 0x63;
NR13_REG = 0xC8;
NR14_REG = 0x80;

Падение (конец игры)



NR10_REG = 0x4F;
NR11_REG = 0x96;
NR12_REG = 0xB7;
NR13_REG = 0xBB;
NR14_REG = 0x85;

Как видите, присвоение различных значений 5 переменным позволяет нам создавать очень разные звуковые эффекты. Можно подумать, что для создания звуков придётся идти путём проб и ошибок: вставлять в регистры случайные значения, пока не получишь приятный звук. Но это было бы скучно и бессмысленно. Поэтому современные инструменты способны облегчить нашу жизнь. Позвольте представить вам GB Sound Sample Generator.


Сначала мы настраиваем удобные параметры, чтобы найти подходящий звук (нажмите START для проверки текущего звука)

Это программа для Game Boy, полностью совместимая с реальным железом. Она позволяет изменять значения аппаратных регистров звука удобным для пользователя способом. Вместо задания сырых значений NR10_REG мы можем указывать частоту звука, уровень громкости, длительность свип-сигнала и т.д. Можно считать этот инструмент подобием SFXR для Game Boy. Но для экспорта звука вместо сохранения файла WAV, GB Sound Sample generator отображает соответствующие значения аппаратных регистров. То есть чтобы воспроизвести звук в своей игре, достаточно просто вписать эти значения в исходный код.


Затем нужно нажать и удерживать A+SELECT, чтобы отобразить соответствующие сырые значения аппаратных регистров

Для работы над Sheep It Up! я использовал GB Sound Sample generator на Game Boy Advance SP (экран с подсветкой удобнее). ROM программы был запущен на Everdrive GB. Я потратил довольно много времени на настройку параметров непосредственно на консоли, а когда наконец нашёл подходящую комбинацию, то просто переписал значения с экрана GB в исходный код на компьютере.


Копируем значения аппаратных регистров в исходный код

Chiptune-музыка!


Несмотря на ограниченные звуковые возможности, сегодня Game Boy используется в качестве музыкального инструмента. Многие талантливые композиторы chiptune-сцены создают на Game Boy энергичные треки с помощью таких программ, как LSDJ или Nanoloop. Например, вы могли слышать об ирландской легенде чип-тюна Chipzel, написавшей музыку для Super Hexagon, и о французском волшебнике Sidabitball, создавшем ремиксы множества хитов поп-музыки 90-х.


Chipzel и Sidabitball

К сожалению для нас, разработчиков игр, инструмент LSDJ, использованный для сочинения этих потрясающих композиций, потребляет почти 100% аппаратных ресурсов Game Boy. Поэтому в нём можно писать замечательную музыку, но у вас не получится запустить игру, пока эта музыка играет на консоли. К счастью, есть менее требовательные к ресурсам альтернативы для создания и воспроизведения музыки на Game Boy.

1) Собственный проигрыватель музыки


Самое минималистичное решение — создать собственный «музыкальный проигрыватель».
Не забывайте, что единственный способ воспроизведения звуков на Game Boy — это задание значений аппаратных регистров, управляющих четырьмя каналами генерирования звука. Поэтому достаточно просто создать собственный «музыкальный проигрыватель», сохранив «ноты» в массив. Каждая «нота» — это определённая комбинация значений для каждого из аппаратных регистров. Если задать темп, с которым мы будем проходить по этому массиву для воспроизведения «нот», то у нас получится очень простой способ проигрывания музыки. Именно так я и сделал в Sheep It Up! Вот короткое видео геймплея со звуком и музыкой, чтобы вы могли услышать результат:


На самом деле мои «ноты» воспроизводятся только на звуковом канале 2. Да, четыре звуковых канала являются общими для звуковых эффектов и музыки. Поэтому если мы воспроизводим в канале ноту, то его нельзя использовать для одновременного воспроизведения звукового эффекта. И поскольку каждый канал в чём-то «особенный», иногда предпочтительнее использовать некоторые каналы только для музыки, а другие оставить для звуковых эффектов. Например, «скрипящий» звук, который слышно, когда овца приклеивается к летающей липучке, воспроизводится на канале 4 (шум). Поскольку это очень частый звук в моей игре, я решил не использовать этот канал для музыки. То же самое относится к каналу 1, который я использовал для всех остальных звуковых эффектов. Так как я не большой специалист в музыке, я решил не использовать волны канала 3, и вместо них работать с тонами канала 2.

2) GBT Player и Carillon Player


Во многих homebrew-играх используется свой музыкальный проигрыватель. Однако это не единственный вариант решения. Существует библиотека под названием GBT Player, способная преобразовывать музыкальные модули (в формате Impulse Tracker ".it") для воспроизведения на Game Boy. Разумеется, есть множество ограничений на размер сэмплов, количество каналов и эффектов нот. Но тем не менее, библиотека позволяет сочинять настоящую музыку на настоящем музыкальном трекере, например, OpenMPT, а затем воспроизводить её на Game Boy. Самое важное — библиотека потребляет всего 7-8% ресурсов ЦП Game Boy, оставляя кучу вычислительной мощности на выполнение игры. Более того, очень просто интегрировать её в свой код, если вы решили писать игру на C с помощью GBDK или на ассемблере с помощью RGBDS. Хорошей альтернативой GBT Player является Carillon Player, однако в ней для сочинения музыки придётся использовать Carillon Editor.


Geometrix — это homebrew-игра автора GBT Player AntonioND. Для музыки использована эта библиотека.

Обретаем физическую форму: запись игры на картриджи


После длительной работы над кодом, графикой и звуком игра наконец готова. Но на этом этапе у нас есть только файл ROM. Разумеется, я могу активно тестировать на множестве различных моделей Gameboy из моей коллекции (у меня есть они все, кроме AGS-101). Но я не чувствовал, что проект готов: по-моему, чтобы считаться «завершённой», у игры должен быть свой собственный картридж.

Как я говорил в первой части статьи, весь ROM игры Sheep It Up! весит всего 32КБ, как и у ранних игр для Game Boy, например Tetris и Alleyway. Но на самом деле большинство игр для Game Boy намного больше, от 128КБ до 512КБ, а самая большая игра Pokemon Blue and Red занимает чудовищные 1024КБ (1МБ). В 90-х чем объёмней была игра, тем дороже в производстве оказывались картриджи: для хранения больших игр нужны более дорогие чипы. Но сегодня все они стоят почти одинаково. Так почему же я ограничился 32-килобайтной игрой?

Ответ заключается в том, что я хотел иметь возможность выпустить игру на изготавливаемых сегодня картриджах. Как можно догадаться, Nintendo давно прекратила производство картриджей для Game Boy (Game Pak-ов). Поэтому для создания собственного картриджа сегодня есть два варианта решения:

1) Модификация картриджей (Cartmodding)


Первый вариант, называющийся «cartmodding», заключается в переработке старых игр Game Boy. Игры, выпускавшиеся в эпоху коммерческой продажи Game Boy, хранились на неперезаписываемых картриджах. Поэтому, чтобы заменить хранящуюся на них игру, нужно вскрыть их, выпаять чип памяти и заменить другим чипом памяти, на который загружен ROM вашей игры. Такое решение позволяет создавать игры любого размера. Но, будучи коллекционером игр, я не хотел ради производства своей игры уничтожать уже существующие картриджи Game Boy.


Пример картмоддинга. Новый чип памяти с homebrew-игрой впаян в старый картридж

2) Собственный картридж


Второй вариант заключается в создании нового картриджа с нуля. Так как я не разбираюсь в электронике, то начал искать в Интернете людей, способных собирать картриджи Game Boy. После нескольких неудачных попыток мне посчастливилось найти Catskull. Это потрясающий кудесник электроники, он создаёт и продаёт множество связанного с Game Boy оборудования в своём магазине Catskull Electronics. Кроме всего прочего, он разработал устройство для подключения Gameboy к интерфейсу MIDI, что позволяет музыкантам использовать Game Boy с настоящими инструментами и синтезаторами. Также он разработал свой картридж Game Boy. Для этого картриджа всё было изготовлено заново: печатная плата, чипы, оболочки, даже наклейки и новые части — ничего не взято из предыдущих игр. Для меня это было идеальное решение.


Разработанная Catskull оригинальная печатная плата, которую я использовал для Sheep It Up!

Но потом всё стало даже лучше: после короткой переписки Catskull сказал мне, что уже давно хотел создать компанию для издания homebrew-игр, и что моя игра будет отличной возможностью для этого! Поэтому мы объединили свои усилия: я делаю ПО, он занимается «железом». Единственное ограничение в таком решении заключается в том, что на картридже Catskull для Game Boy может храниться только 32КБ. Почему?

Изначально предполагалось, что консоль Game Boy будет иметь доступ только к 32КБ данных ROM. Чтобы создавать игры размером больше 32КБ, необходимо перемещаться по всем данным на картридже, одновременно получая доступ только к одной подсекции всех данных ROM. Такой метод называется переключением банков: все данные ROM разбиты на банки по 16КБ каждый, и мы можем в любой момент переключаться между ними (с определёнными ограничениями). Однако для выполнения переключения банков на картридже должен быть дополнительный чип: «контроллер банков памяти» (Memory Bank Controller, MBC). Существует несколько чипов (MBC1, MBC5 и т.д.), увеличивающих размер ROM, позволяющих использовать ОЗУ под сохранения игр с питанием от батареи и т.д. К сожалению, на данный момент нет готового решения для создания новых картриджей с таким чипом с нуля.

Поэтому люди, создающие homebrew-игры больше 32КБ, обычно занимаются картмоддингом, чтобы использовать MBC-чип старого картриджа Game Boy, который они «перерабатывают». Ещё одно решение заключается в покупке поддельных копий настоящих игр для Game Boy с последующей перепрошивкой. Уже много лет назад китайские производители научились «клонировать» чип MBC для создания пиратских копий больших игр наподобие Pokemon. И поскольку такие пиратские картриджи вместо чипов ROM старых игр используют чипы EEPROM, их обычно можно «перепрошить», чтобы заменить хранящуюся на картридже игру. Для этого нужно использовать устройство записи флеш-памяти картриджей, например BennVenn's Joey. В нескольких homebrew-играх размером больше 32КБ использовался такой подход.


Изготовленный в Китае пиратский картридж. Его можно перепрошить, записав на него свою игру, но некоторые другие перепрошивать нельзя (подробнее об этом здесь)

Для изготовления Sheep It Up! я хотел создавать полностью новые картриджи, чтобы избежать уничтожения оригинальных игр для Game Boy. Мне очень повезло, что я объединил свои усилия с Catskull, производящим собственные картриджи, несмотря на то, что пришлось ограничиться 32КБ общей памяти.

Выпекаем картриджи!


Так как же изготавливаются собственные картриджи? Я попросил Catskull сделать фотографии отдельных этапов сборки картриджей. Как видите, каждый картридж собирается вручную:

1) Печатная плата вставляется в крепёж.


2) На печатную плату накладывается трафарет из нержавейки для нанесения паяльной пасты. Эта паста позволит припаять чип памяти к плате.


3) Обычно я изготавливаю за раз партии по 18-20 картриджей. На эту партию уже нанесена паяльная паста.


4) Я знаю, как вручную подбирать конденсаторы и резисторы, и располагать их на платах. Затем я помещаю на каждую плату чипы флеш-памяти.



5) Платы раскладываются на решётке печи для оплавления. Мы в буквальном смысле «запекаем» каждую плату, чтобы припаять на неё чип. Теперь я могу взять каждую из плат и записать ROM игры на чип памяти.



6) Затем плата вставляется в оболочку игрового картриджа с красивой наклейкой, сделанной на профессиональном принтере.



7) После тщательной проверки картриджа на настоящем оборудовании игра готова к отправке заказавшему её игроку!

Исполнение детской мечты


После всей этой технической информации я хотел бы поделиться более личными ощущениями о том, что это проект для меня значит. Ради понимания контекста я советую посмотреть самое вдохновляющее из виденных мною видео «Really achieving your childhood dreams» Рэнди Поша. Крайне рекомендую вам его увидеть. Это прекрасный урок о том, что стоит воспринимать жизнь с ощущением чуда, даже в самые трудные дни. Чтобы жить полноценной жизнью, Рэнди Пош предлагает нам попробовать исполнить детские мечты и помочь исполнить их остальным.


В верхних строчках моего личного списка детских мечт было создание видеоигры для Nintendo Game Boy. Game Boy стала моей первой видеоигровой консолью, и она всегда будет занимать важное место в моём сердце. Долгие годы я говорил себе, что когда-нибудь создам для неё игру. Но у меня всегда были «более важные дела», например, работа над проектом, который приносил мне деньги. Наконец, однажды я наткнулся на игровой джем BitBitJam, посвящённый созданию игр для ретро-железа. Тогда я вспомнил слова мудрого Рэнди Поша: что если я хотя бы раз попробую выполнить проект, не ожидая от ничего иного, кроме исполнения детской мечты?

Поэтому примерно за месяц до начала джема я начал изучать различные инструменты создания игр для Game Boy. Затем, уже во время джема, я потратил целую неделю (у меня был отпуск) на создание прототипа Sheep It Up! После джема я продолжил работать над игрой, полируя, усовершенствуя, оптимизируя и перерисовывая её… до тех пор, пока не стал доволен результатом. Тем временем я искал способы создания настоящих картриджей для игры. Мне сильно повезло встретить Catskull, занимавшегося их изготовлением, и втайне мечтавшего создать свою компанию для издания homebrew-игр. В конце концов я создал и выпустил настоящую игру для Game Boy, продающуюся на физических картриджах. Но почему картриджи так важны? Разве я не мог остановиться на распространении электронной версии игры онлайн, как поступают многие другие разработчики homebrew-игр?

Не забывайте — моей настоящей целью был не выпуск игры, а исполнение детской мечты. А в моей мечте я мог играть с картриджа, который сделал сам, на настоящем Game Boy , как это было со всеми остальными играми, которые я покупал в детстве. Вот видео того, как я тестирую игру на настоящем Game Boy, купленном родителями на Рождество, когда мне было девять лет:


Как видите, моя детская консоль повидала многое: многие столбцы пикселей уже не отображаются на экране, кнопки сильно потёрты, а на дисплее есть огромная вертикальная царапина. Но она по-прежнему работает. Не могу выразить словами чувства, возникшие во время игры на консоли в картридж, созданный МНОЙ. Всё, что я могу сказать — в этот самый момент девятилетний я был очень горд тем взрослым, которым он стал. И одно это чувство стало самым лучшим результатом, который я бы мог получить от такого проекта.


Консоль всё ещё работает спустя 25 лет, и смог запустить на ней игру, выпущенную в 2017 году!

Делюсь мечтой: отзывы игроков


Итак, создание игры в первую очередь ради собственной радости — это самое лучшее. Но радость может стать ещё больше, если в неё смогут сыграть другие люди. В конце проекта я знал, что Sheep It Up! оказалась простой игрой, поэтому ожидания были не очень высоки. Но полученные от игроков отзывы всё равно меня удивили!

Несмотря (или благодаря) простоте игры, игрокам она действительно понравилась. Геймплей достаточно прост, чтобы разобраться в нём за секунды, но быстро увлекает — «ещё одну, последнюю партию, чтобы побить свой рекорд». Кстати, мой нынешний рекорд — 147 очков! Но в сообществе ретрогеймеров мне больше всего нравится то, что ключевой движущей силой для большинства игроков является любовь. И это может привести к любопытным сюрпризам.

Для начала, некоторые люди жаловались, что игра не продаётся в коробочной версии. Поскольку я собираю ретро-игры просто в картриджах (ради экономии денег и пространства на полках), то сначала не додумался о создании коробочной версии. Но сейчас я осознаю, что было бы неплохо предложить и такой вариант людям, которым он был нужен. Но один из фанатов игры, Cyph, пошёл ещё дальше, и создал собственную коробку игры, переделав jewel-коробку картриджа Nintendo DS. Не знаю, как вам, а мне результат кажется потрясающим. Если вас это интересует, то вы тоже можете сделать собственную коробку. Достаточно всего лишь взять jewel-коробку картриджа Nintendo DS, срезать две небольших пластмассовых детали внутри и вставить эту красивую обложку, созданную Cyph.


Красивая самодельная коробка для Sheep It Up! созданная игроком Cyph из коробки картриджа Nintendo DS!

Ещё одна забавная деталь об игре заключается в том, что её демонстрировали на одной из крупнейших видеоигровых выставок в мире: Paris Game Week (300 тысяч посетителей — больше, чем на E3 и Tokyo Game Show). Как же любительская игра, выпущенная для Game Boy, попала на одну выставку с последними AAA-играми отрасли? За эту возможность я благодарю OrdiRetro. Это французская ассоциация, занимающаяся историей видеоигр, в частности — новыми играми, выпускаемыми для старых консолей и компьютеров. На этой выставке у них был стенд с несколькими играми. Благодаря моему другу Жулиану Альваресу они узнали об игре и предложили мне показать её на выставке.


Sheep It Up!, запущенная на Super Game Boy во время Paris Game Week 2017 — спасибо, OrdiRetro!

Но такая возможность может возникнуть и без наличия связей. Сразу после релиза игру купили два фаната Game Boy из Германии, занимающиеся веб-сайтом DMGpage. Но они не просто купили игру, а ещё и показали на конференции ретрогеймеров Retro-Börse в Гессене. Так что благодаря двум фанатам Game Boy игрокам удалось сыграть в мою игру на Super Game Boy и на немецкой конференции — я очень благодарен и им тоже!


Sheep It Up! демонстрируется на Super Game Boy во время Retro-Börse в Гессене — спасибо, DMGpage!

Заключение


Homebrew-игры для ретро-консолей создаются не ради денег или популярности. Обычно изготавливается очень малое количество копий. Можно надеяться на аудиторию в несколько десятков людей, в лучшем случае — в пару сотен, если ваша игра по-настоящему хороша. Но вы можете быть уверены, что у этих людей есть искренний интерес к вашей игре. Их ведёт та же любовь к ретро-железу, что и вас. Иногда их любовь может быть даже сильнее вашей. И если вам понравились эти две части статьи о создании игры для Game Boy в наши дни, почему бы не попробовать сделать это самим?

Как сказано в первой части статьи, существует множество простых в работе инструментов для создания игр под самую популярную портативную консоль в истории. Да, она не поможет вам разбогатеть, но вы получите в результате кучу удовольствия. А может быть, вам удастся так же порадовать и других людей, играющих в вашу игру!


Итак, я надеюсь, что вам понравился этот постмортем, и что он подтолкнёт вас к разработке ретро-игры. Кроме того, если у вас где-нибудь завалялся Game Boy, то не забудьте, что вы можете купить замечательный картридж Sheep It Up всего лишь за 15 долларов у Catskull games. Каждый картридж собирается вручную!
Tags:game boyпроцедурное аудиоретро-игрыретроконсоли
Hubs: Game development Games and game consoles
+30
8k 37
Comments 8
Popular right now
Senior Game Designer (Playable Ads)
from 120,000 ₽AllcorrectRemote job
Full-stack web developer
from 150,000 to 300,000 ₽Rubrain.comRemote job
Hyperscale - Performance Engineer
from 150,000 to 350,000 ₽Rubrain.comRemote job
Business Development Manager
from 60,000 to 270,000 ₽EVEN LabМосква