Недавно я оказался в не совсем обычной для себя ситуации вынужденного безделья. Пару недель поваляв дурака, я стал чувствовать, что это не такое уж и веселое занятие, которое к тому же еще и стало переходить в скуку. И мне надо было себя занять чем-нибудь относительно полезным. Раньше мне периодически приходили в голову мысли о том, чтобы вернуть к жизни какую-нибудь старую игру из времен моей юности. Но я всегда гнал такие идеи прочь, так как понимал, что "никому это теперь не надо". Но сейчас у меня было свободное время и, главное, было желание. В результате для клонирования я выбрал один из вариантов игры Lode Runner, в который я когда-то играл на первом персональном компьютере времен позднего СССР, который назывался БК-0010. Не думаю, что многие о нем помнят, так как мир «железа» поменялся с тех времен очень сильно. Однако сам Lode Runner с этого БК-0010 был достаточно уникален своими правилами среди других одноименных Lode Runner-ов. Эта версия игры была моей самой любимой, как мне кажется, по объективным причинам, хотя… может быть тут дело просто в ностальгии. В результате я сумел себя мотивировать тем, что "лично мне", а, возможно, и "всему миру", эта игра может быть интересна, и на её восстановление стоит потратить время (ссылка на полученный результат).

Для начала взглянем на оригинал с БК-0010 (хвала Интернету, в котором можно найти почти всё):
image

Правила игры достаточно просты. Необходимо собрать все сокровища в лабиринте, затем появится «дверь», через которую можно выйти на следующий уровень. Но выполнению этой благородной задачи мешают злые охранники, которые преследуют беззащитного главного героя. Хотя… есть у нашего героя одно секретное оружие — в кирпичном полу можно пробивать дырки, делая ловушки для охранников. Охранник проваливается в такую дырку и некоторое время считается пойманным. В этот небольшой промежуток времени главный герой может бегать охраннику по голове.

Отличительной особенностью версии игры на БК-0010 было то, что главный герой дырявил кирпичи строго под собой, а не справа или слева, как это происходило, например, на Lode Runner с компьютера ZX-Spectrum. В результате можно было бежать вперед, оставляя за собой продырявленный пол, куда падали преследователи. И эта особенность как раз и выделяла для меня этот Lode Runner из всех других одноименных игр.

При полном клонировании в разработке есть как плюсы, так и минусы. Безусловным плюсом является то, что есть возможность заранее четко представить себе цель, также можно использовать игровые уровни, которые уже есть в версии для БК-0010. Минусы же заключаются в том, что поведение главного героя и охранников должно быть реализовано максимально близко к оригиналу. И если с главным героем всё более-менее ясно, то у охранников есть что-то наподобие AI, который имеет-таки массу мелких особенностей, требующих повторения в моем коде. Критические отклонения в поведении охранников могут сделать уровни с БК-0010 неинтересными либо вообще непроходимыми. А это убивает весь смысл клонирования.

Начал я с того, что нашел в Интернете уже кем-то переделанный вариант Lode Runner-а с БК-0010. Однако маленько поиграв в него, я понял, что он похож только с виду. Несмотря на внешнюю схожесть, на мой взгляд, автор не дал себе труда поработать над поведением охранников, поэтому перемещались они не так, как это было в оригинале. А когда я «замуровал» одного из охранников в кирпичах, игра сбилась. Но в этой версии был важный для меня плюс — здесь присутствовал редактор уровней, и эти уровни также были старательно перерисованы из оригинала. А мне эти уровни как раз были очень нужны.

Несмотря на то, что игра была по современным меркам простенькой, она требовала, чтобы у неё был какой-то интерфейс пользователя, т.е. те же кнопки меню должны были как-то функционировать. Также у меня присутствовала навязчивая идея о том, чтобы игра была легко переносимой на разные платформы. К счастью для меня, я уже делал подобную оболочку для своей классической RTS Земля онимодов (статью о том как я её делал можно найти тут). Оболочка эта имеет важную особенность — она не общается с ОС напрямую, а только через виртуальные функции, которые можно относительно легко заменить. Также оболочка имеет достаточно продвинутый GUI, который с виду может не сильно отличается от интерфейса Windows:

