Глава 3.5

(иллюстрация от переводчика, источник: ZX-Art)


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

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

Это немного похоже на перечитывании книги снова и снова в течении полугода, когда вы наконец добираетесь до последней страницы, чтобы вернуться назад к первой. И еще раз. И еще раз (тут нет опечатки). Я думаю, что большинство кодеров сталкиваются с этим раз за разом, я даже знаю несколько проектов, которые так и не увидели свет, потому что программист "потух", выключив свет за собой. То, что изначально воспринималось как достижение, превращается в длительную изнуряющую работу. Когда вы придумали что-то, или прочитали что-то, или вам в голову пришла неожиданная идея, возбудившая вас. Все, что вы хотите — это приступить к работе СЕЙЧАС… только у вас есть уже эта «долбанная» программа, над которой вы работаете, отдавая ей все свое время, та, что требует еще два или три месяца работы, и из-за этой работы, которую нужно завершить, ваша восхитительная новая идея будет не реализована. Я сам сталкивался с этим несколько раз, например, мой проект Quill'ed Colossal Cave из 1986 года, который мне до сих пор нужно закончить, я вернусь к нему через один день… может быть.

К счастью для меня (!) я застрял в офисе Фархема, дом был в сотнях миль отсюда и, как я отмечал ранее, тут больше нечем было заняться. Сейчас же у меня был стимул уйти отсюда вместе с PC и набором для разработки, если я просто все сделаю, ведь в игре уже не осталось того, что потребовало бы значительной работы, как, например, Большой Корабль в третьем уровне или Икринки в четвертом уровне. Но еще требовалось закодировать всех чужих, появляющихся на последних трех уровнях (более двухсот только в одном седьмом уровне), с которыми мне не хотелось "повозиться", но которых нужно было сделать.

* * *

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

Все становится немного смешным на половине пути седьмого уровня


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

Во время этой последовательности происходило так много движения, что Спектрум выдыхался: время, необходимое для формирования кадра падало с 5/50 секунды до 7/50 и даже до 8/50. Я шутил с Дэйвом и Карлом, что в определенных точках моя игра больше не работала в кадрах в секунду, а в секундах на кадр, немного преувеличено, но мне так казалось.

Ранее я отмечал тот факт, что графика в игре была сжата для сохранения пространства. Для версии Спектрума это было необходимо, так как было доступно лишь 15К данных на каждый уровень игры и было просто невозможно уместить все графические элементы аркадной версии в такое маленькое количество памяти. На Спектруме меньшие размеры спрайтов и их более низкое разрешение, что безусловно помогло, но нужно было что-то еще, тогда Марк уменьшил число спрайтов в анимационном цикле: несколько последовательностей спрайтов было составлено как движение «туда-сюда» или циклическое движение по дуге (щетки на стекле авто) — голый минимум.

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

Если вы можете представить себе стрелку, указывающую влево, и вы поставите зеркало рядом с ней, то тогда стрелка в отражении будет указывать направо — это точно такая же стрелка, просто визуально перевернутая вдоль вертикальной оси зеркала. Это в программе вы можете сделать довольно легко: взять спрайт и рисовать точки справа налево вместо нормального слева направо, что дает отраженную версию оригинального спрайта: эффект, дающий вам что-то даром. Но на этом дело не заканчивается: вы можете отразить по горизонтальной оси вместо вертикальной, что дает вам спрайт вверх тормашками или перевернутый. Затем вы можете комбинировать двумя методами, чтобы получать отраженные и перевернутые спрайты: вы просто берете оригинальный спрайт и манипулируете данными, из которых он состоит, для создания новых ориентаций — быстро и легко.

Так что теперь вам не надо восемь кадров анимации для самонаводящейся ракеты, вам нужно только три: так программно влево становится вправо, верх становится вниз, вверх/влево становится вверх/вправо, вниз/влево — вниз/вправо, сохраняя около 60 процентов. Конечно, есть другие способы, используемые на версии Спектрума для сохранения места: более большие спрайты, например, часто имеют общие "обездвиженные" элементы, что означает, что вы можете сохранить эту часть как первый спрайт, а затем добавлять движущиеся элементы к нему как раздельные спрайты. Именно так на шестом уровне закодированы Поршни. Так как только конец спрайтов двигался, то не было необходимости иметь большую статическую часть каждого спрайта последовательности, забирая память, поэтому эта часть хранилась как отдельный спрайт, а движущиеся части добавлялись к нему по необходимости.

