Category: Prince of Persia

06
Дек
2020

Продолжение начала начал

Мы разделили задачи — Женя начал писать редактор лабиринтов и движок принца, а я начал рисовать всю графику, которая была нужна для проекта. Рисовать приходилось вручную, поточечно. Никаких переносов графики — количество цветов и разрешение экрана не позволяли это сделать.
Как выглядело рисование в V003? Никаких тебе мышей — только клавиатура. Двигаешь курсор клавишами управления курсором, жмешь номер цвета 1, 2, 3 или 4. Ставится точка красного, зеленого, синего или черного цвета. И вот так рисуешь весь спрайт. Если ты где-то ошибся или вообще стер все — никаких Undo нет, рисуй заново. Если очистил буфер с запомненным спрайтом — тоже рисуй заново. Нарисовал спрайт, но оказалось, что надо сдвинуть его на одну точку влево-вправо для того, чтобы попал на границу байта? Ну, вы уже поняли…

Нарисовать спрайты это только полдела. Надо собрать из них движения. К примеру, принц прыгает через яму с места — это одно движение? Нет, это два движения: «начало прыжка и полет» и «приземление». Почему именно два? Потому что итог прыжка может быть разный — если яма небольшая, то принц приземляется на ноги. Если яма большая — он может в конце прыжка провалиться и зацепиться руками за край плиты. Если очень большая — вообще рухнет вниз. Еще в процессе прыжка его может запилить пила, уколоть стражник, кирпич может внезапно остановить его, если принц решил прыгнуть лбом в стену. Т.е. финалы могут быть разные, хотя начало всегда одно. Все эти финалы должны органично пристыковаться к началу. Значит, надо найти такой момент в движении, где можно его разделить на начало и конец. Автор этим заморачивался глобально, но нам было проще — мы могли это просто вычислить, заставляя принца прыгать туда-сюда и нажимая заветный стоп-кадр.
После того, как все спрайты готовы и движение изучено, нужно подобрать все смещения между спрайтами при выводе. Сначала я делал это вручную, выводя спрайты и записывая в тетрадку кучи цифр. Когда меня забрали в армию и этим продолжил заниматься Женя, он написал для этого специальную утилиту ASSEM, куда можно было загрузить спрайты и двигать каждый из них, проигрывая движение снова и снова. Когда движение начинало выглядеть органично — выгружалась готовая таблица.

Были, конечно, ошибки. Вот недавно я обнаружил, что одно из самых первых движений ‘начало бега’ надо разделить на два, чтобы был возможен короткий пробег и сразу остановка. Такие ошибки обнаруживались регулярно и приходилось все спрайты этого движения собирать заново в ДВА движения. Занятие весьма нудное. Но когда я пару лет назад прочитал книгу Jordan Mechner «The Making of Prince of Persia», я понял, что у него это был вообще глобальный треш))

Я нарисовал все спрайты обстановки, а Женя написал редактор лабиринтов. Потом я сделал почти все спрайты принца и поступил в институт. За отличную учебу меня забрали в армию, так что Женя пару лет занимался принцем один. За это время он собрал из нарисованных мной спрайтов движения и запустил принца в лабиринт. Когда я в мае или июне 94 года приехал в отпуск, он продемонстрировал мне принца, который бегал по лабиринту, прыгал, падал в ямы. Им можно было управлять, это не был мультик. Принц реагировал на команды и на обстановку. Это было офигенно. Нам показалось, что дело почти сделано, что это почти готовая игра)) Сейчас 2020 год, принц до сих пор не готов и вспоминать это смешно.

05
Дек
2020

Начало начал

С Евгением Пашигоровым я познакомился еще когда заканчивал школу. Я тогда писал первые программы на Бейсике, а он уже ваял на ассемблере. Он делал игру ‘Жизнь’ для БК0010. БКшка у него была с пленочной клавиатурой, я впервые такую увидел. У меня сначала БКшки своей не было, приходилось писать проги в кабинете информатики. Потом БК 0010-01 появилась и у нас с братом, благодаря родителям.

