[r][i][color=gray][url=http://klimaleksus.narod2.ru/Other/realms/215.txt]#215[/url], 13.11.12[/color][/i][/r] [quote=nihonjin]Вооот, это уже лучше, но по-прежнему не открываются субфайлы 018, 021 и 030. Для всех остальных составил список сопоставления:[/quote] Всё взломано! [quote=ViToTiV]VAG - этот тот же RAW, но с заголовком[/quote] Хей? Вы раньше не могли это сказать!? Да RAW – это не RAW совсем, а просто VAG без заголовка… В SDK есть не только инфа по формату, но ещё и библиотеки для собственной конвертации (правда только WAV>VAG) и даже один очень нехилый VAGEDIT.EXE, который воспроизводит этот формат и сохраняет его в WAV. Итак, вот как выглядит VAG-файл: – Заголовок 48 байт. Из них по смещению 12 записан размер, а после него – частота дискретизации. Причём оба числа по 4 байта в формате Big-Endian! Остальное можно оставить пустым. – Данные VAG. Это блоки по 16 байт. Причём первый байт отражает метод сжатия блока, второй байт – флаг зацикливания, а ещё 14 – сам звук по байту на два семпла – итого 28 семплов. Что за сжатие? Это некое число, показывающее, как интерпретировать данные. Причём если поставить мусор, то VAGEDIT.EXE вылетает. Кстати, сам же он имеет 4 методики сжатия, которые на самом деле (я лично вызывал через ENCVAG.DLL) реально изменяют содержимое файла. Что за флаг? Показывает, где в файле находится петля. Обычно она трёх типов: – Без петли. – В петле целиком. – Петля от середины до конца. Нужный байт отмечается флагом 00, 01, 02, 03, 06, 07. Ничем другим! Именно поэтому «02» повторялось через каждые 16 байт… Если заменить мусором, то просто собьётся цикл звучания, но файл останется нормальный. Кстати, петля может указывать только на позиции, кратные 28 семплам. 14 самого звука – это уже полная свобода. Фиг его знает, как интерпретируются биты, но зато затирание их мусором не повреждает файл, а только портит звук в нём. И надо сказать, что содержимое 14-ти байт связано с первым байтом сжатия, но независимо от флага петли. Самое интересное то, что в спецификацию VAG входит некая начальная последовательность, которая должна быть перед каждым звуком – это ровно 16 нулей! Это те самые нули, по которым PSound отлавливает и воспроизводит игровые звуки из уровней. Вот я и решил оттолкнуться от этой пустоты. Я написал «VagFinder», который ищет 16 нулевых байт, а потом копирует нижеследующие данные в новый файл пока не встретит ещё 16 байт пустоты. Либо отменяет операцию, если ему встретилось хоть раз на второй позиции любого блока из 16 байт число, не равное 0,1,2,3,6,7. Всё проверяется довольно аккуратно, прога чистит и пустые файлы, и слишком короткие (<256 байт). В конце заполняются заголовки извлечённых файлов, чтобы их можно было сразу же открыть в VAGEDIT. Я попробовал так извлечь сценки – фиг там! Оказывается, в файлах сценок единственный трек VAG во-первых, разбит на крохотные кусочки и перемешан с [s]дерь[/s] другими данными, а во-вторых, у каждого кусочка (включая первый) отсутствует идентификатор – 16 нулей. Вот почему PSound не мог их обнаружить! Что делать? Оказывается, в начале файла идут указатели. Некоторые из них указывают в никуда, а некоторые – на новый блок указателей, перед которым нули. Во внутреннем блоке указателей адресация уже относительная, а первые четыре байта показывают на начало звукового куска. Причём его длина записана в следующей четвёрке байт. (Ну если дальше смотреть, то ясно, что это WAD структура, где первый субфайл – чисто звук, второй и последующие т – другие ресурсы, может модели, скрипты движения, анимация, текстуры – зато чётко видно, что «на глаз» эти субфайлы между собой ярко отличаются, а внутри монотонны и однородны.) Я бы запросто вытащил звук, если бы смог вытащить адреса этих WAD из общей шапки файла, которая, естественно, не «WAD» (иначе бы AWM её давно раскоцал). Я долго тыкал в указатели, но так и не смог придумать ни одного приемлемого метода, по которому программа смогла бы отличить настоящие указатели от непонятно зачем туда засунутого мусора. Однако я пошёл другим путём, вспомнив, что перед каждым внутренним WAD располагаются нули. Много нулей! Тогда я написал ещё одну прогу («SpyroSound»), которая бы искала большие нулевые части, а потом брала бы первые восемь ненулевых байт как «смещение-размер» и копировала бы область в единый файл. И у меня всё вышло! Только сильно глючило… Пришлось наложить ограничения на область – не более 1Мб, не дальше чем 1024 байта «отсюда». Количество ожидаемых нулей снизил с 256 до 64. Копируемые данные тоже нужно было проверять на соответствие «звуку» – ловить второй байт каждого блока и сравнивать с 0,1,2,3,6,7. И под конец, я поставил ограничение на минимальный размер файла и минимальную нулевую область – они должны задаваться пользователем через входные параметры командной строки (в bat-файле я установил 8 нулей для поиска и 6000 байт минимальный размер части) В сценках частота дискретизации _кажется_ 22050, это число тоже передаётся через параметры. Для первой программы я сделал сразу четыре bat-файла, в которых предлагается 8000, 16000, 11025, 22050 Гц. Как вы уже поняли, всё работает через перетаскивание на BAT. – Чтобы вытащить трек из сценки, перетащите субфайл на «Cutscene.bat». Если появится «.vag», значит успешно. Перетащите его на VAGEDIT.EXE и прослушайте. – Чтобы вытащить звуки из уровня, перетащите весь субфайл (или только его первый суб-субфайл) на «Level (*).bat». Должна появится куча «_.vag», в которых лежать отдельные звуки. Их тоже можно сразу перетаскивать в VAGEDIT. Что с заменой на свои треки? Рано. Сначала хорошенько протестируйте мою программу на всех сценках, многих уровнях, а также на Spyro1 и даже Spyro2. И если она не даст слабину (например бывало, что при неправильных настройках в звуке слышны щелчки или наоборот выпадающие отрывки), то можно будет написать ещё две (три) программы: Одна для внедрения VAG обратно туда, откуда он взялся – если из уровня, то просто по адресу; если из сценки, то другая программа должна и его нарезать в соответствующие части, по запомненным смещениям. Вторая – чисто для создания нашего VAG из WAV. Для этого я подгружу ENCVAG.DLL, и буду поблочно преобразовывать данные, однако оставлять заводской флаг цикла, чтобы не нарушать повторяющееся звучание. Всё! Ссылка: http://klimaleksus.narod2.ru/Files/1/VagFinder.rar Проверьте. И ещё ответьте что-нибудь по моим соображениям о своём 3D редакторе…