Для R-Type компрессия была не выбор, а единственным способом, в чем я везде мог убедиться, и хотел использовать это в игре, там, где это возможно, но есть и обратная сторона этого подхода, компрессия нуждалась в декомпрессии, а это занимало время. Процедуры переворачивания и отражения спрайта, так же как распаковка самих данных спрайта, все занимает больше времени выполнения, чем подпрограмма обычного спрайта, переданного без сжатия данных и это может иметь большой эффект в игре. Мне повезло с R-Type, или я должен высказать мое отношение к этому, так как я пошел необычным путем, то "как быстро шла игра" не было моей основной целью, я просто хотел перенести как можно больше с аркадной версии сюда, насколько это было возможным.

Если вы пробежитесь со мной по ранним частям, где я пытался охватить технические аспекты всей игры, тогда вы поймете, как важно убедиться, что каждый игровой кадр работает так быстро, как это только возможно, особенно в игре типа интенсивной графической аркады. Было время почти навязчивого поиска программистами Спектрума, приводящего к работе игры со скоростью 50 кадров в секунду, тогда они могли похвастаться "очень сглаженной графикой" и показать какими умными они были, но, когда вы кодируете по крупицам, отслеживая последнюю инструкцию или время цикла и временные интервалы до микросекунд, вы рискуете с большим опасением потерять синхронизацию, что в конечном счете может уничтожить вашу игру. Благодаря этому быстрые, шелковисто гладко выполняющиеся игры обычно состоят из горстки маленьких спрайтов и экрана, который не прокручивается: достаточно легко реализовать для оригинальной игры, но полностью не подходящий при конверсии с игрового автомата, где экран перемещается.

Очень часто приходится делать выбор между "что вы хотите видеть на экране" и "что вам сойдет с рук". Да, у вас могут быть сотни спрайтов на дисплее, отображаемые в каждом кадре, но вы можете пойти приготовить себе чашечку чая, в то время как они будут перемещаться с одного края экрана к другому. Решение? Уменьшение количества спрайтов. Легко. Это не то, что вы хотели, но теперь это работает. Если вы не осторожный, вы можете позволить себе гонку за идеалом попробовав что-то еще… экраны и спрайты становятся меньше и это занимает меньше времени, чтобы вывести их, цвет брошен в пользу монохромности, дерганье фона или прокрутка рывком на восемь пикселей дает иллюзию движения. Я мог откусить пару символов на краю моего экрана дисплея, сделав его более квадратным, что сохранило бы некоторое время, или я мог бы вывести половину появляющихся чужих, давая игроку слегка почувствовать вкус игры, меньше, чем от целой. Или прокрутить экран по символьным блокам. Или сделать игру полностью монохромной. Или уменьшить размер и количество оружия игрока. Я не буду продолжать, вы поняли идею. Все, что я осознавал: я хочу взять как можно большую часть оригинальной игры, которую я мог бы перенести в Спектрум, а если это означало замедление до ползанья, когда экран занят, то пусть будет так.

* * *

Когда кодирование седьмого уровня подошло к концу, я вернулся назад и посмотрел на четвертый уровень. Обычно, когда я завершаю уровень я оставляю его нетронутым, но мне нужно было переиспользовать некоторые шаблоны движений спрайтов, которые были в этом уровне. Сразу обнаружилось, что там, очевидно, было что-то неправильно. Слои икринок перемещали по экрану брошенные икринки, и они прокручивались как часть экрана, но… если вы стреляете в них или просто ничего не делаете, но что-то приводит к их разрушению, то они все равно остаются здесь, не удаляясь с экрана. Сначала я подумал, что это было из-за того, что я изменил свой основной код, что-то делал в подпрограммах обнаружения столкновения или логики оружия, но чем больше я проверял, тем больше удостоверялся, что все хорошо работает. Мой следующий шаг был проверкой кода, который отвечал за удаления икринок, но он тоже работал правильно — теперь просто не осталось вариантов, где это искать!

Код, обрабатывающий удаление рыбных икринок, вся тщательно проработанная система предварительно сдвинутых пар символов исчезла и что было еще хуже, не сохранилось ни одной резервной копии. В то время я запускал ежедневную процедуру создания резервной копии Дед/Отец/Сын с аналогичной еженедельной, которая сохранялась отдельно: из практики моей работы на больших ЭВМ. К сожалению, я ограничил количество недельных резервных копий до двух или трех, представляющих реальную ценность: кому нужно после трех недель восстанавливать данные? Каким-то неизвестным мне образом код удаления икринок был потерян и нигде не появлялся в последних копиях, а единственная резервная копия, где он мог быть, был перезаписан несколькими днями ранее.

