· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Помогите чайнику русифицировать Civilization II

Посл.отвђт Сообщенiе


Дата: Июл 31, 2004 03:31:57 · Поправил: Slava80

Помогите чайнику русифицировать Civilization II

Вот суть проблемы изложенная на форуме codenet
[url=http://forum.codenet.ru/showthread.php?s=&postid=69258
]http://forum.codenet.ru/showthread.php?s=&postid=69258
[/url]
Slava80
В последней версии второй CIV - Fantastic Worlds вместо русских букв - абра-кадабра. Игра, похоже, писалась под винды на Borland C++. Что и где надо подправить в EXE, чтобы русский текст выводился в правильной кодировке? Сами тексты идут в отдельном TXT файле.
Тоже самое и во всяких формах - например, когда вводишь имя города - переключаешься на русскую раскладку, но вводятся опять международные символы, а не русские буквы.
Легко ли это исправить? В принципе могу посидеть и с softice, но только мне нужны хоть какие-то наводки - что да как делать, где искать.

kot_
Честно говоря давненько не играл в Ц, но если есть файл с текстами, превое что я бы попробовал сделать - сменить кодовую станицу файла и изменить системную кодовую старницу. А после этого уже браться за софтасе. В нем можно поставить прерывание на вызов функций GetACP, GetCPInfo, GetOEMCP,CharToOem - посмотреть вообще устанавливается какая либо кодовая страница - а уже после этого определялся бы что нужно сделать.
Причем лезть в софтасе совсем не обязательно - если прога под винду используй APISpy.
Как вариант попробуй перед загрузкой программы загрузить какой нибудь руссификатор консоли - типа keyrus.

Slava80
Кодировку текстового файла менять смысла нет. Так как русские буквы все равно не будут отображаться - вместо них интернациональные символы. А системную менять - значит все приложения будут неправильно отбражать тексты (или нет?).
Даже обычное поле для ввода названия - в нем тоже не удается ввести русские буквы. Что самое интересное - не во всей игре так. Например в стандартной полоске меню сверху у окна приложения все русские надписи отоброжаются корректно (кстати текст для меню тоже идет в отдельном txt файле в win кодировке).
Еще не удается запустить APISPY с этой игрой: "Unable to start program".
Программка OgreGUI для выдирания текстов и прочих ресурсов из EXE для последующей русификации вообще говорит, что этот файл не Win32 PE формата.
ExeScope все открывает без проблем, но ничего полезного там вроде не видно.
WinSight32 видит все процессы игры.

И причем тут консоль? Игра же под винды.

kot_
Буквы всех кодировок по сути своей - набор единиц и нулей - смена кодировки файла не решит проблему со вводом на руском языке - но вывод должен работать
Возможна некорректная работа программ использующих настройки локали для сортировки и т.п., а так же сортировка файлов и папок в системе может быть странной... Это касается объектов системы имеющих неанглийские имена. В Win2K и выше могут не читатся папки и файлы с неанглийскими именами.
Все таки кодировку файла я бы советовал посмотреть.
Ты же сам на свой вопрос и ответил. То что игра под винды еще не значит, что не используется консоль... Не работает AS используй SI. А прямая правка ресурсов тут тебе врядли помогет (ну может кроме смены кодировки тхт-файла).

Slava80
Во-первых, прошу прощения если отнимаю время, но мне очень интересно разобраться с этим. Надоело ходить вокруг да около.
Почему я считаю, что эту проблему можно решить?
Дело в том, что Civilization II имеет внутреннюю версию. Т.е. в самом начале файл civ2.exe имел версию ver 1.0 16-Feb-96. Номер версии можно посмотреть, зайдя в игру, начать новую (или загрузить сохраненную) и нажать Ctrl-O (Опции игры). В заголовке окна будет написан номер версии. Так вот в этой версии, вплоть до какой-то, проблем с русскими буквами не было. Далее появлялись различные add-on к игре, которые не только добавляли сценарии и пр. мишуру, но и заменяли файл civ2.exe. Сама же структура игры не менялась - можно безболезненно заменять только файл civ2.exe и игра будет работать. Последняя версия, которая есть у меня Civilization II - Fantastic Worlds ver 2.7.81 Scenario Editor 21-Oct-97. В ней, помимо добавления всяких мелких удобностей и устранения мелких же багов, был устранен так же и русский язык. :)
Из этого я делаю выводы, что если RUSSIAN_CHARSET был раньше, то его можно вернуть, просто заменив несколько байт в EXE. Вопрос - какие?
Побайтовое сравнение бессмысленно - слишком много различий да еще при разных размерах файлов.
Признаюсь - я лох (продвинутый :)) в области WinAPI, а уж тем более ASM. Но если бы я им не был, я бы сюда и не приходил, а уже все давно сделал бы сам. Поэтому я надеюсь на помощь со стороны. Иначе для решения этой проблемы мне понадобиться очень много времени и сил.

