29 день
Первого зерна
ElderScrolls.Net

Как я переводил Daggerfall…

Автор: Rainfall

Все, что написано ниже — плод воображения автора. На самом деле он никогда не играл в Daggerfall и боится подходить к устройствам, содержащим более трех кнопок. Все картинки нарисованы вручную в Gimp по заказу автора, любые совпадения названий и прочего случайны, а код на Паскале является преобразованным в текст потоком данных с генератора случайных чисел. Если требуются какие-то дополнительные разъяснения, пишите.

Идея

Идея перевода Дагерфолла возникла практически сразу после того, как я купил «русскую» версию игры. Купил — выкинул — продолжил играть в английскую, но идея осталась. Я рассматривал fall.exe, другие файлы, раздумывал над возможностью перевода, но… Все упиралось в шрифт. Русских букв в шрифте Даггера не было, а 12 английскими из тех, что похожи на русские довольствоваться не хотелось бы.

Потом наступил февраль 2001 года, я писал курсовую работу, в которой работал с символами текста. Поизучав структуру шрифта в текстовых режимах экрана, я понял, как составляются буквы. Вторым, что я понял, было то, что шрифт Даггера, в принципе, ничем не отличается от шрифта 8×16. Итак, все было готово для создания шрифта и последующего перевода игры.

Проблемы перевода

В этой игре, как и в многих других, основная часть текста интерфейса, предметов, внутриигровых сообщений и прочих описаний, ныходится в исполняемом файле. Лежит оно вместе с программным кодом, поэтому добавлять текст в файл нельзя — текст «залезет» в сегмент с кодом или просто сместит этот код, что неизбежно создаст массу проблем.

Отступление для программистов: я пытался дописывать текстовые строки в конец файла и найти ссылки на них, но… Умения не хватило. Ссылки видно, я их меняю, но не дает это ничего! И длины строк тоже видны, но не меняются.

Так что переводить надо «буква в букву». Меньше можно — остаток места заполняется пробелами нулевой длины (их не видно и текст не смещается). Из-за этого и возникает первая проблема.

Средняя длина слова в английском языке — 5 букв, в русском — 8 или 9. Часто бывает так, что короткий синоним к английскому слову подобрать не удается. Классический пример — «USE». Слова «использовать» или «применять» как-то не влезают в трехбуквенный лимит. Еще пример — со времен первой Kyrandia — искали четырехбуквенный перевод слова «open». Вроде пока не нашли. А всем любителям Даггера известен перевод слова «axe» как «меч». У меня это «тпр», но это мало что меняет. Короче, первая проблема — уместить перевод в заданное английским текстом количество букв.

Вторая проблема куда серьезней. Языком C++ тут не обойтись, тут нужен русский.
Игра составляет многие текстовые сообщения из кусочков. Например:
The Mages Guild formed an alliance with Knights Mentor.
По идее, русский перевод должен выглядеть так:
Гильдия Магов заключила союз с Наставником Рыцарей.
А выглядит он вот так:
Гильдия Магов заключил союз с Наставник Рыцарей.
Почему так? А вот почему.

В игре это будет выглядеть как «%fcn formed an alliance with %fcn». %fcn — это названия политических сил, действующих в мире Даггерфолла. Их названия лежат в faction.txt открытым текстом, смотрите, кто хочет. И лежат они там только в именительном падеже. А падежей у нас шесть, и слова в зависимости от них изменяются. Вот и заключает несклоняемый и несгибаемый Наставник Рыцарей союз с Гильдия Магов. (Конечно, можно сделать «Гильдия Магов и Наставник Рыцарей заключили союз». Можно. Но далеко не всегда.)

С союзничками разобрались, остался глагол — сказуемое. Он в русском языке изменяется в зависимости от рода подлежащего. В английском так не бывает — «He said» и «She said». А в файле записана только одна форма глагола, и неизвестно, какого рода существительное в предложение подставят. Вот в таких ошибках и состоит вторая проблема.
(Простите меня, господа лингвисты, говорю не так, как надо, а так, как понимаю).

Ну и еще несколько стандартных ошибок, которые не следует совершать:

Не следует думать, что незнакомое слово, составленное из двух знакомых, будет иметь именно такой смысл, какой образуется из двух слов. Довольно непонятно, но можно привести пример. Есть в Даггере такое заклинание — Frostbite. Frost — мороз, иней; bite — укус. Я не подумал, и перевел это как «укус мороза». Словарь же утверждает, что лучше было бы «обморожение».

