耐力大师

耐力大师

冲刺、攀爬、游泳和滑翔不消耗耐力,马匹想跑多久就跑多久。每项消耗都是你设定的百分比,因此你可以让它更便宜而不是免费。启动时写入一张表,不触碰游戏文件,不重新打包任何内容。

[size=5][b]耐力大师[/b][/size]
[i]奔跑、攀爬、游泳和滑翔时不再有耐力条阻碍,马匹也能随心所欲地一直疾驰。Crimson Desert 2.03.00。[/i]

Crimson Desert 中每一个消耗耐力的技能都带有一个数字,标明消耗多少。共有 206 个这样的技能,从冲刺每 tick -8000 到 TriStar 最重的一击 -240000。本模组会在启动时找到这个数字,并乘以你设定的值。开箱即用时,它会将所有这些数字设为零。

马匹的运作方式不同,需要单独处理,这也是本模组中需要第二次尝试的部分。

[size=4][b]它改变了什么[/b][/size]
[list]
[][b]各项的消耗。[/b]游戏的技能表保存了每个技能的资源消耗列表,其中命名耐力的那些就是本模组重写的内容。2069 个技能中有 206 个技能共 206 项消耗。插件在启动时通过其管理器类找到该表,检查五个已知技能是否携带游戏自身数据文件所声称的消耗值,确认无误后才写入。[/]
[][b]马匹恢复的速度。[/b]马的步态决定了它恢复耐力的速度,速度越快恢复率越低。站立不动时每 tick 100000,慢跑时 40000,全速疾驰时 9000。有某样东西的消耗速度快于 9000,所以疾驰的马会疲劳。将骑乘状态下的那一项消耗设为零并不能阻止这一点。提高恢复率则可以,这就是 MountRegenPercent 的用途。[/]
[][b]任何恢复耐力的内容。[/b]有十二个条目是恢复耐力而非消耗耐力,即站立不动、行走、防御和挂在壁架上时所做的。它们均未被改动,因此食物和休息的作用与原来完全一致。[/]
[/list]不会修改任何游戏文件,不会重新打包任何内容,也不会触及你的存档。改动仅存在于游戏运行期间的内存中。

[size=4][b]设置[/b][/size]
StaminaMaster.ini 位于插件旁边,在 [settings] 节下。其中的每个默认值也是插件自身的默认值,因此该文件是可选的。删除它不会有任何损失。插件在第一次找不到该文件时会生成一个。
[list]
[][b]UsePercent[/b] (0) 每次使用收取一次的费用,例如翻滚、跳跃或武器挥击。共有 130 项。以游戏自身消耗的百分比表示,100 表示维持不变。[/]
[][b]ContinuousPercent[/b] (0) 61 项在你按住按键时持续产生的消耗,即冲刺、攀爬、游泳、滑翔翼和火箭背包。[/]
[][b]MountPercent[/b] (0) 骑乘时消耗耐力的行为,包括按住和点按。共有 15 项。[/]
[][b]MountRegenPercent[/b] (1000) 马匹恢复速度相对于游戏自身恢复率的百分比。这里的其他所有设置都是降低数值,而这一项是提高数值,范围从 100 到 10000,因为让马疲劳的原因是恢复率随速度下降。设为 1000 时,全速疾驰的恢复量与站立不动时大致相当。低于 100 会被拒绝;让马更快疲劳并非本模组的目的。[/]
[][b]Probe[/b] (0) 将研究报告写入日志。每个被更改的数字一行,并在游戏开始后一分钟和两分钟时重新读取,以确认更改仍然存在。这是提交错误报告时应附上的内容。[/]
[/list]任何超出范围的数值都会导致整个写入被拒绝,包括那些原本在范围内的设置,因此一个笔误不会造成任何更改,而不是只改一半。

[size=4][b]它也影响战斗[/b][/size]
攻击、闪避、擒抱和弓箭射击都在这 206 项之中。这是有意为之,因为游戏没有任何地方记录某个技能是用于旅行还是用于战斗。每个技能上的九个字段都经过了检查,还有技能组表,而攀爬与攻击共享每一个值。

数据确实区分的是费用的收取方式,这也是设置如此拆分的原因。如果你想让耐力条在旅行时消失而在战斗中保持不变,并没有一条清晰的分界线,但将 UsePercent 设为 100 可以让一次性费用保持不变,同时保持持续消耗免费。攀爬同时出现在这两类中。做出攀爬动作时收取一次费用,挂在原地则持续消耗。