В продолжение темы. Понятно, что буквы - это набор 0 и 1. Но дело в том, что даже если я засуну в txt файл набор символов от #0 до #255, то все равно в игре русские буквы не отобразятся. А будет вот что. Если загрузить виндовую программку "Таблица символов", то в ней в списке шрифтов будут три таких шрифта:
Times New Roman
Times New Roman CE
Times New Roman Cyr
Так вот первый набор символов и будет использоваться. Т.е. вместо русской буквы "Ж" будет символ "AE" (две буквы слитно).
Видимо программисты вместо DEFAULT_CHARSET прописали ANSI_CHARSET во всех формах. Как я уже говорил русские буквы остались только в меню. В остальных же местах, включая даже кнопки, их нет.

Не хотелось бы менять что-то в системе. Это не прикольно. Хотелось бы создать патч именно для civ2.exe.

Про консоль я так и не понял. Если игра работает в ОКНЕ, использует GDI, USER, KERNEL, COMMDLG и др., рисует графику, выводит текст шрифтом TimesNewRoman и другими, окно можно растягивать, перемещать, то разве это не полностью виндовое приложение??? Я понимаю под консолью работу в текстовом режиме или просто запуск программы, которая вообще не использует API. Скорее всего я ошибаюсь...

Работа с SoftIce показала, что игра использует GetACP и др. Но что это дает. Ведь эти функции только возвращают значения кодовой страницы (кстати значение которое они возвращают - 1251). А вот что устанавливает эти кодовые страницы?
Например, как вообще рисуются надписи? Скажем, я обнаружил, что игра активно использует DrawText. Но какой функцией устанавливается каким шрифтом будет отображен текст, в какой кодировке и с каким набором символов? Если найти эти функции, то тогда можно будет сравнить два файла (старый и новый) именно в этой области.

Еще вопрос: например я нашел вызов DrawText в модуле civ2.exe. И у него есть кодовое представление 9A7E172717. Но поиск в самом файле ничего не дает. Удалось найти это место по окружающим командам, и вот что я выяснил. Оказывается на месте вызова стоит код 9AFFFF0000. Что это значит? Почему код в памяти не соответствует коду в EXE?


Дата: Июл 31, 2004 05:17:31

Ищи в коде функции CreateFont, CreateFontIndirect и смотри какие параметры передаются в функцию(в случае использования CreateFont) или смотри соответствующую структуру в случае использования CreateFontIndirect.
Например для CreateFont параметры могут быть приблизительно такие:
invoke CreateFont, -11, 0, 0, 0, 400, 0, 0, 0,\
                   DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,\
                   CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,\
                   DEFAULT_PITCH or FF_DONTCARE, ADDR FontName


Дата: Июл 31, 2004 11:55:23

В реестре есть ветка (W2k, для других может отличаться)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
там увидишь 1252 со значением c_1252.nls попробуй поменять на значение c_1251.nls и перегрузи машину :)
У меня 1252 и 1253 присвоены c_1251.nls, иначе не весь софт правильно отображает русские буквы.
Есть другой вариант, попробуй открыть текстовый файл в блокноте и сохранить его как UNICODE.
Бормановские билдеры плохо работают с UNICODом. У меня был печальный опыт создания софта на De..... (чтоб ему...) с использованием UNICODE. Итог - плюнул на это дело.


Дата: Июл 31, 2004 21:52:20 · Поправил: Slava80

Поверить не могу, что все так просто! Asterix, спасибо! Помог совет с CreateFontIndirect.
В результате надо было заменить всего один байт. Хотя угробил я на все это два дня. Но сказывается неопытность. Думаю, можно было управиться и за полдня.
Теперь надо все проверить, везде ли отображается русский шрифт.
А пока:
Fantastic Worlds ver 2.7.81 Scenario Editor 21-Oct-97
civ2.exe
0019B733: 00 -> 01

Если у кого-то другая версия, то можно попробовать найти это место по окружению:
C746CC0000C746CE0000C746D00000C746D20000C646D400C646D500C646D600C646D7  

0019B733: 00 -> 01

C646D800C646D901C646DA00C646DB00C646FC00F6460A017407C746D2BC02EB05C746D290018A460A240288


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.038