君望程序方面的备忘

近来再次整理了RioX和XRioTools相关代码,借以熟悉gcc4.8/C++11/wxWidgets3.0。顺便也看了看代码逻辑,简化了一些不必要的结构。主要的改动,一是简化和统一了流操作,二是修正了offset的计算方式,三是规范了工具集XRioTools的代码。然后继续尝试了点文本替换方面的事。

现有的文本替换方式基本与RIODecode一致。不同点一是RIODecode通过填充保证每句新文本不短于原来的,XRioTools则通过缩短和填充保证一个脚本中的所有文本总长不变;二是RIODecode把新脚本添加到rio文件结尾,而XRioTools是原地替换。仅考虑翻译成中文的话,用现有方法就够了,但是英化需要RIODecode的方式。

这次再挑战了一下,发现还是有问题。首先是,缩短脚本中文本总长有问题。通过修改位移和大小标记,可以成功执行脚本并正确显示直到缩短的那句文本(记为第k句),但是游戏在缩短后的那句(即第k+1句)停止响应。而如果前面缩短了后面隔几句(记为隔了m句)再补回来,就可以正确跑完整个脚本。这里比较难理解的就是,两种情况在截至第k+m句的脚本数据是完全一致的,不同只出现在第k+m句补回长度之后,但是不同的程序表现出现在第k+1句。RIODecode大约也是因此而强制要求每句新文本都不短于原来。这里只能去游戏程序里找RIODecode和alterdec都没有给出的提示了。所以,搁置。

另一个问题是,把脚本添加至rio文件末尾也有问题。把一个脚本复制后添加到末尾,并修改相关位移/大小标记后,游戏能进去,但是这个脚本进不去,rUGP报错是“捕捉到未处理的异常”。想来是关于数据一致性的问题,起码有ici和rio里相关的文件长度记录的问题吧。但是改了这些文件里能找到的部分会报安装不完整的错,估计是找的不全。这部分RIODecode有可能是解决了的(也不排除DVD版和LE版有差异的可能),但是过去时间较久,资料不全没能找出来。所以,连同文本加长问题一起搁置。

折腾了一下的结果是文本替换部分没有方法性的改进,暂时也没有改进的头绪了。不过有一个有用的副产品,就是修正了之前的offset计算方式。之前是统一按照MLA的offset算法算的,这次发现是个误解——MLA的那个做法是rio数据超过4G条件下的特例。以前的做法并不影响提取以及不改变对象大小的替换,而新的知识使图片的修改和替换成为可能。初步的尝试已经成功,也将功能写进了XRioTools。虽然会受到很多限制,仍旧是多了一项功能。

到此为止,手上有的线索基本全利用上了。所以,程序方面的工作告一段落。君望的翻译工作还差很多,一年多来KidFansClub方面几乎没有进度,差不多都是我在翻。需要做一下打算了。