设为首页收藏本站

塞爱维(CIV)文明联盟

 找回密码
 注册
楼主: qiu

[原创] RFC文明的兴衰中东版 伊斯兰之剑模组 汉化版 (已更新到1.00测试版)

[复制链接]
 楼主| 发表于 2012-3-18 20:35:28 | 显示全部楼层
作者的解释是可能因为他把CvTeam.cpp的第4547行的szTemp = getName();改成了
szTemp = GC.getInitCore().getLeaderName((PlayerTypes)getID( ), 0);所以无法从GC.getInitCore()获得中文名字。
回复 支持 反对

使用道具 举报

发表于 2012-3-18 21:06:11 | 显示全部楼层

回复 #21 qiu 的帖子

让我们观察日文版的CvInitCore::getLeaderName的定义中日本发行商CYBERFRONT的改动. 那么getLeaderName的问题, 就很明显了.

  1. const CvWString & CvInitCore::getLeaderName(PlayerTypes eID, uint uiForm) const
  2. {
  3.         FASSERT_BOUNDS(0, MAX_PLAYERS, eID, "CvInitCore::getLeaderName");
  4.         if ( checkBounds(eID, 0, MAX_PLAYERS) )
  5.         {
  6. #ifdef CYBERFRONT // text: leader name
  7.                 m_szTemp = gDLL->getObjectText(m_aszLeaderName[eID], uiForm, true);
  8. #else
  9.                 m_szTemp = gDLL->getObjectText(CvString(m_aszLeaderName[eID]).GetCString(), uiForm, true);
  10. #endif // CYBERFRONT
  11.         }
  12.         else
  13.         {
  14.                 m_szTemp = "";
  15.         }

  16.         return m_szTemp;
  17. }
复制代码


这里你不需要改RFC-SoI作者的代码, 你要改的是Firaxis的代码.
所以解决的方案很简单, 就是把你使用ztjal的程序修正过的CvGameCoreDLL下的dll的源代码重新编译, 然后替换掉Assets下的CvGameCoreDLL.dll, 这个问题即可解决.

