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

[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 вроде назывался) можно было увидеть.

Навигация

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

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