设为首页收藏本站

塞爱维(CIV)文明联盟

 找回密码
 注册
查看: 6439|回复: 17

[原创] 文明四CvGameCoreDLL.dll编译器(便携版)

[复制链接]
发表于 2012-5-1 02:29:43 | 显示全部楼层 |阅读模式
下载链接:
civ4dll compiler(portable).7z

使用方法:
首先将待编译的CvGameCoreDLL.dll的源代码复制至src目录下.
然后准备Makefile: 将makefile目录下的Makefile文件复制至src目录下.
若待编译的代码自带Makefile, 此时有3种选择:
覆盖之, 直接使用makefile目录下的Makefile. (不推荐)
覆盖之, 使用makefile目录下的Makefile, 在其基础上做相应修改.
保留编译的代码自带的Makefile, 在其基础上做相应修改.

做好准备工作后, 接下来开始编译.
如果编译的CvGameCoreDLL.dll用于英文版, 请执行build.bat.
如果编译的CvGameCoreDLL.dll用于塞爱维汉化版, 则请执行build_zh.bat.

最后如果编译成功, 编译出来的CvGameCoreDLL.dll位于dll目录和src\Final_Release目录下.

清理编译产生的目标文件, 请运行clean.bat.

注:
1. 本编译器本质上是Microsoft Visual C++ Toolkit 2003的一个便携版, 外加一个针对CvGameCoreDLL.dll的Makefile.

2. 本编译器所带的Makefile自动推导依赖关系, 但不完善.
对大多数mod的dll的源代码都能成功编译. 比如RFC系列毫无问题.
但都对某些mod, 例如Better Bug AI, 则需要修改Makefile, 才能成功编译.
对于Rise of Mankind - A New Dawn, 则请用build_zh_rom_and.bat执行编译.

3. 本编译器Debug编译链接选项使用了/NODEFAULTLIB:msvcprtd.lib. 若有疑惑, 请忽视此条.

示例:
sample_en, sample_zh目录下的源代码对应于BTS319英文版和塞爱维汉化版的dll.
运行sample_en_build.bat, sample_zh_build.bat进行编译.
运行sample_en_clean.bat, sample_zh_clean.bat进行清理.

附注:
一般来说, 要在中文环境下从源代码来编译CvGameCoreDLL.dll, 需要修改CvGameTextMgr.cpp的createTestFontString函数, 否则会遇到编码问题, 无法完成编译.
具体修改可参考sample_en目录下的同名文件.

[ 本帖最后由 zahlen 于 2012-5-2 03:59 编辑 ]

评分

2

查看全部评分

 楼主| 发表于 2012-5-1 03:13:25 | 显示全部楼层

另外附赠小工具

civ4tgafix.exe, 参见附件

作用对象:
我们知道英文版的mod若自带gamefont, 那么即使要在汉化版语言选择英语仍需修正gamefont.
本工具则自动完成此修正.

使用方法:
Usage : civ4tgafix [Option] [Path] ...
Option:
  --gamefont       :  生成GameFont.tga的修正
  --gamefont75    :  生成GameFont_75.tga的修正
  --all                :  生成GameFont.tga和GameFont_75.tga的修正

示例:
假设现有3个目录, c:\sample, c:\src, c:\dest.
先将塞爱维汉化版的GameFont.tga放置于c:\sample下
再将英文版某模组的GameFont.tga放置于c:\src下,
然后在命令行下执行:
civ4tgafix --gamefont c:\sample c:\src c:\dest
那么c:\dest下自动生成了GameFont.tga.
这个新生成的图片以英文版的为基础, 外加了汉化版的多出了的那七个格子.


这个工具写的很简单, 只针对标准情形, 需要tga数据的原点是左下角, 英文版只少了那7个格子等前提.
不知道有没有哪个mod违反了这些假设. 反正RFC系列, ROM-AND, Bug Mod的gamefont没有问题, 都能成功修正.
当然实在不行, 再手动修改, 也没什么损失.

