1. Введение.
2. Пример с игрой Operation Europe - Path to Victory 1939-1945 (U) [!].gen.
3. Пример с игрой Front Mission (J) (V1.0) [T+Eng1.0b_FH].smc.
4. Поиск непоследовательных значений.
5. Вместо заключения.
Введение.
Программа
Happy Finder предназначена для простого поиска данных в файле и нахождения адреса найденных данных с возможностью cдвига реального адреса на заданный интервал. Найденные адреса, к примеру, можно подключить в
Kruptar в качестве поинтеров. В этом документе на примерах будет рассмотрена работа самой программы, и даны некоторые пояснения для работы с программой
Kruptar.
Пример с игрой Operation Europe - Path to Victory 1939-1945 (U) [!].gen
Игра: Operation Europe - Path to Victory 1939-1945 (U) [!].gen
Задача: найти и подключить пойнтеры в программе Kruptar.
В этой игре используются абсолютные четырёхбайтные пойнтеры. Для примера рассмотрим текст из игры:
адрес фразы: 00047830: Soviet advance on
адрес фразы: 00047842: drive east and stop the
адрес фразы: 0004785A: Hitler then planned to
адрес фразы: 00047872: Antwerp in Belgium.
Так вот, пойнтеры в самом роме имеют вид, абсолютно идентичный адресу фразы, т.е.
Пойнтер на 1 фразу будет: 00047830
Пойнтер на 2 фразу будет: 00047842
Пойнтер на 3 фразу будет: 0004785A
Пойнтер на 4 фразу будет: 00047872
Сами адреса на фразы очень легко получить в виде списка в программе Kruptar, используя нулевые пойнтеры. Просто ставим размер пойнтеров PtPointerSize: «0», сдвиг PtReference: «0» и вынимаем адреса текста командой «Add Pointers», где указываем адрес первой и последней фраз вместо адресов пойнтеров. Таким образом можно получить адреса всего текста в совершенно любой игре. А потом сохранить их в текстовой файл командой «Save To File».
Мы получили адреса фраз. Теперь найдём сами пойнтеры с помощью программы Happy Finder. Открываем программу, задаём начальный адрес «00», задаём конечный адрес «FFFF0» (размер самого рома 1048576 байт, в шестнадцатиричном виде это 100000, поэтому нужно ввести значение чуть меньше размера самого рома), задаём значения для поиска и нажимаем кнопку «Начать поиск».
Поиск завершён, найдено 4 адреса, это и есть адреса самих пойнтеров! Сохраняем их в текстовой файл. Теперь пойнтеры можно легко подключить в программе Kruptar командой «Add From File».
Пример с игрой Front Mission (J) (V1.0) [T+Eng1.0b_FH].smc
Игра: Front Mission (J) (V1.0) [T+Eng1.0b_FH].smc
Задача: найти и подключить пойнтеры в программе Kruptar.
В этой игре используются абсолютные двухбайтные пойнтеры. С разным значением PtReference. Но у некоторых из них есть одна особенность. Перед каждым пойнтером стоит определённое значение. К примеру, A9. Для примера рассмотрим текст из игры:
адрес фразы: 00318826: Not enough money.
адрес фразы: 00318838: Is this OK?
адрес фразы: 00318844: Data loaded.
адрес фразы: 00318851: Data saved
Пойнтеры в самом роме имеют следующий вид (выделенные цифры):
… A9 26 88 A2 F1 …
… A9 38 88 A2 F1 …
… A9 44 88 A2 F1 …
… A9 51 88 A2 F1 …
Как можно заметить, пойнтеры легко определить по одинаковым символам, которые стоят перед/за ними. Эти символы – разная служебная информация. Сами пойнтеры разбросаны по всему рому. Поэтому проще их найти автоматически, а не вручную. Список адресов можно получить из Kruptar с помощью нулевых пойнтеров. Но сам список нужно модифицировать перед тем, как вставлять его в программу поиска. 0031 нужно заменить на A9, а последние цифры в адресе поменять местами. Теперь найдём сами пойнтеры с помощью программы Happy Finder. Открываем программу, задаём начальный адрес «00», задаём конечный адрес «347FF0» (размер самого рома 3440640 байт, в шестнадцатиричном виде это 348000, поэтому нужно ввести значение чуть меньше размера самого рома), задаём значения для поиска, задаём сдвиг и нажимаем кнопку «Начать поиск». Сам поиск можно провести несколькими способами. Результат будет довольно неоднозначным:
2 Способ:
3 Способ:
4 Способ:
Как видно из скриншотов, во втором способе нашёлся лишний адрес. Если у вас будет много значений для поиска, и если они к тому же будут короткими по длине, есть вероятность найти вместо нужных адресов мусор. Но его можно отсеять уже в процессе тестирования игры. А если вообще искать пойнтеры без учёта спецсимволов, как в четвёртом способе, то среди адресов будет просто куча ненужного мусора. Первый и третий способы – самые верные, но третий более долгий.
Всё, адреса пойнтеров найдены. Сохраняем их в текстовой файл. Теперь пойнтеры можно легко подключить в программе Kruptar командой «Add From File».
Поиск непоследовательных значений: (используйте «QQ» для такого поиска)
Игра:
Front Mission (J) (V1.0) [T+Eng1.0b_FH].smcЗадача: найти и подключить пойнтеры в программе
Kruptar, если известны только сами признаки, по которым можно идентифицировать пойнтеры. Т.е. когда у нас нет адресов фраз текста.
Как рассмотрено выше, пойнтеры для интересующего нас текста имеют вид:
… A9 26 88 A2 F1 …
… A9 38 88 A2 F1 …
… A9 44 88 A2 F1 …
… A9 51 88 A2 F1 …
Чтобы не вбивать в программу все эти адреса для поиска, можно вбить одно универсальное значение, по которому будет происходить поиск адресов.
A9 QQ QQ A2 F1 – где вместо QQ программа будет искать любые байты:
Среди всех найденных будут и наши 4 адреса, как и все остальные, которые удовлетворяют заданному нами условию: первый символ должен быть A9, а четвёртый и пятый – A2 F1. Все остальные символы (второй и третий) могут быть произвольными.
Вместо заключения
На этих простых примерах была рассмотрена работа программы. Ей можно искать не только адреса пойнтеров, но и просто адреса текста, если это позволяет алгоритм игры. Например, в игре на консоль
Sony PlayStation «
Eternal Eyes» можно найти адреса диалогов, так как перед каждой фразой из диалога стоят определённые символы. Всё зависит от каждого конкретного случая. Сама программа ещё несовершенна и очень медленно работает с длинными значениями для поиска. Чем длиннее значение – тем медленнее идёт поиск. Но при поиске необязательно задавать в диапазоне поиска весь ром. Иногда достаточно указать определённый небольшой диапазон, если вы знаете, где находятся пойнтеры. К примеру, если это блок пойнтеров. Надеюсь, в будущем у меня получится сделать программу немного быстрее.