Какое-то время мы, конечно, рубились в игры. Но практически сразу начали писать программы, это было страшно интересно. Упершись в быстродействие Бейсика, начали учить ассемблер. Писали всякие каталогизаторы кассет, какие-то простые игрушки. Женя Пашигоров писал язык ЛОГО и всякие навороченные копировщики с повышенной скоростью записи.

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

Одна такая идея (написать принца для БК) появилась после перехода на БК 11М и полного прохождения PC-версии этой игры. Я тогда даже и не подозревал, что Принц изначально был написан для Apple 2. Если бы знал — гораздо быстрее убедил бы Женю начать делать Принца для БК.
В версии для PC при нажатии клавиши ESC игра становится на паузу. Это очень удобно для изучения фаз анимации. Для начала я срисовал в тетрадку все фазы горящего факела. Потом нарисовал все эти фазы в БКшном графредакторе V003. Вообще-то он называется GRED, но на кассете исполняемый файл графредактора назывался V003, так и прижилось это название.
Я нарисовал фазы пламени, сделал из них демку горящего факела и увидел, что это хорошо. Потом добавил второй факел. Два факела горели отлично, но на пустом черном фоне смотрелись как-то странно. Показал эту демку Евгению. Особого впечатления на него это не произвело, по-моему.

Я решил дорисовать обстановку для «интерьера». Срисовал в тетрадку плиту, арку, кирпич, набрал их на БК. Попытался этими спрайтами нарисовать один экран подземелья и увидел, что все получается сплюснутым по вертикали. Разрешение экрана на БК другое и это сказалось. Пришлось спрайты изменить: сжать по горизонтали и растянуть по вертикали. Но автоматически сделать это не вышло — на плите получился кривой орнамент. Пришлось нарисовать элементы самостоятельно, но с сохранением похожести.

Теперь факелы горели в родной обстановке и смотрелось это интересней. Женя посмотрел, покрутил ус, как обычно, сказал что-то типа «ну, прикольно, но где принц?». Я решил срисовать какое-то движение принца и вставить его в эту демку. С помощью волшебной кнопки ESC фазы бега принца были срисованы в тетрадку и набраны в V003. В итоге в демке появился принц, который пробегал через экран слева направо. И был он тоже сплюснутым. Пришлось вручную исправлять все фазы принца, чтобы он не выглядел мультяшным героем, пострадавшим от промышленного пресса.

Таким образом, я срисовывал все новые движения (прыжок с места, висение на плите с качанием и залезанием наверх), делал из них демки и показывал Жене. Сначала он говорил, что я маньяк и смеялся. Потом крутил свой ус все более задумчиво и в какой-то момент критическая масса сработала — он прикинул объем спрайтов принца,  которые я уже сделал, и увидел, что в память БК 11М их не так уж нереально вместить. Тут уже пошло активное обсуждение как можно сэкономить память, как можно реализовать вывод на экран немигающих спрайтов… И лед тронулся!

05
Дек
2020

Двигаемся!

Много чего сегодня сделал:

  • прыжок с разбега
  • отталкивание от стены при падении
  • теперь сразу падаем, если в прыжке вперед попали в стену и внизу нет опоры (раньше принц останавливался в воздухе, чесал репу и только потом обнаруживал, что стоит на пустоте)
  • разворот на месте правильно ищет опору
  • разворот с заносом правильно ищет дыры и стены
  • поломано измерение высоты при падении, т.к. теперь принц падает не так, как раньше

Что осталось сделать из обработки препятствий:

  • полностью фехтование
  • нажимание-отпускание кнопок
  • обработка проваливающегося пола, в том числе падение плиты на голову
  • маленький шаг и все, что связано с ним (выравнивание на краю плиты и у опасных механизмов)
  • уход в дверь (ну, это фигня)
  • хватит игнорить решетки ))

