Разработка и ромхакинг > Переводы игр

[PS2] Ghost in the Shell: Stand Alone Complex

(1/1)

xtz:
Приветствую всех

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

Сначала проблем особо и не было. Текстуры - срослось, формат вроде бы и кастомный, но битмап+палитра от tim2 стандартные, можно руками выдрать-вставить, да и конвертер для них есть к тому же (хоть и в одну сторону). Субтитры к видео - ещё проще, они в виде TXT. Запаковка - вроде бы получилось через нейронку пакер-анпакер накатать, объясняя ей по два часа структуру контейнера (с программированием на Вы, поэтому извращаюсь), даже что-то собирает, какие-то архивы прям байт в байт без отличий, а что-то нет, но игра пока работает, не ругается.

А вот теперь к проблемам. Пока нашёл только три:

Текст (игровой) - в виду того, что с текстом работать я практически не умею, не смог совладать. Мне уже пытались помочь, но не получилось. Из того, что сказали, и я смог понять - вменяемых поинтеров не видно, текст побит на блоки/группы (grup). Если есть возможность, то подгонять под длину строки оригинала не сильно хочется.
Текст (меню) - тут проблема в том, что он находится в исполняемом эльфе. Перебить текст - запросто. А вот вставить по длине нормально, т.е. условно EASY на ЛЕГКО/ЛЁГКАЯ - уже никак, символов больше. Кудос перебили на ЛЕГК, но это бред. Дизасм - тёмный лес для меня, к сожалению.
Шрифт - это вообще отдельный вид извращения. Я представлял, что он будет в виде текстуры, поэтому искал среди них - не нашёл. Позже, меня чёрт дёрнул поковырять исполняемый, и я его нашёл. Их несколько. Я не знаю как это нормально объяснить, но хранятся они в виде байт. Т.е. байтами нарисованы символы. Попробовал выдернуть, поковырять через GIMP. В raw image 8bpp grayscale - открыло, как и должно быть по идее. Но нарисовать у меня вменяемо не получилось. Там символы наложены друг на друга, нижний - темнее, верхний светлее. Пробовал рисовать руками, шрифты заготовленные использовать - получилось только с 0 и 1, и то достаточно паршиво. Алфавит вообще сломался, либо нижний символ не отображается, либо у букв пикселей не хватает.

Намудрено до жути, либо мне кажется

lupus:
По тексту в эльфе, по идее, поинтеры там обычные четырёхбайтовые, достаточно от офсета строки отнять размер заголовка и получить нужный адрес, который уже искать хекс редактором.
По крайней мере, на псп именно так было.

По шрифту - раз уж буквы можно рассмотреть хекс редактором, то скорее всего, шриыт 1bpp без всяких свиззлов и прочего. Попробуй в тайл молестере открыть и поиграть с настройками.

Sharpnull:

--- Цитата: xtz от 12 Апрель 2025, 18:37:41 ---Текст (меню) - тут проблема в том, что он находится в исполняемом эльфе. Перебить текст - запросто. А вот вставить по длине нормально, т.е. условно EASY на ЛЕГКО/ЛЁГКАЯ - уже никак, символов больше. Кудос перебили на ЛЕГК, но это бред.
--- Конец цитаты ---
Там выравнивание адреса на текст до 4 байт и место есть, нужно только изменить длину. Перестраивать всё равно придётся, но это не сложно. В (USA) версии в SLUS_210.06 с 2AA7F8 текст, выше с 2A91E0 по 16 байт информации о тексте, из них последние 8 байт - длина и смещение относительно 2AA7F8. Например, EASY с 2AA8A8, описание с 2A9310 (01 00 00 00 12 00 00 00 04 00 00 00 B0 00 00 00), длина 4, смещение B0 (поэтому 2AA7F8 + B0 == 2AA8A8). Если указать длину 8, можно использовать ещё 4 байта:
Программу перестройки несложно написать.
--- Цитата: xtz от 12 Апрель 2025, 18:37:41 ---Шрифт - это вообще отдельный вид извращения.
--- Конец цитаты ---
Там в каждом полубайте младшие 2 бита - пиксель одного символа, старшие 2 бита - пиксель следующего. Пишется простой скрипт для импорта/экспорта.

xtz:

--- Цитата: Sharpnull от 14 Апрель 2025, 00:23:34 ---Программу перестройки несложно написать.
--- Конец цитаты ---

--- Цитата: Sharpnull от 14 Апрель 2025, 00:23:34 ---Пишется простой скрипт для импорта/экспорта.
--- Конец цитаты ---