说句题外话.
我想对于人类玩家控制的领袖, 原作者希望引用玩家自定义的名字, 而不仅仅是xml文本中的标准名字. 所以他使用了CvInitCore中的getLeaderName这个函数, 而不是CvPlayer的getName.
我觉得还是应该使用CvPlayer的getName, 看看这个函数的定义, 大致等于还是调用的是CvInitCore的getLeaderName.
但我想原作者肯定有他的考虑, 至于是什么原因我就不知道了.

  1. const wchar* CvPlayer::getName(uint uiForm) const
  2. {

  3.         if (GC.getInitCore().getLeaderName(getID(), uiForm).empty() || (GC.getGameINLINE().isMPOption(MPOPTION_ANONYMOUS) && isAlive() && GC.getGameINLINE().getGameState() == GAMESTATE_ON))
  4.         {
  5.                 return GC.getLeaderHeadInfo(getLeaderType()).getDescription(uiForm);
  6.         }
  7.         else
  8.         {
  9.                 return GC.getInitCore().getLeaderName(getID(), uiForm);
  10.         }
  11. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-18 23:14:50 | 显示全部楼层
他解释过原因的:

If you change this line (4547 in CvTeam.cpp):
szTemp = GC.getInitCore().getLeaderName((PlayerTypes)getID( ), 0); // edead
to
szTemp = getName();

It should probably work, but not always... basically in the original code getName() is used, but I had to change it because when players died and were resurrected, the names were lost. I have no idea why names from GC.getInitCore() are empty in Chinese version though.
回复 支持 反对

使用道具 举报

发表于 2012-3-19 02:09:47 | 显示全部楼层
我来解释为什么吧. 这里由Firaxis程序员的愚蠢造成的.

先观察CvInitCore::getLeaderName
  1. const CvWString & CvInitCore::getLeaderName(PlayerTypes eID, uint uiForm) const
  2. {
  3.         FASSERT_BOUNDS(0, MAX_PLAYERS, eID, "CvInitCore::getLeaderName");
  4.         if ( checkBounds(eID, 0, MAX_PLAYERS) )
  5.         {
  6. #ifdef CYBERFRONT // text: leader name
  7.                 m_szTemp = gDLL->getObjectText(m_aszLeaderName[eID], uiForm, true);
  8. #else
  9.                 m_szTemp = gDLL->getObjectText(CvString(m_aszLeaderName[eID]).GetCString(), uiForm, true);
  10. #endif // CYBERFRONT
  11.         }
  12.         else
  13.         {
  14.                 m_szTemp = "";
  15.         }

  16.         return m_szTemp;
  17. }
复制代码
Firaxis和Cyberfront的区别在于
Firaxis是
  1.                 m_szTemp = gDLL->getObjectText(CvString(m_aszLeaderName[eID]).GetCString(), uiForm, true);
复制代码
Cyberfront是
  1.                 m_szTemp = gDLL->getObjectText(m_aszLeaderName[eID], uiForm, true);
复制代码
让我们先看看m_aszLeaderName和getObjectText的声明, 在英文版和日文版中它们是相同的. 都是:
  1.         virtual CvWString getObjectText(CvWString szIDTag, uint uiForm, bool bNoSubs = false) = 0;
复制代码
  1.         CvWString* m_aszLeaderName;
复制代码
getObjectText的第一个参数的类型是CvWString, 那么Firaxis的那行代码实际上是
  1.                 m_szTemp = gDLL->getObjectText(CvWString(CvString(m_aszLeaderName[eID]).GetCString()), uiForm, true);
复制代码
关键之处是
  1. CvWString(CvString(m_aszLeaderName[eID]).GetCString())
复制代码
我先把CvString和CvWString的相关代码摘出
  1. typedef wchar_t          wchar;
复制代码
  1. class CvWString : public std::wstring
  2. {
  3. public:
  4.         ......
  5.         CvWString(const char* s) { Copy(s);         }
  6.         ......
  7.         void Copy(const char* s)
  8.         {
  9.                 if (s)
  10.                 {
  11.                         int iLen = strlen(s);
  12.                         if (iLen)
  13.                         {
  14.                                 wchar *w = new wchar[iLen+1];
  15.                                 swprintf(w, L"%S", s);        // convert
  16.                                 assign(w);
  17.                                 delete [] w;
  18.                         }
  19.                 }
  20.         }
  21.         ......
  22. };
复制代码
  1. class CvString : public std::string
  2. {
  3. public:
  4.         ......
  5.         explicit CvString(const std::wstring& s) { Copy(s.c_str()); }                // don't want accidental conversions down to narrow strings
  6.         ......
  7.         void Copy(const wchar* w)
  8.         {
  9.                 if (w)
  10.                 {
  11.                         int iLen = wcslen(w);
  12.                         if (iLen)
  13.                         {
  14.                                 char *s = new char[iLen+1];
  15.                                 sprintf(s, "%S", w);        // convert
  16.                                 assign(s);
  17.                                 delete [] s;
  18.                         }
  19.                 }
  20.         }
  21.         ......
  22.         const char* GetCString() const         { return c_str(); }                                                        // convert
  23.         ......
  24. };
复制代码
由此我们可以得出结论: Firaxis从一个CvWString开始, 经过一系列的类型转换, 最后得到的还是一个CvWString.
Firaxis的愚蠢在于他仅仅是想进行类型转换, 而不是想做什么其它工作. 所以像Cyberfront那样, 直接使用m_aszLeaderName[eID]作为getObject这个函数的第一个参数就行了.
这还没完, 如果仅仅是无用功那还好, 悲剧在于Firaxis的这段代码仅能对latin-1编码的字符串给出正确的转换结果.
关键在于Firaxis使用swprintf(w, L"%S", s)来转换wchar_t和char, 即使不说是错误的, 也是有隐患的.
Cyberfront使用的则是WideCharToMultiByte, 毕竟是欧美以外的公司, 有i18n经验.
回复 支持 反对

使用道具 举报

发表于 2012-3-19 02:41:16 | 显示全部楼层

回复 #23 qiu 的帖子

你不用在这个问题上和embryodead纠缠了.
再次声明: 既然你已经用ztjal的程序修改了CvGameCoreDLL下的cpp代码, 重新编译, 将编译出的dll替换原来的CvGameCoreDLL.dll, 即可解决这个问题.

这是使用原来的dll, Title改变时, 中文领袖名称无法显示, 英文的却能显示.


这是使用你的汉化版中提供的dll的源代码编译的dll, Title改变时, 中文领袖名称则能显示.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-19 18:42:27 | 显示全部楼层
谢谢大大。既然如此,大大何不把编译好的dll直接放出来
回复 支持 反对

使用道具 举报

发表于 2012-3-20 01:07:46 | 显示全部楼层

回复 #26 qiu 的帖子

我不知道你的最新的版本的dll是否和我下载的你的以前的汉化版的CvGameCoreDLL的源代码是否匹配.
如果不匹配的话, 那岂不是解决了一个小麻烦, 却造成了更大的问题?

不过我把编译出的dll放出来, 由你判断.
下载链接: http://dl.dbank.com/c0xmx2jxyq

对应的The_Sword_of_Islam.rar
大小: 350,584,965
md5: c02ef4aa7627f82b42738589a645ac81
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-20 09:27:34 | 显示全部楼层
谢大大。我先测试一下。
另外作者回信说他出院了  我已经把你的解决方法告诉他了。
回复 支持 反对

使用道具 举报

发表于 2012-3-22 19:48:47 | 显示全部楼层
这?居然没精?
回复 支持 反对

使用道具 举报

发表于 2012-3-23 08:38:19 | 显示全部楼层
感谢汉化者,又有更新~
回复 支持 反对

使用道具 举报

发表于 2012-3-27 23:10:47 | 显示全部楼层
直接看不懂。。。。。。。。。。。天书
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-28 02:29:21 | 显示全部楼层

回复 #31 130ty 的帖子

如果是乱码请尝试将windows区域设置切换至中国
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-16 16:59:10 | 显示全部楼层
首页已经更新到0.50正式版
回复 支持 反对

使用道具 举报

发表于 2012-6-25 15:12:38 | 显示全部楼层
从贴吧跑过来找链接,果然。。。依旧不能用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-11 20:08:47 | 显示全部楼层
已更新到1.00测试版

1.00汉化版推广战报
http://tieba.baidu.com/p/2035764399?pn=1

[ 本帖最后由 qiu 于 2012-12-11 20:11 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2013-1-24 01:30:57 | 显示全部楼层
好好学习~
回复 支持 反对

使用道具 举报

发表于 2013-2-20 10:44:52 | 显示全部楼层

加载MOD后,没有伊斯兰的界面,还是文明4经典界面,也无法进入游戏

我在WIN7系统下安装了3.19汉化版,可以在单人游戏--选项里加载MOD,但是加载MOD后,没有伊斯兰的界面,还是文明4经典界面,也无法进入游戏,世界创建器读取失败!求助啊!使用的不是全屏幕模式,这个有关系吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-2-20 10:49:36 | 显示全部楼层

还是上一个问题!多2个截图

还是上一个问题!多2个截图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-2-20 10:58:49 | 显示全部楼层

随便进入一个游戏,在世界编辑器里加载伊斯兰,会出现问题

随便进入一个游戏,在世界编辑器里加载伊斯兰,会出现问题,其他MOD没事
回复 支持 反对

使用道具 举报

发表于 2013-2-20 11:00:01 | 显示全部楼层

随便进入一个游戏,在世界编辑器里加载伊斯兰,会出现问题

随便进入一个游戏,在世界编辑器里加载伊斯兰,会出现问题,其他MOD没事

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|塞爱维(CIV)文明联盟    

GMT+8, 2024-4-19 12:02

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表