Идея с очередями звуков оказалась перебором. На самом деле очереди только мешали. Звуки становились в очередь, доигрывались целиком и это как раз оказалось лишним. Три фрезы, стоящие рядом, наглядно показали, что каждый звук должен прозвучать вовремя, а не когда закончится предыдущий.
Сегодня сделал часть движка, ответственного за звуки. Он принимает «заказы» на проигрывание звуков событий в определенном канале (левом, правом, среднем), ставит их в три независимые очереди и потом играет их по таймеру. Накатал небольшую программу проверки, которая сыпала события, движок успешно все переварил. Вылез один хитрый баг, из-за которого именно звук встающего скелета не воспроизводился в правом канале. Как всегда, после исправления удивился как вообще что-то игралось))
Вчерась ехал в поезде, прямо в поезде накатал менеджер звуков на AY, который раскодирует звуки afx-формата и выводит их в требуемые каналы. По приезду набрал — работает. Теперь ему можно подкидывать события типа «выдать звук упавшей плиты слева» и он его поставит в очередь и выведет слева, одновременно играя другие звуки в других каналах. В оригинальном принце на PC никаких стерео-эффектов нет, вроде бы. Почему? Посмотрим, как это будет звучать в самой игре) Должно быть интересно.
Звуки получаются очень маленькие по размерам данных — 20 байт, 70. Решил декодер в «psg» пока не делать, сделал сразу проигрыватель afx, тем более что регистр микшера все равно на лету приходится конфигурить.
Итак, занялся вплотную звуками. Как сделать звуки? Как обычно: записать с микрофона удары молотком по рельсу на фоне отбойного молотка, в лучших традициях ранних Депешей. Но вот незадача — нужны звуки на AY, в виде всяких там периодов и частот шума. Поискал софт для создания звуков, нашел несколько редакторов. Но мои синусоиды, нарисованные в стиле импрессионизма, никаких вменяемых звуков не выдавали. Пришлось смотреть как сделаны другие «сэмплы», звучащие круто. Математический смысл вроде понятен. Но вот как взять и нарисовать звук «железных челюстей, с грохотом смыкающихся, с низкочастотным ударом и металлический звоном»? Фиг его знает. Но я в итоге нарисовал:
Ок, звучание меня устроило. Вроде бы очень даже похоже и на удар и на звон такой с легким эхом:
Что с этим делать дальше? Редактор позволяет выгрузить звук в нескольких форматах: afx и двух вариантах текстового формата. В доке есть описание формата afx:
Формат одиночного эффекта, расширение .afx
Каждое прерывание кодируется последовательностью байт, их количество может изменяться в зависимости от изменений значений тона/шума/громкости в текущем прерывании. Сначала идёт информационный байт:
bit0..3 Громкость
bit4 Запрещение T
bit5 Изменение T
bit6 Изменение N
bit7 Запрещение N
Если установлен bit5, далее следуют два байта со значением тона; если установлен bit6 - байт со значением шума; если установлены оба этих бита - сначала идёт значение тона, потом шума; если не установлен ни один - сразу идёт следующий информационный байт.
Конец эффекта помечается последовательностью байт #D0,#20. Плеер должен определять её до вывода в регистры (сравнением значения шума на = #20). В редакторе за признак конца эффекта считается последнее ненулевое значение громкости, вне зависимости от остальных параметров.
Как я уже знал из различных док, примеров и ценных советов гуру, самый быстрый способ выводить звук на AY — писать в его регистры уже готовые данные, не вычисляя ничего на ходу. Иначе говоря, мне нужно было преобразовать мой AFX в PSG-формат. Порылся на просторах интернета — конвертера не обнаружил. Придется самому. Берем блокнот и декодируем:
-- 000
EF Инф байт 1110 1111
Громкость F (17)
bit 4=0 разрешено Т
bit 5=1 далее значит два байта со значением тона
bit 6=1 и еще байт шума
bit 7=1 запрещение шума
88 байт тона 210
0B байт тона 13
17 байт шума 27
-- 001
EE Инф байт 1110 1110
Громкость E (16)
bit 4=0 разрешено Т
bit 5=1 далее значит два байта со значением тона
bit 6=1 и еще байт шума
bit 7=1 запрещение шума
83 байт тона 203
0C байт тона 14
10 байт шума 20
Вколачиваю полученные значения в таблицу в исходник тестового «плеера», накиданного за 5 минут, которые просто хватает данные из этой таблицы и пишет в регистры 4,5,6,7,10 AY. Компилирую, запускаю — какое-то хрипение. Ну, особо никто и не надеялся, как всегда какой-то косяк. Ага, перепутал биты в канале управления регистра C. Исправляем, запускаем:
Оуууууееее!!
Теперь, правда, надо создать все другие звуки принца… А там, помимо бряцания и клацания, есть весьма непростые, типа перерубаемого принца, воплей падения и прочих звуков органического происхождения. Будем, значит, сочинять ))
Ну, и конвертер написать придется, а то на бумажке конвертить не очень интересно ))
Потребовалось некоторое время отвлечься на работу, бывает! Сегодня снова занялся принцем. Наконец-то исправил старейший баг с обрезанием рук принца при выходе их в верхний экран. Теперь принц висит на стене как положено:
Раньше же руки ему в этом случае обрезались по самую голову. Я уже как-то пытался исправить этот глюк но не нашел места, в котором бы вообще проверялась верхняя граница спрайта, т.к. писал это еще Женя. И сегодня я все-таки понял почему. Я не мог найти такого места, потому что нигде она и не проверялась. Если попадался вывод в элемент верхнего окна, то принц тупо не накладывался на этот элемент вообще, потому никаких запчастей выше уровня кирпича и не могло быть.
Исправил глюк, возникший после переделки вывода падающих плит (в сотый раз уже).
Заметил, что в принца уже можно играть как вполне в рабочую игру ))
BUG: если стражник дохнет на кнопке то заменяет ее на фрезу!
BUG: двойник из зеркала вылезает в экран слева
BUG: взятие меча с глюками при складывании после отказа от свопа
BUG: после двойника в 4-м стражник тоже как двойник
BUG: после прыжка сквозь зеркало должна остаться одна жизнь
BUG: у зеркала должна быть маска
BUG: у ковра тоже должна быть маска
BUG: в 10м можно впрыгнуть сквозь решетку слева внизу
BUG: принц уходит с кнопки, на которую упали обломки, и она поднимается
BUG: стражник не реагирует на звук прыжка с высоты
BUG: если на экране несколько фрез, то кровавыми становятся все, а не только та, которая запилила
BUG: при входе в первый лабиринт контузия быть должна, а жизнь теряться не должна
BUG: при входе должно быть 3 жизни
BUG: неверно было распределены лабиринты по двум файлам
Ну и теперь принц уже должен сам брать меч, изначально его нет.
Переход на загрузку всего в SMK позволил убрать загрузку спрайтов фехтования, теперь просто подключается страница с ними. Раньше при начале боя грузились спрайты с винчестера, для этого приходилось подключать ПЗУ контроллера винта. После боя снова грузились спрайты бегающего принца. Это позволяло экономить память, но больше такой своп особо применить было негде: все остальные спрайты принца и текущего лабиринта могут понадобиться в любой момент.
Для того, чтобы отвязать принца от ANDOS-зависимости, я переделал загрузчик. Теперь все данные при старте грузятся в доп.память SMK и больше обращений к жесткому диску нет. Все грузится через стандартное ЕМТ 36, больше нет никаких поисков по FAT и блочного чтения напрямую с винта. Пришлось поломать голову над неочевидными вещами в SMK. А в CSI-DOS еще и каталоги оказались реальными, от чего я давно отвык на ANDOS ))
Продолжил править маски объектов. Наконец-то нормальную маску получили обломки. Раньше для них использовалась маска обычной плиты, и если в подвалах это было не особо заметно, т.к. там торец плиты черный, то в дворцах это очень бросалось в глаза, когда обломки лежали у стены. Они накладывались на стену или решетку и выглядело это ужасно. Теперь все как положено. К тому же и принц теперь бродит среди обломков правильно — отдельные камни закрывают ступни.
Выглядело это так:
Теперь вот так:
Сделал кровищу на пиле. Т.к. в палитре подвала нет красного цвета, пришлось сделать кровь черной.
Стыковал сегодня спрайты: арки и плиты, столбы и решетки, а также столбы и столбы. Избавлялся от надоевших черных прочерков между столбами. Оказалось, не так все просто — из-за использования псевдоцвета столб стыковался с решеткой, но не стыковался сам с собой. Хорошо, что в таблице элементов обстановки для подвалов есть пустые места (потому как в дворцах больше элементов, чем в подвалах), там я и добавил новый элемент «смещенный столб», который теперь стыкуется с нормальным столбом. Починил недавно поломанный механизм нажимания кнопок упавшими плитами.
Свежие комментарии