Просить написать наверное не буду, это уже наглость, но можно чутка об этом поподробнее? Как для чайников. Просто с программированием я не дружу от слова совсем

Ogr:

--- Цитата: xtz от 14 Апрель 2025, 00:39:50 ---но можно чутка об этом поподробнее? Как для чайников. Просто с программированием я не дружу от слова совсем
--- Конец цитаты ---

--- Цитата: xtz от 14 Апрель 2025, 00:39:50 ---это уже наглость
--- Конец цитаты ---
может быть, чтобы не наглеть, стоит потыркать нейросети насчет этого?  ;)

xtz:

--- Цитата: Ogr от 14 Апрель 2025, 01:02:29 ---может быть, чтобы не наглеть, стоит потыркать нейросети насчет этого?
--- Конец цитаты ---

Да, видать придётся

Добавлено позже:
Ну, тут с текстом вроде как ещё получилось, слава богу, лишь бы потом ничего не вылезло ещё. Остался шрифт и другой текст. Пока первое вообще не понимаю, если честно

ViToTiV:
xtz, так а в чём проблема со шрифтом, если ты его нашёл и можешь открыть? кинь файл со шрифтом

xtz:

--- Цитата: ViToTiV от 14 Апрель 2025, 09:21:38 ---так а в чём проблема со шрифтом, если ты его нашёл и можешь открыть? кинь файл со шрифтом
--- Конец цитаты ---

В отрисовке вся проблема. Вечером кину один из нескольких

Добавлено позже:
ViToTiV,

Sharpnull:
Вот что я выяснил по ресурсам игры. Написал скрипты на 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 и как переходить на нужный уровень.

xtz:
Sharpnull, спасибо огромное за подробное разъяснение, буду понемногу разбираться


--- Цитата: Sharpnull от 19 Апрель 2025, 19:03:27 ---xtz, Зачем вам редактировать текстуры? Вы превосходного владеете английским или японским и знакомы со вселенной?
--- Конец цитаты ---

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

Добавлено позже:
Sharpnull, font_add как-то совершенно странно себя ведёт. Все символы превращаются в кашу, а скрипт выводит, что запаковал всего один символ. Пробовал обратно конвертировать оригинальные шрифты в png без изменений, которые были получены через font_conv - то же самое

grooomy:
Проходил много раз на PS2. Я считаю - лучшая игра по вселенной. Русский пиратский перевод не только кривой, но еще и игра зависает в парочке мест из-за него.
Желаю успеха с переводом. Глядишь выйдет чего.

xtz:
grooomy, спасибо. Постараюсь до конца довести, бросать не охота, довольно далеко зашёл (не без помощи, конечно). Ну, по сравнению с предыдущими попытками. Там всё довольно быстро сходило на нет из-за сложностей и отсутствия опыта как такового

SegaMark:

--- Цитата: grooomy от 10 Май 2025, 22:28:11 ---игра зависает в парочке мест из-за него
--- Конец цитаты ---
А в каком именно месте зависает? и как именно, нужно подождать чтобы продолжить игру или нужно запускать английскую версию, доходить до следующего сейва и потом переключаться на русскую?

Добавлено позже:
Вообщем попробовал сам пройти чтобы узнать насколько плохой перевод в игре и есть ли какие то баги ломающие игру.
У меня игра вылетела на миссии с Татикома(8 миссия), после того как я встал на первый лифт. Если что использовал OPNPS2LD-v1.2.0-Beta-2173-1430917 и OPNPS2LD-v1.2.0-Beta-2182-0f736b9.
Что касается перевода, да он желает лучшего, перепутан пол, где-то нет пробелов, где-то перенос на новую строку не там где надо, почему то почти в каждой кат-сцене не переведено последнее предложение. Это только то что бросается в глаза, наверняка там еще много всяких ошибок.


Добавлено позже:
xtz, Есть какие нибудь успехи по переводу?

grooomy:

--- Цитата: SegaMark от 10 Июнь 2025, 05:54:08 ---А в каком именно месте зависает? и как именно, нужно подождать чтобы продолжить игру или нужно запускать английскую версию, доходить до следующего сейва и потом переключаться на русскую?
--- Конец цитаты ---
Где то во второй половине игры. То ли в миссии за Бату в тренировочном центре, то ли сразу после в миссии за тачикома.
Нужно запустить английскую версию и пройти до следующего сейва.

Навигация

[0] Главная страница сообщений

Перейти к полной версии