Воскресенье | 09.08.2026 |14:11
Приветствую Вас Гость Мира Спайро | RSS
Модератор форума: nihonjin, aleksusklim, alteya, Томас  
Перевод Spyro 3: Взлом и программы
aleksusklimСообщение # 1 Воскресенье, 26.06.2011, 14:19
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
Работа с текстовой частью перевода введётся на code.google.com/p/spyro3-rus, обсуждение перевода (а не взлома) В темеПеревод Spyro 3: Текст
В этой теме происходит обсуждение перевода, а также создание софта для потрошения игры.
Важные сообщения: Структура WAD-файлов Спец. символы и File Paint 1 | Извлечение и добавление текста | О звуке | В продолжение о звуке | Вариант перевода Buzz's Dungeon и Midday Gardens


Сообщение отредактировал aleksusklim - Среда, 29.04.2015, 19:51
 
aleksusklimСообщение # 136 Воскресенье, 22.04.2012, 22:25
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
Продолжение

Алгоритм поиска адреса на строку
1) Запускаем Epsxe > Run BIOS.
2) Нажимаем CTRL+H – режим взломщика.
3) Открываем ArtMoney, выбираем нужный процесс (Epsxe/pec)
4) В «(pec) Cheat Hacking Engine» выбираем «Equal value / Char (1 byte)» даём поиск (continue). Потом жмём «Add/Remove R.», вводим «Start: 1 / End : 1FFFFE» – Remove. В таблице окажется лишь два крайних адреса = 0. В ArtMoney – поиск – точное значение – 1 байт – адреса ВСЕ. Потом в PEC – Modify на первое – сделать = 1. В ArtMoney – отсеять =1. Находи несколько адресов, добавляем только первый. Повторяем то же со адресом 801FFFFF. Находим второй в ArtMoney. Если отнять от второго адреса первый, то получим (десятичный) 2097151. Всё верно. Мы только что сопоставили реальные адреса RAM эмулятора виртуальным адресам PlayStation. У меня это числа 0094C020 и 00B4C01F. Все дельнейшие взломы ArtMoney должны быть с опцией «Диапазон адресов – Ваш набор > » и вставить найденные адреса начала и конца. Либо если используете мой Epsxe, то пропустите этот пункт, используйте мои.
5) Перезагрузите Epsxe, выберите образ игры и зайдите в нужный уровень > CTLR+H.
6) Определите надпись для трассировки. Для примера – «Sunrise Spring Home».
7) ArtMoney > Искать > Точное значение > «Sunrise Spring Home» > Тип – Текст > Диапазон адресов – Ваш набор (найденные) > ОК.
8) Будет найден один адрес, занесите его в таблицу.
9) Щёлкните по «Текст х байт» и измените его на «Тип – целое 1 байт».
10) В PEC дайте поиск по этому значению, которое появилось вместо текста (код первого символа).
11) В ArtMoney измените его.
12) В PEC продолжите поиск (не продолжая игру!) по новому изменённому значению.
13) Будет найден единственный адрес.
14) Откройте Калькулятор > Инженерный > Hex. Введите его.
15) Преобразуйте в десятичную систему и скопируйте.
16) ArtMoney > Искать > Точное > {вставьте адрес} > Тип – ваш набор – отметить «целое 4 байта» > ОК.
17) Будет найден единственный (дай бог) адрес – указатель на строку.
18) Добавьте в таблицу, правый клик по нему > Редактор памяти.
19) Увидите где лежат указатели! Перепечатайте оттуда немного шестнадцатеричных цифр куда-нибудь в Блокнот.
20) Откройте в WinHex приблизительное место для проверки (файл SCUS_944.67) и сделайте Search > Find Hex Values > {вставьте перепечатанное сюда}.
21) Если что-то найдётся, то вы сможете понять, как там всё устроено…

Вот так «ничем» этот метод и заканчивается. Вот что я нашёл:
http://Klimaleksus.narod2.ru/Files/GH/hex.png
Абсолютное совпадение. Теперь можно изменять данные файла, и это реально изменит поведение игры. Главное ничего не напутать.

Думаем дальше. Мы знаем адрес на строку. Как изменить длину этой строки? Сдвигать всё равно нельзя – мы же не будем отлавливать десятки адресов по последующим записям… Может тогда найти пустое пространство, и выставить указатель туда? А можно ли вообще его менять?
Пока решение – увеличить одну строку за счёт уменьшения другой. И чем ближе друг к другу будут эти строки, тем легче выполнить изменение адреса. Указатели идут абсолютные, но при таком методе нам важно относительное показание квартетов, а не полный адрес. Грубо говоря, там десяток добавил, а тут – убрал. Разумеется с уже изменёнными длинами строк.
Муторно! Да. Однако результативно. Но стоит ли оно того, если всё придётся делать вручную?

