ОСНОВЫ
ПЕРЕВОДА ИГР NINTENDO 64 (на примере редактирования
графики в игре Zelda: Ocarina of Time) |
Эта небольшая
статья, надеюсь, поможет вам разобраться, с чего начать перевод игр Nintendo
64. Постараемся шаг за шагом разобраться в работе с необходимыми программами,
а также узнать много другой информации о "внутренностях" Zelda64.
Данная статья описывает редактирование игры Zelda:
Ocarina of Time, которая уже переведена на русский (Перевод Zelda:
Majora's Mask также завершен), поэтому надеюсь, что вы используете эту
информацию как основу для перевода других игр Nintendo 64. Но чтобы понять
принцип работы программ, описанных ниже, вполне можно потренироваться и на
Zelda. :)
Для начала - скачайте все нужные программы из секции
ROM HACKING TOOLS в разделе Downloads:
(N64GFX 2.0, Sprite Viewer, Zelda Extractor, Yaz0kit,
Rom Put и Hexposure) (Некоторые их этих программ могут не работать
в Windows XP, так как они написаны под DOS. В таком случае попробуйте поискать
в интернете эмуляторы DOS для XP, вроде программки DOS Box) Также, вам потребуется
Adobe Photoshop (любая
версия, начиная от 5.0).
Итак - приступим. Начнем с того, что практически
во всех играх N64 графика (к которой относятся также и шрифты, используемые
в диалогах игры) хранится в сжатом виде, причем в каждой игре алгоритм сжатия
свой собственный, уникальный. (В двух Zelda 64 такой алгоритм называется
Yaz0, а к примеру, в Super Mario 64 - этот алгоритм называется
Mio0 и т.д., для каждой игры свой) Только некоторые игры используют одинаковый
алгоритм, но их крайне мало. А в некоторых сжата только часть графики, а другая
часть - нет. Наша Zelda относится именно к этой категории и к счастью - шрифты
в ней хранятся не в сжатом виде.
Сделано это из-за ограничений размера
картриджа. Например, в игре Conker's Bad Fur Day, которая максимально
использует объем картриджа и возможности приставки, графика почти вся полностью
сжата. Поэтому переводов или хаков игр для Nintendo 64 в Сети практически нет,
по причине отсутствия необходимых программ для работы с этой самой сжатой графикой.
Если же такие программы и есть, то написаны они для каждой конкретной игры (в
случае с Zelda нам повезло - такие программки есть). Но, также существуют
и игры, большая часть графики в которых хранится не в сжатом состоянии. Это, к
примеру, Aerocauge, Earthworm Jim 3D и некоторые другие игры. В таком
случае их графику можно редактировать с помощью программы N64GFX v2.0 (которую
вы, я надеюсь, уже скачали). Речь о работе с этой программой пойдет чуть ниже.
Вернемся к Zelda (предполагается что ваш РОМ называется Zelda64.rom).
Начнем с не сжатой графики и перерисуем надписи на Action Icon ("Кнопка
Действия"), которая находится в правом верхнем углу экрана в игре:

|
Редактирование
не сжатой графики |
1.
Поиск графики в РОМе (программа - Sprite Viewer) |
Для
начала создайте новую папку, и положите в нее ваш ром Zelda64 и программу
Sprite Viewer (SV.exe). Берем ром Zelda64 (ром должен быть не byteswapped).
Открываем ром в Sprite Viewer (sv.exe zelda64.rom) и ищем
графику. Для быстроты поиска понажимайте клавишу ], и клавишей PageDown
(или стрелками) доберитесь до адреса 0x8C4D71 (начало картинки
с надписями на этой кнопке). Перейдите в режим Linear 4 (клавиша
4), выберете палитру Gray (клавишей P). Теперь понажимайте
[, чтобы ширина изображения получилась 48 пикселей. На экране
должно получится примерно
следующее:
C
другой графикой все подбирается опытным путем, в режимах linear4, linear8,
n64high и n64true. (Режимы меняются клавишами 1,2,3,4,5,6,7,8,9
- на каждой несколько режимов для разных платформ (например, при нажатии
клавиши "8" чередуются режимы "Snes8" и "linear8".
Для N64 ромов нужны режимы "linear* и "n64*").
Наилучшее качество получается в палитре Gray. В случае с режимами n64high
и n64true - в палитре True color. Так, например, в Sprite Viewer-e выглядят
предметы в инвентаре:

Но вернемся к Action Icon. Нашли нужную графику - запоминаем оффсет, размер, режим
и палитру. Сейчас они нам понадобятся. |
2.
Экспорт графики из РОМа в файл (программа - N64GFX 2.0) |
Помещаем
наш РОМ Zelda64 и N64GFX в одну папку. Запускаем N64 GFX frontend. (На вкладку
Palmatch не обращаем внимания, она нам не нужна). Заполняем поля следующим
образом:
- Rom name with (ext): имя
рома, с расширением (в нашем случае - Zelda64.rom).
- Palette type: выбор палитры
(builtin gray - оттенки серого, builtin igray - оттенки
серого, инвертированные (негатив), default -"как есть", n64high
и n64true - соответственно 65000 цветов (high color) и 16
млн. цветов (true color))
- Mode:
режим отображения данных в Sprite Viewer.
- Offset:
адрес, по которому конкретные данные хранятся в роме.
(обязательно добавлять 0x перед адресом - т.е. забиваем нулями
все перед оффсетом, если он короче, чем 8 символов. Недостающие
нули - всегда 0х, потом оффсет. Всего - 8 символов)
- Type:
"как" экспортировать / импортировать файл *.png
(tile - задается минимальная ширина видимого с наилучшим качеством
в Sprite Viewer тайла* (надписи, буквы, картинки
и т.п.), высота обычно равна ширине. block - конкретно задаем ширину
и высоту изображения для экспорта / импорта - так, как нам удобнее.
Но в этом случае надо ширину и высоту подбирать опытным путем)
*
Тайл - ячейка для отдельно взятого графического символа (или его части) в
роме.
- Size: размер
в пикселах (ширина и высота) тайла
(в случае с блоком
- пишем все равно ширину и высоту одного тайла (конкретной надписи,
буквы, картинки и т.п.))
- Image Size (X x Y):
размер в пикселах (ширина и высота) экспортируемого
/ импортируемого ФАЙЛА *.png
(если в поле Type выбрали
Tile - первую цифру пишем такую же, как и в поле Size, а если выбрали
Block - то подбираем размеры файла *.png опытным путем) -
Operation: выбираем
Export или Import (вытащить из рома *.png или вставить в ром *.png)
- Image name *.png:
задаем имя файла для экспорта / импорта
- Run
N64GFX: это, надеюсь, понятно, - для чего
кнопка :)
Обратите внимание, что в поле Rom name with (ext)
не надо писать полный путь к рому. (Например - C:/n64translate/n64gfx/zelda64.rom).
Если написать путь, N64GFX не будет ничего делать (глюк программки). Также
в поле Palette type практически всегда надо выбирать builtin igray.
Еще нормально работает опция default. В поле Image size первую
цифру пишем 48 (ширина в пикселах), так, как показывало в Sprite
viewer-e. Вторую - подбираем опытным путем. В данном случае - 465 (пикселей).
(Иногда желательно, чтобы одно значение было кратно другому). Все
заполнили - жмем самую большую кнопку - Run N64gfx. В текущей папке
создается файл "action-icon.png" (рис. 1):
 Рис.
1 (фрагмент).
PNG файл экспортируется из РОМа в режиме Indexed Color. |
3.
Перерисовка по-русски (программа - Adobe Photoshop) |
Открываем
action-icon.png в Photoshop и рисуем русские надписи, примерно как на рис.
2, (сохранив оригинальную палитру). Чтобы сохранить оригинальную
палитру, в фотошопе идем в меню Image, выбираем Mode > Color
Table, жмем Save. Называем файл, скажем, Action.act. Пересохраняем
файл action-icon.png как action-rus.png (или любой другой формат,
лучше *.psd).
Рис. 2 (фрагмент).
Удобнее редактировать в режиме RGB color,
который поддерживает использование слоев и другие функции фотошопа, недоступные
в режиме indexed color. (Режим меняется в Image > Mode >
RGB color).
Рисуем... - нарисовали, понравилось - теперь надо
склеить слои, если вы ими пользовались (Layer > Flatten Image)
и возвернуть режим indexed color (Image > Mode > Indexed color).
В появившемся окне во вкладке Palette выбираем Custom. Открывается
знакомое окно с палитрой. Жмем Load и открываем сохраненный ранее Action.act.
Жмем ОК и сохраняем файл как action-rus.png (в появившемся
окне с параметрами png ставим interlaced - none). Все, к
вставке в ром файл готов *.
*
На всякий случай можно переименовать action-rus.png в action-r.png
(иногда при импорте N64GFX не воспринимает длинные имена файлов. DOS есть DOS...
Максимум 8 букв в имени файла. Я заметил этот баг только при импорте в палитре
builtin igray). |
4.
Импорт графики из файла в РОМ (программа - N64GFX 2.0) |
Загружаем
N64GFX frontend, (action-rus.png, N64Gfx и ром дожны лежать в одной
папке). Заполняем все точно так же, как и при экспорте, только в поле
Operation вместо export ставим import, а в поле Image
name *.png пишем название нашего нового перерисованного файла - action-rus.png
(или action-r.png). Заполнили поля - жмем Run N64gfx.
Все. Теперь надписи на Action Icon должны быть по-русски. На всякий
случай, можно открыть ром в Sprite Viewer, и по знакомому адресу посмотреть
изменения. Должно получится следующее:
Открываем наш ром в эмуляторе,загружаем игру, сэйв (или если не лень -
начинаем сначала) и смотрим изменения:
Замечательно :) Следующий шаг - редактирование сжатой графики. |
Редактирование
сжатой графики |
1.
Распаковка графики (программа - Zelda Extractor) |
В
Zelda некоторая часть необходимой для перевода графики - сжата. Процесс распаковки
делается в процессе игры эмулятором / приставкой. Найти и отредактировать
ее способом, описаным выше, нельзя. Для начала нужно проделать несколько заумных
действий:
Берем наш оригинальный ангийский ром Zelda64.
Копируем его и программку Zelda Extractor в одну папку. В коммандной
строке пишем: Zextract.exe Zelda64.rom (или делаем *.bat файл
с таким содержанием (Zextract.exe
Zelda64.rom), после чего запускаем его). После
некоторых раздумий программки, в нашей папке создается немеренное количество файлов
*.dat (1456 штук). Эти файлики - все сжатые графические данные, найденные
в игре. Но уже в распакованном виде (доступном
для просмотра в Sprite Viewer, а значит - и для перерисовки).
Имя файла - это адрес (оффсет), по которому данные лежат в РОМе.
Распаковали - переходим ко второму, самому нудному шагу: поиску нужной
графики во всей этой куче. |
2.
Поиск графики (программа - Sprite Viewer) |
Все
точно также, как и поиск в роме, только вместо рома в Sprite Viewer нужно просмотреть
каждый из этих 1456 *.dat файлов. Чтобы долго не искать, для начала можно,
к примеру, взять файлы размером по 6,75 кб - в них находятся названия
локаций в игре, которые появляются в центре экрана, когда заходишь в конкретную
локацию. (Kokiri Forest, Hyrule field, Water Temple и т.п. Короче - все названия.
Я нашел 57 штук). В Sprite Viewer это выглядит так:
Для полного перевода игры, если хотите, потребуется найти:
*
- названия локаций - главное меню игры (кнопки и надписи)
- надпись Nintendo64 в самом начале (хотя логотипы переводить не принято)
- логотип Zelda, если хотите ** - надпись
"Navi" на кнопке C-up *** - некоторые
надписи в подменю (subscreens) - имена боссов - надпись GAME OVER (довольно
неудобно хранится) - надпись The End, лого Нинтенды и прочий мусор.
*
для Majora's Mask - примерно тоже самое, но сжатой графики в этой игре гораздо
больше; ** при изменении лого игра может
зависнуть в Gerudo Fortress. Не знаю, почему; *** а в этом случае игра
может зависнуть в самом начале, в момент появления логотипа Zelda. Тоже загадка.
Нашли, отсортировали все *.dat файлы, нужные для работы. Поехали дальше. |
3.
Экспорт графики из *.dat файла (программа
- N64GFX 2.0) |
Точно так же,
как и из рома, только вместо рома в поле Rom name with (ext) в N64GFX пишем
имя нужного *.dat файла (с расширением). Так же заполняем все поля,
по информации, найденной в Sprite Viewer. |
4.
Редактирование файлов
*.png, экспортированных из *.dat
(программа
- Adobe Photoshop) |
Редактируем
точно также, как и PNG, экспортированные из РОМа. (см. "Перерисовка
по-русски").
В данном случае есть пару важных моментов: -
размер измененного *.png может быть немного больше, чем оригинал
- обязательно нужно сохранять оригинальную палитру - редактировать
нужно очень аккуратно, стараясь достичь такого же качества, как оригинальный *.png
- обязательно нужно добиться того, чтобы количество пикселей в новой картинке
было меньше или равно оригиналу. Иначе могут быть зависания
в игре.
Нарисовали русскую надпись. Следующий шаг - импорт обратно в *.dat. |
5.
Импорт графики в *.dat файл (программа
- N64GFX 2.0) |
Точно также,
как и экспорт. Значения пишем те-же. Вместо опции Export ставим Import.
Жмем кнопку Run N64 GFX - на выходе остается тот-же *.dat файл,
но со вставленной в него отредактированной графикой. Следующий шаг
- компрессия (сжатие) этого *.dat файла. |
6.
Компрессия (сжатие) данных (*.dat файла) (программа
- Yaz0kit) |
Самое
ответственное. Распаковываем архив Yaz0kit.zip в новую папку. Видим
там 4 файла:
- Распаковщик Yaz0unp.exe (Можно удалить. Работает
по тому же принципу, что и Zelda Extractor, только имена создаваемых файлов -
просто порядковый номер. Расширение - *.unp) -
Запаковщик Yaz0comp.exe (он-то нам и нужен).
- Файлик unp (пример распакованных данных. Просто один из 1456 файлов.
Можно удалить). - Файлик !out.org (пример запакованных данных.
Запакованный файлик unp. Можно удалить). Берем нужный и измененный
*.dat. Проверяем в Sprite Viewer, чтобы не было никаких глюков. Кидаем в одну
папку с Yaz0 kit. Переименовываем наш отредактированный *.dat в файл с простым
названием unp. Без расширения. Просто UNP. Запускаем Yaz0comp.exe.
Создается файл !out (можете его переименовать для удобства,
но имя - не больше 8 символов (англ. буквы и цифры). Этот !out
- как раз то, как хранится данная графика в роме. В двух словах - просто кусок
рома. Но уже отредактированный *.
* Важный момент:
размер !out файла должен быть меньше или равен
оригинальному. Желательно меньше. (оригинальный можно получить, запаковав
не отредактированный *.dat).
Готово. Можно приступать к последнему
шагу - вставке в ром. |
7.
Вставка данных в ром (программа
- Rom Put) |
Берем
программку Romput 1.0. Помещаем ее, ром, и файл !out (полученный
из измененного *.dat) в одну папку. Записываем где нибудь оффсет, по которому
будем вставлять (имя *.dat файла). Запускаем Romput. Внешне ничего
сложного. Единственное - не надо заполнять поля в ручную, а надопользоваться
кнопками (Load ROM, Load BIN). Иначе программка выругается и ничего
не сделает. Выглядит это так:
ROM
- имя рома BIN - файл "!out"
ADR - оффсет
в роме (имя *.dat
файла) (здесь
вместо нулей перед оффсетом - пишем символ $)
Заполнили
поля - жмем кнопку Attach!
Готово!
Открываем
ром в эмуляторе и смотрим изменения. Если повезет, и ничего не зависнет, то
все получится хорошо. )
По графике все (информацию по шрифтам см. ниже).
Надеюсь, написанное выше поможет вам разобраться, что к чему. А теперь последнее
- пару слов о процессе перевода (так, как мы это делали) и немного информации
о шрифтах и пойнтерах в роме Zelda64: OoT, а также пару слов о создании патча. |
Шрифты,
процесс перевода, пойнтеры, патч |
1.
Шрифты (программы - Sprite Viewer, N64GFX, Photoshop) |
Шрифты
в игре хранятся в не сжатом виде, что существенно облегчает их поиск и
редактирование. Поиск и перерисовка шрифтов делается по такому же принципу,
как и надписи на Action Icon. Редактирование осложнается тем, что шрифт слегка
размыт, в отличие от надписей на Action Icon.
В N64GFX можно в поле Type
выбрать Block, для удобства редактирования, но тогда прийдется оба
значения Image Size подбирать опытным путем. Значения должны быть кратны.
В игре используется два шрифта. Один - выбор имени в начале
игры и надпись PRESS START (используйте relative search). Второй - собственно
текст в диалогах / анимационных вставках / титрах и пр. Экспортированный из
рома шрифт (второй, для диалогов), выглядит так:
*
*
Параметры
n64gfx для шрифтов: шрифт 1 (выбор
имени в начале игры и надпись PRESS START):
offset
- 0x4d9fc0, mode - linear 4, type - block, size - 16 x
16, image size - 512x384, palette type - builtin igray
шрифт 2 (основной.
Тексты диалогов и пр.):
offset - 0x906f70, mode - linear
4, type - block, size - 16 x 16, image size - 160 x 224,
palette type - builtin igray
Буквы
в шрифтах перерисовываются так, как кому удобно. Мы их располагали примерно
так, как они расположены на клавиатуре. Т.е., на месте английской "A"
рисуем русскую "Ф" и т.д. Важно нарисовать буквы так, чтобы
ширина новой русской буквы соответствовала ширине английской, на
месте которой она рисуется. Иначе в игре одни буквы будут налазить друг на друга,
а между другими будут большие пробелы. Поэтому, иногда приходится использовать
другие символы на клавиатуре для конкретной руской буквы, чтобы более-менее вписаться
в ширину английского символа. (например, "ь" в нашем переводе
соответсвует клавише "^", а "ж" - английской
клавише "m", т.к. невозможно по ширине вписать букву "ж"
в английский символ на этой же клавише - ":" ) Теоретически
эту проблему можно решить, найдя в роме таблицу ширины букв, и изменив ее. |
2.
Процесс перевода (программа - Hexposure, или любой другой HEX-редактор) |
После
того, как перерисован и вставлен в ром шрифт, можно приступать непосредственно
к переводу. Открываем Hexposure *, открываем
ром и ищем текст. Выглядит все это так:
Перевод делается в правой колонке. Например, "30 Rupees"
переводим как "30 Рупий". Учитывая подстановку букв, пишем:
"30 Hegbq". И погнали... Как
все это выглядит в игре - можно увидеть скачав патч и поиграв. В средней колонке
- 16-тиричные обозначения символов. В левой - оффсет.
Если, к примеру,
необходимо выделение части фразы цветом, вроде "Ты
нашел Сердце" - используются
пойнтеры. В hexposure это будет выглядеть так: "Ns
yf*tk .ACth{wt.@"
(уже переведенная фраза).
В данном примере - ".А"
- начало выделения красным цветом. ".@"
- конец выделения цветом (любым).
Значения
пойнтеров пишутся в средней части окна: ".А"
= 05 41, а ".@" = 05 40.
*
Вместо Hexposure можно использовать и другие hex-редакторы. Это кому как удобнее. |
3.
Описание пойнтеров (программа - Hexposure / другой хес-редактор) |
(Информация
взята с сайта The Legends
of Zelda)
Некоторые значения пойнтеров или их сочетаний неизвестны
(или мы точно не знаем - (?)), поэтому лучше не перемещать их и оставлять
на своих местах - там, где они находятся в оригинальном (непереведенном) тексте,
во избежание зависаний игры.
Разное :
(можно перемещать)
00 = Пустое пространство
в роме 0F = Имя игрока, выбранное в начале игры (у нас это "0F"
заменено на "Линк") 1F = Текущее игровое время
Контроль
текста :
01 = Перенос на следующую строку (можно
перемещать по текущей фразе / диалогу)
04 = Конец фразы.
Ожидание, пока игрок не нажмет "А" и переход на следующую фразу текущего
диалога (можно перемещать по текущей фразе / диалогу)
06 xx = отступ (x = хекс-значения от 23 до 3C, определяет длину
отступа)
1A = не разрешать игроку нажать кнопку "B" чтобы
пропустить текущую фразу. (приоритет текущей фразы). Всегда используется в
комбинации с 04 (04 1А) (можно
перемещать по текущей фразе / диалогу)
13 xx 08 = Начало диалога "Ты получил (предмет)" (?) (x =
разные значения)
1B = Выбор ответа в диалогах (голубая стрелка)
02 = Окончание всего диалога (текст/анимация/меню и т.п.) (можно
перемещать только влево по тексту)
0B 02 = Неизвестно
07
xx xx 02 = Неизвестно
08 или 09 = Пауза перед отображением
текста (?)
(08) = Перед описанием монстров (комментарий Нави) (?)
(09) = Неизвестно
0E xx 02 = Пауза перед отображением
текста (?)
0C xx = Пауза перед отображением текста (альтернатива)
(?)
01 01 01 09 10 02 = Неизвестно
07 xx xx 02 =
При повторе диалога - повторять конкретный блок текста (?)
14 xx
= Неизвестно
12 xx xx = Неизвестно
Пиктограммы
кнопок : (можно
перемещать по текущей фразе / диалогу)
AA = джойстик A5 = С-вверх A7 = С-влево A6
= С-вниз A8 = C-вправо A1 = C A4 = Z A0
= B 9F = A A3 = R A2 = L A9 = иконка
Z-прицеливание
Цвет текста : (точно
все не помню - оставляйте эти пойнтеры как есть, можно
перемещать по текущей фразе / диалогу)
По-умолчанию цвет основного текста в игре - белый.
05
41 текст = начало красного цвета
05 42 текст
= начало зеленого цвета 05
43 текст
= начало синего цвета 05 44 текст
= начало голубого цвета 05 45 текст
= начало фиолетового цвета 05 46
текст
= начало желтого цвета текст
05 40 = конец выделения любым цветом
|
Создание
патча | Немного
о создании корректного патча. Возможно, у вас уже есть программка ips.exe
для применения патча к рому. Можете ее "выбросить" :) Ром N64 с этой
программкой не будет корректно работать.
- При редактировании только не
сжатой графики и текста (в Zelda64), используйте программку Smart
IPS для создания и наложения патча IPS. Она рассчитана на ромы
размером до 16 мб. В Zelda вся не сжатая графика и текст хранится до
16 мб, поэтому все будет работать. Возможно, она подойдет и для других ромов
N64, размер которых не превышает 16 мб.
- При редактировании ВСЕЙ графики
(сжатой и не сжатой) и текста, используйте только программы для создания / наложения
патчей APS (Advanced Patching System): Make
APS (создание патча) и xPSapply
(наложение патча).
В Zelda64 сжатая графика хранится после 16 мб,
и при использовании IPS патчей вы не увидите никаких изменений в этой самой
сжатой графике. Если короче - всегда используйте патчи APS для ромов Nintendo
64, и тогда не должно возникнуть никаких проблем.
©
Антон, 2003.
|
| |