Вот что я выяснил по ресурсам игры. Написал скрипты на Python 3 для помощи, нужно установить Pillow (PIL) для изображений (pip install -U pillow от админа). Я пишу адрес как в отладчике с добавлением CPU перед ним, для получения позиции в файле SLUS_210.06 вычесть 0xFF000 и наоборот. 4b - означает 4 байта Little-Endian.
Думаю перевести игру не сложно, но требуется время. С PAL версией было бы проще, там больше места для шрифта, но это PAL.
#
ТекстЗаписывается в UTF-8, в шрифте указываются code point из Unicode. Например, в 1-м шрифте остались иероглифы, в SLUS_210.06 записано 9A 89 00 00 (Unicode 0x899A), отображается как 覚, в UTF-8 кодируется как байты E8 A6 9A. Можно расширить шрифт и кириллицу указать как в Unicode, текст будет проще редактировать, но один символ будет занимать 2 байта.
trans_elf_get.py - достаёт из SLUS_210.06 текст в all_text_eng.txt,
trans_elf_insert.py - вставляет в SLUS_210.06 текст из all_text_rus.txt и сохраняет как SLUS_210.06_rus.bin. Скрипты делались как для однобайтовой кодировки и в
trans_elf_insert.py нужно изменить charmap для кириллицы.
Для остального текста, если нужно увеличить размер, нужно разбирать структуру для перестройки и перестраивать fpk контейнеры. В RTDEN2US.BIN полно места для текста, т. к. выравнивание 0x800 байт, только смещения менять, но текст дублируется для Communication Log в IMAGE.BIN.
#
ШрифтАдрес задаётся в CPU 2674E8 для 1-го шрифта:
lui a1,0x003D ; CPU 3D71C0, ELF 2D81C0
...
addiu a1,a1,0x71C0
2-й CPU 267508:
lui a1,0x003E ; CPU 3DCF80, ELF 2DDF80
...
addiu a1,a1,-0x3080
3-й CPU 267530:
lui a1,0x003E ; CPU 3E2340, ELF 2E3340
...
addiu a1,a1,0x2340
Формат шрифта:
font (выравнивание 0x40) 4b, размер font от font 4b.
fimg 4b, размер fimg от fimg 4b, графика символов:
* _f (выравнивание 0x10) 2b, размер _f от _f 2b, ширина 1-го и 2-го символов для отображения 4b 4b, ширина общая (изображения) 4b, графика, где каждые 4 бита младшие 2 бита индекс из палитры пикселя от 1-го символа, старшие 2 бита от 2-го символа.
fref 4b, размер fref от fref 4b, таблица символов:
* Unicode code point 4b, 80 или 82 для обозначения 1-й или 2-й символ 1b, смещение делённое на 16 относительно fimg + 8 3b. 80/82 и смещение можно считать 4b, тогда >> 4 (разделить на 16), а 4 бита 0 и 2 считать как 1-й и 2-й символы.
_i 2b, размер _i от _i 2b, ? 1b, ? == 02 1b, 2b высота.
* В SLUS_210.06 такие значения: 5F 69 08 00 00 02 20 00, 5F 69 08 00 00 02 1B 00, 5F 69 08 00 00 02 1D 00.
font_conv.py - сохраняет шрифты из SLUS_210.06 в fontX.png (нумерация от нуля).
Файл SLUS_210.06 нельзя легко расширить для шрифтов, поэтому можно убрать 3-й шрифт (заметил его только в титрах и в начале) и сделать ссылку на 1-й, также можно ужать по ширине и есть лишние символы в конце 1-го шрифта, во 2-м (для меню) шрифте почти не используются строчные буквы.
#
Контейнер FPK (fpk\0 = 66 70 6B 00)
IMAGE.BIN в контейнере fpk, который используется в других играх от Cavia. Скрипт "Resident Evil Bin Fpk . Resident Evil Dead Aim (BIN) . fpk\0 . lst . fpk [resident_evil_bin_fpk.bms]" (
https://aluigi.altervista.org/quickbms.htm) распаковывает IMAGE.BIN вроде правильно, но нужно нажимать клавиши для исправления некоторых имён файлов. fpk содержит другие fpk и есть сжатые fpk, которые начинаются с \0V3a. Для игры Drakengard есть распаковщик fpk
https://github.com/Surihix/Drakengard1and2Extractor, но он не работает с fpk от Ghost in the Shell: Stand Alone Complex из-за некоторых отличий, также для сжатых V3a используется другой алгоритм сжатия, но он работает с ZIM изображения, есть шаблон структуры для Hex-редактора 010 Editor (нужно исправить) и можно доработать при желании.
Сжатые данные (V3a) можно разжать игрой и заменить в fpk, тогда можно изменить, как я поступил с текстом для Training.
Формат V3a: \0V3a (00 56 33 61) 4b, ? 4b, размер разжатых данных 4b, размер сжатых данных 4b.
#
Текст в Training и на уровне 8Текст для Training и на уровне 8 (
https://youtu.be/VmSMesREWwM?t=7684) находится в сжатых данных, я разжал и заменил в IMAGE.BIN. По-хорошему нужно пересобирать fpk, но я добавил в конец и изменил позиции и размеры. Это делает скрипт
image_bin_add_unc.py, он берёт IMAGE.BIN.fpk и файлы из папки uncomp_files, на выходе IMAGE.BIN. Текст в конце каждого *_unc.bin. Возможно где-то ещё есть сжатый текст.
#
Разжатие данныхКод разжатия CPU 193ECC, в отладчике breakpoint на выполнение, в регистре a0 адрес на информацию, перейти на него и там по 4 байта будет: (0) начало сжатых данных, (1) текущий адрес на разжатые данные, (2) начало разжатых данных, (3) чего-то прочитано, (4) ?. Step Out и данные разжаты. Смотреть на (0) перед разжатием (сжатые данные могут быть перезаписаны), по этим данным будет понятно, где в IMAGE.BIN сжатые данные. Может вызываться больше одного раза для одних данных: если (3) != 0, значит не в 1-й раз, если (1) - (2) == размер разжатых данных (после разжатия на Step Out), то готово. Сохранять разжатые данные из RAM нужно сразу после последнего Step Out, иначе будут изменены.
Для данных Training и других уровней адрес в регистре a0 всегда был CPU 5AD090 и разжимало в CPU BFE1C0 (или другой адрес).
Я использовал Cheat Engine для копирования разжатых данных, сначала поиск начала данных, потом Memory Viewer > File > Save memory region и удалить начало от Cheat Engine.
#
Изменения в переводе KudosСравнил файлы, взял какую-то версию с psxplanet.ru "Ghost in the Shell - Stand Alone Complex (UNK) (fix).7z". В IMAGE.BIN перевели rden.wrd и wrd.wrd (основной текст), какие-то слова с 103B1000. В RTDEN2US.BIN зачем-то изменили байты аудио, перевели текст диалогов, повторяется в IMAGE.BIN для Communication Log. Субтитры в MOV00US.BIN, MOV01US.BIN, MOV02US.BIN.
#
Переход на уровеньЧерез отладчик PCSX2 можно перейти на нужный уровень для тестирования. В Debug > Open Debugger в Breakpoint ПКМ > New: * Execute, Address 2543CC. Когда будет начата новая игра, отладчик остановится, двойной клик правой части для a0, a1, a2 меняем с 00000001 на нужный уровень и подуровни, потом Run. Например, для a0 a1 a2 = 02 01 01 - уровень 4, 03 01 01 - 7-й, 03 02 01 - 8-й, для Training 6 1 1, 6 1 2, 6 1 3, 6 1 4, 6 1 5, 6 1 7, 6 2 1, 6 2 2, 6 2 4, 6 2 3, 6 1 6, 6 2 5.
xtz, Зачем вам редактировать текстуры? Вы превосходного владеете английским или японским и знакомы со вселенной?
UPD2: Добавил разжатый уровень 8 и как переходить на нужный уровень.