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

[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й части

Навигация

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

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