image

Запись/чтение файлов, файловые потоки, работа с мышью и клавиатурой, воспроизведение звука, вывод графики и управление режимами экрана — всё это также было предусмотрено в моей оболочке. Поэтому я пошел именно этим путем — решил допрограммировать к оболочке небольшую игру.

Больше информации по этой оболочке можно найти в моей прошлой статье.

Игра не требовала каких-то серьезных вычислительных мощностей, поэтому я решил не заморачиваться и рисовать графику процессором. Логика тут очень проста. Создаем поверхность в памяти, выводим туда картинку процессором, потом копируем эту поверхность на текстуру DirectX или OpenGL в видеопамяти и эту текстуру уже выводим на монитор. Такой подход хорош тем, что он максимально упрощает перенос между разными платформами. А так как бороться за быстродействие мне не придется, то я посчитал этот путь единственно правильным, тем более, что оболочка на текущий момент также строит своё изображение процессором.

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

image

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

image

Естественно, что в начале у меня никакой графики не было — я надергал из Интернета каких-то иконок и превратил их во «временную графику». Живые объекты у меня также в начале представляли из себя статические картинки, которые, в прямом смысле, плавно ездили по уровню. Но такой подход позволил мне запрограммировать почти всю логику игры не прибегая к помощи художника. Художником, кстати, выступил мой старый друг Константин Иванов, который уже давно ничем подобным не занимался, так как в настоящий момент тратит свою жизнь на создание рекламных видеороликов в одной казанской компании. И эти видеоролики ему уже порядком надоели. Поэтому, к моему удивлению, он достаточно активно взялся за оформление моей явно некоммерческой затеи. В результате всё оформление нами было сделано за 2 ночи в сочетании в уничтожением алкогольной продукции. Тут надо уточнить, что сам я по графике ничего не делал — только предлагал и критиковал, а рисовал Константин.

Так как в оригинальном варианте игры персонажи представляли из себя нечто невнятное по причине малого количества пикселей на клетку уровня, то мы решили их поменять. Привидения вполне подходили на роль охранников, к тому же у них было большое достоинство — им не нужно ногами двигать во время перемещения, что упрощает рисование. А вот с главным героем так просто не получилось. Первый вариант, который выдал мне Константин, определенно напоминал мне «жидкого Терминатора» в миниатюре. И было очевидно, что ему надо не убегать от привидений, а охотиться на них. Однако сюжет игры требовал другого. В результате я дал Константину книгу Николая Козлова "Истинная правда или учебник психолога по жизни", а там куча иллюстраций примерно такого типа:

image

И через несколько минут он мне выдал нашу «колобчиху» image, которую мы в результате и отправили на поиски сокровищ. На всякий случай уточняю, что Константин рисовал ей «ручки», а не «ушки», но визуально это не совсем очевидно.

Потом мы старательно переносили все уровни из оригинала в нашу игру. Я их открывал в той не самой удачной версии, о которой я упоминал ранее, затем нажимал PRINTSCREEN, закидывал в Photoshop и оттуда печатал на принтере. Да… перед печатью еще делал инверсию изображения, чтобы не заставлять принтер печатать много-много черного цвета. И, глядя на этот лист, я просто рисовал в своем редакторе уровней то же самое. После того, как все 26 уровней были перенесены, мы с удовольствием дорисовали несколько собственных.

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

