Джафар в обличье змеи должен был иметь атаку языком, и если атака удавалась, то он должен был улыбаться. У него было довольно много других вариаций атак/поведений.
Это никоим образом ни на что не влияет, и есть ещё много небольших различий между дизайном и реализацией в игре.
Камень, ножницы, бумагаХотя не сохранилось ни соответствующего кода, ни данных, но присутствует полное описание игры в «камень, ножницы, бумагу». Стоит процитировать его здесь целиком:
Попав на бонусный экран, игрок видит в левой центральной части экрана ковёр, размахивающий своей левой кистью. Аладдин стоит в правой центральной части экрана и размахивает правой рукой. Камню соответствует кнопка A, бумаге — кнопка B, а ножницам — кнопка C. Подсказка показана в нижней центральной части экрана.
Правила аналогичны правилам обычной игры: каждый игрок выбирает камень, бумагу или ножницы. Камень обозначается кулаком, бумага — раскрытой ладонью, а ножницы — вытянутыми в форме буквы V указательным и средним пальцами. Пользователь играет за Аладдина.
Пока ковёр размахивает своей кистью, а Аладдин — рукой (так продолжается, пока игрок не сделает выбор), игрок должен выбрать одну из трёх кнопок: A, B или C. После выбора нужного предмета ковёр и Аладдин ещё два раза взмахивают кистью и рукой, а затем, на третьем взмахе, показывают свой выбор. Победитель празднует победу и он отображается на экране.
Если Аладдин проигрывает, то игра заканчивается и он возвращается на то же место, в котором он покинул уровень. После этого он на несколько секунд становится неуязвимым (этот процесс происходит также после третьей игры, вне зависимости от того, кто выиграл). Если Аладдин выигрывает, на экране графически (так же, как в обычной игре) и/или текстовой форме (в случае дополнительных очков) показывается его приз.
Затем игрока спрашивают, хочет ли он сыграть снова, чтобы иметь возможность выиграть больше, или покинуть игру, сохранив уже полученные предметы. Если игрок играет снова, он может проиграть и потерять все ранее выигранные предметы (например, если в первой игре Аладдин выиграл одну жизнь, во второй — 10 драгоценностей и ещё две жизни, а потом в третьей игре проигрывает, то он проигрывает всё, что выиграл ранее: 10 драгоценностей и две жизни).
За одно посещение бонусной игры можно сыграть не более трёх раз. Аладдин может сыграть во вторую игру, только если выиграл в первой, а в третью — только если выиграл в первой и второй.
В случае ничьей игра повторяется до тех пор, пока кто-нибудь не выиграет.
ПравилаКамень побеждает ножницы
Бумага побеждает камень
Ножницы побеждают бумагу
Если у обоих игроков одинаковые предметы. то засчитывается ничья и игра повторяется.
ПризыПервая победа: жизнь
Вторая победа: 10 драгоценностей и две жизни
Третья победа: одна умная бомба Джинна, 15 драгоценностей, три жизни
Примечание: мы можем изменять призы в соответствии с выбранным уровнем сложности игры (выигрыши лучше при низкой сложности). Это будет решено во время настройки игры.
Примечание: призы суммируются, если Аладдин выигрывает все три игры, то получает шесть жизней, 25 драгоценностей и одну умную бомбу Джинна
Похоже, что эта идея возникла на ранних этапах разработки, как видно, некоторые элементы описания уже не соответствуют другим механикам дизайна и предметов.
Разбивка ROMВ диздоке была предпринята попытка заранее разбить требования к памяти всех персонажей, уровней и функций, несмотря на то, что в реальности этого добиться удалось не в полной мере. Это даёт нам замечательную возможность оценить, насколько внимательными приходилось быть дизайнерам и художникам к техническим ограничениям целевого носителя информации.
2048 КБ — общая доступная память картриджа
Предполагаемое использование памяти
480 КБ — 8 уровней, по 60 КБ на уровень (сюда входит набор тайлов, триггеры, контуры и всё прочее)
132 КБ — три уровня без наборов тайлов, по 44 КБ на уровень
175 КБ — музыка и звуковые эффекты
64 КБ — программа
64 КБ — таблицы спрайтов
64 КБ — контрольные таблицы
120 КБ — начальная заставка/интермедии/конечная заставка/финальный ролик (изображение каждой интерлюдии = 4 КБ)
30 КБ — логотипы Sega, Disney, Aladdin и Virgin
491 КБ — Аладдин и все персонажи, не привязанные к уровням
369 КБ — привязанные к уровням спрайты
241 КБ — боссы
80 КБ — все бонусные игры
___________
Требуется 2274 КБ
2048 КБ -___________
226 КБ лишних. Хм-м-м.
Разбивка 60 КБ по уровням:
11500 байт — данные фоновых персонажей (сжатые)
32768 байт — ссылки и сочетания блоков фона
1200 байт — пол и информация переключения спрайтов (сжатая)
400 байт — информация контуров
10699 байт — данные карт (сжатые)
2171 байт — данные параллакса карт (сжатые)
___________
Приблизительно по 58738 байт на уровень. [Эта оценка уменьшится, если графический стиль будет более простым, или если размеры уровней будут меньше максимально возможного размера]
Такая тщательная координация и планирование на самом деле по многим причинам являются здравой практикой, и это очень далеко от того дисбаланса, который мы часто наблюдаем между графикой, дизайном и программированием в современной разработке игр. Хотел бы я сказать, что ни разу не ругался на художника, засунувшего в игру огромную одноцветную текстуру 4096×4096, или на дизайнеров, которые сначала делают так, что загрузка уровня длится три минуты, а потом надеются, что за них всё починят. Раньше я стыдил сотрудников словами «твоя пустая текстура занимает больше места, чем 20 лет назад занимала целая игра».
3.7. Sega CD
Похоже, что версия игры для Sega CD планировалась с самого начала. К сожалению, несмотря на частое упоминание Sega CD в дизайн-документе, похоже, что исходная графика не дожила до нашего архива с Aladdin. Вот все относящиеся к CD особенности и элементы, которые мне удалось вытащить из диздока:
Планировалось что во многих дополнительных уровнях Sega CD Аладдин появится в обличье принца Али. Диздок упоминает, что принц Али появится только в одном уровне версии на картридже, но он намеренно был вырезан для экономии места в ROM.
Планировалось, что в CD-версии игры у Джафара будет третья форма в виде Джинна. Следов графики для этого этапа в архиве не сохранилось.
На случай, если волшебный мешок Абу доживёт до розничной версии, для CD-версии планировались ещё две дополнительные реакции Абу на количество использованных Аладдином драгоценностей.
В CD-версии планировалось заменить босса рыночной площади Разула на босса «торговец яблоками» (Apple Merchant). Сам Разул должен был стать боссом уровня с тюрьмой.
В CD-версии на уровне с пустыней должен был появиться босс «песчаный скорпион». По этому боссу в дизайне нет никакой дополнительной информации.
На втором уровне с рыночной площадью, ведущей к дворцу Джафара (которая не добралась до релиза), в CD-версии игры вместо второй встречи с Разулом планировался босс «пожиратель огня» (Fire Eater).
Для CD-версии планировался допонительный метательный предмет — снежок.
Специально для CD-версии планировались дополнительные анимации ожидания:
Джинн влетает на экран и говорит одну из фраз (только после уровня с пещерой в CD-версии)
Ковёр влетает на экран, похлопывает Аладдина по плечу и снова улетает (только после уровня с пещерой в CD-версии)
В CD-версии должно было иногда появляться препятствие в виде человека, лежащего на гвоздях, оно позволяло Аладдину отпрыгнуть от него один раз, не получив урона. После первого прыжка человек «в негодовании» поднимался и его больше нельзя было использовать для прыжков.
На уровне с пустыней в CD-версии планировались зыбучие пески:
Когда Аладдин проходит по определённым участкам песка, он начинает тонуть. Прыгая, он может постепенно выбраться из песка и пройти эти участки, не утонув. Если игрок оставляет его слишком надолго, Аладдин утопает в песке и теряет жизнь (или игра заканчивается, если это была последняя жизнь). Зыбучие пески внешне должны немного отличаться от обычных песков, чтобы внимательный игрок мог предусмотреть эту опасность.
Один участок зыбучих песков ведёт в секретную область. Чтобы попасть туда, Аладдин должен преодолеть своё естественное стремление спастись из ловушки, и оставаться на месте. Когда Аладдин проваливается под поверхность этого участка зыбучих песков, то прилетают и улетают скарабеи, сообщая, что он открыл новую область в пустыне, возможно что-то вроде пещеры (если у нас будут эти тайлы), где Аладдин может найти дополнительную жизнь, продолжение игры и разные другие бонусы.
С визуальной и геймплейной механикой возврата Аладдина на поверхность пустыни нужно ещё определиться, но для целостности мы используем ещё один переход кадра со скарабеем.
Для CD-версии также планировалась вероятность использования кактусов:
Они будут различной формы и размера (возможно двух видов). Мы удалим их из игры, если они не будут соответствовать стилю мира Аладдина. Прикосновение к кактусу наносит Аладдину урон (1 очко урона при каждом касании).
Один тип кактуса можно уничтожить броском предмета или ударом меча. Другой, более основательно выглядящий вид кактуса никуда не девается, его можно только избегать.
Оба типа кактуса графически будут устроены таким образом, чтобы можно было создать несколько различно выглядящих кактусов, не используя слишком много графики, а значит и памяти.
В дополнение к статичным канатам, по которым можно взбираться на уровне с рыночной площадью, для CD-версии игры планировались раскачивающиеся бельевые верёвки.
Ковёр должен был иметь особую анимацию с горящими кистями после того, как слишком близко приближался к языкам пламени.
Планы для CD-версии часто переплетаются с элементами/функциями, которые были запланированы (но не дожили до релиза) версии игры на картридже.
3.8. КодМожно многое рассказать о самом исходном коде. Один из наиболее интересных аспектов самого игрового кода заключается в том, что он управляется механизмом, в сущности явлющимся невероятно простым конечным автоматом. В этом фрагменте кода видно, как в ассемблере задаются такие аспекты, как последовательности анимаций:
; Скольжение
AN_ROLLY_SNAKE:
dc.w SN_SLTHR_FRAME1
mface_man
R_S: dc.w SN_SLTHR_FRAME1
dc.w SN_SLTHR_FRAME1
dc.w SN_SLTHR_FRAME1
mif_within_X 85,AN_ROLLY_SNAKE_BITE
dc.w SN_SLTHR_FRAME2
dc.w SN_SLTHR_FRAME2
dc.w SN_SLTHR_FRAME2
dc.w SN_SLTHR_FRAME3
dc.w SN_SLTHR_FRAME3
dc.w SN_SLTHR_FRAME3
Так генерируются байты/слова для каждой «команды». Каждый кадр анимации задаётся генерированием слова, и это слово является указателем на список указателей кадров примерно в начале ROM. Затем идёт множество макросов для таких вещей, как показанная выше условная логика mif_within_X, которая генерирует соответствующий командный байт. Командные байты удобно расположены за пределами диапазона значений известных значений указателей кадров. В результате этой команды для следующего цикла выполнения указатель данных состояния может иметь какое-то другое значение.
Элементы (объекты/акторы) чаще всего управляются обработкой кода таких данных состояний. Движение также обрабатывается похожим образом. Логика движения определяется генерируемыми байтами, а каждый элемент может передать указатель на свои данные состояния движения. Также очень часто данные состояния анимации заменяют указатель на данные состояния движения, поэтому здесь есть специальный макрос, используемый для генерации соответствующих байтов для этой операции.
Есть довольно большой объём кода, посвящённый выполнению этих небольших блоков состояний и управляющий расчётом таких вещей, как физика/коллизии и даже иерархия основных движений. Разумеется, игрок обрабатывается по-своему. Он, как и стандартные элементы, использует данные состояний, но имеет собственную ассемблерную boilerplate-логику, обрабатывающую большую часть более сложной логики состояний, которая также часто непосредственно задаёт указатели на состояния.
Такой способ обработки упрощает работу по добавлению новых объектов, и позволяет снизить затраты памяти, минимизируя количество нового кода, необходимого для каждого объекта и упаковывая логику в достаточно эффективные команды состояний. В сочетании с тем фактом, что сама логика состояний очень проста и есть специальные макросы для всех достаточно сложных случаев логики, то для игры масштаба Aladdin это отличная система.
Кроме того, существует много boilerplate-кода для обработки таких аспектов системного уровня, как передача данных с прямым доступом к памяти в VRAM. Процедура DMA_IT являлась основой для записи тайлов Chopper бласт-процессингом во VRAM. Chopper предназначен был для довольно эффективного минимизирования затрат. Он избегал затрат на распаковку в ЦП, при этом сводя к минимуму количество уникальных тайлов на кадр анимации. Я не работал над профилированием Aladdin и не изучал, сколько здесь обычно тратится циклов, но судя по конечному результату, система справляется со своей работой достаточно хорошо.
Здесь мы можем глубоко погрузиться в изучение бесчисленного количества систем, но если не слишком вдаваться в подробности, то я перечислил самые примечательные высокоуровневые операции в кодовой базе Aladdin.
Кроме всего сказанного выше, есть и другие интересные фрагменты, которые я заметил при изучении:
Существует переменная времени ассемблирования MAKEDEMO, которую можно использовать для записи демо. При записи игра каждый кадр пишет команды с контроллера во VRAM. Интересно, что при записи демо можно увидеть, как на фоновых тайлах постепенно появляются артефакты. После заполнения выделенного буфера VRAM игра копирует данные из VRAM обратно в основную ОЗУ, потом бесконечно зацикливается на месте (потому что она только уничтожила основную память), поэтому можно подключить отладчик и выгрузить данные демо с известного адреса. Ради забавы я создал таким образом собственное демо.
Другие интересные факты о демо: сами данные демо — это необработанный поток покадрового ввода с контроллера. И запись, и воспроизведение демо используют одинаковое начальное число генератора псевдослучайных чисел «12345678» для обеспечения детерминированных результатов.
Есть также переменная времени ассемблирования MASTER. Похоже, в розничной копии она имеет значение OFF. При значении ON она отключает части дожившего до релиза экрана читов, но когда она включена, код без модификаций не ассемблируется. Можно предположить, что экран читов (по-прежнему содержащий номера телефонов и факсов) на должен был остаться в розничной версии.
Чит-коды вместе с многими другими статичными данными перечислены в файле TABLES.68K. Они считываются по одному байту. Логика чит-кодов увеличивает указатель на соответствующую таблицу чит-кодов, и сбрасывает его при нажатии неверной кнопки. В исходниках не сохранилось дополнительных (кроме известных/задокументированных) скрытых/отключенных в релизе чит-кодов.
Во время записи видео для этой статьи я хотел отключить высокочастотное мерцание, которое происходит, когда Аладдину наносят урон. Это нужно было, чтобы избежать его полного исчезновения на несколько кадров при перекодировании видео на более низкие частоты кадров. Найдя нужный участок кода, я обнаружил вокруг него ассемблерную проверку «IF TO_DEMO=OFF». Очевидно, я был не первым, кто столкнулся с этой проблемой при записи рекламного ролика! Похоже, TO_DEMO убрали из демо-сборки для CES или эту конкретную часть добавили позднее, исходя из того, что в этой сборке мерцание присутствует (когда отключена неуязвимость).
Не знаю, как насчёт вас, но лично меня все эти вещи заставили поностальгировать о золотой эре разработки игр.
4.0. Что дальше?У каждой игры есть своя история, и иногда двоичный код говорит громче слов. Но исходный код обычно говорит ещё громче! Из-за отменённых прототипов, выброшенных демо и сбоев оборудования мы и так уже потеряли слишком много потрясающих моментов истории видеоигр. Если мы не начнём относиться к сохранению и архивированию в индустрии видеоигр более внимательно, особенно в случае аппаратных технологий DRM, то можем потерять гораздо больше.
Я начал этот проект с целью подготовки архив Aladdin к надлежащему сохранению, сделав первые шаги к стандартизации сохранения и архивации исходного кода на VGHF. Это подразумевало документирование исходного кода с верхнего уровня с целью определения его назначения и всех внешних зависимостей от других инструментов и/или данных, чтобы можно было стандартизированным образом отслеживать и эти зависимости. В процессе работы мне сразу стало очевидно, что Aladdin может рассказать интересную историю. Я надеюсь, что это только первая история из многих других, и мне не терпится выяснить, что же ещё скрывается в игре!
все))
Это сообщение отредактировал denisiuk - 21.10.2017 - 01:19