Все необходимые программы можно скачать здесь:
www.shedevr.org.ru/zelda64rus/downloads.html
 
ОСНОВЫ ПЕРЕВОДА ИГР 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 символов.
Недостающие нули - всегда , потом оффсет. Всего - 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.

© Zelda64RUS, 2001—2009