Занимательные хаки: краткая история
Сложно перечислить все трудности, встающие перед разработчиками при реализации своих идей — от неожиданных проблем железной совместимости, поджимающих сроков, невоспроизводимых багов, до просто недостатков технологии, не позволяющих воссоздать всё желаемое, или слишком больших амбиций. Почитав ряд post mortem-откровений, где девелоперы сетовали на неожиданные препоны, встававшие у них на пути, — можно только даваться диву, что конечный продукт был интересен и играбелен, хоть и не вмещал в себя и половины задуманного. Но в этой статье пойдёт речь о некоторых ярких примерах из истории разработки известных игр, в которых программисты сумели превозмочь трудности и сделали это неординарным способом.
Собственно, интерес к вопросу был вызван недавней новостью про то, что поезд в аддоне к Fallout 3, — вовсе и не поезд, а предмет в руке NPC, который носится где-то по рельсам. Узнали об этом совершенно случайно, посмотрев в редакторе на свойства объекта. Используя такой хак, Bethesda сэкономила массу времени от внедрения в игру реальных поездов (средств транспорта, по крайней мере подвижных, в ней нет), при том не отнимая у игрока ощущения погружения в виртуальный мир постапокалиптических пустошей… Но начнём с начала.
Голубой вагон качается…
Ранние персональные компьютеры, появившиеся во второй половине 70-х, с одной стороны, предоставляли массу возможностей не имевшим доступа к мейнфреймам, с другой, были весьма ограничены уже на то время. К тому моменту Ричард Гэрриотт, покоритель космоса и некогда владыка Бриттании, уже успел набить руку в создании компьютерных игр. Недаром что его Akalabeth, одна из первых РПГ для персонального компьютера, стала номером 28 в послужном списке. И последнее предложение Стива Джобса не полностью удовлетворяло его игродельческим амбициям. Ограничения встроенного компилятора Apple Basic и 64-х килобайт оперативной памяти вылилось в то, что программа не умещалась целиком в памяти. Ему пришлось написать подпрограмму, которая бы выгружала ненужные данные (изображения монстров или ещё что-то) и на их место ставила то, что требуется в данный момент, оставляя лишь заголовок файла, то есть выполняла алгоритм подкачки. Чтобы программа не заметила подвоха, всё было синхронизировано вручную, и при попытке пропустить её через debug просто выдавала кучу ошибок.
Отсюда всё и пошло.
Не стоит удивляться — современные игры тоже используют схожие приёмы для оптимизации работы с ресурсами. Всеми известная серия Grand Theft Auto, хвастающаяся помимо растущей из года в год музыкальной подборки и обширнейшим авто- и не только парком, никогда не даст вам оценить его во всём многообразии. Дело в том, что в большинстве сцен на дороге в четвёртой части (в ранних это тоже встречается) эпопеи могут присутствовать лишь порядка 20 разных моделей авто, хотя часто их реально меньше. Более того, если персонаж в этот момент тоже взял напрокат какую-то тачку, то с большой вероятностью по дороге заскользят те же самые машины, что и у него. Это делается для экономии ресурсов. Конечно, есть способы этот алгоритм отключить, но при этом получив удар в область кадросекунд.
Массовый автопробег? Нет — мало памяти.
Другой классикой, эксплуатирующей необычные хаки стала Elite, впервые вышедшая в 1984-м и распространившаяся на большинство имевшихся тогда систем. Амбициозная игра, сочетающая в себе космический экшн-симулятор от первого лица и торговую часть, тогда казалась издателям, всё ещё нацеленным на конкуренцию с рынком аркадных автоматов, слишком сложной, и разработчики Иан Белл и Дэвид Брабен провели некоторое время в поисках. Но Elite оказалась однозначным хитом и дала рождение целому жанру. Но что интересно — она предназначалась для тех же восьмибитных компьютеров, где по экрану ползали персонажи примитивных платформеров. Бескрайний космос размером в восемь галактик и 256 планет пленял воображение игроков, при том умещаясь всего в 25 килобайтах.
За этим экраном скрывался необъятный космос.
Чтобы это стало возможным, создатели использовали низкоуровневый язык програмирования ассемблер, а также свой алгоритм, где данные брались случайным образом из таблиц, тем самым генерируя мир заново при создании новой игры. Таким образом выбирались курсы обмена ресурсов, типы планет и прочая информация. В будущих портах и улучшенных версиях многие ограничения были убраны, но алгоритм создания галактики остался.
Далее, Space Invaders — игра, о которой слышали если не все, то все точно. Идея была достаточно проста — звёздные интервенты потихоньку опускались в нижнюю часть экрана, которую игрок оборонял на подвижной туреле. И чем меньше их становилось на экране, тем быстрее они летали и снижались. Авторская задумка? Безусловно. Но как она была реализована! В игровом автомате стоял Intel 8080 — первый широко распространённый микропроцессор производительностью в 300.000 операций в секунду. И разница в скорости возникала из-за того, что он не справлялся с возложенными на него задачами — игра банально подтормаживала при заполненном экране. Но создатель Space Invaders, Томохиро Нишикадо, решил оставить это в качестве дополнительной трудности, и так потратив много времени на разработку аппаратной части. Что и говорить о плавной анимации полёта или цветной графике — их пришлось отложить для более поздних версий. К слову, в последующих портах на компьютеры и приставки такая механика осталась, но была реализована без использования «тормозящего» процессора.
Изначально, чтобы раскрасить экран на него крепились полоски разноцветной плёнки.
И спустя 30 с лишним лет проблема плавной производительности в играх актуальна как никогда. Для поддержания постоянной скорости работы игры используются разные технологии, одна из них — dynamic framebuffer, замеченная в ряде консольных игр и на новых приставках. Суть подхода заключается в том, что в зависимости от нагрузки меняется размер картинки для поддержания обещанных 30 или 60 кадров в секунду. И меняется оно покадрово, прямо на лету и растягивается аппаратным скалером приставки. Но при этом подгоняется только горизонтальное разрешение, вертикальное же остаётся прежним — 720 или 1080 точек. И, судя по имеющимся примерам, в первом варианте оно может идти от 1280 точек до 640 (!) точек, во втором — опускаться где-то до 1200 точек. Причём, в играх, которые работают на разных консолях, технология выдаёт разные разрешения.
Один и тот же кадр, один размер экрана, но совсем разное горизонтальное разрешение.
Впервые, это было замечено в Wipeout HD, но позднее использовалось в шутере Rage от id Software, файтинге Tekken Tag Tournament 2 и других.
Иногда интересные решения появляются как результат долгосрочных изучений возможностей той или иной системы. Commodore 64 является помимо того, что самой успешной моделью персонального компьютера, так еще и одним из самых долгоживущих, протянувшим в одной и той же конфигурации с 82-го по 94-й год. Одной из игр, вышедших под закат платформы, является малоизвестный платформер Mayhem in Monsterland. Тем не менее, по сравнению с играми, выполненными на точно том же железе в 80-х она выглядит просто потрясающе: быстрая плавная прокрутка экрана, множество спрайтов, яркие цвета. Разработчики из Apex Software использовали все хаки в своём арсенале.
Трудно представить, что это скриншот игры с платформы, появившейся за 3 года до NES.
Чтобы добиться такой быстрой прокрутки, ведь всё-таки игра — это смесь Марио и Соника, а последний бы вряд ли ограничивался на прокрутку в 7 пикселей за раз, которую предлагает C64, был использован незадокументированный баг в графическом чипе, который позволял делать скроллинг на 320 пикселей т.е. ширину одного экрана. Но и это не всё. Несмотря на то, что название компьютера подразумевает наличие лишь 64-килобайт адресного пространства, исполняемый файл занимает 68. Лишняя оперативная память берётся из ROM, где почему-то было оставлено свободное пространство, графический режим также является смесью из двух — HIRES (высокое, по меркам 82-го) и MULTICOLOR, и для преодоления ограничения на количество спрайтов в кадре (оно было заложено на аппаратном уровне) используется композитное изображение, где картинка состоит как бы из нескольких частей кадра, чтобы обмануть железо.
Конечно, на этом история использования хаков не заканчивается, ну, а тем кто хочет посмотреть на представленные игры и послушать про эти и другие занимательные примеры — милости просим: наше видео.
//Virgil & Dimouse