From 740964f83773768d14385dce687d7623ddfedc9f Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Thu, 2 Sep 2021 18:14:59 +0800 Subject: [PATCH] Do some misc stuff * Update documents partially. * Finish basic adaptation of Virtools 2.5, 3.5, 4.0, 5.0 with both plugin and standalone version. * Still have problem while building with Virtools 2.1 reverse SDK. Waiting upstream changes. --- Documents/COMPILE_ZH.md | 20 + Documents/DEPLOY_ZH.md | 0 README_ZH.md | 99 ++++- .../SuperScriptMaterializer.vcxproj | 53 +-- .../SuperScriptMaterializer.vcxproj.filters | 384 ++++++++++++++++++ SuperScriptMaterializer/script_export.cpp | 16 +- .../virtools_compatible.cpp | 6 +- SuperScriptMaterializer/virtools_compatible.h | 2 +- SuperScriptMaterializer/vt_player.cpp | 14 +- mk_materializer_cfg.py | 65 ++- 10 files changed, 599 insertions(+), 60 deletions(-) create mode 100644 Documents/COMPILE_ZH.md create mode 100644 Documents/DEPLOY_ZH.md diff --git a/Documents/COMPILE_ZH.md b/Documents/COMPILE_ZH.md new file mode 100644 index 0000000..2804231 --- /dev/null +++ b/Documents/COMPILE_ZH.md @@ -0,0 +1,20 @@ +# 编译与调试 + +本文档将指导您编译或调试`SuperScriptMaterializer` + +## 需求 + +- Visual Studio 2010,即VC++ v100的工具集(不能使用Virtools 2015及以上版本进行编译,在编译Virtools 5.0 Standalone版本的时候亲测会出错且无法解决) +- Virtools SDK 或 Ballance Mod Loader(如果以Virtools 2.1作为目标) +- Python 3.x + +## 编译之前 + +编译之前,您需要先进入项目根目录下,在此处打开终端,我们首先需要生成编译的参数。自上一个版本以来,我们将编译时需要的一些参数全部转为Visual Studio可识别的宏,定义在独立的`Virtools.props`中,此步操作便是生成这个文件,以确定编译文件的相关参数。 + +按如下格式运行指令 + +``` + +``` + diff --git a/Documents/DEPLOY_ZH.md b/Documents/DEPLOY_ZH.md new file mode 100644 index 0000000..e69de29 diff --git a/README_ZH.md b/README_ZH.md index 373115c..a63bcd3 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -8,43 +8,73 @@ --- +## 简介 + 超级Virtools脚本物化器(机翻(确信)) -本项目分为2个部分,`SuperScriptMaterializer`是一个C++工程,将生成一个Virtools界面插件用于导出初步数据,`SuperScriptViewer`是一个Python工程,将解析导出的数据,然后使用Flask提供一个本地Web界面进行脚本查看。 +本项目分为4个部分: -将Virtools文档中的所有脚本导出成一个SQLite数据库文件,然后经过Python进行排布处理,最后提供一个本地Web前端查看脚本。这同样适用于`Script Hidden`的Virtools脚本,也适用于其中含有不可展开的`Behavior Graph`的脚本。 +* `SuperScriptMaterializer`:一个C++工程,将生成一个Virtools界面插件或独立播放器用于导出初步数据。 +* `SuperScriptDecorator`:一个Python工程,将解析导出的数据,并将其组合成易于浏览的格式。 +* `SuperScriptViewer`:一个Python工程,使用Flask提供一个本地Web界面进行脚本以供快速查看,通常是用于本地快速查看解析后脚本的数据。 +* `SuperScriptEnterprise`:一个PHP工程,相对于`SuperScriptViewer`更适合部署于服务器上进行数据的展示和浏览。 + +整个工程所作的事情就是,将Virtools文档中的所有脚本导出成一个SQLite数据库文件,然后经过Python进行排布处理,最后提供一个本地Web前端查看脚本。这同样适用于`Script Hidden`的Virtools脚本,也适用于其中含有不可展开的`Behavior Graph`的脚本。 物化器不能完全恢复脚本的原有排布,无论原有排布是否存在,物化器都将重新自动生成脚本中的各个元素的位置。某些结构的关系可能会改变(例如Export parameter),亦或者是与Virtools中的呈现不同,但是逻辑思路将不会改变。同时物化器不能将已经生成的结构回写成Virtools可接受的格式,因此物化器只能提供无视脚本隐藏的分析功能。 -本工程代码源于另两个工程:[BearKidsTeam/Script-Materializer](https://github.com/BearKidsTeam/Script-Materializer)(该工程用于将指定脚本导出为JSON文档)和[BearKidsTeam/VirtoolsScriptDeobfuscation](https://github.com/BearKidsTeam/VirtoolsScriptDeobfuscation)(该工程能够在Virtools 3.5中提供内置的隐藏脚本解析功能,将解析结果解析为可以被Virtools识别的格式) - **注意事项** * 当前最新的commit并不一定可以稳定使用,请访问Release界面获取可以稳定使用的版本。 * 如果您更换了使用的版本(包括第一个稳定版本之前的版本),则需要重新构建所有数据,因为各个版本之间的数据可能彼此不兼容。 +## SuperScriptMaterializer + +SuperScriptMaterializer分为两种类型,一种是*插件*模式,在Virtools内部,作为界面插件,由人手动点击菜单进行导出,一般用于本地快速查看。另一种是*独立*模式,使用独立的Virtools编译器加载文件并导出,通过命令行参数的方式获得需要解析的文件和解析后数据库的路径,一般用于编写Shell脚本批量进行脚本导出。目前,我们支持的Virtools版本和模式如下: + +|已知的Virtools版本|插件模式|独立模式| +|:---|:---|:---| +|Virtools 2.1|× (0)|√ (1)| +|Virtools 2.5|× (2)|√| +|Virtools 3.0|× (3)|× (3)| +|Virtools 3.5|√ (4)|√ (4)| +|Virtools 4.0|√ (4)|√ (4)| +|Virtools 5.0|√|√| + +0. 没有可用的Virtools Dev 2.1,因此没有插件模式 +0. 使用Ballance Mod Loader提供的逆向Virtools SDK进行编译 +0. Virtools SDK不支持在界面上添加菜单 +0. 缺少Virtools SDK,无法编译 +0. 正在编写中 + ### 使用 - - Virtools Dev 5.0 - - 至少Python 3.0,且需要安装Flask库 - - 常见浏览器(除了Safari) +无论您现在要使用何种版本,您都必须先下载一份可用的,匹配的`sqlite.dll`。通常来说,我们在每一次版本发布的时候都会附带对应的`sqlite.dll`,您只需要下载即可。 -### 编译 +如果您将Virtools 2.1作为目标,则由于其只有独立模式,您需要准备一份Virtools 2.1的运行环境(通常而言是`CK2.dll`,`VxMath.dll`等一系列文件)。由于Virtools 2.1并没有创作环境,因此您只能从其他分发版本中获取到这个运行环境,通常来说,是一种游戏,在您的游戏文件夹内搜索相关dll即可找到,将下载好的独立模式的exe和`sqlite.dll`一起放在那里即可。 -为了编译或者调试这个项目,以下工具也是必须的。 +如果您选择其他Virtools版本,那么很幸运,它们的创作环境还能被下载到。因此,如果你选择独立模式,可以将下载到的exe和`sqlite.dll`一起放在Virtools创作环境的根目录下(通常有一个名为`Dev.exe`的可执行程序在那里)。当然,如果你是要解析某个游戏的内容,则可以和游戏所使用的Virtools环境放在一起。如果你选择插件模式,那么请仍然将`sqlite.dll`放在Virtools创作环境的根目录下,但是将下载到的dll插件文件放在名为`InterfacePlugins`的目录下。 - - Virtools Dev 5.0 SDK(在其他版本上或许也能工作,已测试Virtools 4可以无修改编译并运行) - - Visual Studio 2015(至少VC++ v140的工具集) +#### 插件版本 -## 使用方法 +启动Virtools,打开需要解析的文档,点击菜单栏的`Super Script Materializer`-`Export all script`,保存为`export.db`,然后等待Virtools提示你已经导出完成。这一步将导出所有脚本。然后同样的操作执行`Super Script Materializer`-`Export environment`,并将其保存为`env.db`。这一步将保存所有环境变量。环境变量很重要,尤其是分析脚本中的一些数据的时候。 -### 基本方法 +#### 独立版本 -将Virtools插件投入`InterfacePlugins`目录下,将`sqlite3.dll`和`Dev.exe`放在同一目录。如果你使用了Release页面的打包文件,则直接在Virtools根目录解压然后允许合并和覆盖即可。然后启动Virtools,打开需要解析的文档,点击菜单栏的`Super Script Materializer`-`Export all script`,保存为`export.db`,然后等待Virtools提示你已经导出完成。然后同样的操作执行`Super Script Materializer`-`Export environment`,并将其保存为`env.db`。 +在独立版本所在文件夹内启动命令行,按以下格式输入命令:`SuperScriptMaterializer.exe [virtools composition] [script db path] [env db path]` -将`export.db`和`env.db`与`SuperScriptViewer.py`放在一起。然后在此目录中运行`python ./SuperScriptViewer.py`,等待Python交互界面提示可以打开本地的网页即可。 +* `virtools composition`:要导出的Virtools文档的地址 +* `script db path`:导出所有脚本所用数据库的地址 +* `env db path`:保存所有环境变量所用数据库的地址 -`SuperScriptViewer.py`具有一些命令行开关: +## SuperScriptDecorator + + +### 使用 + +将上一步得到的`export.db`和`env.db`与`SuperScriptDecorator.py`放在一起。然后在此目录中运行`python3 ./SuperScriptDecorator.py`,等待Python交互界面提示可以打开本地的网页即可。 + +`SuperScriptDecorator.py`具有一些命令行开关: - `-i`:指定输入的`export.db` - `-o`:指定输出的`decorated.db`,如果已经存在将不考虑输入,直接使用输出数据库呈现 @@ -53,20 +83,41 @@ - `-f`:无参数,用于强制重新生成输出数据库,无论输出数据库是否存在 - `-d`:无参数,启用调试模式,直接抛出异常,而不是捕获后在控制台输出,方便调试 +### 提示 + 以上选项在基本使用中应该不会用到,因此按上述规则直接放置好文件直接运行即可。 +如果Python交互界面提示数据库`TEXT`类型解码失败,或者解析的字符出现乱码,那么可能您需要手动使用`-c`开关指定数据库文本解码方式。因为Virtools使用多字节编码,依赖于当前操作系统的代码页,`SuperScriptDecorator`做了特殊获取以保证大多数计算机可以直接运行,但仍然不能排除一些特殊情况。需要注意的是,指定的编码不是你计算机当前的代码页,而是制作这个Virtools文档的作者的计算机的代码页。 + +## SuperScriptViewer + 一份指导你如何使用Viewer的文档已内置在Viewer中,可以从Help页面进行查看 -### 使用注意 +## 问题反馈 -- 导出插件选择完文件后弹出错误,或者Python交互界面弹出错误,请附带您引起bug的文件以及错误窗口的内容提交bug -- 如果Python交互界面提示数据库`TEXT`类型解码失败,或者解析的字符出现乱码,那么可能您需要手动使用`-c`开关指定数据库文本解码方式。因为Virtools使用多字节编码,依赖于当前操作系统的代码页,`SuperScriptMaterializer`做了特殊获取以保证大多数计算机可以直接运行,但仍然不能排除一些特殊情况。需要注意的是,指定的编码不是你计算机当前的代码页,而是制作这个Virtools文档的作者的计算机的代码页。 +以下情况可能是程序陷入了错误,请附带您引起bug的文件(如果可以)以及错误窗口的内容提交bug + +* `SuperScriptMaterializer`插件模式在选择完文件后弹出错误或长时间没有反应 +* `SuperScriptMaterializer`独立模式输出了`[ERROR]`等类似内容 +* Python交互界面弹出错误 + +## 常见场景 + +// todo + +## 部署 + +参见[部署](./Documents/DEPLOY_ZH.md) ## 编译 +参见[编译](./Documents/COMPILE_ZH.md) + + ## 开发计划 @@ -74,4 +125,12 @@ * 当前页面搜索和全局搜索 * Shortcut追踪 -* 在Viewer中移动Block和BB \ No newline at end of file +* 在Viewer中移动Block和BB + +## 特别感谢 + +* Dassault System:提供了Virtools 2.5及其可用的SDK +* [BearKidsTeam/Script-Materializer](https://github.com/BearKidsTeam/Script-Materializer):该工程用于将指定脚本导出为JSON文档 +* [BearKidsTeam/VirtoolsScriptDeobfuscation](https://github.com/BearKidsTeam/VirtoolsScriptDeobfuscation):该工程能够在Virtools 3.5中提供内置的隐藏脚本解析功能,将解析结果解析为可以被Virtools识别的格式 +* [Gamepiaynmo/BallanceModLoader](https://github.com/Gamepiaynmo/BallanceModLoader):该工程提供了可以用于Virtools 2.1目标编译的,由逆向得到的Virtools SDK +* [phaicm](https://github.com/phaicm): 提供了许多测试文件用于修复程序Bug。以及说明文档翻译上的帮助。 diff --git a/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj b/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj index 1523f58..0755ec8 100644 --- a/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj +++ b/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj @@ -1,5 +1,4 @@ - - + Debug @@ -16,11 +15,12 @@ SuperScriptMaterializer 10.0 - + v100 Dynamic MultiByte + Application false @@ -28,19 +28,20 @@ true MultiByte Dynamic + Application - + - + - + - + $(VIRTOOLS_OUTPUT_PATH) true @@ -62,10 +63,10 @@ Level3 $(VIRTOOLS_HEADER_PATH);$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories) Disabled - WIN32;_WINDOWS;_USRDLL;$(VIRTOOLS_VER);VIRTOOLS_USER_SDK;_DEBUG;$(BML_SPECIAL_MACRO);VX_MEM_RELEASE;$(VIRTOOLS_BUILD_TYPE);%(PreprocessorDefinitions) + WIN32;_WINDOWS;_USRDLL;$(VIRTOOLS_VER);$(VIRTOOLS_EXTRA_MACRO);$(BML_SPECIAL_MACRO);VX_MEM_RELEASE;$(VIRTOOLS_BUILD_TYPE);%(PreprocessorDefinitions) EnableFastChecks true - 4819 + 4819;4996 $(VIRTOOLS_OUTPUT_PATH)SuperScriptMaterializer.$(VIRTOOLS_BUILD_SUFFIX) @@ -91,9 +92,9 @@ Default $(VIRTOOLS_HEADER_PATH);$(SQLITE_HEADER_PATH);%(AdditionalIncludeDirectories) ProgramDatabase - WIN32;_WINDOWS;_USRDLL;$(VIRTOOLS_VER);VIRTOOLS_USER_SDK;_DEBUG;$(BML_SPECIAL_MACRO);VX_MEM_RELEASE;_RELEASE;$(VIRTOOLS_BUILD_TYPE);%(PreprocessorDefinitions) + WIN32;_WINDOWS;_USRDLL;$(VIRTOOLS_VER);$(VIRTOOLS_EXTRA_MACRO);$(BML_SPECIAL_MACRO);VX_MEM_RELEASE;_RELEASE;$(VIRTOOLS_BUILD_TYPE);%(PreprocessorDefinitions) EnableFastChecks - 4819 + 4819;4996 true @@ -106,25 +107,27 @@ - - - - - - + + + + + + + - - - - - - + + + + + + + - + - + \ No newline at end of file diff --git a/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj.filters b/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj.filters index 3f7e0d2..b8a05d0 100644 --- a/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj.filters +++ b/SuperScriptMaterializer/SuperScriptMaterializer.vcxproj.filters @@ -33,6 +33,240 @@ 头文件 + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + @@ -53,6 +287,156 @@ 源文件 + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + diff --git a/SuperScriptMaterializer/script_export.cpp b/SuperScriptMaterializer/script_export.cpp index 9903e94..8ad064f 100644 --- a/SuperScriptMaterializer/script_export.cpp +++ b/SuperScriptMaterializer/script_export.cpp @@ -416,7 +416,10 @@ void DigParameterData(CKParameterLocal* p, scriptDatabase* db, dbScriptDataStruc } //float if (t == CKPGUID_FLOAT || t == CKPGUID_ANGLE || t == CKPGUID_PERCENTAGE || t == CKPGUID_TIME - || t == CKPGUID_FLOATSLIDER) { +#if defined(VIRTOOLS_50) || defined(VIRTOOLS_40) || defined(VIRTOOLS_35) + || t == CKPGUID_FLOATSLIDER +#endif + ) { helper_pDataExport("float-data", *(float*)(p->GetReadDataPtr(false)), db, helper, parents); return; } @@ -469,10 +472,11 @@ void DigParameterData(CKParameterLocal* p, scriptDatabase* db, dbScriptDataStruc return; } if (t == CKPGUID_2DCURVE) { - CK2dCurve* c; + //CK2dCurve* c; + CK2dCurve* c = (CK2dCurve*)p->GetReadDataPtr(false); char prefix[128]; int endIndex = 0; - memcpy(&c, p->GetReadDataPtr(false), sizeof(c)); + //memcpy(&c, p->GetReadDataPtr(false), sizeof(c)); for (int i = 0, cc = c->GetControlPointCount(); i < cc; ++i) { sprintf(prefix, "2dcurve.control_point[%d]", i); endIndex = strlen(prefix); @@ -518,7 +522,11 @@ void DigParameterData(CKParameterLocal* p, scriptDatabase* db, dbScriptDataStruc unknowType = TRUE; //if it gets here, we have no idea what it really is. so simply dump it. //buffer-like - if (unknowType || t == CKPGUID_VOIDBUF || t == CKPGUID_SHADER || t == CKPGUID_TECHNIQUE || t == CKPGUID_PASS) { + if (unknowType || t == CKPGUID_VOIDBUF +#if defined(VIRTOOLS_50) || defined(VIRTOOLS_40) || defined(VIRTOOLS_35) + || t == CKPGUID_SHADER || t == CKPGUID_TECHNIQUE || t == CKPGUID_PASS +#endif + ) { //dump data unsigned char* cptr = (unsigned char*)p->GetReadDataPtr(false); char temp[8]; diff --git a/SuperScriptMaterializer/virtools_compatible.cpp b/SuperScriptMaterializer/virtools_compatible.cpp index 5bf8048..7c0d55a 100644 --- a/SuperScriptMaterializer/virtools_compatible.cpp +++ b/SuperScriptMaterializer/virtools_compatible.cpp @@ -9,4 +9,8 @@ //FILE _iob[] = { *stdin, *stdout, *stderr }; //extern "C" FILE * __cdecl __iob_func(void) { return _iob; } -#endif \ No newline at end of file +#endif + +//void __declspec(noreturn) FAKE_THROW() { +// throw "Unimplemented function called."; +//} diff --git a/SuperScriptMaterializer/virtools_compatible.h b/SuperScriptMaterializer/virtools_compatible.h index 2c85fda..47aff22 100644 --- a/SuperScriptMaterializer/virtools_compatible.h +++ b/SuperScriptMaterializer/virtools_compatible.h @@ -3,6 +3,6 @@ #include "stdafx.h" - +//void __declspec(noreturn) FAKE_THROW(); #endif \ No newline at end of file diff --git a/SuperScriptMaterializer/vt_player.cpp b/SuperScriptMaterializer/vt_player.cpp index c7f433e..edf90f7 100644 --- a/SuperScriptMaterializer/vt_player.cpp +++ b/SuperScriptMaterializer/vt_player.cpp @@ -9,8 +9,6 @@ void PlayerMain(const char* virtools_composition, const char* script_db_path, co printf("Homepage: https://github.com/yyc12345/SuperScriptMaterializer\n"); printf("Report bug: https://github.com/yyc12345/SuperScriptMaterializer/issues\n"); - printf("Parsing %s...\n", virtools_composition); - // ====================== init ck2 engine CommonAssert(!CKStartUp(), "CKStartUp Error"); CKPluginManager* pluginManager = CKGetPluginManager(); @@ -30,6 +28,8 @@ void PlayerMain(const char* virtools_composition, const char* script_db_path, co #if defined(_RELEASE) try { #endif + printf("Parsing %s...\n", virtools_composition); + // ====================== do database export // define and init scriptDatabase* _script_db = new scriptDatabase(); @@ -64,6 +64,8 @@ void PlayerMain(const char* virtools_composition, const char* script_db_path, co delete _env_helper; delete _env_db; + printf("Done!"); + #if defined(_RELEASE) } catch (const std::exception & e) { std::string errstr; @@ -76,11 +78,17 @@ void PlayerMain(const char* virtools_composition, const char* script_db_path, co // ====================== free resources and shutdown engine DeleteCKObjectArray(array); + context->Reset(); context->ClearAll(); + + // todo: Virtools 4.0 standalone version throw exception in there, but i don't knwo why + // but it doesn't affect database export, perhaps CKCloseContext(context); + CKShutdown(); - printf("Done!"); + // todo: Virtools 2.5 standalone version throw exception in there, but i don't knwo why + // but it doesn't affect database export, perhaps } void CommonAssert(BOOL condition, const char* desc) { diff --git a/mk_materializer_cfg.py b/mk_materializer_cfg.py index 013ed1e..4a6b24e 100644 --- a/mk_materializer_cfg.py +++ b/mk_materializer_cfg.py @@ -20,13 +20,28 @@ virtools_attach_ref_plugin_dict = { "50": "vxmath.lib;DllEditor.lib;ck2.lib;InterfaceControls.lib;CKControls.lib" } virtools_attach_ref_standalone_dict = { - "21": "vxmath.lib;ck2.lib", - "25": "vxmath.lib;ck2.lib", + "21": "", + "25": "VxMath.lib;CK2.lib", "35": "vxmath.lib;ck2.lib", "40": "vxmath.lib;ck2.lib", "50": "vxmath.lib;ck2.lib" } +virtools_extra_macro_plugin_dict = { + "21": "", + "25": "", + "35": "_CRT_SECURE_NO_WARNINGS", + "40": "_CRT_SECURE_NO_WARNINGS", + "50": "" +} +virtools_extra_macro_standalone_dict = { + "21": "_DEBUG", + "25": "_CRT_SECURE_NO_WARNINGS;_DEBUG", + "35": "_CRT_SECURE_NO_WARNINGS;_DEBUG", + "40": "_CRT_SECURE_NO_WARNINGS;_DEBUG", + "50": "VIRTOOLS_USER_SDK;_DEBUG" +} + executable_virtools = { "21": "Dev.exe", "25": "Dev.exe", @@ -131,6 +146,7 @@ if input_build_type == build_type_plugin: virtools_debug_target = os.path.join(input_virtools_root_path, executable_virtools[input_virtools_version]) virtools_output_path = os.path.join(input_virtools_root_path, 'InterfacePlugins') virtools_attach_ref = virtools_attach_ref_plugin_dict[input_virtools_version] + virtools_extra_macro = virtools_extra_macro_plugin_dict[input_virtools_version] elif input_build_type == build_type_standalone: virtools_build_type = 'VIRTOOLS_STANDALONE' virtools_build_suffix = 'exe' @@ -139,6 +155,7 @@ elif input_build_type == build_type_standalone: virtools_debug_target = os.path.join(input_virtools_root_path, 'SuperScriptMaterializer.exe') virtools_output_path = input_virtools_root_path virtools_attach_ref = virtools_attach_ref_standalone_dict[input_virtools_version] + virtools_extra_macro = virtools_extra_macro_standalone_dict[input_virtools_version] # make sure the last char of output_path is slash if virtools_output_path[-1] != '\\' or virtools_output_path[-1] != '/': @@ -147,13 +164,18 @@ if virtools_output_path[-1] != '\\' or virtools_output_path[-1] != '/': # in virtools 2.1, we use bml, so we need add bml macro and set virtools header and virtools lib to blank # because all virtools file have been imported in project if input_virtools_version == '21': - virtools_header_path = '' - virtools_lib_path = '' bml_special_macro = 'BML_EXPORT=' + virtools_header_path = os.path.join(input_bml_path, 'virtools') + virtools_lib_path = '' else: - virtools_header_path = os.path.join(input_virtools_root_path, 'Sdk/Includes') - virtools_lib_path = os.path.join(input_virtools_root_path, 'Sdk/Lib/Win32/Release') bml_special_macro = '' + if input_virtools_version == '25': + virtools_header_path = os.path.join(input_virtools_root_path, 'Virtools_SDK/Includes') + virtools_lib_path = os.path.join(input_virtools_root_path, 'Virtools_SDK/Lib') + else: + virtools_header_path = os.path.join(input_virtools_root_path, 'Sdk/Includes') + virtools_lib_path = os.path.join(input_virtools_root_path, 'Sdk/Lib/Win32/Release') + # ======================== create document @@ -167,6 +189,8 @@ cache.setAttribute('Label', 'PropertySheets') root.appendChild(cache) # ======================== write build type +# due to build chain v100 shit design, this configuration onlt can be modified in .vcxproj +''' for bt in ('Debug', 'Release'): node_build_type = dom.createElement('PropertyGroup') node_build_type.setAttribute('Label', 'Configuration') @@ -178,6 +202,7 @@ for bt in ('Debug', 'Release'): node_configuration_type.appendChild(dom.createTextNode('DynamicLibrary')) node_build_type.appendChild(node_configuration_type) root.appendChild(node_build_type) +''' # ======================== write subsystem for bt in ('Debug', 'Release'): @@ -225,6 +250,7 @@ write_macro(dom, node_property_group, node_item_group, 'BML_SPECIAL_MACRO', bml_ write_macro(dom, node_property_group, node_item_group, 'VIRTOOLS_ATTACH_REF', virtools_attach_ref) write_macro(dom, node_property_group, node_item_group, 'SQLITE_ATTACH_REF', sqlite_attach_ref) write_macro(dom, node_property_group, node_item_group, 'VIRTOOLS_MODULE_DEFINE', virtools_module_define) +write_macro(dom, node_property_group, node_item_group, 'VIRTOOLS_EXTRA_MACRO', virtools_extra_macro) # ======================== write extra compile @@ -244,4 +270,31 @@ if input_virtools_version == '21': with open('./SuperScriptMaterializer/Virtools.props', 'w', encoding='utf-8') as f: dom.writexml(f, addindent='\t', newl='\n', encoding='utf-8') +# ======================== modify .vcxproj +# due to build chain v100 shit design, this configuration onlt can be modified in .vcxproj +if input_build_type == build_type_standalone: + vcxproj_build_type = 'Application' +elif input_build_type == build_type_plugin: + vcxproj_build_type = 'DynamicLibrary' + +vcxproj = minidom.parse('./SuperScriptMaterializer/SuperScriptMaterializer.vcxproj') +node_project = vcxproj.documentElement +for item in node_project.getElementsByTagName('PropertyGroup'): + attr_label = item.getAttribute('Label') + attr_condition = item.getAttribute('Condition') + if attr_label == 'Configuration' and (attr_condition == "'$(Configuration)|$(Platform)'=='Debug|Win32'" or attr_condition == "'$(Configuration)|$(Platform)'=='Release|Win32'"): + # valid node + node_cfg_type = item.getElementsByTagName('ConfigurationType') + if len(node_cfg_type) != 0: + # have node, change it + node_cfg_type[0].childNodes[0].nodeValue = vcxproj_build_type + else: + # don't have node, add one + node_cfg_type = vcxproj.createElement('ConfigurationType') + node_cfg_type.appendChild(vcxproj.createTextNode(vcxproj_build_type)) + item.appendChild(node_cfg_type) + +with open('./SuperScriptMaterializer/SuperScriptMaterializer.vcxproj', 'w', encoding='utf-8') as f: + vcxproj.writexml(f, encoding='utf-8') + print("OK!")