1024 x 768 / IE 5+

ОСНОВЫ ПЕРЕВОДА ИГР 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. Без расширения.
Запускаем 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".  И погнали...
Как все это выглядит в игре - можно увидеть в Screenshots, а лучше скачать патч, и поиграть.    
В средней колонке - 16-тиричные обозначения символов. В левой - оффсет.
Если, к примеру, необходимо выделение части фразы цветом, 
вроде "Ты нашел Сердце" - используются пойнтеры.     
В hexposure это будет выглядеть так: "Ns yf*tk .ACth{wt.@" (уже переведенная фраза).     
В данном примере - "" - начало выделения красным цветом. ".@" - конец выделения цветом (любым).    
Значения пойнтеров пишутся в средней части окна: "" = 05 41, а ".@" = 05 40.     

* Вместо Hexposure можно использовать и другие hex-редакторы, 
   вроде Thingy или Hex Workshop. Это кому как удобнее.
3. Описание пойнтеров (программа - Hexposure / другой хес-редактор)
(Информация взята с сайта The Legends of Zelda)

Некоторые значения пойнтеров или их сочетаний неизвестны (или мы точно не знаем - (?)),
поэтому лучше не перемещать их и оставлять на своих местах - там, 
где они находятся в оригинальном (непереведенном) тексте, во избежание зависаний игры.

Разное :
(можно перемещать)

00 = Пустое пространство в роме
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, и тогда не должно возникнуть никаких проблем.

(c) Zelda64RUS team :: site design by Anton :: 2001-2007