Перевод Iji
Привет, ребята, с вами Кситилон, и сегодня мы попытаемся перевести игру
Это рабочий пост о переводе Iji на русский язык (точнее — как минимум второй попытке перевода, а скорее всего — уже третьей), в котором будет только служебная информация, никакого user/player-friendly контента. В комментариях можно обсуждать детали перевода, в посте всё будет строго по техническому ходу проекта.
http://gamin.me/taxonomy/term/2914/12062#comment-107993 — с этого началась движуха.
http://myothehedgefox.livejournal.com/ — журнал автора прошлых попыток перевода.
http://www.zoneofgames.ru/forum/index.php?showtopic=20348&st=0 — та же попытка перевода.
http://www.old-games.ru/forum/showthread.php?t=42889&page=0 — тоже она.
http://www.remar.se/daniel/iji.php — сайт-источник игры, где также есть переводы.
Задача будет достигнута, когда будет получена такая версия Iji, в которой весь отображаемый текст и спрайты-надписи с текстом — на русском языке.
У нас есть:
- Исходник игры на ГМ5.3, открыто опубликованный автором в интернете на собственной странице.
- Информация о том, что попытка перевода на русский уже была предпринята, причём при согласовании деталей перевода с автором. Отсюда можно заключить, что авторское разрешение на перевод на русский язык у нас уже есть.
У нас нет:
- Лицензионного ГМ5.3 для перекомпиляции. Мы используем крякнутый, и не будем испытывать угрызений совести, так как наш проект некоммерческий, не разжигает межнациональной и прочей розни, и в общем всяко попадает под условия использования, известные как "fair use". Помимо того, GM5.3 это типичный пример abandonware, которое уже не купишь официально, при том что даже хотел бы.
- Возможности просто перекомпилировать под ГМ8.1 — слетит внутренняя логика движка, после 5.3 Овермарс много раз менял движок коллизий, а также имена, параметры, и смысл вызываемых в этом исходнике функций.
Что можно сделать:
- Взять уже откомпилированную игру и допатчить её до "русского состояния", скажем так. Писать кастомный экстрактор-импортер ресурсов с конвертацией спрайтов в PNG и обратно. Это совсем накладно. После выяснения проблем с длинами текстов это уже совсем неактуально, а делать перевод-огрызок в традициях старых пиратов-русефекаторов я не хочу.
- Перекомпилировать игру под 5.3, если он появится. Тексты всё равно должны быть вставлены вручную, так как исходник написан совсем без расчёта на локализацию.
- Портировать исходник на 8.1 либо другую версию ГМ с лицензией. Это потребует вмешательства в код игры, что довольно непросто. Вернёмся к этому варианту в крайнем случае, но пока таких обстоятельств не предвидится.
В абсолютно любом случае, неминуемо нужно будет:
- Перерисовать спрайтовые шрифты и спрайтовые надписи.
- Перевести сам текст.
Важная проблема: если перерисовывать спрайты и переводить текст во внешних файлах, нужен кто-то, кто будет долго и муторно вставлять это обратно в исходник. Пока что продолжаю думать над тем, какое конкретно решение принять. Так и будет. Спрайтов на самом деле не так много, как я думал, а с текстами ещё посмотрим, может выйдет написать импортер во внутренний формат GMD.
In script scr_nukedraw line 8 pos 74: Wrong number of arguments to function or script.
In script scr_firekey line 786 pos 14: Unknown function or script: sprite_restore
In script scr_mainmenu line 209 pos 10: Unknown function or script: screen_gamma
In script scr_menutext line 204 pos 6: Unknown function or script: draw_text_sprite
In script scr_sabotcreate line 150 pos 2: Unknown function or script: sprite_restore
In script scr_sound line 33 pos 10: Unknown function or script: sound_frequency
In script scr_topmessage line 29 pos 6: Unknown function or script: draw_text_sprite
In script scr_herosabot line 230 pos 30: Wrong number of arguments to function or script.
In script scr_heromain line 59 pos 30: Wrong number of arguments to function or script.
In script scr_huddraw line 69 pos 51: Wrong number of arguments to function or script.
In script scr_sabotcreate4 line 196 pos 6: Unknown function or script: screen_gamma
In script scr_drawshape line 33 pos 6: Unknown function or script: draw_polygon_begin
In script scr_facecreate line 121 pos 6: Unknown function or script: screen_gamma
In script scr_loadingdestination line 5 pos 6: Unknown function or script: screen_gamma
In script scr_drawtime line 21 pos 10: Unknown function or script: draw_text_sprite
In script scr_zcir line 38 pos 14: Unknown function or script: screen_gamma
In script scr_seczmusicplay line 6 pos 10: Unknown function or script: sound_frequency
In script scr_drawunlocks line 46 pos 2: Unknown function or script: draw_text_sprite
In script scr_sabotcreate2 line 10 pos 10: Unknown function or script: sprite_restore
In script scr_sabotcreate3 line 4 pos 2: Unknown function or script: sprite_restore
In script scr_mainload line 7 pos 2: Unknown function or script: sprite_restore
In script scr_shreddersfx line 26 pos 10: Unknown function or script: sound_frequency
In script scr_loadcuts line 3 pos 2: Unknown function or script: sprite_restore
In script scr_loadmusic line 12 pos 60: Wrong number of arguments to function or script.
In script scr_proximaarrow line 51 pos 10: Unknown function or script: draw_polygon_begin
In script scr_voice line 402 pos 14: Unknown function or script: sound_frequency
In script scr_pausemenudraw line 14 pos 2: Unknown function or script: draw_text_sprite
In script scr_turretchargetell line 3 pos 10: Unknown function or script: sound_frequency
In script scr_cleardraw line 27 pos 10: Unknown function or script: screen_gamma
Оффсеты внутренних GM-ресурсов оригинального (официального) исходника Iji iji_16_6.gmd, 16 617 077 байт, изменён 15 января 2011 г., 14:01:34, взятого с сайта автора 16 февраля 2014 г., 20:34:18
0x006A39 snd_wea_imach (первый звук)
0x70D7DD spr_block (первый спрайт)
0x8DDBC6 bg_tile1 (первый фон)
0x995163 scr_knockdown (первый скрипт)
0xAD4F97 tim_getribbon (первый таймер?)
0xAEC3C7 obj_iji (первый объект)
0xC39FFA rom_main (первая комната)
До первого звука идут какие-то невнятные, возможно зашифрованные данные, а также название игры, автора, и годы работы над игрой.
После последней комнаты возможно идёт Game Information (которой здесь нет), и список всех ресурсов игры с их относительными оффсетами и/или идентификаторами (?).
Слово "первый" здесь означает "первый в файле". Идентификаторы этих "первых" ресурсов могут и не быть равны нулю, так как в ГМ идентификаторы ресурсов инкрементируются вне зависимости от уже удалённых.
0x90 01 00 00
Она может быть признаком либо начала, либо конца (не выяснено) соответствующей структуры данных. В некоторых случаях повторяется в пределах одного ресурса (либо есть ресурсы, которые невозможно идентифицировать через хекс-редактор).
Всего сигнатур в файле 3759. Хотя уникальность сигнатуры в 4 байта и достаточно высока, эта сигнатура используется внутри формата также для других целей, помимо разделения ресурсов — она разделяет ещё и события внутри объектов (возможно и ещё что-то). Кроме того, эти байты могут быть встречены в сыром потоке данных, не являясь метаданными вообще, но соответствуя четырёхбайтовому значению сигнатуры. Поэтому эта величина (3759) вмещает в себя количество всех ресурсов игры, сложенное с количеством событий в объектах, а также количеством неуточнённых разделителей, если таковые есть, и, наконец, с количеством "сырых" неактуальных совпадений с потоками данными ресурсов. В любом случае она преувеличена, и дальнейший анализ этого пока не нужен.
Кроме того, комнаты не разделяются этой сигнатурой. После первой комнаты более 20 этих сигнатур, но они там не имеют функции разделителя. Комнаты разделяются сигнатурой 0x08 02 00 00 16 00 00 00. Что-то неуточнённое внутри них (объекты?) разделяется сигнатурой 0x80 14 00 00, но не всегда. Пока что оставлю этот анализ.
Регулярное выражение для выцепления всех текстов с целью проверки их на влезание в диалоговое окно (три строки по 65 символов и четвёртая — 63 символа (на последних двух расположен элемент интерфейса)):
text[d+]="[^"]*"
И соответствующий приемлемый конструктор с экранированным литералом (дичь, правда?) для объекта BCL .NET (проверено в 2.0):
new global::System.Text.RegularExpressions.Regex("text\\[\\d+\\]=\"[^\"]*\"");
Вспомогательная программа IjiMessageBox для автоматической проверки:
https://dl.dropboxusercontent.com/u/75034586/Translations/Iji/IjiMessageBox.exe
Принимает на вход iji scripts.gml (экспортированные скрипты из исходника), и пишет результат проверки в Result.txt после нажатия кнопки Batch. Либо можно проверять выбранный текст прямо в окне. Или даже переводить прямо там. Поддерживаются два типа разбиения — автоматическое самим компонентом TextBox из WinForms, и моё написанное с нуля "правильное". Естественно, первым типом текст разбивается автоматически при вводе.
Что нужно исключить при фильтровании тупо-забранных-из-кавычек текстов:
scr_sound("...")
Что нужно обязательно забрать:
.textid="..."
.topmessage="..."
loc="..."
(список видимо ещё неполный, но я буду смотреть по остаткам от фильтрации scr_sound, а не забирать только то, что в белом списке)
- 19 февраля 2014, 15:37
- 010
62 комментария