Исправлен баг с зависанием при «контузии» после падения с двух этажей на падающий пол. Проявлялось редко, т.к. такие ситуации нечасты. Но был замечен и исправлен. А также выяснена причина засорения экрана остатками плит в некоторых случаях. Завтра поправлю. Почему это нельзя сделать днем??
Установил виртуальный джойстик (спасибо Yellow Rabbit), и выяснил, что никакого окна калибровки джойстика в оригинальном принце нет. Видимо, там калибровка это совсем не тот процесс, что на БК. Думаю, джойстик можно сконфигурить и просто выводя надписи в нижнюю строку экрана.
Внезапно нашел инструкцию от «Prince of Persia». Было интересно почитать 🙂
Во-первых, обнаружилось, что в Принце все-таки можно было записываться! Для этого надо было нажать Ctrl+G в любом месте игры. Загрузиться можно было при новом запуске игры, нажав Ctrl+L. Но не все было так просто — после нажатия выводилось окно «Найдите такое-то слово в такой-то строке на такой-то страницы инструкции» и игрок попадал в «лабиринт», где ему надо было выпить кувшин с первой буквой этого самого слова. Если кувшин был правильный — открывается дверь и игрок попадает на сохраненный уровень. Если нет — не попадает.
Во-вторых, я нашел там описание управления с джойстика, что, собственно, и искал. Предусмотрен еще процесс калибровки джойстика, должен запускаться по клавишам Ctrl+J. Но запустить этот процесс я не смог, так как джойстик не обнаруживается и все на этом. А джойстика для PC у меня нет. Эмулятор джойстика, что ли, попробовать поискать?
Просто для того, чтобы в игре можно было настраивать свой вариант управления от джойстика, мне нужно сделать какой-то пользовательский интерфейс этой настройки. И я хочу его сделать таким, как он выглядел в оригинале.
Добавил управление от джойстика. Как играть с джойстиком в виде ручки, я слабо представляю, правда. Но вот с джойстиком в виде клавиш должно быть очень удобно. Можно жать кучу кнопок одновременно, а это то, чего не хватает клавиатуре БК. Теперь прыгать с разбегу стало значительно удобнее. Единственное, что пока нелогично — при отпускании на джойстике кнопки «висеть» — принц продолжает висеть, ожидая кнопки «вниз». Это надо подумать как реализовать. Дело в том, что сейчас клавиатура и джойстик обрабатываются одновременно, и если проверять на «на джойстике ничего не нажато», то неизвестно, отпустил ли игрок кнопку джойстика или может у него и джойстика-то нет )) Разве что завести флаг «зацепился, используя джойстик», тогда если в порту 177714 ноль — значит и отцепился на джойстике.
P.S. Сделал такой флаг, посмотрим, всегда ли логично будет работать.
Обнаружил, что в 11-м лабиринте невозможно повторить трюк с проваливанием и цеплянием для добычи кувшина. Слишком далеко отталкивало принца от края при падении в яму. Поправил это дело, и трюк успешно заработал.
Но предстоит глобальная переделка механизма обнаружения препятствий. С одной стороны, это должно ускорить самого принца, так как обнаружение препятствий проходит на каждом цикле вывода принца. С другой стороны это кропотливая работа, сопровождаемая адскими глюками — то не цепляется, то проваливается на ровном месте, то сквозь стены ходит… Помню, помню…. Но если получится ускорение, то оно того стоит 🙂
Падающие плиты плавно перетекли в решетки — с древних времен была проблема с отображением изначально невидимой части решетки, которая становится видимой после того, как плита упала. К тому же, обломки плиты у основания решетки тоже затирали часть решетки. И падающая у основания решетки плита вызывала проблему — решетка продолжала отображать часть плиты, запомненной в качестве фона. Два дня ломания головы и проблема решена. Ура, товарищи!
Решетка курильщика:
Решетка здорового человека:
P.S. Да, принц проходит сквозь решетку в отладочных целях, иначе я заколебался бы попадать в нужные для тестов локации.
Разгребаю тут вывод решеток, по исходникам составил формат списков решеток, связей решеток и управляющих плит и т.д. Конечно это несложно, но приходится восстанавливать по памяти общий механизм работы всего этого. Удивляет отсутствие описаний этих таблиц в исходниках. Неужели было лень записать?
Попалась в столе еще одна старая распечатка принца. И что же я там увидел? А вот что:
Описания-то, оказывается, были! И весьма подробные. А почему же потом они исчезли? Все просто — текст исходника имел ограничения на длину и постепенно «лишнее» было выкинуто. Интересно, что на это описание массивов решеток я наткнулся именно сегодня. Вселенная, как всегда, развлекается.
Еще там обнаружились рисунки Евгения, в стиле Джордана Мекнера:
Продолжаю работу над падающими плитами. Обнаружилось, что если такая плита лежит перед закрытой решеткой, то после падения плиты, решетка выводится с куском уже несуществующей плиты. Это происходило потому что фон под решеткой запомнился тогда, когда плита еще была перед ней нарисована. Надо было это фиксить, конечно. Придумал как — надо читать фон еще когда этой плиты нет перед решеткой, при выводе окна. Ок, прочитал. Пропал верхний уголок над решеткой — потому что фон запомнился когда плиты еще нет, но при этом еще и нет обстановки над решеткой. В итоге потом черный кусок над решеткой. Ок, при выводе решетки читаем нижнюю треть фона, где уже нарисовано все без плиты, а после вывода всего окна — дочитываем верхнюю часть фона. Начинаю тестить — жуть, принц проваливается в пол, вместо решеток — куски памяти, вместо обстановки рисуется шизофрения. Ого! Такого размаха глюководства давненько я не наблюдал!
Если глюки такие масштабные, значит поверх памяти вкатил, наверное, эти половинки фона или стек, может, запортился. В общем, что-то типа этого начинаю искать. Ищу и не нахожу ничего криминального. Как обычно. Плюнул на все, лег спать. Утро вечера всякоразней.
Утром (ну как утром…. в три часа дня) посмотрел свежим взглядом — все супер, никаких ошибок нет. Но все-таки утро рулит — пришла в голову мысль, что эти грабли мне знакомы. А не вылез ли я за пределы страницы памяти? Смотрю размер файла с этими подпрограммами — так и есть, на 20 байт больше, чем влезает в страницу. Кусок программы просто отрезался при загрузке. Перетасовал подпрограммы по разным загружаемым файлам и все ок — фоны читаются, решетки не портятся.
Но пока я все это делал, то решил, что надо все делать по-другому )))
Засиживаюсь иногда до трех часов ночи, когда кажется, что вот-вот и задача будет решена. Ну да, часто так и бывает — или нахожу где ошибка или уже исправляю этот баг. Но иногда это выходит боком. Недавно заметил, что шипы в лабиринтах перестали убираться, когда принц уходит из их зоны действия. Так как я недавно много чего оптимизировал в выводе спрайтов, то решил, что где-то задел проверку на координаты принца при выводе шипов. Сегодня решил исправить. Прошерстил весь контроль шипов — все вроде нормально. Но они не убираются! Делаю отладку, вижу, что принц вышел из зоны. И программа видит это, начинает убирать шипы. Счетчики бегут, спрайты меняются, а на экране шипы как торчали, так и торчат. Что за бред? Начинаю смотреть еще внимательней — да все срабатывает, вот фазы шипов пошли новые, убирающиеся. На экране шипы торчат.
Попил чаю, подумал о вечном.
Смотрю еще раз и вдруг вижу, что старый фон шипов выводится не командами MOV, а BIS! Т.е. вместо затирания старых фаз сохраненным фоном, этот фон накладывается на выведенные шипы. И новые фазы так удачно рисуются, что не вылезают за пределы старых. На экране выглядит так, как будто шипы торчат, а на самом деле там уже нарисовалось еще кучу фаз убирания и шипы убрались.
Ну и откуда там взялся BIS? В исходниках недельной давности там MOV. А потому что нефиг в три часа ночи оптимизировать вывод спрайтов!
Сегодня весь день боролся с одним глюком. В 11м лабиринте есть место с большим количеством падающих плит, они там занимают два экрана. И вот, пробегаю я там для проверки и вижу, что одна плита почему-то не падает. Точнее, в одном экране плита остается висеть вверху, как будто я по ней и не пробегал, а в другом экране почему-то нет на одном месте обломков, хотя плита туда падала и они должны там валяться. Сначала я думал, что дело в том, что принц наступает на плиту, она начинает качаться и тут принц падает в окно ниже. Конечно, думал я, текущее окно сменилось, а фаза плиты, небось, еще не дошла до точки падения и при смене окна фаза обнулилась, что и вызвало застревание плиты. Но в процедуре смены окна вроде бы все было хорошо. Начал отлаживать, вижу, что при смене окна все-таки есть баг, в редком случае плита может еще не успеть упасть и текущее окно у нее не сменится. Исправил. Вообще ничего не изменилось. Снова сижу в отладчике, вылавливаю эту плиту. Все вроде упало, а плита в лабиринте не стерта! Конечно она там выводится, ведь если код плиты остался на месте, то она и должна вывестись! Смотрю место, где плита должна стереться, когда начинает падать. В отладчике дохожу до этой точки и вижу, что плита стерлась. Но через пару кадров она снова в массиве лабиринта появляется! Как так-то? Ага, ведь есть случай «mcfly», когда падающая плита падает на падающую плиту и тогда в лабиринт снова записывается код 15 (падающая плита). Неужели плита умудряется упасть «сама на себя»? Фиг его знает, может что напутал с координатами при смене окна… Но нет, эта подпрограмма не вызывается при трассировке…
Начинаю отслеживать тот момент, когда же вновь появляется код плиты в лабиринте на старом месте. И вижу, что это происходит при восстановлении фона для стирания плиты с экрана! Вот это поворот! Каким же боком восстановление сохраненного под плитой фона влияет на состояние элементов в лабиринте?? Оказывается, в 90х я не дописал толком эти самые падения плит — нет проверок на высоту спрайта плиты при проваливании плиты за границу экрана! Таким образом, когда плита подлетала к нижней границе экрана, фон для нее запоминался с куском данных ЗА этой границей, через адрес 100000. Со 100000 как раз подключена страница с лабиринтом. Фон запоминался, поверх экрана и лабиринта рисовалась плита (!), потом фон восстанавливался и лабиринт тоже. Поэтому и плиты «возвращались» на место — этот кусок данных возвращался на место.
Вот такой вот мегаглюк. Любимый переход через 100000, чтоб его.
Читал у Джордана Мекнера «Сегодня я добавил в игру падающие плиты». Так буднично, как будто он сел такой после обеда, добавил ВСЕ, что связано с этими плитами и пошел кидаться пивными банками в голубей. Там СТОЛЬКО гемора с этими плитами, что они вызывают у меня уже нервный тик! Они должны качаться, они должны лететь через весь лабиринт и сшибать на своем пути другие плиты. Если плита упала на управляющую решеткой плиту — должны сработать решетки. Если принц наступил на такую плиту с самого правого края, затем сразу вбежал в правое окно — часть плиты видна уже слева, и координаты ее надо поменять на левый край, а то она будет продолжать рисоваться справа…. аааа…. Еще плиты не должны ничего затереть, конечно же. А он, блин, «сегодня я добавил плиты»….
Исправил сегодня три бага с плитами. И еще два есть.
Свежие комментарии