Я прервал кодирование седьмого уровня и вернулся к четвертому уровню. Я знал, что я хочу и помнил основную идею, как это сделать, но код, который дался мне так легко первый раз теперь, кажется, не хотел работать. Вот совет, который не преподают в Университетах по созданию игр: не пишите код в плохом расположении духа, состоянии, в котором я пытался работать, натыкаясь на "что здесь вообще происходит", "почему уже созданный и на первый взгляд простой блок кода я не сохранил в резервной копии". Я не говорю о килобайтах программного кода, просматривая сейчас исходный код, обнаруживаю, что все это работает на около ста строчках кода, но по каким-то причинам я не смог восстановить это. Исправленная часть кода в конечном счете была добавлена в игру и работала в большей степени правильно, но не так четко и гладко, как в оригинале, а анализ столкновения немного барахлит здесь и здесь. Большинство людей не замечают этого, а я замечаю.

* * *

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

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

Пока Activision не занималась бизнесом поставки графики, у них было что-то вроде звукового отдела, состоявшего из большой причудливой клавиатуры на столе, которая, я предполагаю, использовалась для производства звука и музыки к играм, но вывод ноты не то же самое, что написание драйвера для восьмибитной машины, с прерываниями в нем — это довольно специализируемый и сложный вид компьютерного искусства. В итоге результат оставался тем же: Activision не поставляла звуки и музыку, а так как Catalyst не имела денег, чтобы заплатить кому-то за эту работу, то все шло к тому, что R-Type станет самой тихой игрой в округе. Все трое из нас пытались выяснить, что нам делать, а так как все шло к тому, что я первый завершу игру, я был тем, кто больше всех нуждался в ответе. Лучшее, что я мог придумать, это использовать мои звуковые подпрограммы из Rampage и как-то сделать их многоканальными, но как все это смешать, чтобы сделать звук узнаваемым для R-Type, я был без понятия. К счастью, ответ был ближе, чем думал любой из нас.

Как так случилось, что Роб Хайлендс согласился написать управляемый прерыванием многоканальный звуковой драйвер для игры, также как и снабдить всеми необходимыми звуками и музыкой — одно из утраченных воспоминаний, но я полагаю, ему было просто интересно этим заняться. Я даже не был осведомлен, что Роб знал, как кодировать на Z80 (и зная Роба, он, вероятно, не знал… без сомнения он читал какую-то книгу или что-то в этом роде и узнавал все по ходу дела), но если он сказал, что может сделать это, то я верил ему. Что касается компенсации, то он конечно не собирался получить денег от Catalyst или Activision. Я точно не предлагал заплатить ему что угодно за это, но я пообещал найти способ достать £200, которые он просил, даже если это означало, что ему придется продержаться несколько месяцев или около того.

Роб и я разобрались, сколько памяти у него было на все, какие звуковые эффекты были нужны, какие короткие звуки и мелодии мы могли поместить туда. Поскольку Роб обещал трехканальную звуковую подпрограмму, управляемую по прерыванию, то была возможность встроить музыку прямо в игровой процесс, но для этого требовался бы большой объем данных, который не собирался влезать в то маленькое пространство ОЗУ, оставшееся у меня: эту затею забросили. В итоге дело дошло до более тридцати различных звуковых эффектов, начиная от короткого щелчка пули при выстреле, до самого длинного фрагмента музыки в игре: мелодии, которая звучала при успешном прохождения последнего уровня. Мы пытались придерживаться как можно ближе к оригинальным аркадным звукам, из выбранных мною, которые Роб мог экспортировать из машины. Мы прибегли к небольшой хитрости: небольшой постоянно повторяющийся звуковой эффект, такой как огонь оружия и взрывы были сокращены, так как они были слышны одновременно в ужасно большом количестве, постоянно звуча, а мелодия из колокольчиков, означающая конец прохождения уровня, смогла быть более расширенной и немного мелодичней.

В наши дни, когда игры могут похвастаться звуковыми дорожками в формате DTS и оркестровым качеством музыки и звуковых эффектов, просто трудно себе представить, каким простым был тогда игровой звук. Хотя такие машины, как Commodore 64 поставлялись с SID (Интерфейс звукового устройства), со встроенным программируемым звуковым генератором, пользователи Спектрума могли работать с выходом одноканального звука, который программировался командой BEEP. Что еще ухудшало ситуацию: когда Спектрум попискивал вам, вы не могли запустить другой код, на выбор или звук, или движение, а если бы вы хотели придать иллюзию всего происходящего сразу, вы должны были бы сделать довольно сложный и критический ко времени код. То, что Робу удалось достичь за несколько недель, у кодеров заняло бы месяцы и месяцы на создание и совершенствование, что только подтверждает его способности, хотя это может звучать, как преувеличение. Я просто не могу оценить тот вклад, его значимость в добавление этого жизненно важного ингредиента к завершенной игре.

