Повесть о принце Персии

Да, это Пашка предложил написать Prince of Persia для БК0011М.

Сначала я отнесся к этой идее скептически: и быстродействие, и память явно малы для игры такого уровня. У меня были планы попроще: сделать Zeliard или Supaplex (и почему мы не начали с них?). Пашка вроде бы отступился, но через несколько дней пришел с демонстрашкой, на которой горел факел из Принца! Да, это было красиво, но ведь игра потребует гораздо большего! Но Пашка не унимался и регулярно приносил демки, в которых принц бежал, выпивал кувшин, карабкался вверх на плиту. Он убедил меня, что хотя бы попробовать стоит.


Мы поделили работу. Паша начал работать с графикой (останавливал игру на паузе и перерисовывал спрайты по точкам в тетрадку), а я начал писать модуль вывода спрайтов на экран. Размеры экрана на БКашке отличаются от размеров экрана EGA/VGA IBM PC, поэтому спрайты принца пришлось изменять, подгоняя под новые размеры, а спрайты обстановки и вовсе пришлось рисовать заново.

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

Много сил ушло на то, чтобы спрайты не мигали. Практически во всех БКашных играх спрайты мигают. Вначале мы думали, что это дефект видеоадаптера, но все объяснялось просто: при движении спрайта его необходимо стереть в одном месте и вывести в другом. Т.е. некоторое время на экране спрайта нет. Вот и проглядывает временами через него фон, что и выглядит как мигание. Когда мы это поняли, проблема была решена (Хотя для этого пришлось завести скрытый экран, теряя 16К памяти). Но спрайты в нашем "Принце" не мигают!

(Интересно отметить, как одна и та же задача одинаково решается разными людьми. Разбираясь с IBM-ским "Принцем", мы нашли множество "секретных" кнопок, в том числе и ту, которая показывала скрытый экран, на котором мигают IBM-овские спрайты).

Но работе мешал злой рок. Пашка поступил в институт и уехал учиться в Хабаровск. Я забросил "Принца". Одному было неинтересно мучиться. Да и вообще Пашка был генератором идей и катализатором нашего союза. Правда, проучился он недолго, вылетел после первой сессии за неуспеваемость. Пару месяцев он проболтался в Ургале, а потом его забрали в армию. За это время он успел нарисовать много спрайтов принца, мы определились с размерами экрана и уже были готовы некоторые элементы обстановки, так что материала для работы хватало.

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

После этого принц стал ходить, бегать, прыгать, приседать и т.д. Теперь встала задача запустить его в лабиринты подземелья. А лабиринтов еще нет никаких! Так что пришлось писать еще редактор лабиринтов. В общем это был такой этап, когда закладывалась общая структура программы, потому что надо было связать воедино вывод спрайтов, определение положения принца в лабиринте и управление от клавиатуры. Тут пришлось основательно поломать голову.

Зато когда Пашка приехал в отпуск, я запустил "Принца" и с гордостью сказал: давай, побегай! Он "побегал", посмотрел на меня ошалелыми глазами и сказал: да это же готовая программа! Мы оба не представляли себе, сколько еще надо было сделать!... Дело в том, что лабиринт был еще статическим. А в настоящем полно всяких решеток, падающих плит, кнопок и т.д. Еще и стражники оставались на закуску.

Была еще одна проблема: для 11-й БКашки не было нормального ассемблера. Мы работали в MICRO1103 (я в нем и начинал). Попробовал хваленый MICRO8+ , преимуществ не нашли, а вот длина имени в 3 символа заставила сразу выкинуть его на помойку. Потом появился ТУРБО6. Переползли вроде на него. Но он, мало того что тормозил, еще и неправильно генерировал код. Вернулись обратно в старый испытанный МИКРО11.

Когда число модулей стало подбираться к десятку, связывание их превратилось в пытку. Все приходилось шлепать с клавиатуры, то пропустишь какой-нибудь файл, то два раза слинкуешь - и опять все заново. И тут я вспомнил, что в БК существует режим псевдоклавиатуры: можно программе подсунуть текст в памяти, и она будет думать, что он вводится с клавиатуры. Стали разбираться. Вначале пришлось сломать МИКРО11, он нестандартно работал с клавиатурой. Потом оказалось, что длина текста ограничена 256 символами. Пришлось сломать и Монитор (благо он сидит в 11-й в ОЗУ), увеличили длину текста до 65536 символов. И появились у нас make-файлы.

