|
|
 |
|
ОСНОВЫ ПЕРЕВОДА ИГР 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. Без расширения.
Запускаем 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,
и тогда не должно возникнуть никаких проблем.
|
| |
|