Исходный код Z80 для прокрутки экрана, который составляет "сердце" игры, все именно так это выглядело в то время. Программисты обычно комментируют свой код, упрощая его понимание, но ассемблер PDS мог обрабатывать только исходные файлы до определенного размера, поэтому чем больше вы комментируете свою работу, тем меньше остается места для игрового кода.

* * *

Роб взял на себя всю работу по производству звука, что означало сброс большого груза с моих плеч, и теперь у меня было ясное представление о том, сколько памяти было доступно для укомплектования игрового кода, ответ: не так много. Завершение седьмого уровня стало намного проще сейчас, но был еще один тормоз, нахождение достаточного объема памяти: прохождение снова и снова по существующим процедурам, оптимизация и сокращение их снова и снова, так что если R-Type кажется "отполированной" (слово, используемое несколькими рецензентами позже) то в этом нет ничего такого, что сделало бы игру выдающейся, это скорее был побочный продукт с целью уместиться в "долбанных" 42 KB памяти! Некоторые подпрограммы становились откровенно дурацкими, самомодифицирующийся код становился все больше и больше нечитаемым, а стек использовался как быстрый и неопрятный способ зацикливания, сохранение байтов и регистров. Если для вас все это пустой звук, тогда не волнуйтесь, но если вам это знакомо, тогда вы поймете, что отладка и поиск ошибок становилась намного сложнее. Я думаю, единственной причиной, по которой я мог отслеживать все это было то, что я никогда не покидал компьютер достаточно надолго, чтобы забыть это!

Пока я заканчивал седьмой уровень, Сол попросил меня собрать демоверсию игры, на которой можно было бы поиграть в первый уровень. Версия предназначалась для кассеты: бесплатному приложению к журналу. Она располагалась на обложке под пластиковой крышкой. Мне удалось договориться с ним об оплате в размере £50 за создание демонстрации, что заняло у меня несколько часов времени: нужно было просто взять код с ленты и убедиться, что ничего не упущено и это может превратиться в последствии в полную версию игры. Несчастная судьба, постигшая некоторых другие демоверсии игр.

Я бы мог собрать демоверсию сразу, но я хотел подождать, пока я не подойду к завершению работы над всей игрой, чтобы она была как можно ближе к финальному варианту. Это не было таким незначительным, как может показаться, позднее один журнальный обзор иллюстрировался снимками из первого уровня, которые показывали оригинальную графику, используемую для капсул Улучшения, которую я выбросил, заменив на что-то другое за несколько месяцев перед этим, поэтому я не знал, в какую версию они будут играть. Кроме того, был хороший шанс, чтобы увеличить место для игрового кода. Мне пришлось бы изменить или удалить кое-что из написанного. Все выглядело бы не слишком хорошо, если бы люди, купившие игру под впечатлением демонстрации, заметили различие с готовым продуктом!

Демонстрационная кассета с игрой увидела свет в ноябре 1988 года в выпуске 92 журнала Computer & Video Games, а демонстрация версии для C64 была записана на другой стороне кассеты. Журнал также опубликовал полный обзор игры для версий Спектрума и ST, но не на версию C64 о которой они сообщили читателям "следите". Во время написания обзора версия ST все еще находилась в процессе разработки, что делает опубликованный "обзор" очень подозрительным.

Activision на самом деле не побежит раздавать мне бесплатную копию бесплатной программы, мне пришлось купить журнал и сорвать обложку самому.


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

Сложности возникают, когда спрайты начинают накладываться или когда один находящийся на верху экрана летит вниз к нижней точке: вам придется применить сортировку по значению координаты Y и придумать всевозможные способы уменьшения необходимого процессорного времени. Это также означает, что, если вы хотите больше, чем шестнадцать или двадцать четыре спрайта на экран, тогда вы должны начать менять способ игры, что не так уж сложно для простой одноэкранной игры, как Pacman, но для R-Type все превращается в ночной кошмар. Не помогло то, что моя версия использовалась Activision, как палка для битья Дейва с таким аргументом: если уж Спектрум версия делает это программными способами, тогда с аппаратными расширениями C64 должен делать это как минимум так же, а то и превосходить его. На что был нацелен Дейв, так это на создание подпрограммы "все в одной", когда вы устанавливаете спрайты какие хотите и где хотите, а переключатель сам позаботится о них всех за вас, но каждый раз, когда он думал, что он все отсортировал, что-то появлялось вновь и все портило. Если я был преуспевающим благодаря тому, что был слишком неопытен, чтобы осознать, что я хочу сделать слишком много, то Дейв, к своему несчастью, продолжал биться головой в кирпичную стену аппаратного обеспечения, которая предлагала сделать все за вас, до тех пока вы делали точно то, что не выходило за рамки документации!

