亨利的感官 - 战利品与物体高亮

亨利的感官 - 战利品与物体高亮

《天国:拯救》的拾取物和物体高亮模组。

[size=5]前言[/size]
[b]Henry's Senses[/b] 是我同名 [url=https://www.nexusmods.com/kingdomcomedeliverance2/mods/3767]《天国:拯救 II》模组[/url] 的移植版本。按下一个按键,即可用轮廓和填充高亮附近的战利品和草药。它使用了游戏自带的剪影效果——这是 CryEngine 的一项功能,《天国:拯救》仍然内置但从未使用。

目前仍处于早期阶段。如果有东西没有被高亮、显示异常或无法正常工作,请附上你的游戏/模组版本、设置和日志进行反馈。感谢你的尝试!
[size=5]主要功能[/size]
[list]
[]高亮附近可搜刮的尸体、动物尸体、掉落物品、容器和草药[/]
[]轮廓和填充,可穿透墙壁和草丛显示;可选仅显示可见表面模式[/]
[]可选分组,用于活着的 NPC、动物以及门、床和工作台等交互物体[/]
[]每个分组可配置颜色、样式、范围、持续时间和快捷键[/]
[]脉冲、切换、按住和常亮激活模式[/]
[]针对被盗、空、上锁及其他标记物体的过滤器,使用游戏自带的搜刮检查[/]
[]键盘和 XInput 手柄绑定,包括修饰键组合[/]
[]保存 INI 时实时重新加载配置[/]
[][url=https://github.com/tkhquang/KCD1Tools]开源[/url],基于 [url=https://github.com/tkhquang/DetourModKit]DetourModKit[/url] 模组框架构建[/]
[/list]
[size=5]前置需求[/size]
[list]
[]PC 版《天国:拯救》;基于 Steam 1.9.8 构建[/]
[]一个 ASI 加载器——[b]不包含[/b](见下方第 1 步)[/]
[/list]
[size=5]安装[/size]
这是一个 [b].asi[/b] 插件,需要一个 [b]ASI 加载器[/b],下载包中[b]不包含[/b]该加载器。

[size=4]找到安装文件夹[/size]
打开你的 KC:D 安装文件夹,然后打开包含 [b]WHGame.dll[/b] 的 Bin/Win64 子文件夹。在 Steam 上路径为:
[code]<KC:D 安装文件夹>/Bin/Win64/[/code]用 WHGame.dll 来确认正确的文件夹。加载器和模组文件直接放入此文件夹。

[size=4]第 1 步:安装 ASI 加载器[/size]
如果你已经有可用于 KC:D 的 ASI 加载器,请跳到第 2 步。同一个加载器可以加载 Henry's Senses、TPVCamera 和其他 ASI 模组。

下载 ThirteenAG 的 [url=https://github.com/ThirteenAG/Ultimate-ASI-Loader/releases]Ultimate ASI Loader[/url] 的[b]一个 x64[/b] 版本:
[list]
[][url=https://github.com/ThirteenAG/Ultimate-ASI-Loader/releases/download/x64-latest/dinput8-x64.zip][b]dinput8.dll[/b][/url] - 如果 dinput8.dll 未被占用,这是常用选择。[/]
[][url=https://github.com/ThirteenAG/Ultimate-ASI-Loader/releases/download/x64-latest/version-x64.zip][b]version.dll[/b][/url] - 当 dinput8.dll 已被占用时(包括被 KCSE 占用)的备选方案。[/]
[][url=https://github.com/ThirteenAG/Ultimate-ASI-Loader/releases/download/x64-latest/winmm-x64.zip][b]winmm.dll[/b][/url] - 如果 version.dll 也被占用或无法加载时的另一个备选方案。[/]
[/list]将所选 ZIP 中的 DLL 解压到 WHGame.dll 旁边。使用 [b]x64[/b] 版本,而非 Win32,并且只安装一个 Ultimate ASI Loader 变体。不要覆盖属于其他模组的 DLL。

[b]正在使用 [url=https://www.nexusmods.com/kingdomcomedeliverance/mods/2244]Kingdom Come Script Extender (KCSE)[/url]?[/b] KCSE 使用 [b]dinput8.dll[/b]。保留 KCSE 的文件,并将 Ultimate ASI Loader 安装为同一文件夹下的 [b]version.dll[/b] 或 [b]winmm.dll[/b]。从上面的下载中选择一个未使用的名称;不要重命名或替换 KCSE 的 DLL。

[size=4]第 2 步:安装模组[/size]
从 Files 标签页或 [url=https://github.com/tkhquang/KCD1Tools/releases]GitHub Releases[/url] 下载 Henry's Senses 发布压缩包。将其内容直接解压到 WHGame.dll 和你的加载器 DLL 旁边的[b]同一文件夹[/b]中,不要创建以压缩包命名的额外子文件夹。
[list]
[][b]KCD1_HenrySenses.asi[/b] - 模组本体。[/]
[][b]KCD1_HenrySenses.ini[/b] - 设置。[/]
[][b]KCD1_HenrySenses.particles.xml[/b] - 可选的自定义粒子效果。如果你在某个分组中使用了 HenrySenses. 效果,请将其放在 ASI 旁边;默认没有分组使用粒子。[/]
[/list]Henry's Senses 不使用 Mods 文件夹。

[b]文件夹结构:[/b]
[code]
Bin/Win64/
|-- WHGame.dll (游戏文件,已存在)
|-- dinput8.dll (ASI 加载器;见上方 KCSE 说明)
|-- KCD1_HenrySenses.asi (此模组)
|-- KCD1_HenrySenses.ini (设置)
|-- KCD1_HenrySenses.particles.xml (可选粒子效果)
\-- KCD1_HenrySenses.log (模组加载时创建)[/code]使用 KCSE 时,此示例中的 dinput8.dll 属于 KCSE;你选择的 ASI 加载器 version.dll 或 winmm.dll 位于其旁边。

[size=4]第 3 步:启动并验证[/size]
启动游戏,加载存档,按 [b]H[/b](或按住 [b]RB + 按 Start[/b])高亮战利品。[b]左 Shift + H[/b](或按住 [b]RB + 按 Back[/b])高亮草药。

检查 ASI 旁边是否有 [b]KCD1_HenrySenses.log[/b]。如果没有,请检查 ASI 和 x64 加载器 DLL 是否直接位于 WHGame.dll 旁边,然后尝试另一个未使用的加载器变体并重新启动。只替换你安装的 Ultimate ASI Loader DLL;保留 KCSE 和其他模组的 DLL。在 Wine/Proton 上,还要检查下方的覆盖设置。

更新时,在解压新压缩包之前备份你自定义的 INI,然后将你的设置重新应用到提供的 INI 上。

[size=5]Linux / Steam Deck (Wine/Proton)[/size]
在 Steam 上的游戏[b]属性 -> 启动选项[/b]中,为你选择的加载器 DLL 添加覆盖设置:
[code]WINEDLLOVERRIDES="dinput8=n,b" %command%[/code]当使用 version 或 winmm 作为加载器名称时,请改用 version=n,b 或 winmm=n,b。如果你同时使用 KCSE 的 dinput8.dll 和 version.dll 加载器,请保留两个覆盖设置:
[code]WINEDLLOVERRIDES="dinput8,version=n,b" %command%[/code]对于命令行启动,在启动命令前设置相同的 WINEDLLOVERRIDES 值。保留其他模组所需的任何覆盖设置。

[size=5]默认控制[/size]
所有按键都可以在 KCD1_HenrySenses.ini 中重新绑定。
[list]
[
][b]高亮战利品:[/b] H,或按住 RB + 按 Start(手柄)。[/]
[
][b]高亮草药:[/b] 左 Shift + H,或按住 RB + 按 Back(手柄)。[/]
[/list]高亮会脉冲显示 [b]5 秒[/b],然后在 [b]1 秒[/b]内淡出,范围为 [b]20 米[/b]。战利品和草药默认启用;其他分组默认禁用。战利品分组排除空和被偷的目标。高亮默认在[b]对话[/b]期间隐藏。分组快捷键在菜单打开时也可用。

[size=5]配置[/size]
用记事本等文本编辑器打开 ASI 旁边的 [b]KCD1_HenrySenses.ini[/b]。保存文件即可在游玩时应用更改。以分号开头的行是解释选项的注释。

[size=4]共享设置和高亮分组[/size]
[b]高亮分组[/b]是你希望一起看到的一组事物。每个 Highlight.<Name> 部分都可以有自己的颜色、按键、范围和行为。[b]你可以自由创建自己的分组。[/b]将 <Name> 替换为你选择的唯一标签,例如 [Highlight.Gathering],并在 Targets 中组合任何支持的目标类型。名称只是一个标签;Targets、Only 和 Except 定义分组高亮的内容。名称必须唯一,不区分大小写。

提供的分组是可编辑、重命名、删除或作为你自己组合起点的可用示例:
[list]
[
][b]Loot(启用):[/b]尸体、动物尸体、物品和容器,排除空或被偷的目标。[/]
[
][b]Locked(禁用):[/b]上锁的非空容器。[/]
[
][b]Stolen(禁用):[/b]被偷的物品、容器、尸体和动物尸体,排除空的目标。[/]
[
][b]Herbs(启用):[/b]未采集的草药和蘑菇,以轮廓显示。[/]
[
][b]Places(禁用):[/b]门、工作台、床、使用点和其他可用物体。实验性功能。[/]
[
][b]Living(禁用):[/b]活着的 NPC 和动物,马和狗有单独的颜色。[/]
[
][b]Hostiles(禁用):[/b]强盗、库曼人和其他公敌。[/]
[/list]
[b]Settings[/b] 部分提供共享默认值。分组部分内的值[b]仅对该分组[/b]覆盖该默认值。例如,更改 Settings 下的 Key 会改变 Loot 的绑定,但 Herbs 保留自己的 LShift+H,Gamepad_RB+Gamepad_Back 绑定。过滤器属于各个分组。

为多个分组设置相同的 [b]Key[/b],可以同时激活它们,同时保持各自的颜色、过滤器和样式。

编辑现有部分以进行这些常见更改:
[list]
[
][b]看得更远:[/b]增加 Settings 下的 Radius(米;默认 20)。分组自己的 Radius 优先。[/]
[
][b]让脉冲显示更久:[/b]增加 Settings 下的 Duration(秒;默认 5)。[/]
[
][b]用红色高亮被偷的战利品:[/b]将 Highlight.Stolen 下的 Enabled = true。普通 Loot 分组继续跳过被偷的战利品。[/]
[
][b]显示活着的人和动物:[/b]启用 Highlight.Living。[/]
[
][b]单独高亮公敌:[/b]启用 Highlight.Hostiles;它会覆盖敌对 NPC 的 Living。[/]
[
][b]显示门、床和工作台:[/b]启用 Highlight.Places。此检测为实验性。[/]
[
][b]隐藏墙壁和草丛后的高亮:[/b]将 Render 下的 SeeThrough = false。[/]
[
][b]小游戏期间也隐藏高亮:[/b]将 Settings 下的 HideIn = Dialogue, Minigame。[/]
[/list]
[size=4]每个分组显示的内容[/size]
[b]Enabled = true[/b] 开启分组;false 关闭。[b]Targets[/b] 列出高亮的内容,用逗号分隔:
[list]
[
][b]战利品:[/b] Corpses, Carcasses, Items, Containers, Herbs[/]
[
][b]生物:[/b] NPCs, Animals, Horses, Dogs, Critters[/]
[
][b]交互物体:[/b] Doors, Workstations, Beds, Seats, UseSpots, Objects[/]
[/list]
[b]Only[/b] 将分组限制为匹配的物体;[b]Except[/b] 排除匹配的物体。可用的标签有 Stolen、Locked、Empty、Hostile 和 Unconscious。例如,Targets = Containers 配合 Only = Locked 显示上锁的容器,而 Except = Empty 跳过空的容器。使用多个过滤器时,每个 Only 条目都必须匹配,且任何 Except 条目都不能匹配。

Stolen 标签遵循游戏的搜刮窗口。市民的尸体和家畜属于 Stolen。强盗或库曼人的尸体不属于。野生动物只有在没有狩猎许可特长时才属于 Stolen。尚未被任何人搜刮的动物尸体不属于 Empty。

对于自定义选择,Class:、Name: 和 Model: 匹配物体的类、名称或模型文件名。匹配不区分大小写;星号匹配任意文本,问号匹配一个字符。[b]Targets = Model:barrel[/b] 选择文件名包含 "barrel" 的模型。这些选择不应用可搜刮性检查。

[size=4]行为与外观[/size]
设置分组的 [b]Mode[/b] 来选择其按键的工作方式:
[list]
[
][b]Pulse(脉冲):[/b]按一次显示高亮 Duration 秒。再按一次重新计时。[/]
[
][b]Toggle(切换):[/b]按一次开启高亮,再按一次关闭。[/]
[
][b]Hold(按住):[/b]按住按键时高亮保持可见。[/]
[
][b]Always(常亮):[/b]无需按键,高亮持续开启。[/]
[/list]
[b]FadeOut[/b] 控制它们消失所需的秒数;默认为 [b]1 秒[/b]。[b]HideIn[/b] 接受 Dialogue、Combat 和 Minigame,默认为 [b]Dialogue[/b]。添加 Combat 或 Minigame 可在这些情况下也隐藏高亮。分组快捷键在菜单打开时也可用。

[b]Style[/b] 选择 Outline(边缘)、Fill(着色)或 OutlineFill(两者)。游戏为每个高亮物体绘制一个共享填充,因此只要有活动分组使用 Fill 或 OutlineFill,它就会显示。共享 Render Style 为 [b]OutlineFill[/b];Herbs 用 [b]Outline[/b] 覆盖它。

Render 下的主要外观设置:
[list]
[
][b]Strength:[/b]高亮亮度,从 0(不可见)到 1(全彩)。
默认:1.0[/]
[
][b]FillOpacity:[/b]填充不透明度,从 0(不可见)到 1(不透明)。
默认:0.35[/]
[
][b]MinOpacity:[/b]距离淡出期间的最低亮度。降低它以启用淡出。
默认:1.0(无距离淡出)[/]
[/list]
启用后,距离淡出从 FadeStart(12 米)开始,在分组的 Radius 处达到 MinOpacity。FadePower(1.0)塑造淡出曲线;更高的值让高亮在更远处保持更亮。

[size=4]颜色[/size]
[b]Color[/b] 设置没有自己颜色的目标的颜色。使用 [b]RRGGBB[/b] 或 [b]RRGGBBAA[/b] 十六进制:FF8000 和 FF8000FF 都给出橙色。用[url=https://www.fleevio.com/en/tools/color-picker]颜色选择器[/url]挑选或转换颜色,复制 [b]HEX(无 #)[/b]或 [b]HEX + alpha(无 #)[/b],然后粘贴到 Color 或目标名称的冒号后:
[code]
Color = FF8000FF
Targets = Items:FF8000FF, Containers:FFD000FF[/code]
最后的 AA 字节对高亮被忽略。使用 Render 下的 FillOpacity 调整填充透明度,用 Style 选择轮廓或填充。更深的颜色给出更淡的高亮。

当活动分组重叠时,[b]文件中靠后的分组获胜[/b]。将通用分组放在前面,更具体的放在后面,例如 Loot 后跟 Stolen。

[size=4]粒子效果[/size]
向分组添加 [b]Effect = HenrySenses.sparks[/b] 或 [b]Effect = HenrySenses.glow[/b],以获得可穿透墙壁显示的粒子;这些需要 INI 旁边的 KCD1_HenrySenses.particles.xml。诸如 particles_smithery.particles_smithery.sharpening 的游戏效果会被墙壁遮挡。[b]EffectScale = 1.0[/b] 设置大小倍数(0.1 到 10;默认 1.0)。空的 Effect = 或 Effect = None 禁用粒子。

[b]Effect[/b] 和 [b]EffectScale[/b] 是单独的设置键。要为战利品启用火花,请在现有的 [b]Highlight.Loot[/b] 部分内添加这些行。去掉模板中用于注释的前导分号:
[code]
Effect = HenrySenses.sparks
EffectScale = 1.0[/code]
[size=4]示例:创建你自己的采集分组[/size]
在 INI 末尾添加这个新部分,将掉落物品和草药组合在一个切换键下。你可以再用另一个唯一名称复制它,并选择不同的目标、过滤器和控制:
[code]
[Highlight.Gathering]
Enabled = true
Targets = Items:FF8000FF, Herbs:40FF40FF
Style = Outline
Key = F8,Gamepad_RB+Gamepad_DpadLeft
Key.Consume = true
Mode = Toggle
Radius = 40[/code]
保存后,[b]F8[/b] 或 [b]RB + 方向键左[/b]在 [b]40 米[/b]范围内切换橙色物品轮廓和绿色草药轮廓。该分组继承 FadeOut 和 HideIn 等共享设置。如果你希望它跳过被偷的物品,请在此部分添加 [b]Except = Stolen[/b]。作为文件中最后一个分组,它对重叠目标优先于之前的活动分组。

[size=5]键盘与手柄[/size]
在 Settings 下设置 [b]Key[/b] 为共享控制,或在分组内设置独立控制。命名键如 H、F7 和 Mouse4 可用;LShift+H 是组合键。留空或使用 NONE 移除绑定。

共享绑定默认为 [b]H[/b] 或 [b]RB + Start[/b]。要将手柄组合替换为 [b]RB + 方向键左[/b],请使用 Settings 下的这些条目:
[code]
Key = H,Gamepad_RB+Gamepad_DpadLeft
Key.Consume = true[/code]
逗号表示"任一绑定";加号表示"按住第一个按钮并按第二个"。Herbs 有自己的 Key,默认为 [b]左 Shift + H[/b] 或 [b]RB + Back[/b],因此要单独编辑该部分来更改其控制。

[b]Key.Consume = true[/b] 在按住时对游戏隐藏组合键的最后一个按钮,这样方向键左不会同时触发其游戏动作。它对共享绑定和 Herbs [b]默认开启[/b]。只有数字手柄按钮和鼠标滚轮可以被消耗;修饰键、键盘按键和模拟扳机仍会传递到游戏。

手柄输入使用 [b]XInput[/b]。对于其他手柄,请使用 Steam Input 或 XInput 转换层。参见 [url=https://github.com/tkhquang/DetourModKit?tab=readme-ov-file#supported-input-names]Supported Input Names[/url] 和 [url=https://github.com/tkhquang/DetourModKit?tab=readme-ov-file#gamepad-compatibility]Gamepad Compatibility[/url] 参考。

INI 记录了所有设置、默认值和更多示例。

[size=5]已知限制[/size]
[list]
[
]交互物体检测为实验性;某些物体可能被遗漏或错误高亮。[/]
[
]没有自己模型的物体,如洗衣盆和长凳,无法绘制轮廓。[/]
[
]游戏为每个高亮物体绘制一个填充,因此分组的 Style 只能开启或关闭该共享填充。[/]
[
]KCD1 中无法使用角括号(Box 样式)和 KCD2 版本的焦点变暗效果。[/]
[
]KCD1 没有屠宰,因此没有 Butcher 分组。[/]
[
]如果检测或渲染停止工作,游戏更新可能需要模组更新。[/]
[/list]
[size=5]故障排除[/size]
[list]
[
]在 Settings 下设置 LogLevel = DEBUG,保存 INI 并重现问题。[/]
[
]检查 ASI 旁边的 KCD1_HenrySenses.log。它记录检测决策以及保存 INI 时的状态报告。[/]
[/list]请附上日志、INI、游戏/模组版本和重现步骤[url=https://github.com/tkhquang/KCD1Tools/issues]反馈问题[/url]。截图和位置有助于解决错误高亮。

[size=5]鸣谢与源代码[/size]
使用 [url=https://github.com/tkhquang/DetourModKit]DetourModKit[/url] 构建核心功能。
[list]
[
][url=https://github.com/ThirteenAG/Ultimate-ASI-Loader]Ultimate ASI Loader[/url] by ThirteenAG - ASI 加载层[/]
[
][url=https://github.com/cursey/safetyhook]SafetyHook[/url] by cursey - 钩子[/]
[
][url=https://github.com/zyantific/zydis]Zydis[/url] / [url=https://github.com/zyantific/zycore-c]Zycore[/url] by Florian Bernd & Joel Hoener - SafetyHook 使用的反汇编[/]
[
][url=https://github.com/brofield/simpleini]SimpleIni[/url] by Brodie Thiesfield - INI 配置[/]
[
][url=https://github.com/microsoft/DirectXMath]DirectXMath[/url] by Microsoft - 数学原语[/]
[
]Warhorse Studios - Kingdom Come: Deliverance[/*]
[/list]
此移植版的源代码位于 [url=https://github.com/tkhquang/KCD1Tools]KCD1Tools GitHub 仓库[/url]。原始 KCD2 模组位于 [url=https://github.com/tkhquang/KCD2Tools]KCD2Tools[/url]。