| Разработка и ромхакинг > Переводы игр |
| [SNES] Clock Tower - нужна помощь с разбором сжатых строк |
| (1/1) |
| pashok6798:
Всем добрый день. Хотел попробовать адаптировать перевод от группы Шедевр из оригинальной SNES версии в версию clock tower rewind. Я нашел текст, шрифты, для теста даже смог поправить интерфейс, но столкнулся с проблемой вступительных титров, титров в плохой концовке и в письме. К примеру, во вступлении был текст: It was September when Jennifer and her friends, who were all raised В ресурсах игры он был скомпанован в такой формат: ItwasSepmbrhnJidf,ol При сравнении других переведённых ромов были обнаружены индексы сжатых строк, но дальше я не разобрался. Если нужны Ромы для изучения, могу их прислать. |
| Sharpnull:
Приложите ром Clock Tower: Rewind. |
| pashok6798:
Вот прикрепил несколько ромов для сравнения. В DX и оригинале адреса нахождения текста находятся по адресу 0x300000, там будет первое смещение - 0x800 байт. Смещения меньше первого смещения я игнорировал и таким образом находил необходимый текст. Конец строки считается 0xFF, но также встречал какие-то непонятные значения, которые старался не трогать. Таблица символов у меня получилась следующей: --- Код: ---13=\n 33=B 34=C 35=D 36=E 37=F 38=G 39=H 40=I 41=J 42=K 43=L 44=M 45=N 46=O 47=P 48=Q 49=R 50=S 51=T 52=U 53=V 54=W 55=X 56=Y 57=Z 58=A 59=é 60=à 61=ç 62=ê 63=è 64=a 65=b 66=c 67=d 68=e 69=f 70=g 71=h 72=i 73=j 74=k 75=l 76=m 77=n 78=o 79=p 81=r 82=s 83=t 84=u 85=v 86=w 87=x 88=y 89=z 90=Ç 91=« 92=» 93=ù 94=ô 95=â 96=0 97=1 98=2 99=3 100=4 101=5 102=6 103=7 104=8 105=9 106=î 107= 108= 109=: 110=æ 111=ï 112= 113= 114=? 115=! 116= 117= 118=. 119=, 120=' 121=- 122=" 123=* 124=( 125=) 126=/ 127= --- Конец кода --- 127 символ - это пробел. Для оригинальной версии попробовал переместить шрифт из перевода группы Шедевр (прикрепил ром с русифицированным шрифтом). Вот такая получилась таблица из рома от группы Шедевр: --- Код: ---13=\n 32=А 33=В 34=С 35=D 36=Е 37=F 38=G 39=Н 40=I 41=J 42=К 43=L 44=М 45=N 46=О 47=Р 48=Q 49=R 50=S 51=Т 52=U 53=V 54=W 55=Х 56=Y 57=Z 58=Ю 59=Я 60=ь 61=ъ 62=ы 63=э 64=а 65=б 66=с 67=в 68=е 69=ж 70=з 71=и 72=й 73=п 74=к 75=л 76=м 77=н 78=о 79=р 80=д 81=ф 82=г 83=т 84=ц 85=ч 86=ш 87=х 88=у 89=щ 90=я 91=, 92=. 93=ю 94=.. 95= 96=0 97=1 98=2 99=3 100=4 101=5 102=6 103=7 104=8 105=9 106=- 107=Б 108=Г 109=Д 110=Ж 111=З 112= 113= 114= 115=? 116=! 117= 118=Л 119=П 120=Ч 121=Ш 122=Щ 123=Ц 124=И 125=Ф 126=У 127=Э --- Конец кода --- Я не все символы внёс в таблицу, поэтому некоторые коды считаются как пробел. Вот такой получилась таблица для адаптации перевода: --- Код: ---33=В 34=С 35=D 36=Е 37=F 38=G 39=Н 40=I 41=J 42=К 43=Л 44=М 45=N 46=О 47=Р 48=Q 49=R 50=S 51=Т 52=U 53=V 54=W 55=Х 56=Y 57=Z 58=А 59=Я 60=ь 61=ъ 62=ы 63=э 64=а 65=б 66=с 67=в 68=е 69=ж 70=з 71=и 72=й 73=п 74=к 75=л 76=м 77=н 78=о 79=р 80=д 81=ф 82=г 83=т 84=ц 85=ч 86=ш 87=х 88=у 89=щ 90=я 91=, 92=. 93=ю 94=Ю 95= 96=0 97=1 98=2 99=3 100=4 101=5 102=6 103=7 104=8 105=9 106=- 107=Б 108=Г 109=Д 110=Ж 111=З 112= 113= 114=? 115=! 116= 117=Л 118=П 119=Ч 120=Ш 121=Щ 122=Ц 123=И 124=Ф 125=У 126=Э 127= --- Конец кода --- Шрифт в CT оригинал и dx находится по адресу 0x360000 и вроде он там идёт до самого конца или там отдельно идут шрифты для азиатских языков. По следующим адресам нашёл индексы сжатых строк: --- Код: ---0x38CA - для строки 679 (0x2A7) 0x38DF - для строки 680 (0x2A8) 0x38F4 - для строки 681 (0x2A9) 0x3928 - для строки 682 (0x2AA) 0x3965 - для строки 683 (0x2AB) 0x39C0 - для строки 684 (0x2AC) 0x10360 - для строки 685 (0x2AD) 0x10508 - для строки 686 (0x2AE) 0x3ABF - для строки 687 (0x2AF) --- Конец кода --- Также нашёл непонятное значение. То ли это смещение, то ли это длина блока, в переведённых ромах данное значение отличается: 0x1A718 - тут отличаются 2-3 байта. |
| Sharpnull:
Текст не сжат, он задаётся через 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. --- Цитата: pashok6798 от 07 Апрель 2026, 22:33:45 ---в переведённых ромах данное значение отличается: 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. |
| pashok6798:
Благодарю за объяснение. В выходные попробую посмотреть. --- Цитата ---Текст появляется частями сверху вниз с помощью прерываний. Задаются scanline (позиция Y экрана сверху вниз) в нужном месте через код. Запись scanline происходит в WRAM $0DE1, поэтому можно найти по 8D E1 0D (в данной игре), перед этими байтами значение scanline. Точку срабатывания прерывания на экране можно посмотреть в Mesen, Debug > Event Viewer. --- Конец цитаты --- Вот видел в отладчике, но не понимал, откуда данные строки формируются. В ассемблере я очень слаб и мало имею представления в нюансах со смещениями по X, Y, что я видел. Ну и scanline тоже видел. Добавлено 10 апреля 2026 года: Еще возник вопрос, в каком окне можно посмотреть work ram? Я пытался по указанному в примере посмотреть адрес, а там было заполнено нулями. В video ram я видел те записи тайлы, о которых писали, и также индексы тайлов, но так и не понял, как из тех тайлов формируется строчка. |
| Sharpnull:
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 будут все символы, загрузите дамп с русскими символами для тайлов и будете набирать текст. |
| pashok6798:
Sharpnull, благодарю за ответ. Теперь стало понятнее. Попробую адаптировать данные строки в выходные. Кстати. Вспомнил, когда я в tile viewer смотрел тайлы, заметил, что в главном меню не отображался текст, а как раз был алфавит из заглавных латинских букв, текст только в отдельном слое (BG3 вроде назывался) можно было увидеть. |
| pashok6798:
На всякий случай запишу сюда адреса с картой тайлов в оригинальном роме (dx версию особо не смотрел) через программу Djinn Tile Mapper: Меню - 0x387880 Список концовок - 0x387F80 Вступление: Первый текст - 0x359000 Второй текст - 0x359800 Третий текст - 0x35A000 Четвёртый текст - 0x35A800 Пятый текст - 0x35B000 Шестой текст - 0x35B800 Письмо отца - 0x33FE40 Плохая концовка: Текст 1 - 0x3427BE Текст 2 - 0x34303E Текст 3 - 0x34373E |
| Навигация |
| Главная страница сообщений |