换句话说, 就是用程序自动完成http://www.civclub.net/bbs/viewt ... mp;page=1#pid150571中提到的Photoshop工作.

[ 本帖最后由 zahlen 于 2012-5-1 23:02 编辑 ]

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2012-5-1 09:52:19 | 显示全部楼层
感谢大神的工具,我这就加紧把rom~and处理掉~另外还想问一下,编译dll与否对游戏有什么影响呢?修改thm主题文件呢~~
回复 支持 反对

使用道具 举报

发表于 2012-5-1 11:04:45 | 显示全部楼层
这个网盘真不好用
回复 支持 反对

使用道具 举报

发表于 2012-5-1 11:37:17 | 显示全部楼层
原帖由 如君之幸 于 2012-5-1 09:52 发表
感谢大神的工具,我这就加紧把rom~and处理掉~另外还想问一下,编译dll与否对游戏有什么影响呢?修改thm主题文件呢~~

突然想起个事,1.75的源代码已经不在了 ,SVN上的源代码已经更新到了2.0了。是否意味着俺也得跟进汉化进度了
回复 支持 反对

使用道具 举报

发表于 2012-5-1 13:59:07 | 显示全部楼层
跪了……
回复 支持 反对

使用道具 举报

发表于 2012-5-1 14:27:37 | 显示全部楼层
你好。
我修改了一下CvUnit.cpp,编译了。很顺利,效果也实现了。但就是有一个问题,用了编译过的dll后,无法在游戏中自行输入中文的领袖名称、文明名称了,请问该问题如何解决?
回复 支持 反对

使用道具 举报

发表于 2012-5-1 15:03:39 | 显示全部楼层
这~老大没搞懂啊~civ4tgafix.exe里面指的GameFont.tga到底是什么GameFont.tga?是刀剑普通游戏汉化包的GameFont.tga?汉化版MOD的GameFont.tga?还是什么?
如果是后者~做新MOD汉化的时候杂用啊……
回复 支持 反对

使用道具 举报

发表于 2012-5-1 15:37:06 | 显示全部楼层
例如Better Bug AI, 则需要修改Makefile, 才能成功编译.

这个修改简单吗?我成功的用它修改了几个DLL文件,但是在revolutionDCM上遇到一个问题。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-1 22:39:08 | 显示全部楼层

回复 #9 如君之幸 的帖子

CvBugOptions.cpp(12) : fatal error C1083: Cannot open include file: 'CyArgsList.h': No such file or directory

很明显, 少了CyArgsList.h, 补上就没事了. 我还没见过改CyArgsList的模组呢.

上面的错误很好解决, 不过我估计你还会遇到
CvGame.cpp(某个行数) : fatal error C1083: Cannot open include file: 'ximage.h': No such file or directory

这才是问题, 整合了BULL的dll编译都避免不了, 就像Better Bug AI.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-1 22:59:21 | 显示全部楼层

回复 #8 阿明瓜子 的帖子

当然是Sid Meier's Civilization 4\Beyond the Sword\Assets\res\Fonts\目录下的那个两个tga文件了, GameFont.tga和GameFont_75.tga.

比如我想在汉化版下运行Bug mod, Bug Mod自带GameFont_75.tga. 所以对于GameFont文件, 我需要且仅需要修正GameFont_75.tga.
假设汉化版的GameFont_75.tga位于此目录:
C:\Program Files\Firaxis Games\Sid Meier's Civilization 4\Beyond the Sword\Assets\res\Fonts\
而Bug Mod的GameFont_75.tga则
C:\Program Files\Firaxis Games\Sid Meier's Civilization 4\Beyond the Sword\Mods\BUG Mod 4.4\Assets\Res\Fonts\
那么我在命令行下执行:


  1. civ4tgafix --gamefont75 "C:\Program Files\Firaxis Games\Sid Meier's Civilization 4\Beyond the Sword\Assets\res\Fonts" "C:\Program Files\Firaxis Games\Sid Meier's Civilization 4\Beyond the Sword\Mods\BUG Mod 4.4\Assets\Res\Fonts" "C:\Program Files\Firaxis Games\Sid Meier's Civilization 4\Beyond the Sword\Mods\BUG Mod 4.4\Assets\Res\Fonts"
