本帖最后由 绿色的糖果 于 2026-7-16 16:55 编辑
把 SMWP 从 GM8.0 升级到 GM8.2 的坑点
〇、说明
1. 目的:将 SMWP 从 GM8.0 升级至 GM8.2。GM8.2 对外部工具友好,具体而言就是支持版本控制系统、允许 AI 直接编辑,有利于提高 SMWP 的开发效率。
2. 升级项目本身很有挑战性:这是一个不太可控的过程,并且 SMWP 有加密功能,密钥需要特殊处理一下。因此,我在升级过程中只开了一个临时性的仓库。在处理后重新开新的仓库会导致所有 commits 附带的代码更改和说明消失,而开源的一部分意义就在于。因此,我在升级过程中写了这份文档来保留这些经验。
3. 我不会编写 C++ 代码,对 SMWP 项目有一些了解,因此整个升级过程主要由 AI 来进行。
4. 遇到 C++ 编写扩展这样几乎完全依赖 AI 的情况,我会让 AI 输出各种方案并做尝试。同时,在最终选择之前,我会根据已有的游戏经验来进行判断(下文第一部分有所体现)。
一、FoxWriting 扩展
1. 由于 GMAPI 变动,FoxWriting 扩展需要重写。AI 认为如果使用 d3d8 的相关库,那么完美重写扩展基本是无解的。AI 给出的若干种方案,可以总结为这两种:
- 方案一:另叠一层用于渲染文本,但是可能有 OBS 捕获游戏画面捕捉不到文本渲染的风险,因此这个方案我没有采用。
- 方案二:使用 GDI+ 绘图。据 AI 查阅资料,d3d8 的支持较差,因此会出现绘制后的文字黑白闪烁的情况。测试也确实如此,因此本方案也弃用。
2. 经我自己搜索发现,GM8.2 自带 d3d9 扩展,可以升级到 d3d9 后编写新的扩展来绘制文本。于是我让 AI 查阅 GM8.2 d3d9 相关的信息,并且以此编写新的 fw 扩展。
3. 编写完扩展后,记得也要给 24H2 Intel 新核的用户测试。
二、函数变动
1. string_char_at 函数有变动,原先输入的参数应当在升级时 +1。
三、编码、系统环境
1. GM8.2 对中文路径的支持有别。经测试,如果保存/读取关卡带有中文路径,那么会阻碍 SMWP 内的 GZip 工作。
2. GM8.1、GM8.2 采用 UTF-8 编码,因此需要追加转码的处理,为此专门编写了一个扩展处理编码问题。
3. 解决完上面的问题后,我自己遇到了信息砖物件导致的读取串行问题。另外,由于是 UTF-8 编码,每一个汉字是被视作一个字符而非 GB2312 的两个字符处理的,而信息砖 FoxWriting 显示字符的规则是一帧显示一个字符,所以文本显示速度基本翻倍;当然,在 GB2312 编码下每个汉字只加载第一个字符的时候会显示“?”,下一帧才显示这个汉字。
四、密钥
1. 这一条应该是要写在第三大点里面的,因为GM8.2里ord()对一个中文字符返回的值和GM8.0不一样;还有,经测试,XOR对称加密脚本本身过程需要改一下,但里面的细节我无力吐槽了。单开这一点是因为我跑了好几天AI才跑出来,花的时间和第三大点差不多。
2. 这一小点也可以作为总结:在整个升级过程中没人可以预先知道函数是因为8.2 Project自己主观上想修改、还是技术上的其他原因、还是GM8.0中文支持版本切换过来的导致的表现不一致的问题、以及扩展API上也有变动。实际上因为工作流特别差劲,我从7月6日做到了16日才差不多弄完(期间也有nl提供意见)。比较好的做法是自己先绞尽脑汁思考所有问题相关的函数,让AI做最小单位的测试,再让AI去进一步给出方案、自己判断和处理。 |