Был когда-то в конце существования СССР такой мультфильм, который назывался "Босой ученый". Там один, ну, очень умный восточный мыслитель пошел на рынок за новыми ботинками. И там он увидел, что какой-то художник продает картины, на которых нарисованы всякая живность, в частности, там были и петухи. И мыслитель говорит художнику:
— У тебя же талант. Зачем ты его тратишь на то, чтобы рисовать петухов? Нарисовал бы лучше что-нибудь великое, например, бога.
А художник ему и отвечает:
— Бога нарисовать слишком просто, поэтому мне это неинтересно.
— Неужели ты считаешь, что бога нарисовать проще, чем какого-то там петуха? (возмутился мыслитель)
— Конечно, проще (отвечает художник). Бога же никто не видел. Нарисуй я его с рогами или без головы — никто не скажет, что я нарисовал его неправильно. А вот если я нарисую неправильно петуха, то все сразу скажут, что я не умею рисовать.

(рассказал по памяти — смотрел мультик очень давно, но эта мысль мне определенно показалось дельной)

В общем саму игру я осилил примерно за недельку, но потом добавляли графику и звук, рисовали уровни и, самое главное, я-таки решил поиграться в кроссплатформенность. До этого момента я никогда не писал приложений под Linux или Mac OS (хотя вру… под Mac OS, iOS, Android и WinPhone я делал примеры работы своего движка спецэффектов, но это были отдельные проекты, а сейчас мне надо было портировать один и тот же продукт везде).

Я обнаружил, что мир Linux/Unix очень разнообразен и сильно отличается в мелочах, несмотря на общие правила. Разбираться с этим многообразием я для себя посчитал делом немыслимым, но портировать всё же очень хотелось. Поэтому я взял движок SDL, который, к счастью, берет на себя все эти тонкости работы различных юниксообразных ОС. Для портирования на Linux я поставил на виртуальную машину Fedora-64 и в ней установил среду Code::Blocks. Дописал к своей оболочке новые классы, которые через виртуальные функции обращались бы к этому SDL. Создал объекты этих классов, вместо объектов классов, которые взаимодействовали с Windows и… собственно всё. К моему удивлению, виртуальная машина вполне воспроизводила игру в реальном времени, разве что звуки чуть-чуть запаздывали.

Mac OS сопротивлялся дольше Linux-а, так как я поленился переносить проект на XCode и установил в Mac OS тот же Code::Blocks. И тут я обнаружил, что отладчик-то не работает. Я понимал, что всё дело в какой-то мелочи, так как после Linux-а проект на Mac OS даже сразу собрался, но возможности запустить отладчик у меня всё равно не было, хотя я и попытался установить GDB. (Возможно, что у меня на Mac-е жутко древняя операционка Lion, и отсюда проистекают проблемы с отладчиком). В результате, я просто стал выводить сообщения в консоль. Оказалось, что проблема была в путях к папке с игрой и к папке для сохранения данных. Как только я исправил эти функции, игра запустилась.

Отдельное время у меня отняла задача по открытию в браузере ссылок. Как это делать в Windows я, конечно, знал:

void GPlatformWindows::OpenLink(const char* link)
{
	ShellExecute(NULL, _T("open"), link, NULL, NULL, SW_MAXIMIZE);
}

А вот Linux порядком помотал мне нервы с этими ссылками. В результате я сделал так:
void GPlatformUnix::OpenLink(const char* link)
{
	ToIconic(); // сворачиваем окно с игрой

	#ifdef __APPLE__

	// для MAC OS
	CMagicString param="open ";
	param+=link;
	system(param);

	#else

	// для Linux
	CMagicString param="xdg-open ";
	param+=link;
	param+=" &";
	system(param);
	
	#endif
}

Не уверен, что это самое лучшее решение, но оно в моем случае вполне работает.

Итоги:
Полученные результаты меня вполне устроили. Я сам с удовольствием поигрался в свое творение и считаю, что качество данного клона вполне приемлемое. Кроме того, я очень редко берусь за проекты, которые по своему объему очень мелкие. А малый объем работы приносит быстрый результат и, соответственно, ощущение «новой звездочки на крыле». Кроме того, мелкие проекты завершаются быстрее, чем они успевают надоесть.

