Category: Блог
Двери
Начал работу над дверями. Входные двери должны появляться при входе в лабиринт, потом исчезать. Оказалось, открытые двери не были нарисованы, пришлось рисовать. Теперь двери успешно появляются, но пока не исчезают. Адрес вывода Балбеса при входе тоже будет, как и должен, привязываться ко входным дверям. Поправил несколько глюков, населил первую сцену второго лабиринта (не)живностью.
Доделан загрузчик
Сегодня доделал загрузчик — теперь игра сама читает с диска любой лабиринт без участия OS. Для пробы прогулялся по второму уровню (пока еще почти без нежити). Теперь надо сделать сам процесс перехода, со всеми этими дверями открытыми/закрытыми/исчезающими.
Поиск файла в ANDOS, MKDOS, CSIDOS
Доделал «загрузчик-поисковик» для ANDOS, MKDOS, CSIDOS — трех живых дисковых систем БК. Часть файлов я гружу через ЕМТ 36, как и в Принце, т.к. при любом раскладе это работает, пока из памяти не выброшена сама система. Это заодно решает проблему возможной фрагментации файлов в ANDOS, т.к. при загрузке через ЕМТ 36 ANDOS сама ищет все блоки файла. Так что Принцу на фрагментацию плевать, хотя некоторые почему-то думают, что это не так.
Перед тем, как систему выбросить, нужно на диске найти первые блоки тех файлов, с которыми потребуется работать уже без средств операционки. В каждой системе есть свой способ поиска файлов на диске. Для ANDOS и MKDOS это просто вызовы процедур поиска с определенными параметрами, а вот в CSIDOS это ЕМТ 115, а это значит, что вектор обработчика ЕМТ уже другой, не «десяточный». К тому же, CSIDOS сидит в 7 странице ОЗУ, а остальные в 4-й. Да и имя файла каждой подавай в своем формате для поиска. Пришлось немного поизголяться. Загрузка первых файлов через ЕМТ 36 заодно заставляет системы уже держать каталог нужного диска в памяти, что упрощает (наверное) дело.
P.S. да, я в курсе, что есть «универсальный загрузчик для всех ОС», но так там исходники для новомодного pdpy с километровыми именами меток и прочими наворотами, так что для моей среды разработки (micro1103) переделывать его замаешься.
Вот исходник загрузчика, авось кому пригодится:
;определение среды запуска ;загрузка основных файлов Setup: mov #6000,@#177716 ; 1-40k, 4-100k mov #4000,r1 mov #fnmtab,r5 1l: tst (r5) beq 0e call @#lemt36 ;загрузка через емт36 br 1l 0e: ;определяем OS, пока не испорчена стр 7 (там csidos) clrb @#rundos ;0=Andos 1=MKDOS 377=CSIDOS mov @#120000,r5 cmp r5,#517 beq 0andos cmp r5,#460 bne 0csi incb @#rundos call @#mksrch ;поиск в mkdos br 0all 0csi: comb @#rundos call @#cssrch ;поиск в csidos br 0all 0andos: call @#ansrch 0all: ;r0=первый блок LEVELS.DAT ;вписываем начальные блоки всех лабиринтов mov #filtab,r1 mov #5,r2 0fl: mov r0,(r1)+ add #12,r0 sob r2,0fl ;грузим на стр 7, теперь csidos можно портить mov #fnmtb2,r5 call @#lemt36 .... ret cssrch: ;ищем в CSIDOS mov #54400,@#177716 ;7 в 40к, нужно для CSI call @#45010 ;init mov #csidoz,r0 emt 115 bcc 0ok halt ;не нашли 0ok: mov @#41524,r0 ;адр записи о файле mov 16(r0),r0 ;номер первого блока mov #100113,@#30 ;восстанавливаем вектор ЕМТ БК0010 ret ansrch: ;поиск в каталоге ANDOS mov #flevls,r1 call @120216 bcc 0ok halt 0ok: ;вычисляем начальные блоки mov 32(r2),r0 ;нач кластер из каталога inc r0 asl r0 asl r0 ;номер блока ret mksrch: ;поиск в каталоге MKDOS mov #mklvls,r3 mov #bemt36+6,r4 mov #17,r0 0m: movb (r3)+,(r4)+ ;вписываем имя sob r0,0m mov #bemt36,@#306 mov @#120014,r3 ;адр буфера чтения каталога call @120026 bcc 0ok halt 0ok: mov 20(r3),r0 ret lemt36: mov #40000,@#bemt36+2 ;адр загрузки cmp (r5),#6000 ;lbhisub? bne 2l mov #62000,@#bemt36+2 ;для lbhisub другой 2l: mov (r5)+,@#177716 ;стр памяти mov #bemt36+6,r4 ; mov #10,r0 0l: mov (r5)+,(r4)+ ;имя файла sob r0,0l mov #bemt36,r1 emt 36 ret fnmtab: .#26000 ;2-40k, 4-100k .a:ANIMS.DAT .b:0 .#0.#0.#0 .#36000 ;3-40k ELTS .a:WALLS.DAT .b:0 .#0.#0.#0 .#16000 ;5-40k .a:MUSIC.DAT .b:0 .#0.#0.#0 .#6000 ;1-40k .a:LBHISUB.DAT .b:0 .#0.#0 .#0 fnmtb2: .#56000 ;7-40k .a:HISUB.DAT .b:0 .#0.#0.#0 flevls: .a:LEVELS DAT .b:0 mklvls: .a:LEVELS.DAT .b:40.b:40.b:40.b:40.b:0 .e rundos: .b:0 .b:0 ;free FILTAB: .#0 .#0 .#0 .#0 .#0 ;номера первых блоков файлов bemt36: .#3 .#40000 .#0 .+60 csidoz: .b:2 .b:0 .#40000 .#220 .a:LEVELS.DAT .+4 .#0 .#1000 .#0 .+22 END
Общий файл лабиринтов готов
Сделал батник для упаковки/перевода в obj/линковки/сборки в единый файл всех лабиринтов. В итоге получается файлик LEVELS.DAT размером 25 килобайт, который расчитан на поблочное чтение в процессе работы игры. Теперь буду писать загрузчик для этого набора данных.
Вот как работает автоматическая сборка:
Заработала нумерация сцен
Перевел на новую систему изменений лабиринта имеющиеся на данный момент случаи. Исправил обнаружение «мешков-бонусов», сломавшееся при переходе на динамический размер лабиринта. Сделал вывод нумерации сцен в правом верхнем углу.
Заработала система упакованных лабиринтов
Итак, сегодня система работы с упакованными лабиринтами заработала в полную силу. Теперь не только распаковываются нужные сцены, но и сохраняются изменения в лабиринтах, внесенные игроком — собранные ключи, бонусы, эликсиры и т.д. Так как распаковка сцены меняются при переходе через телепорт (череп), то обратно упаковывать данные в сцену слишком долго. Поэтому просто создан список изменений для каждой сцены, который применяется после распаковки этой самой сцены. Пришлось изменить способ хранения в лабиринте «шкафов», чтобы не забивать список изменений ненужной инфой. теперь «шкаф» кодируется всего одним байтом. Заодно это сократило и словарь упаковщика, что тоже приятно.
Пока что в список изменений для теста вносятся только собранные ключи, так что надо прикрутить заполнение списка и к остальным вносимым изменениям. И можно будет делать переходы между уровнями. Там уже надо грузить с диска новый уровень целиком. А так как «DOS» уже прибита в памяти, то придется делать это прямым чтением блоков с диска. Чтобы не разгребать кучу вариантов хранения каталога диска в БКшных дисковых системах, поддерживаться будет только ANDOS.
Потихоньку чиню сломанные механизмы
Чиню то, что поломалось при переходе на динамический размер сцены:
- Шериф иногда стрелял «холостыми» — пули не летели. Потому что неправильно определялось смещение в лабиринте для пули. Было перепутано смещение на экране и в лабиринте.
- Черепа иногда ходили по воздуху — древний баг, оказывается. В некоторых случаях некорректно искалась земля под черепом.
- Прыгающий череп стукался о паровые трубы — ну, он впервые их увидел
- Каменная глыба стирала сама себя — неправильно считалось смещение, опять же из-за смены формата
Все это пофикшено. Осталось добить прыгуна, в некоторых местах он находит не ту землю, что надо.
И просто для прикола: фоном слушал Quincy Jones и вдруг обратил внимание, что музыка как раз подходит под происходящее на экране 🙂
Телепорты снова работают
Сегодня удалось-таки прицепить лабиринт в новом формате к игре и заставить его заработать. При переходе из сцены в сцену через телепорт нужная сцена распаковывается из сжатого вида и Балбес запускается в нее. Таким образом, весь уровень уже не занимает страницу 16К целиком. Теперь он занимает меньше 4 килобайт, из которых один килобайт — словарь. Но надо еще доработать напильником движок, а то местами стали черепа по воздуху летать и каменные глыбы ведут себя подозрительно. Все это последствия перехода на динамические размеры сцен.
Заработал новый упаковщик
Итак, новый упаковщик заработал — словарь на новом лабиринте (со всеми выставленными флагами и бонусами) составился успешно, лабиринт загрузился и даже распаковался. Правда, один прикол все-таки вылез — каменная глыба теперь почему-то падает не до земли. Но это связано не с содержимым распакованного лабиринта, а с тем, что сцены теперь переменных размеров и в этом плане я что-то пропустил в обработке поиска земли под глыбой при падении.
P.S. Альбом Quincy Jones «Smackwater Jack» 1971 года просто шикарен.
Свежие комментарии