По поводу обрезания текста. Жаб, к сожалению, не знает, для чего в SDL_ttf функция TTF_SizeUNICODE, поэтому определяет размеры выводимого текста, взяв "самую широкую" букву - латинскую букву M, и умножив ее ширину на количество выводимых символов. В результате, если попытаться через SDL_ttf переводить "Quit" как "Выход", то получится "Выхо" и маленький кусочек буквы д.А размер буквы M он получает через библиотеку? один раз ?
Отсюда вывод: использовать перевод через SDL_ttf как самостоятельное решение не получится, а только вместе с имеющимся патчем-переводчиком, с целью устранения нестыковок грамматики, например, и перевода где-то глубоко закопаных строк (например, текста, появляющегося при переходе к созданию мира).
Сколько же ещё в коде таких неожиданно-смелых решений от Жаба. ???Это обычные решения :) чаще всего именно так на практике некоторые вещи и решаются....
А размер буквы M он получает через библиотеку? один раз ?
Ээ.. теперь перевод будет расово верный?Расшифруй может понятие 'расово верного'?
Ээ.. теперь перевод будет расово верный?Отдельные расовые дварфоводы считают, что сам по себе перевод DF - ересь, и Армок нас всех покарает, так что про "расовую верность" я пожалуй промолчу ;)
Как предположения:Идея здравая. Я попробовал, доступ идет к нескольким подпапкам в папке python33. Попробовал попереименовывать папки, оказалось что перестает работать, если переименовать папку Lib. Скопировал папку Lib целиком в папку DF, а папку Python33 переименовал - работает, но таскать с собой папку размером 25 Мб - не вариант. В общем, осталось посмотреть, что оттуда можно безболезненно удалить.
1. через Process Monitor посмотреть, к каким файлам из питоновой диры обращается (читает) при подгрузке длл
2. посмотреть что кроме питон.длл входит в файлы, создаваемые py2exe (правда это скорее всего придется делать со второй версией питона)
таскать с собой папку размером 25 Мб - не вариант. В общем, осталось посмотреть, что оттуда можно безболезненно удалить.гы :) у меня папка либ - 180мб... Это с левыми библиотеками, конечно
Я вообще думал, что достаточно будет хостовой проги (библиотеки ChangeText в нашем случае), Python33.dll и вызываемого скрипта. А тут оказывается такая запара с модулями.таскать с собой папку размером 25 Мб - не вариант. В общем, осталось посмотреть, что оттуда можно безболезненно удалить.гы :) у меня папка либ - 180мб... Это с левыми библиотеками, конечно
Так, ChangeTextPy более-менее отлажен. Даже удалось решить проблему с Cook - теперь повар это повар, а готовить - это готовить (точнее "Готов" и кусочек буквы "и", но уже не "Пова").Честно говоря, в коде пока не ковырялся, но не пойму, с чем связано подобное ограничение.
Оказалось, что сделать перевод только на основе ChangeText не получится - кое-где текст начинает обрезаться.
1. Исходников модифицированной библиотеки SDL_ttf от mialax'а у меня нет, но могу с 99% уверенностью сказать, что по поводу алгоритма ты ошибаешься.Так, ChangeTextPy более-менее отлажен. Даже удалось решить проблему с Cook - теперь повар это повар, а готовить - это готовить (точнее "Готов" и кусочек буквы "и", но уже не "Пова").Честно говоря, в коде пока не ковырялся, но не пойму, с чем связано подобное ограничение.
Оказалось, что сделать перевод только на основе ChangeText не получится - кое-где текст начинает обрезаться.
Насколько помню, в версии от mialax'а таких проблем не было. Там алгоритм был примерно такой:
- Считывался весь текст со страницы.
- В считанном тексте проводились замены по словарю
- При необходимости текст форматировался (надо было допиливать)
- Весь текст выводился в окне DF.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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);
////////////////////////////////////////////
...
}
insolor, можно ли как то текущим скриптом нормально подцепить строки из trans.txt?В trans.txt лежат "заготовки" строк, патч работает именно с такими заготовками (причем по точному совпадению текста). А скрипт получает готовые строки - где-то сшитые, где-то наоборот порезанные (например режутся начальные двоеточия и пробелы в управляющих меню). Плюс еще здесь более сильные ограничения по длине, чем при переводе патчем.
PS: Я раскоментировал ваши строки в скрипте где подцепляется trans.txt - часть текста в игре перевелась, а другая нет.
insolor,1. На данный момент нет. Именно поэтому мы пока не можем отказаться от использования патча.
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
Сама программа (http://yadi.sk/d/h1OL3y_FBP5LG)
PS: В архиве еще немного подправленный скрипт changetext.py insolor'a для подхвата полученного файла.
1. ясно2. Это не проблема вообще, я имею в виду что на питоне можно прямо так и написать в двойных кавычках "Dyer's Shop"
2. эта проблема решается внешним файлом trans.txt
3. жаль
Если кому интересно, девелоперская версия скрипта changetext.py: https://bitbucket.org/dfint/changetextpy_script/srcразработка еще ведется?) :)
Большая часть написана Skin36 (http://forum.dfwk.ru/index.php?action=profile;u=958), я в данный момент занимаюсь причесыванием этого скрипта.
Ведется. А почему "еще"? с момента моего сообщения чуть больше недели прошло.Если кому интересно, девелоперская версия скрипта changetext.py: https://bitbucket.org/dfint/changetextpy_script/srcразработка еще ведется?) :)
Большая часть написана Skin36 (http://forum.dfwk.ru/index.php?action=profile;u=958), я в данный момент занимаюсь причесыванием этого скрипта.
ребят, а нету инструкции как использовать эту вещь?
ребят, а нету инструкции как использовать эту вещь?
Пока еще не готово к использованию :)
ребят, а нету инструкции как использовать эту вещь?Почему бы и нет. Скачать архив отсюда https://bitbucket.org/dfint/changetextpy/downloads
Когда скачиваю архив и запускаю файл install_fake_ttf.bat, с переводом changetext.py который в архиве, перевод накатывается, когда заливаю файлик https://bitbucket.org/dfint/changetextpy_script/raw/tip/changetext.py, запускаю install_fake_ttf.bat, пишет установка прошла успешно, но при этом перевод не накатывается ... пока не нашел с чем связано.ребят, а нету инструкции как использовать эту вещь?Почему бы и нет. Скачать архив отсюда https://bitbucket.org/dfint/changetextpy/downloads
распаковать в папку с DF. Запустить install_fake_ttf.bat.
Дальше можно сохранить файлик https://bitbucket.org/dfint/changetextpy_script/raw/tip/changetext.py
и заменить им соответствующий файл в папке DF.
Когда скачиваю архив и запускаю файл install_fake_ttf.bat, с переводом changetext.py который в архиве, перевод накатывается, когда заливаю файлик https://bitbucket.org/dfint/changetextpy_script/raw/tip/changetext.py, запускаю install_fake_ttf.bat, пишет установка прошла успешно, но при этом перевод не накатывается ... пока не нашел с чем связано.Вообще поверх русифицированной версии ставится. Скрипт русификацию просто "улучшает".
Когда скачиваю архив и запускаю файл install_fake_ttf.bat, с переводом changetext.py который в архиве, перевод накатывается, когда заливаю файлик https://bitbucket.org/dfint/changetextpy_script/raw/tip/changetext.py, запускаю install_fake_ttf.bat, пишет установка прошла успешно, но при этом перевод не накатывается ... пока не нашел с чем связано.Вообще поверх русифицированной версии ставится. Скрипт русификацию просто "улучшает".
Вообще поверх русифицированной версии ставится. Скрипт русификацию просто "улучшает".
это само собой. Поверх руссифицированной версии ставлю...мне кажется в https://bitbucket.org/dfint/changetextpy_script/raw/tip/changetext.py какая-то ошибка, вручную скопировал кусок перевода из него, и вставил в файл который в архиве есть, переход накатился. Но когда пытаюсь использовать оригинальный файл скачанный с https://bitbucket.org/dfint/changetextpy_script/raw/tip/changetext.py, то по какой-то причине перевод не накатывается, как будто ошибка какая-то в коде ... не знаю как посмотреть лог ошибок при использовании install_fake_ttf.bat
Вообще поверх русифицированной версии ставится. Скрипт русификацию просто "улучшает".
это само собой. Поверх руссифицированной версии ставлю...мне кажется в https://bitbucket.org/dfint/changetextpy_script/raw/tip/changetext.py какая-то ошибка, вручную скопировал кусок перевода из него, и вставил в файл который в архиве есть, переход накатился. Но когда пытаюсь использовать оригинальный файл скачанный с https://bitbucket.org/dfint/changetextpy_script/raw/tip/changetext.py, то по какой-то причине перевод не накатывается, как будто ошибка какая-то в коде ... не знаю как посмотреть лог ошибок при использовании install_fake_ttf.bat
Последняя версия скрипта похоже сыровата. Попробуй вот эту https://bitbucket.org/dfint/changetextpy_script/raw/c42f160db6e0ad3705b1bfe9249c62d425141b5e/changetext.py
Осталось протестировать.
Осталось протестировать.
Протестировать на что? На стабильность или правильность перевода? Или на то и другое?
"Древесина сосна брёвна"
"Гигантский пещерный паук из шёлка штаны"
Ещё при пролистывании списка иногда пропадают названия горячих кнопок.
Вообще довольно круто получилось. Отличная работа. Спасибо
Не нашёл как прикреплять файлы в личных сообщениях, так что мусорю в общей теме.
Ссылка на игру с настроенным переводчиком.
https://bitbucket.org/dfint/changetextpy_script/downloads (https://bitbucket.org/dfint/changetextpy_script/downloads)
Ссылка на игру с настроенным переводчиком.
https://bitbucket.org/dfint/changetextpy_script/downloads (https://bitbucket.org/dfint/changetextpy_script/downloads)
Скачивал по этой ссылке. Видно там старые равки. Попробую с новыми.
Выложите еще раз русифицированную игру.Поправил ссылку
по ссылке несмог скачать, 404 ошибка
Скажите, как избавиться от букв на экране, в частности "ч" на реке/ручье, разных других букв на изображении? Стоит стандартный графиксет phoebusЛевый ctrl и крутить колесиком
работает ли ДФхак в русской версии?По идее должен. Проверьте.
Ээ.. бом бом что новый сдл делает? можно пару скринов.Если зареган в контакте, можно посмотреть в этом альбоме: http://vk.com/album-50714193_192497904
В соседней теме я как бы мимолётом упомянул интересный баг/фичу. Если в файлике colors.txt не прописать для BLACK 0 0 0, то мысли и описания будут всё также выводится набором картинок, а не текстом. Хоть крути ты мышь, хоть не крути и жмакай контрл до посинения.Первая часть не про SDL_ttf.dll, а про SDL.dll, пока не могу ничем помочь.
Это к слову не так чтоб критично, но всё же.
И чтобы 2 раза не вставать спрошу.
Есть возможность библиотеки для работы changetext.py скомпилировать для Linux? Реально охренительная штука и принцип её постобработки вообще зашибись.
Я думаю обрезание TTF текста кроется где то тут.
файл df_40_16_linux\df_linux\g_src\ttf_manager.ttfСпойлерbool ttf_managerst::init(int ceiling, int tile_width) {
// Reset to a known state, clear everything
if ((!TTF_WasInit()) && (TTF_Init() == -1)) {
MessageBox(NULL, TTF_GetError(), "TTF error", MB_OK);
return false;
}
if (font) TTF_CloseFont(font);
handles.clear();
for (auto it = textures.cbegin(); it != textures.cend(); ++it)
SDL_FreeSurface(it->second);
textures.clear();
this->tile_width = tile_width;
this->ceiling = ceiling;
// Try progressively smaller point sizes until we find one that fits
for (int sz=20; sz > 0; sz--) {
font = TTF_OpenFont("data/art/font.ttf", sz);
if (!font) continue;
if (TTF_FontHeight(font) <= ceiling) {
#ifdef DEBUG
cout << "Picked font at " << sz << " points for ceiling " << ceiling << endl;
// get the glyph metric for the letter 'M' in a loaded font
cout << "TTF_FontHeight " << TTF_FontHeight(font) << endl;
cout << "TTF_FontAscent " << TTF_FontAscent(font) << endl;
cout << "TTF_FontDescent " << TTF_FontDescent(font) << endl;
cout << "TTF_FontLineSkip " << TTF_FontLineSkip(font) << endl;
#endif
int minx,maxx,miny,maxy,advance;
if (TTF_GlyphMetrics(font, 'M', &minx, &maxx, &miny, &maxy, &advance) == -1)
puts(TTF_GetError());
else {
em_width = maxx;
#ifdef DEBUG
printf("minx : %d\n",minx);
printf("maxx : %d\n",maxx);
printf("miny : %d\n",miny);
printf("maxy : %d\n",maxy);
printf("advance : %d\n",advance);
#endif
}
return true;
}
TTF_CloseFont(font);
}
// ..fine.
cout << "No font found!" << endl;
font = NULL;
return false;[свернуть]