如果你只想让模组作用于马匹而不影响其他,将 UsePercent、ContinuousPercent 和 MountPercent 全部设为 100。

[size=4][b]安装[/b][/size]
[b]使用 Definitive Mod Manager (DMM)[/b]
[list=1]
[]下载 DMM 文件并将其拖到 DMM 窗口上。[/]
[]启用它并 Mount。DMM 会注册 StaminaMaster.asi 并自带加载器。[/]
[/list]DMM 压缩包中仅包含插件本身,因为这是 DMM 所安装的内容。默认值已编译在内,因此它自身即为完整,插件在第一次发现旁边没有 StaminaMaster.ini 时会生成一个。启动游戏一次,该文件就会出现在 bin64 中等待编辑。你已有的 ini 不会被改动。

[b]手动安装[/b]
[list=1]
[]Ultimate ASI Loader (winmm.dll) 必须放在游戏的 bin64 文件夹中,与 CrimsonDesert.exe 相邻。[/]
[]在游戏关闭的情况下,将 StaminaMaster.asi 和 StaminaMaster.ini 复制到 bin64。[/]
[]启动游戏。StaminaMaster.log 会出现在插件旁边,并说明它更改了什么。[/]
[/list]
[b]卸载[/b] 就是从 bin64 中删除 StaminaMaster 文件。没有需要撤销的元补丁,也没有需要移除的 pack 文件夹。

[b]如果另一个模组已经占用了 winmm.dll[/b]
OptiScaler、某些帧生成版本以及某些 ReShade 配置会安装它们自己的 winmm.dll,而那个不会加载任何 ASI 插件。不要动它们的文件,将 Ultimate ASI Loader 重命名为其他未被占用的名称。[b]xinput1_4.dll[/b]、[b]wininet.dll[/b]、[b]winhttp.dll[/b] 和 [b]d3d12.dll[/b] 均由 CrimsonDesert.exe 直接导入。[b]version.dll[/b] 也可以,更进一步:exe 不导入它,但 sentry.dll 会,而 CrimsonDesert.exe 在每次启动时都会导入 sentry.dll。bin64 中出现 StaminaMaster.log 就是全部的测试;没有日志意味着没有任何东西加载了插件。

设置只在游戏启动时读取一次,因此更改为 ini 后需要重启。

[size=4][b]兼容性[/b][/size]
[list]
[]为 Crimson Desert 2.03.00(exe 1.0.0.2944)构建。该表通过其管理器类找到,其行会在写入任何内容之前与游戏自身的数据进行比对,因此在不同的版本上你会在日志中得到一行记录,而不是一个损坏的游戏。这里没有任何内容依赖固定地址。[/]
[][b]不要与更改耐力的 pack 模组一起运行。[/b]那些模组会替换磁盘上的游戏数据,而本模组会重写已加载的表,因此最终进入内存的是哪个数字都不是这两个模组能保证的。请二选一。[/]
[]它与 Master Looter、Flight Freedom 和 Glint Spotter 可以无冲突共存。每个都是独立的 .asi,它们触及的内容不同。[/]
[]仅限单人游戏。不要在任何会给你带来相对于他人优势的地方使用它。[/]
[/list]
[size=4][b]已知限制[/b][/size]
[list]
[]马匹仍然有耐力条,它仍然会移动。找到的是恢复率,提高它才是让耐力条在疾驰时保持满格的方法。与之对抗的消耗从未被识别出来,只知道它小于提高后的恢复率,因此坐骑做出异常昂贵的动作时仍可能耗尽耐力条。[/]
[]费用在表加载时被重写一次。如果游戏的某个部分在会话中途重新加载该表,那么重新加载后的会话将恢复为游戏自身的数字,直到你重启。目前尚未观察到任何这样的情况,而且游戏进行两分钟后的重新读取确认了写入仍然存在。[/]
[]游戏以耐力以外的东西收取费用的技能不会被触及,包括法力。[/]
[/list]
[size=4][b]如果出现问题[/b][/size]
StaminaMaster.log 写在插件旁边,在 Steam 安装中即 ...\steamapps\common\Crimson Desert\bin64\StaminaMaster.log。它记录了它读取的设置、在每个类别中重写了多少项费用,以及它拒绝做的任何事及原因。设置 Probe=1 并重启,可获得每个技能一行以及之后的重新读取。提交报告时请附上相关行,以及发生了什么和你当时在哪里。