А я пока искал ещё строковые константы. Это имена уровней, приведённые выше, названия сценок. Имена Спайро-Шейла-Бёрд-Бентли-Агент9 – все те, за кого можно играть (в зелёных диалогах отображается имя персонажа). Это всё глобально.
А что локально? Имена живых говорящих существ и их тексты. Также часть меню паузы, где инструкции по управлению. А ещё ЯЙЦА! (которые почему-то разделены всегда только одним нулём…)

Анализировал список яиц. И знаете что! После него ДОФИГА свободного места! Кучи килобайтов! И они напрямую записаны из суб-субфайла номер два. Всегда! Во всех уровнях есть тонны свободного места. Ну просто девать некуда…
Возможно ли его использовать? Я залил после яичек первую фразу Бианки (самый длинный текст во всей игре!) в ОЗУ. Получил на него указатель, отняв от абсолютного адреса разницу между адресным пространством Epsxe и виртуальной игрой (пункт 4). Этот адрес залил вместо указателя на первую фразу первого светлячка Spooky Swamp.
Кстати, это было сложно! Нужно точно попасть на 4 байта до начала текста. Там всё странно: имена персонажей начинаются вот прям с текста, а их реплики – с некого квартета, который не дай бог зацепить и – конец игре моментальный! А вот имена менять – так я могу хоть на что указатель закинуть – и будет другое имя. Хоть на «Sony Computer…» в самом начале EXE. Или на реплику, вот:
http://Klimaleksus.narod2.ru/Files/GH/talk1.jpg
Видали? Это не скопированный текст, это просто указатель на имя персонажа приравнен указателю на первую букву его реплики. Но не той, которую он говорит сейчас.

А вот обратно (сделать реплику равную имени) не получиться. Потому что каждая реплика имеет префикс – 4 байта. Он как-то определят, будет ли разговор закончен по нажатию кнопки, или персонаж скажет ещё что-нибудь; также регулирует поведение «треугольника», но есть что-то изменить – игра падает мгновенно.
И вот на мою встроенную речь Бианки клевать не хотело… Тогда я немного продублировал собственный текст персонажа и залил его поверх и яиц и моего текста.
Вуаля!
http://Klimaleksus.narod2.ru/Files/GH/talk2.jpg
http://Klimaleksus.narod2.ru/Files/GH/talk3.jpg
http://Klimaleksus.narod2.ru/Files/GH/talk4.jpg
http://Klimaleksus.narod2.ru/Files/GH/talk5.jpg
Вот! Я изменил длину! Очень сильно изменил.
И такое можно проделать везде!
Два недостатка – сложный процесс и «глобальность» места назначения. Скорее всего наше «пустое пространство» глобально на всём уровне, включая все подуровни. И если ТАК менять ВЕСЬ текст, то место рано или поздно закончиться. Поэтому есть четыре варианта удлинения текста («глоб» – один раз для всех подуровней; «лок» – относится только к единственной фразе/реплике):

1) Махинации со шрифтом (глоб)
2) Превращение нулей в буквы (лок)
3) Изменение соседних указатель за счёт друг друга (лок)
4) Вынесение реплик в «яичную» зону (глоб)

Плюсы и минусы каждого метода:
Первый: Плюсы –
+ Гибкость, если всё удастся.
+ Простая реализация.
+ Определённо безопасно.
Минусы:
– Трудно нарисовать правильный шрифт.
– Придётся иметь столько шрифтов, сколько у нас таких уровней.
– Возможно только после утверждения шрифта.
– Мало места для текста (не более 10-15 знакомест на весь уровень)

Второй: Плюсы –
+ Легкость реализации.
+ Массовость.
+ Определённо безопасно.
Минусы:
– Мало шансов, что будет свободное место (75% один символ, 50% – два и лишь 25% –три)
– Не более трёх знакомест на одну надпись.

Третий: Плюсы –
+ Если реплик у персонажа много, количество свободных знакомест велико.
+ Не нужно искать абсолютный адрес указателя.
+ По факту, мы будем заботиться о {Разнице} не каждой отдельно строки, а суммы всех знаков всех реплик одного живого существа.
Минусы:
– Применимо только к диалогам.
– Сложно в реализации, не обойтись без двоичного редактора.
– Требует тщательной проверки.
– Не создаёт настоящего пространства, а лишь перераспределяет его.
– Опасность отказа игры.

Четвёртый: Плюсы –
+ Можно сделать везде во всей игре.
+ Практически неограниченное увеличение длины.
+ Применимо абсолютно ко всему – реплики, имена, надписи.
+ Позволяет писать что угодно.
+ Можно комбинировать с предыдущим методом, тогда вынесенная фраза отдаст все опустошённые символы для соседних реплик.
Минусы:
– ОЧЕНЬ СЛОЖНО и трудоёмко!!
– До конца не исследовано.
– Опасно всерьёз.
– Неэкономично.
– Оставляет «мусор» в виде опустошённых байтов на месте старой фразы (вернее саму фразу, если её не удалить принудительно)
– Но если использовать этот метод, то мы потеряем «задор», обленимся и наш высококачественный продукт превратиться в канцелярский механический перевод без грамма креатива.