* * *

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

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

Перебирая другие спрайты чужих, я заставлял их обычно делать то, что они предположительно должны были, затем я мог пропустить что-то, однако на этом уровне все должно было быть на своем месте, я даже не мог продвинуться, используя заново шаблон спрайтового перемещения, так как движения каждого чужого сильно различались. Тут есть небольшая путаница, что должно происходить в конце шестого уровня: он не имеет финального Босса, как на других уровнях, там просто происходит качание Поршней некоторое время, но некоторые люди настаивали, что им в самом деле получалось найти этого финального Босса. Все это тянется от версии для PC Engine\TurboGrafx-16, где после взрыва нескольких этих поршней экран начинает прокручиваться снова, представляя большого чужого, который охватывает обшивку и случайно раскалывается пополам, стреляя огненными шарами. Я предполагаю, что кто-то где-то решил, что финал уровня оригинальной аркадной версии не был достаточно захватывающим или не был симметричным с остальной частью игры, но этого нет в оригинале, поэтому мы не добавляли это в наши версии.

* * *

Пока я складывал шестой уровень, Роб закончил работу над звуком и музыкой. Ему потребовалось всего лишь пару недель, чтобы закодировать трехканальную звуковую систему для бесспорно монофонического Спектрума: удивительный подвиг, совершенный как создание всей музыки и звуковых эффектов, как мы и договаривались. Я особенно волновался услышать звук большого Кругового Лазера при стрельбе, так как думал, что немного переборщил, описывая его Робу: "Я хочу, чтобы это звучало, как при расколе вселенной пополам, кричащей от боли!", хотя и это не вполне соответствует моим истерическим требованиям. Остальное было в километрах и километрах дальше от моих "попискиваний" с паузами, которые я придумал для Rampage. Вставить кода Роба, который он назвал БИНАСКАН в мой код было довольно просто, его полные и совершенные инструкции были…

Убедитесь, что байты шаблона звуковой волны не пересекают границу страницы. Также убедитесь в наличии двух свободных байтов в начале ORG OPCODE (для использования в программном перенаправленном стеке).

LD HL, A*256+B+C ГДЕ

A = НОМЕР ЗВУКА.

B = ЦЕЛАЯ/ПОЛОВИННАЯ ИЛИ ЧЕТВЕРТНАЯ НОТА.

C = НОМЕР КАНАЛА.

ЗАТЕМ ВЫЗОВИТЕ BEEP

… и это были они.

Код Роба плавно проскользнул в мой, без свободных промежутков или поврежденных регистров, Роб правильно обо всем позаботился и когда я настроил все подпрограммы и опробовал, то все работало красиво. У нас была одна проблема в самом начале, когда некоторые звуковые эффекты звучали одинаково независимо от того, какое значение "B" мы устанавливали в параметре, но Роб вскоре исправил это, и с тех пор все работало отлично. У меня возникла идея, как Робу получить его деньги, но так как это предполагало солгать Activision, я захотел пока придержать все в себе, кроме того, этот шанс смог сработать, когда игра будет завершена. ЕСЛИ игра будет завершена, я должен буду сказать, что пока Роб и я кодировали игру, Уэйнрайт должен придумать окончательный план, как восстановить контроль над тем, что мы считали его игровым кодом и сбить немного денег с Activision в процессе. К сожалению, у него был недостаток: я бы попал в суд, если бы не подыгрывал.

* * *

На протяжении большей части кодирования и до сих пор я отправлял все новые сборки игры непосредственно в Activision, так как Catalyst, похоже, нисколько не интересовалась моем результатом, но все больше и больше демонстраций появлялось в журналах и Activision оставалась довольной моими поставками и Уэйнрайт, наконец, начал обращать внимание. И он пришел с идеей. Его план был прост: после того, как я закончу игру, то я доставлю весь код ему, а не Activision, таким образом он мог обратиться к ним, чтобы выручить больше денег, используя код как главный козырь. Ох, и если я этого не сделаю, то он сказал, что подаст на меня в суд!

Пока я "переваривал" эту угрозу, всего через несколько дней мне кто-то позвонил из Activision, с предложением поговорить со мной об игре. После обычного небольшого разговора, он хотел знать, когда игра будет завершена и, как бы между делом, когда я доставлю ее им? Я допускал, что Уэйнрайт проводит небольшой тест на проверку его "большой идеи", отсюда и телефонный звонок, потому я "объяснил", что как только игра будет закончена, я доставлю ее в Catalyst (поскольку я считаю, что работаю на Catalyst), после чего все усложнилось. Мне недвусмысленно сказали, что когда игра будет закончена, я должен был доставить ее напрямую в Activision, а не Уэйнрайту, а если я этого не сделаю, то Activision подаст на меня в суд!