[size=4][b]它是如何被找到的[/b][/size]
耐力数值不在任何以耐力命名的表中。游戏自身的加载器在错误消息中提到的每一种记录类型都被列出,共 551 种,唯一匹配该词的字段是一个关于是否绘制耐力条的标志。

保存费用的是技能表,位于每个技能记录上的一个列表之后。错误地读取该列表是这里花费时间最多的地方。第一次尝试将其视为一对指针,大小未通过合理性检查,每个技能都报告空列表,包括用作对照的那个。游戏自身的加载器解决了这个问题。它读取的每个字段都会在代码中留下一种独特的形态,字段名附加在失败分支上,因此遍历一次加载器就能打印出整个记录布局,而读取列表的例程显示它是一个指针、一个计数和一个容量,条目之间相隔 24 字节。

在写入任何内容之前,有两个独立的检查确认了该布局。每个状态记录都携带自身名称的哈希,而两个耐力行的哈希与在游戏外对这些名称进行哈希的结果完全一致。另外,每一项费用都通过行索引指向修改它的两个速率属性,而这些索引正是提取出的数据文件赋予它们的行号。

[size=4][b]文件[/b][/size]
1.0.0 的 SHA-256:
[code]a278e714cec79e1ad4fcdc3f86bdfab1a0ef7db2a217e9aa44afe3954d341c29  StaminaMaster-1.0.0-DMM.zip
0f7c422312850e8e38f41afd6ddcabf6de33f0bcde00311fc2d9dc0f76c132da  StaminaMaster-1.0.0.zip
24351b603a80598fe3edb6ce72e63efebc0d74dd3b9fdcc5d3fa8503dba338a0  StaminaMaster.asi[/code]
没有任何内容被标记。在 1.0.0 上,该插件在 VirusTotal 上得分为 70 项中 0 项,DMM 压缩包为 67 项中 0 项,完整压缩包为 68 项中 0 项。报告见 [url=https://www.virustotal.com/gui/file/24351b603a80598fe3edb6ce72e63efebc0d74dd3b9fdcc5d3fa8503dba338a0]插件[/url]、[url=https://www.virustotal.com/gui/file/a278e714cec79e1ad4fcdc3f86bdfab1a0ef7db2a217e9aa44afe3954d341c29]DMM 压缩包[/url] 和 [url=https://www.virustotal.com/gui/file/0f7c422312850e8e38f41afd6ddcabf6de33f0bcde00311fc2d9dc0f76c132da]完整压缩包[/url]。

该插件只导入一个系统库 kernel32,别无其他:无网络、无注册表、除自身的 ini 和日志外不访问任何文件。扫描器仍可能对其形态提出异议,因为它是一个由加载器放入游戏内部的 DLL,一旦进入就会写入游戏内存。修改器也这样做,所以基于修改器训练的模型会说它是修改器。它已进行代码签名,在 StaminaMaster.asi 的 属性、数字签名 中显示为 Seth Walker。

[size=4][b]源代码与许可证[/b][/size]
MIT 许可。源代码和构建说明在 GitHub 上:[url=https://github.com/shin2344234/stamina-master]github.com/shin2344234/stamina-master[/url]

[size=4][b]致谢[/b][/size]
PhorgeForge 的 [url=https://www.nexusmods.com/crimsondesert/mods/107]Infinite Stamina[/url] 是本模组所要匹敌的对象,也是让人们知道这件事可行的原因。那个模组编辑的是磁盘上的游戏数据;本模组走了一条不同的路到达同一个地方。

[size=4][b]Discord 和 Patreon[/b][/size]
[url=https://discord.gg/AZ2ztQYy74]Shin234's Mods 'n Stuff[/url] 是 Discord,用于提问和观看正在进行的内容。Bug 最好发到 bugs 标签页或作为 GitHub issue,以便被追踪。
Patreon 是 [url=https://www.patreon.com/cw/Shin234]patreon.com/cw/Shin234[/url],帖子在 [url=https://www.patreon.com/cw/Shin234/posts]patreon.com/cw/Shin234/posts[/url]。所有发布的内容保持免费,不会为此保留任何东西。