ZQF-ReVN / RxPJADV

PJADV Engine Tools. | textdata.bin scenario.dat
8 stars 1 forks source link

[help] 行距。 #1

Closed prowaynes closed 6 months ago

prowaynes commented 7 months ago

非常感谢你们的辛勤工作。我在查看内存转储时发现,文本中每个字母之间多了一个空格。我一直在试图找出造成这种情况的原因,所以请告诉我应该从哪个方向查找信息。 1 2

Dir-A commented 7 months ago

引擎默认设置为字体间距固定,单字节字符宽度绘制宽度会减半,像是 ‘a’:0x41 这种,所以英文可以正常显示,我还没有分析完字体绘制的全部流程,引擎应该支持可变间距,总得来说间距可以被修复,不是主要的问题

最主要的问题是,这个引擎的文本框一般默认只能显示3行,暂时没找到修改的方法,也没有完整的脚本反编译工具,这意味不能够直接增加文本页数,所以唯一的办法是缩小字体来放下更多的俄文单词,但是我测试过,三行并不能放下多少俄文字母,大概100个左右(包括括号)

prowaynes commented 7 months ago

这不是主要问题,因为您可以用不同的方式来解释文本。编辑器可以处理这个问题。他们可以将长句改写成短句,而不会失去意义。主要问题是固定间隔,我有一个程序的例子,它被删除了,但问题是它不能与该游戏一起使用,因为它与另一个游戏的 EXE 绑定。 以下是翻译实施的示例 Taiyou no Promia https://vndb.org/v4259 рус.zip 但在这款游戏中,俄语最初可以正常使用,唯一的问题是由 promia_ru.exe 修正的时间间隔,我还不明白他们是如何做到这一点的,以及如何重复这一点。 image

Dir-A commented 7 months ago

好吧,我稍微看了一下间距的控制,总得来说,要直接修改间距很麻烦,每个游戏都需要重新找地址,但游戏对单字节显示会间距减半,显示俄文勉强能看。

我看了 Taiyou no Promia 的实现,它修补了很多地方,我不能向你展示它的修补方法,因为它需要了解引擎的内部的运行原理,我可以写在这,但会很长,很浪费时间,也很难在其它游戏上复现,简单来说,就是写了你也不一定能懂。

所以我选择向你说明一个简单的方法,它可以显示出可接受范围内的俄文字体,而不需要过多的修改

第一步应该先把 引擎的字体渲染方式切换的GDI,就像我在这篇文章中说的那样实例修改

切换好后就可以修改CreateFont的参数,比如charset,来控制编码了,否则游戏默认是从fontdata.dat中加载字体图形的

nop fontdata.dat加载 2

现在可以修改 CreateFont的charset为0xCC ,这是俄文的chaeset,并nop掉游戏的内置字体切换分支,同时修改字体名为Segoe UI 3

然后要找到日文的边界检查 ,搜索常量0x9F,找到检查的代码,nop掉 1

现在引擎就可以读取cp1251编码的文本 4 可以发现,其实它还是固定间距的,但这个是我能给你介绍的最简单的修改方法了。

prowaynes commented 7 months ago

非常感谢。 https://github.com/pkuislm/PJADV-Font-Maker 我看到有人写了一个字体创建实用程序,但我还没怎么学过,我需要在更改之前找出游戏使用的字体。

prowaynes commented 7 months ago

今天我再次尝试修改文件,得到的结果是这样的:

2024-02-16 11 58 02

我首先比较了文件,发现类似的分支(在 promia 中)并不在 tarareba 游戏中。

2024-02-16 14 15 39

当我删除搜索常数 0x9F 时,情况变得更糟了。

2024-02-16 14 41 18

但无济于事。

2024-02-16 14 49 08

但我决定再重复一遍,首先我使用了之前的版本,其中字母之间有空格,然后删除了搜索常数 0x9F(因为我之前忽略了它)。

resource.zip

我还会添加我用来打包文本的实用程序,也许这就是问题所在......还有 exe,请看一下。 https://vndb.org/v18749 - 同时附上游戏链接。谢谢。

Dir-A commented 7 months ago

你应该遵循我说的步骤,首先你应该把游戏的渲染方式从 字体文件渲染 ,切换到从 GDI渲染 ,就和我之前附上的文章中说的那样

这个游戏默认是从fontdata.dat文件中获取某个字符的图形,然后把这个图形贴图到文本框上,如果是这种渲染方式,不管你如何修改,都不可能正确显示,因为fontdata.dat文件的字符图形数量是有限的,并不能显示所有字符,而且默认是SJIS编码的

所以你的第一步应该是把字体的渲染方式切换到GDI,也就是抛弃fontdata.dat文件,我们并不需要fontdata.dat也不需要去修改它。

只有你完成了文本渲染方式的切换,一切才能够继续

这是我修改好的文件,你可用使用它,并对比区别,exe是游戏的原始版本,并没有安装更新补丁 promia_nod.zip

prowaynes commented 7 months ago

非常感谢。我不明白如何切换渲染模式,我会再看看这篇文章的。 我以为绑定是(图片),但那个游戏里没有,所以我很困惑。 image

Dir-A commented 6 months ago

我关了这个issue,如果你有任何问题可以重新打开

prowaynes commented 4 months ago

image 下午好,到目前为止,我使用小说 tarareba 实现了这些结果,我想我没有正确指定字体,能否请您看看当前文件的字体。https://vndb.org/v18749 文本以 CP1251 编码 谢谢

tarareba-test-12-rus.zip

prowaynes commented 4 months ago

image

我还试着移动字体说明并对其进行调整,这是我得到的最好的结果。但还有一个问题,就是空格过大,字母 (ы) 或 (ж) 会被切掉一些......如果您尝试将 lfWidth 增加到 10 以上,文本会立即变粗,并立即导致......恐怖。

image

我移动了下面的一些说明,这样更改数值就不会破坏代码的完整性。

tarareba-test-27-rusbad.zip

Dir-A commented 4 months ago

tarareba_ru.zip

你基本上是正确的 我添加了两项修改

1、字体名称改为 Cyrillic 似乎拥有更好的显示效果 2、移除读取textdata.bin的解密过程,因为garbro解密了textdata.bin,所以为了让游戏能够直接读取没有加密的textdata.bin,我们需要阻止程序再次解密

你之所以有显示问题,我的猜测是你导入了错误的编码到textdata.bin,你可以查看我修改过的textdata.bin文件 QQ截图20240508010507