[r][i][color=gray][url=http://klimaleksus.narod2.ru/Other/realms/321.txt]#321[/url], 06.02.13[/color][/i][/r] Люди! Я снова не успел написать ничего по делу, зато создал полноценный алгоритм замены нашего звука в WAD. Поэтому я обещаю всех процитировать (потому что сказать мне есть всё больше и больше чего) – OldBoy, Bloom7 и ShellyPes – не беспокойтесь, я на всё вам отвечу. А сейчас будет техническая ерунда, которую из всех тут потянет разве что nihonjin (потому что Serlutin никак не вернётся в работу, а OLEG779, который умел разбираться в моих программах, давненько нас не посещал). Сначала об ошибках. Оказывается, моя программа по извлечению звука из сценок работала неправильно! Я искал восемь нолей и ограничил минимальный размер блока. Так оказывается, что нолей может быть четыре, а самый последний блок – сколь угодно маленький. Но к счастью, ошибка затронула только две сценки – «An Evil Plot Unfolds...» и «A Monster to end all Monsters». Ещё к большей удаче, первая сценка «An Evil Plot Unfolds...» была именно той, которую я решил полностью проверить, заменив звук на свой. Каково же было моё удивление, когда в игре прозвучал отрывок (пара секунд) оригинальной дорожки! Зато я сразу исправил свою программу, вытаскивая звук теперь не поиском нулей, а переходя по нехитрым указателям в шапке (и как я раньше их не видел?) – сценки извлекаются теперь мгновенно. Перепроверив все файлы сценок (полученные старым и новым алгоритмом) я обнаружил лишь ещё одну ошибку в «A Monster to end all Monsters» – там пропала цела реплика Бианки «a spell». Теперь файлы перезалиты по старым ссылкам: http://klimaleksus.narod2.ru/Files/SOUNDS/source/W012.mp3 http://klimaleksus.narod2.ru/Files/SOUNDS/source/W030.mp3 Старые ошибочные версии не удалены, а переименованы: http://klimaleksus.narod2.ru/Files/SOUNDS/source/W012_.mp3 http://klimaleksus.narod2.ru/Files/SOUNDS/source/W030_.mp3 Ещё я доработал свой патчер. Теперь он намного (реально намного!) быстрее, менее требователен и выдаёт патчи меньшего размера. Прогонял на 100Мб-файлах, забитых мусором (обнаружив на этом этапе кучу ошибок). Хотел сравнить со старой версией, но просто не смог дождаться, когда же старый патчер закончит обработку! Ссылка: http://klimaleksus.narod2.ru/Files/2/SmartPatcher1V2.rar Принцип работы не изменился, разве что добавил возможность потоковой обработки без предупреждений в bat-сценариях, но пока не придумал, где это можно применить. Также я гарантированно сделал обратный механизм, который возвращает VAG из звуков уровня или сценок обратно в те субфайлы, откуда он был взят. Причём (как помните) сценки и звуки уровня вытаскивают разные программы (вторая более напоминает PSound), а вот возвращает теперь одна. Конечно те версии пришлось доработать, чтобы появлялся также текстовый документ со списком смещений-размеров (число в первой строке – смещение от шапки VAG, которая не взята из файла; для сценок добавлена строка нулей на случай (а прецеденты были), если в сценке этих нулей нет, в то время как среди звуков уровня нули есть всегда). А ещё я придумал небольшой способ, как заставить CdGenPS2 открывать документ и брать файлы из переопределённой папки. Как помните, раньше нужно было либо вручную удалять и заново добавлять файлы, либо называть свои папки так, как было сохранено. Теперь же можно один раз создать проект из какой-нибудь папки с длинным именем, чтобы потом напрямую (автоматически!) заменять его своим. Ошибок, вроде, не выдаёт. Ещё я нашёл (в студии-разработки, которую как-то предлагал steeldragon) консольный конвертор WAV в VAG, но однажды он у меня глюкнул и стал бесконтрольно заполнять файл нулями (ждал до 200Мб!). Так что лучше по старинке пользоваться «VAGEDIT.EXE» (который тоже не без греха и иногда вылетает, если давать ему команды подряд, например, закрыть документ моментально сразу после сохранения) Для объединения VAG я сделал отдельную программу, которая копирует реальное содержимое из одного файла в другой. Из последнего она берёт только флаги циклов и окончаний, чтобы не затереть их. Это гарантирует работоспособность итогового файла по отношению к игре (то есть мы не заменяем их VAG своим, мы лишь встраиваем в него наши звуковые семплы). Ну а ещё я написал мини распаковщик WAD (о да, ещё один…), чтобы можно было работать перетаскиванием файлов. Вообще почти всё тут действует через перетаскивание. Для многих операций перетащить нужно ДВА файла, причём порядок имеет значение! Тот, который окажется под мышью (за который вы держите при перетаскивании) участвует как первый аргумент, а свободный файл (который следует за перетаскиваемым) – как второй. В моём случае это большая разница, поэтому в нижеследующем алгоритме я буду отдельно оговаривать, за какой из двух выделенных файлов нужно тащить мышью. И разумеется, оба они обязаны быть в одной папке… (а вот тот скрипт, на который выполняется перетаскивание, может находиться в любом другом окне). Значит, вот архив со всеми прогами: http://klimaleksus.narod2.ru/Files/2/NewTools.rar Для нижеследующего алгоритма он не нужен (там ещё один архив с дубликатами), но назначение опишу здесь: CdGenFolderChange.exe – заменяет текущую папку в документе проекта CdGenPS2. Подразумевается, что ВСЕ файлы в нём находятся в одной папке. Аргументы – «проект» «папка». Интерфейс – «CdGenMekeCurrent.bat», передаёт перетащенный файл и папку, в которой он находится. Работает так. Изначально создайте папку с длинным именем [spoiler=я использовал такое]C:\a_folder_with_extremly_long_name_for_replacing_it_in_cdgen_ps2_document_with_my_tool_to_allow_user_change_this_path_to_any_useful_value[/spoiler] Поместите все файлы образа в неё. Добавьте их (скомпонуйте образ как следует – со всеми FixLBA и тому подобными заморочками) и сохраните в эту же папку «.ps2» файлик (образ прожигать не надо). Затем перетащите этот документ проекта на «CdGenMekeCurrent.bat» и там появится «.log» файл со смещениями и именами. После этого можно переместить проект и этот лог в любою другую папку, затем при перетаскивании проекта на «CdGenMekeCurrent.bat» программа сама обнаружит «.log» и поймёт, что нужно не создавать путь, а применять новый. Вот и будет применен текущий! FastWad.exe – WAD экспортёр-импортёр. Вытаскивает или вставляет только по одному субфайлу, без особых проверок на ошибки, так что будьте осторожны, с ним можно запросто весь WAD грохнуть. Аргументы (экспорт) – «WAD» «куда извлечь» «номер субфайла» Или так (импорт) – «WAD» «откуда взять» «номер субфайла» «*» Два интерфейса – «WadGet.bat» (экспорт) и «WadPut.bat» (импорт), работают одинаково: Перетаскиваете два файла. Первый (тот, который тащите) должен быть всегда WAD (независимо от действия). Второй, естественно, субфайл (если для экспорта, то нужен созданный пустой файл). Потом сценарий предлагает ввести число – номер субфайла для экспорта или импорта. Как обычно, «1» – первый и так далее. MergeVag1V1.exe – замена слияние VAG звуков. Аргументы – «VAG, в который писать» «VAG, откуда брать данные» Обычно первый – это тот, который напрямую вытащен из игры, в второй – тот, который был получен конвертированием WAV. Часто у них отличается шапка, поэтому программа ищет последнюю нулевую строку (16 байт) в заголовке, и пропускает всё что до неё. Поэтому заменяться будут актуальные данные. Как я уже сказал, копируется по 16 байт, причём второй из них остается от первого файла, а все остальные отбираются у второго. Если второй файл короче, то остаток в первом автоматически заполняется нулевыми семплами (тишиной), но флаг не затирается. Интерфейс – «Merge.bat» делает абсолютно то же самое, то есть напрямую передаёт аргументы. Зачем же он нужен? Ну… там есть «pause» на конце. PutBack1V1.exe – Внедряет содержимое одного файла в другой по документу со смещеньями-размерами. Всё придумано так, что вам даже не придётся заглядывать в эти документы. Аргументы – «откуда взять» «куда положить» Причём используется третий файл «.log» (к имени перевого), без него не будет работать. Интерфейс – «Save.bat». Тоже напрямую передаёт аргументы. Использовать так. Выделяете звук и тот субфайл, откуда вы его достали. Перетаскиваете за VAG (звук). Всё! SpyroSound1V1.exe – старая версия, работает также как и раньше (за исключением документов для возврата звука). Её соответствует интерфейс «Cutscene_old.bat» SpyroSound2V1.exe – новое извлечение сценок. Аргументы – «где искать» «выходная частота» Интерфейс – «Cutscene.bat», автоматически задаёт частоту «22050», ибо такова она во всех сценках Spyro, а в других играх эта программа гарантированно работать не будет (привязана к структуре игровых указателей) Просто перетаскиваете один из субфайлов сценок с известными номерами и получаете VAG + LOG для вставки обратно (через «PutBack1V1.exe» и его «Save.bat») VagFinder1V1.exe – ну про него, надеюсь, все известно: Аргументы – «где искать» «выходная частота» Всё просто! Интерфейсов сразу целая куча, под самые распространенные в игре частоты – «Level (8000).bat», «Level (11025).bat», «Level (16000).bat», «Level (22050).bat». Перетаскиваете интересующий субфайл уровня (а лучше – первый его суб-субфайл) и получаете гору маленьких звуков + столько же документов для возврата. Вот это полезная и универсальная вещь, ибо работать будет везде, где работает PSound, а значит, для перевода Spyro1JAP он нам тоже понадобится… Фух, вроде всё… Теперь мой большой нереальный алгоритм замены звуков уровней и сценок! Цель: – Обратить (пустить задом наперёд) звук испускания пламени Спайро в Sunrise Spring. – Заменить полностью озвучку первой сценки на музыку из титров. – Изменить крики Хантера при падении в Evening Lake на жужжание силовых ворот и плачь родившегося из яйца дракончика. Архив для работы со всем необходимым (кроме GoldWave и Epsxe) : http://klimaleksus.narod2.ru/Files/2/VagChange.rar Папки: other – кое-что не очень нужное; ripGH – риппер для работы с оригинальным образом; ripLITE – пустая папка для риппера урезанной версии; source – исходные коды всех [i]моих[/i] программ; tools – программы, итнтерфейсы, скрипты… в общем, вся суть; work – пустая папка для работы. Начнём: 0) Распакуйте архив, желательно на один локальный диск, на котором есть свободное место, около 2 Гб. Скопируйте содержимое «ripGH» и «ripLITE». Первоначальное расположение Greatest Hits образа игры не важно. 1) Перетащите «Spyro-Year-Of-The-Dragon gh.iso» (образ Greatest Hits) на «GetRip.bat» (из « ripGH »), подождите. (Появятся «Spyro.rip», «Spyro.rip.sectorhead» и «Spyro.rip.sectordata») 2) Запустите «AllFilesGET.CMD», подождите. (Появятся «23`68`SYSTEM.CNF.sectordata», «23`68`SYSTEM.CNF.sectorhead»; «24`380928`SCUS_944.67.sectordata», «24`380928`SCUS_944.67.sectorhead»; «500`166428672`WAD.WAD.sectordata», «500`166428672`WAD.WAD.sectorhead») 3) Переместите «500`166428672`WAD.WAD» в рабочую папку («work») 4) Создайте там новые файлы «Wad_012», «Wad_098», «Wad_098_1», «Wad_134», «Wad_134_1», «Wad_184» – это можно сделать, запуская «CreateFile.bat» (предварительно скопировав его в «work») и переименовывая появляющийся «new_file». (А кому лень, скопируйте пустышки из папки «other»…) 5) Выделите «500`166428672`WAD.WAD» и «Wad_012». Далее, держа мышкой за «500`166428672`WAD.WAD» перетащите их на «WadGet.bat». Введите число «12». 6) Как все поняли, это всего лишь извлечение субфайлов из WAD. Можно конечно и через AWM кому удобно, а можно и так продолжать. Значит далее – повторите эту процедуру на файлах «Wad_098», «Wad_134» и «Wad_184». То есть выделять их вместе с «500`166428672`WAD.WAD» и перетаскивать (держа за «500`166428672`WAD.WAD») на «WadGet.bat». Соответственно вводя «98», «134» и «184». 7) Ещё раз та же процедура, но уже выделив «Wad_098» и «Wad_098_1» – перетащите держа за «Wad_098», ввести «1». Так же и «Wad_134» с «Wad_134_1» перетащите, держа за «Wad_134», введя ещё раз «1». 8) Перетащите «Wad_012» на «Cutscene.bat» (появятся «Wad_012.vag» и «Wad_012.vag.log»). 9) Перетащите «Wad_184» на «Level (16000).bat» (появятся «Wad_184_0.vag» и «Wad_184_0.vag.log») 10) Перетащите «Wad_098_1» на «Level (22050).bat», появится куча мелких файлов. Найдите «Wad_098_1_3.vag» и «Wad_098_1_3.vag.log», переименуйте соответственно в «+Wad_098_1_3.vag» и «+Wad_098_1_3.vag.log» 11) Теперь перетащите тот же «Wad_098_1» на «Level (8000).bat». Найдите «Wad_098_1_53.vag» и «Wad_098_1_53.vag.log», переименуйте соответственно в «+Wad_098_1_53.vag» и «+Wad_098_1_53.vag.log» 12) В последний раз перетащите «Wad_098_1» на «Level (11025).bat». Найдите «Wad_098_1_32.vag» и «Wad_098_1_32.vag.log», переименуйте соответственно в «+Wad_098_1_32.vag» и «+Wad_098_1_32.vag.log» 13) Удалите все лишние файлы – «Wad_098_1_*». Вообще понятно, что сейчас было сделано – из Sunrise Spring извлечены три звука – драконий огонь, ворота силы и плачь яйца, но поскольку они имеют разную скорость воспроизведения, их пришлось извлекать тремя заходами. Конечно можно было вручную подстраивать playback rate на каждый, но я решил так показать. 14) Перетащите «Wad_134_1» на «Level (11025).bat», ещё раз появится куча мелких файлов. Выделите все новые, кроме «Wad_134_1_63.vag» и «Wad_134_1_63.vag.log», «Wad_134_1_64.vag» и «Wad_134_1_64.vag.log» и удалите. 15) Удалите остальные «Wad_134_1_*». Переименованные – крики Хантера при падении. Итак, что мы имеем? Нетронутый «500`166428672`WAD.WAD», извлечённые целые субфайлы «Wad_012» (An Evil Plot Unfolds...), «Wad_098» (Sunrise Spring), «Wad_134» (Evening Lake) и «Wad_184» (Титры); первые суб-субфайлы «Wad_098_1», «Wad_134_1»; извлечённые звуки «+Wad_098_1_3.vag» (огонь), «+Wad_098_1_32.vag» (ворота), «+Wad_098_1_53.vag» (плачь), «Wad_134_1_63.vag» (громкий крик), «Wad_134_1_64.vag» (тихий крик), «Wad_184_0.vag» (музыка из титров), «Wad_012.vag» (звук сценки) и плюс у каждого VAG есть свой LOG (всего 21 файл). 16) Перетащите «Wad_184_0.vag» на «VAGEDIT.EXE». Воспроизведите и вы услышите, что музыка играет слишком медленно. 17) Меню > Special> Set New Sample Rate > введите 17500 > ОК. Проверьте – кажется, всё правильно. 18) Меню > File > Save As > зайдите в свою папку «work» > дайте имя «Wad_184_0», а тип файла – «WAV» > Сохранить. (Появится файл «Wad_184_0.WAV») 19) Перетащите «Wad_012.vag» на «VAGEDIT.EXE» (или в его открытое окно). Можете воспроизвести. 20) Меню > File > Save As > зайдите в свою папку «work» > дайте имя «Wad_012», а тип файла – «WAV» > Сохранить. (Появится файл «Wad_012.WAV») 21) Откройте GoldWave и перетащите в него «Wad_184_0.WAV» и «Wad_012.WAV». Дважды подтвердите открытие. 22) Заметим что у сценки частота «22050», а у музыки – «17500». И если бы мы просто так как есть попытались бы заменить одно другим, то скорость воспроизведения в игре была бы неверной. Поэтому перейдите к музыке и выполните Меню > Effect > Resample > ведите «22050» > OK. 23) Теперь скопируйте весь трек и вставьте его два или три раза подряд. Это для того, чтобы музыка не закончилась, потому что первая сценка немного длиннее её. Сохраните файл в «Wad_184_0_my.wav» (естественно 16 бит моно). 24) Перетащите этот же новый файл «Wad_184_0_my.wav» в окно «VAGEDIT.EXE». Сохраните в «Wad_184_0_my» но как VAG. 25) Выделите новый файл «Wad_184_0_my.VAG» и «Wad_012.vag». Теперь перетащите их на «Merge.bat», держа мышкой за «Wad_012.vag». (Если вы потом откроете «Wad_012.vag» в «VAGEDIT.EXE», то услышите музыку) 26) Пора вернуть трек обратно! Выделите «Wad_012.vag» и «Wad_012». Перетащите их на «Save.bat», держа мышкой за «Wad_012.vag». 27) А сейчас выделите «Wad_012» и «500`166428672`WAD.WAD». Перетащите их на «WadPut.bat», держа мышкой за «500`166428672`WAD.WAD». Введите число 12 и нажмите Enter. 28) Перейдём к звукам. Последовательно откройте три файла «+Wad_*.vag» в «VAGEDIT.EXE» и сохраните их по тем же именам, но уже в «WAV». Это будут «+Wad_098_1_3.WAV», «+Wad_098_1_32.WAV» и «+Wad_098_1_53.WAV» 29) Откройте «+Wad_098_1_3.WAV» в GoldWave, подтвердите. 30) Меню > Effect > Reverse. Сохраните как «+Wad_098_1_3_my.wav» 31) Теперь откройте в GoldWave сразу «+Wad_098_1_32.WAV» и «+Wad_098_1_53.WAV». 32) У плача («+Wad_098_1_53.WAV») частота дискретизации 8000, а должны быть (для Хантера) – 11025. Поэтому Меню > Effect > Resample > ведите «11025» > OK. 33) Каждый трек скопируйте и вставьте два или три раза, чтобы уж точно превзойти длительность оригинальных криков. Сохраните соответственно в «+Wad_098_1_32_my.wav» и «+Wad_098_1_53_my.wav» 34) Поочерёдно откройте последние три «+Wad_*_my.wav» в «VAGEDIT.EXE» и сохраните по тем же именам, но уже в «VAG». Это будут «+Wad_098_1_32_my.VAG», «+Wad_098_1_53_my.VAG» и «+Wad_098_1_3_my.VAG» 35) Внедрение! Выделите изменённый «+Wad_098_1_3_my.VAG» и оригинальный «+Wad_098_1_3.vag». Перетащите их на «Merge.bat», держа мышкой за «+Wad_098_1_3.vag». 36) Также выделите «+Wad_098_1_32_my.VAG» (звук ворот) и «+Wad_134_1_63.vag» (Хантер громкий). Перетащите их на «Merge.bat», держа мышкой за «+Wad_134_1_63.vag». 37) И в последний раз выделите «+Wad_098_1_53_my.VAG» (плачь яйца) и «+Wad_134_1_64.vag» (Хантер тихий). Перетащите на «Merge.bat», держа за «+Wad_134_1_64.vag». 38) Возвращаем! Выделите «+Wad_098_1_3.vag» и «Wad_098_1», перетащите на «Save.bat», держа мышкой за «+Wad_098_1_3.vag». 39) Выделите «+Wad_134_1_63.vag» и «Wad_134_1», перетащите на «Save.bat», держа за «+Wad_134_1_63.vag». 40) Наконец, выделите «+Wad_134_1_64.vag» и «Wad_134_1», перетащите на «Save.bat», держа за «+Wad_134_1_64.vag». 41) Почти готово! Выделите «Wad_134_1» и «Wad_134», перетащите их на «WadPut.bat», держа мышкой за «Wad_134». Ведите «1». 42) Выделите «Wad_098_1» и «Wad_098», перетащите на «WadPut.bat», держа за «Wad_098», введите «1». 43) Выделите «Wad_098» и «500`166428672`WAD.WAD», перетащите туда же на «WadPut.bat», держа за «500`166428672`WAD.WAD» и напишите «98». 44) Последний раз выделите «Wad_134» и «500`166428672`WAD.WAD», перетащите на «WadPut.bat», держа за «500`166428672`WAD.WAD», напишите «134». 45) WAD изменён! Но собирать образ через риппер рановато… Переместите файл «500`166428672`WAD.WAD» обратно в «ripGH». 46) Перетащите документ «Spyro_GH_lite.ps2» на «CdGenMekeCurrent.bat». Далее перетащите его же на сам «cdgenPS2.exe». 47) Прожгите BIN образ, сохранив его в любую папку. На данном этапе можно просто убедиться, что всё работает. Запустите Epsxe и откройте образ. Ну он по крайней мере должен играть (музыки не будет). Проверка сделанных изменений идентична итоговой, которая описана ниже. 48) Откройте папку «ripLITE», в которой существует ещё одна копия риппера. Перетащите новенький только что проверенный BIN образ на «GetRip.bat» 49) Перетащите «500`166428672`WAD.WAD» на «OneFileGET.bat» 50) Скопируйте появившиеся «500`166428672`WAD.WAD.sectorhead» и «500`166428672`WAD.WAD.sectordata». 51) Перейдите в папку с оригинальным риппером «ripGH». Вставьте файлы и замените. 52) Перетащите в ней «500`166428672`WAD.WAD» на «OneFileSAVE.bat», подождите. 53) Теперь перетащите пустой «Result.iso» на «SaveBin.bat» и подождите ещё немного. 54) Образ готов! Можете сэмулировать «Result.iso» и полюбоваться работой (описание ниже) 55) Как я создал патч? Запустил «SmartPatcher1V2.exe», последовательно перетащил в него «Spyro-Year-Of-The-Dragon gh.iso», «Result.iso», задал новое имя и всё! Да, кстати, патч может скачать любой желающий: http://klimaleksus.narod2.ru/Files/2/mysound.rar Просто перетащите оригинальный образ Greatest Hits на файл «Cutscene and Vag changes to GH.bat» А вот проверка результатов модификации: Запустите игру, не загружайтесь. Через меню выберите новую игру и стартуйте. Не пропускайте первую сценку! В ней ведь играет музыка из титров)) Когда игра начнётся, выпустите огонь и услышьте перевёрнутый звук. Дальше сложнее. Нужно вызвать «Untitled cutscene». Проше всего через мой «Savestate Runner» (два поста назад описан). НО! Не всё так просто, там ведь сохранены оригинальные звуки. Поэтому после загрузки F3 не отжимайте паузу, а зайдите в меню на карту памяти и сделайте сохранёнку. Закройте эмулятор, откройте его ещё раз на изменённом образе, зайдите на карту памяти и загрузите ячейку! (а ещё можно запускать «Savestate Runner.bin» и делать Change Disc на GH) Сразу после появления в Evening Lake начнётся «Untitled cutscene» (я до сегодняшнего для сам этого не знал!) И во время падения Хантера мы услышим только плачь дракона, и никакого звука волшебных ворот. А это значит, что его «громкий» крик вырезан разработчиками, но не удалён окончательно. Поэтому мы можем его безболезненно заменить)) Например на клёвую озвучку «даблъю даблъю даблъю спайро дэш рилмс дот ком»… Финальный итог – доказательство того, что мы МОЖЕМ изменять любые звуки! Потому что STR я доказал ранее с патчем озвучки первой фразы Бианки от devdoki: http://klimaleksus.narod2.ru/Files/1/devdoki.rar Но я ваще не помню, как я это сделал. Но мне придётся вспомнить, потому что скоро я уже должен наконец взломать нумерацию в STR и найти концы неизвестных треков. Но там есть ещё одна проблема… Нумерация в файле не такая как у нас! Совпадает только до сотого номера. Ведь секретные треки не лежат в конце, они перемешаны с остальными! Это можно увидеть, отсортировав папку со всеми репликами не по имени, а по размеру. Но я почти придумал, что с этим можно сделать. Всё! Скоро всем отвечу…