Перейти к содержимому
Zone of Games Forum

Рекомендованные сообщения

Некоторые маленькие игры создаются полностью на технологии Adobe (Macromedia) Flash или Adobe Flex.

Иногда встаёт вопрос: "как их русифицировать?"

В этой теме я постараюсь подробно описать, как мне удалось в такой игре заменить шрифт и перевести несколько строк текста без ограничений на длину строки (как решить эту проблему в играх не на Flash'е я немного писал тут: Длина строки).

Речь пойдёт об игре VVVVVV.

 

  Скрытый текст (кликните чтобы развернуть/свернуть) (Показать содержимое)

Вся игра заключена в один файл: VVVVVV.exe (40 Мб)

Создана она на Flash'е (или на Flex'е), поэтому её exe-шник можно открыть и подредактировать в программе Flash Decompiler Trillix (или любом другом Flash-декомпиляторе).

Но сохранить отредактированный файл можно будет только как SWF, но нам нужен EXE.

Что представляет из себя файл VVVVVV.exe ?

На самом деле он "склеен" из двух файлов:

Flash-плеер.EXE и Flash-ролик.SWF

и в конец получившегося файла добавлено 8 байт:

4 байта: $FA123456

4 байта: размер SWF-ролика.

(так работают простейшие конверторы swf -> exe, в роли Flash-плеер.EXE они могут использовать Adobe Flash CS4\Players\FlashPlayer.exe, в нашем случае нельзя заменять оригинальный плеер игры)

Наша задача заключается в том, чтобы разделить VVVVVV.exe на Flash-плеер.EXE и Flash-ролик.SWF, отредактировать SWF, а затем опять склеить эти 2 файла в VVVVVV.exe, добавив в конец число $FA123456 и размер нового ролика. Для разъединения и склеивания можно воспользоваться какой-то готовой программой.

Разъединили.

Меняем шрифт (в оригинальном шрифте нет русских букв).

Открываем Flash-ролик.SWF во Flash Decompiler Trillix. Находим в разделе Images картинку со шрифтом:

839576.jpg Извлекаем, добавляем русские буквы: 839582.png

Заменяем в Flash Decompiler Trillix картинку со шрифтом на нашу. Сохраняем отредактированный SWF-ролик.

Чтобы посмотреть новый шрифт в игре склеиваем Flash-плеер.EXE и Flash-ролик.SWF, добавляем в конец служебные 8 байт. Запускаем, смотрим что получилось.

 

  Скрытый текст (кликните чтобы развернуть/свернуть) (Показать содержимое)

Переводим текст меню.

Открываем наш Flash-ролик.SWF в HEX-редакторе, ищем ASCII-строку "start game".

 

  Скрытый текст (кликните чтобы развернуть/свернуть) (Показать содержимое)

Можно перевести, но символов недостаточно, чтобы написать "НАЧАТЬ ИГРУ".

Замечаем, что байт перед этой строкой обозначает длину строки: 0A (10.)

Но мало изменять лишь этот байт - игра не запустится или зависнет.

 

  Скрытый текст (кликните чтобы развернуть/свернуть) (Показать содержимое)

Разбираем формат SWF-файла, чтобы узнать, как изменять длину любой строки.

Для этого я воспользовался официальной спецификацией формата SWF (на англ. языке): SWF File Format Specification, Version 10 (последнюю версию всегда можно взять с оф.сайта).

Итак, любой SWF-файл состоит из заголовка файла (SWFHeader) и идущих следом друг за другом независимых блоков (TAG-ов).

Если заголовок начинается с CWS, ролик сжат, и нужно его сначала чем-то распаковать. В нашем случае он начинается с FWS – всё в порядке.

Каждый TAG имеет свой формат и содержит разные данные (есть tag со шрифтом, tag со звуками, tag со скриптами и т.д.).

Каждый TAG можно изменять/удалять/добавлять независимо от остальных (в разумных пределах). Нужно лишь в заголовке файла изменять одно значение - FileLength (смещение: 04) - размер всего SWF-файла.

 

  Скрытый текст (кликните чтобы развернуть/свернуть) (Показать содержимое)

Написав по этой документации небольшую программку, я смог составить список всех TAG-ов в нашем Flash-ролике.SWF

 

  Скрытый текст (кликните чтобы развернуть/свернуть) (Показать содержимое)

Строка "start game" находится по смещению 22562DD, а это значит, что она содержится вот в этом TAG'е:

TAGtype = $52 TAGlen = $16C20A TAGpos = $2192BB4 TAGname = DoABC

(тип DoABC означает, что в этом теге содержится байт-код, который выполняет виртуальная машина ActionScript, а это усложняет отладку в программах вроде OllyDbg и SoftIce, однако, это же означает, что данный код не содержит абсолютных адресов, что упростит его изменение – мои догадки)

Начинается он со смещения 2192BB4, переходим сюда в HEX-редакторе. Попадаем на заголовок TAG'а. Первые 2 байта нас не интересуют (они содержат тип тега), далее идёт 4 байта, в которых указывается размер тега. И если мы увеличим длину строки в этом теге, то и размер тега нам тоже надо увеличить.

Итак, выяснили, чтобы заменить строку "start game" на "НАЧАТЬ ИГРУ" (наша строка на 1 байт длиннее) нужно сделать следующее:

1) заменить текст, вставив один лишний символ

2) перед строкой указать правильную длину строки: вместо 0A пишем 0B (11.)

3) указываем в заголовке тега длину на 1 больше, чем было

4) указываем в заголовке файла длину на 1 больше, чем было

Всё! Склеиваем Flash-плеер.EXE и отредактированный Flash-ролик.SWF, дописываем в конец 8 служебных байт, запускаем смотрим.

Если ничего не напортачили, всё будет работать. Вот, что у меня получилось после перевода таким методом двух пунктов меню:

 

  Скрытый текст (кликните чтобы развернуть/свернуть) (Показать содержимое)

Осталось лишь отшлифовать шрифт, чтобы аккуратней был, и перевести весь остальной текст. И очевидно, что изменять каждую строку лучше не вручную... :)

Изменено пользователем enz°
  • Лайк (+1) 1

Поделиться сообщением


Ссылка на сообщение

@SkeleTos 

Перешли файл *.swf, посмотрю так ли это

А дальше будет видно, если в этом причина, то надо делать через программу Adobe Flash CS6 — шрифт и переносить в твой *.swf

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас



Zone of Games © 2003–2025 | Реклама на сайте.

×