Часто бывают ошибки в переводе похожих друг на друга слов или слов с несколькими вариантами перевода. Говорят, что в одном из переводов Baldur’s Gate слово «Bow» было переведено как «поклон», а «Missile Weapons» — как «ракетное оружие».

Постарайтесь выписать или запомнить принятые вами варианты перевода слов и имен. Иначе «цеп» может именоваться «кистенем», а «Ватсон» — «Уотсоном».

Манипулировать со строками нужно с крайней осторожностью. Не стоит удлинять их в fall.exe или менять место начала строки. Иначе можно получить на экране кучу непонятных символов. Те же правила желательно соблюдать со всеми остальными файлами кроме книг, квестов и text.rsc (для этих трех есть нормальные редакторы).

Как оно устроено

Тексты во всей игре расположены по самым разным местам. Во-первых, это сам запускаемый файл fall.exe. В этом файле лежит почти весь текст интерфейса игры, весь инвентарь, названия постоялых дворов и магазинов и еще куча всего. Естественно, его надо пропатчить до самой последней версии, и только потом переводить. Первая проблема возникает в основном из-за него. Например, пришлось составлять список слов, из которых генерируются названия таверн и делать перевод «буква в букву» всех существительных. К тому же все эти слова должны были быть мужского рода — в таверну «Смелый Королева» заходить как-то неприятно.

Основная часть текста лежит в файле text.rsc. С ним проблем, в основном, не возникает. Иногда, когда вместо прямого текста подставляются переменные, может возникнуть вторая проблема (пример с Наставником выше). В этом файле около 1400 блоков текста, размером от 24 килобайт до трех байт. Перевод этой части игры легче практически всего остального, утилиты для выдирания текстовых кусков из файла и записи этих кусков обратно в файл давно есть. Существует и утилита под Win32, но о ней я узнал только в 2003 году.

Самый крупный и самый проблемный файл — maps.bsa. В нем нам интересны географические названия. В игре 16 000 локаций, а название каждой из них повторяется в файле как минимум трижды. К тому же, все эти названия строятся по шаблонам, так что обе проблемы здесь встают во весь свой 21-меговый рост.

В отдельном каталоге лежат книги. Их я почти не касался, программы для их редактирования существуют и проблем с ними никаких не возникает. Еще в игре есть около 350 квестов. Проблема с ними одна — берут числом :-)

rf_s01

Надо сказать, что я поставил все дополнительные квесты, которые нашел (все тот же www.m0use.net/~uesp), чтобы можно было перевести и их. Для них программы тоже есть, о них будет рассказано позже.

Файлы биографии. Это те самые «12 вопросов», которые задаются при генерации персонажа (все стараются вытащить себе ebony dagger). Файлов всего 18, 17 для основных классов и 1 для Custom-класса (хотя есть сильное подозрение, что для собственного класса игра может задавать вопросы из разных файлов.

В файле flats.cfg нет никаких плоскостей, зато есть краткие словесные портреты всех людей, с которыми можно поговорить (Гортвог, например — «Царственный орк»).

Magic.def содержит названия всех артефактов, что есть в игре, и суффиксы и префиксы к генерируемым игрой магическим предметам. Проще некуда.

В monster.bsa — названия монстров (поразительное соответствие :)

Namegen.dat содержит кусочки имен из игры. Можно менять как угодно, главное — не делать их слишком длинными.

И, наконец, spells.std — заклинания из игры. Все, что есть по умолчанию. Есть и скрытые — например, «!Lycanthropy». Игроки с хорошей памятью узнают то, что вызвало баг с «бесплатной» обкастовкой раз в день и обкастовкой за четверть «цены». (в начало заклятия ставился ! или $).

Надо знать, что текст в Даггере формируется не совсем теми же символами, что и в DOS и WINDOWS. В тех случаях управляющими символами были первые 32 из таблицы ASCII, здесь же — последние 4.

Символ 0xFCh аналогичен ENTER для строк, выровненных по левому краю экрана.

0xFDh — То же самое, но для отцентрованных строк.

0xFEh обозначает конец элемента с текстом. Это везде — и в text.rsc, и в секциях квестовых файлов. Следующий за этим символ начинает новый элемент.

0xFFh — случайный разделитель. Из нескольких строк при выводе их на экран будет выбрана одна (естественно, каждый раз выбираются разные строки). Например, таким образом выдаются случайные результаты при карманном воровстве, приветствия в разговорах и вводные для квестов.

Слово, начинающееся с символа «%» — внутренняя переменная игры. Например, %pcn — имя героя, %ra — его раса, %jok — тупая шутка. Менять не надо.

Слово, начинающееся с «_» — тоже переменная. Встречается в квестах, перевода не требует.

Инструментарий

Надеюсь, ни одному фанату Даггерфолла не надо объяснять что такое MS-DOS. А игра именно под эту систему :-) Ну, какова цель — таковы и средства:

  • Necromancer’s Dos Navigator. Хорошая оболочка. Пользуюсь ей до сих пор. Нужны были умные таблицы перекодировки и многооконность.
  • Набор утилит, скачанных с m0use. Bookedit, DFTEXT, просмотровщик графики, редакторы квестов и книг. Чтобы достать весь текст, была написана небольшая прога, которая запускала DFTEXT номер_текста_в_файле и сохраняла выходной файл в каталог DFTEXT. Ее исходник дан ниже.
  • Собственные программки для смены раскладки текста по таблице (qwer -> йцук). То же самое реализуется в Punto Switcher через Shift+Break, но у меня другая раскладка.
  • Andypic версии 3.2 для просмотра, доставания и обратной запаковки графики.
  • QVIEW. Аналог HIEW. Кто знает — тот знает, остальным хватит и UltraEdit.

