Автор Тема: SDL_ttf.dll  (Прочитано 29435 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #15 : 10 Сентября 2013, 00:45:11 »
Как обычно, залил bitbucket.org:
  • Fake_ttf.dll - только исходники. Элементарно компилируется ассемблером fasm.
  • ChangeTextPy - исходники, а также готовый к употреблению пакет во вкладке Downloads.

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #16 : 13 Сентября 2013, 00:10:50 »
Так, ChangeTextPy более-менее отлажен. Даже удалось решить проблему с Cook - теперь повар это повар, а готовить - это готовить (точнее "Готов" и кусочек буквы "и", но уже не "Пова").

Оказалось, что сделать перевод только на основе ChangeText не получится - кое-где текст начинает обрезаться.

Мои идеи по поводу применения:

- Быливолков и прочих эпических существ можно превратить в верволков, верзебр, и т.д.

- Когда патч убирает артикли the и a, остается пробел, отделявший артикль и следующие за ним слова. Особенно это заметно, когда артикль the стоит перед названием, взятым в кавычки - было "The что-то-там", стало " что-то-там". Теперь артикли по идее можно удалять вместе с пробелами.

- Для правильного согласования текста в скрипт как-то нужно внести информацию о числах/родах/падежах и прочем. Пока что не сильно понятно, как это сделать, но это основное направление, куда нужно двигаться.

- Поиск в менеджере - можно попробовать перенести перевод предметов из trans.txt в скрипт, тогда можно будет искать по английскому названию, а находить будет на русском - к примеру ввели BAD - нашлась КРОВАТЬ. Еще может быть такой побочный эффект, как перевод вводимого текста, хотя если он выводится по буквам, то такого не будет.

Как это работает:

В игра большую часть текста отрисовывается через библиотеку SDL_ttf.dll. Мы этот текст перехватываем, передаем в скрипт на Python, он его переводит, возвращает, мы его передаем в библиотеку, а она уже отрисовывает наш текст.

Что пока не получится:

- Перевести напуственный текст (там где в конце говорится "Strike the earth!"). Выводится не через SDL_ttf.dll.

- Улучшить перевод мыслей и предпочтений и некоторых других экранов. Причина та же.

Если у кого-то есть какие-нибудь идеи по поводу всего этого, предлагайте.
« Последнее редактирование: 13 Сентября 2013, 00:17:37 от insolor »

Оффлайн Arex

  • Старожил
  • ****
  • Сообщений: 407
  • Ленивый дварфовод
    • Просмотр профиля
    • На викидварфии
Re: SDL_ttf.dll
« Ответ #17 : 13 Сентября 2013, 23:22:26 »
Так, ChangeTextPy более-менее отлажен. Даже удалось решить проблему с Cook - теперь повар это повар, а готовить - это готовить (точнее "Готов" и кусочек буквы "и", но уже не "Пова").

Оказалось, что сделать перевод только на основе ChangeText не получится - кое-где текст начинает обрезаться.
Честно говоря, в коде пока не ковырялся, но не пойму, с чем связано подобное ограничение.

Насколько помню, в версии от mialax'а таких проблем не было. Там алгоритм был примерно такой:
  • Считывался весь текст со страницы.
  • В считанном тексте проводились замены по словарю
  • При необходимости текст форматировался (надо было допиливать)
  • Весь текст выводился в окне DF.

Оффлайн Skin36

  • Старожил
  • ****
  • Сообщений: 320
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #18 : 14 Сентября 2013, 01:27:39 »
http://shot.qip.ru/00b0A8-3VVx8ewmV/
вот что пока удалось.
« Последнее редактирование: 14 Сентября 2013, 09:13:59 от Skin36 »

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #19 : 14 Сентября 2013, 01:38:06 »
Так, ChangeTextPy более-менее отлажен. Даже удалось решить проблему с Cook - теперь повар это повар, а готовить - это готовить (точнее "Готов" и кусочек буквы "и", но уже не "Пова").

Оказалось, что сделать перевод только на основе ChangeText не получится - кое-где текст начинает обрезаться.
Честно говоря, в коде пока не ковырялся, но не пойму, с чем связано подобное ограничение.

Насколько помню, в версии от mialax'а таких проблем не было. Там алгоритм был примерно такой:
  • Считывался весь текст со страницы.
  • В считанном тексте проводились замены по словарю
  • При необходимости текст форматировался (надо было допиливать)
  • Весь текст выводился в окне DF.
1. Исходников модифицированной библиотеки SDL_ttf от mialax'а у меня нет, но могу с 99% уверенностью сказать, что по поводу алгоритма ты ошибаешься.
2. Попробуй с помощью его либы заменить "Пова" на "Готовить" и зайти в z -> кухня. Это не связано с алгоритмом работы, а связано с определением ширины "плашки" (SDL_Surface), на которую выводится текст. Кстати, эту версию нужно будет проверить в дизассемблере, т.к. в SDL я уже потихоньку начинаю разбираться.

...

Исходник я нашел. Под спойлером выдержки из него. Правда, я убрал закомментированный код перевода через онлайн-переводчик.
Спойлер
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool Render = false;
int Cur = 0;
int Cur1 = 0;
Uint16 texts[200][80];
HWND df=NULL;
HRGN rgn = CreateRectRgn(0,0,0,0);
bool KeyNum = false;
bool oldKeyNum = false;

RECT rect;

Uint16 cash_eng[65536][80];
Uint16 cash_rus[65536][80];

#define HESH(t)   (((byte)(t[0]))+((Uint16)((byte)(t[1])))*256)

Uint16* TranslRus(Uint16* text, char From)
{
KeyNum = 1;//Control::IsKeyLocked( Keys::NumLock);
if (KeyNum)
{
int leng = wcslen((wchar_t*)text);

bool Small = true;
if (leng > 2)
{
Small = false;
if ( ((text[0])==(70))&&((text[1])==(80))&&((text[2])==(83)))
Small = true;
}
if (!Small)
{
if ((From==0)&&(!Render))
{
////////////////////////////////
int h = HESH(text);
if (memcmp(text, cash_eng[h],leng*2)==0)
{
memcpy(rez, cash_rus[h],sizeof(rez));
text = rez;
}
else
{
////////////////////////////////
memcpy(rez, ChangeText((wchar_t*)text),sizeof(rez));
memcpy(cash_eng[h],text,sizeof(rez));
text = rez;
memcpy(cash_rus[h],rez,sizeof(rez));
}
//////////////////////////////////////
memcpy(texts[Cur],rez,sizeof(rez));
Cur++;
Cur1=0;

}


if ((From==1)&&(!Render))
{
text = texts[Cur1];
}
if ((From==0)&&(Render))
{
text = texts[Cur1];
Cur1++;
Cur = 0;
}

Render = (From == 1);
}
}

return text;
}

int TTF_SizeUNICODE(TTF_Font *font,const Uint16 *text, int *w, int *h)
{
int status;
const Uint16 *ch;
int swapped;
int x, z;
int minx, maxx;
int miny, maxy;
c_glyph *glyph;
FT_Error error;
FT_Long use_kerning;
FT_UInt prev_index = 0;
int outline_delta = 0;
/////////////////////////////////////////////////////////////////////
text = TranslRus((Uint16 *)text, 0);
/////////////////////////////////////////////////////////////////////
...
}

...

SDL_Surface *TTF_RenderUNICODE_Blended(TTF_Font *font,
/* const*/ Uint16 *text, SDL_Color fg)
{
int xstart;
int width, height;
SDL_Surface *textbuf;
Uint32 alpha;
Uint32 pixel;
const Uint16 *ch;
Uint8 *src;
Uint32 *dst;
Uint32 *dst_check;
int swapped;
int row, col;
c_glyph *glyph;
FT_Error error;
FT_Long use_kerning;
FT_UInt prev_index = 0;
////////////////////////////////////mialax
text = TranslRus((Uint16 *)text, 1);
////////////////////////////////////////////
...
}
[свернуть]

Смысл такой:

1. DF собирается вывести какой-то текст. Для начала, он обращается к библиотеке SDL_ttf, чтобы узнать какого размера получится текст на экране. Это делается через функцию TTF_SizeUNICODE. Модифицированная библиотека этот текст на входе подменяет, обратившись к функции TranslRus, которая в свою очередь обращается ко внешней функции ChangeText из библиотеки ChangeText.dll. ChangeText при первом вызове грузит словарь из файла, и ищет перевод по нему. Дальше перевод возвращается в функцию TranslRus, которая его сохраняет в хэш-таблицу, чтобы в следуюущий раз при запросе того же текста уже не обращаться в ChangeText (т.н. кэширование). И дальше уже переведенный текст возвращается в TTF_SizeUNICODE, которая уже возвращает DF размеры переведенного (а не исходного) текста.
2. DF нужно преобразовать нужный текст в изображение. Он обращается к функции TTF_RenderUNICODE_Blended библиотеки SDL_ttf. Модифицированная библиотека его опять же подменяет и в картинку превращается уже не исходный текст, а переведенный. DF как ни в чем ни бывало выводит эту картинку на экран.

Логика моей Fake_ttf примерно та же (подмена выводимого текста), только она служит простым переходником между DF и настоящим SDL_ttf, кроме того передавая текст в ChangeText.dll и из него. Кэширование перевода можно организовать внутри ChangeText.dll. Получилось довольно просто и надежно, и не нужно заморачиваться с компиляцией SDL_ttf.dll.
« Последнее редактирование: 14 Сентября 2013, 03:14:28 от insolor »

Оффлайн keepmind

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #20 : 21 Октября 2013, 23:44:42 »
insolor, можно ли как то текущим скриптом нормально подцепить строки из trans.txt?
PS: Я раскоментировал ваши строки в скрипте где подцепляется trans.txt - часть текста в игре перевелась, а другая нет.

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #21 : 22 Октября 2013, 07:56:58 »
insolor, можно ли как то текущим скриптом нормально подцепить строки из trans.txt?
PS: Я раскоментировал ваши строки в скрипте где подцепляется trans.txt - часть текста в игре перевелась, а другая нет.
В trans.txt лежат "заготовки" строк, патч работает именно с такими заготовками (причем по точному совпадению текста). А скрипт получает готовые строки - где-то сшитые, где-то наоборот порезанные (например режутся начальные двоеточия и пробелы в управляющих меню). Плюс еще здесь более сильные ограничения по длине, чем при переводе патчем.

Оффлайн keepmind

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #22 : 22 Октября 2013, 14:26:38 »
insolor,
1. некоторые переведенные строки в игре оказываются обрезанными, можешь исправить?
2. И еще в DF есть строки с содержанием апострофа(') вот такие например:
"Dyer's Shop"
"Soap Maker's Workshop"
в changetext.py  такие не внесешь.
3. И еще можно ли с помощью changetext.py перевести мысли дварфов, описание тварей(там где текст пишется не буквами а состоит из тайлов)?


Написал небольшую программу для облегчения гугло-перевода)

Краткая инструкция:
1. Перевести changetext.log в отдельный файл, например в translated.log
2. Передать программе эти два файла в параметры(например bat файлом) программе так:
trans_.exe changetext.log translated.log **минимальная длинна строки(чтобы игнорировались строки типа "a","1"...)**
3. В папке с программой появится готовый файл trans_.txt

Сама программа

PS: В архиве еще немного подправленный скрипт changetext.py insolor'a для подхвата полученного файла.
« Последнее редактирование: 22 Октября 2013, 15:39:54 от keepmind »

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #23 : 22 Октября 2013, 15:46:15 »
insolor,
1. некоторые переведенные строки в игре оказываются обрезанными, можешь исправить?
2. И еще в DF есть строки с содержанием апострофа(') вот такие например:
"Dyer's Shop"
"Soap Maker's Workshop"
в changetext.py  такие не внесешь.
3. И еще можно ли с помощью changetext.py перевести мысли дварфов, описание тварей(там где текст пишется не буквами а состоит из тайлов)?


Написал небольшую программу для облегчения гугло-перевода)

Краткая инструкция:
1. Перевести changetext.log в отдельный файл, например в translated.log
2. Передать программе эти два файла в параметры(например bat файлом) программе так:
trans_.exe changetext.log translated.log **минимальная длинна строки(чтобы игнорировались строки типа "a","1"...)**
3. В папке с программой появится готовый файл trans_.txt

Сама программа

PS: В архиве еще немного подправленный скрипт changetext.py insolor'a для подхвата полученного файла.
1. На данный момент нет. Именно поэтому мы пока не можем отказаться от использования патча.
2. Питон поддерживает строки и в одинарных и в двойных кавычках, есть еще способ записи многострочных строк, не помню только какой
3. Нет

Программу посмотрю, возможно сегодня вечером, если будет возможность.

Оффлайн keepmind

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #24 : 22 Октября 2013, 16:06:38 »
1. ясно
2. эта проблема решается внешним файлом trans.txt
3. жаль

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #25 : 22 Октября 2013, 16:29:16 »
1. ясно
2. эта проблема решается внешним файлом trans.txt
3. жаль
2. Это не проблема вообще, я имею в виду что на питоне можно прямо так и написать в двойных кавычках "Dyer's Shop"

Оффлайн keepmind

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #26 : 22 Октября 2013, 16:38:05 »
я понял, просто когда скрипт отдельно, а перевод отдельно так эстетичнее :)

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #27 : 26 Октября 2013, 15:15:01 »
Себе на заметку, как можно будет прикрутить ChangeTextPy к линуксовой версии DF:
http://habrahabr.ru/post/199090/
При желании кто-нибудь может попробовать сделать русификацию линуксовой версии прямо сейчас, не дожидаясь, пока у меня дойдут руки до спецификации формата ELF.
« Последнее редактирование: 26 Октября 2013, 15:29:57 от insolor »

Оффлайн insolor

  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1064
  • Adequate Reverse Engineer
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #28 : 25 Ноября 2013, 16:04:30 »
Если кому интересно, девелоперская версия скрипта changetext.py: https://bitbucket.org/dfint/changetextpy_script/src
Большая часть написана Skin36, я в данный момент занимаюсь причесыванием этого скрипта.

Оффлайн SnaKe

  • Пользователь
  • **
  • Сообщений: 98
    • Просмотр профиля
Re: SDL_ttf.dll
« Ответ #29 : 05 Декабря 2013, 21:53:24 »
Если кому интересно, девелоперская версия скрипта changetext.py: https://bitbucket.org/dfint/changetextpy_script/src
Большая часть написана Skin36, я в данный момент занимаюсь причесыванием этого скрипта.
разработка еще ведется?)  :)