Разработка и ромхакинг > Ромхакинг и программирование
[PSX] Перевод "Clock Tower 2", сжатие LZSS
(1/1)
ViToTiV:
Приветствую всех! Уже не один раз мне здесь помогали с сжатием, очередной раз есть просьба.
Занялся переводом игр Clock Tower 1/2 на PSX.
Начал с "Clock Tower II - The Struggle Within (USA)", раскопал шрифт и текст:
Но меню в игре пожато, алгоритм вроде как LZSS, но не совсем корректно распаковывается, походу какая-то его модификация.
Знатоки, гляньте пожалуйста, хотелось бы сделать всё красиво, текстового перевода игр не существует.
TITLE.rar (48.98 КБ - загружено 25 раз.)
Lin:
Обратите внимание на слово "жёлтая". У вас у буквы "ё" двух точек не хватает.
Sharpnull:
Спасибо плагину для Ghidra, я легко нашёл код декомпрессии. Там действительно LZSS, находится в FUN_80048ea8. Не помню термины сжатия. Чтение из файла с 8-го байта (вроде), "контрольный байт" - 0 - сжатие, 1 - несжатый 1 байт. Из 2 байт смещение + длина: первые 12 бит - смещение, остальные 4 бита - длина (+2 байта). Сжатие блоками по 4096 байт или это классический буфер. Вот причёсанный код от Ghidra (мог ошибиться, не компилировал):
--- Код: ---int FUN_80048ea8(int source, int destination)
{
uint flag;
ushort *src;
int dst;
uint control;
uint dst_index;
uint curBitMask;
dst_index = 1;
curBitMask = 1;
if (destination == 0) {
destination = FUN_8004c2e8(*(undefined4 *)(source + 4));
if (destination == 0) {
return 0;
}
}
dst = destination - 1;
control = (uint)*(byte *)(source + 8);
src = (ushort *)(source + 9);
flag = control & 1;
while (true) {
if (flag == 0) {
ushort offset_len = *src;
src += 1;
uint offset = offset_len & 0xfff;
ushort length = offset_len >> 12;
if (offset == 0) {
return destination;
}
if (dst_index < offset) {
offset -= 0x1000;
}
for (size_t ind = 0; ind <= length + 1; ind++) {
byte data = *(dst + offset + ind);
*(byte *)(dst + dst_index) = data;
dst_index += 1;
}
}
else {
byte data = *(byte *)src;
src = (ushort *)((int)src + 1); // + 1 байт
*(byte *)(dst + dst_index) = data;
dst_index += 1;
}
curBitMask <<= 1;
if ((curBitMask & 0xff) == 0) {
control = (uint)*(byte *)src;
src = (ushort *)((int)src + 1); // + 1 байт
curBitMask = 1;
}
flag = control & curBitMask;
if (0x1000 < (int)dst_index) {
dst_index -= 0x1000;
dst += 0x1000;
}
}
}
--- Конец кода ---
Возможно дело не в сжатии, а в обработке файла, поэтому в идеале достают несжатый файл из памяти эмулятора. Если никто не поможет, то я позже попробую помочь с написанием сжатия/разжатия (если дело в нём). Как я понял вы уже написали какой-то код или использовали "стандартную" реализацию, но почему-то не поделились.
Cyneprepou4uk:
ViToTiV, не знаю финальный ли это перевод или просто черновик, но фраза "Don't look so worried" на первом скрине переведена слишком уж дословно. Вот несколько неплохих вариантов
lupus:
--- Цитата: Cyneprepou4uk от 26 Март 2022, 14:08:53 ---ViToTiV, не знаю финальный ли это перевод или просто черновик, но фраза "Don't look so worried" на первом скрине переведена слишком уж дословно. Вот несколько неплохих вариантов
--- Конец цитаты ---
С языка снял.)
Sharpnull:
Написал сжатие/разжатие. Сравнивал с несжатым файлов из эмулятора и замечу, что почти сразу игра изменяет данные с 0x13BAC (от начала этого файла). Использовал простой алгоритм, но сжимает TITLE.S3M немного лучше, а 0-й файл (0x350) из TITLE.IT хуже на 1 байт. В начале сжатых данных идёт магическое число - 45 58 53 01 (EXS\x01), потом 4 байта - размер несжатых данных. В архиве программа для x64. Для сжатия:
--- Код: ---CT2_LZSS.exe несжатый_файл выходной_файл
--- Конец кода ---
Для разжатия:
--- Код: ---CT2_LZSS.exe -d сжатый_файл выходной_файл
--- Конец кода ---
И можно добавить смещени в файле (-p):
--- Код: ---CT2_LZSS.exe -d TITLE.IT 350.bin -p 0x350
--- Конец кода ---
Можете писать в ЛС, если будет проблемы. Я тестировал только TITLE.S3M в игре после пересжатия.
ViToTiV:
--- Цитата: Cyneprepou4uk от 26 Март 2022, 14:08:53 ---"Don't look so worried" на первом скрине переведена слишком уж дословно.
--- Конец цитаты ---
так речь именно о том, что сейчас придёт племянница, и ты не выгляди обеспокоенной.
Sharpnull, спасибо большое, попробую завтра! :drinks:
Добавлено позже:
Sharpnull, всё работает, перевожу потихоньку. Ещё раз спасибо
ViToTiV:
если кого интересует, перевод закончен, выложен на psxplanet и rutracker.
перехожу на первую часть, там как оказалось сжатия вообще нет (странно что пираты её не перевели)
ShiningSbun:
ViToTiV, Отличные новости, спасибо, как раз прошел сюжетную ветку за одну из героинь в 1й части
Навигация
Перейти к полной версии