Красота! Запустишь его, и все само линкуется, и не ошибается! Через некоторое время мы уже не представляли себе, как можно по-другому работать, у нас в автоматическом режиме собирались огромные куски данных и кода. Это сильно повысило производительность, стало гораздо легче править ошибки: перекомпилировал один модуль и запустил пересборку, оно само все пересобралось.

А когда мы убедились, что МИКРО11 умеет компилировать текстовые файлы в формате VorteX! (а это, несомненно, лучший редактор из всех, написанных когда-либо для 10-й), то у нас подобрался отличный пакет для программирования на ассемблере: редактор, компилятор, make и еще пара утилиток, улучшающих программирование для 11-й, плюс замечательный трассировщик TRACER.
Сомневаюсь, чтобы у кого-либо программировавшего на БК0011М был лучший набор инструментов.

Поскольку Пашка, вернувшись из армии, устроился оператором ЭВМ, у него всегда под рукой была ИБМка. Некоторое время у него на работе на столе стояли рядом IBMка и БКашка (к этому времени мы уже сделали для наших БКашек корпуса по типу персоналок и даже оснастили их винчестерами). Паша оживлял лабиринт, заставляя двигаться решетки, пилы и шипы. Качал и ронял плиты, нажимал кнопки.

По ходу дела еще 2 раза менялся формат лабиринта, так как он не был рассчитан на изменения (а падающие плиты его изменяют). 2 раза практически полностью переписали вывод спрайтов, повышая быстродействие. Пашка распечатал все лабиринты, каждый экран на отдельный лист. Мы склеивали листы и получали карту уровня (размеры получались такие, что карта не помещалась целиком на полу комнаты), вот тогда только мы сделали полные лабиринты всей игры.

Стало не хватать звуков. Хорошо, что у нас уже был опыт работы со звуком на БК. Решили выводить оцифровки на динамик, чтобы было совместимо со стандартной БКашкой. Но как их вытащить из IBMки? Промучившись некоторое время, Пашка, настоящий хакер, сломал оригинального "Принца", изменив вывод звука вместо динамика на принтер, который печатал искомые байты звуков. Так что и звуки нашей версии Принца полностью соответствовали оригиналу.

Но был уже 1995(96) год. Уже вовсю распространялись IBM PC, их мощность росла буквально на глазах. Оперативную память уже считали мегабайтами, а тактовую частоту - десятками мегагерц. Интерес к БКашке угасал. В общем, проект забросили больше чем на год.

И вдруг мы получаем письмо из Сочи от некоего Григория Останина, в котором он вместе со своми друзьями-БКашниками прямо спрашивает, когда, наконец выйдет "Принц", сколько еще ждать? Мы ответили в том смысле, что уже не думали, что наша работа еще кому-то нужна, но раз такое дело, то за месяц-два беремся наш проект завершить, тем более, что осталось добавить только стражников и промежуточные мультики.

Записали им дискету с последней рабочей версией "Принца", игрушку "Color Lines", архиватор LZ, схемный редактор и звуковое/графическое письмо (наговорили несколько слов через нашу звуковую приставку, вставили кусочек оцифрованной музыки).

И с новыми силами бросились доделывать наш проект. На волне энтузиазма сделали стражников, отражение.


Я даже написал линковщик к нашему ассемблеру, в котором добавил несколько фич, которых нам не хватало в MICRO1103.

Кончилась память! Правда! Выкинули все, даже операционную систему, все равно не хватило. Пришлось делать своп: подгружали с диска спрайты принца с мечом и стражников.

И вот на этом этапе все потихоньку заглохло. Да... В целом игра готова. Выловить немногочисленные глюки, добавить промежуточные мультики - и все. Не хватило духу. Слишком долго все тянулось. Я думаю, вот если бы не пропавшие те три года!...

Видно, не судьба была. Слишком быстро прогрессировали, да и сейчас прогрессируют персоналки. Я пишу эти строчки на стареньком субноутбуке IBM ThinkPad, а ведь это 133 МГц и 24 Мбайта памяти! А нынешние машины тактируются гигагерцами, имеют оперативную память под гигабайт и винчестеры, подбирающиеся к терабайту. И это не фантастика, а горькая правда.