Дело за вами! Или взломайте ещё сильнее, или просто перепроверьте все мои методы.
Вы спросите, как? А я написал ещё пять программ на Delphi за другие три для беспробудного дельфийского забвения! Качайте:
http://Klimaleksus.narod2.ru/Files/Mem.rar
Ни одна из них не выполняет законченной работы. Они лишь облегчают ковыряние фалов. И ещё одна ремарочка: я их не проверял.
Нет, я их конечно проверял, но только поверхностно. Просто если бы я занимался ещё и трассировкой, то этот комментарий появился бы только недели через три…
Давайте так: я делаю программы, а вы, хакеры, их проверяете и сообщаете мне результаты. А я буду только создавать!

Инструкция.
«Bit2txT.exe». Перетаскиваете на него любой файл, и он разбивает его на три составляющие – текст, данные и нулевые байты. Это записывается построчно в TXT. Строки начинаются либо (латинские) с «T:» – далее идёт ANSI текстовая строка (кириллица запрещена!), либо с «B:», после чего будут байты как шестнадцатеричные пары, разделённые ОДНИМ пробелом, или наконец «O:» (это английская буква O, а не ноль), а за ним число – обозначает столько-то нулевых байт.
По сути говоря, извлекает текст. Хе, забавно…
Зачем нужна? А через неё очень легко превратить несколько нулей в буквы. Делается так:
1) Конвертируете часть или весь файл.
2) Открываете TXT и переходите к нужной строке.
3) Смотрите сколько нулей показано в следующей строчке. Если больше одного, то можно дописать несколько букв к строке, но отнять столько же от количества нулей.
4) Сохраняете документ и перетаскиваете его на деконвертер.
5) А уже потом производите анализ Текст-О-Вытаскавателем! Получите дополнительные буквы, готовые к изменению!

А «деконвертер» – это «Txt2biT.exe». Перетаскиваете на него свой документ, и он собирает из него снова двоичный файл. Осторожно!
Никаких проверок на ошибки не производится! Не оставляйте пустые строки. Не ставьте лишние пробели ни перед, ни после строк. Шестнадцатеричные данные вносите (если вдруг нужно будет) именно так, как они записаны – два символа в верхнем регистре через пробел и с пробелом на конце.
Иначе он запакуется, но с ошибками. Да, и не перетаскивайте на него ничего кроме документов, полученных предыдущее программой!

Но это годится только для работы с нулями. А что же с относительными изменениями указателей? Для этого есть другая программа:
«Uns2txT.exe» – тоже, перетаскивайте на него файлы или части файлов.
Результат покажется странным, но я объясню.
Программа представляет файл как набор беззнаковых квартетов (unsigned integer 32 bit). Первая четвёрка превращается в число, которое записывается в первую строчку документа. А следующая четвёрка вычитается из предыдущей, и записывается разница (может быть отрицательной, поэтому мне пришлось внутри использовать int64). Считываются ещё 4 байта, и их значение отнимается от предыдущего (но не от уже получено разницы) и записывается на следующую строку. И так пока не кончиться файл (желательно, чтобы его размер был кратен четырём).

Декнвертер – «Txt2unS.exe». Всё точно также, но наоборот.
План работы:
1) Как-либо найти указатели на реплики.
2) В WinHex выделить этот блок (где указатели записаны подряд, например 16 байт – четыре указателя).
3) Скопировать в новый файл.
4) Перетащить этот файл на конвертер.
5) Будет получен документ, где перечислены ДЛИНЫ строк (включая нули и начальные квартеты). Потому что если строки записаны одна за другой, то отнимая из начального адреса следующей начальный адрес предыдущей, мы и получим длину первой.
6) Изменить эти самые длины, придерживаясь такого правила – сколько добавили, столько же отнимите.
7) Сохранить и сконвертировать обратно.
8) Открыть результат в WinHex, скопировать весь и залить поверх исходного блока в начальном файле.

Получается очень удобно (чем трижды пересчитывать каждый адрес). Заметьте, что в SCUS длины строк будут отрицательными – ведь они расположены не друг за другом, а наоборот – самая первая строка стоит в конце.

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

Адрес и размер задаётся числом. Если хотите в шестнадцатеричной системе, поставьте «h» последним символом. И не забывайте постоянно нажимать «Применить данные!» после любого изменения любого текстового поля.
Начальный адрес всех процессов – «10000h». По умолчанию я поставил «0094C020h» – моя виртуальная область в Epsxe. Размер – 2 Мб. Выгружать для работы ещё можно, а вот загружать обратно не советую…

Основное использование на мой взгляд – внедрение нужной инфы по нужному адресу для проверки игры «на лету».
Альтернатива – «копировать область» в ArtMoney, но там вы больше килобайта не захватите; или «open RAM» в WinHex, но чёртос-два вы сможете его обновить, не переоткрывая процесс заново!
А моя программка очень легко копирует мелкие области. А файлы-то можно затем и в том же WinHex редактировать, словно это ОЗУ (только с поправкой на offset). А обновлять – чтением и записью.

