Портативная консоль от Nintendo продержалась относительно недолго, однако запомнилась нам яркими играми.
Оглядываясь на историю портативных приставок Nintendo, можно отметить, что эта модель была своего рода шагом в сторону. Выпущенная в 1998 году GBC вытащила Nintendo из чёрно-белых дебрей оригинальной Game Boy. Обратная совместимость консоли позволила раскрасить уже существующие игры для Game Boy, а новые игры для этой приставки получили впечатляющую по тем временам графику.
Довольно значимые изменения, не так ли? Ну почти. На практике Game Boy Color оказалась всего лишь приставкой, выпущенной, чтобы разогреть интерес геймеров к Game Boy Advance, релиз которой состоялся уже через два года. Новая консоль превосходила GBC во всём – по части графики, звука и даже удобства в управлении. С маячившей на горизонте GBA (а Nintendo даже и не скрывала готовящийся релиз) было сложно отделаться от мысли, что GBC нужна лишь для того, чтобы стрясти с нас пару лишних долларов перед тем, как выйдет настоящий преемник культовой консоли в 2001 году.
Значит ли это, что система была провальной? Определённо нет! На этой платформе успело выйти немало достойных игр, и мы представляем вашему вниманию 10 лучших из них.
Super Mario Bros Deluxe
Nintendo могла просто портировать оригинальную Super Mario Bros и распродать миллион копий. Вместо этого компания переиздала игру с уймой нового контента, ради которого и стоит её купить, и умудрилась обрадовать фанатов проектом 14-летней давности.
Единственным минусом SMB Deluxe является камера; она очень неохотно поворачивается по сторонам, что сильно ограничивает обзор. Но это было неизбежно из-за разницы в разрешении экрана GBC и NES, поэтому Nintendo сделала всё, чтобы в её силах.
Технические характеристики[ | ]
- Процессор:
8-разрядный Z80, 8 МГц. - Память:
основная память — 32 кбайт, видеопамять — 16 кбайт. - Звук:
динамики (моно) / наушники (стерео) - Экран:
32 тыс. цветов (16 бит), 56 цветов одновременно, 160×144 пикселей, диагональ экрана 60 мм. - Размеры:
132×78×26. - Цвет:
восемь цветовых решений: фиолетовый, фиолетовый-прозрачный (на фото), салатовый, жёлтый, синий, красный, чёрный и оранжевый. - Дополнительно:
Последовательный порт; - Инфракрасный порт.
Работает от 2-х пальчиковых батареек типа AA (3 вольт). Система совместима с играми для оригинального Game Boy, которые показываются в 4-х цветах.
Metal Gear Solid
История разворачивается в привычном для серии ключе, изобилует неожиданными поворотами и внезапными предательствами, а в её центре оказывается Снейк, который получает задание проникнуть в крепость Внешний Рай (Outer Heaven) и остановить группу сепаратистов, похитивших новейшее боевое оружие под кодовым названием GANDER.
Нам предстоит сразиться с новыми наёмниками, каждый из которых может похвастаться крутыми девайсами и необычными именами, а когда основная сюжетная линия будет пройдена, мы получим доступ к бонусному контенту, куда в том числе входит ряд увлекательных VR-миссий. MGS стала доказательством того, что спин-оффы для портативных консолей могут быть такими же качественными, как и громкие мультиплатформенные проекты.
Подготовка Game Boy
Для начала нужно определиться с требованиями. Я решила писать для DMG (внутреннее название модели Game Boy, сокращение от Dot Matrix Game). В основном для того, чтобы соответствовать требованиям гейм-джема, но ещё и потому, что мне так хотелось. Лично у меня никогда не было игр для DMG (хотя и есть несколько игр для Game Boy Color), но я нахожу 2-битную эстетику очень милым и интересным ограничением для экспериментов. Возможно, я добавлю дополнительный цвет для SGB и CGB, но пока над этим не думала.
Также я решила использовать картридж с 32K ПЗУ + без ОЗУ, просто на случай, если мне захочется создать физическую копию игры. У CatSkull, опубликовавшего несколько игр Game Boy, например Sheep it Up!, есть в продаже очень дешёвые 32-килобайтные флеш-картриджи, которые идеально мне подойдут. Это ещё одно дополнительное ограничение, но я не считаю, что в ближайшее время смогу с такой простой игрой преодолеть объём в 32K. Сложнее всего будет с графикой, и если всё будет совсем плохо, то я попытаюсь её сжать.
Что касается самой работы Game Boy, то тут всё достаточно сложно. Однако, честно говоря, из всех ретроконсолей, с которыми мне приходилось работать, Game Boy была самой приятной. Я начала с превосходного туториала (по крайней мере, на первое время, потому что он так и не был дописан) автора «AssemblyDigest». Я знала, что лучше всего писать на ASM, как бы мучительно это иногда ни было, потому что «железо» не рассчитано на C, и я не была уверена, что упоминаемый в туториале крутой язык Wiz окажется применимым на долгосрочную перспективу. Плюс, я делаю это в основном потому, что могу работать с ASM.
Сверяйтесь с коммитом 8c0a4ea
Первое, что нужно было сделать — заставить Game Boy загружаться. Если по смещению $104 не будет найден логотип Nintendo, а остальная часть заголовка не будет настроена правильно, то оборудование Game Boy предположит, что картридж вставлен неправильно и откажется загружаться. Решить эту проблему очень просто, потому что об этом написана уже куча туториалов. Вот, как решила проблему с заголовком я. Здесь нет ничего достойного особого внимания.
Сложнее будет выполнять осмысленные действия после загрузки. Очень просто заставить систему перейти в бесконечный цикл занятости, в котором она снова и снова выполняет одну строку кода. Выполнение кода начинается с метки main (куда указывает переход по адресу $100), поэтому туда нужно вставить какой-нибудь простой код. Например:
main: .loop: halt jr .loop и он не делает ровным счётом ничего, кроме как ждёт запуска прерывания, после чего возвращается к метке .loop. (Здесь и далее я буду опускать подробное описание работы ASM. Если вы запутаетесь, то изучите документацию по ассемблеру, которую я использую.) Возможно, вам любопытно, почему я просто не возвращаюсь к метке main. Это сделано потому, что я хочу, чтобы всё до метки .loop было инициализацией программы, а всё, что после неё, происходило каждый кадр. Таким образом мне не придётся обходить в цикле загрузку данных с картриджа и очищать память в каждом кадре.
Давайте сделаем ещё один шаг. Используемый мной ассемблерный пакет RGBDS содержит конвертер изображений. Так как на этом этапе я пока не нарисовала никаких ресурсов для игры, то решила использовать в качестве тестового битового изображения монохромную кнопку с моей страницы About. С помощью RGBGFX я преобразовала её в формат Game Boy и воспользовалась ассемблерной командой .incbin, чтобы вставить её после функции main.
Чтобы отобразить её на экране, мне необходимо следующее:
- Отключить ЖК-дисплей
- Задать палитру
- Задать позицию скроллинга
- Очистить видеопамять (VRAM)
- Загрузить во VRAM тайловую графику
- Загрузить во VRAM тайловую карту фона
- Снова включить ЖК-дисплей
Отключение ЖК-дисплея
Для начинающих это становится самым серьёзным препятствием. На первом Game Boy невозможно просто в любое время записывать данные во VRAM. Необходимо дождаться момента, когда система ничего не отрисовывает. Имитируя свечение фосфора в старых ЭЛТ-телевизорах, интервал между каждым кадром, когда открыта VRAM, назван Vertical-Blank, или VBlank (в ЭЛТ это импульс для гашения луча кинескопа во время обратного хода кадровой развёртки). (Существует также HBlank между каждой строкой дисплея, но он очень короткий.) Однако можно обойти эту проблему, отключая ЖК-экран, то есть мы можем выполнять запись во VRAM вне зависимости от того, где находится «фосфорный след» ЭЛТ-экрана.
Если вы запутались, то этот обзор должен многое вам объяснить. В нём вопрос рассматривается с точки зрения SNES, поэтому не забывайте, что пучка электронов нет, а числа отличаются, но во всём остальном он вполне применим. По сути, нам нужно задать флаг «FBlank».
Однако хитрость Game Boy в том, что отключать ЖК-дисплей можно только во время VBlank. То есть нам придётся ждать VBlank. Для этого необходимо использовать прерывания. Прерывания — это сигналы, которые «железо» Game Boy отправляет центральному процессору. Если обработчик прерывания задан, то процессор останавливает свою работу и вызывает обработчик. Game Boy поддерживает пять прерываний, и одно из них запускается при начале VBlank.
Обрабатывать прерывания можно двумя разными способами. Первый, и наиболее распространённый — задание обработчика прерываний, который работает так, как я объяснила выше. Однако мы можем включить определённое прерывание и отключить все обработчики, задав флаг включения этого прерывания и воспользовавшись опкодом di. Обычно он ничего не делает, но имеет побочный эффект выхода из опкода HALT, останавливающего ЦП до возникновения прерывания. (Это также происходит и при включенных обработчиках, что позволяет нам выходить из цикла HALT в main.) На случай, если вам интересно, мы со временем создадим и обработчик VBlank, но в нём многое будет зависеть от определённых значений по определённым адресам. Поскольку в ОЗУ у нас пока ничего не задано, попытка вызова обработчика VBlank может привести к сбою системы.
Чтобы задать значения, мы должны отправлять команды аппаратным регистрам Game Boy. Существуют специальные адреса памяти, непосредственно связанные с различными частями оборудования, в нашем случае — с ЦП, которые позволяют изменять образ его работы. Особо нас интересуют адреса $FFFF (битовое поле включения прерывания), $FF0F (битовое поле активированного, но необработанного прерывания) и $FF40 (управление ЖК-дисплеем). Список этих регистров можно найти на страницах, связанных с разделом «Documentation» списка Awesome Game Boy Development.
Для отключения ЖК-дисплея мы включаем только прерывание VBlank, присвоив $FFFF значение $01, выполняем HALT пока не выполнится условие $FF0F == $01, а затем присваиваем биту 7 адреса $FF40 значение 0.
Задание палитры и позиции скроллинга
Это сделать просто. Теперь, когда ЖК-дисплей отключен, нам не нужно волноваться о VBlank. Для задания позиции скроллинга достаточно задать регистрам X и Y значения 0. С палитрой всё немного хитрее. В Game Boy можно присвоить оттенкам с первого по четвёртый графики любой из 4 оттенков серого (или болотно-зелёного, если хотите), что полезно для выполнения переходов и тому подобного. Я задаю в качестве палитры простой градиент, определяемый как список битов %11100100.
Очистка VRAM и загрузка тайловой графики
При запуске все графические данные и карта фона будут состоять только из скроллящегося логотипа Nintendo, который отображается при загрузке системы. Если я включу спрайты (по умолчанию они отключены), то они будут разбросанным по экрану мусором. Необходимо очистить видеопамять, чтобы начать с чистого листа.
Для этого мне потребуется функция наподобие memset из C. (Также мне понадобится аналог memcpy для копирования данных графики.) Функция memset задаёт указанному фрагменту памяти равенство определённому байту. Это мне будет легко реализовать самой, но в туториале AssemblyDigest уже есть эти функции, поэтому я использую их.
На этом этапе я могу очистить VRAM с помощью memset, записав в неё $00 (хотя в первом коммите использовалось значение $FF, которое тоже подходило), а затем загрузить во VRAM тайловую графику с помощью memcpy. Конкретнее мне нужно скопировать её по адресу $9000, потому что это тайлы, используемые только для фоновой графики. (адреса $8000-$87FF используются только для спрайтовых тайлов, а адреса $8800-$8FFF являются общими для обоих типов.)
Задание тайловой карты
Game Boy имеет один слой фона, разделённый на тайлы 8×8. Сам слой фона занимает около 32×32 тайлов, то есть имеет общий размер 256×256. (Для сравнения: экран консоли имеет разрешение 160×144.) Мне необходимо было строка за строкой вручную указывать тайлы, из которых состоит моё изображение. К счастью, все тайлы были расположены по порядку, поэтому мне всего лишь нужно было заполнять каждую строку значениями с N*11 по N*11 + 10, где N — это номер строки, а остальные 22 элемента тайлов заполнить $FF.
Включение ЖК-дисплея
Здесь нам не нужно ждать VBlank, потому что экран всё равно не включится до VBlank, поэтому я просто снова выполнила запись в регистр управления ЖК-дисплеем. Также я включила слои фона и спрайтов, а также указала правильные адреса тайловой карты и тайловой графики. После этого я получила следующие результаты. Также я снова включила обработчики прерываний с помощью опкода ei.
На этом этапе, чтобы было ещё интереснее, я написала очень простой обработчик прерывания для VBlank. Добавив по адресу $40 опкод перехода, я могу сделать обработчиком любую нужную мне функцию. В данном случае я написала простую функцию, выполняющую скроллинг экрана вверх-влево.
Вот готовые результаты. [Дополнение: только что поняла, что GIF зациклен неправильно, он должен постоянно переносить изображение.]
Пока ничего особо удивительного, но всё равно здорово, что теоретически я могу достать свой старый Game Boy Color и увидеть, как на нём выполняется мой собственный код.
Dragon Warrior III
Несмотря на то, что сюжет изобилует привычными для жанра тропами (избранный герой, который должен одолеть вселенское зло), история способна удивить своими поворотами, самым запоминающимся из которых является поворот в финале. Данная игра, которая, как кажется на первый взгляд, никак не связана с первыми двумя частями, является приквелом, о чем мы узнаём в процессе приключения.
Одной из главных особенностей DWIII является глубоко проработанная система профессий – главный герой и его союзники постепенно прокачивают свои навыки (к примеру, воровство, боевые искусства, магию и прочее), а случайно встреченные на пути персонажи могут помогать с прокачкой. DWIII сочетала в себе всё лучшее, что есть в серии, и стала одной из самых выдающихся RPG на портативных приставках.
Где купить игру со скидкой?
VGTimes ищет и сравнивает цены на GTFO в разных магазинах, чтобы вы могли купить игру дешевле, чем в Steam, PS Store и других официальных сервисах дистрибуции.
Сейчас GTFO продается в таких магазинах, как Steam, Gama-Gama, Plati и других. Самая низкая цена, которую нам удалось найти — 712 рублей
. Игру можно активировать в Steam.
Вот некоторые актуальные предложения:
- GTFO в магазине Steam за 1199 руб
- GTFO steam gift в магазине Plati за 712 руб
- GTFO (Steam Gift Россия) в магазине Plati за 1079 руб
- GTFO (электронная версия) в магазине Гамазавр за 1055 руб
- GTFO (steam) в магазине Green Man Gaming за 1199 руб
Еще больше скидок и вкусных цен ищите здесь.
The Legend of Zelda: Oracle of Seasons/Ages
Почему две игры вышли в один день? Потому что Seasons и Ages связаны между собой при помощи системы паролей и вместе формируют одну законченную историю. Пройдите одну из игр и получите пароль, который можно ввести в начале второй, чтобы изменить ряд элементов.
К примеру, в финальной битве вместо никому не известных Верана и Онокса мы сразимся с Ганоном, благодаря чему история будет выглядеть как полноценная часть серии Zelda, а не как странный спин-офф. Забавный факт: обе игры разрабатывались Capcom, которая позднее выпустит Minish Cap на GBA.
Забавы с листами в клетку
Чтобы отрисовывать что-нибудь на экране, мне, естественно, нужны какие-то спрайты. Изучив PPU (Picture Processing Unit) консоли Game Boy, я решила остановиться на спрайтах размером 8×8 или 8×16. Вероятно, мне понадобится последний вариант, но просто чтобы ощутить размеры, я быстро набросала на клетчатой бумаге скриншот игры в масштабе 1:8. Я хотела оставить верхнюю часть экрана под HUD. Мне казалось, так он будет выглядеть естественней, чем снизу, потому что когда он наверху, то если персонажам нужно будет временно перекрыть HUD, как в Super Mario Bros, они смогут это сделать. В этой игре не будет какого-то сложного платформинга, да и на самом деле дизайна уровней тоже, поэтому мне не нужно показывать сильно общий вид поля. Вполне достаточно будет позиции персонажей на экране и, возможно, появляющихся время от времени препятствий. Поэтому я могу позволить себе достаточно большие спрайты.
Итак, если один квадрат был одним тайлом 8×8, то одного спрайта не будет достаточно, какой бы размер я ни выбрала. Это особенно справедливо с учётом того, что в игре почти не будет движения по вертикали, за исключением прыжков. Поэтому я решила создавать спрайты из четырёх спрайтов размером 8×16. Исключение составил хвост лисы, занимающий два спрайта 8×16. После простых подсчётов стало понятно, что две лисы и два геккона займут 20 из 40 спрайтов, то есть можно будет добавить ещё много дополнительных спрайтов. (Спрайты размером 8×8 быстро бы исчерпали мой лимит, чего не хочется делать на ранних этапах разработки.)
Пока мне нужно только отрисовать спрайты. Ниже представлены грубые эскизы на клетчатой бумаге. У меня есть спрайт ожидания, «думающий» спрайт для выбора, нужно ли сделать пас или бежать, как в игре на SNES… и на этом всё. Я планировала ещё сделать спрайты бегущих персонажей, прыгающих персонажей и персонажей, которых хватают противники. Но для начала я нарисовала только ожидающий и думающий спрайты, чтобы не усложнять. Остальные я по-прежнему не сделала, надо этим заняться.
Да, знаю, рисую я не очень хорошо. Перспектива — сложная штука. (Да и эта морда полярной лисицы ужасна.) Но меня это вполне устраивает. Дизайн персонажей не имеет каких-то особых черт, но для гейм-джема подходит. Разумеется, я использовала в качестве референсов настоящих гекконов и полярных лис. Разве незаметно? Не отличишь. (Для протокола: только что снова посмотрев на эти картинки, я осознала, что между гекконами и ящерицами есть огромная разница. Не знаю, что с этим делать, кроме как считать себя глупой…) Думаю, можно догадаться, что источником вдохновения для головы лисы служил Blaze the Cat из серии игр про Соника.
Изначально я хотела, чтобы защитники и нападающие в каждой команде были разного пола и их было легче различать. (Ещё я собиралась позволить игрокам выбирать пол своего персонажа.) Однако для этого потребовалось бы гораздо больше рисовать. Поэтому я остановилась на гекконах мужского пола и лисах женского.
И, наконец, я нарисовала экран заставки, потому что для него осталось место на листе клетчатой бумаги.
Да, позы действий ещё далеки от идеала. Полярный лис должен быть более расстроенным и бежать, а геккон выглядеть угрожающе. Защитник-лис на заднем плане — забавная отсылка к арту на коробке Doom.
Pokemon Pinball
Если поначалу игра выглядит не особо впечатляюще, то уже ближе к середине, когда на сцену выходят легендарные покемоны вроде Мьюту, оторваться от неё практически невозможно. Счёт на экране растёт с космической скоростью, а каждый бой приносит миллионы очков.
Всё происходящее выполнено в лучших традициях игр по вселенной Pokemon. Никто бы не удивился, если бы игра оказалась посредственной, но студия подошла к вопросу со всей серьёзностью, и в итоге мы получили одну из лучших игр на данной платформе.
Технические характеристики
- Процессор:
8-разрядный Z80, 8 МГц. - Память:
основная память — 32 кбайт, видеопамять — 16 кбайт. - Звук:
динамики (моно) / наушники (стерео) - Экран:
32 тыс. цветов (16 бит), 56 цветов одновременно, 160×144 пикселей, диагональ экрана 60 мм. - Размеры:
132×78×26. - Цвет:
восемь цветовых решений: фиолетовый, фиолетовый-прозрачный (на фото), салатовый, жёлтый, синий, красный, чёрный и оранжевый. - Дополнительно:
Последовательный порт; - Инфракрасный порт.
Работает от 2-х пальчиковых батареек типа AA (3 вольт). Система совместима с играми для оригинального Game Boy, которые показываются в 4-х цветах.
Pokemon Gold/Silver/Crystal
Gold и Silver стали не просто обновлёнными версиями Red и Blue; новая серия познакомила нас с концепцией размножения покемонов, благодаря которой у нас появился повод снова пропасть в любимой вселенной на долгие часы. Теперь мы могли самостоятельно выводить новых монстров и собирать необычные команды.
В игре также появился цикл смены дня и ночи, а часть покемонов можно было найти только в определённое время суток. Список нововведений можно продолжать бесконечно, поэтому мы просто отметим, что все они задали новое направление развития серии, превратив Pokemon во вполне солидную RPG.
Mario Tennis
Местный сюжет нельзя назвать выдающимся, но со своей главной задачей (увлечь игроков) он определённо справился. Здесь мы играем за новичка в школе тенниса, который постепенно осваивается и готовится к важным соревнованиям. Выполняя различные задания, мы поднимаем уровень героя и получаем очки, при помощи которых можно прокачать необходимые умения; а самого героя можно импортировать в Mario Tennis для N64.
Несмотря на то, что команда Марио появляется лишь во время финального испытания, а сыграть за неё можно лишь в специальном режиме, Mario Tennis отлично себя показывает и без титульного персонажа.
Game Boy Advance SP
В самом начале 2003 года Nintendo показала миру Game Boy Advance SP (AGS-001). Внешне он напоминал компьютер и, одновременно, складной футляр, запитывался от литий-ионной аккумуляторной батареи. Жидкокристаллический дисплей обладал достаточной яркостью, подсветка могла включаться и выключаться при помощи отдельной кнопки. Редизайн был предназначен для устранения некоторых распространенных жалоб на оригинальный Game Boy Advance. Многие пользователи подвергали его критике за то, что использование было несколько неудобным, особенно из-за слишком тёмного дисплея. По характеристикам консоль похожа на предыдущую из линейки.
Примерно во время анонсирования Game Boy Micro, была выпущена версия Game Boy Advance SP (AGS-101) с подсветкой для Северной Америки. Теперь переключатель, управляющий светом, мог включать стандартную, то есть «обычную» подсветку, которая сама по себе уже ярче, чем экран оригинального Game Boy Advance SP, также имелся «яркий» уровень подсветки экрана, с более интенсивным светом.
Shantae
Shantaes наполнена типичными для 2D-платформера вещами (бег, прыжки, разбросанные по уровням бонусы и прочее), но всё это выполнено настолько качественно и красиво (особенно по меркам GBC), что даже подобрать аналоги не получается.
А в прошлом году на платформе DSiWare вышел спин-офф под названием Shantae: Riskys Revenge, доказавший, что у персонажа и у общей концепции игры всё ещё есть потенциал. Быть может, нас ждёт полноценный сиквел?
Wario Land 3
На каждом уровне спрятано сокровище, но, как и полагается хорошим приключенческим играм, добраться до него получится далеко не сразу – придётся обойти весь уровень вдоль и поперёк, используя новообретённое бессмертие Варио. Этот новый взгляд на знакомые аспекты 2D-игр позволил Wario Land 3 стать одной из самых значимых игр на GBC.
Добавьте сюда отличную анимацию, забавную музыку и не самую плохую историю и получите достойный сиквел, который, мы надеемся, обретёт новую жизнь на 3DS Virtual Console.