Author: grf

23
Ноя
2020

Обработка препятствий

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

20
Ноя
2020

Обработка препятствий

Самая страшная подпрограмма в принце — обработка препятствий. Изначально написал ее Евгений, когда обучал принца бегать по лабиринту. Сначала бегать, потом прыгать, потом слезать-залезать и так далее. На каждом этапе добавлялось проверок на то, какие где расположены объекты, можно ли за них зацепиться и надо ли… Потом в эту подпрограмму (OBST) уже я начал добавлять всякие проверки. Потом вдруг выяснилось, что некоторые движения невозможно реализовать, так как они были изначально неправильно попилены на части. Пришлось пилить дополнительно. Добавлять проверок. Женя уже тогда называл все это не иначе чем «спагетти». Да, страшное там дело в итоге получилось. И самое фиговое, что весь этот макаронный трешак вызывается на КАЖДОМ кадре игры, так как в любой момент принц может провалиться, напороться на стену и т.д. А значит, это все дает нихилый вклад в пожирание быстродействия. Пару раз я уже пытался оптимизировать OBSTacle, но там тронешь одно — рушится все )) Принц начинает сходить с ума, прыгать внутрь стен, проваливается в ПЗУ… Отвратительно себя ведет.

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

Для начала я решил нарисовать блок-схему имеющейся системы обработки препятствий. Рисовал часа два.

Вот что получилось:

Влезло почти все, что было в исходнике OBST1. Я порадовался. А потом вспомнил, что есть еще файл OBST2…. Рисовать его уже негде, так что придется обойтись тем, что есть.

Итак, завтра я полностью сломаю Принца 🙂 Если заработает новая версия и она будет быстрая, это будет круто. Если же круто не будет — придется вернуть старые спагетти.

 

19
Ноя
2020

Очередной баг изловлен

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

Установил виртуальный джойстик (спасибо Yellow Rabbit), и выяснил, что никакого окна калибровки джойстика в оригинальном принце нет. Видимо, там калибровка это совсем не тот процесс, что на БК. Думаю, джойстик можно сконфигурить и просто выводя надписи в нижнюю строку экрана.

18
Ноя
2020

Инструкция от Prince of Persia

Внезапно нашел инструкцию от «Prince of Persia». Было интересно почитать 🙂

Во-первых, обнаружилось, что в Принце все-таки можно было записываться! Для этого надо было нажать Ctrl+G в любом месте игры. Загрузиться можно было при новом запуске игры, нажав Ctrl+L. Но не все было так просто — после нажатия выводилось окно «Найдите такое-то слово в такой-то строке на такой-то страницы инструкции» и игрок попадал в «лабиринт», где ему надо было выпить кувшин с первой буквой этого самого слова. Если кувшин был правильный — открывается дверь и игрок попадает на сохраненный уровень. Если нет — не попадает.

Во-вторых, я нашел там описание управления с джойстика, что, собственно, и искал. Предусмотрен еще процесс калибровки джойстика, должен запускаться по клавишам Ctrl+J. Но запустить этот процесс я не смог, так как джойстик не обнаруживается и все на этом. А джойстика для PC у меня нет. Эмулятор джойстика, что ли, попробовать поискать?
Просто для того, чтобы в игре можно было настраивать свой вариант управления от джойстика, мне нужно сделать какой-то пользовательский интерфейс этой настройки. И я хочу его сделать таким, как он выглядел в оригинале.

Интересная дока, в общем, полезная.

26916_Extra document_Manual

17
Ноя
2020

Джойстик!

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

P.S. Сделал такой флаг, посмотрим, всегда ли логично будет работать.

16
Ноя
2020

Падение — еще одна любимая мозоль

Обнаружил, что в 11-м лабиринте невозможно повторить трюк с проваливанием и цеплянием для добычи кувшина. Слишком далеко отталкивало принца от края при падении в яму. Поправил это дело, и трюк успешно заработал.

 

Но предстоит глобальная переделка механизма обнаружения препятствий. С одной стороны, это должно ускорить самого принца, так как обнаружение препятствий проходит на каждом цикле вывода принца. С другой стороны это кропотливая работа, сопровождаемая адскими глюками — то не цепляется, то проваливается на ровном месте, то сквозь стены ходит… Помню, помню…. Но если получится ускорение, то оно того стоит 🙂

16
Ноя
2020

Алилуйя!

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

Решетка курильщика:

 

Решетка здорового человека:

 

P.S. Да, принц проходит сквозь решетку в отладочных целях, иначе я заколебался бы попадать в нужные для тестов локации.

P.P.S. Пофиксил затирание арки неверной маской столба:

16
Ноя
2020

Архивные записи

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

Попалась в столе еще одна старая распечатка принца. И что же я там увидел? А вот что:

Описания-то, оказывается, были! И весьма подробные. А почему же потом они исчезли? Все просто — текст исходника имел ограничения на длину и постепенно «лишнее» было выкинуто. Интересно, что на это описание массивов решеток я наткнулся именно сегодня. Вселенная, как всегда, развлекается.

Еще там обнаружились рисунки Евгения, в стиле Джордана Мекнера:

Ну, а тут просто рыбу заворачивали:

15
Ноя
2020

Старые грабли

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

Если глюки такие масштабные, значит поверх памяти вкатил, наверное, эти половинки фона или стек, может, запортился. В общем, что-то типа этого начинаю искать. Ищу и не нахожу ничего криминального. Как обычно. Плюнул на все, лег спать. Утро вечера всякоразней.

Утром (ну как утром…. в три часа дня) посмотрел свежим взглядом — все супер, никаких ошибок нет. Но все-таки утро рулит — пришла в голову мысль, что эти грабли мне знакомы. А не вылез ли я за пределы страницы памяти? Смотрю размер файла с этими подпрограммами — так и есть, на 20 байт больше, чем влезает в страницу. Кусок программы просто отрезался при загрузке. Перетасовал подпрограммы по разным загружаемым файлам и все ок — фоны читаются, решетки не портятся.

Но пока я все это делал, то решил, что надо все делать по-другому )))

 

14
Ноя
2020

Ночная шиза

Засиживаюсь иногда до трех часов ночи, когда кажется, что вот-вот и задача будет решена. Ну да, часто так и бывает — или нахожу где ошибка или уже исправляю этот баг. Но иногда это выходит боком. Недавно заметил, что шипы в лабиринтах перестали убираться, когда принц уходит из их зоны действия. Так как я недавно много чего оптимизировал в выводе спрайтов, то решил, что где-то задел проверку на координаты принца при выводе шипов. Сегодня решил исправить. Прошерстил весь контроль шипов — все вроде нормально. Но они не убираются! Делаю отладку, вижу, что принц вышел из зоны. И программа видит это, начинает убирать шипы. Счетчики бегут, спрайты меняются, а на экране шипы как торчали, так и торчат. Что за бред? Начинаю смотреть еще внимательней — да все срабатывает, вот фазы шипов пошли новые, убирающиеся. На экране шипы торчат.

Попил чаю, подумал о вечном.

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

Ну и откуда там взялся BIS? В исходниках недельной давности там MOV. А потому что нефиг в три часа ночи оптимизировать вывод спрайтов!