И две программы под Win:

  • Photoshop 5.0. Для такого мастера клавиш «Ctrl+С» и «Ctrl+V» как я, сгодилась бы и третья версия, но была только эта. Всего работы — вырезать старые буквы, заменить фон на пустой, вставить новые буквы.
  • UltraEdit. Хороший текстовый редактор, поддерживающий HEX, RegExp и замену во многих файлах одновременно. Сойдет любая версия, начиная с 9.0.

Надо заметить, что при доставании из text.rsc элементов текста программой DFTEXT эти элементы портятся. Из них удаляются спецсимволы (см. выше). ENTERы программа оставляет, но случайные разделители надо восстанавливать вручную.

Шрифт

rf_fonts

Не буду подробно описывать структуру шрифта (а всего в Даггере их 5), достаточно сказать, что пикселя записываются битами цифр, буквы могут быть большими (16 на 16 пикселей), а в начале файла шрифта записывается ширина буквы. Расшифровка всего этого заняла 2 недели, примерно столько же заняли раздумья на тему «как же переделывать шрифт». Решил, что клавиатурное соответствие подойдет (то есть букве «q» будет соответствовать «й», а «&» — «.» Переводил и прописные, и строчные буквы. Это только потом я догадался написать программу, а тогда я извел солидную пачку листов в клетку и еще 2 недели сидения перед монитором по вечерам.

Знаки препинания расставлены как в DOS. Хотя шрифтов и 5, но я поменял самый мелкий шрифт на стандартный, а указатели на готический сменил на него же. Это сделано потому, что в мелкий шрифт буквы «Ж,Щ,Ш,Ы,Ф» и (может быть) некоторые другие просто не влезут, а для русификации готического шрифта у меня не хватит способностей к рисованию.

Для графики же я записал в отдельный файл все 3 шрифта, встречающихся в игре. Первый шрифт можно увидеть на экранах создания персонажа. Он высокий, тонкий и угловатый. Второй — обычный шрифт игры. Он виден на экране состояния персонажа (вызывается по F5). Пониже, потолще и более разноцветный. Третьим же шрифтом выводятся все текстовые сообщения. И потом, при редактировании графики оставалось только копировать и вставлять нужные буквы.


[+] Листинг программы для перевода шрифтов

Экзешник

В первую очередь я взялся за fall.exe. Текста в нем немного, но он критически важный, поэтому русифицированная версия выглядит некрасиво. Вообще там лежат почти все меню игры, ее ответы на действия игрока, названия провинций, таверн и магазинов, предметы, зелья, репутации и ранги в гильдиях и некоторая другая информация. Проблема перевода «буква в букву» здесь достает постоянно. Некоторая свобода есть только с инвентарем и зельями. (Там названия и свойства предметов представлены как запись — кто знает Паскаль, тот поймет. Под название предмета отведено 24 символа, лишние же буквы можно затереть нулевыми байтами). Попытки затереть так же другие строки закончились неудачно. Затирание пробелами не спасало положения — текст деформировался и «уезжал» с нужных мест. Пришлось пожертвовать символом «*», сделать его пустым, дать ему ширину в 1 пиксель и забивать им ненужное место.

Как вы можете судить по моим предупреждениям, попытки нарастить файл не увенчались успехом. Получив несколько замечательных крахов системы, я отказался от идеи «наращивания» файла, зато получил идею «резервного копирования». После перевода многих сообщений я прекратил работу над fall.exe и взялся за создание персонажа. Перевод так и остался кривым, но то, что я прекратил работу не значит что я забросил экзешник совсем.

Квесты

rf_s03

Все тексты квестов находятся в файлах с именем *.qrc. Для них есть свои редакторы. Я пользовался DMPQuest 1.3, скачанным с m0use. Квесты редактируются абсолютно нормально, главное — соблюдать порядок строк и не ставить лишних спецсимволов. Их редактор представляет в виде тегов (например <255>). Единственная несовместимость возникает из-за знаков «меньше» и «больше», которые у меня соответствуют буквам «Б» и «Ю». Редактор при сохранении воспринимает их как начало и конец тега, не находит такого и портит квест. Проблему я решил, исправив в DMPQUEST.EXE эти символы на «$» и «|» вот так:

This patch was made via C2U/486, v0.10c, from Professor Nimnull

Difference(s) between DMPQUEST.EXE & DMPNEW.EXE
DMPQUEST.EXE
000436FC: 3C 24
00043708: 3E 7C
00043920: 3C 24
0004392C: 3E 7C
00045EF8: 3C 24
00045EF9: 3E 7C
00045EFC: 3C 24
00045F00: 3E 7C
00045F04: 3C 24
00045F08: 3E 7C
00045F0C: 3C 24
00045F10: 3E 7C
00045F14: 3C 24
00045F18: 3E 7C

Несовместимость была исправлена, правда начисто исчезла подсветка тегов и текст выглядит не так красиво. А именно эти символы я выбрал потому, что в текстах Даггера они не встречаются ни разу.

В остальном же тексты квестов редактируются нормально, никаких ограничений по объему я пока не заметил.

Карта

Как я уже писал, в этом файле находятся данные о примерно 16 000 локаций. Причем названия составлены из заранее определенных кусочков. Чтобы перевести все эти названия нужно очень много свободного вредени и очень длинный срок жизни. Поэтому надо было автоматизировать работу.

При разборе файла text.rsc я нашел несколько элементов с названиями. В частности, это 4075 и 4076 для храмов официальных религий Тамриэля, 4050 для храмов древних религий, 4051-4054 для кладбищ, ферм, замков и усадеб и 8100, 8200-8215 для подземелий. Про названия городов поговорим отдельно.

Допустим, обычные куски названий можно было перевести, чем я и занялся. Но через два дня обнаружил крупную проблему. Мешали слова «the» и «of». Я долго мучался, пытаясь найти длинные переводы, чтобы убрать эти два слова, но толку было мало. Ну каким длинным словом можно перевести «The excavation of что-то-там»? Потом решил перенести эти слова в конец названия, чтобы потом забить их пробелами. Здесь и пригодился UltraEdit.

Он поддерживает регулярные выражения — сложные составные формулы для поиска и замены текста по шаблону (вот завернул!) Например, этим я пользовался для замены «The Morgosa Tunnel» на «Morgosa The Tunnel»:

^(The^)^( ^)^([a-zA-Z^{^}^[^]]+^)^( ^)^(Tunnel^)

заменить на

^3 ^1 ^5

Естественно, вместо Morgosa может быть любое другое имя. А чтобы заменить это на «Morgosa Tunnel The» надо поставить ^3 ^5 ^1 и т.д. Подробно описывать регэкспы не стану, они очень точно и с примерами описаны в справке UltraEdit.

После долгих переносов все было готово для перевода. Нужна только одна предосторожность — записывайте, ЧТО и КАК вы перевели. И если вы перевели «Temple» как «Собор», то «Cathedral» нельзя переводить так же! Иначе получится много локаций с одинаковыми именами, в половину из которых вы просто не сможете попасть.

Куски названий городов нигде отдельно не прописаны, но угадываются интуитивно. Проще всего редактировать названия городов северных провинций, сложнее — южных. Из каких кусков состоят названия Chesterwark и Chesterwick — понятно всем. А на сколько кусков разбивать названия Bubyrydata и Bybopada?

И последнее предостережение для редактирования карты и вообще любых файлов. Не стоит их править при запущенной игре. У Daggerfall проблемы с доступом к уже открытым файлам, при попытке открыть такие он просто вылетает в DOS.

Графика

rf_s02

Мало что можно сказать о графике, но алгоритм работы здесь таков:

  1. Находим утилиту Andypic, помещаем ее в каталог Dagger\Arena2 и переименовываем в a.exe для краткости.
  2. Набираем A.EXE filename /B:PCX_filename, где filename — имя файла с графикой (IMG/CIF/TEXTURE), а PCX_filename — имя файла, куда запишется картинка в формате PCX.
  3. Редактируем в Photoshop все, что нам надо, следя за правильным выбором цветов из палитры.
  4. Записываем обратно командой вроде A.EXE filename /B:PCX_filename /S

Есть вариант, что Andypic пожалуется на отсутствие сведений о ширине и высоте картинки. Тогда прийдется дописывать эти данные вручную. Для этого добавляем в начало файла 12 нулевых байт. В пятый и шестой записывается ширина картинки, в седьмой и восьмой — высота. (Назначение остальных байт мне неясно, но и без них все работало. Если что-то откажется работать, то можно подставить остальные байты из любого другого файла.) Естественно, в шестнадцатеричной системе, естественно в обратной нотации. Высота и ширина угадываются интуитивно, умноженные друг на друга они дают размер файла до вставки 12 байт. (Например, 64000 байт — 320 х 200). Ширина не может быть больше 320, высота — больше 200. Для поиска простых чисел — делителей числа можно пользоваться этой программкой:

program factorizer;
uses crt;
label 10;
var n,m,k : longint;
begin
clrscr;
write('Введите число для разбиения : ');readln(n);
m:=2;
10: if n>1 then for k:=m to round(sqrt(n)) do
begin
if (n/k)=round(n/k) then
  begin
  write (k,' * ');
  n:=round(n/k);
  m:=k;
  goto 10
  end;
end;
write(n);
readkey;
end.

После редактирования и сохранения обратно в файл желательно эти 12 байт удалить, дабы Даггер не возмущался. Еще можно работать с утилитой Dagpic, но и она тоже жалуется на отсутствие размеров картинки.

Имена, фракции, магия, биографии

rf_s00

Имена в игре генерируются случайно. «Кусочки» для генерации имен лежат в файле namegen.dat. Правда, далеко не все из этих кусочков используются, например я не видел в игре ни одного «греко-римского» имени, хотя кусков для таких имен — в избытке. Редактируются стандартно, по 10 байт на кусок, лишние байты забивать нулями.

Фракции — политические силы, действующие в провинции Хаммерфелл. Их названия (и не только) хранятся в faction.txt. Редактируются без малейших проблем в UltraEdit.

Магия — magic.def и spells.std для артефактов и спеллов, соответственно. В первом случае — 32 байта для имени, во втором — 25. Лишние байты забивать знаете чем.

Файлы биографии редактируются UltraEdit-ом, лучше всего через замену во многих файлах, т.к. вопросы повторяются по многу раз. Шаблон имени файла — biog??t0.txt

Экзешник возвращается

Но все это переводилось без проблем и затруднений. Интересная работа быстро превращалась в обезьянью, так что я забыл о решенных проблемах и вспомнил о нерешенных. В частности, проблемы с непомещающимся в fall.exe текстом оставались. Я вспомнил о том, что когда-то знал Ассемблер и загрузил экзешник в IDA 3.76, чтобы увидеть ссылки на текстовые строки и перенаправить их в конец файла. Строки-то я увидел, ссылки на них тоже, но их изменение ничего не изменило :) Энтузиазм быстро угасал.