Ну и каким же из четырёх способов воспользуемся? Я думаю так:
– Первый метод пока отложить и не рассчитывать на него (и «СПАЙРО» и «НЕТ» теперь решаются вторым методом)
– Второй использовать повсеместно, где это получиться. Хуже точно не станет!
– Третий применять редко, только если это будет удобно и принесёт больше пользы, чем потребует усилий.
– А четвёртый – это козырь. Его можно применять только в крайних случаях! И я придумал в каких. Описал в теме перевода текста. Подсказка «Назойливая Зоя и Пропавшая Шейла»!

А изменять данные ОЗУ на лету, видя в окне поведение игры оказалось очень увлекательным занятием! Я модифицировал строку и сразу наблюдал реакцию игры. Как же легко было определить все диакритические знаки:
http://Klimaleksus.narod2.ru/Files/GH/sign.png

Но если поставить @$, то мигом слетают все текстуры:
http://Klimaleksus.narod2.ru/Files/GH/bad.jpg
Если захотим напугать пользователя – метод есть!

Также нашёл «скрытые» цвета, можно добавить в список:
– «@:» – Тёмно-коричневый,
– «@;» – Тёмно-красный,
– «@<» – Оранжево-розовый,
– «@=» – Прикольный тёмно-серый.
Все вместе:
http://Klimaleksus.narod2.ru/Files/GH/color.png

Жаль, нет синего. Изменить просто так их не получится, потому что они заданы не в текстуре, а в программном коде. Придётся довольствоваться ими, а не изобретать свои.

Проверил остальную ASCII таблицу. Так оказывается, что все байты до пробела отвечают за показ отдельностоящих диакритических значков! По несколько вариантов, я выбрал самые широкие:
http://Klimaleksus.narod2.ru/Files/GH/all.png
Но где же перевёрнутый восклицательный знак (@!) ? Кажется, нету. Ну и ладно, обойдёмся без него.
А все остальные можно перерисовать! Это подарит нам целых восемь экстра-знакомест!
Но чтобы их использовать, Текст-О-Вытаскиватель придётся задавать не «Построчно», а «Слепить» и редактировать WinHex. Иначе никак. Но всё же легче, чем заменять нули!

Так-так, минуточку… Я ту циферки прикинул…
А если…
А если сделать ДВА регистра русских букв? Надо 33*2. Это 66. Цифры и основные символы не менять. Имеем латиницу: «A-Z» – 26. Ещё «a-z» – 26. Итого уже 52. Остаётся 14 символов…
Черту («/») меняем. Апостроф меняем. Плюс меняем. Проценты меняем. Звезду меняем.
Осталось девять. А теперь у нас есть 8 диакритических.
Итог – минус один. Но ведь «Ы» (если «Ынха» не придётся писать!), «Ъ», «Ь» можно оставить лишь нижним. А ещё «О» приравнять нулю «0». Глядишь и засунем два регистра!
…Ой, а плюс-то нужен для комбинаций типа «Х+Х для полёта»… Тогда НЕ меняем.
Можно ещё поковырять октеты со старшим битом «128–255», вдруг найдём ссылку на пустую клетку в шрифте.
А ещё можно взломать ширину букв, чтобы они все отображались по максимуму, но я пока не знаю как…

Плюсы:
+ Красиво Выглядящий Текст.
+ возможность отделения Собственных Имён.
+ привлечение ВНИМАНИЯ игрока.
+ Наш перевод будет единственный с двумя регистрами!
Минусы:
– Коту под хвост возможность махинаций со шрифтом.
– Сложная запись текстов в файл.
– Практически не читабельная конечная кодировка.

Думайте! Стоит ли оно того?


but nobody came
 
STALKER_007Сообщение # 137 Вторник, 01.05.2012, 18:05
Аватар STALKER_007
Легендарный Дракон
Почетный Житель
«8894»
Где: Не в городе Драконов
Quote (aleksusklim)
Думайте! Стоит ли оно того

Я конечно в этом не особо разбираюсь, но плюсов вроде бы больше - значит стоит
 
aleksusklimСообщение # 138 Вторник, 01.05.2012, 18:10
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
В мой метод взлома указателя никто не врубился…
Но я сам-то еле догнал, какая там последовательность действий:
Файл WinHex’ом расковыряй, ArtMoney’ей прошвырнись по ОЗУ, Калькулятором вычисли новое значение и опять суй его обратно, уповая на то, что ничего не напутал…

Вам не кажется, что СЛИШКОМ много сторонних программ требуется?
Мне удалось итерационным методом квантовать алгоритм на составляющие шаги и на основе индукционного способа изобрести единое пространство работы.

(Кто что понял?)

Короче, сделал чтоб удобно было.

