| Разработка и ромхакинг > Переводы игр |
| [PS1] Clock Tower 2 - сжатие LZSS |
| (1/1) |
| ViToTiV:
Приветствую всех! Уже не один раз мне здесь помогали с сжатием, очередной раз есть просьба. Занялся переводом игр Clock Tower 1/2 на PSX. Начал с "Clock Tower II - The Struggle Within (USA)", раскопал шрифт и текст: Но меню в игре пожато, алгоритм вроде как LZSS, но не совсем корректно распаковывается, походу какая-то его модификация. Знатоки, гляньте пожалуйста, хотелось бы сделать всё красиво, текстового перевода игр не существует. TITLE.rar (48.98 КБ - загружено 238 раз.) |
| 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й части |
| Навигация |
| Главная страница сообщений |