Начинаю собирать анимацию заставки
Спрайты анимации все нарисованы, начинаю собирать из них мультик. Сначала хотел применить движок от принцевской заставки, но там много лишнего, так что решил сделать новый.
Первый пошел:
Блог разработчика
Спрайты анимации все нарисованы, начинаю собирать из них мультик. Сначала хотел применить движок от принцевской заставки, но там много лишнего, так что решил сделать новый.
Первый пошел:
Начал работу над дверями. Входные двери должны появляться при входе в лабиринт, потом исчезать. Оказалось, открытые двери не были нарисованы, пришлось рисовать. Теперь двери успешно появляются, но пока не исчезают. Адрес вывода Балбеса при входе тоже будет, как и должен, привязываться ко входным дверям. Поправил несколько глюков, населил первую сцену второго лабиринта (не)живностью.
Сегодня доделал загрузчик — теперь игра сама читает с диска любой лабиринт без участия OS. Для пробы прогулялся по второму уровню (пока еще почти без нежити). Теперь надо сделать сам процесс перехода, со всеми этими дверями открытыми/закрытыми/исчезающими.
Доделал «загрузчик-поисковик» для 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
Поразбирался сегодня с форматами каталогов и встроенными в эти системы командами поиска файлов. Написал пробный код поиска файла для каждой. Везде успешно нашелся начальный блок для файла LEVELS.DAT. Решил все-таки сделать поддержку всех трех систем.
Сделал батник для упаковки/перевода в obj/линковки/сборки в единый файл всех лабиринтов. В итоге получается файлик LEVELS.DAT размером 25 килобайт, который расчитан на поблочное чтение в процессе работы игры. Теперь буду писать загрузчик для этого набора данных.
Вот как работает автоматическая сборка:
Перевел на новую систему изменений лабиринта имеющиеся на данный момент случаи. Исправил обнаружение «мешков-бонусов», сломавшееся при переходе на динамический размер лабиринта. Сделал вывод нумерации сцен в правом верхнем углу.
Итак, сегодня система работы с упакованными лабиринтами заработала в полную силу. Теперь не только распаковываются нужные сцены, но и сохраняются изменения в лабиринтах, внесенные игроком — собранные ключи, бонусы, эликсиры и т.д. Так как распаковка сцены меняются при переходе через телепорт (череп), то обратно упаковывать данные в сцену слишком долго. Поэтому просто создан список изменений для каждой сцены, который применяется после распаковки этой самой сцены. Пришлось изменить способ хранения в лабиринте «шкафов», чтобы не забивать список изменений ненужной инфой. теперь «шкаф» кодируется всего одним байтом. Заодно это сократило и словарь упаковщика, что тоже приятно.
Пока что в список изменений для теста вносятся только собранные ключи, так что надо прикрутить заполнение списка и к остальным вносимым изменениям. И можно будет делать переходы между уровнями. Там уже надо грузить с диска новый уровень целиком. А так как «DOS» уже прибита в памяти, то придется делать это прямым чтением блоков с диска. Чтобы не разгребать кучу вариантов хранения каталога диска в БКшных дисковых системах, поддерживаться будет только ANDOS.
Благодаря идее Братца Кролика, найден способ расширить диапазон значений словаря упаковщика, за что ему большое мерси. А я уже собирался снова править формат лабиринта. Прыгающий череп тоже пофикшен. Автоматизирован процесс упаковки и сборки уровня из отдельных сцен.
Свежие комментарии