Добрый день. Очень давно пытался найти сжатую графику из титульной заставки Final Fantasy II для wonderswan color, и вот только вчера удалось это сделать. Теперь столкнулся с проблемой что не могу понять алгоритм сжатия, пытался использовать известные мне RLE, LZ77 и алгоритм Хаффмана но ни к чему не пришёл, но возможно я просто не верно их применял и как раз один из них тут и используется.
Возможно у читающих эту тему есть опыт и знания для вскрытия этих данных так что буду очень благодарен услышать любое мнение.
Поинтеры для каждого экрана в заставке (начиная с логотипа square) начинаются с адреса 251430h. Все они состоят из двух байтов. Для поиска адреса начала графики нужно просто поменять их местами и прибавить вначале 25. 66 14 -> 14 66 -> 251466h.
Мой ром:
Name: Final Fantasy II (J) [!].wsc
SHA-1: 959321e3b971516e38a4cbf95b0fc3ef c0b0a825
1. PeacefulWarrior - 07 Мая, 2024 - 12:17:27 - перейти к сообщению
2. Griever - 07 Мая, 2024 - 21:24:46 - перейти к сообщению
Привет, нужен кусок с распакованной графикой. Обычно для этого используют эмуляторы с отладчиками, но я такой не знаю.
3. PeacefulWarrior - 07 Мая, 2024 - 22:38:08 - перейти к сообщению
Griever пишет:
Привет, нужен кусок с распакованной графикой. Обычно для этого используют эмуляторы с отладчиками, но я такой не знаю.
Вот небольшой кусочек распакованной графики для самого первого текста (сразу после лого)
25159Ah - адрес начала этого текста
Каждая сжатая часть графики имеет заголовок 10 00 00 00 05 00
4. PeacefulWarrior - 07 Мая, 2024 - 22:38:57 - перейти к сообщению
Griever пишет:
Привет, нужен кусок с распакованной графикой. Обычно для этого используют эмуляторы с отладчиками, но я такой не знаю.
Скажите если нужно будет больше.
5. Griever - 08 Мая, 2024 - 00:18:57 - перейти к сообщению
Расскажи, как ты достал распакованный кусок?
6. PeacefulWarrior - 08 Мая, 2024 - 06:52:00 - перейти к сообщению
Griever пишет:
Расскажи, как ты достал распакованный кусок?
Использовал отладчик эмулятора меднафен. У этого эмулятора единственный нормальный отладчик для wonderswan.
Сопоставил данные из tile viewer с ОЗУ и переписал часть в ручную. Думаю это не самый эффективный способ, но пока что у меня не хватает навыков для чего то большего.
7. Griever - 08 Мая, 2024 - 11:59:00 - перейти к сообщению
Графика хранится в LZSS:
Формат блока:
LZ:
Raw:
Формат блока:
CODE:
+----------+--------+-------------------------------------------------------------------------+
| Смещение | Размер | Описание |
+----------+--------+-------------------------------------------------------------------------+
| 0 | 6 | Заголовок 10 00 00 00 05 00 |
| 6 | 2 | Размер распакованного блока в байтах 00 04 (0x400 байт) |
| 8 | X | Упакованный поток бит. Биты в байте проверяются от старшего к младшему.
+-------+------+------------------------------------------------------------------------------+
| Смещение | Размер | Описание |
+----------+--------+-------------------------------------------------------------------------+
| 0 | 6 | Заголовок 10 00 00 00 05 00 |
| 6 | 2 | Размер распакованного блока в байтах 00 04 (0x400 байт) |
| 8 | X | Упакованный поток бит. Биты в байте проверяются от старшего к младшему.
+-------+------+------------------------------------------------------------------------------+
LZ:
CODE:
0 XXXXXXXX YYY
| | |
| | 3 бита размера копирования
| 8 бит смещения в кольцевом буфере
Флаг сжатия
Кольцевой буфер размером 0x100 байт, не обнуляется, а переходит к нулевой позиции и начинает перезаписывать буфер с начала. Нулевая позиция буффера в первом проходе не используется, поэтому смещения начинаются с 1, а не с 0. Непонятно, зачем так сделано.
Размер копирования хранится как (размер - 3). Непонятно, почему не 2, т.к. хранить LZ пару уже выгодно, когда она сжимает хотя бы 2 байта.
| | |
| | 3 бита размера копирования
| 8 бит смещения в кольцевом буфере
Флаг сжатия
Кольцевой буфер размером 0x100 байт, не обнуляется, а переходит к нулевой позиции и начинает перезаписывать буфер с начала. Нулевая позиция буффера в первом проходе не используется, поэтому смещения начинаются с 1, а не с 0. Непонятно, зачем так сделано.
Размер копирования хранится как (размер - 3). Непонятно, почему не 2, т.к. хранить LZ пару уже выгодно, когда она сжимает хотя бы 2 байта.
Raw:
CODE:
1 XXXXXXXX
| |
| |
| 8 бит несжатого байта
флаг несжатого байта
| |
| |
| 8 бит несжатого байта
флаг несжатого байта
8. PeacefulWarrior - 13 Мая, 2024 - 00:57:15 - перейти к сообщению
Griever пишет:
Графика хранится в LZSS:
Формат блока:
LZ:
Raw:
Формат блока:
CODE:
+----------+--------+-------------------------------------------------------------------------+
| Смещение | Размер | Описание |
+----------+--------+-------------------------------------------------------------------------+
| 0 | 6 | Заголовок 10 00 00 00 05 00 |
| 6 | 2 | Размер распакованного блока в байтах 00 04 (0x400 байт) |
| 8 | X | Упакованный поток бит. Биты в байте проверяются от старшего к младшему.
+-------+------+------------------------------------------------------------------------------+
| Смещение | Размер | Описание |
+----------+--------+-------------------------------------------------------------------------+
| 0 | 6 | Заголовок 10 00 00 00 05 00 |
| 6 | 2 | Размер распакованного блока в байтах 00 04 (0x400 байт) |
| 8 | X | Упакованный поток бит. Биты в байте проверяются от старшего к младшему.
+-------+------+------------------------------------------------------------------------------+
LZ:
CODE:
0 XXXXXXXX YYY
| | |
| | 3 бита размера копирования
| 8 бит смещения в кольцевом буфере
Флаг сжатия
Кольцевой буфер размером 0x100 байт, не обнуляется, а переходит к нулевой позиции и начинает перезаписывать буфер с начала. Нулевая позиция буффера в первом проходе не используется, поэтому смещения начинаются с 1, а не с 0. Непонятно, зачем так сделано.
Размер копирования хранится как (размер - 3). Непонятно, почему не 2, т.к. хранить LZ пару уже выгодно, когда она сжимает хотя бы 2 байта.
| | |
| | 3 бита размера копирования
| 8 бит смещения в кольцевом буфере
Флаг сжатия
Кольцевой буфер размером 0x100 байт, не обнуляется, а переходит к нулевой позиции и начинает перезаписывать буфер с начала. Нулевая позиция буффера в первом проходе не используется, поэтому смещения начинаются с 1, а не с 0. Непонятно, зачем так сделано.
Размер копирования хранится как (размер - 3). Непонятно, почему не 2, т.к. хранить LZ пару уже выгодно, когда она сжимает хотя бы 2 байта.
Raw:
CODE:
1 XXXXXXXX
| |
| |
| 8 бит несжатого байта
флаг несжатого байта
| |
| |
| 8 бит несжатого байта
флаг несжатого байта
Здравствуйте! Спасибо вам огромное! Благодаря этим данным смог написать программу для распаковки графики. Не могли бы вы рассказать как на основе тех данных что у вас были вы смогли получить все эти данные о сжатии?
9. Griever - 13 Мая, 2024 - 21:48:42 - перейти к сообщению
Привет, в общих чертах, процесс такой:
в Mednafen нашел адрес распакованной графики, поставил останов на запись в него, поймал место в коде, которое пишет в этот адрес, загрузил дамп RAM в IDA, проанализировал процедуру распаковки, подтвердил её на паре примеров распакованной графики.
в Mednafen нашел адрес распакованной графики, поставил останов на запись в него, поймал место в коде, которое пишет в этот адрес, загрузил дамп RAM в IDA, проанализировал процедуру распаковки, подтвердил её на паре примеров распакованной графики.
10. PeacefulWarrior - 14 Мая, 2024 - 00:18:43 - перейти к сообщению
Griever пишет:
Привет, в общих чертах, процесс такой:
в Mednafen нашел адрес распакованной графики, поставил останов на запись в него, поймал место в коде, которое пишет в этот адрес, загрузил дамп RAM в IDA, проанализировал процедуру распаковки, подтвердил её на паре примеров распакованной графики.
в Mednafen нашел адрес распакованной графики, поставил останов на запись в него, поймал место в коде, которое пишет в этот адрес, загрузил дамп RAM в IDA, проанализировал процедуру распаковки, подтвердил её на паре примеров распакованной графики.
Слушайте, вы не хотели бы пополнить библиотеку переводом этой игры на chief net? Теперь когда с графикой всё решено. Я смогу перерисовать все ресурсы, шрифты и теперь могу поменять всю графику и текст. Думаю я в любом случае этим займусь, хотелось бы просто знать что могу загрузить перевод куда нибудь где он будет виден людям.
11. Mefistotel - 14 Мая, 2024 - 00:41:32 - перейти к сообщению
Ты занимайся, сюда скидывай готовый инструментарий и тексты по мере перевода (eng+rus). Нужно проверить твой уровень владения английским и русским языками. Если всë достойно, то проблем нет, добавлю перевод на сайт. Переводить текст сам собираешься? Судя по сообщениям, есть проблемы с пунктуацией. Но в любом случае перевод можно и просто в нашу Базу добавить, чтобы не пропал.
Предварительно необходимо согласовать глоссарий с нашей версией перевода. Поэтому прикладываю наш вариант для версии на Famicom. Также у меня есть и полностью переведëнный русский текст и английский оригинал. Могу поделиться также.
Хотелось бы сравнить скрипты из версий FAMI и WSC. На WSC текста наверняка больше, и он насыщеннее.
Предварительно необходимо согласовать глоссарий с нашей версией перевода. Поэтому прикладываю наш вариант для версии на Famicom. Также у меня есть и полностью переведëнный русский текст и английский оригинал. Могу поделиться также.
Хотелось бы сравнить скрипты из версий FAMI и WSC. На WSC текста наверняка больше, и он насыщеннее.
12. PeacefulWarrior - 14 Мая, 2024 - 06:46:56 - перейти к сообщению
Mefistotel пишет:
Ты занимайся, сюда скидывай готовый инструментарий и тексты по мере перевода (eng+rus). Нужно проверить твой уровень владения английским и русским языками. Если всë достойно, то проблем нет, добавлю перевод на сайт. Переводить текст сам собираешься? Судя по сообщениям, есть проблемы с пунктуацией. Но в любом случае перевод можно и просто в нашу Базу добавить, чтобы не пропал.
Предварительно необходимо согласовать глоссарий с нашей версией перевода. Поэтому прикладываю наш вариант для версии на Famicom. Также у меня есть и полностью переведëнный русский текст и английский оригинал. Могу поделиться также.
Хотелось бы сравнить скрипты из версий FAMI и WSC. На WSC текста наверняка больше, и он насыщеннее.
Предварительно необходимо согласовать глоссарий с нашей версией перевода. Поэтому прикладываю наш вариант для версии на Famicom. Также у меня есть и полностью переведëнный русский текст и английский оригинал. Могу поделиться также.
Хотелось бы сравнить скрипты из версий FAMI и WSC. На WSC текста наверняка больше, и он насыщеннее.
Хорошо, я пришлю первые результаты чуть позже.
13. Mefistotel - 15 Мая, 2024 - 02:07:46 - перейти к сообщению
Вот весь текст из версии на Famicom.
14. kgn - 06 Июля, 2024 - 20:23:17 - перейти к сообщению
Mefistotel пишет:
Вот весь текст из версии на Famicom.
Извините, что вмешиваюсь, но ещё когда проходил игру с этим переводом, заметил пару опечаток. А тут повод удобно указать на них.
Message RUS.txt
строка 98 - обаяние (никак не обояние)
строка 315 - откачаны (не откачены; откачены, если откатить что-то, а откачать - откачаны. По смыслу именно откачать)
Magic RUS.txt
строка 179 - обаяние (опять же)
Это что запомнил. Если вдруг решите обновить патч.
P.S.: это вкусовщина, понимаю, что перевод самобытный и всё такое, но вступление "...сражались за свои земли, да проиграли", как-то ломает настрой. Вот это просторечное "да проиграли" напоминает русские сказки.))) Я бы заменил на нейтральное "но проиграли".
Если что, это файл Text_2 RUS.txt строка 1455
15. Mefistotel - 07 Июля, 2024 - 22:53:24 - перейти к сообщению
16. kgn - 08 Июля, 2024 - 11:40:18 - перейти к сообщению
Mefistotel пишет:
Просьба проверить.
Минимально проверил. Вступление исправлено. До остальных слов не дошёл, но уверен, что там всё хорошо. Как-нибудь доберусь. Игра прекрасно загружается, сохраняется. На первый взгляд всё отлично.
Спасибо. Будет повод перепройти.)))))
***
PeacefulWarrior
Надеюсь, у Вас всё получится. Я как раз задумывал попробовать версию для WSC. Наверное, во все версии играл, большинство проходил, а WSC прошла мимо меня. Теперь подожду.
17. Mefistotel - 08 Июля, 2024 - 13:40:39 - перейти к сообщению
Да что-то давно активиста не слышно, но хоть скрипты не зря выложил))