复制代码

那么此时C:\Program Files\Firaxis Games\Sid Meier's Civilization 4\Beyond the Sword\Mods\BUG Mod 4.4\Assets\Res\GameFont_75.tga已经自动添加了汉化版GameFont中多的那7个格子, 就不用ps来手动修正了.

当然实际操作时, 我会先把那两个文件复制到名字短点的目录下, 命令行下敲那么多字不容易.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-1 23:26:16 | 显示全部楼层

回复 #7 zweihander 的帖子

原帖由 zweihander 于 2012-5-1 14:27 发表
你好。
我修改了一下CvUnit.cpp,编译了。很顺利,效果也实现了。但就是有一个问题,用了编译过的dll后,无法在游戏中自行输入中文的领袖名称、文明名称了,请问该问题如何解决?


请把日本发行商Cyberfront对dll代码的修改移植到你要编译的代码中. Cyberfont的源代码就位于sample_zh目录下.

比如CvInitCore.cpp
英文版某处是这样

  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.                 m_szTemp = gDLL->getObjectText(CvString(m_aszLeaderName[eID]).GetCString(), uiForm, true);
  7.         }
  8.         else
  9.         {
  10.                 m_szTemp = "";
  11.         }

  12.         return m_szTemp;
  13. }
复制代码


而汉化版使用的日文dll的代码则是

  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. }
复制代码

对于这个地方, 你就要像Cyberfront那样修改.
以上只是一个示例, 你还需改其它地方.

Cyberfront改过的文件如下:
CvDefines.h
CvDLLInterfaceIFaceBase.h
CvGameTextMgr.cpp
CvInitCore.cpp
CvString.h
CyInfoInterface1.cpp

Cyberfront所有的修正均用CYBERFRONT标出了, 除了CyInfoInterface1.cpp的改动.
同时它所有的改动你都需要移植, 除了CyInfoInterface1.cpp中对getEspionagePoints的改动.
Cyberfont在CyInfoInterface1.cpp删去了一行

  1.                 .def("getEspionagePoints", &CvUnitInfo::getEspionagePoints, "int ()")
复制代码

这个你需要保留.
回复 支持 反对

使用道具 举报

发表于 2012-5-2 12:38:01 | 显示全部楼层
原帖由 zahlen 于 2012-5-1 23:26 发表


请把日本发行商Cyberfront对dll代码的修改移植到你要编译的代码中. Cyberfont的源代码就位于sample_zh目录下.

比如CvInitCore.cpp
英文版某处是这样

const CvWString & CvInitCore::getLeaderName(P ...


谢谢
那既然如此,我能否直接用sample_zh下的原代码作为底版,只把我修改了的CvUnit.cpp覆盖进去,然后编译?
回复 支持 反对

使用道具 举报

发表于 2012-5-5 16:42:29 | 显示全部楼层
运行civ4tgafix……随便打了个字母……跳出了………………
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-6 01:21:43 | 显示全部楼层

回复 #14 阿明瓜子 的帖子

这东西本来写给我自己用的, 健壮性几乎为零.
不遵循制定用法, 不崩才不正常.
反正BUG, ROM-AND, SOI, HR的gamefont文件我都是用它自动修正的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-6 01:25:11 | 显示全部楼层

回复 #13 zweihander 的帖子

对, 就是这样.
这也是我提供sample_zh的原意.
回复 支持 反对

使用道具 举报

发表于 2012-5-13 23:38:46 | 显示全部楼层
楼主好人啊,拜谢
回复 支持 反对

使用道具 举报

发表于 2017-4-21 20:21:12 | 显示全部楼层
qiu 发表于 2012-5-13 23:38
楼主好人啊,拜谢

楼主的资源挂了,邱长老有没有留存?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 09:45

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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