Но сначала определим терминологию:
Абсолютный адрес: это адрес, по которому происходит обращение к переменной по законам PlayStation. Адресное пространство ОЗУ игры занимает 2097152 байт (ровно 2 мегабайта). Начинается с адреса 80000000h (2147483648) и заканчивается 801FFFFFh (2149580799). Именно в него ДОЛЖНЫ указывать ВСЕ указатели!
Истинный адрес: это физический адрес ОЗУ компьютера, где эмулятор размещает данные памяти игры. Он, естественно, тоже занимает объём 2 Мб, но первый адрес отличается он абсолютного. Наверное, зависит от эмулятора. В Epsxe 1.7.2 это от 0094C020h (9748512) до 00B4C01Fh (11845663). По этим адресам можно найти указатели и строки в ArtMoney. Это адрес истинный для нас, но ложный для игры, и направлять что-либо на него бесполезно.
Прямой адрес: это адрес данных дампа памяти. Дамп я предлагаю снимать через свой же MemGet. Пространство также 2 Мб, но начинается с адреса 00000000h (0) и кончается 001FFFFFh (2097151). Так проще всего понять, где на самом деле расположены данные.
Относительный адрес: это адрес данных внутри субфайла или суб-субфайла. Или же относительно всего WAD. Или относительно сектора диска – смотря что имеется в виду. Далее по тексту под относительным адресом я буду понимать только адрес данных от начала четвёртого суб-субфайла главного субфайла любого уровня.

Преобразование между адресами. X – новый адрес, Y – известный адрес:

АА-->ПА : X=Y-2147483648
ПА-->АА : X=Y+2147483648
ПА-->ИА : X=Y+9748512
ИА-->ПА : X=Y-9748512
АА-->ИА : X=Y-2137735136
ИА-->АА : X=Y+2137735136
Для относительного адреса нужно знать константу, которую игра суммирует с ним. Её можно найти, вычитая из АА строки ОА этой же строки. Но нам такое совершенно не понадобиться.

Я нашёл проблему, которую как-то упустил раньше.
В файлах находится указатель не на абсолютный адрес, а на относительный!
То есть по этому указателю можно перейти к строке прям в этом же суб-субфайле. А не сразу в RAM. Но в EXE адреса сразу ОЗУвские. Но не в уровнях.
Так когда же они превращаются в абсолютные? Ответ: при загрузке уровня.
Что даёт? Легче позиционировать указатели, потому что можно лазить в самом же суб-субфайле, где мы меняем текст. То есть, не выходя в ОЗУ, не снимая дамп.
Что забирает? А как теперь направить этот относительный указатель на строку, которую мы засунем во второй субфайл? У него-то другое восстановление в абсолют произойдёт?
Но решение есть. Можно вычистить разницу-дельту между исходной строкой в ОЗУ и её нашей версией тоже в ОЗУ, но уже не в четвертом, а во втором суб-субфайле. Это дельту вычесть из реального относительного адреса суб-субфайла.
Появляется проблема… Относительный адрес строки не превосходит 50 000 байт. А дельта получается по 500 000! И как я отниму от 50 Кб пятьсот?
Вопрос на засыпку: сколько будет «один минус два»?
(С учётом того, что это четырёхбайтные беззнаковые целые, где числа не могут быть отрицательными)
Ну? Ваш ответ?
Мой: 4294967295. Или FFFFFFFFh.
Как это сделать? Калькулятор>Вид>Инженерный>Hex>4 байта> «1-2=» >Dec. Убедились?
Теперь я по этим правилам вписал указатель в WAD. Да, громадное же число.

И запустил игру…
Теперь она либо вылетит, либо примет…
Интересно, есть ли там range checking…

Результат: РАБОТАЕТ!!!!
Да! Игра сама приплюсовала к огромному числу свою разницу адресов, получив в конечном итоге адрес поменьше. Значит, мы СМОЖЕМ затолкать столько текста, сколько захотим.

Я не преувеличиваю! Я посчитал свободное «яичное» пространство в Sunrise Spring Home. Это 30 с лишнем килобайт!! Это примерно полтора моих средненьких комментария!
Вы представляете! СКОЛЬКО текста мы можем впихнуть! Ох, Зойка удивиться… (на её пиратском предупреждении мы отыграемся, ой как отыграемся!)

Я облегчил нам работу.
Качайте программу:
http://Klimaleksus.narod2.ru/Files/StrPnt.rar (160 Кб)
И смотрите её скриншот:
http://Klimaleksus.narod2.ru/Files/W/whirlwind61.png

Испугались?))
Не волнуйтесь, я всё объясню.

Итак, это 7в1. (MemGet тоже понадобится.) Программки: STR,PNT,NUL,COP,SET,SUB,HEX.
STR – ищет строку.
PNT – ищет указатель.
NUL – ищет пустое пространство.
COP – копирует данные (строки) + добавляет свои.
SET – изменяет указатели.
SUB – производит сложение и вычитание по правилам «1-2=4294967295»
HEX – конвертирует между десятичной и шестнадцатеричной системами.