Если будут желающие «заценить» данное произведение, то я записал небольшое видео на тему того, как правильно играть в мой Lode Runner:

Совет по игре: чтобы дырявить пол лучше удерживать пробел, а не барабанить по нему.

Разработчики:
— Программирование: Алексей Седов (он же Odin_KG, он же студия Astralax)
— Графика: Константин Иванов
Платформы: Windows, Linux, Mac OS
Ссылка на страницу с игрой: Lode Runner

О программировании игр в стародавние времена (лирический раздел)


Я начинал интересоваться программированием почти в то же время, когда появлялись эти первые игры на первых компьютерах, доступных простому населению СССР. И эти первые игры произвели на меня гораздо большее впечатление, чем какая-либо современная высокотехнологичная коммерческая игра с огромным бюджетом и мощным пиаром. И тут всё очень понятно. Впервые я увидел компьютерную игру в тот же момент, когда я впервые узнал о существование компьютеров. Т.е. вот представьте себе следующее: человек знает про радио, телевизор и пылесос, но он вообще понятия не имеет, что на свете есть такая штука как компьютер. Узнал я это в «салоне компьютерных игр», куда отправились все мои тогдашние приятели по общему двору, чтобы посмотреть на эту диковинку. (Тогда как раз в стране стали появляться первые кооперативы, и салоны компьютерных игр скоро стали обычным бизнесом). И в этом салоне стояли как раз те самые БК-0010 с черно-белыми маленькими телевизорами.

Поиграть на этом чуде стоило тогда 1 руб/час. И первое, что я увидел выглядело так:

image

Это игра Land, которая показала мне, что изображением на телевизоре, оказывается, можно управлять. И всё это называется «КОМПЬЮТЕР». Сейчас, оглядываясь назад, я предполагаю, что тогда мне было ориентировочно 13 лет.

Не знаю как бы сложилась моя жизнь, если бы я в своё время вот так вот не познакомился с компьютерными играми. Но тогда я, естественно, и мечтать не мог, что когда-нибудь смогу взять да и запросто сам создать компьютерную игру. К этому этапу я смог перейти только через пару лет, когда у меня появился первый самодельный компьютер Специалист. А вот и он, кстати:

image

Потом было несколько вариантов ZX-Spectrum, максимальным по навороченности из которых был ATM-turbo, но это всё растянулось по времени на несколько лет. ATM-turbo я себе смог позволить только уже когда учился на втором курсе (сэкономил 10 стипендий, чтобы купить радиодетали). По образованию, я, кстати, химик-технолог, и я очень рад, что в свое время не пошел учиться на программиста — академическая модель обучения, на мой взгляд, вырабатывает у учащегося жесткое отвращение к получению знаний в этой области.

Несмотря на то, что сейчас игры типа Lode Runner выглядят примитивными, когда-то они таковыми не являлись. И автору оригинала (насколько мне известно его зовут А.Марков) приходилось не так легко как мне с моим клонированием. В то время разработка велась совсем не такими методами как сейчас. Это станет понятно, если мы просто вспомним технические характеристики того же самого БК-0010.
Процессор: К1801ВМ1 (щестнадцатиразрядный) с тактовой частотой 3 МГц
ОЗУ: 16 килобайт
Видеопамять: 16 килобайт (на деле отдельной видеопамяти раньше не было — это часть того же самого ОЗУ, которая постоянно выводилась на монитор)
ПЗУ: 32 килобайта (тут были Бейсик или Фокал, а также всякие системные функции)
Устройство хранения информации: бытовой магнитофон и кассеты (скорость загрузки примерно 10 килобайт в минуту)
Устройство отображения: телевизор (в редких случаях монитор)

Визуально БК-0010 представлял из себя толстую клавиатуру, внутри которой находилось сразу всё.

image