Я оказался в "интересном" положении. Если бы я доставил готовую игру Уэйнрайту, тогда Activision подала бы на меня в суд, но, если бы я доставил готовую игру в Activision, тогда Уэйнрайт подал бы на меня в суд. Теперь я немного старше, если не мудрее, я понимаю, что все было не так страшно, как я думал в то время. Юридически Activision не могла придраться ко мне, так как я работал на Catalyst, а не на них, и большее, что они могли сделать, если бы я отдал код Уэйнрайту, подать в суд на него за это. Юридического соглашения между мной и Activision не было, так что я могу нарушить? Но вопрос был один: действительно ли я тогда работал в Catalyst?

У меня не было письменного контракта на производство R-Type, а если бы он и был, то, конечно, уже был бы нарушен, когда они мне не заплатили. Единственное, что можно было сказать, что было устное соглашение, и я принимал деньги от них несколько месяцев для производства игры. Также Уэйнрайт мог бы использовать документ, который я придумал, когда мы договорились об оплате оборудованием PC и PDS вместо наличной оплаты, чтобы показать, что это он на самом деле получил право на законченный код.

Но есть интересный момент, который никто из нас не учел в то время, и это было с тех пор, как у меня не было письменного договора с Catalyst или Activision и Уэйнрайт подписал документ о том, что он отдает мне оборудование для разработки, когда я закончу игру. Тогда можно было утверждать, что пока я этого не сделал, я был законным владельцем кода и мог делать с ним все, что я хотел! К сожалению, возвращаясь в август 1988 года, я даже не мог остановиться на каком-то варианте, рассматривая любой из возможных законных способов выхода из ситуации, в которой я был. Все, что я знал, что какой бы выбор я ни сделал, на меня подали бы в суд, так что мне пришлось придумать третий альтернативный план. Мне нужен был совет эксперта, того, кто знал все входы и выходы бизнеса программного обеспечения, и кто будет на моей стороне, поэтому я позвонил Жаки Лайонс из Marjacq и спросил у нее, что я должен делать.

Я сказал Жаки, что очень хочу отдать код в Activision, поскольку я больше не буду работать на Уэйнрайта и что Activision, вероятно, предложит мне еще работу, если я буду у них на хорошем счету. Я также сказал, что если Уэйнрайт получит код и каким-то способом вытащит деньги из Activision, то он, вероятно, будет настаивать на выплате мне и просьбе о возвращении PC и PDS обратно, которые мне понадобятся, когда я уйду от него. Хотя для меня это было в новинку, я предположил, что Жаки слышала это уже много раз до этого и это для нее не было большим сюрпризом, так что ее предложение было простое и прямолинейное: когда я закончу игру, я должен отдать все ей и сказать Activision и Уэйнрайту, что они могут бороться между собой, если хотят, а меня пусть оставят в стороне. Это был тот ответ, который я хотел услышать, тем более, что она оценила Activision намного выше, чем Catalyst Coders!

Я решил, что не скажу Уэйнрайту и Activision, что́ собираюсь делать в дальнейшем, пусть каждый думает, что именно он получит код и, надеюсь, они будут держаться подальше от меня, пока игра не будет завершена, но к тому времени будет уже слишком поздно с их стороны что-то предпринять. Зная связи Жаки с Activision в то время, я подозреваю, что она все-таки ввела их в курс дела, но это означало одно: теперь я мог работать над игрой в полной тишине и покое.

* * *

Все начинало играть против меня: долгие ночи, беспокойство о финальной передаче игры, спор вокруг денег и оборудования, нахождение вдали от дома и мысль, что шестой уровень все еще не закончен, но все это придало решимости закончить эту проклятую игру и убраться из Фархема как можно быстрее. У нас был элементарный распорядок разработки, я дал его Нику и пытался его придерживаться, и если заметки на задней части руководства по Z80 были правильны, то разработка игры должна была завершиться 9 августа, что определенно шло по плану! На самом деле шестой уровень еще нужно было закончить: некоторые подпрограммы, отложенные мною на несколько недель, потому что они были трудными для написания и тестирования. Восьмой уровень будет сделан, а сообщение после прохождения игры будет включено.

Одна из тех подпрограмм, с которыми были большие хлопоты — это управление Самонаводящимися Ракетами, часть системы вооружения, которая при запуске выбирала цель на конкретном чужом, отслеживала его и следовала за ним везде до попадания. Я пытался, и работа происходила по разным вариантам, чтобы сделать все правильно, но я сдался и пошел простым приближением, так как не имел достаточно свободной памяти, чтобы сделать это правильно, не имел достаточно свободного пространства на экране, чтобы сделать это прилично, и так намучился с этим, что не мог уже так беспокоиться и тратить на это свое время.