Все файлы выбираются соответствующими кнопками «...», подтверждать не надо.
Поиски STR,PNT,NUL – выполняются кнопкой Search, а результат выводится в Offset found.
Строку надо писать в текстовое поле, а указатель – в Value (всё записывается только в десятичной системе счисления)
Count – количество найденных элементов. Если «1» – это хорошо. Если «0» – значит вы ничего не нашли. Если больше 1 – слишком много повторов. Уточните строку или просмотримте файл через WinHex, чтобы понять, почему так происходит.
Use# – порядковый номер выводимой строки или указателя, если их несколько (например, «Hunter» встречается пару-тройку раз, и чтобы обработать их все, нажимайте Search при разных Use# (от 1 до Count) и копируйте Offset found).
Start address – начальный адрес в файле для поиска. «0» – поиск во всём файле. Можно использовать, чтобы уточнить место и сократить время, или отсеять ранние вхождения.

STR-Difference – это специальное поле, которое автоматически суммируется с результатом. То есть, чтобы найти настоящую строку, нужно поставить туда ноль. Но если мы ищем фразу, которая начинается не с самих букв, а за четыре байта ранее, то логично ввести туда «-4», и прога выдаст адрес искомой строки, из которого уже буде вычтено 4.
PNT-Difference – это тоже «сумматор», но входных данных. То есть указатель ищется на Value+Difference. Зачем? Да потому что в Difference удобно помещать константы конвертации адресных пространств, например, начало абсолютного адреса 2147483648.

Как работает NUL: Ищет «00h» по всему файлу, выдавая первый за вычетом Padding, но чтобы их последовательность была не меньше Minimum в сумме с Padding. Проще говоря, находит первую область в Minimum нулей, перед которой есть ещё ровно Padding нулей. Мы задаём Padding=4 и Minimum больше 50 (64, 500 или сколько будет нужно – длина новой строки), кастуем на второй суб-субфайл, и нам выдаётся та самая яичная зона!

COP – Копирует из файла From с адреса Address в файл To по адресу Desten данные. Длина копируемой области – Length. Плюс добавляет сюда строку Text и Add blank пробелов после неё. Короче, Length приравнивается STR-Difference (с противоположным знаком), которая была нужна для отлова строки. Или 0 или 4.
Добавляемый текст – новая строка. Можно поставить Length=8, тогда скопируется оригинальное начало; в Text ввести что-то типа «OurString01», а в Add blank – ту длину новой стрики, которая планируется (например с запасом). Потом уже всё это изменить можно через знакомый Текст-О-Вытаскиватель.
Кстати, не копируйте много через Length, лучше ставьте Add blank, потому что потом можно запутаться, где оригинал, а где изменение при следующих поисках строк.

SET – ну тут всё просто. Вставляете адрес в Address, жмёте GET и получаете значение указателя. Изменяете его на нужное, жмёте PUT – вуаля, он записан!

SUB – «Кулькулятор»… Вводите операнды в два поля и нажимаете «+» или «-» между ними – в третье поле выведется ответ, не затирая оригиналы.

HEX – конвертор по мере ввода. Я сделал поддержку до FFFFFFFFFFFFFFFFh, но он на больших числах конечно неизбежно гонит. А до четырёх байт FFFFFFFFh вычисляет великолепно!

Всё! Моих программ StrPnt и GetMem достаточно для изменения любой строки в игре. Но всегда лучше контролировать поведение в WinHex. Общий алгоритм изменения строк (обращение к результатам предыдущего пункта обозначено фигурными скобками):

1) STR. Ищем исходную строку в 4-ом суб-субфайле.
2) NUL. Ищем пустоту в 2-ом суб-субфайле.
3) PNT. Ищем в 4-ом суб-субфайле указатель на адрес, полученный в {п.1}.
4) COP. Из адреса {п.1} копируем в адрес {п.2} из 4-го в 2-ой субфайл, добавив свою новую строку.
5) SET. Делаем GET в 4-ом суб-субфайле на адрес {п.3}, должны получить {п.1}
~Внедряем 2-ой суб-субфайл, компилируем и прожигаем игру. Запускаем, заходим в нужный уровень и снимаем полный дамп памяти через MemGet.~
6) STR. Ищем оригинальную строку в дампе.
7) STR. Ищем нашу изменённую строку в том же дампе.
8) SUB. Вычитаем из изменённого {п.6} оригинальный {п.7}.
9) SET. Делаем PUT на адрес {п.3} 4-го суб-субфайла и заносим {п.8}.
~Внедряем 4-ый суб-субфайл, компилируем, прожигаем, запускаем и заходим в нужный уровень – должен быть верный результат~