Раньше все это было, конечно, кроме решеток, падения плит на голову и выравнивания у опасных механизмов. Но, так как движок новый, то приходится делать все заново…

Что вообще осталось доделать:

  • новый формат данных о стражниках, т.к. все-таки надо изначально задавать в какую сторону смотрит каждый стражник
  • в 8-м лабиринте сразу ДВА разных по интеллекту стражника, а пока что подразумевался только один алгоритм боя на лабиринт
  • в третьем лабиринте скелет вернуть на место и сделать все, что связано с его подлым возникновением
  • распилить движение начала бега на два, т.к. принц в оригинале может остановиться быстрей, чем у нас
  • сделать «левитацию»
  • реализовать кровищу на пиле?
  • перерисовать спрайты дворцов для другой палитры
  • звук на AY
  • исправить маски обломков и арки

Глобальные доработки, которые можно сделать:

  • сделать маски ко всем спрайтам принца и стражников, перестать их вычислять на лету и надеяться на ускорение
  • грузить сразу все спрайты в память СМК и больше не обращаться к диску при фехтовании

 

 

04
Дек
2020

Прыжки

Обрабатывал напильником прыжок с места. Обратил внимание, что если прыгнуть через яму, тут же развернуться на месте и прыгнуть назад, то принц не долетает до старого места! Что за ерунда? Неужели прыжок вправо длиннее, чем прыжок влево?

Искал, искал ошибку — вроде все ок. Решил проверить длину прыжка в оригинале.

И вдруг:

Значит так и должно быть 🙂

P.S. AdamBazaroff подсказал, что так и должно быть — после прыжка принц делает шажок, потому в обратную сторону и не долетает. Что я могу сообщить по этому поводу? Ночью надо спать, а не править баги 🙂

03
Дек
2020

Начинаем приседания!

Приседания — это вам не просто так. Если игрок нажал клавишу вниз, это еще не значит, что принц должен просто присесть. Если он при этом стоит спиной на краю плиты, а сзади пусто — надо не садиться, а слезать. Если он стоит лицом к яме и на самом краю, то он тоже не должен садиться — он должен спрыгнуть вниз. А вот если не на самом краю, а чуть дальше от края — надо сесть. Но тут тоже есть нюанс: когда принц будет вставать, он наклонится над этой ямой и по его передним координатам определится пустота, но он не должен туда упасть, ведь под ногами есть опора. Но эта опора может и уйти из-под ног, если там падающий пол…

Вот сколько вариантов обработки простого нажатия кнопки «вниз»….

Но в целом, принц движется шустрее, чем на старом движке 🙂

28
Ноя
2020

И еще шаг

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

Долго не мог понять почему принц не хочет цепляться руками за опору при прыжке. И так и сяк крутил — вроде и опору видит и летит рядом. Чего ж не цепляется? Оказалось, все дело в счетчике высоты — если принц пролетел больше двух этажей, то он уже не должен цепляться за попавшуюся опору.  А счетчик показывал неверные данные.

Теперь цепляется 🙂

 

25
Ноя
2020

Понемногу учу принца всему заново

«Вчера его пигалица перемахнула через куст. Он всю ночь рычал от счастья.» Мультфильм «Что случилось с крокодилом».

Постепенно принц научился заново залезать, слезать, не бегать сквозь стены 🙂 Но впереди самое сложное — подбор шага на краю (который раньше был), и подбор шага перед ловушками (которого раньше не было). А также вечный источник глюков — падение. Это просто россыпь возможностей влететь в стену.

Радует, что теперь вносить изменения в систему обработки препятствий гораааздо проще. Нет миллиона сравений, есть таблица. Не радует, что некоторые движения основаны на особенностях спрайтов. Это немного усложняет задачу.

Но в итоге принц (пока что) бегает шустрей, чем при прежней системе.

23
Ноя
2020

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

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

20
Ноя
2020

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

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

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

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

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

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

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

 

19
Ноя
2020

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

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

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