Пятница | 04.07.2025 |10:22
Приветствую Вас Гость Мира Спайро | RSS
Результаты поиска
aleksusklimСообщение # 166 | Тема: Перевод японской версии Spyro the Dragon Воскресенье, 12.08.2012, 21:31
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
Хэй! Я рипнул BIN и почти что хакнул STR! Проблемы пропажи звука больше нет!

Я решил раскурочить сам BIN образ, чтобы посмотреть, как же он устроен. «Relative Records Offset» (особенно если фон потемнее сделать) очень даже помогает разобраться в началах секторов. А какие разрабочики-приколисты молодцы, что в SOURCE.TRD каждый второй блок повтора начинается ровно с нового сектора.
Итак, структура образа BIN такова:

{Заголовок сектора} = 24 байта;
{Данные файла} = 2048 байт;
{Контрольная сумма} = 280 байт;

Таким образом одна «структура» весит 2352 байта. Это так на первый взгляд, потому что у BIN применяются свои заголовки, а subheader сектора следует за ним. Плюс, оказывается, что разные сектора имеют разное строение, но все вписываются в 2352.

Пишу на Delphi программку, которая взяла бы BIN, и рассортировала его содержимое по трём другим файлам – заголовки в одну кучу, данные в другую, концы – в третью. Файл данных я назвал «.RIP»; заголовочный – «.RIP.sectorhead»; остаточный – «.RIP.sectordata». Добавил файлик опций (где можно изменить размеры 24/2048/280) и обратный запаковыватель, которых из трёх файлов собирает один. Если некторые области не нужны (то есть делим на две кучи), то можно использовать «0» (уфф, а чтобы это реализовать, мне пришлось создать новый наследуемый в делфи класс потокового чтения, который бы НЕ обрабатывал файл, если я предлагаю копировать ноль байт… ставить постоянные условия и ветвления совсем не хотелось, вот я уже и докатился до программирования собственных типов классов).

В результате рипанья образа, я получил чистейший RIP-файл, в котором собраны все файлы диска подряд без лишних разделителей. Ну и STR тоже легко выкопировать. И WAD! И вставить обратно! Но только он такой огромный, что надо было срочно придумать хоть какой-нибудь _удобный_ способ выдёргивать оттуда целенькие файлики…
Настала пора эмулировать образ диска на трезвую голову без Алкоголя.

Файл задаётся только LBA первым сектором и размером, а не именем (не, ну разумеется, где-то в 22-ом секторе располагается FAT таблица размещения файлов где и размеры и сектора указаны, но её вообще было исследовать неохота…). Точный размер получаем из Проводника (да, Алкоголь всё-таки понадобился…), а сектора – из диска через WinHex (1-st sector). Теперьча, чтобы не строить текстовые документы характеристик файлов, я решил придумать особую именную маску, и сделать парсер для неё как BAT сценарий командной строки, который бы передавал верные аргументы непосредственно моей программе для извлечения файлов.