Я думаю, у большинства кодеров наступает момент, когда "работающий код" берет верх над "код работает как нужно": вы сталкиваетесь с ситуацией, когда вынуждены тратить дни на какую-то сложную подпрограмму или взламываете чей-то код, кажущийся одинаковым, но который можно записать потом за несколько часов. Иногда даже проще забросить это вообще: шаг, похожий на клише режиссера, который ищет себя неделю, чтобы только дотронуться до сценария, поплакаться над десятком страниц и объявить, что теперь все будет по плану!

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

Я потратил несколько дней, перепрыгивая с завершения шестого уровня к вставкам последних фрагментов кода. Последним крупным блоком для установки игры была система загрузки с ленты. Поскольку игра должна была быть мультизагрузочной с кассеты, мне нужно было иметь собственные встроенные подпрограммы загрузки. Это было не так, как если бы я мог выйти в Basic и быстро выполнить LOAD "" CODE. Большинство кодеров выгодно использовали существующие подпрограммы загрузки с ленты, к которым можно получить доступ через ПЗУ Спектрума, но данный поход подразумевал медленную скорость передачи данных и относительно небезопасную систему.

До R-Type я возился с этими подпрограммами: копирование их из ПЗУ, возня с некоторыми временными значениями для увеличения скорости передачи и, как побочный продукт, изменение цвета обычных сине-желтых полос загрузки на что-то другое. В этом не было ничего особенного, это был быстрый и простой способ придумать специальные процедуры Загрузки\Сохранения и многие кодеры делали именно так, быстрая скорость загрузки и нестандартный шаблон загрузки немного защищали игру от случайного пиратства. Если вы знаете нужных людей, то вы можете купить обслуживающий код для работы с лентой, который предлагает отличную стабильность и секретность по сравнению с версией "наследником" ПЗУ, но у меня уже был код, который я собирался использовать и все готово к подключению его к игре: написаны некоторые подпрограммы для управления всем и, кажется, это работает просто прекрасно.

Осталось пройти только один уровень и все будет завершено.

* * *

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

Я почти все сделал. Я вложил шестнадцать хороших часов, полный решимости завершить его, но усталость победила меня. Я обычно принимаю это как сигнал «нужно пойти и немного поспать», когда я смотрю на кусок кода, написанный несколькими минутами раньше, и удивляюсь: «А что он в самом деле делает?». Несколько раз я сознательно не сохранял код, над которым я работал, потому что не был уверен в том, что написал: более безопасно выкинуть час работы, сделанной с усердием и положиться на предыдущий сохраненный вариант, который, как ты знаешь, был правильным, чем навести бардак.

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

Финальное прокручиваемое сообщение заставило немного задуматься, так как я хотел вывести корабли, летающие по экрану, пока он прокручивается вверх, чтобы все двигалось, как спереди, так и сзади него. Единственный способ сделать это — представить блок текста в виде одного спрайта, имеется ввиду конечный текст "Отлично сработано", который занимает почетное второе место по величине спрайтов во всей игре. Если вы никогда не доходили до конца, то он гласит:

Спасибо за Вашу отважную борьбу за восстановление мира в космосе.

Империя Будо уничтожена и уже никогда не будет угрозой человечеству.

Ваше имя останется во вселенной навсегда.

Спасибо, что прошли игру до конца.

Программист.

Все что мне оставалась тут сделать — это подождать, пока музыка Роба перестанет играть, потом все очищалось, что означало что восьмой уровень пройден, как и сама игра!

* * *

На этом этапе игра была в состоянии Alpha сборки, фраза, которую я разработал для себя. По моему мнению, различаются три финальные состояния сборки игры:


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

Бета. Игра завершена и укомплектована: все, что должно быть в финальной версии находится уже тут, а игровой процесс должен также этому соответствовать. Здесь не должно быть критических ошибок, но могут быть другие, обнаруженные во время тестирования. Бета проходит тест, ошибки выявляются и сообщаются разработчику, исправляются и поставляется снова. Это происходит, пока все ошибки не будут выявлены или кто-то сверху потеряет терпение и скажет: "Мы больше не можем позволить себе тратить время на это, отгружайте то, что есть!"

Мастер. Финальная версия, вышедшая по согласованности всех сторон. Она отправляется на фабрику для массового производства. Ее часто называют Золотой Мастер, ссылаясь на производственный процесс CD\DVD.


Пока в моей игре было все, но она еще не была правильно соединена, каждый уровень, который я отправлял в Activision, был автономным, а не мультизагрузочным, и хотя управляющий код уже был в игре, я все еще не реализовал его. Это означало, что Activision могла загрузить любой конкретный уровень и показать его, без возможности играть во все уровни сразу. Было удобно делать снимки для журналов для более поздних уровней, но это совсем не готовая игра. Еще пока нет.

