Oбзор тайн, загадок и глюков Dizzy 4.
Упаковка экранов:
В отличие от Диззи-3, экраны упакованы еще эффективнее. Если в Диззи-3 упаковывались повторяющиеся атрибуты спрайтов, то начиная с Диззи-4 упаковываются также повторяющиеся номера спрайтов.
Кроме того, экраны упакованы не по одиночке, а все вместе единым массивом. Из-за чего при отрисовке распаковщик проходится по всему массиву экранов, но отрисовыает только тот экран, который должен отображаться. Это весьма значительно замедляет переход Диззи с экрана на экран.
Массив упакованных экранов занимает: 7828 байт + 128 байт на таблицу размеров экранов
Неупакованный массив занимает: 11940 байт + 256 байт на таблицу смещений экранов
В Диззи-3 и Диззи-4 на карте используются спрайты с режимами рисования MOV/XOR/OR, но движок игры не умеет рисовать спрайты по OR, поэтому все, что должно рисоваться по OR, рисуется по XOR. В Диззи-3 спрайтов с OR было сравнительно немного, поэтому то, что рисовали авторы в редакторе почти не отличалось от того, что видит игрок. Тогда как в Диззи-4 спрайтов нарисованных по OR значительно больше, и в игре графика несколько хуже, чем то, что задумывали авторы, потому что наложение по XOR вместо OR местами заметно отличается.
Формат упакованного элемента фирменного упаковщика:
Скрытый текст
Код:+00 - [6..0] - X-координата спрайта (0..127) [7] - 0 - пропускать распаковку атрибута (используется предыдущий распакованный атрибут) 1 - распаковывать атрибут +01 - Y-координата спрайта (0..255) +02 - [7] - зеркальное отображение по горизонтали [6] - твердость [5] - 0 - байт используется, как атрибут 1 - байт используется как счетчик повторяющихся спрайтов (1..128) [4,3] - режим рисования OR/XOR/MOV [2-0] - цвет +03 - номер спрайта (0..255) Если счетчик повторяющихся спрайтов не исчерпан, то используется предыдущий распакованный номер спрайтов[свернуть]
Упаковка текстов:
Тексты в игре упакованы ниббловым (полубайтовым) сжатием. При этом поверх этой упаковки используется много хардкода и самомодификации.
В массив с упакованными названиями экранов встроены номера экранов. И при печати названия экрана, сканируется массив, и если номер экрана совпадает, то распаковывается следующая за ним строка. Однако, из-за того, что некоторые комбинации упакованных букв могут совпасть с номером экрана, не все названия экранов можно найти в массиве подобным образом. Поэтому для части экранов сделаны тупо прямые ссылки на конкретные названия экранов. Типа, если экран номер 5, то адрес его названия $1234, и т.д.
Вообще, в игре много хардкода и самомодификаций, даже больше чем в Диззи-3. Причем есть модификация прям поверх упакованных текстов. Например, чтобы заменить название потухшего вулкана на проснувшийся, прямо поверх упакованного текста записывается другой байт.
Алмазы:
У алгоритма сияния алмазов есть несколько условий, при которых алмаз сиять не будет:
1. Если на текущем экране есть предмет 'перила' (их в игре 3 штуки). Это сделано для того, чтобы алмаз спрятанный за перилами не выдал себя.
2. Если на экране есть коза (вы разве не заметили, что алмаз за Троллем не сияет? Я тоже). Это сделано непонятно зачем, так как бегущая на фоне алмаза коза не портится сиянием алмаза.
3. Если место сияния алмаза не желтого цвета (место сияния алмаза загораживает какой-то предмет).
Гарпия:
Как не печально это осознавать, но в Гарпии нет никакого тайного (а так же и явного) смысла. Она просто движется в сторону Диззи, когда он поднимается выше определенного уровня, и убивает его. А кривое гнездо - это просто так оно так криво нарисовано (и не только оно одно).
Летающие нотки и буквы Z:
Летающих ноток (или букв Z) одновременно на экране может быть не более 10. Они просто формируются на уровне испускающего их обьекта с небольшим случайным разбросом по X, летят вверх постепенно увеличиваясь, и пропадают. Если превышен лимит одновременных ноток, то новая просто не будет появляться. Максимум нот можно посмотреть в колодце, когда Диззи выманивает мышь игрой на волшебных трубочках.
Облачка:
В отличие от предыдущих игр, начиная с Диззи-4, некоторые облачка не твердые, а полу-твердые. Стоя на них Диззи постепенно проваливается. Материал таких облачков не задается на карте. Эта информация содержится в специальной таблице облачков. В ней данные для 8 статических облачков, и для 4 динамических (2 над вулканом, и 2 на экране с Гарпией).
Надо заметить, что динамические облачка (над вулканом) плывут вверх даже если Диззи находится на другом экране.
Кроме того, в алгоритме летающих облачков есть ошибка. По задумке авторов при входе на экран с Гарпией одно из облачков должно появиться прямо под ногами Диззи, чтобы Диззи не провалился на экран ниже с большой вероятностью падая в кратер вулкана. Однако, авторы перепутали проверку, и облачко под ногами Диззи на экране с Гарпией появляется не когда Диззи заходит на этот экран, а когда ВЫХОДИТ с него, что практически лишает смысла данный алгоритм, и делает очень сложным подьем на высоту Гарпии, особенно в смертной версии.
Кстати, с экрана с Гарпией, если облачко находится максимально близко к правому краю экрана, вполне можно допрыгнуть до утеса над пещерой с Мефистофилем.
Джин:
В первый вызов Джин миролюбив, и его молнии не слетаются к Диззи. Начиная со второго вызова они всегда целятся в Диззи, если на экране нет громоотвода.
Чтобы потереть тяпкой лампу, нужно находиться к ней по горизонтали не далее 6 знакомест. При этом вертикальное положение не имеет значения.
Привидения:
При входе на экран привидения всегда идут сперва влево, в независимости от предыдущего их направления движения.
Также мигающее голубым цветом привидение (если у Диззи есть пилюля) окрашивает собой фон и ручку факела в голубой цвет.
Плавающие лилии:
Если Диззи после гибели восстанавливается на одном из экранов с лилиями, и при этом он находится не над твердой поверхностью, то автоматически все лилии выставляются в верхнее положение, что бы Диззи стоял на лилии.
Кстати, из-за попытки авторов синхронизировать лилии с лучом (чтобы лилии не мигали), экраны с лилиями сильно замедляют игру, особенно на экране с привидениями.
Управление:
В игре опрашиваются еще и дополнительные управляющие клавиши 'Q', 'L', 'C', '1'. Однако, используется только клавиша 'Q' (выход из игры). Вероятно, на клавишу 'C' предполагалось повесить выход в CheatMode. Для чего были нужны клавиши 'L' и '1' остается загадкой. Кстати, если вы нажмете хотя бы одну из клавиш 'L','C','1', и попытаетесь выйти нажав 'Q', то 'Q' не сработает.
Активные летающие обьекты:
Активные летающие обьекты (летучая мышь, москиты, огни в пещере) сделаны на одном движке.
В общем случае обьект движется по заданной траектории, меняя свое направление натыкаясь на твердый материал, или же на край экрана.
Однако, есть некоторые особенности. Например, границы экрана установлены на 2 знакоместа левее правой границы экрана (это еще понятно, чтобы двухзнакоместные спрайты не выходили за правый край экрана). Но при этом левая граница экрана установлена на 3 знакоместа правее! Причина этого совершенно не ясна. А следствием является то, что ни москиты, ни огни в пещере не доезжают 3 знакоместа до левой границы экрана.
Впрочем также они не долетают 1.5 знакоместа до верха экрана и 3 знакоместа до низа экрана. Про нижнюю границу еще можно понять, т.к. москиты не должны влетать в болото. Все остальные ограничения выглядят странными.
Качество дизайна:
По сравнению с предыдущими играми серии, дизайн экранов выглядит более неряшливым. Напрвление падения света соблюдается плохо. Например, если в предыдущих играх серии камни старались расставлять так, чтобы свет падал всегда с одной стороны, то в этой игре дизайнер словно вообще не обращал внимание на то, откуда падает свет. Стыковка обьектов в плане клешинга атрибутов не на высшем уровне, а в лесных экранах так и вообще неряшлива. Края облачков почему-то задраны. Словом, художник хорош, а набиратель карты в редакторе подкачал или поленился.
Также в игре есть некоторое количество ляпов на карте типа два раза нарисованный по одному и тому же месту спрайт, или же спрайт, который целиком скрыт за другим спрайтом.
Прочее:
* Да, бутылка из-под молока и мешок с хламом действительно нигде не применяются.
* Если при загрузке с кассеты была ошибка хотя бы в одном файле, то после старта игры в правом верхнем углу будут печататься буквы 'EE'. В некоторых взломанных версиях вы могли видеть именно эти буквы 'EE' в углу экрана, что говорит о том, что где-то кот-то что-то загрузил с ошибкой.
* Из-за того, что твердая поверхность над водой для акульего плавника и раздвижного мостика слева от замка рисуется одной и той же процедурой, правые камни возле мостика окрашиваются в зеленый цвет, так как ширина реки под мостком и акулой разные, а процедура заточена под акулу.
* По традиции предыдущих игр, можно случайно открыть инвентарь в воздухе.
* При переходе с экрана на экран зачем-то обнуляется статус силовой пилюли. Возможно, раньше по задумке авторов она вела себя как-то по-другому.
Ошибки:
* В функции определения твердости материала есть ошибка. Для вычисления твердости материала под правым краем спрайта используется 8-битная арифметика, следовательно атрибуты спрайта не должны попадать на границу параграфа ($100 байт). Однако сам закадровый буфер экрана расположен по адресу $5DE4, и поэтому в течении одной строки атрибутов два раза на игровом экране встречается переход из параграфа в параграф ($5DE4->$5E04 и $5EE4->$5F04), что может привести к ложному определению твердости атрибутов в данной позиции экрана.
* Во время второго сеанса игры Закс белый, если был уничтожен в предыдущую игру (из-за белого облачка в которое превратился).
* Если Диззи падает на экране с Гарпией вертикально вниз, и Гарпия находится ровно над ним вверху экрана, то при попадании на экран ниже, Диззи будет убит Гарпией, т.к. при пересечении с гарпией отсутствует проверка, находится Диззи на экране с ней, или же экран поменялся. Такая же ошибка была с вампиршей, но авторы пофиксили ее, а с Гарпией нет.
Это вообще проблема движка, когда в момент перехода на другой экран координаты Диззи уже новые, а экран старый, и опасные обьекты с предыдущего экрана могут убивать Диззи.
Дополнительная проверка производится движком только в случае вампирши и воды. А со всеми остальными опасными обьектами не производится. Поэтому можно потерять немного энергии, выходя с экрана с летучей мышью, когда она находится у другого края экрана.
* Некоторые персонажи после превращения в облачко оставляют после себя мусор.
Это связано с тем, что персонажи или предметы на месте облачка печатаются по MOV, а облачко печатается и стирается по XOR. В результате, если при первичной отрисовке экрана сначала нарисовался первый кадр облачка по XOR, затем на него по MOV наложился предмет, то стереть первый кадр по XOR уже не получится. Из-за этого в конце анимации остается мусор.
Так происходит с исчезновением Барта, Доры, Дози.
А перед исчезновением Барта, он вообще сперва печатается поверх текста с инвентарем, если вы успеете это заметить.
* Из-за ошибки, первый кадр появления Доры из лягушки перед облачком - это алмаз (не заметили? не заметили? А это правда)
Тоже самое с появлением джина.
* Выложив предмет на поверхность, ниже нижнего знакоместа экрана, можно пробить пол и улететь неизвестно куда. Например, на низком камне на экране с Мефистофилем.
* Также можно пробить потолок огнем факела, и выпрыгнуть в образовавшуюся дырку.
* В яме с шипами можно застрять, если упав в яму перейти с одного экрана с шипами на другой.
* В алгоритме салюта в конце игры авторами задумывалась синхронизация, чтобы салют вылетал равномерно. Но, видимо, из-за ошибки, эта синхронизация ни на что не влияет. Поэтому салют то убыстряется (когда мало точек на экране), то замедляется.
Сам салют идет фиксированное время, и его никак нельзя прервать.
Скрытый текст
Салют состоит из трех пучков по 50 точек в каждом.
Для каждого пучка снизу экрана сначала вылетает крупная точка из случайной позиции и со случайной скоростью. Когда вертикальная скорость замедляется до 0, крупная точка взрывается на 50
мелких. Когда первая в списке из 50 точек падает ниже экрана, цикл пучка салюта прекращается и генерируется новый. Для генератора случайных чисел используется область ПЗУ в диапазоне $1000..$1100.
При этом, не смотря на то, что скорость точек генерируется, как дробная с фиксированной точкой, на деле используется только целая часть.[свернуть]
* Загадки музыкального плеера в отдельном посте.