Как делался Ball Quest
Alone Coder
Идея этой игры (тогда ещё без названия)
заползла в мою больную голову 16 мая,после
того, как не состоялся ожидавшийся на май─
ские праздники натиск на v9990. Дикая идея
была отправлена Shiru Otaku, и 20-го числа
Shiru выслал мне для экспериментов пробный
набор спрайтов мячика (достаточно большие
- 64x64,- чтобы я мог попробовать подо─
гнать размер). Я покрутил так и эдак и ре─
шил,что надо 24x24. 23-го Shiru переренде─
рил мячик в 24x24 (надо соблюдать размер
при рендеринге,поскольку при масштабирова─
нии может появиться окантовка), и процесс
медленно пошёл.
Shiru: Если по-хорошему, то надо соблю─
дать размер ещё при моделинге.Швы и шести─
угольники на мячике я сделал геометрией
(есть простой способ, проще, чем рисовать
текстуру) и выбирал их размер, чтобы они
смотрелись нормально в 64x64.Поэтому после
пере-рендера в 24x24 швы почти исчезли.Ко─
нечно,надо было перемоделить заново, но не
дошли руки.
Alone: А по-моему, мячик и так вполне
хороший, перемоделивать не надо.
Сначала я организовал в движке Pang
возможность смены координат камеры (чтобы
шарик был в центре). Потом нарисовал стен─
ки, алмазы,стрелочки,EXIT и вылетающие ци─
фры, набросал в исходнике тестовую карту.
К 13 июня уже была готова физика, сконвер─
чен один небоскрёб, подобрано несколько
звучков (на звуковом движке Wolf2004/Pang
16C ).И придумано название - Ball Quest. В
принципе,работы тут было не на три недели,
а на три дня.
15 июня я перебрался в Москву к Shiru,
где мы почти сразу выяснили следующее:
1. Нерелизенной музыки не хватит на 10
уровней,даже если доделать недоделки.Кроме
нерелизенной есть недорелизенная, но пло─
хая.
2. Подходящего редактора для карт такого
вида нет, надо писать.
3. Надо исправить клипирование в АТМовс─
кой версии движка.
4. Трудновато найти фотографии небоскрё─
бов с приличной высоты и с горизонтальным
направлением взгляда.
Редактор Shiru наваял довольно быстро,
с редактированием по тайловому принципу и
сохранением в нужном для игры формате с
координатами. Но выяснилось, что не только
мы, но и зашедшие в гости CHRV, Максагор и
Wlodek - никто не любит придумывать уров─
ни! Совместными с Shiru усилиями...
Shiru: Мои усилия заключались в наблю─
дении за сочинением ;)
...к концу недели мы сумели сочинить толь─
ко три штуки, которые,впрочем,из нас двоих
прошёл только я :)) (Тогда игра умела ра─
ботать только в режиме FAST GAME,и я хотел
релизить её именно в этом виде.)
Фоновые картинки мы искали по интернету
три раза. Половина найденных картинок либо
была снята с плохим ракурсом,либо выложена
с плохим разрешением, либо некрасиво смот─
релась в 16 цветах. И стало ясно, что 10
хороших уровней у нас получится вряд ли...
Отдельной проблемой оказалась начальная
заставка. По проекту там должен был быть
изображён мячик, лежащий в траве на фоне
небоскрёба. Однако эксперименты показали,
что отрендерить красивую траву не так-то
просто. Shiru с ходу отмёл идею позаимст─
вовать мячик у соседей и сфоткать его во
дворе.
Shiru: Старушки-соседки вряд ли согла─
сились бы расстаться,даже на время,со сво─
им футбольным инвентарём!
Взамен он запустил поиск в инете на
"ball grass" и нашёл на visualparadox.com
почти то, что требовалось - только на фоне
футбольных ворот. Текстура травы была дос─
таточно хороша, но количества оной травы
явно не хватало. Shiru размножил её копи─
рованием и штампами,передвинул мячик,убрал
задний план и поставил вместо него одно из
забракованных высотных зданий (забракован─
ное потому,что было сфотографировано с зе─
мли). Дальше стало интереснее:я обнаружил,
что мячик получается терпимо только с dia─
mond штриховкой, а трава - только с Floyd.
Поэтому пришлось каждый объект конвертить
отдельно,а потом склеивать. И потом до ко─
нца июля мы по очереди чистили получившую─
ся картинку - и в интересах красоты, и для
экономии памяти (она всегда в памяти;впро─
чем,можно было подгружать). Например,верх─
няя часть травы размыта вручную. Блок окон
в левой части здания тоже нарисован по пи─
кселям.
Но заставка - это ещё не весь дизайн.
Надо было придумать и игровую панельку.
Предложение сделать её в виде сыра (инфор─
мация - в дырках) Shiru отверг, поэтому я
решил сделать её в виде поезда (информация
- в окнах).
Shiru: Мне не понравилась идея с сыром
тем,что сам по себе сыр ничего не символи─
зирует. Поезд - ещё куда ни шло,ассоциации
с путешествием.
После очередного копания в интернете
был найден всего один приличный вагон,сня─
тый почти в профиль - на сайте московского
метро. Shiru, оглянув сей шедевр, изрёк:
"ничего из этого не получится". Но он ока─
зался не прав! =)) Чтобы развернуть вагон
вдоль экрана, я натравил на картинку трёх─
мерное преобразование.Далее обычная опера─
ция обкусывания фона, замены цветов,подго─
нки под нужный размер (в том числе окна -
под знакоместа) - и вуаля!
И тут выяснилось, что панельку надо на─
ложить на все фоновые картинки. Ведь кар─
тинки грузятся прямо в экранную область и
там же разворачиваются (см.статью про Pang
в прошлом номере).Альтернатив хранению па─
нельки в картинках было всего три:
1. Иметь её на экране всегда, даже в ме─
ню;
2. Хранить её в верхней памяти (надо ли─
шних 4k ОЗУ);
3. Постоянно её подгружать.
Нельзя было сохранить панельку на неви─
димом экране,т.к.во время распаковки любой
картинки он становился видимым, и было бы
некрасиво. Хотя...
Но я решил не усложнять задачу,чтобы не
превращать проект в долгострой. Была даже
надежда на завершение игры прямо в Москве.
У меня дома всё пишется гораздо медленнее.
И вот, решив накладывать панельку на
пейзаж, я осознал,что надо сейчас же доде─
лать панельку окончательно, чтобы потом не
пришлось по второму разу конвертировать
все пейзажи.(Забегая вперёд,скажу,что всё-
таки пришлось! После того, как я уехал,
Shiru лишний раз почистил её от шальных
пикселов, оставшихся после конверсии и из─
бежавших моей чистки.)
Я настроил в исходнике игры координаты
чисел,и Shiru взялся рисовать надписи типа
"LIVES". Заодно он нарисовал два шрифта -
один мелкий, для обычных нужд, а другой
крупный, но неполный - для сообщений типа
"LEVEL COMPLETE!". В запаснике у него наш─
лась утилитка для разбиения картинок на
тайлы,и он разбил с её помощью все крупные
надписи на неповторяющиеся знакоместа. Так
была сэкономлена куча памяти.Полученный на
выходе той утилитки длинный-предлинный bmp
я сконвертировал на ZX так же,как спрайты,
только исправив несколько строчек в том
конверторе.
Shiru: Хотя эта утилита умела также со─
ставлять список номеров тайлов, она была
написана немного для других целей (под
другие размеры изображений), поэтому спи─
сок номеров AlCo пришлось составлять вруч─
ную, при помощи ручки, бумажки и зоркого
глаза. Потеряли лишние полчаса, но исправ─
лять утилиту было бы дольше.
Всю музыку для игры делал Shiru. Музы─
ка, к сожалению,не оригинальная - в основ─
ном это ремиксы известных тем с приставок,
исключение составляет трек 2-го уровня -
он заремиксен с живой музыки. Проблема бы─
ла в том, что Shiru пишет исключительно в
Vortex Tracker'е, и пересадить его в Pro
Tracker не удаётся.
Shiru: В PT я писал бы медленнее,привы─
чка - страшная сила. Для меня создание од─
ного кавера в VT - дело нескольких часов,
особенно если под рукой есть набранная
кем-нибудь ранее midi-шка с мелодией (их
полно в интернете, из игр - на сайте
vgmusic.com ).
В VT один TS музон - это 2 модуля, а в
PT - 1 модуль. К моменту начала работ над
игрой я уже успел перевести два музона в
формат PT (один из них несколько даже ис─
правив).И TS плейер для PT уже был.Поэтому
я решил перетащить на PT и остальные ком─
позиции. Это задача вовсе не тривиальная,
поскольку два набора сэмплов и орнаментов
надо сводить к одному, исправляя цифры и в
самой мелодии...
Звуковые эффекты мы реализовали с помо─
щью нового пакета AY Sound FX Editor (ре─
дактор звуковых эффектов для AY на PC, под
Windows ),который Shiru написал в феврале-
мае. К нему прилагался плейер и несколько
наборов звуков, из которых мы выбрали нуж─
ные. Для многих событий там было по неско─
лько звучков-кандидатов, но некоторые дру─
гие звучки всё-таки пришлось нарисовать:
удары, падение, подсчёт очков.
Shiru нарендерил анимацию пяти объектов
(вишенки,гиря,бутылка,ключ,часы).Я выбирал
из последовательности нужные кадры и кон─
вертировал их в Photoshop'е следующим ме─
тодом.
1. Загружаем первый кадр, клипируем его
(масштаб надо было указать ещё при ренде─
ринге! Желательно и клипирование произвес─
ти тогда же).
2. Конвертируем (штриховка - по вкусу; у
нас - без) в адаптивную палитру из 8-10
цветов (редко надо больше). Сохраняем эту
палитру под названием "from.act".
3. Исправляем цвета в этой палитре на
ближайшие к ним спектрумовские,кроме фоно─
вого, который надо выбрать нестандартным -
допустим,иссиня-фиолетовым. Полученную па─
литру сохраняем как "to.act".
4. Конвертируем в RGB,потом в спектрумо─
вскую палитру,в которой 0-й цвет равен то─
му,нестандартному. Пусть эта палитра лежит
в файле "zx.pal". Сохраняем картинку (вер─
сия Photoshop, которая стоит у Shiru, по─
чему-то виснет при сохранении indexed co─
lor картинки поверх RGB картинки с тем же
названием).
5. Повторяем всё это со всеми остальными
картинками,НО УЖЕ ИСПОЛЬЗУЯ ГОТОВЫЕ СОХРА─
НЁННЫЕ ПАЛИТРЫ.Можно воспользоваться фото─
шоповской системой макросов (я воспользо─
вался).
Потом, в процессе перекапывания коллек─
ций Shiru, я обнаружил одного замечатель─
ного паучка,отрендеренного Surfin' Bird'ом
(тем самым, который нарисовал графику к
Fire & Ice и отрендерил АТМ в корпусе под
орех :)). Я покрасил паучка в красный цвет
и тоже внёс в игру.
Ещё несколько объектов (проломленная
доска, стекло,разбитое стекло) я нарисовал
по пикселям.В общем,мы штамповали графику,
пока не кончилась страничка памяти,зарезе─
рвированная под спрайты :) Можно было про─
должить в другой страничке, но это грозило
отказом от чего-нибудь другого.Мы даже от─
кусили половину фаз ключа.
Редактирование уровней шло вяло. Чтобы
ускорить их проверку, Shiru организовал в
своём редакторе запись в формате хобеты
(её умеет грузить Unreal Speccy, правда,
забывая при этом имя текущего trd-шника).
Shiru: Добавление файлов в trd-шник, со
всеми проверками, было бы существенно сло─
жнее (то есть дольше,что было принципиаль─
ным моментом), поэтому от этого варианта
я отказался. Позднее для решения подоб─
ных задач я написал специальную утилиту
trdtool, она есть на Virtual TR-DOS.
Уже собираясь уезжать, я врубился, что
время уровня должно лежать в самом уровне,
а не в программе.Эту функцию Shiru добавил
за последние минуты, заодно переведя гото─
вые уровни в новый формат.
Итак, я отъезжал 20 июня в Рязань,имея,
по большому счёту, набор конвертированных
фонов, 3 уровня, редактор и почти готовый
исходник игры,который в режиме АТМ почему-
то отказывался грузить второй уровень по
прохождении первого. И при всём этом я
очень хотел спать!
Было видно, что всю неделю мы работали
эффективнее, чем в прошлый раз (январь,
Time Gal ), но игру всё-таки доделать не
успели.
После долгого отсыпа (в течение которо─
го Shiru наремиксил ещё 2 трека) я нарисо─
вал один уровень по идее Shiru (4) и поз─
вал John'а помочь. Один уровень мы сделали
вместе (5), ещё два он набросал на бумажке
(6,7). John настраивал уровень 4 так,чтобы
сам мог пройти его только с 10-й - 20-й
попытки (а он играл в режиме SLOW GAME). Я
еле убедил его не издеваться над игроком:)
Когда John пришёл в следующий раз, его бу─
мажные уровни уже были готовы. Я показал
ему результат и заодно нарисовал последний
уровень (8), но John уже потерял интерес и
смотрел по сторонам :(
Далее я в основном отлаживал игру,
тестировал и причёсывал (добавил бегущую
строчку,кэш,отклеил мячик от фона - раньше
он был всегда точно в центре экрана). Тес─
тировать помог Максагор. 2 августа я успе─
шно (кажется) завершил этот процесс и за─
бил остаток памяти демками прохождения.
Демки - это последовательность нажатий
клавиш. Можно было пожать их через RLE, но
влезло и так... Впритык, правда...
5 августа пришёл John и исправил трек к
4-му уровню.
Дальше я только оформлял исходники.
Об исходниках
В движке по сравнению с Pang'овским вы
можете обнаружить следующие важные улучше─
ния:
- Появилась поддержка кэша. Там лежат
основные циклы вывода и стирания спрайтов.
В АТМ версии кэш тоже поддерживается!
- Спрайты, лежащие в нижней памяти, не
копируются перед использованием (это брев─
но и бетонная плита).
- Спрайт, который перед тем был только
что скопирован в нижнюю память, не копиру─
ется снова во 2-й, 3-й и т.д. раз.
- Копирование производится LDIR'ом,лежа─
щим не в ОЗУ, а в ПЗУ/кэше. В турбо-режиме
ПЗУ и кэш работают существенно быстрее
ОЗУ.
- На АТМ организовано клипирование снизу
(макрос D31 ). Высота игрового окна должна
делиться на 32.
- При построении списка выводимых спрай─
тов учитывается их высота (ID объектов ра─
збиты на несколько групп в зависимости от
размера - в следующий раз надо будет по─
пробовать читать высоту из самого спрай─
та).
- Предусмотрено отключение всех режимов
и восстановление состояния vTRDOS на вре─
мя дисковых операций (процедуры VTRON,
INIATM).
- Шрифт теперь 16-цветный.Плюс добавлена
печать больших сообщений спецшрифтом.
- Можно убрать (метка re) сохранение эк─
рана под спрайтами и все соответствующие
буфера. Это сохранение не нужно для многих
видов игр, например, для стратегических.
Коллизии организованы следующим обра─
зом. Имеется карта (BMAP) 64x64, по байту
на знакоместо. Вне границ уровня эта карта
не действует - считается, что снаружи пус─
то. В карте проницаемые знакоместа обозна─
чаются 0. Призы обозначаются 2. Препятст─
вия обозначаются числами от 3 до 255. Каж─
дое такое число - номер юнита в списке
юнитов уровня (эти номера не меняются по
ходу игры, т.к. в BQ юнит при удалении фи─
зически не удаляется, а превращается в
IDerased).Мячик постоянно проверяет неско─
лько знакомест внутри себя. Его поведение
(процедура BOUNCE) зависит от того,с какой
стороны он чувствует препятствие. Тип зву─
ка столкновения определяется типом препят─
ствия (номер юнита в BMAP нужен только для
этого;можно было взамен положить сам тип).
Разрушение препятствия - там же. Громкость
звука зависит от скорости мяча.
Обратите внимание на управление мячом
(CPlrf). Оно работает только во время ка─
сания стен/пола/потолка (признаки генери─
руются в BOUNCE). Точнее,не только во вре─
мя, но потом ещё один раз через 2 фрейма
(в SLOW GAME - через 4). Это сделано,чтобы
опытный игрок смог более хитро управлять
движениями.
Разбор полётов
Что было сделано правильно:
1. На момент начала совместной работы
уже имелся движок,конверторы,половина объ─
ектов и физика.
2. Было много запасной музыки (полунедо─
писанной и недополурелизенной). В случае
цейтнота успели бы вставить garbage (к
счастью, не пришлось).
3. Редактор эффектов Shiru написал очень
кстати, и эффекты с MSX были сконверчены
тоже очень кстати.
4. Я успел ещё раньше переделать Mr Gluk
Reset Service и ALASM под АТМ, и это весь─
ма помогло. Впрочем,можно было (как в слу─
чае Pang) писать в конфигурации Pentagon с
фальшивым значением в порту #eff7, но по─
том всё равно пришлось бы возиться с адап─
тацией под АТМ, удобство так и так нужно.
5. Весь набор программ имелся на компью─
тере,не пришлось,как в прошлый раз, качать
Delphi ;)))
6. Ничего не пришлось изучать в процессе
(в прошлый раз приходилось на каждый чих
водить пальцем по талмуду Максагора об ар─
хитектуре АТМ turbo 2+ и по pdf-кам с ATA/
ATAPI/CD-ROM/CDFS стандартами).
7. Был опыт совместной работы.
Что было сделано неправильно:
1. Надо было посидеть вместе ещё один
день, точнее ночь - до последнего утра мо─
его отпуска (хотя у меня тогда был бы риск
опять проспать поезд, как в прошлый раз) и
всё-таки нарисовать уровни.Так была бы на─
верняка сэкономлена целая неделя.
2. Плейер эффектов, прилагавшийся к AY
Sound FX Editor'у, был не вполне готов -
его пришлось доделывать на лету (последний
фикс я вносил уже дома). Впредь этого не
повторится, плейер теперь исправлен.
3. Не надо было исправлять клипирование
на месте - я внёс из-за этого глюк,который
потом долго искал - аж по распечатке! Надо
было заниматься этим клипированием дома, в
спокойной обстановке, до или после.
4. Один компьютер на двоих - всё-таки
маловато :) В прошлый раз получалась одно─
временная работа - один кодит/конвертит,
другой в это время тестирует на АТМ. Хотя,
конечно, размышления лёжа на диване - это
тоже работа...
5. Из-за Pang'овской системы "1 файл = 1
спрайт" на рабочем диске накопилось аж 125
файлов. Постоянно приходилось делать MOVE
(хорошо,что в ALASM'е есть MOVE),а графику
переносить на диск по частям (т.к. после
конвертации .bmp появляется один файл .C,
и ещё один - после упаковки этого .C, а
стираю я этот .bmp и этот .C только пос─
ле). Надо было организовать контейнеры
спрайтов и сделать 2 рабочих диска (диско─
вод A: - исходники,дисковод C: - ресурсы).
6. Копирование файлов через ESN было не─
удобно - после его запуска (а не выходить
из него нельзя - он страшно греет процес─
сор)...
Shiru: Возможно, это проблемы моего из─
лишне горячего P4.
... приходилось долго переходить к нужным
каталогам, а мы даже не приблизили эти ка─
талоги друг к другу. В SN была функция бы─
строго перехода (через Alt+цифра),но в ESN
её почему-то выкинули.
7. Конвертирование рендеренных анимаций
через Photoshop - долго и нудно. Если бы
было нарендерено не 7 объектов,а 70,да ещё
и не по 4-8 фаз, а по 16-32, то это был бы
капец. Нужна утилита,которая бы конвертила
анимации и заодно кидала полученные конте─
йнеры спрайтов на рабочий диск с графикой,
чтобы не запускать этот дурацкий ESN. Бо─
нус был бы,если бы таблицы персонажей (где
лежат их метки-названия, число фаз и всё
такое в этом духе) составлялись в этой же
утилите и сохранялись в формате ALASM.
8. Загрузку уровня надо было написать
заранее.А не искать на месте часами,почему
АТМ не грузит, и не выяснять лишний раз,
какой экран надо включить, чтобы юзер не
видел левоту.
9. В редакторе уровня были неудачно по─
добраны горячие кнопки (NumPad). Они так и
не пригодились. Ещё в редакторе не хватало
фичи: при переключении объектов надо сде─
лать текущим тот тип объектов, объекты ко─
торого мы щёлкаем.
10. Как-то раз потребовался STS. А пере─
делать под АТМ я его не успел.Надо переде─
лать (сделать в ПЗУ резиденты для этого).
11. Не нашли человека, который мог бы
качественно почистить конверченные картин─
ки, пока мы занимались другими делами.
12. Ходили тут всякие - типа посмотреть,
как мы игру пишем :) Какая там писанина,
когда гости нагрянули!