Автор Тема: [SNES] Clock Tower - нужна помощь с разбором сжатых строк  (Прочитано 443 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн pashok6798

  • Пользователь
  • Сообщений: 4
    • Просмотр профиля
Всем добрый день.
Хотел попробовать адаптировать перевод от группы Шедевр из оригинальной SNES версии в версию clock tower rewind. Я нашел текст, шрифты, для теста даже смог поправить интерфейс, но столкнулся с проблемой вступительных титров, титров в плохой концовке и в письме.

К примеру, во вступлении был текст:

It was September when Jennifer and her friends, who were all raised

В ресурсах игры он был скомпанован в такой формат:

ItwasSepmbrhnJidf,ol

При сравнении других переведённых ромов были обнаружены индексы сжатых строк, но дальше я не разобрался. Если нужны Ромы для изучения, могу их прислать.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5616
    • Просмотр профиля
Приложите ром Clock Tower: Rewind.

Оффлайн pashok6798

  • Пользователь
  • Сообщений: 4
    • Просмотр профиля
Вот прикрепил несколько ромов для сравнения. В DX и оригинале адреса нахождения текста находятся по адресу 0x300000, там будет первое смещение - 0x800 байт. Смещения меньше первого смещения я игнорировал и таким образом находил необходимый текст. Конец строки считается 0xFF, но также встречал какие-то непонятные значения, которые старался не трогать.
Таблица символов у меня получилась следующей:

Для оригинальной версии попробовал переместить шрифт из перевода группы Шедевр (прикрепил ром с русифицированным шрифтом).
Вот такая получилась таблица из рома от группы Шедевр:

Я не все символы внёс в таблицу, поэтому некоторые коды считаются как пробел.

Вот такой получилась таблица для адаптации перевода:

Шрифт в CT оригинал и dx находится по адресу 0x360000 и вроде он там идёт до самого конца или там отдельно идут шрифты для азиатских языков.

По следующим адресам нашёл индексы сжатых строк:

Также нашёл непонятное значение. То ли это смещение, то ли это длина блока, в переведённых ромах данное значение отличается: 0x1A718 - тут отличаются 2-3 байта.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5616
    • Просмотр профиля
Текст не сжат, он задаётся через tilemap с позиции PRG $359000 по 0x800 байт. Текст в ctr-eng-orig состоит из уникальных символом, чтобы их записать в VRAM, а в tilemap можно повторять. Например, для It (в начале текста) индексы тайлов 02, 03 и 04, 05, потому что указаны в таком порядке, в tilemap они в PRG 3591C6, 359206 и 3591С8, 359208, для вставки ещё буквы t в tilemap снова указать 04 и 05. Откройте ром в Mesen, Debug > Tile Viewer, Source: Video RAM, Address: 8000, Format: 2 bpp, Tile Layout: 8x16, увидите использованные символы в VRAM. В Debug > Memory Viewer видны недавно прочитанные байты (синим цветом), чтобы быстрее найти расположение данных.

Текст появляется частями сверху вниз с помощью прерываний. Задаются scanline (позиция Y экрана сверху вниз) в нужном месте через код. Запись scanline происходит в WRAM $0DE1, поэтому можно найти по 8D E1 0D (в данной игре), перед этими байтами значение scanline. Точку срабатывания прерывания на экране можно посмотреть в Mesen, Debug > Event Viewer. В ctr-eng-orig добавили доп. код (в конце рома, прыжок PRG $3861: 5C BE 80 F5 = JMP $F580BE) для разделения текста, поэтому "Haha, this is the" начинается сверху и для этого отдельный tilemap.
в переведённых ромах данное значение отличается: 0x1A718 - тут отличаются 2-3 байта.
После текста "It really is." используется PRG $1A718: 07 4B 00 в (J) и 3C 33 01 в ctr-eng-orig, в начале номер команды, потом аргументы. 07 - вывести текст с индексом 004B, 3C - тоже вывести текст, но взять по адресу F50000 + 0133 * 2 = CPU $F50266 (или PRG $350266) значение 09BC и прибавить F50000, получится CPU $F509BC, где список текстов 4B 00 22 02 FF FF - сначала текст 004B, потом 0222 и конец как FFFF.
Остаются вопросы к деталям: настройка времени отображения текста, расположение адресов на нужные данные и т. п.
UPD: Доработал текст. Кстати, ромы лучше архивировать в 7z.
« Последнее редактирование: 08 Апрель 2026, 13:56:12 от Sharpnull »

Оффлайн pashok6798

  • Пользователь
  • Сообщений: 4
    • Просмотр профиля
Благодарю за объяснение. В выходные попробую посмотреть.


Цитата
Текст появляется частями сверху вниз с помощью прерываний. Задаются scanline (позиция Y экрана сверху вниз) в нужном месте через код. Запись scanline происходит в WRAM $0DE1, поэтому можно найти по 8D E1 0D (в данной игре), перед этими байтами значение scanline. Точку срабатывания прерывания на экране можно посмотреть в Mesen, Debug > Event Viewer.

Вот видел в отладчике, но не понимал, откуда данные строки формируются. В ассемблере я очень слаб и мало имею представления в нюансах со смещениями по X, Y, что я видел. Ну и scanline тоже видел.

Добавлено 10 апреля 2026 года:
Еще возник вопрос, в каком окне можно посмотреть work ram? Я пытался по указанному в примере посмотреть адрес, а там было заполнено нулями. В video ram я видел те записи тайлы, о которых писали, и также индексы тайлов, но так и не понял, как из тех тайлов формируется строчка.
« Последнее редактирование: 11 Апрель 2026, 05:19:10 от ghostdog3 »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5616
    • Просмотр профиля
pashok6798, в Mesen в Memory Viewer выбрать Memory Type: Work RAM, в $DE1 будет 01, потом 48 на экране "Laura, hurry up!". Когда я писал CPU, PRG это типы CPU Memory, PRG ROM (как в файле). Tilemap обычный для SNES, я вроде подробно описал. Я писал про редактирование tilemap через Djinn Tile Mapper в теме Doraemon: Nobita to Yousei no Kuni, здесь почти также. Коротко, открыть ром в окне "Карта тайлов", нажать addr 0x80, ввести h35a800 для "Laura, hurry up!", в окне "Тайлы" дамп VRAM, addr 0x80 - h8000, x32(8x16), 2BPP GBC, Параметры метатайла 1x2, в "Карта тайлов" выбрать Type и можно набирать текст, нажимая на тайлы в "Тайлы". В переводе вы можете для этих экранов указать текст состоящий из всего алфавита (адреса на текст можно сделать одинаковые), тогда в VRAM будут все символы, загрузите дамп с русскими символами для тайлов и будете набирать текст.
312145-0

Оффлайн pashok6798

  • Пользователь
  • Сообщений: 4
    • Просмотр профиля
Sharpnull, благодарю за ответ. Теперь стало понятнее. Попробую адаптировать данные строки в выходные.

Кстати. Вспомнил, когда я в tile viewer смотрел тайлы, заметил, что в главном меню не отображался текст, а как раз был алфавит из заглавных латинских букв, текст только в отдельном слое (BG3 вроде назывался) можно было увидеть.
« Последнее редактирование: 10 Апрель 2026, 22:15:41 от pashok6798 »