让vcmi支持英雄无敌3中文版
Table of Contents
1 Hack 日志
- 8月22日开始动手修改改vcmi(英雄无敌3的开源游戏引擎)的源码, 让它支持简体中文版的游戏数据。
- 8月25日,已经有一个可工作的修改版,但自己不满意。这个版本的原理是每次要显 示文本的时候,都用自己写的编码转换函数将字符串从GBK编码转为UTF8编码,从而 能正常地显示中文。但每次显式都转换,每秒游戏要10帧以上,每帧要显示的字符串 可以多达数十个,这样每秒要做数百次字符串转换,效率很低。虽然这样的计算量对 现代CPU来说不算啥,但心里觉得别扭。高效的做法应该是将游戏数据中的GBK编码的 字符串载入内存的时候只做一次编码转换,转换为UTF8编码。
- 这时开始置疑PC游戏相关工作的意义,所以工作中断了。
- 中断一个月后,觉得开始的事情没做完,心里别扭,就决定来个收场。于是9月27号, 开始做一个高效的修改。9月28日算大功告成。这个事可以告一段落了。
以下是对源码所做的修改,和怎么编译安装,当时用英文做的记录,懒得再翻译回中文了。
2 Changes
- client/CMessage.cpp
in function
CMessage::breakText(), line 153// added by jiqingwu@gmail.com, 2013-08-28
// If the text[z] is less than 0, it is the first byte of a UTF8 Chinese word.
#ifdef ZH_CN
else if (text[z] < 0){
z++;
z++;
lineLength += graphics->fonts[font]->getSymbolWidth(text[z]);
}
#endif - client/gui/Fonts.cpp
in function
CTrueTypeFont::getStringWidth(), line 255// added by jiqingwu@gmail.com, 2013-08-28
// If we are handling simplified chinese, it is a UTF8 string
#ifdef ZH_CN
TTF_SizeUTF8(font.get(), data.c_str(), &width, NULL);
#else
TTF_SizeText(font.get(), data.c_str(), &width, NULL);
#endifin function
CTrueTypeFont::renderText(), line 279if (blended)
// added by jiqingwu@gmail.com, 2013-09-28 Sat
// If we are handling simplified chinese game data, it is a UTF8 string
#ifdef ZH_CN
rendered = TTF_RenderUTF8_Blended(font.get(), data.c_str(), color);
#else
rendered = TTF_RenderText_Blended(font.get(), data.c_str(), color);
#endif
else
// added by jiqingwu@gmail.com, 2013-09-28 Sat
// If we are handling simplified chinese game data, it is a UTF8 string
#ifdef ZH_CN
rendered = TTF_RenderUTF8_Solid(font.get(), data.c_str(), color);
#else
rendered = TTF_RenderText_Solid(font.get(), data.c_str(), color);
#endif - add lib/ConvertEncoding.cpp and lib/ConvertEncoding.h
The content of ConvertEncoding.h is:
char * convert_enc(char *src_enc, char *dest_enc, const char * src_string);
The content of ConvertEncoding.cpp is:
/*
* ConvertEncoding.cpp, for vcmi using CJK(China/Japan/Korea) data.
*
* Authors: Wu Jiqing (jiqingwu@gmail.com)
*
* License: GNU General Public License v2.0 or later
*
*/
// added by jiqingwu(jiqingwu@gmail.com)
// 2013-09-27 Fri
#include <stdio.h>
#include <iconv.h>
#include <string.h> // added by jiqingwu@gmail.com, 2013-09-27 Fri
char * convert_enc(char *src_enc, char *dest_enc, const char * src_string)
{
#define UTF8_STR_LEN 5000 static char out_string[UTF8_STR_LEN], *sin, *sout;
int in_len, out_len, ret;
iconv_t c_pt; if ((c_pt = iconv_open(dest_enc, src_enc)) == (iconv_t)-1)
{
printf("iconv open failed!\n");
return NULL;
}
// iconv(c_pt, NULL, NULL, NULL, NULL);
in_len = strlen(src_string) + 1;
out_len = UTF8_STR_LEN;
sin = (char *)src_string;
sout = out_string;
ret = iconv(c_pt, &sin, (size_t *)&in_len, &sout, (size_t *)&out_len);
if (ret == -1)
{
return NULL;
}
iconv_close(c_pt);
return out_string;
}to link ConvertEncoding.o into library, add two lines into lib/CMakeLists.txt:
set(lib_SRCS
...
ConvertEncoding.cpp
) set(lib_HEADERS
...
ConvertEncoding.h
) - lib/CGeneralTextHandler.cpp,
To include "ConvertEncoding.h"
// added by jiqingwu(jiqingwu@gmail.com)
// 2013-09-27 Fri
#include "ConvertEncoding.h"in function
CLegacyConfigParser::readString(), line 112// added by jiqingwu@gmail.com, 2013-09-27 Fri
// convert gbk string to utf-8 string.
// (For simplified Chinese game data, the string is GBK encoded)
#ifdef ZH_CN
char * utf8_str = convert_enc("GBK", "UTF8", ret.c_str());
return std::string((const char*)utf8_str);
#else
return ret;
#endif - lib/filesystem/CBinaryReader.cpp,
to include "ConvertEncoding.h":
// added by <jiqingwu@gmail.com>, 2013-09-28 Sat
#include "../ConvertEncoding.h"in function
CBinaryReader::readString(), line 95// added by jiqingwu@gmail.com, 2013-08-22
// If we are handling chinese data, convert gbk string to utf-8 string.
#ifdef ZH_CN
char * utf8_str = convert_enc("GBK", "UTF8", ret.c_str());
return std::string((const char*)utf8_str);
#else
return ret;
#endif
3 Install by compiling
- add such a line into ./CMakeLists.txt to enable supporting Simplifed Chinese Game Data
add_definitions(-DZH_CN)
- make a directory
buildunder the source dirmkdir build
- create makefiles
cd build
cmake ..This may take a short while.
- compile
make
- install (root privilege is needed)
make install
Check the directories of vcmi
vcmiclient -v
You will see the result like this:
Starting...
VCMI 0.93
data directory: /usr/local/share/vcmi
library directory: /usr/local/lib/vcmi
path to server: /usr/local/bin/vcmiserverHere, vcmi is installed under
/usr/local - Use the Data from the chinese version of Death of Shadow. Link the 'Data', 'Maps', 'Mp3' directories under
/usr/local/share/vcmilike this (You need have root privilege):cd /usr/local/share/vcmi
ln -s /Data/Dir/of/ChineseGame Data
ln -s /Maps/Dir/of/ChineseGame Maps
ln -s /Mp3/Dir/of/ChineseGame Mp3 - To show chinese characters in this game, you need put a true type font which supports Chinese into
/usr/local/share/vcmi/Data.cp /chinese/font/path /usr/local/share/vcmi/Data
Edit the
/usr/local/share/vcmi/config/fonts.json, modify the truetype font section like this:"trueType":
{
"BIGFONT" : { "file" : "ChineseFont.ttf", "size" : 22, "blend" : true},
"CALLI10R" : { "file" : "ChineseFont.ttf", "size" : 10, "blend" : true},
"CREDITS" : { "file" : "ChineseFont.ttf", "size" : 28, "blend" : true},
"HISCORE" : { "file" : "ChineseFont.ttf", "size" : 13, "blend" : true},
"MEDFONT" : { "file" : "ChineseFont.ttf", "size" : 16, "blend" : true},
"SMALFONT" : { "file" : "ChineseFont.ttf", "size" : 13, "blend" : true},
"TIMES08R" : { "file" : "ChineseFont.ttf", "size" : 11, "blend" : true},
"TINY" : { "file" : "ChineseFont.ttf", "size" : 11, "blend" : true},
"VERD10B" : { "file" : "ChineseFont.ttf", "size" : 13, "blend" : true}
}Where ChineseFont.ttf is your true type font.
- Play Game
vcmiclient
4 reply of Ivan
(0004091) Ivan (developer) - 2013-10-20 13:09
http://bugs.vcmi.eu/view.php?id=1420#c4091
----------------------------------------------------------------------
Thanks. I'll take a look on this. I don't like idea of using ifdef's to enable
some functionality but you've tracked every place that needs changes - that will
help.
让vcmi支持英雄无敌3中文版的更多相关文章
- vcmi(魔法门英雄无敌3 - 开源复刻版) 源码编译
vcmi源码编译 windows+cmake+mingw ##1 准备 HoMM3 gog.com CMake 官网 vcmi 源码 下载 QT5 with mingw 官网 Boost 源码1.55 ...
- 英雄无敌3开源引擎vcmi的编译安装
TAGS: Heroes3, vcmi, opensourceDATE: 2013-08-23 vcmi是什么? vcmi 是经典的 SLG 英雄无敌3 的开源游戏引擎.原来的英雄无敌3只能在Wind ...
- 英雄无敌HoMM3-死亡阴影SOD-神之苏醒WOG-封神NABI-MOD等相关文件
英雄无敌HoMM3:死亡阴影SOD 英雄无敌3之死亡阴影(Heroes of Might and Magic III: Shadow of Death,简记为HoMM III: SOD)发行于1999 ...
- 黑科技项目:英雄无敌III Mod <<Fallen Angel>>介绍
英雄无敌三简介(Heroes of Might and Magic III) 英3是1999年由New World Computing在Windows平台上开发的回合制策略魔幻游戏,其出版商是3DO. ...
- Problem A: 英雄无敌3(1)【dp/待补】
Problem A: 英雄无敌3(1) Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 86 Solved: 16[Submit][Status][ ...
- Problem B: 英雄无敌3(2)【模拟,日期转换】
Problem B: 英雄无敌3(2) Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 295 Solved: 52[Submit][Status][W ...
- python json库序列化支持中文
import json d = {"name":"英雄无敌7"} res = json.dumps(d) # 打印res 会显示 {"name&quo ...
- github上最全的资源教程-前端涉及的所有知识体系
前面分享了前端入门资源汇总,今天分享下前端所有的知识体系. 个人站长对个人综合素质要求还是比较高的,要想打造多拉斯自媒体网站,不花点心血是很难成功的,学习前端是必不可少的一个环节, 当然你不一定要成为 ...
- github上最全的资源教程-前端涉及的所有知识体系【转】
github上最全的资源教程-前端涉及的所有知识体系[转自:蓝猫的博客] 综合类 综合类 地址 前端知识体系 http://www.cnblogs.com/sb19871023/p/3894452.h ...
随机推荐
- 面试问题总结二(技术能力-PHP)----Ⅲ
42.什么是单点登录? 答:单点登录 SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信 ...
- IPV6 国内进展情况
国家下一代互联网产业技术创新战略联盟(以下简称“产业联盟”),近日在北京发布了我国首份IPv6业务用户体验监测报告(以下简称<报告>).该<报告>监测了我国固定宽带的IPv6普 ...
- mysql 简单sql语句
1.修改数据库的编码 alter database test character set utf8 2.创建新表 : create table text4(id int( ...
- Redis:主从复制
前言 在前面的两篇文章中,分别介绍了Redis的内存模型和Redis的持久化. 在Redis的持久化中曾提到,Redis高可用的方案包括持久化.主从复制(及读写分离).哨兵和集群.其中持久化侧重解决的 ...
- python中文档IO的读写
首先明确一点,现代计算机的操作系统都不允许程序直接操作磁盘的,所以读取文件和写入文件都是有操作系统提供的提供的接口完成的,每一种编程语言都会把操作系统提供的低级C接口封装起来方便使用,Python也不 ...
- Access数据库通过ODBC导出到Oracle的两个小问题ora-24801\Ora-01401
问题描述:从access通过odbc导出到oracle出现 ora-24801 非法值 错误 与 Ora-01401 值过大的错误 问题分析:access里面的字段类型为“备注”,导入到ora ...
- 【刷题】BZOJ 3667 Rabin-Miller算法
Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字:第一,检验是否是质数,是质数就输出Prime 第二,如 ...
- NOI2010~NOI2018选做
[NOI2010] [NOI2010]海拔 高度只需要0/1,所以一个合法方案就是一个割,平面图求最小割. [NOI2010]航空管制 反序拓扑排序,每次取出第一类限制最大的放置,这样做答案不会更劣. ...
- TJOI2013数字根
题面链接 洛谷 sol 我们先不考虑\(0\),发现数字根\(=\)它\(mod 9\). 我们前缀和一波,把区间和变成两数相减. 对于每个\(v\in\{0-8\}\),(这里面的\(mod 9=0 ...
- BZOJ 3339: Rmq Problem
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1075 Solved: 549[Submit][Status][ ...