Metal Man Reloaded
Metal Man Reloaded: История создания
Oleg Origin
Это игра в жанре Action с некоторыми
квестовыми элементами и отдельными подуро─
внями в жанрах Arcade и Puzzle.
Игра сделана по мотивам моей игры Metal
Man 1997 года.В оригинальной игре был сде─
лан только один уровень; планировалось ещё
какое-то количество, но второй я так и не
завершил. Игра имела очень примитивный
геймплей и кучу мелких глюков. В то время
я не пользовался ассемблером, писал напря─
мую в машинном коде, что,в сочетании с не─
достаточным опытом,служило причиной топор─
ности геймплея всех моих старых игр.
На момент начала работы на Metal Man
Reloaded у меня имелось несколько десятков
проектов игр в различных жанрах, и идея
сделать ремейк наивной старой игры совсем
не была для меня приоритетной. Изначально
я не планировал делать ничего масштабного
- просто повторить игру на качественно но─
вом уровне, используя графику и сюжет ори─
гинала.
Я начал работу над игрой летом 2011 го─
да, и к новому году сделал движок и первый
уровень примерно так, как я,наверное,хотел
бы видеть это ещё в 97-м. Несмотря на то,
что внешне игра получилась довольно похо─
жей на оригинал,объём и качество кода этих
двух игр ( Metal Man и Metal Man Reloaded)
несравнимы. Вся графика была тоже значите─
льно переработана, а в расширенную карту
уровня был добавлен цвет.
Интересно, что единственным куском кода
из старой игры стал эффект "расползающего─
ся" экрана при гибели.
Кстати,о карте:в оригинальном Metal Man
она хранилась крайне нерационально: байт
на каждое знакоместо. В Metal Man Reloaded
карта хранится в виде блоков размером 1*8
символов. А поскольку высота этажей - 9
знакомест, то полы описаны отдельным одно─
битовым идентификатором (старший бит инде─
кса блока).На каждом из уровней 128 блоков
карты (несколько первых - специальные ти─
пы),которые состоят из 128 символов. Полу─
чается по килобайту на каждый из этих мас─
сивов (плюс ещё цвет для символов), но они
сохранены в "двухкилобайтном" формате с
прямым доступом по индексу,потому я смешал
их с отступом в 128 байт, закрыв "дыры" в
данных. Для игры написан собственный реда─
ктор уровней.
В начале 2012 года я временно забросил
работу над игрой, в которой был полностью
готов первый уровень.Разумеется,можно было
просто нарисовать ещё несколько карт уров─
ней без переработки движка, но, согласно
родившимся у меня на тот момент идеям,
каждый уровень должен был стать во многом
уникальным.
Лишь летом 2013 я написал ещё два уров─
ня игры (4-й, затем 2-й). Каждый уровень в
игре уникален, так что их написание факти─
чески стало сравнимо с написанием ещё од─
ной небольшой игры. Хотя второй уровень
игры - самый насыщенный и разнообразный, я
сделал его довольно быстро благодаря хоро─
шо проработанному первоначальному концеп─
ту. После этого я отвлёкся на работу над
Rikki-Tikki-Tavi, которую сделал почти
полностью. Наконец, в конце 2013 я доделал
уровни 3 и 5. Заставка была нарисована уже
в начале 2014.
Получается,проект растянулся на три го─
да. Наверное,лучше так не делать =). Прое─
ктов у меня всегда много, и это далеко не
только игры для Спектрума. Для того, чтобы
остановиться на одном-единственном и сде─
лать его "за один раз" от начала и до кон─
ца - пыла и интереса не всегда хватает.Ча─
сто хочется перекинуться на что-то другое
- получается, что одновременно всегда веду
несколько проектов. Возвращаться после до─
лгого перерыва непросто - приходится долго
разбираться в своём же коде.В определённой
степени не растерять интерес и довести
проект до конца помог также конкурс, в ко─
торый я вписался. Хотя к тому времени дви─
жок и 3 из 5 уровней были уже полностью
готовы, и я в любом случае просто обязан
был доделать игру.
Моя подруга Стэлла Арагонская значите─
льно помогла мне с завершением проекта,
также я включил в состав дополнительного
саундтрека одну её композицию в качестве
бонуса.
Кстати, заглавную биперную композицию
игры я писал в ModPlug трекере,конвертиро─
вав её собственным конвертером в собствен─
ный биперный движок. Для дополнительного
саундтрека я в ту же самую мелодию поста─
вил "нормальные человеческие" инструменты
и затем дописал гитары, перкуссию и эффек─
ты. Затем написал две гитарные композиции
(одну из них - на основе главной темы).
Я сделал русскую и английскую версию
игры (после релиза зарубежные спектрумисты
помогли сделать версии еще на четырёх
языках), а также кассетную и дисковую
(TR-DOS). Кассетная и дисковая версии от─
личаются только загрузчиком: в дисковой
версии уровни подгружаются из BASIC, в
кассетной - программа запускается с друго─
го адреса,и вся дальнейшая загрузка проис─
ходит без выхода вBASIC. На ZX Spectrum
48K уровни загружаются с кассеты отдельны─
ми блоками,а для расширенной памяти реали─
зована единовременная загрузка всей игры.
В версии дляTR-DOS независимо от количес─
тва памяти уровни подгружаются с диска по
мере прохождения игры.
* * *
Поскольку в 90-е я учился программиро─
ванию по книге "Как написать игру для ZX
на ассемблере", то и познакоместный формат
спрайтов и процедуру их вывода в игре
Metal Man использовал из этой книги.Причём
в то время я понятия не имел, как сделать
зеркальный вывод, поэтому хранил в памя─
ти отзеркаленные спрайты. Для Metal Man
Reloaded я взял за основу ту же процедуру,
но на основе неё сделал гораздо более про─
двинутую и универсальную спрайтовую подси─
стему. Разумеется,добавил зеркалку,возмож─
ность вывода как на виртуальный, так и на
физический экран, предварительную грубую
проверку попадания в экран, возможность
использования как цветных спрайтов, так и
спрайтов без цвета. Но самое интересное -
я модифицировал формат, позволив создавать
спрайты, где одна часть знакомест цветная
и печатается напрямую, а другая - не рас─
цвечивается при выводе и выводится поверх
имеющейся фоновой графики через любую ука─
занную побитовую операцию. Таким образом,
для тех знакомест, на которые приходится
лишь пара-тройка пикселей, стало возможным
оставлять цвет фона, и наложение цветных
спрайтов на цветной фон происходит "безбо─
лезненно".Более того,при выводе цвета (как
спрайтов,так и карты) используются опреде─
лённые алгоритмы смешивания с существующим
атрибутом. Наконец, имеется возможность
использования нового атрибута для всего
спрайта, что позволило использовать одина─
ковые части спрайтов для разных типов вра─
гов и расцвечивать спрайты красным цветом
при попадании. Вдобавок, для спрайтов гла─
вного героя используются жирные частичные
маски,ещё более скрывающие клэшинг.Правда,
эти алгоритмы рассчитаны на использование
тёмного фона, и в пятом уровне, где вся
игровая область инвертируется, не все они
хорошо работают. Кстати, про инверсию -
мне показалось интересным сделать этот
приём, ведь чаще всего в играх во всех
уровнях используется одна схема - либо
светлое на тёмном, либо тёмное на светлом.
Я "выделил" пятый уровень, решив задачу в
лоб: используются новые наборы спрайтов, в
том числе для главного героя и для взры─
вов.
Параллаксный скроллинг больше всего ис─
пользуется на третьем уровне при езде на
мотоцикле. Там можно выделить 6 слоёв,
движущихся с разной скоростью: здания на
дальнем плане - на 1 пиксель, зелень на 2,
промышленные объекты на 4, далее забор -
на целое знакоместо (он не скроллируется,а
быстро отрисовывается черезPUSH ), дорога
(если судить по разделительной полосе, а
также по лежащим на ней минам) - на пол─
тора знакоместа (хотя трамплины и барьеры
из этой скорости выпадают,и именно поэтому
разделительная полоса на это время убира─
ется) и, наконец, нижний бордюр и столбы -
на два. Есть ещё мелкие элементы графики,
которые движутся с другой скоростью,только
чтобы не казались застывшими, но они не в
счёт. Разумеется,пересечения слоёв сведены
к минимуму. Активное действие происходит
лишь в одной трети экрана, верхняя треть
скроллируется на реальном экране, а пара
строк нижней на нем же перерисовываются.
Небольшая часть "выступающей" из одной
трети графики дорисовывается уже напрямую
на экран. Столбы, разумеется,сделаны атри─
бутной заливкой. Хотя этот эпизод игры не
слишком продолжителен, мне было интересно
потратить на него немало времени именно
ради реализации многослойного скроллинга.
Кстати,на первом уровне,хотя количество
слоев и не так бросается в глаза, но они
тоже есть: город на дальнем плане неподви─
жен, облака бегут на пиксель (можно отклю─
чить в настройках для увеличения скорос─
ти), красные бочки на среднем плане - на 4
пикселя, вся основная карта на знакоместо,
а пол на нижнем этаже выполнен отдельным
элементом с использованием перспективы.
По поводу скриптования вопрос был решён
так: в каждом уровне используется свой
собственный основной цикл,и,стало быть,все
особенности игрового процесса на каждом
конкретном уровне можно задавать жёстко.
Например, в каждом уровне по-своему орга─
низован задний план, установлены задачи
миссии и идёт проверка их выполнения, ор─
ганизованы режимы использования различных
транспортных средств... Так что затемнение
фона в первом уровне при входе в туннель -
это всего лишь жёсткая проверка конкретных
координат в режиме летающего мотоцикла.
А уничтожаемые терминалы на 4-м уровне
для простоты описаны как враги, со своим
bounding box'ом,и поставлено простое усло─
вие:уничтожение трёх таких "врагов".В этом
плане пришлось потрудиться над вторым уро─
внем: там действительно потребовалось бо─
льшое количество кода для описания работы
погрузчика, пресса, крана, переключателей,
входа в автобус и многого другого. Разуме─
ется, используются и многие универсальные
для всех уровней процедуры. Те же лифты,
например. Здесь потребовалось один раз
описать принцип их работы, и затем уже в
карте можно было ставить их между любыми
этажами. А вот, например, запрещать врагам
пользоваться каким-то определенным лифтом
- это уже опять же жёсткие условия для ка─
ждого конкретного уровня...
Конечно, всегда хочется иметь под рукой
более универсальный движок, где можно было
бы задавать самые разные интерактивные ди─
намические объекты, и в котором персонажи
могли бы корректировать свои действия
исходя из текущих условий. Но я совсем не
планировал использовать движок MMR для по─
следующих проектов,поэтому в данном случае
разработка возможностей скриптования была
бы только лишней работой. Надеюсь,в каких-
то будущих проектах мне удастся реализо─
вать более универсальную систему описания
уровней, хотя подлинная универсальность,
исходя из ресурсов Спектрума - всё же уто─
пия.
Я всё время старался контролировать
объём оставшейся памяти, соизмерять его с
тем, что ещё предстояло реализовать по за─
думке. Также,разумеется,я максимально уни─
фицировал схожие моменты поведения врагов
- они обращаются к общим подпрограммам. А
некоторые процедуры используются как вра─
гами, так и игроком - например, использо─
вание лифтов. Помогла и нарезка спрайтов
на отдельные куски и использование их для
разных типов врагов - с изменением цвета.
От каких-то идей приходилось по ходу раз─
работки отказываться, когда память подхо─
дила к концу, либо попросту исключать
из уровня определенные типы врагов. Если
посмотреть на карандашный набросок второго
уровня, можно увидеть двух крупных четве─
роногих роботов. Нехватка памяти - одна из
причин того,почему их не оказалось на этом
уровне - но в итоге я нашёл этому монстру
лучшее применение, использовав его в сле─
дующем уровне не только в качестве врага,
но и как транспортное средство - так что
"всё к лучшему", даже нехватка памяти =)
Изначально я не планировал использовать
расширенную память для единовременной
загрузки всех уровней игры. Но уже после
завершения проекта оказалось, что вся игра
занимает как раз чуть менее128 килобайт,
и я добавил эту возможность. Пришлось
немного повозиться, так как блоки целиком
в страницу не умещаются.
* * *
Hippiman> Как родилась идея самой первой
игры из серии Metal Man? Мир игры похож на
те, что часто были в боевиках 80-90-х:
Робокоп, Судья Дредд. Чем ты вдохновлялся?
В точку! Что, собственно, не удивительно -
кто в начале 90-х не смотрел боевики? =) И
что касается игр: Robocop - одна из люби─
мых игр на Спектруме.Очень нравились сего─
вские Judge Dredd и Demolition Man, хотя
Сеги у меня не было - просто смотрел, как
играют друзья. Спрайты первой игры рисовал
на основе графики из Robocop. Перерисовал
с экрана телевизора,повторил в Art Studio,
затем увеличил на одно знакоместо в высоту
(результаты кривого увеличения хорошо за─
метны),изменил и расцветил. Разумеется,эти
недочёты графики я поправил в MMReloaded и
ещё больше - в MMRemixed. Сегодня,конечно,
я стараюсь - напротив - не заимствовать
никакие элементы графики,кода и сюжета. Но
в то время просто "повторить Робокоп", да
ещё и в цвете - казалось интересной зада─
чей. Кроме того, тема"а что,если сделать,
как на SEGA (или PC, Dendy)" была среди
моих друзей очень популярной. В числе моих
первых недоделанных проектов, помимо неу─
дачной попытки "портировать" Aladdin на
Спектрум, была, скажем,игра,похожая на из─
вестную в те времена Cyberia - я пытался
примитивным способом (набор пререндерён─
ных кадров) красиво реализовать полёт над
морем, а в качестве секретной лаборатории
выступало здание с заставки Impossible
Mission II. По реализации это было похоже
на мою игру Aggressor, но никаких материа─
лов не сохранилось.
Hippiman> Как рождается новый уровень? Ты
какое-то время обдумываешь его концепцию,
рисуешь план,а потом садишься и его вопло─
щаешь, или уровень рождается сам собой, ты
садишься за редактор, и уровень получается
легко прямо в процессе творчества?
По-разному. Конечно, если изначально нари─
совать детальный план, как я сделал это со
вторым уровнем MMR, то разработка пойдёт
гораздо быстрее.Иногда в редакторе уровней
делаю сначала общий набросок плана,а затем
в фотошопе или на распечатке прикидываю,
что и где ещё может уместиться,как органи─
зовать лабиринт. Иногда сразу в редакторе.
В этом случае зачастую уровень выглядит в
итоге совсем не так, как я его представлял
=). В том же MMR все уровни созданы разны─
ми способами. Но общая концепция,разумеет─
ся, всегда есть: нужно же представлять, по
крайней мере, какую локацию мы делаем - а
отсюда вытекает и возможная приблизитель─
ная планировка, и наполнение какими-либо
объектами.
Hippiman> А что из себя представляет реда─
ктор уровней для этой игры? Это самодоста─
точная утилита, которая на выходе даёт би─
нарный объект, уже готовый к вставке в иг─
ру, или набор небольших утилит?
Все необходимые утилиты я пишу себе сам.
Всё кросс-платформенное - на реальном Спе─
ктруме утилиты писал лишь в 90-е. Почти в
каждой игре (речь в том числе о нескольких
разрабатываемых сейчас) используется собс─
твенный формат карты, поэтому для каждой
пишу свой редактор уровней в самом начале
разработки. Редакторы довольно простые:
карты из блоков (тайлов), блоки из симво─
лов,плюс набор жестко описанных объектов и
какие-либо дополнительные параметры. Рабо─
чие файлы уровней - массивы без какой-либо
оптимизации, а на выходе получается уже
готовый набор бинарников либо текстовый
файл с метками для дальнейшего обращения к
ним из программы - всё зависит от конкрет─
ной игры и её формата карты. Кроме того,
конвертер графики из.BMP у меня тоже свой
собственный - он поддерживает все мои фор─
маты спрайтов, которых набралось уже с де─
сяток, простое конвертирование экрана,раз─
личные варианты сохранения шрифтов, в том
числе переменной ширины и увеличенной вы─
соты, запись построчных изображений и кар─
тинок с простейшей упаковкой и всё прочее,
что мне только понадобится. Для ускорения
работы конвертер графики вызывается в том
числе из-под редактора уровней,и для того,
чтобы увидеть в редакторе уровней только
что обновленную в фотошопе графику блоков,
достаточно нажать одну кнопку. Я многое
делаю для автоматизации своей работы. На─
пример, мой блокнот показывает мне все
возможные ассемблерные мнемоники,позволяет
переключаться между всеми связанными фай─
лами,сам обращается к SjASM поF9, показы─
вает ошибки компиляции и запускает эмуля─
тор. А на его создание ушло лишь несколько
часов.И о конвертерах музыкальных форматов
я также упомянул. Выпускать что-либо из
этого кросс-платформенного зоопарка я пока
не планирую - всё же все эти утилиты дово─
льно узкой направленности,ориентированы на
мои собственные принципы работы,имеют лишь
зачатки интерфейса и не представляют собой
законченные продукты.
Hippiman> А как ты тестируешь свои игры? Я
имею в виду не ошибки кода, они, как пра─
вило, находятся легко, а геймплей и дизайн
уровней. Тебе, как разработчику,все уровни
должны казаться лёгкими, а все решения,ко─
торые должен принимать игрок,- очевидными.
Ты привлекаешь кого-то, когда игра уже
закончена, или советуешься с кем-то ещё в
процессе разработки, или просто стараешься
поставить себя на место игрока?
Сегодня часто встречаются примеры коллек─
тивной работы над играми, когда каждый мо─
жет дать совет - в том числе относительно
игрового баланса. В данных случаях хорошо
выверенный геймплей сделать проще. Но дело
в том, что мне интереснее не показывать
процесс разработки, а сразу представлять
готовую игру, по возможности в окончатель─
ной версии. Я ожидаю,что в этом случае иг─
рок будет испытывать такое же впечатление,
какое можно было получить 30 лет назад от
только что купленной кассеты и первой за─
грузки пока ещё незнакомой игры. Ради та─
кого эффекта я практически никому не пока─
зывал MMR ровно до момента релиза, и тес─
тировал всё самостоятельно. Действительно,
свою игру пройти просто, поскольку точно
знаешь все нюансы поведения врагов и как с
этим бороться, идеально знаешь карту и
расположение всех объектов. Вместе с тем,
была у меня такая несколько странная идея
- сделать игру действительно крайне слож─
ной, какими были сотни игр 80-х годов.
Потому я просто добивался такого баланса,
когда сам я проходил ее "почти не глядя",
и принимал это состояние за проходимую, но
очень сложную игру. В итоге по-честному
прошли немногие, как я и предполагал. Были
просьбы уменьшить сложность, и я сделал
это в первом уровне Metal Man Remixed. В
следующих играх я буду стараться применить
аналогичное решение - делать первые уровни
легко проходимыми,с дальнейшим увеличением
сложности. Сегодня появились желающие тес─
тировать следующие игры - думаю, что не
буду отказываться от этого. Ибо чрезмерная
сложность классических игр зачастую как
раз была следствием того, что писал и тес─
тировал игру один и тот же человек.Кстати,
об ошибках кода - несмотря на то, что в
итоговом релизе никто никаких глюков не
встретил, мне в дальнейшем всё же попалось
несколько грубых ошибок, которые лишь слу─
чайно не приводили к "печальным последст─
виям". Неудивительно, что подобное можно
встретить практически в любой существующей
игре - поэтому вопрос "финального релиза"
всегда очень непрост.
Other articles: