Разработка и ромхакинг > Ромхакинг и программирование
[ALL] Вопросы новичков
Svyat:
SMD
Есть ли какие-нибудь общие признаки, по которым можно определить, имеется ли в игре звуковой драйвер SEGA Sound Source(pre-SMPS по классификации ValleyBell)? Недавняя Mad Stalker: Full Metal Forth изначально была портирована аутсорсинговой компанией Opera House, в продуктах которой, насколько я понимаю, использовался именно такой тип драйвера. Я собираюсь портировать музыку оттуда в формат SMPS Z80 DAC (S3K/S3DB mod.), поэтому меня этот момент очень интересует, так как формат записи нот в обоих драйверах почти одинаков, а значит, это упрощает портирование. На руках крайняя сборка SMPS Research Pack с pre-SMPS Rent-a-Hero (та же версия движка использована в прототипах Street Fighter 2' CE всё от той же Opera House). С какой конкретной рутины лучше начинать поиск? Заранее спасибо.
DrMefistO:
Ну, я бы начал со вытаскивания драйвера и побайтового сравнения. Список игр с тем же драйвером можно найти здесь: http://gdri.smspower.org/wiki/index.php/Mega_Drive/Genesis_Sound_Engine_List
perfect_genius:
Есть ли программы автоматического поиска структур в файле? Внутри рома UMK3 легко просматриваются всякие массивы:
000AA732 C186E186
000AAB56 C190E190
000AAF78 C19AE19A
000AB390 C1A4E1A4
000AB82E C1AEE1AE
000ABCC0 C1B8E1B8
000ABFA0 C1C2E1C2
000AC4AC C486E486
000ACDB4 C49AE49A
000AD6D4 C4AEE4AE
000ADBB0 C4B8E4B8
000ADFD4 C4C2E4C2
000AE474 C790E790
000AE93C C79AE79A
000AD182 C7A4E7A4
000AF1FA C7B8E7B8
000AF654 CA90EA90
000AFB1E CA9AEA9A
000B0080 CAA4EAA4
000B0922 CAB8EAB8
000B0538 CAAEEAAE
000AC94E C490E490
000AED54 C7AEE7AE
000B19B8 C4A4E4A4
0000 D506
0000 D546
0000 D586
0026 002C
004E 002C
0076 002C
009E 002C
00C6 002C
00EE 002C
0116 002C
0026 005C
004E 005C
0076 005C
009E 005C
00C6 005C
00EE 005C
0116 005C
004E 008C
0076 008C
009E 008C
00C6 008C
00EE 008C
004E 00BC
0076 00BC
009E 00BC
00C6 00BC
00EE 00BC
0018
0013
0005
0002
0003
0010
0017
0001
0000
0011
001A
0004
0015
0009
0007
000F
0014
0012
0008
000A
0006
000E
000D
000C
0000E018
0000E030
0000E048
0000E060
0000E078
0000E090
0000E0A8
0000E0C0Это особенность ромов старых игр или структуры часто так легко находятся в несжатых файлах?
Знаю про Kaitai Struct, но у него ведь нет автопоиска?
Guyver(X.B.M.):
С большой натяжкой можно использовать это: http://chief-net.ru/index.php?option=com_content&task=view&id=466&Itemid=55
perfect_genius:
Действительно близко. Забавно, какие жёсткие требования к вводу информации, будто поленился или не хотел делать защиты от ошибки.
Не возникало мысли сделать поиск одинаковых отрезков байтов по всему файлу?
Guyver(X.B.M.):
Я эту поделку делал для перевода одной из игр (легко составить список поинтеров с её помощью из-за особенностей их хранения в роме). А разделение файла на куски попросили добавить. При этом я не программист (поэтому всё работает жутко медленно, нелогично и т.д.). И поэтому защит от ошибок почти не делал, так как знал что и для чего мне нужно. Таким образом я наклонировал примерно 5-6 подобных программ в своё время, каждая со своими функциями, нужными только для одной-двух игр... :neznayu:
firefly23412:
Вот у меня какая загвоздка. Пойнтеры, игра Suikoden 2 и программа Kruptar (6ая версия). Я делал всё по этому гайду - https://magicteam.net/index.php?page=documents&show=Kruptar%20для%20чайников Круптар для чайников от мэджик тим.
Текст у меня программа отображает. Значит разницу смещения я правильно высчитал, так? Или нет?
Но при пересчёте пойнтеров программа выдаёт ошибку (я ничего не менял в тексте). Стало быть я неправильно указал начало-конец блока пойнтеров? (скорее всего) Но в том самом гайде не уточняется ничего про блоки пойнтеров или их местонахождение - и как мне быть? Каким образом их искать? Где они могут быть в файле этой игры?
Можно ли как-нибудь найти пойнтер по offset'у предложения(ий), может быть? Я не знаю...
perfect_genius:
Не пользовался программой, поэтому зачем пересчитывать пойнтеры/указатели? Не вмещается текст, который не менялся, скорее всего из-за неправильно указанного размера указателей, первого байта/двух байтов (где указана длина строки) или спецсимволов, что видны в тексте на скриншотах. Попробуй для эксперимента поставить у всего что можешь длину в 1 байт. Ну, кроме указателей на начало строк, наверно.
Потом методом половинного деления найдёшь в каком из них была ошибка :)
Guyver(X.B.M.):
По скринам вообще не видно, что подключено место, куда будет вставляться перевод.
Лучше юзать версию круптара 7.1.1.8
firefly23412:
perfect_genius, Guyver(X.B.M.), Ура! Я вычислил указатели. По формуле оффсет предложения полученный через дебаггер - оффсет того же предложения из рома. Универсальная цифра 10DC50. Прибавляется к оффсету предложения из рома и последние два байта перевернуть. Хекс-адрес указателей таким образом получается.
Как оказалось в Suikoden 2 четырёх-байтные указатели(длина) и идут они сразу после текста. Я читал итальянский мануал ромхакера Паблито, он пишет, что в первой игре тоже четырёх байтные указатели. (как и в фэнтези стар 4 на мегадрайв, упомянута им также)
Но вопрос. Подскажите пожалуйста. Если указатели идут СРАЗУ после текста и их длина 4 байта, какие параметры надо ставить в Круптаре? Конкретно. Разница смещений - автостарт? Так получается или нет?
perfect_genius:
Тут что-то странное. Какая логика в указателе в конце этого самого текста, на начало которого он и указывает? Обычно, есть массив из указателей на текстовые строки. Они могут указывать либо на первый символ текста, либо длину этого текста, после чего и идёт текст. Также сам текст часто кончается на какой-нибудь стоп-символ - обычно 0 или -1.
Ты либо вычислил адрес конца текстовой строки, либо указатель на длину последующей текстовой строки.
--- Цитата ---Универсальная цифра 10DC50
--- Конец цитаты ---
По этому адресу есть что-то? Это может быть адресом начала блока текстовых строк или массива указателей на эти строки.
firefly23412:
perfect_genius,
То число это разница из формулы вычисления из документа "Pointers in Playstation Games".
--- Цитата ---Next, we will find the text as it appears in the running game. Open the disc image using pSX. Navigate ingame to a place where text appears. Go Debug -> Monitor. View the memory. Go to File -> Save binary. Start address is 0 and size, in bytes, depends on the game. A value of 1000000 bytes is sufficent for Gundam GCentury. Open this created file in MadEdit. Search for the same text as in the PS-EXE. ?????? now appears at 000C1BC4. The difference in memory must be found to calculate pointers in the future: C1BC4-B23C4=F800. Pointers may now be found and created using this information.
--- Конец цитаты ---
Тут всё правильно. Всё верно массив из указателей после текста. Надо было мне уточнить.
Указатели указывают на первый символ предложений в тексте, на кавычки, все предложения начинаются с них.
... вообщем я прикрепил скриншот. И байты 10 80 это похоже байты "пустышки". Они просто стоят между указателями и ни к чему не привязаны. То есть длина указателя в игре получается не 4 байта, а два.
У меня всё равно Круптар с ошибкой загружает текст и я не могу понять, что я в настройках выставил или наоборот не выставил. Разницу смещений по формуле высчитал, интервал в 2 выставлял. Короче, пробовал разные настройки и во-первых, у меня текст очень долго грузится из рома и сам текст не разбит на отдельные предложения как должно быть.
В чём может быть ошибка?
firefly23412:
Странно, а в седьмом Круптаре всё нормально выводит. Почему так?
Почему в шестом у меня не получалось вывести по-нормальному. Может быть это связано с кодами разрыва строк/окончания строк??? Кто-нибудь знает где в шестой версии Круптар опции с ними. Просто сама то шестая версия программы не просит вводить их.
MWE:
Чит коды для PS1 приводятся в таком виде:
800BF4A0 1333
8009EE4C 0C00
Как на основании чит кодов получить hex код, для редактирования исполняемого файла?
perfect_genius:
Запускаешь игру в дебаггере и ставишь breakpoint по этим своим адресам (800BF4A0 и 8009EE4C), чтобы поймать момент, когда к ним обращается код. Изучаешь этот код и подправляешь на нужное тебе поведение уже в роме/образе игры.
Делал так с игрой для SNES не зная его ассемблера, понадобилось узнать только несколько команд типа присвоения, условных переходов и NOP, чтобы им затереть команду уменьшения здоровья. Дебаггер показывал адрес команды не относительно начала рома (наверно, из-за маппера), поэтому этот участок в роме искал в хекс-редакторе по байтам команд.
MWE:
--- Цитата: perfect_genius от 28 Июль 2021, 22:43:33 ---Запускаешь игру в дебаггере и ставишь breakpoint по этим адресам (800BF4A0 и 8009EE4C), чтобы поймать момент, когда к ним обращаются. Изучаешь код в этом месте и подправляешь на нужное тебе поведение уже в роме/образе игры.
--- Конец цитаты ---
Запускать игру в эмуляторе? Какой дебаггер порекомендуешь?
https://forums.pcsx2.net/Thread-PSOne-Widescreen-Patches
Здесь чит коды даются в виде адреса в памяти, но как патчить образ? Неужели только через дебаггер перехватывать обращение к памяти?
perfect_genius:
У меня ещё не было опыта с PS, просто ищи эмуляторы с дебаггером с возможностью ставить брейки -> PS1 emulator with breakpoints.
У тебя по ссылке написано
--- Цитата ---PS1 games in general are harder to patch compared to PS2 games, or better said, there is a less universal way of patching games.
--- Конец цитаты ---
так что скорее всего, без дебаггера не обойтись.
Но ничего страшного, сделаешь всё как я написал и выложишь скриншот с кодом в нём тут - разберём где что.
Эти адреса могут указывать и на код, загруженный в память, тогда надо будет лишь найти эти последовательности байтов в образе игры не разбираясь с этим кодом.
Berstain:
--- Цитата: perfect_genius от 08 Август 2021, 11:26:47 ---почему не хотите закреплять тему для новичков первой стройкой?
--- Конец цитаты ---
Создайте в первом посте небольшой FAQ, тогда имеет смысл закрепить тему.
Миха42:
--- Цитата: Berstain от 08 Август 2021, 16:54:21 ---Создайте в первом посте небольшой FAQ, тогда имеет смысл закрепить тему.
--- Конец цитаты ---
Так кроме модераторов его никто и не сможет изменить первый пост, дата написания слишком старая.
Давно бы уже дали права изменения первого поста тем кто создаёт тему независимо от даты написания.
Rumata:
1. Закрепить первой строкой нельзя. Просто к существующим 14 закреплённым добавится ещё одна.
2. То, что закреплённые читают первыми - это иллюзия
3. https://www.emu-land.net/forum/index.php/topic,76109.0.html
Навигация
Перейти к полной версии