Стоимость составляла 650 рублей (при зарплате инженера в 120 рублей, фрезеровщика в 200 рублей, а начальника в 300 рублей)

Я сам на этом БК-0010 никогда не программировал (он был слишком дорогой да и, на мой взгляд, не идеальный), но, по сути, я начинал примерно в то же время. И, я понимаю, что тогда разработчику нужно было, ох, как постараться, чтобы создать на таком железе и, самое главное, с имеющимися программными инструментами, что-то стоящее. Да и сам процессор физически был очень слаб — программист обычно считал такты, за которые выполняется та или иная команда, чтобы оптимизировать код. По-моему, на БК-0010 были еще и какие-то проблемы с ассемблером, так как один мой знакомый программировал на БК-0010 просто "в кодах". На деле, это значит, что забиваешь память цифрами, которые что-то значат для процессора, но визуально мало о чем говорят человеку. (Я этим в начале, кстати, тоже занимался, пока не узнал, что такое ассемблер и не набрал его ручками в виде списка байтов из одного журнала). Например, число 06 означало для процессора команду копирования содержимого регистра B в регистр A, что можно было записать на ассемблере в более понятном человеку виде как MOV A,B (для процессора КР580ВА80) или LD A,B (для процессора Z-80). Но это еще кое-как можно было запомнить, но дела с переходами по адресам обстояли еще хуже. При программировании в кодах нужно вписывать прямой адрес или смещение от текущего адреса до того, куда программа должна перескочить. А если приходилось вставлять в код изменения, то адреса сдвигались и надо было все адреса переходов расставлять заново. Некоторые для этих целей вставляли в код множество команд ассемблера NOP (код 00), которая просто ничего не делает — такие команды потом можно было заменить на что-то другое не трогая адреса.

Рисовать графику, кстати, тоже было негде. Я, например, в то время отмечал карандашом точки на миллиметровке, а потом переводил эти точки в байты и эти байты вводил в компьютер ручками. И не думаю, что у автора оригинального Lode Runner-а были какие-то сильно отличающиеся от моих возможности.

Я всё это к тому, что меня всегда удивляло часто пренебрежительное отношение к этим старым играм. Делать всё это было крайне сложно, и не у кого было спросить совета, так как разбирались в этом единицы, а Интернета тогда еще даже в планах не было. Единственный плюс, который, на мой взгляд, тогда присутствовал — это интерес к этой работе со стороны игроков. Людей с компьютерами было мало, но они были, скажем так, благодарными пользователями — появление новой игры вызывало интерес и игра быстро расходилась по тем же салонам компьютерных игр. И я не помню, чтобы кто-то когда-то говорил гадости на тему «какая отстойная игра» или что-то в этом духе. Короче, не было перенасыщения рынка, которое есть сейчас, что лично для меня всегда ставило под сомнение необходимость в создании новых игр. Ведь в реальности все существующие сейчас игры даже пересмотреть невозможно, не то что переиграть.

Также я не уверен, что раньше создание игр приносило какую-то ощутимую прибыль их создателям — думаю, что это было чистое творчество, которое сейчас, практически, уничтожено коммерческими отношениями в обществе. Тихо сдохли и радиолюбительство и интерес к муз.школе и вообще всё, что предполагает занятия чем-то не ради чистой прибыли.

Закончить я хотел бы словами благодарности в адрес разработчиков той эпохи (речь шла про отрезок времени: конец 80x — начало 90х). А также лично в адрес тов. Маркова, с которым я не знаком, но тем не менее его игра произвела на меня в возрасте 13-14 лет большое впечатление. Как не крути, именно эти энтузиасты стояли у истоков российского игростроя. Но главное, они зародили интерес к теме программирования у тех, кто «шел следом за ними». И я, в отличии от многих, понимаю, сколько это тогда требовало сил и терпения.

Благодарю за внимание!
Алексей Седов

Комментарии (146)