Я решил покинуть Форхем и вернуться в Суонси, где бы я мог завершить игру в полной тишине и покое. Я был сыт по горло, проводя свою жизнь в комнате над кухонным выставочным залом, поэтому мне не пришлось долго убеждать себя, что настало время уйти. Activision не поднимали шума, так как они намеревались выпустить все три версии сразу в ноябре, а сейчас только что наступил сентябрь — торопиться особо было некуда. Я собрал демонстрацию восьмого уровня для Ника и оставил ее в офисе, чтобы он забрал ее в следующий раз. Я позвонил моему родственнику, который предложил пригнать фургончик в Форхем и подбросить меня и PC назад в Суонси. Я умышленно не сказал Уэйнрайту, что́ делал, я не слышал о нем с его попытки вывести меня из игры (в буквальном смысле) и если он захочет повторить это еще раз в будущем, то ему бы пришлось приехать на юг Уэльса и встретится на моей территории.

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

Когда я разговаривал с Солом и Ником, ставя их в известность, что игра была завершена (или не совсем готова), мне удалось вставить в разговор, что я готов подписать договор об игре, но не могу, потому что у меня нет авторских прав на встроенный звуковой код, так что я должен получить добро сначала от Роба, и он с радостью подпишет договор о передаче кода мне за условную стоимость, которой, увы, у меня нет из-за позиции Уэйнрайта, но если Activision оплатит эту скудную сумму в £200, тогда все будет прекрасно.

Я слукавил, но мы танцевали от радости: £200 для Activision были сущие крохи. Было прекрасно видно, сколько они тратили на рекламу, и они знали, что имели на 99 % готовый и ожидающий продукт и не могли рисковать ради такой относительно малой суммы. Сол сказал, чтобы Роб прислал им счет, и они оплатят его, то, что они должны были сказать, когда начались все беды, а не когда это было нужно Activision.

* * *

Моя последняя пятница в Фархэме началось хорошо, но закончилось плохо, даже сегодня я хорошо помню, как все это было. Как обычно, в пятницу вечером было время для моего единственного здорового приема пищи в неделю: моя любимая говядина с побегами бамбука, водяные каштаны и тарелка чипсов, и так как это будет последний раз, как я это попробую, то я с нетерпением этого ждал. Я только начал есть, как зазвонил телефон, и один парень принес его, сказав, что Кайтли хочет поговорить со мной. Что последовало далее, было одним из противнейших разговоров по телефону, которые случались в моей жизни: Кайтли с криками по телефону обвинял меня, что я его предал, прокатил, обобрал, обвалял его в дерьме и, завершая разговор, потребовал, так как я работаю в Designmaker, отдать ему завершенный код R-Type прямо СЕЙЧАС!

Когда кто-то вопит на вас в телефонную трубку, вы не можете тихо отвечать, так что вскоре я тоже орал, так как терять уже было нечего: я не сдерживал себя. Сказав ему, что перестал работать на Designmaker, когда прекратились выплаты, я указал, что мои дела велись сейчас непосредственно с Catalyst, и если кто-то и бросил его в дерьмо, то это был Уэйнрайт. Более того, он может сказать и сделать все, что хочет, но он не получит от меня код, а если он захочет подать на меня в суд за это, то может присоединиться сзади к концу очереди!

В течение двадцати минут мы вдвоем соревновались в оскорблениях по телефону, пока я, ни в чем не разобравшись, ушел в мертвое спокойствие, что являлось всегда плохим знаком, так как это означало, что я из стадии горячего гнева перешел в холодную ярость. Я сказал Кайтли, что я собираюсь повесить трубку, иначе я могу сказать то, о чем пожалею потом и откровенно говоря, он не был *** проблемой, чтобы продолжать обращать на это внимание. Это был последний раз, когда я разговаривал с Ричардом Кайтли.

Мне пришлось выбросить еду, так как она уже остыла, а офис не разбежался, чтобы предоставить такую роскошь как микроволновую печь. Все это было не лучшим способом положить конец моему пребыванию в Фархеме. Когда соберутся снять фильм об этом, то я полагаю, это будет перезаписано: все мы окажемся в групповых объятиях или что-то вроде того, когда я буду уезжать на закате, что будет намного драматичнее, чем есть холодные чипсы, что не так правдиво. На следующий день мой родственник появился со своим фургончиком, я загрузил запакованный в коробку PC назад вместе с остальным барахлом, попрощался и начал долгий путь назад в Суонси.

Загрузка...