Три года назад, в конце 2021‑го, на форуме Spectrum Computing шла дискуссия о том, каким должен быть Donkey Kong для Spectrum — лучше, чем уродливая официальная версия от Sentient Software, выпущенная Ocean в 1986 году. Уже были попытки её улучшить, например неофициальный Arcade Edition 2019 года, где несколько пользователей форума World of Spectrum поменяли цвета и частично перерисовали однобитную графику — но в остальном игра осталась той же. Из‑за тех цветов тогда на форуме разгорелась ссора, что показало, насколько некоторые люди это воспринимают всерьёз.
Появилась и новая версия от англичан из Retro‑Sanctuary 2017 года, сделанная в Arcade Game Designer, которая, хоть и чуть более цветная, выглядела немного простовато и деревянно. Далее — многообещающая ассемблерная версия другого англичанина по имени Highrise с одной незаконченной частью и ещё ассемблерная версия испанца по имени Bubu — к сожалению, лишь с половиной интро и началом одной части. Highrise — автор спектрумовских версий автоматных игр, например Asteroids, Pacman, Lunar Rescue или Scramble, а столь же заточенный Bubu развернулся, например, на играх Anteater, Tetris или Botanic. Оба автора к тому же выпускают свои игры на кассетах.
Bubu тогда, в конце 2021‑го, искал кого‑то, кто подготовил бы ему графические части по оригинальной автоматной версии Donkey Kong 1981 года. Сам бы я не додумался создавать эту игру заново, но когда увидел его рисунок обезьяны, показалось, что можно лучше. Я начал для него рисовать картинки, которыми он был в восторге, но поскольку работал сразу над несколькими играми (в то время показывал мне Frogger), Donkey Kong не имел особенно высокого приоритета. А в итоге выяснилось, что и Highrise предпочитает другие проекты. Это, конечно, понимаю — особенно после опыта со своей игрой. Когда Bubu перестал заниматься своей версией, я думал: теперь мои графические творения — насмарку, так хоть покажу их на Spectrum Computing.
Некоторые люди их там оценили, но вскоре после этого Highrise начал показывать улучшенные версии первой части своего Donkey Kong, у которых мне казалось, что их графика постепенно начинает походить на мою. Конечно, каждый автор свою версию постепенно правит, да и мои, и его рисунки были по оригинальной игре — так что никакой проблемы, но всё равно это меня предупредило, что, возможно, стоит быть внимательнее.
В 2022 году мне пришло в голову ещё чуть улучшить картинки, добавить к ним игру — и так сделать свою собственную версию. Ясное дело! Примерно за полгода до этого я наконец начал по‑настоящему учить ассемблер Spectrum и делать пространственную векторную графику, но вдруг почувствовал, что неплохо бы сделать и что‑то похожее на знаменитые спектрумовские игры на растровой графике. Я оставил цветную векторную деревню и пытался понять, как работать с подвижными растровыми картинками. Между прочим, создание векторной системы было проще.
Когда смотрел на предыдущие попытки Donkey Kong на Spectrum, мне не нравилось, что все они выглядели как типичные игры для Spectrum — потому что использовали только однобитную графику на цветном фоне. Это выглядело прозрачно, и обычно там были заметные цветовые коллизии, которые портили особенно первую часть игры с наклонными платформами. Donkey Kong от Ocean пытался решить эту проблему почти горизонтальными платформами — что выглядит довольно любительски. Если я хотел, чтобы игра выглядела как оригинальная автоматная версия, платформы должны были быть правильно наклонными, а подвижные объекты — иметь свои собственные цвета. Единственное, что пришлось опустить в дизайне, — самый верхний короткий этаж каждой части игры, потому что экран оригинальной версии построен по вертикали. К тому же до меня дошёл и Bubu в своих попытках. Поэтому сразу в начале я придумал, как максимально убрать цветовые коллизии в первой части. Не хотел использовать подвижные объекты, окрашенные фоном, ни фон, окрашенный объектами, ни сдвиг по восьми точкам, ни толстые чёрные края для маскировки цветовых проблем. Кроме того, хотел все объекты маскированными (включая карабкающуюся и прыгающую обезьяну), никакой прозрачной гадости, плюс дополнительные специальные точечные и цветовые маски, меняющиеся в каждом кадре, некоторые объекты многоцветные (например, главный герой Mario или прыгающие пружины), некоторые из них заполненные другими цветами (например, бочки на лестницах или прыгающие огни) и некоторые из них с неспектрумовскими цветами (например, оранжевые и сине‑фиолетовые части огней).
Это напомнило мне спор с World of Spectrum — должны ли платформы быть красными или фиолетовыми, — так что я использовал комбинацию обеих. И как минимум 12 подвижных объектов одновременно на экране (некоторые из них выше 16 точек), плюс большая цветная анимированная обезьяна перед фоном и за объектами, плюс горящая бочка перед объектами, плюс бьющий молот, плюс подвижные лестницы и указатели направления движущихся лент, плюс звук через внутренний динамик компьютера — и всё это со скоростью 25 кадров в секунду. И все четыре разные части игры с той же графикой, размером, скоростью и поведением, что и оригинальная автоматная версия — на Spectrum 48K. Да, ужасно глупая идея, но мне этого никто не сказал — так что я это сделал.
Если не считать нескольких своих творений в доисторические времена на Basic, у меня не было никакого опыта создания игр — и потому никакого разумного плана. Точнее говоря, вообще никакого плана, из‑за чего я несколько раз менял почти всё. Иногда случались разные забавные ситуации: например, бочка скатывалась в память с программой и переписывала её, или этот балбес Mario убегал из игры за пределы экрана и ещё умел убить себя падением на число счёта. Одно почти не менял — адски сложную графическую систему, которой не припоминаю из других игр для Spectrum (хотя, конечно, все не знаю), так что не был уверен, имеет ли она вообще смысл, но на удивление, казалось, работает. К сожалению, её нельзя использовать для произвольных игр, потому что она содержит разные рисующие и окрашивающие программы почти для каждого типа объекта, которые к тому же работают по‑разному в зависимости от его горизонтальной позиции, вертикальной позиции, переменной формы, других близких объектов и фона; плюс определённые маски хорошо работают только с определёнными комбинациями цветов. Просто специализированная каша.
Наверное, почти никого не удивит, что у меня была проблема впихнуть эту мегаломанскую продукцию в память Spectrum 48K. Меня как неопытного балбеса это удивило. Если бы у меня было 48 КБ под программу, графику и т.д. — ещё бы пошло, но без видеопамяти и экранного буфера для фона осталось чуть больше 34 КБ. Например, только два кадра анимации карабкающейся обезьяны заняли 1 КБ. Не удивлён, что тогда Bubu написал мне: Highrise планирует сделать свою версию только для Spectrum 128K. Что касается меньших подвижных объектов, позже пришло в голову, что у каждого анимационного рисунка каждого объекта не обязательно иметь собственную маску, или что маски можно автоматически предрассчитывать по формам объектов, или что некоторые версии рисунков можно автоматически получать сдвигом и зеркалированием — но в итоге выяснилось, что из‑за того, как вся система работает, это бы не окупилось.
Когда началась памятьная давка, пришлось, к сожалению, заменить некоторые более быстрые и длинные части программы на более медленные и короткие и использовать куски программы как общие для нескольких частей. Поэтому в нынешней версии иногда игра бежит медленнее, когда на экране максимальное количество подвижных объектов одновременно, — хотя, к счастью, это случается редко. Также нет топающего танца обезьяны в конце игры, таблицы счёта (есть только высший) и демонстрационного режима. Дошёл и до безумств вроде автоматической перезаписи байтов, чтобы в программе возникали другие команды в зависимости от текущей части игры. К тому же пришлось запихнуть вступительное карабканье обезьяны в экранный буфер, который выметается, когда начинается основная часть игры, — так что его можно увидеть только в начале. Думал о каком‑то типе сжатия, но не знал, как это работало бы во время игры, — так что идея полетела в мусор.
Всё могло быть, вероятно, готово уже полгода назад, может больше, но в начале я не умел запрограммировать ничего полезного кроме базовой ерунды, позже старался экономить каждый байт памяти, чтобы добавить как можно больше вещей, в конце придумывал, как сделать так, чтобы игра работала на как можно большем числе типов компьютеров, — и всё это время учил новые ассемблерные трюки. Думаю, опытный программист мог бы это в свободное время закончить минимум год назад. Кроме того, я сделал две длинные паузы для съёмок мафиозного фильма, где из‑за нехватки актёров пришлось играть девять ролей. Во время последней паузы мой друг опасался, что игра никогда не будет закончена — что легко могло случиться.
Все графические части я нарисовал в Art Studio, перевёл их в разные форматы с помощью нескольких собственноручно слепленных программ на Basic, программу игры написал в простом текстовом редакторе Joe и собрал ассемблером Pasmo. Наверняка каждый серьёзный программист использует более продвинутые инструменты, но мне до серьёзного программиста далеко. Не умею пользоваться ассемблерными макросами и другими специальными командами, никогда не учил программирование и не работал в этой области — и наверняка делаю кучу неловких начинающих ошибок.
Между прочим, упомянутую векторную игру в 2021 году я делал ассемблером MRS в эмуляторе Spectrum и сделал довольно много, пока не выяснил, что проще найти ассемблер для PC. При работе в эмуляторе были удивительные проблемы с сохранением файлов: например, в Fuse не работало сохранение из MRS, так что в Linux запускал эмулятор PC с DOS, а в нём старый X128. Пробовал и ассемблер Prometheus, но с ним мне не удалось ничего сохранить ни в одном эмуляторе — да и особо не подошёл.
Компьютером, для которого предназначена игра, я выбрал Spectrum 48K, потому что Donkey Kong мне в начале не казался игрой, которой нужен Spectrum 128K, и мне всегда нравится, когда у игры есть версия для 48K. Когда начинал делать графическую систему, выяснил, что, вероятно, придётся делать её самому — потому что мои графические выдумки в игре не только заранее нарисованы, но частично запрограммированы. Так что если бы один человек готовил графику, а другой — программу, могло бы быть довольно утомительно выяснять, как всё это могло бы работать, особенно при дистанционном общении. Не то чтобы тогда я знал кого‑то, кто хотел бы программировать игру (если не считать упомянутых авторов незаконченных версий), — просто было ясно: что сам навыдумывал, то сам и расхлёбывай.
Когда игра бежит, подвижные объекты рисуются прямо на экран и убираются с помощью экранного буфера, где копия фона. Буфер, к сожалению, занимает 6912 байт, но придумать, как сделать его меньше, не удалось. Во время экспериментов выяснил, что существует метод под названием «double buffer» — ещё один пример того, как до этого я об этом ничего не знал. Когда, однако, попробовал — результат был слишком медленным и занимал слишком много памяти. Но мазня объектов прямо на экран вела к известной проблеме с рисующим лучом экрана. Не знал, как правильно сделать, чтобы объекты не мерцали, так что просто в каждом кадре упорядочивал их сверху вниз, чтобы при рисовании луч их не догнал, а при удалении всё ещё был перед ними. До сих пор не знаю, не ерунда ли это. К тому же это вызвало ещё одну проблему: удаление нужно было делать только в конце кадра, так что во время каждого кадра по числу и типам объектов считается длина паузы, которая потом используется для ожидания, пока объекты начнут удаляться. Это не очень точно и выглядит ещё безумнее — но ничего лучше не придумал.
Игру наверняка можно было бы запрограммировать лучше; не думаю, что я на одном уровне с некоторыми легендарными авторами игр для Spectrum. Не доволен некоторыми частями программы, но рад, что удалось сделать так, чтобы игра выглядела как настоящий спектрумовский Donkey Kong. Между прочим, было довольно трудно изучать поведение автоматной версии, которое не так просто, как кажется на первый взгляд, а куча информации в интернете — неправильная. В любом случае вся эта затея была отличным упражнением, где я, кажется, наконец научился прилично программировать на ассемблере и должен был освоить и такие базовые вещи, как создание звука, — так что временами это было довольно уехавшее развлечение. Генерация звука колебанием динамика как в учебнике физики и использование музыкального камертона для настройки результата имеют своё первобытное очарование. Пробовал также менять цвет звука (широтно‑импульсная модуляция) и громкость во время игры — звучит довольно хорошо, но кажется, что музыка всё‑таки не имеет таких чистых тонов, как, например, в Dynamite Dan, и иногда слышны щелчки в начале или конце звука. Вероятно, не хватает какой‑то программной хитрости, или нужно что‑то сбросить перед началом нового звука — трудно сказать.
Когда работал над интро игры, выяснил, как сделать простой графический эффект с помощью тайминга окрашивания, чтобы каждая точечная строка могла иметь свои цвета. Изначально хотел так подправить большую синюю надпись «DONKEY KONG», чтобы выглядела как в автоматной версии, но в итоге окрасил обезьяну под надписью. Тайминг нужно было сделать дважды — в зависимости от того, мигает надпись или нет. Ничего не считал, а постепенно смотрел, для каких минимальных и максимальных значений на экране выглядит хорошо, — и потом вставил средние значения. Плюс в том, что это могло бы работать и на компьютерах с чуть иной скоростью. Это, собственно, впервые предупредило меня, что стоит проверить, работает ли игра на разных типах Spectrum. Конечно, выяснилось, что эффект окрашивания должен быть по‑разному затаймлен на разных компьютерах, а потом ещё выяснил, что похожим образом для разных компьютеров нужно менять и два других расчёта пауз перед удалением объектов; плюс всё должно быть в режиме 48 Basic — и что этих типов компьютеров довольно много. Вот была радость! Определение типа компьютера тоже было развлечением выше золота. Сначала вообще не знал, как к этому подступиться, потом выяснилось, что универсальной хитрости, вероятно, не существует и что для разных групп компьютеров нужны по‑разному безумные комбинации методов. В итоге удалось сделать так, чтобы игра после старта определяла и автоматически выставляла параметры для английской и шведской версии Spectrum 48K (issue 2, 3), американской версии Spectrum 48K (NTSC), английской, испанской и арабской версии Spectrum +, английской и испанской версии 128K, английской и арабской версии +2 (варианты En, Sp, Fr), английской и арабской версии +2A (варианты ROM 4.0, 4.1, En, Sp), +2B, +2E, +3 (варианты ROM 4.0, 4.1, En, Sp), +3E, Timex TC 2048 (PAL), Delta, Pentagon (несколько версий с разной памятью, варианты En, Sp), Scorpion и Turbo +, Didaktik M и Kompakt, бразильских и аргентинских версий TK90X и TK95, Inves Spectrum +, Harlequin, Leningrad, Vesta IK‑30, Orel BK‑08, HC‑91, BK‑001, Dubna, Profi, KAY, ATM Turbo и 2+, Spectrum Next и даже Sam Coupé (один человек со Spectrum Computing помог создать дисковый загрузчик с правкой системного прерывания). Работает — только Inves Spectrum +, к сожалению, делает странные каракули в экранный буфер.
Из компьютеров, которые хотел добавить в список, мне ещё не хватает Didaktik Gama, DB Spectrum +, Elwro 800, Sprinter, Alf, Foton‑IK03, американской версии Timex TC 2048 (NTSC), Czerweny CZ 2000, CZ Spectrum и Plus, Baltik, Hobbit, Samsung SPC‑650, Spectral и HT 3080C. Пока не удалось либо найти их эмуляторы, либо определить их, либо проверить, что у них те же свойства, что у какого‑то другого компьютера из списка.
В конце мне было интересно, как вся программа поведёт себя в эмуляторах разных эпох. Мог использовать Linux и DOS, так что тестовую программу последовательно прогнал через новые и старые эмуляторы Fuse, RealSpectrum, Retro Virtual Machine, ZEsarUX, SpecIde, Unreal Speccy, R80, Speccy, X128, Finspe, Z80, Warajevo, Z80Stealth, ZXSpectr, JPP, Spectrum, CSpect, SimCoupe и ещё Es.pectrum и SpecEmu через среду Wine.
Как и ожидалось, чем глубже я погружался в прошлое, тем психоделичнее выглядела цветная обезьяна — а у самых старых так, к сожалению, начинала выглядеть вся игра. Это напомнило, что во время поиска информации о клонах Spectrum я читал: в бывшем СССР некоторые из них люди собирали сами дома, и из‑за разных комплектующих возникло столько типов тайминга, что не сосчитал бы даже Ленин. Поэтому в программе поправил две вещи.
Измеренная скорость компьютера сравнивается не только с одним значением, а с большим диапазоном значений. Как выяснилось, хорошо сделал — потому что скорость некоторых компьютеров минимум в эмуляции иногда очень слегка менялась или была разной между разными эмуляторами. А когда компьютер не соответствует ни одному типу, который программа определяет, и одновременно его скорость заметно ниже или выше Spectrum 48K, игра настраивается так, чтобы хотя бы не мерцали подвижные объекты и можно было играть даже на компьютерах из помойки и средневековых эмуляторах. Потом ещё добавил ожидание любой нажатой клавиши после загрузки игры в компьютер — на случай, если кто‑то сохранит образ памяти уже после выполненного определения типа компьютера, так что этот образ потом плохо работал бы на чём угодно, кроме типа, на котором сохранил.
Возможно, некоторые предыдущие трудности связаны с моей проблемой обучения ассемблеру. Когда в 2021 году хотел пробовать что‑то по‑настоящему ассемблерное, не нашёл ни одной книги, из которой реально мог бы учиться, и не умел даже понимать чужие программы (до сих пор мне это особо не даётся).
Единственное, что в начале было полезно, — древний Complete Machine Code Tutor прямо на Spectrum: он, правда, содержит только базовые вещи, но всё равно считаю его одной из лучших учебных пособий и до сих пор иногда запускаю.
Что касается книг по ассемблеру — тогда сложилось впечатление, что некоторые написаны не для начинающих, некоторые — для своих собственных авторов, а некоторые — для школьной математики. Наверняка среди них есть и очень хорошие — просто для меня не работали. И не нашёл ни одной книги с простой и понятной информацией о связи видеопамяти и рисующего луча экрана или о медленной и быстрой части памяти. Знаю, что в некоторых книгах это есть, но объяснения особо не понимал. К счастью, мог найти какую‑то информацию в интернете, но, вероятно, придумал кучу трюков, которые давно уже были придуманы.
Изначально думал предложить игру кому‑то из нынешних спектрумовских издателей — потому что раз уж так над ней намучился, хотел бы видеть её в кассетном издании. Проблема в том, что оригинальная автоматная версия — от фирмы Nintendo, которая до сих пор аллергична на эмуляции и версии своих игр, которые сама не издала или на которые не продала лицензию. Хотя ясно, что в мире Spectrum давно уже не про деньги, у некоторых компаний никогда не знаешь.
Когда закончил Donkey Kong, начал искать людей, которые протестировали бы его на настоящих компьютерах, — что оказалось удивительно большой проблемой. Во время разработки пришлось полагаться на эмуляторы, и интересовало, будет ли всё правильно работать и без них. Связался и с испанцем Bubu, который был в восторге от игры и к тому же раньше думал, что я давно уже забил. Кроме того что всё протестировал на нескольких своих компьютерах, сам предложил готовить и продавать кассеты. Мне это понравилось. Если Nintendo пришлёт своих чистильщиков — снесут не меня. Bubu, правда, начал выдумывать вещи вроде того, что игра должна стартовать последовательностью клавиш «5» и «1», где первая имитирует бросок монеты в автомат, потому что так у него в его играх, — но поскольку в памяти Spectrum осталось лишь несколько свободных байтов, пришлось смириться с тем, что в игре останется скучный старт клавишей ENTER.
Bubu купил 50 пустых кассет, нарисовал и заказал печать их обложек и постепенно записывает на них игру. Это должно быть довольно нудно — особенно когда, вероятно, почти ничего на этом не заработает, но кто ещё, кроме энтузиаста, сегодня стал бы такое делать. По нашей договорённости у него есть версия, на вступительной картинке которой кроме моего имени автора есть и его имя издателя, а с оригинальной версией без его имени я могу делать что хочу.
Некоторые люди, правда, имели оригинальную версию уже на несколько недель раньше, но только после объявления на Spectrum Computing о существовании версии для Bubu там разгорелся приличный шум, и пользователи форума были ошеломлены тем, что игра действительно так выглядит на Spectrum. К сожалению, выяснилось и то, что желание увидеть свою игру изданной на кассете привело к тому, что сначала половина сообщений в интернете воспринимала Bubu как автора игры, а в некоторых из них моего имени не было вовсе. Это была неудача — особенно когда комментарии некоторых энтузиастов называли автора гением. Позже стало чуть лучше, но, наверное, стоило этого ждать: похожим образом, например, большинство людей, вероятно, не знает, что версии от Nintendo или Ocean программировали не люди из этих фирм. Поскольку игру ещё улучшаю, сказал себе: какое‑то время не буду портить Bubu бизнес, а потом опубликую новую версию бесплатно. Всё равно ту оригинальную уже некоторые люди имеют, и со временем она бы распространилась — так пусть распространяется скорее новая. В любом случае предполагаю, что кассеты в обновлённой версии по‑прежнему будут доступны у Bubu.
Вообще‑то я никогда не собирался делать игры точно по другим играм — так что это исключение. Не хотел, чтобы моя готовая графика и идеи кончили в мусоре; далее интересовало решение проблем с коллизиями цветов; и за 40 лет так и не было приличной версии Donkey Kong для Spectrum. Хотя я никогда не был фанатом этой игры и даже думаю, что в прошлом веке никогда в неё не играл, — когда увидел официальную версию для Spectrum от Ocean и читал о ней вещи вроде «использует компьютер на максимум» и «на Spectrum это всегда будет выглядеть ужасно», показалось это ерундой. Так что никаких дальнейших версий автоматных игр не планирую — лучше бы создавал что‑то оригинальное. Ещё пришло в голову, что мог бы сварганить Donkey Kong для Spectrum 128K, куда влезли бы и мелочи, которые пришлось перенести или опустить, и к тому же, возможно, избавился бы от этой безумной системы рисования и стирания объектов. В любом случае, вероятно, через какое‑то время вернусь в свою векторную деревню.
Lukáš Rachůnek (Artonapilos)
Share your thoughts about the article