Это были не совсем ссылки, не прямые указатели на адреса строк в памяти, а только байты с длинами этих строк. Но удлинить одну из строк за счет другой не получалось. Игра упрямо выдавала те же строки, укорачивая их ровно в тех местах, в которых надо. Указатель же на начало этого «массива» строк я не нашел. Да если бы и нашел, то изменить исходный сегмент на нужный было бы мне не под силу. Я возвращался к IDA-нутому исходнику еще несколько раз, но безрезультатно. (Для интересующихся — названия скиллов начинаются с 1B6227h для версии 2.13. Кое-что еще лежит на 1B9F0Ah, остальное я успел забыть).

Мелочи

Совершенно отдельно стоят сообщения игры об ошибках и конфигуратор звуковой карты. Их следует переводить нормальными русскими буквами в кодировке DOS (866), естественно «буква в букву», но места обычно хватает. Инсталлятор же самой игры перевести не удалось — вроде бы шрифт зашит в самом install.exe, но где он там, и как его менять — неизвестно.

Добавить комментарий

Или

© 2000—2024 ElderScrolls.Net. Частичная перепечатка материалов сайта возможна только с указанием ссылки на источник.
Торговые марки The Elder Scrolls, Skyrim, Dragonborn, Hearthfire, Dawnguard, Oblivion, Shivering Isles, Knights of the Nine, Morrowind, Tribunal, Bloodmoon, Daggerfall, Redguard, Battlespire, Arena принадлежат ZeniMax Media Inc. [25.67MB | 62 | 0,869sec]