Маска такая: «LBA`SIZE`NAME», где
«LBA» – число, первый сектор начала данных;
«SIZE» – размер файла в байтах;
«NAME» – любое имя и расширение если нужно.
Символ «`» –самый главный разделитель («Ё» при английской раскладке)

На обработку передаются только файлы маски «*`*`*». Ну и вот, строим список всего содержимого образа: (и файлы и каталоги)

22`2048`SPYRO
23`68`SYSTEM.CNF
24`458752`SCPS_100.83
500`112793600`WAD.WAD
104000`46874624`MUSIC1.STR
126888`56770560`MUSIC2.STR
154608`59965440`MUSIC3.STR
183888`66289664`MUSIC4.STR
216256`73383936`MUSIC5.STR
252088`85147648`MUSIC6.STR
293664`2048`SOURCE
293665`31457280`SOURCE.TRD

Вот такие пустышки пришлось создать. Потом я немного попарился со сценариями и в конечном итоге получил такие интерфейсы:
«name.bat» – в него надо записать имя RIP файла для работы;
«GetRip.bat» – на него надо перетащить исследуемый BIN образ, чтобы разбить его на три кучи;
«SaveBin.bat» – на него надо перетащить ПУСТОЙ (или ненужный заменяемый) файл (то есть BIN как образ), чтобы собрать образ из трёх кучек (их имя уже определено в «name.bat») и сохранить в тот файл, который был перетащен (не следует перетаскивать оригинальный образ игры, иначе он сотрётся и заменится модификатом; а вот рабочую копию типа «imagen.bin» от CdGenPS2 – будет в самый раз!)
«AllFilesGET.CMD» – Заполняет все файлы (те что *`*`*) актуальными данными, выдранными из готового RIP (обычно на тех же настройках, на которых RIP был получен).
«AllFilesSAVE.CMD» – Внедряет изменённые файлы (*`*`*) обратно в RIP!
А чтобы обрабатывать не все, а по одному, я добавил такие аналоги:
«OneFileGET.bat» – Достаёт один файл из RIP. Для этого его следует перетащить на этот скрипт (на самом деле он производит поиск *`*`* и передаёт только тот, который был перетащен; таким образом если перетащить любой другой файл, то обработки не произойдёт, лишь выйдет «Для продолжения нажмите любую клавишу …»)
«OneFileSAVE.bat» – как и выше, то есть заносит перетащенный файл в RIP. Причём если его размер отличается от «*`среднего`*» числа в его названии, то моя программа сообщит об ошибке и не станет работать (так же и в «AllFilesSAVE.CMD»)

Теперь можно очень легко модифицировать WAD без реального прожига образа. Алгоритм:

1) Распакуйте весь мой архив (все пустышки-файлы там уже созданы)
2) В «RipBin.txt» должно значится 24 на 2048 на 280 (кстати, значения по умолчанию если файла нет)
3) Перетащите оригинальный BIN образ на «GetRip.bat»
4) Появятся три файла «Spyro.rip», «Spyro.rip.sectorhead», «Spyro.rip.sectordata» (константа «Spyro» записана в «name.bat» и её можно сменить), общий размер которых должен быть строго равен размеру исходного BIN
5) Перетащите «500`112793600`WAD.WAD» на «OneFileGET.bat» или просто запустите «AllFilesGET.CMD», если желаете получить сразу все файлы
6) Модифицируйте WAD как пожелаете, либо замените его другим уже собранным файлом того же размера (в этом случае предыдущий пункт можно пропустить)
7) Перетащите его же, «500`112793600`WAD.WAD» на «OneFileSAVE.bat» или запустите «AllFilesSAVE.CMD» (но это займёт больше времени)
8) Создайте пустой файл (я это делаю через «Создать>Текстовый документ», а потом просто меняю расширение), назовите его как «.bin» и перетащите на «SaveBin.bat».
9) Скопируйте «.cue» файл от оригинального образа и поместите рядом с новым (его ещё придётся открыть Блокнотом и поправить ссылку на имя), чтобы виртуальный дисковод не ругался на формат (но Epsxe и без этого пункта будет работать)

Вот и готово! Но на самом деле это ничуть не лучше моего Вихря, который нагло модифицирует данные образа…
Там ведь есть области коррекции ошибок! И следовательно, при изменении ТОЛЬКО файлов они окажутся ложными. После чего образ станет неработоспособным…
Чтобы в этом убедится, я взял и занулил весь «Spyro.rip.sectordata» файл! Он состоял из одних лишь нулей. Скомпоновал образ, вставил в Алкоголь.
А знаете, что было? Проводник всё видел, размеры и названия считывал. Открыть ничего нельзя, скопировать тоже. WinHex показывает НА ВСЕ кластеры «UNREADABLESECTOR» ! Так вот в чём беда, CRC сумма неверная и файл не читается. А что эмулятор?
А Epsxe плевал на контрольную сумму. Он преспокойненько запустил игру и работал как ни в чём не бывало, даже музыка играла нормально (*). Разумеется, я кастовал его на сам образ (а не дисковод через плагин).

Ну ладненько, а как же быть с заголовочными данными? Я обнулил и их тоже. Теперь остались только сами данные файлов. ОК, Алкоголь сэмулировал. Только теперь ни Windows, ни WinHex вообще не могут получить содержимое дисковода, ссылаясь не нераспознанную файловую систему диска. Если убрать CUE, то Alcohol образ не воспринимает, а терминатор-Epsxe – без проблем! Игра снова работала, даже без заголовков сектором и контрольной суммы. НО! Музыки не было, что и следовало ожидать.
Более того, даже сам jPSXdec не смог распознать треки в модифицированном образе. А это означает, что STR что-то хранит в заголовках секторов, и без этого воспроизведение невозможно.

Копаю официальный SDK на предмет наличия в нём:
– Прожигателя образов;
– Документации по форматам;
– Конвертора STR <> XA <> WAV.

Прожигатель нашёл:
http://klimaleksus.narod2.ru/Files/1/cdgen.7z (955 Кб)
(Кстать, у меня не прожигает, пишет какого-то DLL не хватает…)
В нём-то и было неплохое описание двух форматов секторов:
http://klimaleksus.narod2.ru/Files/1/cdgen.gif

Получается, что существует два типа кластеров, стандартный и особый для XA. Структура обычного:

{Заголовок сектора} = 8 байт;
{Данные файла} = 2048 байт;
{Детектор ошибок} = 4 байта;
{Корректор ошибок} = 276 байт;

В чём отличие от моей структуры, описанной в начале? А в том, что заголовок не 24, а только 8. Это значит, что 16 байт отдаются обслуживанию самого BIN (а так и есть, там просто инкремент номера сектора), и только 8 идут в дело и видимы игре.

Структура XA потокового формата:

{Заголовок сектора} = 8 байт;
{Данные файла} = 2324 байт;
{Пустышка} = 4 байта;

Отсюда следует сразу несколько вещей. Во-первых, тут нет данных о коррекции ошибок; во-вторых, размер реального содержимого больше; в-третьих получается, что часть «защищённого субканала» для коррекции ошибок занята реальными данными файла! Вот почему файл не читаем в WinHex, потому что сумма не сходится, потому что это не сумма вовсе, а сам файл. А в-четвёртых, скопировать STR напрямую с диска не удастся в любом случае, а часть данных будет безвозвратно утеряна.

Ещё одно описание форматов есть в другом интересненьком документе, но он то ли коцаный, то ли не хватает чего-то, потому что многие схемы отображаются пустыми.
Документ:
http://klimaleksus.narod2.ru/Files/1/filefrmt.7z (633 Кб)
Скриншот:
http://klimaleksus.narod2.ru/Files/1/filefrmt.gif

Немного подробнее про форматы записи написано в инструкции официального эмулятора (ох, лучше никогда никогда никогда никогда этим эмулятором не пользоваться!)



Однако извлечь весь STR возможность есть. Достаточно лишь правильно разметить первоначальный образ, поставить туда «16/2332/4» – обрезаем 16 байт номеров секторов BIN, собираем и заголовки и содержимое файлов (8+2324=2332), а четыре «неиспользуемых» (ой-ли неиспользуемых…) байта кладём в третью кучу.

Заглядываю в первую – ага, последовательные номера всех секторов. Отлично, теперь извлекаю файлы STR (никаких LBA менять не придётся, потому что номера секторов те же). Только мне пришлось ещё изрядно улучшить мою программу, потому что отныне меня будут интересовать не только средние области данных, но и обе краевые. А это значит, что вместо одного файла извлекать из RIP нужно тоже три. А там ведь маска *`*`*…
Ну я просто поставил опять-таки «.sectorhead» да «.sectordata» на концы, запретив передачу в обработку по таким расширениям (ведь иначе они подошли бы по маске). Отныне извлекаются и загружаются из рипанного образа не только сами файлы, но и соответствующие им части (по тем же секторам) из заголовка и остатка.

Имею STR, STR.sectorhead и STR.sectordata (имя в «name.bat» необходимо сменить, чтобы не перезаписать сам образ). Извлекал, задав 8/2324/0 – то есть в sectorhead расположен самый загадочный восьмибайтовый заголовок, в STR – все данные ЦЕЛИКОМ, а в sectordata – пусто.

(Этот шаг наверно сложно понять… Короче, всё сначала. Я взял BIN и порезал его на три части особым образом, чтобы в первую отсеять ненужные номера секторов, во вторую – всё содержимое секторов, за исключением четырёх байт (идущих в третью часть), которые нам потом всё равно не понадобятся (отношение 16/2332/4). Дальше я вытащил оттуда один STR (весь) таким образом, что получил ещё два файла – номера его секторов и ненужные байты (оба не использовал). Потом обратился к самому STR файлу как к образу диска, то есть сменил новое имя RIP со «Spyro.rip» на «STR.rip» и раскоцал главный STR ещё на три (два) файла в отношении 8/2324/0)

Теперь у меня отдельно лежат все реальные данные STR и отдельно – заголовки XA секторов. Наблюдаю.

Обнаружил, что все данные XA (где бы они не находились) имеют характерный вид в анализе через WinHex. Вот так:
http://klimaleksus.narod2.ru/Files/1/xa.png
То есть, через «Analyze Block» можно легко определить, является ли интересующий блок XA данными.

Определил, чем заняты «холостые» четыре байта в ADPCM секторе. Нет, не нулями! Рандомные биты. Просто двоичный мусор. Полная неразбериха, никакой закономерности. Да, скорее всего они действительно не используются.

На всякий случай определил, чем заняты 280 байт CRC коррекции ошибок на секторах от STR файлов, если их извлекать как WAD, то есть по 2048 результирующих. И действительно, содержание идентично диаграмме XA, в отличие от соответствующего блока при WAD или любом другом файле (*)

Исследовал заголовки XA. Выглядит так:
http://klimaleksus.narod2.ru/Files/1/sectorhead.png
Причём каждый состоит из восьми байт, но в них первая четвёрка ВСЕГДА абсолютно идентична второй четвёрке. То есть либо я чего-то не понимаю, либо реальных байт только 4, а следующие четыре просто их повторяют.
Ладно, 4 – это уже проще. Большие числа (32 бит) резона не имеют, так что смотрю на значения байт в ArtMoney:
http://klimaleksus.narod2.ru/Files/1/artmoney.png
Среди прочих непонятных цифр (1, *, 100, 1) – вместо звёздочки всегда стоит число от 0 до 7. Так и повторяется – 012345670123456701…
И при этом jPSXdec показывает, что в каждом STR по восемь треков, от 0 до 7.
Так может быть сектора просто перемешаны? То есть один трек располагает свои кластеры не подряд, а через семь штук. А для склеивания воедино, мне нужно всего лишь вытащить последовательно сектора с одинаковым номером трека.

Но одними номерами там дела не заканчиваются. У некоторых STR под концом часть номеров пропадала, а окружающие «100» менялись. Может быть это показывает, что музыкальный трек уже закончился. Нет, нужно больше информации про заголовок…

Ладно, я на авось написал другую программу и вытащил все кластеры одного трека. И получил, наконец, единый (как мне кажется) XA файл. Ну и?
Что мне с ним делать? XAPLAY.EXE не читает. jPSXdec тоже (разбивает на сотни секторов длиной в 1 сек и не воспроизводит). GoldWave не ахти как открывает ADPCM, но выдаёт ритмичный (местами напоминающий техно стиль) волновой мусор. WinHex по виду однозначно определяет XA.
А дальше что? Я не могу ни конвертнуть его в читаемый WAV/WMA формат, ни произвести обратное (nihonjin, где тот WMA2XA или WAV2XA, о котором вы говорили? У меня его точно нет!)
Ничего. Я в тупике? Файл готов, всё выглядит должным образом. Но у меня нет ни единого шанса узнать, верно ли я произвёл модификации. Как определить, получилось ли у меня?

↓ ↓ ↓ ↓ ↓


Сообщение отредактировал aleksusklim - Воскресенье, 12.08.2012, 22:20
 
aleksusklimСообщение # 167 | Тема: Перевод японской версии Spyro the Dragon Воскресенье, 12.08.2012, 22:06
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
↑ ↑ ↑ ↑ ↑


Этот вопрос в гораздо большей степени необходим при переводе Spyro3, чем этой японской версии. Потому что вы музыку менять не будете, а нам предстоит перезаписать 500 треков…

Короче, нужны:
– Конверторы. Много конверторов! Для сборки STR, для создания XA, для прослушки. А то в SDK всё только для одних Midi (vab/vag)!
– Документации и описания форматов. Чтобы точно знать каким образом XA располагаются внутри STR и что именно записано в заголовках, как стерео трек делится на два канала.
– Эксперименты над STR! Ведь единственное место, где что-то работает – это Epsxe и jPSXdec. То есть можно заменить XA (или модифицировать заголовок), да посмотреть, что изменилось на самом деле.

А сейчас ещё один эксперимент, упущения которого я отметил «(*)» в тексте выше. Как я уже сказал, я попробовал полностью удалить 280 байт коррекции ошибок со всего диска, включая части XA из STR. И заявил, что игра работала, а музыка воспроизводилась.
Но это невозможно! Я ведь обрезал части всех XA, почему же музыка осталась?
А потому что я невнимательно слушал. Я ещё раз повторил эксперимент, но уже прослушивал через jPSXdec, а не эмулятор. Оказалось, что коцаный образ проигрывает музыку с постоянными щелчками и потрескиваниями! Очень частые бесконечные шумы, которые хоть и отчётливо слышны, но не забивают музыку. Перепроверил в Epsxe – там точно так же, звучит с ошибками.
Сохранил в WAV оба трека из jPSXdec. Потом открыл в GoldWave (так они были ещё и стерео!). Сохранил в моно оба, а потом объединил так, что в левый канал попал исходный звук, а в правый – частично обрезанный. Сохранил, можете сами послушать:
http://klimaleksus.narod2.ru/Files/1/gaps.7z (363 Кб, WAV, 6 секунд, стерео)
Но и по виду аудиограммы суть уже ясна:
http://klimaleksus.narod2.ru/Files/1/gaps.png
Сверху – оригинал, внизу – с отсутствующими группами 280 байт. Жёлтым я выделил обрезанные фреймы. Что ж, всё встало на свои места.

И чем же я закончу опыты? Тем, что я смог выдернуть чистый XA и не могу доказать, что это действительно получилось? Нет! Я хочу заменить один трек другим.
Например первый (домашний стартовый мир, очень характерная и плавная) на второй (не знаю из какого уровня, но такая жёсткая рокерская ритмичная)
Изрядно улучшил XA-выдиратель. Две проги – RipBin.exe и HackXa.exe. Техника та же (по выдиранию STR), различия лишь в употреблении HackXa. Опять-таки, пришлось создать BAT интерфейсы:

«XaGET.bat» – извлекает один трек из STR файла.
«XaSAVE.bat» – заносит один трек в STR.
Настроек никаких. Размер сектора – константа «2324» забита в коде программы (исходнички обеих прог я разумеется приложил). Название STR получает из «name.bat» (там ведь всё равно уже не имя BIN, потому что у самого STR вторым подходом извлекаются заголовки номеров треков)
Как выбрать трек? Просто перетащить файл, его имя без расширения и будет работать одновременно как номер трека и как файл для загрузки/сохранения.
Создал восемь пустышек «0.xa», «1.xa» … «7.xa». Их и нужно перетаскивать на «XaGET.bat» и «XaSAVE.bat». Удобно?

Настройки для RipBin я раздельно сохранил в трёх текстовых документах, которыми в нужные моменты придётся заменять «RipBin.txt» (или копировать содержимое, открыв оба в Блокноте) :
«WAD.txt» – стандарт 24/2048/280 – им можно получать только файлы данных, такие как EXE и WAD (ну и cnf/trd тоже). Все STR, которые получены таким образом, не окажутся корректными, и трогать их запрещено (однако распаковка STR и запаковка его обратно без изменений ничего не испортят в финальном образе, так что за них можно не бояться при редактировании только WAD).
«STR.txt» – это уже для извлечения только STR файлов, отношение 16/2332/4. Если направить на другие файлы, вы получите мусор (но опять-таки, двойная распаковка-запаковка мусора не повредит образ, если ничего не менять).
«XA.txt» – делит 8/2324/0, чтобы разбить извлечённый ранее STR на заголовок и содержание, дела вид, что обрабатывается образ. То есть, эти настройки можно применять только на извлёчённый STR (а не образ!), при этом в качестве RIP в «name.txt» следует задать что-то вроде STR.rip, чтобы не перезаписать RIP образа.

Вот полный алгоритм, как заменить один трек на другой (или поменять их местами) :
1) Распакуйте весь мой архив со всеми пустышками в одну папку, и лучше поближе к корню диска, чтобы никаких пробелов и служебных символов в именах или путях;
2) В «RipBin.txt» занесите содержимое «STR.txt»;
3) В «name.bat» должно быть «Spyro.rip» (я там сделал вот как: две строки, первая «set RIP="Spyro.rip"», а вторая – «:# set RIP="STR.rip"»; если строка начинается с «:#», то она игнорируется, поэтому вместо замены всего файла можно просто переносить вторую строку enter’ом после значка «:#», тогда первая не будет иметь силы);
4) Перетащите оригинальный BIN на «GetRip.bat»;
5) Появятся новые «Spyro.rip» (содержимое), «Spyro.rip.sectordata» (холостые 4 байта для STR, но реальные для всего остального) и «Spyro.rip.sectorhead» (номера секторов для BIN, можете открыть в WinHex и полюбоваться);
6) Перетащите интересующий вас *`*`MUSIC*.STR файл на «OneFileGET.bat». Для примера возьмём первый, «104000`46874624`MUSIC1.STR». ВНИМАНИЕ: прервите исполнение команды комбинацией Ctrl+C. Командная строка остановится и предложит завершить исполнение сценария.
7) Заметьте надпись в отчёте выше: «Wrong file size!» (если её нет, то сценарий не следует прерывать и пропустить этот пункт). Это означает, что в результате извлечения обрабатывается не целое количество секторов (последний обрезается указанным в имени файла размером). Для обычной работы это не страшно, а вот для замены XA очень плохо! Потому что последний нецелый сектор будет потерян. Итак, кликните правой кнопкой мыши в консольное окно > Пометить (работает ли это на Windows 7 ? …) Выделите текст предлагаемого размера, то есть в строке «need: 46875532 bytes.» выделите «46875532» и нажмите Enter. Теперь закройте окошко и выделите сам файл «104000`46874624`MUSIC1.STR». Его среднюю составляющую-размер «46874624» переименуйте на «46875532» (вставить). Полное имя должно звучать так: «104000`46875532`MUSIC1.STR». Отлично, перетащите его ещё раз на «OneFileGET.bat». Здесь уже должно значится «Frames OK», можно продолжать.
8) Появятся ещё два файла, «104000`46875532`MUSIC1.STR.sectordata» (это уже реально холостые биты, можете глянуть) и «104000`46875532`MUSIC1.STR.sectorhead» (только номера секторов BIN, которые в образе заняты данными STR), а сам «104000`46875532`MUSIC1.STR» наполнится содержанием, в нём смешаны как заголовки XA, так и сами треки;
9) Измените имя в «name.bat» на «set RIP="STR.rip"», то есть перенесите строку после «:#»;
10) Замените содержимое «RipBin.txt» тем, что написано в «XA.txt»;
11) Перетащите «104000`46875532`MUSIC1.STR» на «GetRip.bat»;
12) Появятся три новых файла: «STR.rip» (в котором чистые XA, перемешанные в порядке STR), «STR.rip.sectordata» (пустой) и «STR.rip.sectorhead» (самый интересный, в котором заголовки всех секторов XA);
13) Перетащите *.xa на «XaGET.bat». Например извлечём второй трек, который имеет номер «1» (нумерация начинается с нуля). Перетаскивайте «1.xa»;
14) Он должен наполниться содержимым! Теперь стоит выбор, что же с ним делать. Чтобы засунуть в другой трек, переименуйте например в «0.xa» (только имеющийся пустой «0.xa» удалите); чтобы заменить два трека между собой, извлеките (в предыдущем пункте) ещё и сам «0.xa», а потом поменяйте номера местами (допустим, «1.xa» в «A.xa», «0.xa» в «1.xa», «A.xa» в «0.xa», но это и так понятно), а в следующем пункте занесите обратно оба;
15) Перетащите подставной «0.xa» (который на самом деле был «1.xa») на «XaSAVE.bat»;
16) «STR.rip» будет обновлён (это можно увидеть, если предварительно скопировать старую версию, а потом сравнивать их в WinHex с «View> Synchronize & Compare», быстро прокручивая содержимое);
17) Перетащите «104000`46875532`MUSIC1.STR» на «SaveBin.bat», после чего обновлён будет уже сам «104000`46875532`MUSIC1.STR»;
18) Восстановите в «RipBin.txt» содержание «STR.txt»;
19) Верните имя «set RIP="Spyro.rip"» в «name.txt», восстановив «:#» у второй строчки;
20) Перетащите «104000`46875532`MUSIC1.STR» теперь на «OneFileSAVE.bat», что обновит «Spyro.rip».
21) Перетащите новый пустой (или черновой испытательный) BIN файл на «SaveBin.bat». Готово!

Новый образ можно загрузить в jPSXdec или в сам Epsxe. В чём ошибка? В том, что заводская длительность музыки не изменилась, поэтому длинный трек, засунутый в короткий окажется обрезанным (хотя все данные копирнулись), а короткий в длинный – будет визжать в конце, потому что длины указываются в «STR.rip.sectorhead», который я не могу изменить, поскольку не знаю смысла байт (только номер трека разгадал).
Но кажется, что длительность звуков, как и текстов/файлов/секторов/тайлов опять останется непокорна. Всё равно, два гига музыки ну никак не влезут на диск. Поэтому можно лишь замещать, но не добавлять треки.
Нам для переозвучки Spyro3 это в самый раз, ведь и текст у нас не намного длиннее оригинала.
А вам для Spyro1 это вообще не нужно.

Что же остаётся для вас? Работать с WAD! Пока что как есть, без заботы о контрольной сумме. Ну а потом?
А потом я предлагаю прожечь финальный WAD через CdGenPS2, чтобы выкопировать оттуда его контрольные суммы, которые мы поместим в мою машину по сборке образов RipBin (думаю, что это содержимое файла «500`112793600`WAD.WAD. sectordata») и скомпонуем абсолютно правильный и рабочий переведённый образ! А потом его уже можно и в ISO конвертнуть (интересно, чем?) или в любой другой формат.

Хотя я вам порекомендую вообще не париться со звуком, потому что так прожиг долгий. Работайте с полностью обрезанным образом (в котором вообще нет ни одного STR), чтобы заменять WAD очень быстро.

Но STR проверьте сейчас! Чтобы убедится, работают ли у вас мои алгоритмы. Плюс, если вы проверите экстракцию треков XA на полную катушку (между разными STR – да что там, между разными играми!), и найдёте способ создания своих XA, то это значительно упростит нам озвучивание Spyro3. Так-а-вы будете участвовать в нём?

Ну и наконец, ссылка на мой долгожданный архив с программами и всем всем всем:
http://klimaleksus.narod2.ru/Files/1/ripbin.rar (83 Кб)

P.S Да, и скажите, что за трек в первом STR под номером 1? Это и не начальная заставка, потому что когда я поменял 0 и 1, она осталась прежней, в то время как музыка первого мира изменилась.
А при тихом запуске оригинального образа через эмулятор и DirectX плагин до появления заставки при загрузке EXE (и надписи Sony Computer…) слышите ли вы ужасное полусекундное шипение?

P.P.S Нашёл интересную страничку:
http://www.eclipsedata.com/insidepages.asp?pageID=134
Вопрос в том, как ЭТО скачать?

Английские обсуждения форматов, кажись, рассказали в чём же секрет заголовка XA:
http://psx-scene.com/forums....e-25730

Всё остальное про XA в интернете (особенно на downloadatoz) – враньё!


but nobody came

Сообщение отредактировал aleksusklim - Воскресенье, 12.08.2012, 22:20
 
aleksusklimСообщение # 168 | Тема: Перевод японской версии Spyro the Dragon Суббота, 18.08.2012, 01:12
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
Так-так… Ответов на прошлые посты от меня сегодня не будет…

Quote (nihonjin)
Но всё оказалось довольно просто! Ваш метод "сохранения звука" работает и музыка больше не пропадает!


А теперь я ещё и полностью доломал XA благодаря вам:

Quote (nihonjin)
В моём арсенале, кажется, выбор больше. Например есть MC32.


Афигеть. Он же у меня тоже был! Только я и не подумал, что «видео-конвертер» будет работать на простые WAV!

Quote (nihonjin)
Ещё есть проигрыватель XA(XAPLAY), но он не открывает "очищенный звук". А вот если попробовать конвертировать WAV->XA, то всё нормально работает.


XA XA XA XA XA XA XA XA XA XA XA XA !!!
УУУУууууу Ха Ха Ха Ха Ха!!!

Вау, мне хватило ровно 20 секунд чтобы врубится в настоящий XA формат и понять, в чём была ошибка моего HackHa!

Я конвертнул любой WAV и просто посмотрел…
Оказывается, чистый XA выглядит так:

{заголовок фрейма} – 8 байт, причём первые четыре равны другим четырём во всех случаях, которые я рассматривал;
{звуковые данные} – 2324 байта;
{пустышка ИЛИ сумма} – 4 байта.

Ясно? Эти грёбаные 4 байта рандомных данных, которые я отсеял первым же шагом, оказывается являются неотъемлемой частью формата! И без них XAPLAY.EXE просто путался в секторах. Лечение очень простое – при рипаньи образа (первый раз), задать «16/2336/0» (а не 16/2332/4), то есть оставить четыре байта внутри.
После чего «OneFileGET» на любой STR. И вуаля: кастуем «XAPLAY» прямо на этот STR, и он преспокойненько разбивает его на каналы и чётко читает!

Только теперь-то концепция изменилась, и я создал новую версию XA выдирателя, это уже «XaHack.exe». Предназначен для извлечения и внедрения одного канала XA.
То есть либо из многоканального XA (читай: обычного STR) выгрузить одиночный XA, либо внедрить единственный одноканальный XA по нужному каналу в многоканальный.
Мне пришлось думать, как заменить номер канала, и я решил просто менять его в обоих местах заголовка, то есть во 2-ом и 6-ом байте. При выгрузке – ставлю автоматом ноль, чтобы одноканальный XA не оказался с запредельными номерами (странно… XAPLAY поддерживает только до 32 каналов… а как же 500 речей в Spyro3? Скоро придётся исследовать…)

Интерфейсы поменялись, но работают они на тех же «0.xa», «1.xa» и т.д:
«XaChannelGET.bat» – выгружает один XA из STR. Для этого выделите мышью и интересующий STR, и XA с номерком (например, «104000`46876512`MUSIC1.STR» и «0.xa»); после чего схватите мышью именно за XA, да перетащите на этот скрипт. То есть перетащены будут два файла, но первым обязательно должен быть {номер.xa}
«XaChannelSAVE.bat» – обратно, внедряет один XA в большой STR. Точно так же, перетаскивайте оба файла, первым остаётся XA (за него тяните, а STR должен быть просто выделен рядом). Разумеется, оба файла должны находиться в одной папке, а «name.bat» не используется.

При внедрении номер канала вообще игнорируется и присваивается указанному, что избегает проблем номера, поэтому ошибок происходить не должно.

Длительность, кажется, можно изменить. Но проблемы при несоответствии будут всё равно. Потому что я пока точно не знаю, КАК помечаются пустые сектора, если трек уже кончился.

Архивчек:
http://klimaleksus.narod2.ru/Files/1/XaHack.rar (356 Кб)
Туда ещё засунут и «XAPLAY.EXE» и даже сам «MC32.EXE» (мощно ужатые через UPX).

Ещё я попробовал самый главный эксперимент по замене звука. Я сохранил WAV через jPSXdec, потом преобразовал его в XA через MC32.EXE, рипнул образ, выдрал STR и извлёк из него тот же самый трек. Сравнил свой-заводской и обратно-конвертированный XA – не совпало – ни по размеру, ни по содержанию (ну не считая явных разделителей, как заголовки или странные 0C / 1C полоски). Однако на слух при воспроизведении через XAPLAY – идентичны. А значит, я могу представить полный алгоритм замены любого звукового трека на свой другой, одинаковой длины:
(только тут я уже не буду всё по шагам описывать, просто укажу сами действия)

1) Открыть образ в jPSXdec и сохранить в WAV нужные треки (чтобы узнать длину);
2) Также сохранить свой звук в формате WAV (над частотой дискретизации – не знаю, но вроде MC32 сам умеет её неплохо менять);
3) Сконвертировать свой WAV в XA через «MC32»;
4) Рипнуть образ правильным раскладом «16/2336/0» через GetRip;
5) Получить оттуда требуемый STR (и не забыть прервать консольное окно, если сектор ругается на размер) через OneFileGET;
6) Засунуть свой XA по выбранному треку через XaChannelSAVE;
7) Прослушать STR через XAPLAY и убедится, что под концом нет глюков;
8) Вернуть STR на место через «OneFileSAVE.bat»;
9) Восстановить образ через SaveBin;
10) Эмулировать в Epsxe или пересканировать в jPSXdec.

Всё! Кажется, так немного проще. Попробуйте его проверить!

Quote (nihonjin)
Тут вы мне, наверное, не поверите, но - я плохо знаю музыку в Spyro. Просто зачастую я запускаю его без звука.


А я свой пиратский Spyro3в1 проходил без музыки во всех трёх играх!

Эй, кстати, в той демке «Tabloid» (только не спрашивайте, где я её взял…), в первом же уровне «Stone Hill» играет та самая музыка, которая используется в титрах всех трёх игр! Только тут полная её версия. Ух-ты, я даже не знал, что такая существует! Костьми лягу, но засуну-таки её вместо титровской во все три версии! И пусть она по размеру больше (аж чуть ли не весь ОЗУ займёт…), но я просто обязан её забрать.
Потому что стандартная титровская классная, но уже (за три игры) очень поднадоела, и я сразу хотел заменить её в нашем переводе Spyro3. Но вот на что? Класснее этой мелодии нет никакой. А теперь есть! Она же, но полная версия. Будет здорово!

Блин, а во второй демке… Где в Town Square первый же дракон говорит на английском!! Помните фразу:
{{{
Welcome to "Town Square", Spyro! Begin exploring by gliding to that area. What the bull. Use the L2 and R2 buttons, together good luck!
}}}
Ну сук.. они ж… Вот долбанутые! Идиоты, они что, на слух так криво написали!? Ух, балбесы…
Не, ну блин. Как можно ТАК не расслышать слова!? Глухие и тупые! Оригинал:
http://klimaleksus.narod2.ru/Files/1/TownSquare.mp3 (100 Кб)
Ну и? Где тут «together»? Более того, где «good luck»!? И какого чёрта там делает «What the bull»?
Это просто финиш.
А вот что на самом деле говорит дракон:
{{{
Welcome to Town Square, Spyro. Begin exploring by gliding to that area with the bulls. Use the L2 and R2 buttons to get a good look.
}}}
Не, ну вы видели, да? Кривоухие… А перевод такой:
{{{
Добро пожаловать на Городскую Площадь, Спайро! Начни изучать её, пролетев вон туда к быкам. А чтобы встать ровнее, пользуйся кнопками L2 и R2.
}}}
Ясно? «by gliding to that area with the bulls» – «планированием к той площадке с быками». Не, ну там и вправду два быка! Плюс, дракон явно лапой указывает именно туда. «to get a good look» – «получить наилучшее обозрение», если дословно. То есть сделать так, чтобы хорошо всё видеть. Вот это есть истинный смысл!
Дракон реально быстро произносит «buttons to get a good look», а «удачи» так уж точно не желают! А слово «with the bulls» он немного искажает, словно «with the bonus» («при помощи бонуса» вместо «с быками»). Теперь ясно откуда пираты взяли «летай при помощи шаров» – они услышали как «with the balloons»!

Quote (nihonjin)
Заглянул через jPSXdec треки и осознал, что их там по 8 в пачке(мире?). Но - уровней же всего 6! Для чего лишние?


Может, дубликаты. Ох, сложно разобраться… Может каждый мир хранит по треку в РАЗНЫХ файлах? Тогда в одном STR окажется по одной музыке со всех миров. Это ведь STR’ов как раз шесть…

Quote (nihonjin)
Об этом вроде бы писал ещё SergeiUXPMC


Знаю! (не, реально, я ещё не последние мозги себе вынес, чтобы совсем забыть о содержании _своей_ темы)
Но там речь была о Spyro3. А я исследовал Spyro1. А раз результаты одинаковые, то структура STR универсальна.

Quote (nihonjin)
Так, а я ведь тоже провожу эксперименты над звуками.


Что и откуда выдираете? Голоса драконов?
Короче, у нас три вида звуков:
– Те, которые лежат во STR (и которые мы только что научились изменять), определяются через jPSXdec;
– Те, которые лежат в WAD открыто как звуки, определяются через PSound (в их же числе музыка в титрах), пока изменять их мы не умеем, хотя почти все свойства (например, графический вид, диаграмма WinHex и.т.д) уже определены;
– Те, которые спрятаны в WAD в потоках cut-сценок и не определяются ни через jPSXdec, ни через PSound (у вас в Spyro1 их, кажется, нет, а звуки сценок подпадают под предыдущий тип), мы их не то что изменить, мы их даже найти и прослушать без эмулятора не можем! Вот это пока архисерьёзная проблема, раз уж наши актёры так горят желанием поскорей озвучить сценки…

Quote (nihonjin)
не знаю, но эти три файла в сумме у меня получились меньше оригинала - 693 против 710мб.


Что!? Вы об этом:
http://klimaleksus.narod2.ru/Files/1/explorer.png
?? Никогда не верьте Проводнику в папках! Если хотите узнать точный размер, открывайте «свойства» и не грешите на мой алгоритм!




А знаете, что я ещё натворил? Я взломал японскую камеру.
Без шуток. Теперь её режим можно менять ЧЕРЕЗ МЕНЮ !
Отвечаю! Я дизассемблировал EXE и сам написал на ассемблере к нему 10 строчек мнемоники.
Это был самый сложный взлом Spyro, гораздо сложнее Вихря и на порядок могущественнее.
Вообще-то я хотел всё сейчас рассказать, но так много придётся писать…
Так что в следующий раз. А пока можете проверить бета-версию:
http://klimaleksus.narod2.ru/Files/1/Japancam_beta.rar
, до того, как я во всеуслышание на весь форум закричу, что я исправил японскую игру.
Давайте, по-тихому испытайте. А расскажу я обо всём после, рано меня хвалить.

Пока же ответьте на три вопроса:
Что это за строка:
http://klimaleksus.narod2.ru/Files/1/strange.png
Та что не числится в вашем переводе меню? Это либо «вибрация вкл/выкл», либо «камера актив/пассив».

Как вы разгадали красный цвет, не заметив при этом остальных? А их не мало:
http://klimaleksus.narod2.ru/Files/1/colors.png
@ABCDEF . Причём собачка не «отменяет окраску», а делает её золотой, обычной.

И зачем нужен «моно» режим звука в опциях игры? Разве плохо всегда иметь стерео? …

P.S. Вы такое видели:
http://klimaleksus.narod2.ru/Files/1/psx_1_13.png
?


but nobody came
 
aleksusklimСообщение # 169 | Тема: Стихи Воскресенье, 26.08.2012, 21:00
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
Quote (_Олександр_)
Люблю читати поезію. Сам ще нічого цікавого писати не вмію ))) Дуже багато гарних віршів можна почитати на сторінках літературного журналу "Дніпро". Думаю що кожен може знайти для себе щось цікаве.


Quote (Юги)
Вас 70% пользователей не поймёт


Хи, а я понял))

Quote (nonun)
уже написал ему в ЛС.


Quote (Юги)
ЛС тоже хорошо.


И где же «хорошо»?

Quote (Юги)
Просто я же не вижу кто кому ЛС отправил


И слава богу.

))

Эй, а у меня гениальная идея! Я придумал как сделать так, чтобы мне больше не приходилось беспокоиться за содержимое моих комментариев! Я буду просто заливать их текстовые исходники себе на сайт, а в начале каждого сообщения ложить маленькую-маленькую ссылочку на соответствующий документик! Плюс там можно ещё и дату указать, чтобы не терять её при всяких там исправлениях и перемещениях!

Я надеюсь, что это никак не противоречит правилам форума (или каким-либо), и я смогу спокойно обработать так все уже написанные посты!




#169, 26.08.12


Стихи, стихи… Есть такое пополнение:

«Спасатель»

Зови меня Хакер,
Посланник печали,
Кто тёмные знаки

Для вас освещает,
Кто правду копает,
Задачи решает,

Кто в игры играет,
Чтоб честь сохранить,
Кто их изменяет,

Чтоб вам подарить!
Готов я улучшить
И восстановить

Момент, что упущен –
Запомни, создатель:
Я сделаю круче!

Для вас я – спасатель.


И это – терцина! А ещё это пародия… Что там у нас по списку…

«Берегись»

Страшись конца декабря,
Предвестника ангела смерти;
Об этом шептались не зря
Всегда поколенья столетий.

Что будет, не знает никто,
Но каждый поклонится слугам;
Судьбу завершая легко,
Получит теперь по Заслугам.


Да. Такой тяжёлый медлительный ритм я смог выдержать только две строфы…
Причём это тоже пародия. Из того же списка! Особого внимания заслуживает последняя строчка:

«Я всегда получаю по Заслугам…»

? Это я так схитрил. Думаю, что сделал очень неплохо, подразумевая вот это:

«I always get the Shemp...»

А почему нет? Вроде бы до меня его никто не переводил… А мой перевод имеет сразу три значения. Первые две серьёзные, как у фразы «И это тоже пройдёт». То есть, «получить по заслугам» – означает неотвратимое возмездие за ошибки. Но с другой стороны, «получить по заслугам» может значить награждение за добрые дела.
Третья же сторона комична, и связана с тем, что «Заслугам» написано с большой буквы (как и Shemp!). Сразу возникает какое-то странное отношение к этому слову… Зачастую смешное, если например мысленно заменить его на слово «Яйцам». Как смешной вопрос «а откуда Заслуги растут?» поле этого.

Две строчки ещё занимают «Вихрь» и «Камера». Одну я отдал стиху «Язык», но тут уж не знаю… Стих писался не для этого, плюс в интернете на запрос «Язык – мой друг! Язык – мой враг…» выдаётся слишком много страниц, а я хочу, чтобы все девять строк легко гуглились. А «Эльдорадо» я пока не стану заменять, ведь ещё хоть один взлом (кажись, для Spyro2!) совершить необходимо. (Искал другие его переводы… Ого, сколько ж их, особенно любительских: http://highpoetry.clan.su/board....1-0-124 . Вообще, странный интересненький форум там у них. Тоже от Ucoz. И правила я там почитал. Какие они жестокие в отношении «детей»! Может зарегистрироваться и жарко подискутировать с их руководством? Ай, ладно, потом как-нибудь… ). Две оставшихся… уф. Ну я не знаю что ещё бы написать, так что пусть пока будут пустыми.

Ну а теперь что-нибудь нормальное. Как я отношусь к отношению ко мне окружающих:

«Звезда»

Однажды, не знаю уж точно, когда,
Над лесом зажглась одиноко звезда.
Чудесный рассвет подарила собой,
Оставив сияние в чаще густой.
Жила она долго, не зная печали,
Однако вокруг её не замечали:
Ну светит и светит, особого что?
Всю прелесть понять не способен никто.
И вот срок вселенский так быстро подходит,
За время ничто так и не происходит…
Звезда не смирилась с уделом своим,
А жизнь завершила лишь делом одним:
Собравши остатки
Иссякшей зарядки,
Направила луч через лес,
Где вскоре внезапно
Цветочек на грядке
Сквозь снег умудрился пролезть.
Вся радость природы в нём отобразилась,
Но вновь ни на ком даже не отразилась,
И каждый скорей затоптал бы цветок,
Чем раз посмотрел на несчастный росток.
Он чист и прекрасен,
Он светел и ясен,
Он – гений в одном лепестке!
Но цветик, что красен,
И дуб или ясень
Считает камнём на песке.
Он выстоял грозы и снежные бури,
Один натиск мира выдерживать будет,
К победе дойдёт бесконечной войной,
Ведь он был рождён догоревшей звездой!
И вот, погибая, сберёг свою тайну,
Да семечку выпустил ввысь моментально,
Надеясь, что небо в каком-то году
Проклятье сотрёт у него на роду.
Друзья! Оглянитесь,
Постойте, всмотритесь:
Не виден ли отблеск звезды?
Тогда потрудитесь,
Скорей улыбнитесь,
И смело ищите цветы!


Сейчас всем, наверное, интересно, что же случилось с моим «конкурсным стихом», и почему я его до сих пор не выложил. Ну тот что он написан, я заявляю на 160% ! Закончил я его давно, со страхом, но закончил. Осталось напечатать в электронном варианте, но это оказалось ГОРАЗДО сложнее, чем я предполагал… Пока моих сил хватило только на 60 строф из ста. Но рано или поздно я его допишу и выложу.
А ещё я два раза по инерции Пушкинского стиля, написал по короткому стихотворению:

«Природа»

Была для человека домом.
Родным и добрым другом нам:
Даров бескрайние просторы,
Защита, воздух и вода…
Вскормила. Только людям стало
Всей щедрости природной мало –
Своих отца и мать забыв,
В войну решили с ней вступить!
Мы – воры, нам хотелось больше:
Леса срубались, таял лёд,
Зверей всё меньше, воздух мрёт –
Земля терпеть не может дольше…
Коль ты не спас великий свет,
Ты не разумен, человек!


(Ну разве ж оно подходит для завершения сочинения по филологии выпускного экзамена?)

Поэт не может просто так уйти от своих друзей! Даже если захочет, они его не отпустят:

«Виньетка»

На выпуск в мир уходит группа,
Прожив три года как семья.
Нам вместе точно было круто –
Расстаться вдруг пришла пора.
Но не отчаивайся! Помни:
Остался в сердце угол скромный
У всех и каждого, поверь,
Он души греет нам теперь.
И что бы ни случилось в жизни,
Совместный опыт вмиг спасёт,
Успех удвоит, вознесёт –
Что звёзды засияют ближе,
Да станут озарять для вас
Наш дружный неразлучный класс!


Название надо пояснить. Лучше всего это сделать фотографией:
http://klimaleksus.narod2.ru/Files/1/book.jpg

О, а меня снова запрягли напрягли к узбекскому Дню независимости и Дню знаний! Не, ну я ж как обычно, я в своём репертуаре, и мне как обычно невнятно объясняли… В результате все мои креативные пародии были отложены до лучших времён до ноября, но я выложу их тут в надежде, что хоть кто-нибудь их украдёт, чтобы я потом припомнил это всем со смехом безумного учёного.

Мини-пародия на «Буратино»:

В Ташкенте филиальчик есть;
Не каждый мог учиться здесь:
Не просто знанья получать,
Уроки нужно изучать,
Науку постигать саму…
А не слабо пойти кому
В наш
Эм
Гэ
У ?
В наш МГУ!


Другая мини-пародия, сложно сказать на какую песню (вездесущее ай сёр чи пе гу носа-белиса или как там было?), но по тексту можно догадаться:

Расскажу вам балладу
О студенте, что листик исписал:
Он шпаргалку пронёс на экзамен
А наблюдатель
Об этом даже не знал…

Носом, носом
Подсказку доставая
Из разреза в рукаве
Он вздохнул случайно…

Чихает, чихает,
Листочек вылетает –
Высший балл в зачёт, ведь смех
Декана распирает!


Клёвая моя пародия на «King of the Road» от Roger Miller:

Опять я опоздал,
И охранник не пускал…
Закрытый кабинет,
А педагога нет…
Ладно
Я всё равно войду,
Книгу
В руки я легко возьму!
Пусть и
Я не гений, но однако
Я ученик!

Мой телефон жужжит
Так, что парта вся дрожит!
Учитель подошёл
И наушники нашёл!
Боже…
К директору отвёл,
Я довод им привёл:
Просто
Я не гений, но поймите –
Я ученик!

Знаком каждый коридор
И каждый урок,
Каждый учебник,
И каждый звонок!
И все лазейки,
И школьный устав:
На пару я
Иду всегда
Ничуть не устав!
Теперь

Вот так я и живу:
Лихо в МГУ иду.
Придётся отвечать,
Что «два» не получать!
Готов
Я каждый день опять
Это
Заведенье посещать,
Когда
Все заметят: я не гений,
Но ученик!
Я – ученик!


Изначально вторая строчка последней строфы звучала так: «В колледж лихо дохожу». Потому что писал я ещё давно, вот с этой:

(на «Higher» от Taio Cruz, но только до второго припева: )

Учительницу видел я вчера,
Она поспешно на работу шла.
А мне охота знанья получать…
Готов я Достоевского читать!

Но я хочу учить,
Хочу я учить,
Ведь пуста голова!
Я учить хочу,
Учить я хочу
Пусть научат меня…

Мне знания дайте! Дайте
Темы изучить!
Я буду и дальше, дальше
Знания копить!

Ответила мне: – В колледж приходи,
И всё что нужно там отыщешь ты!
– А как же мне его сейчас найти?
– На корпусе написано «МУПКИ»!

И я его нашёл,
Теперь я пришёл:
«Обучите меня!»
Мне ответ дошёл:
«О’кей, хорошо –
Начинай с сентября!»

Любимый наш колледж, колледж
С именем МУПКИ!
Когда нужна помощь, помощь
В гости заходи!


И этой:

(на «Top of the World» от Carpenters, полностью: )

В колледж я недавно поступил –
Он меня своим уставом поразил!
Надо форму носить,
И к восьми подходить,
Чтобы
Вдруг на урок не опоздать…

А учитель смотрит мне в тетрадь
И рисует красной ручкой цифру «пять»!
Говорит: «Хорошо,
Вот заданье ещё!
Каждый день тебя я стану
Обучать!»

Сегодня
Иду я в колледж смело,
Со знаньем дела,
Добросовестно уроки
Посещать!
А учитель всегда
Будет понимать меня,
И пятёрочки в журнал выставлять!

Первый год внезапно пролетел,
Я так многое ещё узнать хотел!
Стану книжки читать,
И предметы все знать,
Чтобы гордо показать потом диплом…

Кто же нам возможность даровал,
Чтобы умным был сейчас и стар и мал?
Мой учитель! Для вас
Мы заходим смело в класс!
Берегите нас всегда
Своим крылом.

Учиться
Сюда приходят дети,
И все заметят,
Как они умнеют прямо
На глазах!
Чтоб способнее стать,
Надо тему понимать,
И учитель может всем подсказать!

Учитель наш
Выпускниками будет
Горд!
В почёте, славе
Мы уйдём, но продолжаем
Вспоминать:
Каждым годом всегда
Помнить строчки букваря,
Но учительницу не забывать!


Но я отвлёкся. Мной придумана сценка под музыку из мультфильма и игры Mulan. Плюс ко всему, она избавила меня от мучений из-за первой (наверно моей самой-самой первой) неудачной пародии-перевода под названием «Будь мужиком!», которую я, наконец, удалил из Дома Солнца. Вот так надо поступать с произведениями, которые я нелепо испортил переводами/пародиями – делать новые и красивые! Тогда про старую версию никто и не вспомнит. Сценка:

Смело поступили
На учёбу тут.
Тесты пережили
И полденный труд…

Эй, студент, забудь,
Что раньше знал,
Или тебя домой верну:
Ты прошёл на бюджет в МГУ!

Мы весь год старались
Не жалея сил.
В тестах не сдавались,
Чтобы поступить…

Эй, студент, не дрейфь,
Усердным будь,
И тебе места найду:
Ты прошёл на контракт в МГУ!

Мы равны!
Процесс учёбы для нас не стра(шен)
(Мы равны!)
(Что было) сложно, уж поза(ди)
(Мы равны!)
(Доску) почёта навек украсим:
Открытья нас ждут с успехом впереди!


В чём спектакль? В том, что:
– Первые две строчки поёт первый бюджетник;
– Следующие две строчки поёт второй бюджетник;
– Всю вторую строфу поёт ректор (студент, играющий роль ректора);
– Две строчки третьей строфы поёт первый контрактник;
– Следующую пару поёт второй контрактник;
– Четвёртую строфу поёт декан (студент, играющий роль декана);
Дальше в _припеве_ происходит наложение голосов. Актёров пришлось раскидать:
– Первую строчку поют хором два контрактника;
– Вторую – первый бюджетник;
– Третью – хором второй бюджетник и первый контрактник;
– Четвёртую – второй контрактник;
– Пятую – хором оба бюджетника;
– Шестую – первый контрактник;
– Седьмую завершает второй бюджетник.
Жаль, но кажется, что на деле я этого никогда не увижу…

Последняя моя пародия, очень качественно сделанная, на «We Will Rock You» (от Queen, естественно), даже частично про меня (особенно часть о корне из отрицательного дискриминанта…) :

В МГУ пришёл
Прямо на экзамен,
Там задач
Лес дремучий был –
Я не сдам…
Тогда
Лишь подсчитал
Дискриминант:
Меньше нуля,
Но я не узнал и

Вывел, вывел корень!
Вы Вел Вы Вел Корень!

Баллы получил,
Но хотелось больше:
В голове
Информатики
Сотни вольт!
Тогда
Книгу я взял
И прочитал –
Чтоб (не про)лететь,
Себе я сказал, что

Выучу уроки!
Вы У Чу У Роки!

С трепетом я жду
Результат расчёта,
Но пока
Промежуточный
Сам прочёл:
Да все
Баллы сложил
И разделил,
Отнял, умножил, понял –
Наконец поступил, ведь

Вышел ноль в остатке!
Вы Шел Ноль Вос Татке!


Так на вид она может казаться неэквиритмичной, но всё чётко подходит под оригинальный текст всех трёх куплетов. А уж под String Quartet просто великолепно поётся!

Так-с, скоро эта страница темы перелистнётся, а тут мой 1000-ный Паук. Ничего! Следующую страницу озаглавит 1400-строчный конкурсный!
Почему ж я его так долго писал… Ну просто «Паука» я как делал – писал по две строчки. А потом ещё две. И ещё две… Особых разделений нет. А этот Онегиновский… Четырнадцать строк. Причём из-за ритмики они должны явно разделятся. Но проблема не в этом… Просто я старался делать так, чтобы не иметь «воды» лишь ради рифмы, я хотел сделать каждую строфу шедевральной!
Поэтому, когда находил нужную рифму, я наслаждался её по десять минут! Ну а уж если всю строфу заканчивал, то полчаса пребывал в эйфории…

А ещё у меня Элора везде выдаётся как «сатира» (хоть я и попытался косвенно сгладить это, мельком назвав её «фавном» под самым концом). Хантер идёт за «тигра».
Кстати, слово «аэронавт» имеет ТРИ слога, а не четыре! (Я и писал его как «айронавт»…) А вот список слов, в которых появляется дополнительный последний слог, и я ничего не могу с этим поделать:
– Корабль
– Вихрь
– Тигр
– Мысль
– Джеймс
– Жезл
– Скипетр
– Мудр
И по-моему, тьма тьмущая подобных слов…

Место «Sunrise Spring» я как только не перевирал! Хорошо, хоть Толстосум остался только собой.
А ещё из-за длины стихотворения, я был вынужден часто повторять проходные слова в стиле «побежал, легко, портал, теперь, ведь, лишь, вот» (но минимизировал дурацкое «тут», которым славится Ироничес.. о чём это я?)
Часто строчки начинались с союзов и предлогов, потому что там сплошной ямб, первый слог которого безударный. Вот у меня и проскальзывало «а, но, и, так, уж, да, что, он, я, где, там, у»…
Да вы это и сами скоро увидите.


but nobody came
 
aleksusklimСообщение # 170 | Тема: Перевод японской версии Spyro the Dragon Воскресенье, 26.08.2012, 21:06
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
#170, 26.08.12


А вот как я взломал японскую камеру. Ссылка на патч:
http://klimaleksus.narod2.ru/Files/1/Japancam.rar

Я супер-крутой хакер. Но раньше я действовал по-мелкому, находя адреса памяти и меняя их значения. Или же ковыряя файл через WinHex, изменял указатели, которые представляли собой открытые четырёхбайтовые числа.
Но таким способом невозможно взломать «функцию», то есть мгновенное действие, например поведение игры после нажатия на клавишу. Я могу отловить и изменить только то, что «живёт» хотя бы несколько кадров, например последствия вызова той же функции (если она что-то куда-то сохраняет), но сам факт запуска функции мне неподвластен, то есть я не могу заставить игру перестать её обрабатывать (если там нет готового выхода типа «if x=0 then exit») или вызвать функцию принудительно по своему желанию.

Когда я создавал Вихрь на Полуночной Горе, я просто модифицировал область переменных, заменив номер одного объекта на другой, а также его координаты и прочие переменные. Но вот изменить физическое поведение вихря так не будет возможно.
Потому что весь «код» лежит либо в EXE, либо где-то в WAD как локальный. Хотя скорее всего, в WAD двоичного кода ассемблера вообще нет, зато EXE отвечает абсолютно за всё.

Однако когда я брался за взлом японской камеры, я и не собирался переписывать код, а хотел сделать так, чтобы американская камера всегда была вместо японской, особенно при загрузке сохранёнки, где при нажатии L1+R1 активируется американская камера. А я хотел поменять их между собой, чтобы при L1+R1 наоборот, применялась японская, в то время как американская работала бы при обычном включении.

Взялся за взлом. Через ArtMoney начал проверять, есть ли в памяти где-то ячейка, отвечающая за режим камеры. Оказалось, что есть. Это для эмулятора «9CB4D0», а для игры – «8007F4B0». Если там находится «115» (75h), то камера японская, а если «83» (55h), то американская.
Но это ещё не всё! Меняется странная ячейка «9CB3B0» (для игры – «8007F390»), как видите, расположена она недалеко. В ней записан «0» у японской камеры, и «1» у американской. Но её действие совсем другое…

Эй! Почему никто не сказал и не заметил, что в японском Spyro1 нельзя прыгать на бегу? А я-то ещё думаю, почему управление такое странное… Когда держишь квадрат, то нажатие креста не имеет эффекта. До тех пор, пока не включён РежиссёрскийРежим…
С американской камерой прыгать на бегу получается. Выходит, что виновница плохой игры не сама камера, а отсутствие такого необходимого прыжка на бегу!
Вот флаг наличия прыжка «1» и записывается в эту ячейку.

Результат таков: при обычной игре ячейка «8007F4B0» заполняется числом «115», а «8007F390» – нулём. А с R1+L1 – в «8007F4B0» будет «83», а в «8007F390» – единица!
Проверяю возможность изменения этого на лету в ОЗУ во время игры. Да! Как прыжок можно отключить и включить, так и режим камеры очень легко поддаётся изменению. Плюс, появляются ещё два новых состояния: американская камера без прыжка и японская камера с прыжком.

Теперь давайте определим цель… Раз уж можно включать и отключать прыжок, то имеет ли смысл ремонтирование камеры? Может, реализовать вечный прыжок на бегу, а камера пусть остаётся как L1+R1? Или наоборот, починить камеру, а пусть L1+R1 даёт только наличие прыжка. Но в любом случае мне ещё нужно заставить игру вписывать в эти ячейки те данные, которые захочу я, уже без ArtMoney.
Для этого сначала проделаю изменения в ОЗУ, потому определю, откуда оно было загружено, и через WinHex изменю там. Ведь я так сделал Вихрь…

Но камера вообще отказалась мне подчиняться. Сперва я решил узнать, что будет, если для прыжка записать не «0» и не «1», а для камеры – не «115» и не «85».
С прыжком всё понятно сразу: если он нулевой, то прыжка нет. Иначе он всегда есть, хоть там «1» или «255» или даже «4294967295» (FFFFFFFFh). Камера же гораздо необычнее.
Она работает при любом раскладе, будь там «0» или «255», но становится странная и дёрганая. Например при нуле она резко отлетает вверх, если развернуть Спайро лицом «сюда», а при «255» больше похожа на японскую, но она часто пытается развернуться как «активная», но почему-то застревает на полпути. В принципе, любое число так или иначе влияет на поведение камеры, но отличаются они незначительно. Поскольку я не собираюсь проводить 256 экспериментов, чтобы найти наилучшую камеру (ведь и «0» и «255» имеют ужасные глюки и отвратительные рывки при быстром движении), придётся явно сохранять константы «83» и «115».

Открываю начальный экран загрузки игры с карты памяти, чтобы найти момент, когда числа в ячейках меняются. Нет, ни при удержании L1+R1. А именно после нажатия креста и потухания экрана. Осталось определить субфайл, в котором прописан код загрузчика карты памяти. Это субфайлы с невысокими номерами и небольшими размерами.
Теперь я должен найти «источник» этих чисел «83» и «115», то есть именно то место в памяти (файлах), откуда они копируются в нужную область RAM. Плохо, что числа маленькие… если просто их искать, то я получу тонну совпавших данных… А если же.. о! Числа «155» и «83» на самом деле четырёхбайтовые, то есть если я изначально (а там пока нули) до нажатия креста заполню область рядом с «8007F4B0» (дюжину байт туда-сюда) максимальным значением в «255» (FFh), и нажимаю на крест – ячейка камеры превращается из 255 в 115 (ну или 83, если я удержал R1+L1), а следующие три байта становятся нулевыми! А это означает, что числа хранятся как «73000000h» и «53000000h», ну а их уже очень легко отыскать.

…Легко, но что-то не получается… Вижу кучи других значений, изменяю, запускаю – там снова заводское. Не, ну ладно… Может там какой-то расчёт происходит, ведь не просто так выбраны 83 и 155! Скорее всего биты разворачиваются, и каждый их них за что-то отвечает (например один за высоту, другой за скорость реакции камеры и.т.д). Возможно, разработчики оставили формулы «создания» этих констант вместо того, чтобы явно внести их в файлы.

Но ведь флаг прыжка не должен рассчитываться! Он либо ноль, либо один, причём тоже 32 бита. Нужно искать число «01000000» в памяти.
Ух… Да, их много. План такой – изменяю несколько на что угодно (лучше просто на 2, что терпимо для игры; ведь при 255 Epsxe часто начинает вылетать… к чему бы это?), нажимаю L1+R2+крест и смотрю в ОЗУ – если там остался «1», то я изменил мусор, значит эти значения можно спокойно удалить, а эмулятор через savestate загрузить обратно на момент поиска значений. Если же после одновременного изменения нескольких значений эмулятор завис или вылетел, то его необходимо перезагрузить, чтобы на этот раз поменять меньше ячеек. Ну я например, беру по сотне за раз, и если происходит ошибка (нашла коса на камень…), то разгребаю проблемный участок десятками; если и там ошибка, то уже определяю по одному – а потом снова вперёд сотнями! А ещё иногда в таблице сразу видны значения, которые постоянно меняются – их можно удалить сразу, даже не проверяя.

Я протрассировал так абсолютно все значения четырёхбайтовых единиц. Ничего! Я не смог найти место, откуда игра «достаёт» единицу, чтобы записать её по нужному адресу! О, кстати, а может поискать сам этот адрес? Нет, увы: он тоже не мелькает в дампах памяти, и совершенно неясно, как же игра его узнаёт. Стоп, а может при нажатии креста система подгружает новый субфайл, а механизм расчёта находится в нём? Тогда я переименовал свой savestate в «DEMO_999.99.000» и загрузил его через F3 после «Run BIOS». Это гарантированно предотвратит появление новых субфайлов. Опять неудача – значения и прыжка и камеры стабильно появляются в нужных ячейках…

А где эти самые области дублированы в файлах? Я начинаю шарить по ОЗУ через ArtMoney, пытаясь найти что-то особенное. Но там все так странно – немного ниже надпись «BISCPS-10083SPYRO» (которая есть и в EXE и в субфайлах), а прокрутив повыше обнаруживаю «Library Programs © 1993-1997 Sony Computer Entertainment Inc., All Rights Reserved», что уже явно выдрано из «SCPS_100.83» (тот же EXE) Короче – блок до и блок после есть в разных файлах в разных местах на диске. А вот именно это пространство словно само собой создаётся! Я пытаюсь найти указатель уже не на один адрес, а на диапазон адресов, сначала на небольшие участки, а потом уже от отчаянья до ±1024! И опять ничего…

Уф, что же мне делать? Есть другой вариант – найти участок в игре, где какие-то данные записываются по какому-то адресу. Подменить как адрес так и данные, чтобы в этот момент превращать камеру! Придумал два варианта: либо через меню, либо через L1, R1 в игре (перевороты через бок).
А что перевороты? Они разве нужны для игры? Я, например, по назначению так ни разу ими и не пользовался. Вот я и подумал, что нажатие L1 / R1 заносит в какую-то ячейку информацию о том, что для дракона пора воспроизводить анимацию переката (и совершать все связанные с этим действия) или даже проще – ставил флаг, в процессе ли сейчас кувырок или нет. Однако существует опасность, что ВСЕ кнопки управления могут брать этот адрес из одного и того же места, что не позволит его безболезненно изменить. Э-э, в любом случае, пока не взломаю – не узнаю!

Вот я и приступил к отсеиваниям. Стою > «искать» (кодированное значение). Пробежал, остановился > «не изменилось». Ушёл в другой уровень > «не изменилось». Тут быстро жму R1 и Esc, чтобы остановить эмуляцию > «изменилось». Восстанавливаю Epsxe, чуть жду > «изменилось», а потом сразу же > «не изменилось».
Нашёл несколько значений. Теперь при заморозке я должен впасть в бесконечный кувырок. Нет… Не вышло. Единственная ячейка, которая что-то делает – «9CB240» (для игры – «8007F220»), но это просто угол зрения камеры. Если увеличить, то она как бы приближается, но видно становится меньше. А если уменьшить (например до «-10», то есть «4294967286»), края раздвигаются, а изображение суживается. Становится видимо даже то, что находится почти сзади. И вот оно сохранение быстродействия – прекрасно понятно, что все модели и текстуры (да что уж! Даже полигоны неба) не отрисовываются там, где камера не должна их видеть. Скриншоты:

http://klimaleksus.narod2.ru/Files/1/cam_1.jpg (жаль, что скрин не передаёт динамичности бега…)
http://klimaleksus.narod2.ru/Files/1/cam_2.jpg (хотите знать, что это так ярко светит жёлтым? У Спаркса спросите…)
http://klimaleksus.narod2.ru/Files/1/cam_3.jpg (посмотрите на синий портал вдали)
http://klimaleksus.narod2.ru/Files/1/cam_4.jpg (а как он вам вблизи?)
http://klimaleksus.narod2.ru/Files/1/cam_5.jpg (и так во всей игре)

Ещё один весёлый адрес – «A3C7AA» (в игре – «800F078A»). Его я обнаружил ещё при взламывании экрана загрузки. Он отвечает за визуальную составляющую объекта «Спайро», который сперва прилетает по миру на площадку, а потом стоит на ней. Его можно превратить в одного зелёного монстра (которого он сшибает при приземлении), в другого такого же (который иногда пробегает на переднем плане, причём модель анимируется только если этот самый оригинал пробегает в этот момент), или в табличку «Insomniac Games» (особенно весело при полёте!) Присваивать значение от 1 до 4. Любые другие числа (по крайней мере из тех, что я попробовал) вызывают немедленный сбой и завершение работы эмулятора.

http://klimaleksus.narod2.ru/Files/1/cam_6.jpg (смир-но!)
http://klimaleksus.narod2.ru/Files/1/cam_7.jpg (как видно, центр таблички не совпадает с центром дракона…)
http://klimaleksus.narod2.ru/Files/1/cam_8.jpg (близнецы!)

Вернёмся ко взломам. Итак, идея с перекатами провалилась. Остаётся единственная надежда на меню. Открываю его и хочу понять, за что отвечает та самая строчка. Нахожу тут переводы меню («МТйД»), по таблице соответствия сопоставляю иероглифы (ага, закинул в Word и всё на глаз сравнивал, хотя можно было и в поиск дать…), наконец, определяю что это Стерео/Моно, нахожу его в EXE. Ищу указатель – фиг там! Ни на одну запись в EXE игра не держит указателей! Как такое возможно? Как система находит данные, не зная нужного отсчёта? А раньше ведь у меня получалось…

Ну ладно. Попробую оттолкнуться не от самого слова, а от того действия, которое производит изменение стерео на моно. Ломаю «кодированное значение» и отыскиваю всякие закономерности. Результат – пять адресов. Но скорее только два:
«9CBE10» (в игре «8007FDF0») – принимает «0» для стерео по умолчанию, и заменяется единицей «1» для режима монофонического звука. Причём я над ним немножко поиздевался и попробовал написать туда «2». Тогда он и три следующих байта вдруг стали равны «255» (FFh)! Это число «4294967295» или «-1». При следующем изменении оно превратилось обратно в «2». Выходит, что значение не явно присваивается, а вычитается из единицы. Следовательно, искать его бесполезно.
От «9CD2F0» (в игре «800812D0») до «009CD2F3» («800812D3») – то есть 4 байта. Однако его значения скорее напоминают четыре однобайтовых числа, чем одно четырёхбайтовое. Для стерео четвёрка равна «127=0=127=0» (шестнадцатеричные: «7F=0=7F=0»), а для моно – «63=63=63=63» (hex: «3F=3F=3F=3F»). Странно, не правда ли?

Пусть так. Значит эти числа («8323199» и «1061109567») откуда-то копируются! Надо найти как их, так и место, где записан пункт назначения конечный адрес «2148012755» (800812D3h).
И .. что? Ничего. Опять… Да что Spyro1 возомнил о себе!? Блин, мне бы просто посмотреть, отследить поведение системы в момент переключения настройки… Откуда берутся адреса и значения, да как именно копируются. Эх, я бы в код заглянул…
Ну хоть в какой-нибудь, хоть в ассемблер! Вспоминаю про «эмулятор с отладчиком», но к огромному сожалению он не собирается запускать японский Spyro1 (Хей, почему!? А на самой, реальной приставке Sony PlayStation, этот прожжённый на CD-R образ сможет ли нормально работать?)
Ну а даже б если запустил? Что я в нём могу? Не, вот даже при старте BIOS без диска… это ж ужас. Одно неловкое движение в меню, и вылетает необработанное исключение. А у него, походу, аллергия на эти самые исключения, так что он то и дело падает. Логирование. Не работает!! Вызовы процедур не трассируются, а сектора диска не мониторятся. В самом отладчике – просмотр дорожек диска (с наитупейшей в мире навигацией), который я запросто могу и в WinHex делать, потом граббер GPU, который НЕРЕАЛЬНО виснет… Стек вызовов процедур, который пуст при работе, а увидеть его можно только остановив действо. Просмотр состояний регистров, но на кой он сдался, если читабельного кода нет. Как же нет, есть! Там куча (с такой же идиотской навигацией) мнемонических команд, добрая половина которых нераспознана отладчиком. О, её можно запускать по шагам! А нука-сь… О-хо, эдак я год буду ждать завершения отрисовки одного кадра… Что-что ещё? «Выполнить до курсора»? Ага, осталось «угадать», на какой адрес поставить сам курсор… Последний писк – распечатка дизассемблерического листинга в файл, но всё что я смог оттуда получить – тонну надписей «illegal».

Но вдруг мне вспомнился один такой ps2dis, то есть, дизассемблер PlayStation 2. Я его скачал когда не помню и откуда не знаю. И куда положил тоже пришлось долго определять. На тот момент, я экспериментально кастовал на него различные PS-EXE'шки, но дальше горы мнемонических кодов не продвинулся и забросил это дело до лучшего применения…

…Которое наконец, настало! Вот сама прога:
http://klimaleksus.narod2.ru/Files/1/ps2dis.rar
Штучка отпадная. Очень, очень мощная! Но всё по порядку.
Во-первых, никакой инструкции там и в помине нет, так что мне пришлось как обычно, изучать программу в процессе. Во-вторых, она сразу распаковывает EXE по нужным адресам так, что все данные располагаются словно в эмуляторе – как если бы я дампил память. Кстати, я где-то читал, что дизассемблировать можно и дампы памяти, поэтому был готов если что, выдернуть парочку копий всех адресов с включённым на экране меню, чтобы отыскать в них нужную функцию. Но пока довольствовался EXE.

Что интересно, ps2dis умеет распознавать английский текст «ENTERING GNASTY'S WORLD» (что он там делает!?), но все «японские» кириллические байты распознаёт как реальные инструкции, так что процесс обещает быть долгим.
Не буду много говорить о том, как я изучал ps2dis, но навигация там простая, кнопкой «вправо» можно перейти по ссылке на адрес, кнопкой «пробел» пометить оператор, а «F3» и «Shift+F3» найти все те адреса, операторы которых ссылаются на помеченную строку (типа, навороченный поиск адреса).
Ну вот я и взял адресок «8007F4B0» (камера), перешёл на него клавишей «G», пометил строку и поискал ссылающихся. Вау! Да их же целая толпа! Хотя сам адрес пуст (ps2dis работает в полном пространстве от «00000000» до «FFFFFFFF», хотя ОЗУ располагается по крайней мере выше «80000000»). Поменьше рефереров было у адреса прыжка («8007F390»). Также без ссылок не остался и стерео-переключатель «8007FDF0», ну и его флаги «800812D0 – 800812D3».
Что дальше? Я вижу код, который явно что-то делает, но понятия не имею, как его читать. Я не знаю смысла мнемоники, хотя общая концепция программирования на ассемблере мне известна.

…Это ещё со времён «Sinclair ZX-Spectrum на основе *БЕЙСИК* микрон с микропроцессором Z80» (тот что 1990 года выпуска с 40Кб оперативки, 16Кб ПЗУ и 2Кб видеопамяти экрана 256 на 176 точек… Стоп, минуточку! *заглядывает в инструкцию* Да я его недооценивал! Системные характеристики: http://klimaleksus.narod2.ru/Files/1/cam_10.jpg ). Короче, там программы (в большинстве своём, игровые) делились на две категории – те, что написаны непосредственно на Бейсике, и на «программы в машинных кодах» (которые грузились всё равно-таки через ядро бейсика RANDOMIZE USR xxx), то есть на ассемблере. В инструкции сказано, что они создавались благодаря компиляции с Паскаля или «C» (который в те времена был ещё без плюс-плюс). Ну а я писал только на бейсике, исключительно на бейсике. Поэтому такие понятия как адреса и регистры меня напрямую не касались. Я как-то пытался что-то написать на самом ассемблере, но при любой ошибке этот (с позволения сказать) компьютер просто перезагружался (а вот бейсик был куда гуманнее, тихо выводя сообщения, и перезагружаясь только если свет моргнёт…) Вот я и почитал тогда справочку по устройству машинных кодов, знания которых пригодились мне.. вот лишь сейчас.

↓ ↓ ↓ ↓ ↓


Сообщение отредактировал aleksusklim - Воскресенье, 26.08.2012, 21:41
 
aleksusklimСообщение # 171 | Тема: Перевод японской версии Spyro the Dragon Воскресенье, 26.08.2012, 21:30
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
↑ ↑ ↑ ↑ ↑


Итак, ассемблер. Он работает только в заданных адресах. То есть если нелинейный (ветвящийся) код скопировать и вставить в другое место, то ссылки будут показывать на прежнее. Или придётся вручную отыскивать и менять все адреса (может автоматически, если код был получен компиляцией, а не ручным вводом).
Сама программа представляет из себя набор команд. Они исполняются очень быстро подряд. Но команды не масштабируемы, то есть это не как обычный код, мол «X=sqrt(2+2*2+1*3)», а команда=операция, только что-то одно. Результаты промежуточных операций надо где-то хранить, для этого существуют регистры. Это, типа, такие переменные. Они бывают разного размера и типа (ну в Синклере были маленькие восьмибитные (1 байт) регистры, но они соединялись в пары, получая шестнадцатибитные уже по два байта). Поэтому, чтобы что-то сложить, нужно, грубо говоря, сначала занести первое слагаемое в один регистр, потом занести второе слагаемое в другой регистр, а затем приравнять третий регистр сумме первых двух, и скорее всего, поместить результат в какую-то ячейку памяти, адрес которой должен храниться в четвёртом регистре…
Чтобы не растранжирить так сразу все регистры несколькими действиями, был изобретён глобальный стек. Это как банка, в которую можно засовывать значения изменяемых регистров. А извлекаться они будут в обратной последовательности, то есть первый выйдет последним. В стек сперва помещают значения всех тех регистров, которые нужны для текущего действия (в задуманном порядке), потом производят само действие с этими регистрами, а уж затем восстанавливают из стека все былые значения, что могли быть стёрты при выполнении. Даже если одной из промежуточных операций будет вызов функции (переход исполнителя по другому адресу и возврат оттуда), которая захочет использовать те же самые регистры, то она тоже просто временно положит их текущие значения в глобальный стек. Главное тут не забыть вытащить из стека всё, что было в него внесено, ведь иначе рано или поздно произойдёт переполнение (хотя с большей вероятностью система просто накроется, когда в регистр не вернётся нужное значение)
Команды, понятные для человека, записывались мнемоникой, например «NOP» означает «ничего не делать», а «MOV» – занести что-то в регистр. Аргументы и имена регистров пушится через запятую после команды (видимо AutoIt ниже третьей версии выглядел примерно так же).
Стоит ли говорить, что регистр мог хранить ТОЛЬКО числа. А не строки. Строка (скорее всего) задавалась адресом первого символа (в регистре) и нулевым байтом на конце (или длиной, записанной либо в другом регистре, либо в ячейке, адрес которой всё равно лежит в каком-то регистре).
В общем, концепция программирования чудовищно отличается от привычной. Ну совершенно! (Это даже хуже, чем DOS). Где-то не так давно на компе читал CHM-справку какой-то программы или эмулятора чего-либо, и посмотрел, как в нём работают стандартные функции… Ужас! (Хоть бы больше такого нигде не было…) Функции там имеют номер и подномер. Они принимают аргументы и возвращают результаты. Так вот, чтобы вызвать функцию, нужно было занести в один регистр номер нужного раздела функций, в другой регистр – подномер уже самой функции, в ещё кучу других регистров – аргументы. Затем как-то воплотить её исполнение. После чего выкопировать себе результаты из других регистров. Ассемблер-то быстрый, но если его ТАК гонять…

Ну я отвлёкся. Итак, ps2dis. Мне была срочно нужна хоть какая-нибудь справка по командам, чтобы прочитать код Spyro. Забурился в интернет, нашёл страничку:
http://gamehacking.org/faqs/1UpPS2Dis.html (Кстати говоря, там нет ни одной команды для работы со стеком! Неужели PlayStation обходится без него?)
Очень странно, но других нормальных описаний не было. Да и это не ахти как профессионально сделано (да что они там в самом деле? Туториалы, видео-уроки, пошаговые инструкции… идиоты! Дайте справку по всем командам как htmlbook.ru даёт по тегам!!)
Рассказывается не всё, чертовски не всё! Как, например, загрузить данные с диска в ОЗУ? А как заставить GPU использовать выбранный графический ресурс? А как воспроизвести звук или считать нажатия кнопок на джойстике?
Здесь даны чисто математические функции, немного работы с памятью и операторы языка. А вот какое-то действие выполнить с ними я не смогу, до тех пор, пока не узнаю, как «вынуждать» систему действовать (ну, скорее всего, придётся занести в регистр адрес начала данных, в другой регистр номер требуемого действия и написать правильную команду…)
Но мне и математики хватит, по крайней мере я смогу изменить адреса и значения нужных ячеек, а игра сделает остальное.
Попробовал использовать тот набор С++ разработчика для PS, который мелькнул от steeldragon (нь..ет, я не.. игнорирую, я просто… уф, я отвечу там, точно отвечу!) Скомпилировал один демо EXE и дизассемблировал его. Там такая хренотень в кодах, что дольше десяти минут я не продержался… Они ведь тоже какой-то движок использовали, у которого куча функций в арсенале.

Ещё по ps2dis:
Кто-то пишет что-то умное, но словно для кого-то глупого:
http://www.oocities.org/techni_slave/hack.html
Очень хорошее описание всех горячих клавиш:
http://www.oocities.org/siliconvalley/station/8269/ps2dis/

Всё, пора начинать мой взлом! Запускаю ps2dis (шрифт – Courier New 12 смотрится неплохо), открываю в нём EXE и перехожу по адресу «8007FDF0» – это ячейка, отвечающая за моно/стерео настройку в меню. Вижу пустоту, как и ожидалось. Включаю анализатор (помечает все линии, на которые есть ссылки):
http://klimaleksus.narod2.ru/Files/1/dis_1.png
Space+F3 – ищу ссылающихся. Первый:
http://klimaleksus.narod2.ru/Files/1/dis_2.png
Так-с, «LW» что означает «Load Word», то есть, код загружает значение из этой ячейки в регистр V0, а чуть ниже сравнивает его с нулём. Это точно не для меню (там должно быть сохранение) Идём дальше, F3:
http://klimaleksus.narod2.ru/Files/1/dis_3.png
Интересно, да? «LI», которого нет в описании. Смею предположить, что это «Load Integer (или Immediate)», расшифровывающееся как «addiu a0, a0, $fdf0», что видно из строки состояния. Тут меня осенило, почему я не мог найти адреса в ОЗУ. Да потому что адрес разбивается на две части – на верхнюю половину «8007» и нижнюю – «FDF0», и грузятся они в два действия! В предыдущей строке стоит «lui a0, $8008». Зачем он превращается в «8007» я точно не знаю, но так происходит везде. Код загрузки адреса такой:
lui a0, $8008
addiu a0, a0, $fdf0
, что приравнивает регистр «A0» (смаю предположить, что с «А» начинаются специальные регистры, предназначенные именно для хранения адресов памяти, а не просто так) значению «8007FDF0».
Кстати, видите строчку выше «mov a3, zero»? Команда MOV тоже не описана. Потому что это лишь упрощение реальной команды «addu a3, zero, zero», чтобы обнулить регистр. Хм, кажется, строка «lui a0, $0000» приведёт к тому же самому результату! Да в прочем, какая разница, написать «X=0» или «X=X-X» или даже «X=A*0», если результат всё равно нулевой? Остаётся лишь заметить, что слово «zero» означает РЕГИСТР, в котором хранится вечный ноль, а само число «0» записывалось бы «$0000», но далеко не все команды принимают числовые значения, поэтому «zero» используется очень часто.

Ладно, давайте посмотрим, что Спайро делает с этим адресом, который сейчас сохранён в A0. Дальше по коду видны сразу две ссылки (ps2dis подсвечивает A0). На F3 они реагируют точно так же, вот послеследующий:
http://klimaleksus.narod2.ru/Files/1/dis_4.png
Ха, «SW»! Это и есть код изменения пункта меню. Но пока пройдёмся по другим ссылкам:
http://klimaleksus.narod2.ru/Files/1/dis_5.png
Тут (заметьте, очень далеко внизу!) по нашему адресу записывается «zero», то есть ячейка обнуляется. Это уж точно мне не мешает, иду ниже:
http://klimaleksus.narod2.ru/Files/1/dis_6.png
Здесь тоже загружают значение и сравнивают его с нулём. А тут же присутствует «jr ra», то есть возврат из функции. Между какие-то данные что-то считывают и записывают…
http://klimaleksus.narod2.ru/Files/1/dis_7.png
SW, интересный блок. Регистр «AT» подсвечен, и он постоянно приравнивается в «8008», то есть в него грузится верхняя часть того адреса, который используется последующей строкой. Резонный вопрос, зачем повторять одно и то же, если «at» вообще не изменяется на протяжении всего кода? Мне кажется так сделал тот компилятор, на исходнике к которому писали Spyro. Ну ведь не на ассемблере же! Машинный код создан другой программой. А у неё, кажется, любой адрес задаётся двумя строчками ПОДРЯД. Система как бы переопределяет число полностью. Словно не знает, что его верхняя половина одинакова. Грубо говоря, конструкция:
A=8008
X1=A+0001
X2=A+0002
X3=A+0003
Исполнена как:
A=8008
X1=A+0001
A=8008
X2=A+0002
A=8008
X3=A+0003
Расточительно, зато если бы вдруг пришлось кардинально поменять один из адресов, это на остальные это не произвело бы влияния. Их движок как бы подходит к каждому присваиванию заново, даже не глядя на то, что AT уже хранит как раз именно то число, которое ему присваивают ещё раз. Код не оптимизирован. Но мне это без разницы, иду к последнему ссылающемуся:
http://klimaleksus.narod2.ru/Files/1/dis_8.png
А этот код словно обратен предыдущему, теперь значения из той части памяти копируются в эту. (Забегая вперёд скажу, что я на 95% уверен, что это коды сохранения и загрузки игры на карту памяти)

В результате возвращаюсь в область третьего ссылающегося, где лежит основная функция изменения режима стерео в меню:
http://klimaleksus.narod2.ru/Files/1/dis_9.png
Вот я так сидел и смотрел на этот код. Я пытался прочитать его, перепроверял MIPS (мнемонику) и думал над ним. Это первый в моей жизни раз, когда я читал код Ассемблера и понимал, что он означает… О, как я был близок к изменению!
Но я очень боялся притронуться к нему. Как? Разве можно просто так переписывать код без всяких тренировок и инструкций? Лишь очень размыто представляя себе дальнейшую работу? Я на краю утёса… Я вор, который мечтал добраться до самого сложного сейфа в самом охраняемом банке, и который сделал это и стоит перед ним… Я космонавт, годами тренировавшийся к полётам, и вот вставший перед трапом к кабине корабля, готовящегося к старту…

Короче, я минут сорок просто смотрел на код. Уж не знаю, думал ли я над этим кодом, или просто завис в переживаниях, но через какое-то время мне надоело ничего не делать, и я взялся за перепись.
Определил много нового в ассемблере (особенно касательно прыжков), чего раньше не знал. Потом ещё поискал в интернете и убедился, что сделал правильные выводы. Написал свой код. Сохранил (хи, в ps2dis интересная система сохранения области, а я как дурак на глаз в WinHex списывал…). Проверил. Не работает, вернее, не полностью. Изменил код, перепроверил. Уже по-другому, но неправильно. Подумал ещё, изменил и проверил. О, наконец! Жизнеспособная версия. Но глюки при входе в игру с L1+R1 (я не сменил стерео-адрес, но сравнивал адрес прыжка, что приводило к неработоспособности настройки: нужно было дважды щёлкнуть её в меню, чтобы отключить и снова включить). Потом значение неверно сохранялось и загружалось на карту памяти… А как выяснилось, за стерео звучание отвечает именно ноль в «8007FDF0», а не «127=0=127=0» в «800812D0»! Пришлось ещё раз переписать весь код этого блока, и, вроде, всё заработало. Потом я раскрасил надписи и закончил.

Хей, не кажется ли вам, что я замял конец рассказа? Начинал так медленно, а финишировал одним абзацем? Сейчас распишу подробнее… Просто я уже и не вспомню всех промежуточных тестирований нерабочего кода, потому что я их не сохранял, а даже если бы сохранял, то не запомнил бы назначение и ход моих мыслей в тот момент. Так что я просто распишу логику оригинального кода и изменённого кода, но не неудачные попытки его создания. Но поверьте на слово, перепечатывал байты из ps2dis в WinHex я раз восемь. И простите, если вдруг стану немножко повторяться…

Итак, оригинальный блок. Я пронумеровал строчки справа:
http://klimaleksus.narod2.ru/Files/1/dis_10.png
Смотрим-с. Вот сам код:
0 ) 8002d704: jal $80059f90
1 ) 8002d708: addu a3, zero, zero
2 ) 8002d70c: lui a0, $8008
3 ) 8002d710: addiu a0, a0, $fdf0
4 ) 8002d714: lw v1, $0000(a0)
5 ) 8002d718: addiu v0, zero, $0001
6 ) 8002d71c: subu v0, v0, v1
7 ) 8002d720: beq v0, zero, $8002d754
8 ) 8002d724: sw v0, $0000(a0)
9 ) 8002d728: addiu v0, zero, $003f
10) 8002d72c: lui at, $8008
11) 8002d730: sb v0, $12d3(at)
12) 8002d734: lui at, $8008
13) 8002d738: sb v0, $12d2(at)
14) 8002d73c: lui at, $8008
15) 8002d740: sb v0, $12d1(at)
16) 8002d744: lui at, $8008
17) 8002d748: sb v0, $12d0(at)
18) 8002d74c: j $8002d778
19) 8002d750: nop
20) 8002d754: addiu v0, zero, $007f
21) 8002d758: lui at, $8008
22) 8002d75c: sb v0, $12d2(at)
23) 8002d760: lui at, $8008
24) 8002d764: sb v0, $12d0(at)
25) 8002d768: lui at, $8008
26) 8002d76c: sb zero, $12d3(at)
27) 8002d770: lui at, $8008
28) 8002d774: sb zero, $12d1(at)
29) 8002d778: lui a0, $8008
30) 8002d77c: addiu a0, a0, $12d0
31) 8002d780: jal $80068eb0
32) 8002d784: nop

Он сильно отличается от того, что видно на скриншоте, потому что ps2dis сам определяет и показывает вычисленные адреса известных регистров, а в распечатке выдаёт настоящий голый код. Руководствоваться лучше скриншотом, заглядывая в сам код лишь для ясности. Поехали, сперва объясню каждую строчку, а логику поведаю после:
0 ) Вызвать функцию (с возвратом) по адресу «80059F90» (что на 45603 строки впереди) после исполнения следующего оператора.
1 ) Приравнять регистр «a3» нулю.
2 ) Записать в регистр «a0» число «80080000» (здесь и далее всё в шестнадцатеричной)
3 ) Изменить значение регистра «a0» на «8007FDF0».
4 ) Считать 4 байта по адресу «0000+a0» (т.е. «8007FDF0») и сохранить их в «v1».
5 ) Приравнять регистр «v0» числу «0001».
6 ) Вычесть из регистра «v0» (т.е. из единицы) содержимое регистра «v1» и сохранить обратно в регистр «v0».
7 ) Выполнить следующий оператор, затем сравнить содержимое «v0» с нулём; если не равно, то продолжать, а иначе перейти к адресу «8002d754» (что на 13 строк впереди, т.е. к строке № 20)
8 ) Сохранить в 4 байта по адресу «0000+a0» (т.е. «8007FDF0») содержимое регистра «v0».
9 ) Приравнять регистр «v0» числу «003F».
10) Записать в регистр «at» число «80080000».
11) Сохранить 1 байт по адресу «12D3+at» (т.е. «800812D3») из регистра «v0» (т.е. число «3F»)
12) Записать в регистр «at» число «80080000».
13) Сохранить 1 байт по адресу «12D2+at» (т.е. «800812D2») из регистра «v0» (т.е. число «3F»)
14) Записать в регистр «at» число «80080000».
15) Сохранить 1 байт по адресу «12D1+at» (т.е. «800812D1») из регистра «v0» (т.е. число «3F»)
16) Записать в регистр «at» число «80080000».
17) Сохранить 1 байт по адресу «12D0+at» (т.е. «800812D0») из регистра «v0» (т.е. число «3F»)
18) Безвозвратно перейти по адресу «8002D778» (что на 11 строчек впереди, т.е. к строке № 29) после исполнения следующего оператора.
19) Ничего не делать.
20) Приравнять регистр «v0» числу «007F».
21) Записать в регистр «at» число «80080000».
22) Сохранить 1 байт по адресу «12D2+at» (т.е. «800812D2») из регистра «v0» (т.е. число «7F»).
23) Записать в регистр «at» число «80080000».
24) Сохранить 1 байт по адресу «12D0+at» (т.е. «800812D0») из регистра «v0» (т.е. число «7F»).
25) Записать в регистр «at» число «80080000».
26) Сохранить нулевой байт по адресу «12D3+at» (т.е. «800812D3»).
27) Записать в регистр «at» число «80080000».
28) Сохранить нулевой байт по адресу «12D1+at» (т.е. «800812D1»).
29) Записать в регистр «a0» число «80080000».
30) Изменить значение регистра «a0» на «800812D0».
31) Вызвать функцию (с возвратом) по адресу «80068EB0» (что на 60876 строк впереди) после исполнения следующего оператора.
32) Ничего не делать.

↓ ↓ ↓ ↓ ↓


Сообщение отредактировал aleksusklim - Воскресенье, 26.08.2012, 21:42
 
aleksusklimСообщение # 172 | Тема: Перевод японской версии Spyro the Dragon Воскресенье, 26.08.2012, 21:40
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
↑ ↑ ↑ ↑ ↑


Довольно интересные можно сделать выводы! Начнём:
0) Поскольку функция вызывается очень издалека, отслеживать её нет необходимости, поэтому не обращаем внимания на эту строку.
1) Обнуление «a3» происходит ДО предыдущего прыжка. А знаете, почему? Почему строка после инструкции перехода выполняется до самого перехода? Потому что ассемблер очень быстрый. Он реактивный, он сверхзвуковой! Процессор несётся по строчкам с небольшим опережением, поэтому, когда он получает очередную строку для обработки, он заранее готовится взять новую следующим шагом. То есть невозможно моментально изменить номер текущей строки. Это происходит с задержкой на полстроки, а именно: система принимает инструкцию прыжка (j*, b*), затем выполняет следующий оператор, и в это же время начинает готовиться брать наконец ту строку, на которую указала инструкция перехода. Короче, два выхода: либо мысленно поменять прыжок со следующей строкой (если там не ещё один прыжок, хотя на практике такого не делают…), либо ставить NOP после каждого прыжка (ведь он всё равно пропускается)
2) Дополнение для следующей строки, чтобы нормально загрузить адрес «8007FDF0». Пока что грузится лишь «80080000» в «a0».
3) Прибавление к «80080000» окончания «FDF0» даёт в сумме адрес «8007FDF0». Странно? Даже очень, если рассмотреть строки 29 и 30, где при той же технике число «10000» не отнимается из результата. Там, оказывается, есть объяснение… Когда прибавляется значение, не превосходящее «7FFF», то оно просто складывается; а если это число больше или равно «8000», то из результата сперва вычитается «10000»! Зачем не знаю, но так везде – если правая часть адреса (или любого регистра) не меньше 8000, то левую надо увеличить на «0001» (00010000) предыдущим шагом.
4) Получение значения настройки Стерео/Моно («8007FDF0») и запись его в «v1». Как мы знаем, настройка обозначает «00000000» для стерео и «00000001» для моно.
5) Записывается в «v0» простая единичка («00000001»). Сейчас узнаем, зачем…
6) Вычитание! Самое оно (про которое я упомянул, когда в ArtMoney внёс в ячейку число «2»)! Из единицы вычитается флаг стерео, который либо 0, либо 1. Таким образом он меняет свое состояние, превращаясь из нуля в единицу и из единицы в ноль. Именно это действие можно назвать самым центром настройки стереозвука в меню. Эта строчка меняет стерео на моно и моно на стерео.
7) Прыжок. Если «v0» (результат вычитания), т.е. новое состояние переключателя, равно нулю (переход с моно на стерео), то прыгнуть к строке № 20, а иначе (переключение со стерео на моно) – продолжить исполнение кода дальше.
8) Действие, обратное строке № 4, которое сохраняет значение регистра «v0» (новое состояние настройки) по тому же самому адресу, по которому оно было взято ранее, а именно «8007FDF0», ведь регистр «a0» с тех пор не изменился. Вспомним, что это действие выполняется ПЕРЕД прыжком, в независимости от того, будет ли он совершён в предыдущей строке.
9) Число «3F» (т.е. «63» в десятичной) заносится в регистр «v0». Это не адрес (как предполагает ps2dis, создавая метку), а то число, которое должно оказаться в каждом из четырёх байт моно-режима. Ведь этот код выполняется для преобразования в моно, так что байты должны задаваться тут.
10) Верхняя часть адреса сохраняется в «at». Поскольку все четыре конечных адреса 12d0, 12d1, 12d2, 12d3 не превосходят 8000, в верхний разряд идёт «8008» как полагается.
11) Байт «3F» (63) сохраняется в «800812D3». Он должен быть записан в три другие ячейки без изменений.
12,13,14,15,16,17) Сохранение, почему-то, происходит в обратном порядке, то есть сначала в 800812D3 (предыдущий шаг), потом в 800812D2, затем в 800812D1 и наконец, в 800812D0. Всё это делается однообразным кодом, в котором «at» постоянно принимает значение «80080000» перед непосредственной записью.
18) Прыжок к строке № 29, ведь иначе ветка для стерео тоже исполнится. Для ветвлений подобного типа всегда требуется два прыжка: один по условию, который отодвинет вперёд одну из веток; а другой прямо перед началом этой отодвинутой ветки, чтобы исполнитель, завершив ближнюю ветку, сразу прыгнул за конец дальней (хм, подобный приём я часто использовал на том самом Бейсике, ведь области ELSE там не было и в помине… Мне приходилось ставить на IF оператор GOTO, направив настолько вперёд, сколько хочу отдать под мнимый ELSE, а перед оператором назначения поставить ещё один GOTO, направленный после конца мнимого THEN… большие трудности произойдут, если я захочу немного дописать в ту или иную ветку… Благо, разрешено по 255 операторов в строке и между соседними строками особая нумерация (10,20,30,40…) позволяла вставить по 9 других… но если уж совсем невмоготу, то выручал GOSUB, направленный куда-нибудь далеко-далеко на 9000, где были поля свободного места, главное не забыть RETURN в конце… А вообще, знаете. Тот Синклер и всё связанное с ним очень поощряло ко всякого рода взломам! Вот что написано в одном абзаце _официальной_ инструкции: http://klimaleksus.narod2.ru/Files/1/cam_9.jpg ! Особенно меня поражает строчка «Например, взломаем загрузчик игры…»)
19) Пустая команда, чтобы предшествующий прыжок прошёл без дополнительных нагрузок.
20) Как строка № 9, здесь «v0» получает число «7F» (т.е. 127 для стерео), который должен быть занесён уже не во все четыре, а только в две ячейки.
21) Опять пишем в «at» верхнюю часть «80080000», чтобы корректно определить адрес назначения.
22) Аналог № 11, но уже число «7F» (127) сохраняется в «800812D2». Да, тут уж совсем не по порядку, смотрите далее.
23) Ещё раз обновляем «at» (совершенно бесполезное действие, но зато даёт потенциальное место для собственных строчек кода!)
24) Пишем «7F» по «800812D0». А вот в остальные два уже нужны нули.
25) Всё тот же «at»…
26) Вот! Глядите, как интересно: ноль не прописывается явно в «v0», как можно было бы ожидать, а вместо «v0» применяется «zero», в котором всегда вечный ноль! Так что адрес «800812D3» с лёгкостью обнуляется.
27) «at»!
28) Повтор операции нулевого регистра, теперь для последнего адреса «800812D1». Это завершающая строка всего ветвления, дальше код исполняется и для моно и для стерео.
29) Регистр «a0» вновь принимает «80080000» для новых манипуляций.
30) Его превращают в «800812D0», я уже не знаю для чего, ведь интересующий меня код закончился.
31) Функция! Не знаю, зачем она нужна, да и знать не хочу.
32) Пустота для упрощения предыдущего вызова.

Ну как вам кодик? (Вообще говоря, он мог быть построен десятком различных способов, например запомнить 63, 127 и 0 в разных регистрах, выбрать один из них по ветке, а код записи сделать единственным, или вообще грузить все 4 байта как одно word, как значение всего регистра через SW)
Вот я стал планировать, какую его часть предстоит менять. Строки 0 и 1 к делу отношения не имеют, так что я их не трону. Строчки от 20 до 32 формируют такой набор байт, который необходим для правильного стерео режима. А поскольку я задумал всегда иметь бесконечное стерео, то этот код, в принципе, можно исполнять постоянно при смене режима камеры, чтобы стерео уж точно никуда не делось. Поэтому с 20 до 32 я тоже не изменю, а ветку направлю так, чтобы код исполнялся подряд, начиная с 20 и дальше, то есть стерео будет переопределяться постоянно.

А как менять? Сначала я просто заменял адреса. Ну и регистры и числа. А потом смекнул, что значение переключателя моно-стерео «8007FDF0» на самом деле и определяет моно да стерео! Никакие 127=0=127=0, ни 63=63=63=63! Это бесполезно, вообще не знаю, для чего они. За стерео отвечает один байт «8007FDF0» – ноль = стерео, а единица (или что угодно) – моно. Если я на основе оригинала построю на нём переключатель камеры, то одновременно и режим звука будет меняться. (Как я это узнал? Вставил в уши наушники, запустил новую игру (прямо по курсу первый замороженный дракон), отвёл Спайро правее и ниже. Теперь кристаллический звук статуи слышен только в левом наушнике, а овцы, враги и девчачьи вздохи Спайро – как в правом, так и в обоих. При изменении в ArtMoney все звуки резко начинали проигрываться в обоих наушниках; обратно – снова раздельно. Кстати, музыку лучше отключить в меню, ибо она всегда играет одинаково, хотя может и нет, просто мало отличается…)

Мне так не катит. Ещё раз, если я сохраню логику оригинальной ветки, проверяя «8007FDF0», и в зависимости от этого выставляя «8007F4B0» и «8007F390» (ну прыжок же тоже менять?), то моно и стерео у меня станут изменяться, как говорится, as well. Поэтому от «8007FDF0» вообще нельзя отталкиваться, его следует хранить нулевым (вечное стерео). Но блин, при этом само меню перестаёт работать, потому что (похоже) механизм отрисовки японского текста сам и проверяет адрес «8007FDF0» ! Чтобы избавится от такого, мне придётся найти и изменить его тоже.
Вторая проблема – сохранение на карту памяти. Как мы знаем, камера НЕ МОЖЕТ быть сохранена на карту ни в каком виде, потому что превращается в японскую (по умолчанию) ПОСЛЕ загрузки игры из сейва. А вот флаг моно-стерео загружается. И сохраняется! Поэтому его следует постоянно приравнивать нулю, как при изменении режима камеры (т.е. даже если вы загрузитесь из моно, то оно станет стерео при первом же пользовании моей опцией), так и при сохранении на карту (даже если не менять камеру, моно станет стерео после следующей загрузки новой сохранёнки), но при самой загрузке трогать что-то большого смысла не имеет, можно даже не тратить время.

Что ж, я меняю код! Жёстко меняю, словно я ас в ассемблере. Скриншот:
http://klimaleksus.narod2.ru/Files/1/dis_11.png
Ну как? Заметна разница? Распечатка:
2) 8002d70c: addu v1, zero, zero
3) 8002d710: lui a0, $8008
4) 8002d714: addiu a0, a0, $f390
5) 8002d718: lw v1, $0000(a0)
6) 8002d71c: beq v1, zero, $8002d734
7) 8002d720: nop
8) 8002d724: addiu v0, zero, $0073
9) 8002d728: addiu v1, zero, $0000
10)8002d72c: j $8002d740
11)8002d730: nop
12)8002d734: addiu v0, zero, $0053
13)8002d738: addiu v1, zero, $0001
14)8002d73c: nop
15)8002d740: sw v1, $0000(a0)
16)8002d744: sw zero, $0a60(a0)
17)8002d748: sw v0, $0120(a0)
18)8002d74c: nop
19)8002d750: nop

А разница очень большая. Сперва расшифровка, затем логика:
2) Приравнять регистр «v1» нулю.
3) Записать в регистр «a0» число «80080000».
4) Изменить значение регистра «a0» на «8007F390».
5) Считать 4 байта по адресу «0000+a0» (т.е. «8007F390») и сохранить их в «v1».
6)Выполнить следующий оператор, затем сравнить содержимое «v1» с нулём; если не равно, то продолжать, а иначе перейти к адресу «8002D734» (что на 6 строк впереди, т.е. к строке № 12)
7) Ничего не делать.
8) Приравнять регистр «v0» числу «0073».
9) Приравнять регистр «v1» числу «0000».
10) Безвозвратно перейти по адресу «8002D740» (что на 5 строчек впереди, т.е. к строке № 15) после исполнения следующего оператора.
11) Ничего не делать.
12) Приравнять регистр «v0» числу «0053».
13) Приравнять регистр «v1» числу «0001».
14) Ничего не делать.
15) Сохранить в 4 байта по адресу «0000+a0» (т.е. «8007F390») содержимое регистра «v1».
16) Сохранить в 4 байта по адресу «0A60+a0» (т.е. «8007FDF0») нулевой регистр.
17) Сохранить в 4 байта по адресу «0120+a0» (т.е. «8007F4B0») содержимое регистра «v0».
18) Ничего не делать.
19) Ничего не делать.

!! Ясно? За переключатель я взял сам флаг прыжка на бегу! Ноль (по умолчанию) – японская камера, прыжка нет, псевдостерео. Один – прыжок есть (по факту изменения ячейки), камера американская, псевдомоно. Логика:
2) Обнуляю «v1» на крайний пожарный, чтоб уж точно загрузилось верное значение. В принципе, этого можно и не делать.
3,4) Копия оригинальных строк 2 и 3, с той лишь разницей, что адрес уже не «8007FDF0» (стереомоно), а «8007F390» – прыжок на бегу.
5) Считываю из «8007F390» в регистр «v1». Его и буду проверять…
6) Ветвление. Не такое большое как в оригинале, мне ведь всего два регистра сменить… Сейчас проверяется не новое значение (не как в оригинале!) а ещё старое. То есть ноль означает переход со стерео на моно, а единица – с моно на стерео. Прыжок на строку 12 происходит при переходе на моно. Продолжение при стерео. ВНИМАНИЕ: на самом деле это уже никакие не «стерео» и не «моно»! Но ведь менюшка-то будет озаглавлена по-старому… Вот я и решил зафиксировать за японским словом «СТЕРЕО» режим японской камеры без прыжка, а под словом «МОНО» – американский с прыжком. И отношение «8007FDF0» с «8007F390» одинаково – стерео = нет прыжка = по умолчанию; моно = прыжок = по требованию.
7) Пустота, я не хочу путаться в операторах.
8) Японская ветка. Заношу в «v0» число «115», свойство японской камеры.
9) А в регистр «v1» – число «0», новое значение прыжка на бегу. (Хей! Вы заметили, что я избавился от вычитания? Не, реально, зачем оно нужно? Я лучше явно выберу значение в самой ветке. Кстати, поэтому я взял «$0000», а не «zero» – у американцев ведь единица будет…)
10) Прыжок на строку 15, чтобы код американской камеры не исполнился сейчас.
11) Пустота, для облегчения этого самого прыжка.
12) Американская ветка. Загружу в «v0» число 83, свойство американской камеры.
13) А в регистр «v1» – единицу, активирующую прыжок на бегу (и одновременно являющуюся флагом самого переключателя псеводостерео/псевдомоно).
14) Пустота. Ничем не оправданная, просто визуально отделяет окончание ветвления. Я ведь не ограничен количеством строк! При всём желании я даже мог бы поставить JAL и свалить хоть сотню строчек куда-нибудь в свободное место, если бы мне не хватило имеющегося здесь пространства.
15) Общая часть. Сохраняю «v1» по тому же самому адресу, по какому взял его (8007F390), но теперь его значение сменилось с 1 на 0 или с 0 на 1. По совместительству, прыжок на бегу.
16) Обнуляю адрес для режима звука, то есть «8007FDF0». А вы заметили, каким образом я это сделал? Я не стал по сто раз грузить «8008» в адресные регистры! Я немного посчитал… Мой адрес прыжка – «8007F390». Это меньше, чем «8007FDF0». И даже меньше «8007F4B0», адреса режима камеры! Выходит, что я могу просто плюсовать небольшие числа (а именно «0», «A60» и «120») при непосредственное записи, не меняя значения самого адресного регистра.
17) Тем же путём сохраняю «v0», свойство камеры, по вычисленному адресу «8007F4B0». Кстати, ps2dis тут сам запутался, и не может показать результирующий адрес, как он делал это в оригинале. Печальная новость: это означает, что не во всех случаях можно легко определить ссылающиеся ячейки… Значит мне с таким удачным взломом просто повезло.
18) Пустота. А действительно, мне больше нечего писать, я закончил!
19) Пустота, бывшая здесь и в оригинале. Знаменует окончание изменений, ведь к последующему коду я не прикасался.

Думаете, взлом закончен? Не-а! Если оставить всё как есть, то меню не сможет переключать настройку, вернее, этого не будет видно. Потому что графическая часть всё ещё проверяет адрес «8007FDF0», значение режима звука. Цель: найти его и изменить на «8007F390»!
А ведь поиск я уже производил – это первоначальная прогулка с F3, видная на ранних скриншотах выше в тексте. Перечислю-ка их ещё раз:
http://klimaleksus.narod2.ru/Files/1/dis_2.png
Вероятно. Ведь он – единственный, а следующим идёт тот блок, который я только что поменял. Оставшиеся:
http://klimaleksus.narod2.ru/Files/1/dis_5.png
Но тут сохраняется ноль. Возможно, это блок при загрузке игры, ведь стартовый экран проходит как стерео.
http://klimaleksus.narod2.ru/Files/1/dis_6.png
Функция, в которой считывается это значение. Возможно, что это нужная область…
http://klimaleksus.narod2.ru/Files/1/dis_7.png
http://klimaleksus.narod2.ru/Files/1/dis_8.png
Сохранение и загрузка. Предполагаю, что на карту памяти… Понять, чему равен «s0» мне так и не удалось!
Остаётся два варианта, либо адрес «80019F34» ( http://klimaleksus.narod2.ru/Files/1/dis_2.png ), либо «8005B31C» ( http://klimaleksus.narod2.ru/Files/1/dis_6.png ). Но следует учесть, что один из них должен использоваться самой игрой для воспроизведения стерео или моно звука. Что ж, раз второй лежит внутри функции, да ещё и очень далеко внизу, а первый почти перед кодом изменения меню, то я предполагаю, что менять следует именно адрес с первого из этих двух скриншотов.

И я не ошибся! Новый код:
http://klimaleksus.narod2.ru/Files/1/dis_12.png
Незатейливое изменение строки 80019F34:
с
lw v0, $fdf0(v0)
на
lw v0, $f390(v0)

Отныне менюшка полностью рабоатает! Остаётся сохранение на карту… По скриншоту http://klimaleksus.narod2.ru/Files/1/dis_7.png :
Меняю регистр «v0» на вечно пустой «zero»:
http://klimaleksus.narod2.ru/Files/1/dis_13.png
То есть код 8005DD38:
с
sw v0, $fdf0(at)
на
sw zero, $fdf0(at)

Готово! Под завершение, последний шртих:
http://klimaleksus.narod2.ru/Files/1/dis_14.png
Как же мне повезло! Длина надписей ровно 4 символа! А это значит, что для сохранения черырёхбайтовой чётности (это связано с тем, что JUMP инструкцией невозможно прыгнуть на строки, не кратные четырём… нужно же было запихать в 32 бита не только сам адрес, но и сигнатуру оператора!) системе пришлось добавить ещё четыре пустых байта. Мне столько даже и не нужно, меняю цвет: стерео – красный (японская камера), а моно – зелёный (американская камера):
http://klimaleksus.narod2.ru/Files/1/dis_15.png
Всё становится понятно с первого взгляда. Если интересно, как ps2dis смотрит на это, то вот:
http://klimaleksus.narod2.ru/Files/1/dis_16.png
Хи, он-то думает, что это какой-то супершифрованный нераспознающийся код!

Таблица для ArtMoney (прилагается к патчу):
http://klimaleksus.narod2.ru/Files/1/dis_17.png
1) «Прыжок 1/0» – если «0», то прыжка нет; иначе есть.
2) «Кам 83/115» – если «115», то камера японская, если «83» – то американская; иначе – гибрид.
3) «заставка 1-4» – управление объектом Спайро на начальном экране. «1» – Спайро, «2» – первый сбитый монстрик, «3» – табличка Бессонных, «4» – пробегающий монстрик; иначе – крах эмулятора. Актуально ТОЛЬКО при начальном меню, в остальной игре не действует.
4) «поле зрения 1» – угол обзора камеры. «1» – стандарт. Увеличение – приближение, сокращение обзора. Уменьшение в отрицательную строну – отдаление, повышение обзора. Сильно отрицательные значения при выравнивании камеры приводят в вылету из эмулятора.
5) «Стерео 0/1» – если «0», то стерео; иначе – моно.
6,7,8,9) «127/63» или «0/63» – байты, принимающие «127» или «0» для стерео, и «63» для моно. Назначение неизвестно.

Мой патч официально закончен (в бета-версии обнаружилась ошибка документа, отменяющего патч для SCPS). Однако, я рассчитывал, что nihonjin подскажет мне правильные японские слова, которые следует поставить вместо «стерео» и «моно» в меню… Хотя, в русской версии будет по-другому, по-нашему. А вот японскую версию с исправленной камерой мне бы хотелось «раскрутить» не слабее Вихря! Дайте правильные слова, а я ещё и доработаю патч так, чтобы он выставлял верные CRC суммы проверки ошибок в BIN, чтобы образ не портился после применения патча, и чтобы его можно было прожечь на реальный диск для самой приставки без опасений (а то мне кажется, что ни фига не будет пахать на соньке, ведь образ выйдет запоротый…)

А ещё, по аналогии с Вихрем, я сделал неплохое многозначительное стихотворение-пародию (угадайте, на что?) по поводу взлома японской камеры:

Камера

Зима недовольства заменится летом,
Когда завладею восточным секретом
И камеру странную восстановлю,
Ей пунктик особый добавлю в меню;
Удобно раскрашу,
Усердно отлажу,
На критику миру отдам!
Чтоб странствия наши
Привычней и краше,
Доступнее сделались вам.
Для этого первым обыденным шагом
Значения в памяти перемешаю,
Проверю, замечу, мозги шевельну,
И даже прыжок при атаке верну!
А в этом поможет мне сяо-Ассемблер:
Исправлю часть кода, да в патч сохраню,
И образ отныне навек изменю –
Пусть будут таблички отыщены всеми,
Пусть тайны игры постигают усердней…
Держите! Всё вам безвозмездно дарю.


(Кстати, к слову: кто отважится назвать единственные восемь книг, которые читали Insomniac Games?)


Копия ссылки на патч:
http://klimaleksus.narod2.ru/Files/1/Japancam.rar




Эх… Три мультипоста, а я снова ничего не ответил по всем предыдущим сообщениям…
Стоило ли мне вообще тратить время на описание этапов взлома? Не лучше ли было вместо этого сделать что-нибудь полезное?
Ну, к примеру, я мог бы ответить во всех необходимых темах, да ещё и закрыть долги по ЛС (сколько ж я их накопил…). Но в темах я и так рано или поздно ответил бы.
Или я мог провести два других игровых взлома, чтобы создать что-то новое.
Либо, например, сделать одно большое исследование звукового формата или объёмных моделей.
Тогда бы я создал что-то ещё.
…И только лишь. Вместо этого я написал свой комментарий, руководствуясь которым, кто-то другой мог бы на миг превратиться в меня и тоже взломать и улучшить что-то, может даже не один раз.
А это бессмертно.
Что перспективнее: десяток взломов, или ещё один живой хакер?
А я делаю хакера. В надежде, что кто-то прочитав пост, сможет сотворить столько же, или даже ещё больше, чем я.
Пустой тратой времени это не назвать.


but nobody came

Сообщение отредактировал aleksusklim - Воскресенье, 26.08.2012, 22:18
 
aleksusklimСообщение # 173 | Тема: Перевод японской версии Spyro the Dragon Вторник, 04.09.2012, 00:36
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
#171, 02.09.12 (03.09.12)


Quote (nihonjin)
Кстати, aleksusklim, вы могли бы в своих постах хотя бы односложно отвечать на такие важные вопросы


Не-ет… Я просто. Если я отвечу не на всё сразу, то с огромной вероятностью то, на что я не ответил, окажется забыто навсегда! Поэтому я до сих пор так ничего не написал в тему про ВзломИПрограммы…
На «важные» вопросы односложно не ответить…
А я ж, блин, программист, мне ж неделями коды писать охота! Вот я и бесцельно потратил очередную неделю на две новых ваще-супер-ультра крутых программы…
А ответов от меня сложно дождаться… Ох, сколько ж я задолжал по ЛС и E-Mail… ой, что обо мне подумают добрые люди…




Патчер. Пора бы его усовершенствовать! Как я сказал, нужен SmartPatcher, который сам будет сравнивать файлы и компоновать весь патч в один .bat, а не в кучу непонятно-чего.
Ну вот я его и создал:
http://klimaleksus.narod2.ru/Files/1/SmartPatcher.rar (100 Кб)
Он реально чёткий. Преимуществ – куча! Первое – красивый интерфейс (называется, ломанул DOS кодировку…)
Второе – удобное создание и применение, почти что в один клик.
Третье – интерактивность. Он всё перепроверяет! Чтобы патч лёг нормально, чтобы данные совпадали, чтобы CRC сумма не подвела.
Четвёртое – автоматическое backup архивирование. Если патч может необратимо изменить предложенный файл, то создаётся новый локальный патч лично для испорченного файла, чтобы его можно было восстановить. Таким образом отпадает необходимость в резервном копировании файлов перед применением патча + средствами SmartPatcher невозможно что-то окончательно запороть – даже если доиграться до десятков backup патчей, то всё равно файл можно будет вернуть в нетронутое состояние.
Пятое – тонкая работа с данными. Переписывается только то, что реально отличается, что позволит применять несколько разных патчей к одному файлу. Ну например для вас это означает создать по одному патчу на каждую табличку, а потом последовательно применить их к WAD.
У программы есть лишь один недостаток – практическая невозможность работы внутри DOS сценариев, поскольку SmartPatcher требует ответов пользователя на многие предупреждения.

Принцип работы понятен (надеюсь…) из инструкции. Создание – запускаете, потом по очереди перетаскиваете в консольное окно оригинальный и изменённый файл, потом даёте имя для сохранения и готово; а применение ещё проще – перетаскиваете нужный файл прямо на сам BAT патч (только для этого сам SmartPatcher должен быть рядом, поэтому если хотите пользоваться без проблем, поместите его в Windows или в System32)

А чтобы создать эту программу, мне пришлось учить Делфи запускать EXE файлы. Представляете, сам он этого, походу, не умел! Ну я и читал два дня MSDN, чтобы потом кодом через kernel32 всё вытаскивать. Хорошо хоть функция не такая зверская, и принимает «0» как по умолчанию почти для всех своих аргументов.
Использованный мной CRC чекер вообще классный, я весь интернет перерывал, чтобы для дипломки такой найти. Вот и нашёл, называется – «crcp», но в SmartPatcher я по запарке назвал его «pcrc»…
Сравнение файлов произвожу через стандартную «FC», но чтобы уж быть уверенным, решил её тоже выкопировать, ужать через UPX (кстати, читал статью о вреде UPX от создателей FAR, но этот самый вред проявляется только при запуске нескольких копий программы, что меня абсолютно не касается в данной ситуации) и засунуть внутрь своего SmartPatcher, а это оказалось возможным только через WinHex, когда я выбрал опцию «Copy Block > Pascal Source»; таки же макаром я и pcrc и cmd-скриптик внедрил – а чтобы код не казался пугающе огромным, я вынес каждый файл в отдельный .pas модуль!
Поэтому-то прога сама по себе весит 60 Кб, а исходный код к ней – 127…

Старался-то я конечно не для одного Spyro1 с его табличками, а для нашего Spyro3 тоже, ведь нам придётся патчить, патчить и патчить…
Ну а чтобы эти патчи было легко передавать друг другу, я задумался.

Как мы делимся файлами? Отвечу за себя – я халявно заливаю их себе на сайт. Кончится место – зарегистрирую себе ещё один сайт, ЯндексНарод, вроде бы, очень добрый и щедрый.
А все остальные? Заливают их на файловые хостинги, где то цифорки не вводятся, то слоты закончились, то скорости нет, то время жизни истекло.
Вы что, хотите, что наше наследие постарело и умерло!?
Как бы ещё… Ну можно заливать нужные нам файлы в наше Хранилище, но создатели Гугля советуют экономить там место, потому как если мы исчерпаем лимит – будет плохо…
Ещё можно друг другу по почте файлы отсылать. Но так очень легко запутаться и отправить кому-то не тому что-то не то, да ещё и испорченное по дороге.
Можно заливать прямо сюда с администраторской помощью, но это сработает исключительно для общественно важных файлов, а не для всякого полуфабриката.
Можно кодировать небольшие файлы в base64 и выкладывать сюда. А если файл 100 Кб?
Как быть? Это не 5 Мб, которые заливают на хостинги. Но это и не 5 Кб, которые можно отправить текстом…

Я нашёл решение! КАРТИНКА! (наверно, я изобрёл велосипед, но всё же) :
http://klimaleksus.narod2.ru/Files/1/PictureCoder.rar (50 Кб)
Я создал прогу, которая конвертирует ЛЮБОЙ файл в картинку BMP.
Как? Ну сначала я хотел создать в памяти холст, потом брать три байта данных, выставлять на их основе цвета каналов и закрашивать пиксель, но это оказалось невероятно медленно!
Потом я немного обмозговал структуру Bitmap файлов и понял, что данные в них лежат потоком (по крайней мере в картинках, длина которых кратна четырём)
Без разделителей.
А это значит, что я могу просто копировать двоичный файл прямо в тело картинки сразу после заголовка!
Ну только разве что записать туда его размер и расширение имени файла, чтобы не ломать голову над форматом при восстановлении.
Слишком просто?
Тогда я придумал (два дня математические формулы выводил!) метод, по которому будет вычисляться соотношение сторон будущей картинки (ведь часто не весь последний ряд пикселей заполнялся данными). А именно:
1) Ширина всегда кратна «8».
2) Отношение длинной стороны к короткой не превосходит «4/3», если возможно по пункту 1.
3) Если в пункте 2 имеется несколько вариантов, то используется тот, в котором незанятое пространство будет минимально.
4) Если после пункта 3 осталось несколько одинаковых наборов, то берётся тот, где отношение сторон ближе к квадрату.
Причём константы настраиваются (читайте инструкцию).

Вот описание заголовка Bitmap (24 бит, после выхода из MSpaint):
2 байта – «BM» (424D). 4 байта – размер всего файла. 4 нулевых байта. 4 байта число «54» (36000000). 4 байта число «40» (28000000). 4 байта – ширина картинки. 4 байта – высота картинки. 2 байта «0100». 4 байта глубина цвета «24» (18000000). 2 нулевых байта. 1 байт «04». И ещё 19 нулевых байт. Итого 54 байта!
Дальше потоком идут данные используемого файла. На картинке они заполняются слева направо и снизу вверх, поэтому пустые чёрные пиксели остаются в конце первого ряда.

Конвертировать такую картинку, естественно, допустимо лишь в форматы без потерь качества. Например Png! Но где я найду исключительный конвертор BMP<>PNG небольшого размера…
Взломал стандартный Paint. Нехило взломал, вырезал оттуда через Restorator почти всё, оставив 100 Кб. Через AutoIt сделал саму программу, которая загружает правильную картинку, потом вставляет адрес куда надо, сохраняет… Пришлось ещё мышь и клавиатуру на пару секунд вырубать, чтобы пользователь не запорол появление окошек.
Файл:
http://klimaleksus.narod2.ru/Files/1/ConvertPng.bmp (300 Кб)
Ага! Это картинка. С моего сайта. Сохраните её и пропустите через PictureCoder. Получите RAR архив. Вот в нем и будет конвертор в Png, очень простой в использовании. А чтобы применить и его, вот ещё сам обрезанный Paint и всё необходимое для нормальной компиляции ConvertPng:
http://i.piccy.info/i7....ver.png (100 Кб)
Это уже PNG и притом не с моего сайта. Сначала конвертируете в BMP, а потом в PictureCoder и разархивировать.

Короче, план такой. Создавать патчи готовых текстов/табличек, архивировать и заливать их как картинки на хостинги изображений, потому что такие сервера хранят файлы чуть ли не бесконечно и выдают потом без всяких ограничений.
Как вам моя идея? Разумеется, применять её нужно только к небольшим файлам, в переделах пары мегабайт максимум. А то из-за нас закроют все бесплатные хостинги картинок))




В экспериментах над плейлистами от PSound я пришёл к тупику. Каждый трек имеет 4 уникальных байта, и это не смещение данных… Причём если взять их у одного трека и вставить в другой, то там они работать не будут. Мне кажется, что автор применил хэширование или что-то наподобие электронной подписи. Поэтому выставлять их вручную чтобы так пытаться заставить программу считывать нужные нам данные бесполезно.
Зато через ProcessMonitor я смог отследить адрес первого обращения к файлу для чтения. То есть программа выдала мне offset, откуда PSound начинает читать данные. Я увидел, что он сперва берёт 4 байта, а потом транслирует всё остальное блоками по 32 Кб. Адрес конца изначально вроде не фигурирует.
Я посмотрел на смещение, с которого он воспроизводил (трек – озвучка одного из драконов первого мира; файл – весь субфайл) – и там нули! Много нулей, около 16-ти и больше.
Я скопировал эти данные в новый файл – сканировал. Обнаружено. Offset на этот раз – ноль, потому что данные пошли сразу.
Удалил первый байт – сканировал. Ничего! Получается, что первоначальные нули жизненно необходимы если не для воспроизведения звука, то уж точно для его обнаружения.

Программа ProcessMonitor:
http://klimaleksus.narod2.ru/Files/1/ProcessMonitor135.png (800 Кб)
Хи, опять картинка! Справитесь? (это последнее невтемное демонстрационное принуждение использовать PictureCoder от меня)

Как работать рассказать? Вначале в фильтре убедитесь, что все строки красные. Потом поставьте одно include на ProcessName (а если такое уже есть, то редактируйте имеющееся) – имя EXE программы (PSound.exe), не забудьте нажать ADD, а потом OK.
Всё управление сводится к двум кнопкам на панели инструментов – Capture (лупа) и Clear (ластик). Если лупа зачёркнута, прога на паузе. Иначе – захват в силе (надо минимизировать это время, а то всё может зависнуть). А стиранием удобно очищать как видимое, так и память.
Короче, очищаете список, включаете захват и сразу же в PSound воспроизводите трек. После чего останавливаете захват и анализируете список.
Сразу же следует снять все типы данных (четыре крайние кнопки на панели инструментов), кроме мониторинга файловой системы (вторая кнопочка)
Внимания заслуживают только те строки, в которых значится правильный файл. Найдите первый запрос «Read» чего-нибудь, дважды кликните и посмотрите на offset. Вот это оно и есть.

Зачем? Не знаю. Но ведь что-то с этими WADовскими звуками нам делать надо?

Добавлено (04.09.2012, 00:36)
---------------------------------------------
Я взломал ширину тайлов букв! Ух, это невероятно (аж самому не верится), но всё как бы работает:
http://klimaleksus.narod2.ru/Files/JAP/width_1.jpg
http://klimaleksus.narod2.ru/Files/JAP/width_2.jpg
Естесьно, ширина настраивается числом. И даже высота! Но найденная «высота» – не промежуток между строчками, то есть при уменьшении пустое пространство останется, а количество строк не возрастёт.

О том, как я умудрился взломать такую трудноотыскиваемую величину, я расскажу позже. Это был утомительный однообразный трёхчасовой беспросветный взлом, и когда я уже было собрался сдаваться, мне вдруг повезло. Просто повезло:
http://klimaleksus.narod2.ru/Files/JAP/width_3.png
Функция два-два-восемь-шесть-восемь. Я натыкался на неё очень часто, отовсюду (отталкивался от табличек, «чёрных экранов», меню…) и наконец решил исследовать. О, какое же счастье, что константы в LI даны прямо сразу! WinHex:
http://klimaleksus.narod2.ru/Files/JAP/width_4.png
Красное – высота. Зелёное – ширина. Светлая пара (первые) – общие, тёмная пара (последние) – специальные. Увеличивать что-либо смысла нет:
http://klimaleksus.narod2.ru/Files/JAP/width_5.jpg
А вот над уменьшением стоит поэкспериментировать.

Почему два набора? Не знаю, но для табличек, меню и всех надписей действуют только первые цифры. А вторые работают только на слово «пауза» (ну в заголовке меню паузы, большими буквами) и больше нигде. Наверное, я плохо искал, но пока кроме заголовка они ничего не затрагивают.
Эй, помните, вы сказали, что не можете найти заголовок в EXE? А я не смог найти НИГДЕ надписи «Покинуть игру?» именно с вопросительным знаком на конце, то есть надпись в последнем меню «с которой всё понятно».
Игра берёт одну надпись без вопроса, потом копирует её в самый-самый конец ОЗУ и приписывает символ вопроса. Интересно, что изменить её там невозможно, поскольку она сама обновляется перед непосредственной отрисовкой. Два вывода:
1) Надеюсь, нам это не помешает;
2) Хоть бы дальше лишь этой фразы такой приём не пошёл.

Вторая странность изменения ширины в том, что я менял её в ОЗУ, но при этом не на лету. Не через ArtMoney. Эмулятор, кажется, что-то кэширует или где-то промежуточно сохраняет что ли… Короче, если менять через ArtMoney, то эффекта не возымеет.
Чем же орудовал я? Моим MemGet:
http://klimaleksus.narod2.ru/Files/Mem.rar
Останавливал эмуляцию, дампил память, изменял значение в файле, записывал дамп в ОЗУ и возобновлял эмулятор. Шаг влево, шаг вправо – RuntimeError. Зато результ есть!
В финальной версии мы пропишем всё в EXE. А пока что:
http://klimaleksus.narod2.ru/Files/JAP/width_6.png
Загруженный дамп памяти, тот же блок данных, выделен (понятно надеюсь?).

Краткое руководство к действию:
– Откройте МОЙ Epsxe. Загрузите образ, запустите уровень, сохраните savestate, сверните окно через Esc.
– Откройте MemGet. Все настройки оставьте по умолчанию, ничего не меняйте.
– Задайте целевой файл дампа.
– Загрузите его же в WinHex.
– Нажмите «Применить данные» и «Чтение … ».
– Перейдите в WinHex (подтвердите перечитывание), найдите смещение «22870» – то что на скриншоте.
– Замените нужные вам байты (ширина – 22878, один байт).
– Перейдите в MemGet и кликните «Запись … ».
– Вернитесь в эмулятор и проверьте результат.
– Загрузите savestate, сверните эмулятор.
– Можете снова сдампить память, чтобы испытать другое число.

Проверьте. Может нам и не придётся укладываться в непреодолимые рамки повсюду!
А в предыдущем комментарии я забыл сказать, что нашёл странный глюк у самой Windows. Очень приколько переименовывать весомые BMP файлы, написав расширение как «.exe»…


but nobody came

Сообщение отредактировал aleksusklim - Вторник, 04.09.2012, 01:14
 
aleksusklimСообщение # 174 | Тема: Перевод японской версии Spyro the Dragon Воскресенье, 09.09.2012, 22:42
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
#172, 09.09.12


Пре-скриптум: ну хоть один пост закрою…

Quote (nihonjin)
Из-за того, что мне нужно как-то поддерживать яп. решил перевести один текст, вернее часть. Отсюда:


Ого! Столько иероглифов я видел разве что на сайте Кагая…

Quote (nihonjin)
*Баланс степени сложности уровней нормален, а вот боссы на удивление слабы.

*Нет различий по постановке музыки в простых уровнях и уровнях с боссами. Если ты даже немного не аккуратен то не важно насколько враг слаб. {То есть нельзя ошибаться даже со слабыми врагами.}


Так в предыдущем пункте же сказано, что победить легче в любом случае?

Quote (nihonjin)
*Последним боссом является Гнасти Гнорк. После обременительных препятствий на его уровне сам Гнасти кажется слабым.


Когда взламывал камеру, мне понадобилось пройти последнего босса. Бежал-бежал-бежал… И – всё!? Да, действительно слишком просто.

Quote (nihonjin)
*Поскольку это обдумали {приняли во внимание}, то в следующей работе "Spyro & Sarx", места сражений с боссами усложнили. Их сила и стойкость были значительно увеличены.


*Sparx?

Сражения усложнили? Для Ripto’s Rage относительно Spyro the dragon или же для Spyro and Sparx в сравнении с Ripto’s Rage?

Quote (nihonjin)
---Думаю, что последнее стоит занулить, т.е. оставить пустым. Поскольку во-первых - доступно лишь 3 знака, во-вторых - экран чище!


А Спайро по темноте пролетает? Или же это метка для всех роликов?

Quote (nihonjin)
Эх, aleksusklim, спалили вы мой hide, ну да ладно.


Откуда ж я его мог увидеть, если Ucoz его никак визуально не выделяет?

Quote (nihonjin)
Вода настолько ядовита
Что и растения все тут
Переродившись в монстров стали
Весьма похожими на лук.


Ну то есть вы всё равно отрезаете рифму на 1-3, оставляя лишь для 2-4?
Это не запрещено (говоря языком це плюс плюс девелопера), но «осуждается».
Неужели никак не сделать нормально вместе с обеими рифмами?

Вода отравлена настолько
Что и растения все тут
Переродившись в монстров только
Весьма походят лишь на лук.


Quote (nihonjin)
Первые две строки как-то не очень звучат.


Какие две? «Росло большое дерево / С поляны возле берега» или «Поляну возле берега, / Украшивало дерево». По-моему, классно звучат (лишь запятую убрать из первой строки второго варианта; или поменять две строчки первого варранта между собой)

Quote (nihonjin)
Велико дерево росло
На побережье дивном.
Но яд от вод сюда придя
Оставил лишь поверхность пня.


Забивать на 1-3 ещё можно, но чтобы выбросить 1-2, оставив 3-4!? В толк не возьму, почему оно продолжает выглядеть как хорошее стихотворение?

Велико дерево росло
На побережье подле вод.
Но яд от них сюда придя
Оставил лишь поверхность пня.


Quote (nihonjin)
Скажите, вы специально убрали первую вводную строку?


Да. Нет. Я редактировал не табличку, а стих. Раз первая строка не с чем не рифмуется и выбивается из ритма, значит не принадлежит строфе.

Quote (nihonjin)
Её всё же придётся оставить, если учитывать положение таблички. Она ведь находится в начале уровня, а босс - в середине. Поэтому может возникнуть замешательство.


Его тоже можно зарифмовать отдельно. Типа «Босс №2 – Железная голова», если он конечно, второй, что вряд ли. Либо ещё как-то обыграть. Главное – утвердить название.

Quote (nihonjin)
Он лишь один, кто власть имеет
В вас окружающих краях.
Черпая мощь земель чудесных
Работать может твердь губя.


Типа, довели-таки косвенно 1-3 до минимальной рифмы?
А в сумме с остальными – что-то мы злоупотребляем словом «лишь»…

Quote (nihonjin)
Мм, кстати, а претензий по стихам табличек (2), (3) и (270) фазыII нет или вы их за стихи не считаете?


… что?

А, это:

Quote (nihonjin)
За этой вот стеной
Скрыт мир, что
Легендарен. Здесь лишь
Ребёнок ты, там станешь
Же драконом. Так посети
Немедля тот мир сих
Чудес прекрасных.


Как-то подозрительно вы его на строчки разбили… Как рифмовать:
Легендарен – станешь ?
сих – прекрасных ? или
посети – сих ?

А «Же драконом» это вообще что? Очень сильно напоминает адекватный перевод английского «Told» как «Же говорил».
«Же драконом»… почти что «Лже-драконом»!
«За этой вот» – от безысходности?

За каменной стеной
Скрыт мир, что легендарен.
Ты здесь ребёнок небольшой,
А там драконом станешь.
Его немедля посети,
К прекрасным чудесам лети!


Строчность не сохранил, но можно под конец и три к одному зарифмовать, но я вроде всё затронул.

Это:

Quote (nihonjin)
В центре башни вихрь -
Загадочный восходящий
Воздушный поток.
Если вы драконьи дети
Ввысь за мгновенье
Доставит вас он.


… подпадает под «не считаю за стихи»…

Вихрь в центре башни –
Загадочный поток
Воздушный восходящий.
Драконом ввысь не страшно
Взлететь под потолок,
Зайдя в него разок.


(уж чего-чего, а унифицированного стиля стихосложения у нас не будет точно!)

И это:

Quote (nihonjin)
В лампах этого мира
Трепещет магия
Сдерживающая чудовищ.
Чтобы плохого не стало
Слишком много, иногда
Зажигают ненавистный
Им яркий свет.


? Ну да, основа есть… Что бы что-то ответить, надо бы хотя бы переиграть уровень, а то невесть что напишу.

Quote (nihonjin)
Этот список показывает ~склонность~ к стихосложению.


Кстати, традиционными стилями можно не ограничиваться! Три коротких строки? Хайку!
Семь и длинные? Танка!
Одна? Однострочный стишок (главное хороший ритм подобрать) !
На худой конец есть белые стихи – главное либо хорошо рифмовать, либо не рифмовать вовсе.
А ещё можно «по-японски» исковеркать фразу (как в фазе I), чтобы она выглядела как стихотворная.

Quote (nihonjin)
Перед тобой стоят врата
В "погоню скоростную".
Не говори же им "пока"
И смело мчись вслепую.


Сравнивая с первой фазой понимаю истинное значение слова «пока», которое не передано или передано не верно в стихотворении. Можно по другому:

Стоят перед тобой врата
В «погоню скоростную».
А если не сейчас – когда?
Так смело мчись вслепую!


Quote (nihonjin)
-От владельца-
Играл я у вихря
И к дому бредя
Ключ мой был утерян.
Но раз он у тебя,
То смело идя
Содержимое клада
Возьми для себя.


Вау, зарифмовали четыре к одному! Зачем останавливаться:

У вихря играл я,
А к дому бредя
Утерян был ключ мой
Раз он у тебя,
То смело идя,
Алмазиков кучу
Возьми для себя.
«Спасибо» не надо!
-- Владелец клада.


!! Мне это ужасно нравится!

А тут, наконец, вам удалось сделать так, чтобы нерифмующаяся первая строка была абсолютно замаскирована среди великолепно исполненных прочих:

Quote (nihonjin)
Да, враг большой.
Да, он в металле.
И ни огонь и ни рога
Не принесут ему вреда.
Но помни, что земля хладна
И скользко всем – беда одна.


Супер!

Quote (nihonjin)
А ну попробуй, заберись,
На этот пункт дозорный!


Ась? Это стих? В каком месте это стих? Хоть бы переставить:

А ну-ка заберись попробуй,
На этот пункт дозорный!


Или перефразировать первую строку, если так критично замечание от Word.

Quote (nihonjin)
Те, кто в безумия порыве,
Упали в пропасти без дна
Оставили на память камни
Так подбери же их тогда!


Опять плюнули на 1-3 ? А «пропасти» – множественное число?

Те, кто в безумия порыве,
Упали в пропасти без дна,
На память камни пред обрывом
Оставили – поднять пора!


Quote (nihonjin)
Наверх постройки приведёт
Не этот путь, однако,
Возможно вихрь принесёт
Туда, куда вам надо.


Канает и катит. Но я бы перед «однако» поставил точку.

Quote (nihonjin)
Здесь есть в металле исполин.
Пока велик он - худо дело.
Но как уменьшится злодей,
Ты бей его и не жалей!


А вот почему «худо дело», хорошо построенное и продуманное, никак ни с чем не рифмуется? Что же его оправдывает?
Как вам это:

Здесь есть в металле исполин.
Пока велик – непобедим.
Но как уменьшится злодей,
Его ты бей и не жалей!


Quote (nihonjin)
Ещё я вспомнил кое-что по шрифту... Нужен шрифт для стартового меню! Я как раз сделал его перевод (обновил "сообщение №40"). Прелесть в том, что там мы не так жёстко ограниченны цветом, как с "табличным" шрифтом. Но всё же нужно смотреть, чтоб текст не улез "за рамки". Поэтому перевод ещё нужно будет дорабатывать.


Но шрифт не должен сильно отличаться от японского духа ChinaCYR!
Кстати, похожие буковки недавно увидал:
http://klimaleksus.narod2.ru/Files/JAP/pepper.jpg


but nobody came
 
aleksusklimСообщение # 175 | Тема: Перевод японской версии Spyro the Dragon Суббота, 15.09.2012, 22:07
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
#174, 15.09.12


Quote (nihonjin)
Мм ладно, вернусь к этому вопросу как только доковыряю SCPS.


А вы всё вытаскиваете и вытаскиваете из него всё новые и новые реплики…

Quote (nihonjin)
Насколько я помню это случилось толи при редактировании сообщения толи при "взятии предела", но однозначно при исправлении/добавлении информации. И да, всё у меня отображалось как на скрине,


Получается, что вы сбили всю фрумно-таблично-блочную структуру всех последующих комментариев на странице?

Quote (nihonjin)
, поэтому я быстренько запечатлел такое чудо и поспешил вернуться(как при нажатии на [Backspace]) и поправил сообщение. Вообщем, продлилось это, наверное, около 10 минут.


Странный форум! Теги плохо защищены, например, не закрытый [ B ] или [ I ] может повлиять на все дальнейшие комментарии и надписи, хотя должен пресекаться автоматически. И широкие картинки страницу иногда раздвигают.

Quote (nihonjin)
На данный момент в основном центре моей деятельности 38 папок в которых 1589 файлов и занимает всё это 178мб. Хорошее пространство?


Ну и бардак! А почему так много весит? Со скриншотами вместе? Они хоть не BMP?

Quote (nihonjin)
А ведь ещё не лишне сопровождать таблички скринами(и их у меня по два на табличку - с надписью и с окрестностями), дабы предотвратить недопонимание.


Надо было додуматься сразу делать 512x256 !

Quote (nihonjin)
И что значит:
Quote (aleksusklim)
придумайте символ переноса строки, любой

?


Конец строки. Сейчас в чудо-кодировке, как вы её называете, этим символом служит FFh, то есть русская «я» строчная. Если вам потребуется записать табличку в одну строку, то вам придётся чем-то указывать место переноса. Разумеется, буква «я» как таковая не подойдёт, поскольку в этот момент таблички будут ещё написаны на кириллице. Значит нужно что-то вроде «/» или «\» или «&» – вам лучше знать, какой не будет встречаться в переводах (не в коде, а только в переводах).

Quote (nihonjin)
я думал, что фазаII - последняя.


У нас уже рамки в который раз раздвигаются, ослабляя ограничения на текст. А раз уж мы ещё и на стихи позарились, то хранить итоговые результаты всё равно где-то придётся. Не затирать же ими вторую фазу!

Quote (nihonjin)
Ну да, я же представил скрины. Т.к. решил, что так быстрее, чем с описанием.


Что мне понравилось в первой демке – так это быстрая смерть от воды, если Спаркса уже нет. Плюс ещё пузырики вылетают! Так быстро – замечательно; сделать бы так нам…

Quote (nihonjin)
С каких пор отечественные книги пишут на японском? Под "Лирика - для чтения" я имел ввиду "Лирика - для чтения на японском".


Вот так и знал, а…

Quote (nihonjin)
Мне итак кажется, что я забываю японский пока работаю над переводом Спайро. А вы в какой раз уже делаете меня иродом каким-то.


*тихо хихикает*

Да просто мне непонятны люди, которые учат языки не в такой последовательности:
Родной > Местный > Английский > Любой.
(хотя я сам-то местного не знаю…)
Многие сейчас почему-то изучают французский вместо английского. Ну зачем? Если полмира написано на английском языке, не лучше ли сперва именно его приручить, а потом уже браться за любой другой по желанию?

Quote (nihonjin)
Ну не скажите. Ваша тема довольно популярна(если смотреть на число просмотров).


«смотреть на число просмотров и просматривать число смотрящих чисел»


Я нисколько не понимаю, как работает счётчик просмотров темы. Когда я проверял ответы с ещё живого Siemens C60 (у которого за раз в экран не влазиет больше 12 Кб HTML кода…), я открывал список тем и «смотрел на число просмотров», сравнивая его с предыдущим запомненным состоянием. И если оно не изменилось с прошлого раза, значит заходить в саму тему бессмысленно. (Или ориентироваться на «число ответов», но может случиться так, что последний пользователь изменит свой последний пост. А так – самый верный метод – проверять автора последнего сообщения).

Quote (nihonjin)
Захожу я на "Спайропедию"(если даже не спайропедия, то точно какая-то wiki по Спайро) а там - три(кажется) баннера. Один Insomniaс, а остальные не помню(может издательств "легенды"). И что-то там по английски написано в духе "...всвязи с нарушением авторских прав..."
<…>
жаль скрин не сделал!


Да тут не скрин надо делать, а спешно копировать всех и вся!

Quote (nihonjin)
Ну нет, там просто часто встречаются такие слова как Memory Card, Save, Load, Data и т.п. А так там катакана/хирагана встречаются примерно 50/50.


Из-за этой черты слова кажутся длиннее, и занимают больше места…

Quote (nihonjin)
Quote (aleksusklim)
А в Spyro1 разве есть вих…

Это вы так прикалываетесь, да? Потому что:
Quote (aleksusklim)
«вихрь» vs. «восходящий воздушный поток» = «фигня» vs. «супер японское настроение» !


Ай…
Не, я..
Я не знаю что сказать.
Спалился вообще с потрохами…

Зато я сразу же нашёл один вихрь и влетел в него. Разница в том, что камера даёт затенение и показывает лишь вылет, без провожания вверх дракончика? И так происходит абсолютно на каждом вихре, или же небольшие работают как обычно?

Quote (nihonjin)
Может вы заметили, что я изменил цвет "обращения к модераторам" с красного на зелёный?


Нет. Да. Но я думал, потому что это мне нравится зелёный цвет…

Quote (nihonjin)
применение синего и красного цветов позволено лишь АМС


Неправда. По сути (особо не вникая в правила), можно сказать, что АМС позволено применять красный и синий цвет везде где им захочется. А пользователи в обычных случаях не имеют права использовать такие цвета.
Но при этом само применение красного/синего цвета не запрещено! Если оно адекватно. Если ни один другой цвет не подойдёт для данной цели, кроме как синий или красный. Если использование полностью оправдано.
Тому на самом форуме есть десятки подтверждений, где был использован и красный и синий цвет, но настолько продуманно, что ни у кого рука не поднимется делать замечание.
В принципе, ограничения на любые цвета и красный/синий в частности – лишь немного повышенные требования к оформлению текста, к обычному форматированию. Просто усиленная строгость, а если взять по факту (а не по весу/силе), то одинаковые ограничения стоят на все виды форматирования.
Например, нельзя писать всё заглавными буквами. Или белым цветом. Или жирным. Или всё подчёркнутым курсивом. Или увеличивать размер текста. Или же уменьшать его. Центровать текст или сдвигать его по правому краю. Постоянно вставлять изображения.
Но всё это можно делать! Если не злоупотреблять. Жирность, курсив, зачёркивание и регистр – особые виды акцентирования отрывков текста. Размер – явное выделение, с расчётом на то, что более пары строчек увеличивать никто не станет. Отцентрировать можно стих или заголовок. Изображения можно вставлять как смайлики например.
Поэтому всё разрешено! Надо просто знать место и меру.
(писать красным – равно что материться. Постоянно нельзя, а изредка не помешает!)


Quote (nihonjin)
Или в подписи разрешено цветовое разгуляйство?


По-моему, да…

На худой конец в правилах же не написано, ЧТО именно считать красным цветом – FF0000 ? Ну так я предложил не его. Красный оттенок? И насколько же должна отличаться его численная составляющая? А насыщенность? Тёмно-синий разве считается за обычный синий?
Если что – можно придраться к правилам, как я придрался к конкурсу. Нужен лишь прецедент…

Quote (nihonjin)
Я неправильно понял ваше "где конкретно сказано". Счёл за то, что вы спрашиваете "где это есть в игре?". В то время как похоже подразумевается "в каких источниках описывают цветные сферы?". Я искал на русской и английской спайропедиях, а так же в той вики, по которой вы спрашивали "Так «possibly» или достоверно?". Кстати, в последней написано про сферы в Skylanders'ах.


Да! И:

Quote (nihonjin)
«Хоть сам правь» подразумевает "хоть сам редактируй статью по сферам на спайропедии".


Пф, я понял!! Но раз вы сказали, мол «…написано, что сферы не только зелёные – хоть сам правь…», значит, что вы сами не видели и не знаете незелёных сфер. Поэтому я и спросил, «где конкретно сказано» (то есть где надпись про незелёные шары) и «а какими ещё» (то есть какие ещё цвета кроме зелёного там даны); черта «/» обозначала, что если вы не дадите ответа на второй вопрос, то по ответу на первый я сам смогу его узнать, прочитав статью; поэтому мне нужен был ответ на любой из этих вопросов.

Так что же значит «хоть сам правь»?

Quote (nihonjin)
Уу, боюсь это выше моих возможностей.


Наверно всё просто – стандартное blend-смешивание. Как делает Game-Maker или вообще кто угодно.

А теперь:




Нет! Мне не хватило терпения закончить ответы как полагается, потому что я сейчас побудился (предыдущей цитатой) к новым дизассемблерическим экспериментам, и если не поделюсь итогами немедленно, то могу просто забыть, что из чего я смог получить.
Давайте сначала все результаты стопкой продемонстрирую:

(указывать в тексте буду по номеру)

Ну так я не понял, nihonjin, вы можете/хотите/умеете/будете интересоваться и работать на ps2dis? Взламывать игровой код вместе со мной?
Потому что я когда преступаю ко взлому, я могу продвинутся далеко-далеко так, что в конце останется лишь сухой результат без знания всех этапов процесса. Мне неохота останавливаться на полпути, чтобы сказать о том, что именно осталось закончить – я лучше сразу закончу! Но тогда придётся совершать тот же повторный взлом, чтобы вспомнить какие-то промежуточные результаты.

Другое дело вы. Вы сейчас в табличках просто мастер – по вашим результатам и подробнейшим описаниям можно даже хоть сейчас составить полный план-характеристику, чтобы обосновать, что откуда следует.
Вы успеваете не только проделать огромную работу, но ещё и выложить её в полноценном виде! Не то что я – либо молча хакерничаю и экспериментирую, либо только описываю уже совершённые подвиги – но не одновременно.

Так может хакером Spyro1 станете вы?


Вы разобрались с ps2dis? Читать, в принципе, нужно лишь две статьи – про мнемонику MIPS и про горячие клавиши в программе.
Для изменения чего-то на лету ArtMoney не подходит (по непонятным причинам). Хорошо (у меня по крайней мере) работает мой MemGet с настройками по умолчанию.
Ещё раз, действия для изменения ячейки налету:
0) Подготовка: открыть ps2dis, WinHex, MemGet и Epsxe. В каждую программу соответственно загрузить нужный файл: в эмулятор – игру, сохранится F1; в MemGet подтвердить и прочитать, получив дамп памяти; его же загрузить в ps2dis, проанализировать, и в WinHex тоже загрузить дамп.
1) Загрузиться в Epsxe (F3) и быстро свернуть его.
2) Переключится в MemGet и считать.
3) Перейти в ps2dis, продолжая рассуждения; придумать опыт – скопировать адрес ячейки.
4) Перейти в WinHex, по имеющемуся offset записать какие-то данные, согласно задумке; сохранить.
5) Вернуться в MemGet и записать обратно в процесс изменённый дамп.
6) Развернуть Epsxe, чтобы проверить результат (хорошо бы в документе запись об этом сделать, иначе после десятка итераций совершенно запутаетесь в результатах)
7) Перейти к пункту 1. Причём Epsxe по ходу дела (с 2 по 5) лучше вообще не трогать – не переключаться в его окно даже при остановленной эмуляции!

А теперь давайте я расскажу (хотя почти забыл…), как я нашёл ширину тайлов для букв.
Сначала я попытался оттолкнуться от какой-нибудь японской надписи, но не таблички. Потому что табличка отрисовывается по-особому, побуквенно. В то время как фразы из меню паузы рисуются целиком.
Но мне с первого раза не повезло, потому что я напоролся на «Выход?» с вопросительным знаком на конце, которого не было в SCPS. Я принялся искать его по субфайлам, потом в ОЗУ, потом нашёл уже в самом её конце, куда он копируется каждым шагом. Ну короче, это оказался неудачный пример.
Определил надпись в EXE. Сдампил память и через WinHex отыскал нахождение тех же данных уже в ОЗУ (2Мб). Этот же дамп памяти загрузил в дизассемблер, по нулевому адресу.

*Окончание ниже*


Сообщение отредактировал aleksusklim - Суббота, 15.09.2012, 22:44
 
aleksusklimСообщение # 176 | Тема: Перевод Spyro 3: Текст Суббота, 15.09.2012, 22:16
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
#173, 15.09.12


Quote (MFS)
Вам удалось вскрыть диалоги в заставках? Будет дубляж? Сам тоже просто безумно хотел (и хочу) сделать дубляж, но не удалось до конца разобраться в ваде и в очень странном местном STR




Я, конечно, должен был уже давным-давно ответить и в этой и в _основной_ теме Spyro3, но просто японская версия первой части меня просто затянула…


Сейчас я хочу попросить модераторов создать отдельную тему под названием «Перевод Spyro – озвучивание» (или подобие по вашему усмотрению)
У меня есть материал, который я хочу выложить, но если сделаю это прям тут – его проигнорируют 99% участников (уже пытался три раза со времён начала проекта). Так что выложу в специализированную тему по озвучиванию.
Пора хотя бы уже заняться пробами актёров, иначе нам не успеть!

Как только кто-либо из АМС отреагирует на мою просьбу, цвет данного текста я измёню на чёрный (или сами отредактируйте мой пост, удалив строчки с «#...#», если не захотите ждать)


Quote (DrWho)
Возможно, будет чистый русский, но опять же, это предположение.

Quote (Spyro4evA)
Дубляж Only. А то мы будем ничуть не лучше того же Вектора.


Я не понял ни вас, ни вас! Объясните нормально что такое «дубляж» и «чистый русский»?

Quote (MFS)
Ну WAD можно спокойно просматривать в PSound (там нимного нимало 3000 с лишним сэмплов, кстати),


Эй! У меня PSound не видит ни одной сценки – только игровые звуки уровней.

Quote (Spyro4evA)
Реплики разбиты на части по 4 секунды, притом не по порядку.


Я не знаю, о чём вы, но я не могу вытащить ни одну реплику ни одной cutscene! Ни секунды!

Quote (Spyro4evA)
То есть Вы утверждаете, что игры используют банальный несжатый RAW? Не, ну такого быть не может!!!


Ни один «XA стайл» не открывается в GoldWave в Raw формате. Даёт электронный шум. Тем более уж прослушка целых субфайлов!
На вид «анализа» WinHex все звуки (Str/Xa/Wad-семплы) одинаковы, но на вид из PVV – различаются (доказал nihonjin). Звуки сценок я не анализировал, потому что я НЕ ЗНАЮ, где именно в WAD они расположены, и почему PSound их не видит.

Quote (MFS)
Или сжатый) Не помню, нужно почекать. Ну собсна да, если просто взять raw-тело, правильно его вставить/согласовать с местными заголовками, окончаниями (если есть) и т.д., то всё должно работать.


Я знаю единственный способ, как найти звук конкретной сценки:
1) Прикинуть множество субфайлов, в которых он может находиться. Убрать один из них (занулить/запороть) и запустить. Если работает – убрали не то -> вернуть на место -> убрать другое.
2) В найденном субфайле по отдельности грохать субсубфайлы, чтобы найти верный (первых скорее всего); игра будет вылетать, так что юзать лучше ОЗУ или сразу перейти к следующему пункту.
3) Имея область файла, в которой точно есть звук, нужно несколькими поочерёдными попытками зануливать/запарывать различные подходящие на вид её части. В конечном итоге найти то место, после порчи которого игра работает, сценка воспроизводится, а музыка – нет!

Quote (Spyro4evA)
Кстати, Крэш Бэш по-моему должен быть вообще самым лёгким в плане взлома. (Сам не пробовал, но думаю.)


Так попробуйте))
На его счёт у нас ведь тоже планы, но второстепенные.



Ответы на всё остальное дам позже.


but nobody came

Сообщение отредактировал aleksusklim - Воскресенье, 23.09.2012, 01:08
 
aleksusklimСообщение # 177 | Тема: Перевод японской версии Spyro the Dragon Суббота, 15.09.2012, 22:20
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
*Начало выше*

Фишка в том, что ps2dis имеет два параллельных адресных пространства – начинающиеся с «00000000» и с «80000000». В них хранится одно и то же. Причём за правильностью ссылок следит он сам! Мне сначала казалось, что это приведёт к путанице, но на самом деле так удобнее. Просто сразу следует перейти к «80000000», чтобы оказаться в «реальных» адресах. Ну а в WinHex нумерация как обычно начнётся с нуля. Поэтому можно просто стирать или добавлять «800» (или 8000, смотря сколько разрядов занято; короче – все нули) в начале любого адреса, чтобы транспортировать его между WinHex и ps2dis.
Ну так вот, а перешёл в ps2dis по адресу начала СТРОКИ. Он показал непонятный мнемонический код, который не имеет логического смысла, потому что является не кодом, а надписью. Поэтому нужно удержать кнопку «B», чтобы интерпретировать его как двоичные данные, а не ассемблер.
Выделяю первую строку (Space) и прошариваюсь по рефералам (F3). У каждого нужно осмотреть окрестности, чтобы попытаться понять структуру и назначение кода.
Ну короче, я заметил, что функция «80022868» повторятся ОЧЕНЬ часто. Там были и другие функции, но они располагались как-то разрозненно, а вот именно эта – везде. Ну я и решил её рассмотреть получше.
Вначале там задавались множество констант. По-идее ведь система должна знать:
– Во-первых, координаты на экране для рисования;
– Во-вторых, координаты каждого тайла буквы из GPU;
– В-третьих, сопоставление между байтами субфайла/EXE и отдельными тайлами;
– В-четвёртых, режим смешивания, цвет и местонахождение палитры.
Следовательно, где-то недалеко от места ссылки на надпись, должны задаваться в явном виде хотя бы некоторые из этих констант. Ужасно повезло, что за них как раз и отвечает золотая 22868. Ух, лишь пройтись по её рефералам – откуда только нет на неё ссылок!
Дерзнул изменить значение одного регистра – ура, ширина поменялась! А всё далее – плод продолжительных исследований и взломов.

nihonjin, вы готовы стать мной?

Действуйте как я и рассуждайте как я. Тогда сможете взломать вообще всё что угодно, и определить свойства любой надписи.
Зачем? Ну например, в спидвеях или меню подкорректировать выравнивание. Отцентровать текст «разбухших» от нашего вмешательства табличек. В атласе разметить столбцы по-другому, чтобы перед «/» не оставалось столько пустого места. Короче, достоинств куча (и забудьте про то, что написано под спойлером, я пошутил!).

Очень трудно досконально описать мышление прошедших (успешных) взломов, поэтому давайте я проведу ещё один, но незаконченный. Просто так, без развития (ведь иначе добьюсь какого-то результата, но при этом сразу забуду способ его достижения!)

http://klimaleksus.narod2.ru/Files/JAP/letters_27.png

Это часть вашего скриншота. (Кажется, то место, где вы описали некую «камеру» и «замену стрекозы», а может я и напутал, неважно).
Чё там написано не знаю. Зато могу примерно поискать текст в EXE.

http://klimaleksus.narod2.ru/Files/JAP/letters_28.png

Ну вот он текст. Теперь дамплю память и нахожу его там (ну я сделал «Copy hex values», а потом «Find hex values»)

http://klimaleksus.narod2.ru/Files/JAP/letters_29.png

Как видите, то же самое, но другой offset: был «689F4», стал «781F4» (все адреса следует держать в шестнадцатиричной форме, потому что ps2dis только с ними работает)
Беру этот адрес и превращаю в реальный: «800781F4». Перехожу в дизассемблер (в который загружен тот же дапм и уже «проанализирован» через меню) и прыгаю к этому адресу (клавиша «G» или в меню):

http://klimaleksus.narod2.ru/Files/JAP/letters_30.png

(Кстати, в меню «View > Kanji Code Set > SHIFT JIS» надо отметить, иначе вверху не будут показываться кириллические байты).
Ну понятно да, что этот зверский код типа «(lwc2) a2, $bdd3(t7)» – это не код, а всего лишь ошибочная интерпретация строковой надписи. Поэтому удерживаю «B» и вижу следующее:

http://klimaleksus.narod2.ru/Files/JAP/letters_31.png

Вот это уже яснее. Причёт в третьем столбце отмечены строки, на которые _могут_ существовать ссылки с других мест. И действительно, они указывают только на начала записей. Мы как раз находимся на одной из них. Нажимаю пробел (строка становится серая) и «F3» – попадаю к первому ссылающемуся:

http://klimaleksus.narod2.ru/Files/JAP/letters_32.png

Первому и единственному, что прекрасно. Если немного осмотреться и пройти вверх:

http://klimaleksus.narod2.ru/Files/JAP/letters_33.png

Это функция номер «1D5E4». Ни о чем не говорит. Поэтому лучше смотреть на предыдущий скриншот.
Оператор загружает адрес нашей строки в регистр «a0». Причём ниже по коду он никак не используется. А следующим же оператором идёт вызов функции «176C0». Взгляните на код дальше – эта же функция вызывается целых три раза, причём:

http://klimaleksus.narod2.ru/Files/JAP/letters_34.png

Синим выделена строка, очень похожая на ту, с которой мы начали, потому что она загружает что-то в регистр «a0», после чего – выполняет функцию «176C0», которая выделена серым.
(Вообще-то не совсем так: сперва считывается байт по адресу «80082DE8» (две строки выше) в регистр «v0», потом исполняется синяя строка, затем система прыгает к функции если байт равен нулю; а иначе предварительно перезаписывает содержимое «a0» другим адресом)
Перейдём-ка (кнопка стрелкаВправо) от синей строки на её назначение:

http://klimaleksus.narod2.ru/Files/JAP/letters_35.png

Мы оказались там, где были изначально, то есть на надписях, однако уже на другой строке. Эти адреса (a0) грузят японские слова, но передают их в функцию «176C0» сразу, без обработки здесь. Возвращаемся и переходим к этой самой функции:

http://klimaleksus.narod2.ru/Files/JAP/letters_36.png

Синее – первый адрес (начало) функции; серое – новая функция, перед которой расположен возврат «jr ra» (правда после него ещё один оператор, но мы-то знаем, что он успеет исполниться до того, как система покинет функцию)
Исследовать что-то такое небольшое, как эта «176C0» мне по душе. Начнём! Листинг:

800176c0: lbu v0, $0000(a0)
800176c4: nop
800176c8: beq v0, zero, $800176e8
800176cc: nop
800176d0: addiu a0, a0, $0001
800176d4: sb v0, $0000(a1)
800176d8: lbu v0, $0000(a0)
800176dc: nop
800176e0: bne v0, zero, $800176d0
800176e4: addiu a1, a1, $0001
800176e8: jr ra
800176ec: sb zero, $0000(a1)

Вспоминаем, что в «a0» передаётся адрес первого символа в тексте фразы. Итак, сначала в регистр «v0» загружается (LBU – предполагаю, Load Byte Unsigned) первый байт фразы.
Потом он сравнивается с нулём, и если это так, то происходит переход к строке «…e8» (ну 800176e8), что является конечной точкой функции – выход. Но наш первый байт заведомо не нулевой, так что выполнение продолжается ровно.
К значению «a0» прибавляется единица, то есть адрес отныне указывает на второй символ надписи.
Теперь байт из «v0» (первый символ) сохраняется по адресу, записанному в «a1», а я не знаю что там. Ну предположим, что в «a1» уже был сохранён некий адрес заранее.
Дальше в «v0» загружается новый байт по «a0», а это второй символ.
И если он не равен нулю, то система переходит к строке «…d0» (новое прибавление к «a0» единицы), но предварительно регистр «a1» тоже инкрементируется, то есть происходит одновременный сдвиг как источника данных, так и назначения, в которое они перезаписываются.
Получается, что надпись копируется с адреса «a0» на адрес «a1» до тех пор, пока не встретится нулевой завершающий байт. После чего «a1» ещё раз инкрементируется (может специально, может случайно), и система встречает JR RA – выход из функции.

Теория такова, что данная функция реализует копирование имеющейся надписи в какую-то область ОЗУ. Возможно, для последующего изменения или рисования оттуда.

Ладно, мы выяснили, что делает «176C0», пора хоть вскользь взглянуть на окончание «1D5E4»:

http://klimaleksus.narod2.ru/Files/JAP/letters_37.png

Ну, как видно, функция длинная и непонятная. А под концом запускаются ещё некоторые и различные и одинаковые функции. Их бы тоже можно исследовать…
Ну а чуть повыше в коде:

http://klimaleksus.narod2.ru/Files/JAP/letters_38.png

Рисовалка! Та самая функция «22868», где расположена ширина букв и вся отрисовка.
Настало время проверить теорию о том, что «176C0» просто копирует строку символов из одной части памяти в другую. Вспоминаю, что «Выход?» именно копируется из SCPS в конец ОЗУ. Так может это тоже происходит вызовом копировальщика?
А как проверить? Запороть сам копировальщик! Либо занулить середину, либо повесить JR RA в начало. Адрес начала – «800176C0». Переходим в WinHex по «176C0» в файле дампа памяти:

http://klimaleksus.narod2.ru/Files/JAP/letters_39.png

Курсор на начале функции, выделен JR RA из предыдущей функции выше (два оператора назад; при сверке двоичных данных не забудьте, что ps2dis выводит байты задом наперёд, то есть «03E00008» обозначает «08 00 E0 03»).
Смысл в том, чтобы скопировать это число «08 00 E0 03» («65011720» в десятичной) и записать его по адресу начала функции. А раз следующий же оператор – ноль (NOP), то система при попадании в функцию просто немедленно покинет её. Вот так:

http://klimaleksus.narod2.ru/Files/JAP/letters_40.png

А чтобы загрузить это в эмулятор, я воспользовался уже описанным методом через MemGet. Эмулирую:

http://klimaleksus.narod2.ru/Files/JAP/letters_41.jpg

В самом меню всё в порядке. А если войти в подменю:

http://klimaleksus.narod2.ru/Files/JAP/letters_42.jpg

Пусто! Как я и предполагал. Однако ни на таблички, ни на многое другое это не повлияло. Всё что я нашёл – только вот этот «Выход?»…
Интересно то, что если выйти из подменю и войти в него снова (заставить перерисовать надпись), то «мусорный» символ может поменяться:

http://klimaleksus.narod2.ru/Files/JAP/letters_43.jpg

В большинстве случаев фигурировали только они. Но однажды (без выхода из эмулятора, просто долго тыкал в меню) выскочило это:

http://klimaleksus.narod2.ru/Files/JAP/letters_44.jpg

Взлом закончен. Результаты «открыты» – то есть пока практического применения этому нет, но оно может появиться после; либо моё описание станет служить неплохой демонстрацией примера верного хода мыслей.
Что ещё можно там доломать? Проверить ссылающихся на саму «1D5E4» или проанализировать функции в её конце – работка всегда найдётся!

Ну а теперь перехожу к описанию того, что же я смог открыть в «22868» – рисовалке.
Модифицированный скриншот:

http://klimaleksus.narod2.ru/Files/JAP/letters_45.png

Первая строка функции производит какие-то действия над «a3» (который передан как аргумент), а именно извлекает из него верхние два байта в «t0».
На второй строке из «a3» удаляются верхние байты (логическое И на $FFFF как раз и обрежет старшие два байта, которые через SRL уже сохранены в «t0»). Таким образом в одном аргументе «a3» функция получает сразу два значения.
Далее идёт загрузка в «t0» и «t1» ширины и высоты букв. Но поскольку есть два набора катаканы, для больших букв вступают в силу другие параметры, которые активируются в зависимости от флага «t0» (верхних байт бывшего «a3»). Больше ни для чего «t0» не используется, потому что его содержимое явно перезаписывается константой ширины, которая (наверно) не меняется в коде ниже.
Затем в «at» загружается определённый адрес, «79598» (80079598). Регистр «a3» (переданный; два младших байта) сдвигается на два бита влево, то есть из «1» превращается в «4»; из «2» – в «8», из «3» – «C» (12). Очевидно, значение a3 передаёт сдвиг строки или считываемого значения, причём сразу на четыре байта.
И тут же прибавляется к «at», сохраняясь обратно в «a3»! Теперь «a3» может принимать либо исходное значение от a»t», либо больше (в зависимости от бывшего), но шаг кратен четырём. Корочь, тупо арифметика:
t0=int(a3/65535)
a3=a3 mod 65536
at=80079598
a3=a3*4
a3=a3+at
А потом сразу же «a3» перезаписывается теми четырьмя байтами, на которые указывает.
Что бы это могло быть? Как видно по скриншоту, я заменил строку «andi a3, a3, $ffff» (в которой a3 принимала переданное ранее неизвестное значение в диапазоне от 0 до 65535) на «addi a3, zero, $0001» (то есть явное присвоение того значения, которое я выберу).
В WinHex это ячейка:

http://klimaleksus.narod2.ru/Files/JAP/letters_46.png

Запустил с разными значениями (первые два байта), и смог заставить появляется всем надписям с одним цветом! (девятый скришнот из-под спойлера)
Цвета последовательные, как и при @ABCD… Тогда куда же указывает «at»? Посмотрим:

http://klimaleksus.narod2.ru/Files/JAP/letters_47.png

И естественно, это не ассемблер (хотя бы потому, что «zero» первым аргументом в любом случае работать не будет!). В WinHex:

http://klimaleksus.narod2.ru/Files/JAP/letters_48.png

Это цвета!! Явные определения цветов. Мало того, они ещё и в стандартном формате RGB от 255! Можно задать абсолютно любой цвет смешивания с любыми значениями 00-FF (0-255) – обычный компьютерный цвет. Эксперименты над цветами показаны в спойлере под номерами 11, 12, 13, 14, 15. Как видно, они слишком яркие, если брать по максимуму. Белый вообще засвечивается. А чёрный абсолютно чёрен! Поэтому их следует менять в разумных пределах. На скриншоте 17 я отредактировал белый цвет выделения, что доказывает, что каждый цвет настраивается независимо от других.
За что отвечает последний байт цветов «2C» (44) ? Без понятия. Но он одинаков для каждого цвета, а если его заменить, то буквы либо вообще пропадут (как на скринах 5 и 6) или вызовут графические глюки (7, 16).
Однако до полного вылетания из эмулятора почти не доходило. Функция безопасна и стабильна с этой точки зрения, поэтому можно ставить самые дерзкие опыты – в худшем случае буквы просто не будут отображаться.

Последующие присвоения неких адресов регистрам t3, t5, t8 ,t9 я тоже частично исследовал. Если просто испортить их, то вместо букв будут эти серые прямоугольнички. Однако ежели изменять константы в небольших пределах, то получается новая полуглючная перетасовка тайлов символов (скриншоты 1, 2, 3, 4).
Интереснее стало, когда я догадался перейти по адресу и посмотреть на данные:

http://klimaleksus.narod2.ru/Files/JAP/letters_49.png

Плохо, что я не помню конкретно своих выводов, потому что я только скриншотил всё время (а сейчас пойди разбери, какой скрин что показывает – это придётся заново опыт ставить!)
Выделено – цифры (и может быть, символы типа скобок). Выше после цветов – как помнится, сопоставление дополнительного набора. Ниже по данным (большой блок) – вся азбука стандартного набора. Это и есть координаты тайлов, соответствующих символам! Тут можно поменять ВСЮ таблицу перекодировки на нашу собственную, если понять, как именно она устроена.
Я же просто применил «fill encrypted data» и поглядел на результат (скриншоты 23, 24, 25); можно видеть, что полоски громкости однажды не затронулись (26).
Как получены 20, 21 и 22 – честно не помню, но кажется, что я менял какой-то непонятный адресок одного из регистров… (возможно, «t9»)

Ещё надо сказать про строки:
lui t8, $8008
addiu t8, t8, $f328
lw t8, $0000(t8)

Что делает этот код?
1) Грузит 8008 в t8.
2) Изменяет его на «8007F328»
3) Считывает оттуда четыре байта, и перезаписывает ими же t8.

ОК? Его нелегко исследовать! Сначала перейдите к этой строке. Потом нажмите стрелкуВправо, чтобы оказаться у данных (если загружен не дамп памяти, а сам EXE, то там будет пусто). Увидите ассемблер код, который НЕ ПОЗВОЛИТ определить и перейти по нужному (вторичному) адресу. Для решения проблемы нажмите «W» и вернитесь на строку. Ещё раз стрелкаВправо – и вы в нужной области! Поясняющий скриншот:

http://klimaleksus.narod2.ru/Files/JAP/letters_50.png

В принципе, дальнейшее содержимое функции очень сложно и объёмисто, чтобы его вот так просто заменять и отслеживать изменения; да и может оно нам вовсе не понадобится. Однако суть кода знать не помешает.

Всё сказанное о взломах цветов и таблицы символов, а также их ширины, может в теории быть актуально для Spyro3, мне надо бы этим заняться…
А пока, вам неплохо бы найти аргументы, которые отвечают за позицию рисования текста (точка на экране), потому что эта функция, похоже, рисует либо только одну надпись (каждую надпись, но по очереди), либо вообще одну букву! Причём не столько рисует, сколько копирует в какую-то область ОЗУ расшифрованные данные о том, где брать тайлы, какого цвета, ширины и так далее.
Интересно бы узнать, почему цифры уже (компактнее) всех, как именно накладывается докутен, как определяются отдельные палитры для букв и значков кнопок, почему тайловый набор перевёрнут (явно ли задаётся поворот картинок; или же он выдался просто случайный, а разработчики подстроили под него свой набор шрифта)

Если будут трудности – спрашивайте!

P.S У вас PSound выдирает треки сценок Spyro3 из WAD? Хоть частично?




Quote (Spyro4evA)
ХВАТИТ МЕНЯ ИГНОРИРОВАТЬ!!!

Quote (DrWho)
Да он по-моему всех, кроме этой темы, игнорирует. :(

Quote (DrWho)
Мы к aleksusklim обращались, а он ни тут, ни в соседних темах не отвечает. И даже в лс не отвечает.

Quote (nihonjin)
Мм... и мне он в ЛС отвечает...

Хосподи, да успокойтесь вы!!
Дискретная математика по 4 или 5 пар в день ежедневно с понедельника по субботу + пятичасовые тренировки типа ВКОШП каждое воскресенье – приходится фильтровать список тем для очередного комментария…


but nobody came

Сообщение отредактировал aleksusklim - Суббота, 15.09.2012, 22:58
 
aleksusklimСообщение # 178 | Тема: Перевод Spyro 3: Текст Суббота, 15.09.2012, 23:15
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
#175, 15.09.12


Quote (DrWho)
А вообще, можно википедию почитать по этому поводу.


Я знаю, что такое дубляж.
Но не знал, что конкретно вы можете подразумевать под эти словом.

Quote (DrWho)
А под чистым русским я имел в виду только русская озвучка, без английской.


Я рассчитываю именно на это. Нужно подумать над тем, что делать с музыкой. Кажется, сия половина темы как раз и началась с обсуждения этого.

Quote (DrWho)
А уж игнорировать людей, причем даже в лс - тем более.


Да не игнорировал я вас!!
Я мог ответить либо всем и сразу да подробно, либо каждому отдельно но хреново.
Получилось что-то среднее (сразу хреново отвечаю всем…)

Неверно распределил свой интерес между Spyro1 и Spyro3.

Коли я уж такой тормоз, давайте взламывайте всё сами по моим уже написанным инструкциям))


but nobody came
 
aleksusklimСообщение # 179 | Тема: Перевод игр о Спайро – озвучивание. Воскресенье, 23.09.2012, 02:05
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
Всем Всем Всем !

Наш проект перевода в самом разгаре!
Не проходите мимо!
И вы тоже можете нам помочь!
=== НАЖМИТЕ СЮДА ===
Вкратце: требуются актёры!
=== WELCOME ===
А также художники для соседней темы
=== КЛИК ===
У нас есть переводчики, программисты и…
большое желание создать лучший из всех переводов

Spyro: Year of the Dragon Greatest Hits!



.

.

.

.




#177, 22.09.12


Люди! Настало время приступить к озвучиванию!
Или по крайней мере к пробам актёров.
Набирается как их список, так и список тем, где они требуются:
http://www.spyro-realms.com/forum/48-11436-16
http://www.spyro-realms.com/forum/48-11461-6
http://www.spyro-realms.com/forum/48-11516-2

Итак, я вновь буду первым, и для начала повторю то, что я уже выкладывал ранее:

Стихи:

Дракон на утёсе:
http://klimaleksus.narod2.ru/site/Speak/files/00.mp3
Прогулка в лесу под полной луной:
http://klimaleksus.narod2.ru/site/Speak/files/01.mp3
Колобок:
http://klimaleksus.narod2.ru/site/Speak/files/02.mp3
Поэт и художник:
http://klimaleksus.narod2.ru/site/Speak/files/03.mp3
Сага о чудаке или чудак о двухстах фактах:
http://klimaleksus.narod2.ru/site/Speak/files/04.mp3
Злодейский напиток:
http://klimaleksus.narod2.ru/site/Speak/files/05.mp3
Верный друг:
http://klimaleksus.narod2.ru/site/Speak/files/06.mp3
Ода математике:
http://klimaleksus.narod2.ru/site/Speak/files/07.mp3

Видео и прочее:

Презентация Детский ПК:
http://klimaleksus.narod2.ru/site/Graphic/pp/bolt/BoltComp.zip
У ручья:
http://klimaleksus.narod2.ru/site/Graphic/avi/creek/creek.part@.rar (где «@» – от 1 до 6)
Партия:
http://klimaleksus.narod2.ru/site/Graphic/avi/party/party.part@.rar (где «@» – от 01 до 20)
(Скоро выложу новое видео «Герб»)

Моя проба на роль Спаркса:
http://klimaleksus.narod2.ru/Files/Sparx.mp3

Так, а теперь добавлю ещё немного своих стихов (и пусть мне не говорят, что я таким образом пытаюсь себя раскрутить – я ведь просил модераторов создать эту тему! Так что я тут ни при чём)

Мотылёк:
http://klimaleksus.narod2.ru/site/Speak/files/08.mp3
Добрый друг Бетмена:
http://klimaleksus.narod2.ru/site/Speak/files/09.mp3
(Вообще, мне часто говорят, что я слишком быстро читаю некоторые стихи… Но по другому я не могу. Я так задумал! Если стих писан как быстрый, то я не стану его замедлять, даже если поддерживать сумасшедший ритм очень трудно – в нём вся динамика!)
Тишина (в противовес, очень медленный):
http://klimaleksus.narod2.ru/site/Speak/files/10.mp3
Астроном:
http://klimaleksus.narod2.ru/site/Speak/files/11.mp3
(вот этот тоже скоростной! И не запорот у него конец, просто приём такой…)

Лады. Давайте что-нибудь посерьёзней. Чуть больше актёрского мастерства!
Поозвучиваю цитаты. Хотел много, но собрал мало (да и качество откуда я их вытаскивал оставляет желать лучшего).
Ранго, оригинал:
http://klimaleksus.narod2.ru/Files/1/rango.mp3
Моя переозвучка:
http://klimaleksus.narod2.ru/Files/1/rango_my.mp3
(Клименко!? УВОЛЕН!!!)

Эксперименты с монтажом! Слабо ли мне повторить такое:
Гномео и Джульетта:
http://klimaleksus.narod2.ru/Files/1/terra.mp3
(блин, и как у этого Ходженса горло только не болит!?)
Моя переозвучка со всем-всем-всем:
http://klimaleksus.narod2.ru/Files/1/terra_my.mp3
Нашёл узбекский официальный дубляж для сравнения:
http://klimaleksus.narod2.ru/Files/1/terra_uz.mp3

Ага, я ещё и песенки попою. Только вот с записью музыки мои проблемы нисколько не решились, так что я – аКапелла:
King of the road: (ну на английском, и что?)
http://klimaleksus.narod2.ru/Files/1/king.mp3
(эдакий мутант смеси всех версий этой песни, что я слышал…)
Хотите русского? Катюша!
http://klimaleksus.narod2.ru/Files/1/kate.mp3
(ну дайте, дайте подурачиться!)
(Клименко! Ты ещё здесь!?)

А под конец подойду вплотную к Спайро. Переозвучу несколько английских фраз:
Кошельков: Толстосум:
http://klimaleksus.narod2.ru/Files/SPEECH_240.mp3
Мой вариант:
http://klimaleksus.narod2.ru/Files/SPEECH_240_my.mp3
Этот хрипой из башенок со статуей Колдуньи:
http://klimaleksus.narod2.ru/Files/SPEECH_356.mp3
Я тоже так могу:
http://klimaleksus.narod2.ru/Files/SPEECH_356_my.mp3
Попробую-ка это:
http://klimaleksus.narod2.ru/Files/SPEECH_450.mp3
Рапунцель… А хоть ради развлечения:
http://klimaleksus.narod2.ru/Files/SPEECH_450_my.mp3
А это уж совсем проникновенный бас:
http://klimaleksus.narod2.ru/Files/SPEECH_472.mp3
Попытаюсь:
http://klimaleksus.narod2.ru/Files/SPEECH_472_my.mp3
Из норки Тики:
http://klimaleksus.narod2.ru/Files/SPEECH_517.mp3
Главное губы напрячь:
http://klimaleksus.narod2.ru/Files/SPEECH_517_my.mp3
Ы грыжданына голысым ысминога Павыла:
http://klimaleksus.narod2.ru/Files/SPEECH_524.mp3
(Да его ж стошнит…)
http://klimaleksus.narod2.ru/Files/SPEECH_524_my.mp3
Правда есть и те, что не нуждаются в особом искажении голоса:
http://klimaleksus.narod2.ru/Files/SPEECH.mp3
Главное сказать красиво:
http://klimaleksus.narod2.ru/Files/SPEECH_my.mp3

Всё. Чё делать дальше ещё не придумал.

Актёры, давайте! Покажите себя!

Самое главное правило:

Ни нада стис-ня-ца!


but nobody came

Сообщение отредактировал nihonjin - Понедельник, 31.10.2016, 22:24
 
aleksusklimСообщение # 180 | Тема: Перевод японской версии Spyro the Dragon Воскресенье, 23.09.2012, 02:07
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
Старт озвучивания и проб актёров:
http://www.spyro-realms.com/forum/48-11529-1
 
Поиск:

Кто нас сегодня посетил

Для добавления необходима авторизация