Ремарочки:
– Если меняем ФРАЗУ, то Difference в пунктах 1,6,7 надо ставить «-4». Если ИМЯ, то «0».
– Если пункт 3 ничего не дал, то попробуйте изменять Difference на +- от 1 до 4 туда-сюда. Если и это не помогло (абсолютный адрес!), то пропустите этот пункт (и пятый), а вместо пунктов 8 и 9 сделайте так:
10) PNT. Ищем указатель в дампе на {п.6}.
11) SET. Делаем GET в дампе на адрес {п.10}, должны получить {п.6}
12) SET. Теперь делаем PUT в дампе на тот же адрес, но занесите {п.7}
– Если хотите увидеть указатель или строку в ArtMoney, то отнимите от адреса число «147483648», прибавьте первый истинный адрес «9748512» (можно в SUB) и переведите (можно в HEX) в шестнадцатеричную систему. После чего в ArtMoney задайте «перемещение на адрес» в «редакторе памяти».

P.S:
После создания вихря (тема перевода) я обнаружил, что начальное пространство в яичной зоне заполняется неизвестными данными при некоторых обстоятельствах, затирая введённые данные. Если такой момент отловить, можно узнать, сколько конкретно нулей исчезает, а сколько остаётся. Прописать исчезнувшие нули в «NUL-Padding», а оставшиеся – в «NUL-Difference». Но всё это нужно ещё не раз проверить…


but nobody came

Сообщение отредактировал aleksusklim - Вторник, 01.05.2012, 18:32
 
†Vampire†Сообщение # 139 Четверг, 03.05.2012, 18:38
Аватар †Vampire†
Маленький Дракон
Житель Города
«365»
Где: Не в городе Драконов
Не знаю, говорилось ли об этом раньше или нет, но возможно ли поменять иконки с жизнями во время игры за другого персонажа? Чтобы вместо головы Спайро было изображение другого персонажа. Спаркса, Шейлы и т.д.

Простите, если уже этот вопрос здесь поднимался.


Сообщение отредактировал †Vampire† - Четверг, 03.05.2012, 19:09
 
DrWhoСообщение # 140 Четверг, 03.05.2012, 18:56
Аватар DrWho
Мудрый Дракон
Почетный Житель
«1371»
Где: Не в городе Драконов
Quote (†Vampire†)
Не знаю, говорилось ли об этом раньше или нет, но возможно ли поменять иконки с жизнями во время игры за другого персонажа? Чтобы вместо головы Спайро было изображение другого персонажа. Спаркаса, Шейлы и т.д.

Возможно, насколько я знаю. Например, aleksusklim смог взломать игру и даже вихрь (!) сделал.
Quote (†Vampire†)
Простите, если уже этот вопрос здесь поднимался.

Этот вопрос действительно ещё никто не задавал (по крайней мере я нигде не видел этого вопроса ранее).


 
†Vampire†Сообщение # 141 Четверг, 03.05.2012, 19:13
Аватар †Vampire†
Маленький Дракон
Житель Города
«365»
Где: Не в городе Драконов
И еще один вопрос меня тревожит: куда уходят жители Полуночной Горы в конце уровня? Может быть сделать так, чтобы они оставались в уровне, а после того, как из него выйдешь, а потом зайдешь обратно — исчезали. Просто куда бы они все могли пойти? На закрытую вечеринку в "Fireworks Factory"? Может быть стоит задуматься и над этим?
 
DrWhoСообщение # 142 Четверг, 03.05.2012, 19:18
Аватар DrWho
Мудрый Дракон
Почетный Житель
«1371»
Где: Не в городе Драконов
Quote (†Vampire†)
И еще один вопрос меня тревожит: куда уходят жители Полуночной Горы в конце уровня?

Изначально разработчиками планировалось, скорее всего, что полёт будет прямо в дом колдуньи, либо же в супер бонусный уровень как отдельный мир, а не портал, построив ещё одно летательное устройство.
Quote (†Vampire†)
Может быть сделать так, чтобы они оставались в уровне, а после того, как из него выйдешь, а потом зайдешь обратно — исчезали.

Можно и так сделать, в принципе.
Quote (†Vampire†)
Просто куда бы они все могли пойти? На закрытую вечеринку в "Fireworks Factory"? Может быть стоит задуматься и над этим?

Возможно :)


 
†Vampire†Сообщение # 143 Четверг, 03.05.2012, 19:21
Аватар †Vampire†
Маленький Дракон
Житель Города
«365»
Где: Не в городе Драконов
Quote (DrWho)
Изначально разработчиками планировалось, скорее всего, что полёт будет прямо в дом колдуньи, либо же в супер бонусный уровень как отдельный мир, а не портал, построив ещё одно летательное устройство.


Точно! Я догадывался об этом раньше, но точно не знал.
 
CubeStudioСообщение # 144 Понедельник, 07.05.2012, 17:16
Аватар CubeStudio
Маленький Дракон
Житель Города
«318»
Где: Не в городе Драконов
Я редко захожу на ваш сайт и в эту тему особенно. Но я всё ещё готов помочь с озвучкой ибо звуковуха хорошая, да и голос неплохой. Как до неё дело дойдёт-звякните, плз.

По-настоящему оценить может лишь тот, кто досмотрел презентацию до конца.
 
steeldragonСообщение # 145 Суббота, 19.05.2012, 16:45
Аватар steeldragon
Старейшина Драконов
Редактор
«422»
Где: Не в городе Драконов
Помогите, пожалуйста, с запаковкой файлов образа Greatest Hits обратно. Метод из этой темы я пробовал - вылетает эмулятор. Пробовал также создать образ в UltraISO, в режиме PS2 CD, тот же результат.

*Решено

Добавлено (19.05.2012, 16:45)
---------------------------------------------
Итак, оставшийся текст уровня Шейлы мной не найден. Более того, во всём WAD.WAD не найти этих недостающих кусков текста... Есть предположение, что текст зашифрован. Если это так, то перевести этот уровень будет трудно. Кто-нибудь может найти текст этого уровня?


Сообщение отредактировал steeldragon - Суббота, 19.05.2012, 16:54
 
aleksusklimСообщение # 146 Воскресенье, 20.05.2012, 17:54
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
steeldragon.

В чём была проблема и что теперь работает? Вы бы описали пункты действий, может быть, что-то интересное там. Музыка была?




Люди!! Нарисуйте, наконец, шрифт!
Или хотя бы проверьте ширину каждой буквы (особенно диакритики «<31»)
Это сделать просто:

– Нарисуйте шрифт, пометив самую широкую букву вертикальными полосками и полностью закрасив все остальные.
– Напишите текст, в котором эта буква стояла бы между всеми прочими (например, AWBWCWDWEWF…), только время от времени вставляйте пробелы.
– Скомпилируйте и запустите, отскриншотьте.
– А потом посчитайте реально отрисовавшееся количество полосок у каждой буквы.




Quote (steeldragon)
Итак, оставшийся текст уровня Шейлы мной не найден. Более того, во всём WAD.WAD не найти этих недостающих кусков текста... Есть предположение, что текст зашифрован. Если это так, то перевести этот уровень будет трудно. Кто-нибудь может найти текст этого уровня?


Минуточку… Какой «текст»?

{
Pete the Mountain Goat
Bobby the Mountain Goat
}

? Это есть в SCUS. Может просто пропущены имена? Можно взломать указатель и посмотреть.

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


but nobody came
 
steeldragonСообщение # 147 Воскресенье, 20.05.2012, 19:26
Аватар steeldragon
Старейшина Драконов
Редактор
«422»
Где: Не в городе Драконов
Quote (aleksusklim)
В чём была проблема и что теперь работает? Вы бы описали пункты действий, может быть, что-то интересное там. Музыка была?

Да нет, всего лишь проблема с неправильными LBA.
 
gitgegСообщение # 148 Среда, 23.05.2012, 18:19
Аватар gitgeg
Взрослый Дракон
Житель Города
«408»
Где: Не в городе Драконов
Кстати о музыке... может, добавить в игру (если возможно) музыку MrModez? Если он согласится, чему шанс равен 99%
И возможно ли сделать патч с вихрем на НЕ GH? А то английская версия у вас...


 
aleksusklimСообщение # 149 Воскресенье, 27.05.2012, 03:42
Аватар aleksusklim
фдулыгылдшь
Редактор
«1066»
Где: Не в городе Драконов
Quote (DrWho)
Если не ошибаюсь, там не трогали текст (меню не считается) только из-за того, что шрифты очень сложны для перевода. Хотя я думаю, что можно это исправить, если aleksusklim взломает и её. Хотя это уже в обсуждение второй части надо.


aleksusklim всё взломает, но не рассчитывайте всецело на меня одного))

Quote (gitgeg)
И возможно ли сделать патч с вихрем на НЕ GH? А то английская версия у вас...


Можно всё. Но я сделал для GH хотя бы потому, что её CRC и размер всегда одинаков, что гарантирует правильную обработку. Если делать для простой версии, то образ может отличаться от файла к файлу. Однако можно сделать внутренний патч только для субфайла, тогда пользователям придётся ещё и перепрожигать образ самостоятельно.

Quote (gitgeg)
Кстати о музыке... может, добавить в игру (если возможно) музыку MrModez?


А вы.. о чём?


but nobody came
 
steeldragonСообщение # 150 Воскресенье, 27.05.2012, 13:50
Аватар steeldragon
Старейшина Драконов
Редактор
«422»
Где: Не в городе Драконов
Quote
…До меня ваши умозаключения не дошли…
Просто измените все возможные тексты (e.g. «Text no. ONE, probably for PETE») на свои различные наборы, эмулируйте и посмотрите, что какой козёл скажет.

Разъясню. Каждый из этих трех текстов содержит в себе все фразы всех козлов. Но они же не все используются конкретным персонажем, верно? Неиспользуемый текст можно спокойно заменить не влезающим текстом персонажа, к которому он относится, и там где нужно, вставить ссылку на него. Я выяснил, что второй текст относится к Billy, третий - к Pete (а не первый), ну а первый к Bobby.
Пример неиспользуемого текста: "You can get really steep cliffs..." у Billy. Если его заменить, к примеру, простыми пробелами, то текст персонажей не затронется никак, поскольку это говорит Pete.
 
Поиск:

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

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