《艾尔登法环》MOD安装详解(五)
梅琳娜的刀
编辑于 2024年09月16日 15:58
收录于文集
共10篇

五、MOD 分类和安装方式

评论区已关闭,如对本教程有问题,请先阅读序言章节的评论区,之后再提问,这样提问更集中、高效。

至此,我们尝试安装了自己的第一个 MOD ——无缝联机,但其实对 MOD 的工作原理还一无所知,想要搭配其他 MOD 也还无从下手。本章将从游戏游戏解包的结果讲起,讨论 MOD 的两种类别,并讲解所有 MOD 赖以运行的基础:Mod Engine 2(如无特殊说明,本文中出现的 Mod Engine 均指代 Mod Engine 2)和 Mod Loader,最终将 MOD 文件放在正确的位置。

1. 游戏文件简介

正版游戏在没有安装任何 MOD 的根目录如上图。

由上到下依次介绍:

- crashdumps 文件夹是游戏在崩溃时对内存的记录,一般用于诊断游戏问题,玩家可以忽略;

- EasyAntiCheat 文件夹和下面的 start_protected_game.exe 与 EAC 有关,一些屏蔽 EAC 的方式就涉及这个文件;

- movie 文件夹和 sd 文件夹分别涉及游戏的 CG 和声音,删掉之后会失去对应的游戏内容,不影响游戏运行;

- eldenring.exe 是游戏的主程序,在这里启动和从 Steam 点击“开始游戏”是相同的;

- amd_ags_x64.dll、bink2w64.dll、eossdk-win64-shipping.dll、oo2core_6_win64.dll、eossdk-win64-shipping.so 都是常见的游戏运行库,和游戏的图像渲染等相关;

- 余下的 bdt 和 bhd 文件是 DVDBHD 文件包,它们包含了游戏所需的几乎所有资源(包括模型、贴图、事件、脚本、文本等等);

- regulation.bin 文件,它是游戏的规则文件,许多 MOD 都是通过修改该文件实现的,例如常驻的大蛇狩猎矛特效、魔法祷告的效果修改、护符装备的属性修改、骨灰 AI 和属性修改等等。

默认情况下,游戏会读取 bdt 和 bhd 文件中的游戏原版数据,以及游戏根目录下的 regulation.bin 规则文件。如果一个 MOD 只包含一个 regulation.bin 文件,你可以直接替换游戏根目录的 regulation.bin(注意备份),MOD 也会正常运行,但并不推荐这样做。更好的方式是使用 ME2 来加载,在本文后面章节会详细讲解这种安装方法。

2. 游戏解包

通过 Yabber (github.com/JKAnderson/Yabber) 或 UXM Selective Unpacker (nexusmods.com/eldenring/mods/1651) 等解包工具,可以把前述的 bdt 和 bhd 文件解压为更细化的游戏资源文件。

大多数文件夹都可以通过命名推断其中的内容,例如 event 文件夹与游戏的事件系统相关,map 文件夹中则是各个地图文件,msg 包含了游戏中的文本,等等。这些文件夹读者并不必知道其详细的功能,有个大概印象即可。

3. MOD 分类

《艾尔登法环》的MOD大体上分为两类,静态 MOD 和动态 MOD。

如果把游戏文件比作一本书,电脑比作说书人,那我们玩游戏的过程就是说书人把书讲给我们听的过程。静态 MOD 和动态 MOD 都会导致我们听到的内容和原版不一样:静态 MOD 是通过修改书的内容来实现的,而动态 MOD 是通过修改说书人的记忆实现的。

(1)静态 MOD

静态 MOD 是通过修改游戏文件实现的修改,例如大家常见的各类大修 MOD,如法魂 CER、法环重铸ERR、随机 MOD(包括物品敌人骨灰雾门随机),以及各类模型动作替换MOD等,这是最为常见,也最容易制作的一类。它们提供修改后的游戏文件,并覆盖原始游戏的文件,来实现修改游戏内容。

它们安装之后会对游戏产生固定的修改,例如物品敌人随机 MOD 安装之后无论开始多少次新游戏、进行多少周目,物品和敌人的分布都是不会变化的,因而称为静态 MOD。以下展示几个此类 MOD 的文件,如法魂 CER:

随机传送 MOD:

眼之苗床 Garden of Eyes:

可以发现,此类 MOD 大多包含 regulation.bin 文件,除此以外还可能包含游戏解包得到的众多文件夹中的一个或多个(读者可以自行对比前一节中游戏解包得到的全部文件夹)。

(2)动态 MOD(DLL 类 MOD)

动态 MOD 则是通过直接修改内存实现的修改,它们不直接修改游戏文件,仅仅在游戏运行时动态地进行内存注入,例如暴力随机、无缝联机、武器随机、魔法随机、守财奴等等,它们的修改结果往往并不会保留,仅仅在游戏运行时才会生效。

例如守财奴 MOD 并不会真的修改玩家的生命值上限,一旦使用 F1 关闭 MOD 再进行一次赐福传送,生命值即会恢复正常计算的结果;再例如武器随机和魔法随机 MOD,在 MOD 关闭后你装备的武器和魔法就会恢复打开 MOD 之前的样子。很多游戏修改器也采用了这种修改方式,直接读写内存来实现功能。同样展示几个此类 MOD 的文件,如体形变化 MOD:

死亡不掉落卢恩 MOD:

暴力随机 MOD:

无缝联机 MOD:

这些 MOD 的核心是一个 DLL(动态链接库)文件,这个文件会在游戏主程序运行时被注入,从而修改游戏本身的运行方式。此外,这类 MOD 往往还包含一些配置文件,用来对 MOD 进行一定的配置。例如暴力随机 MOD 可以通过修改 randomiserpreferences.ini 来控制是否随机某个参数,守财奴 MOD 可以通过 RuneKeeperConfig.txt 来控制卢恩转换为最大生命值的比例,无缝联机 MOD 可以通过 seamlesscoopsetting.ini 来设置联机密码,等等。

至此,读者应当可以根据 MOD 的文件来判断某个 MOD 是属于静态 MOD 还是动态 MOD 了。两类 MOD 的工作方式和安装方式完全不同,因此也有对应的工具来配合它们使用。

4. Mod Engine 2 和 Mod Loader

(1)动态 MOD

动态 MOD (DLL 类 MOD)的使用比较简单,只需在游戏运行时进行注入即可。该类 MOD 可以使用 Mod Loader 引导,也可以使用 Mod Engine 2.1.0 以上的版本来引导。

这里首先介绍使用 Mod Loader 的方式,使用 Mod Engine 的方式在本章节关于 Mod Engine 2.1.0 版本的部分有介绍。

把 Mod Loader 解压会得到三个文件。mods 文件夹用来存放所有动态 MOD,读者把自己感兴趣的动态 MOD 的 DLL 文件放入 mods 文件夹即可;dinput8.dll 是 Mod Loader 的核心,它会在游戏启动时自动注入游戏主程序,并将 mods 文件夹中的所有 DLL 文件一同注入游戏;最后的 mod_loader_config.ini 是 Mod Loader 的配置文件,如果使用了多个动态 MOD,可以修改此文件来设定这些 MOD 被注入的顺序。如果 MOD 没有特殊说明,无需修改此文件。

Mod Loader 需要放在游戏根目录才能正常工作,安装后需通过 eldenring.exe 启动游戏。

由于 Mod Loader 的 dinput8.dll 属于对游戏文件的修改,因此需要屏蔽 EAC 才能正常启动。

安装了 Mod Loader 并屏蔽了 EAC 的游戏整体流程图如下:

(2)Mod Loader 安装示例

以下是一个使用 Mod Loader 安装 MOD 的示例:

已经安装了无缝联机,希望加装暴力随机、守财奴、死亡不掉落卢恩 MOD。

如果无缝联机的安装参考了本文前面部分的教程 ,搭配其他 MOD 需要额外安装 Mod Loader,并把 SeamlessCoop 文件夹下的 elden_ring_seamless_coop.dll 和 seamlesscoopsettings.ini 移动到 Mod Loader 的 mods 文件夹下。此外,游戏需要从 eldenring.exe 启动 (因此可以删除无缝联机的启动器),需要创建 steam_appid.txt 屏蔽 EAC(具体方法在本文前部)。

暴力随机 MOD 也是自带一个文件夹 ItemRandomiser,需要放在游戏根目录,然后把其中的 elden_ring_item_randomiser.dll 移动到 mods 文件夹。

之后,将守财奴和死亡不掉落卢恩两个 MOD 的 DLL 和配置文件也移动到 mods 文件夹,供 Mod Loader 加载。

至此,游戏根目录如下:

目前,SeamlessCoop 文件夹应当包含 crashpad 和 locale 两个文件夹,ItemRandomiser 文件夹应当包含 randomiserpreferences.ini,而 mods 文件夹应当包含前述所有 MOD 的 DLL文件:

通过 eldenring.exe 打开游戏即可(不要忘记配置无缝联机)。

大多数动态 MOD 不会像暴力随机和无缝联机一样自带一个文件夹,而是直接把 DLL 文件放入 mods 文件夹即可(例如守财奴和死亡不掉落卢恩等)。如果没有特殊说明,动态 MOD 都可以使用此方法安装。

(3)Mod Engine 和静态 MOD

在《艾尔登法环》MOD 发展的早期(游戏发售的第一个月),静态 MOD 的实现需要玩家手动解包并替换游戏文件,很容易导致覆盖或误删文件,Mod Engine 由此诞生。它会扫描 MOD 文件,查找 MOD 修改了哪些文件,并加载这些修改后的文件,而无需玩家进行解包替换。 更可贵的是,Mod Engine 默认会连带 Mod Loader 一同启动,这使得同时安装静态 MOD 和动态 MOD 成为了可能。经典的组合便是:随机 MOD + 无缝联机,暗黑 MOD + 守财奴,物品敌人随机 + 暴力随机,等等。 此外,Mod Engine 还默认屏蔽了 EAC。 本文以 Mod Engine 2.0.0-preview4 版本为主进行讲解,之后更新的版本与之类似。

默认情况下,游戏会读取前文中提到的 bdt 和 bhd 文件中的游戏原版数据,以及游戏根目录下的 regulation.bin 规则文件。一种简单的安装了 Mod Engine 之后的游戏整体流程图如下:

将 Mod Engine 解压后可以得到以下文件:

我们只需要用到两个文件夹、《艾尔登法环》的配置文件 config_eldenring.toml 以及 Mod Engine 的启动器 launchmod_eldenring.bat 和 modengine2_launcher.exe。需要注意的是,Mod Engine 使用到 mod 文件夹,而 Mod Loader 使用到的是 mods 文件夹。

将这五个文件(夹)移动到游戏根目录。Mod Engine 官方并不推荐这样做,而是建议把 Mod Engine 放在其他文件夹里运行。而放在其他文件夹可能导致 Mod Engine 找不到游戏,所以我建议把文件放到游戏根目录。

此时,你的游戏根目录看起来应该是:

如果你还按照之前的步骤安装了 Mod Loader,那游戏根目录的东西还会更多一些。这张截图是包含了Mod Engine、Mod Loader、无缝联机、暴力随机、守财奴以及死亡不掉落卢恩 MOD 的游戏根目录。

Mod Engine 的配置文件 config_eldenring.toml 指定了 MOD 的路径。2.0.0-preview4 版本的配置文件如下:

其中需要注意的只有 mods 这个列表。默认的内容为:

代码块
Python
自动换行
复制代码
mods = [     
  { enabled = true, name = "default", path = "mod" }
]
复制成功

它指示 Mod Engine 加载以 mod 文件夹为根目录的 MOD 。

例如你希望安装暗黑 MOD,那么把暗黑 MOD 所有文件不带文件夹地放入 mod 文件夹即可,也就是说打开游戏根目录的 mod 文件夹就可以看到暗黑 MOD 的文件:

至此,你已经使用 Mod Engine 安装了暗黑 MOD,从 modengine2_launcher.exe 启动即可。

如果你在使用学习版游戏,请确保你的游戏根目录文件夹名字是 Game。如果你还按照之前的步骤,安装了 Mod Loader 以及无缝联机等 MOD,它们应当也会随着 Mod Engine 一同启动。

(4)配置 MOD 路径

Mod Loader 同时加载多个动态 MOD 只需把所有 DLL 文件都放进 mods 文件夹,而 Mod Engine 同时加载多个静态 MOD 则复杂很多,其核心是修改 config_eldenring.toml 中的 mods 列表,添加上各个静态 MOD 的路径,注意每行大括号后面有一个英文逗号,最后一行没有逗号,且子文件夹使用双反斜杠“\\”,最后一行是右方括号。例如下面添加了女武神水鸟乱舞练习 MOD(只包含一个 chr 文件夹)和寒潮 MOD(只包含一个 regulation.bin 文件):

代码块
Python
自动换行
复制代码
mods = [     
  { enabled = true, name = "Malenia", path = "mod\\Malenia" },     
  { enabled = true, name = "Coldspell", path = "mod\\ColdSpell" } 
]
复制成功

mod 文件夹下也应当有对应的两个子文件夹(文件夹名务必完全一致),且它们打开之后就可以看到对应的 MOD 文件(不包含嵌套文件夹)。

此时,再使用 modengine2_launcher.exe 启动,这两个 MOD 都可以正常工作,其原因是这两个 MOD 不包含重复的文件,也就是说它们的作者并没有修改同一个游戏文件,所以它们并不冲突。

我们上面讨论过,Mod Engine 会扫描 config_eldenring.toml 中 mods 列表指定的 MOD 文件,并使用这些文件覆盖原版游戏的对应文件。如果有文件冲突,例如两个 MOD 修改了同样的文件,则会优先使用 mods 列表中排序靠前的 MOD 的文件。

简单的测试方法是把一个静态 MOD 的文件复制到另一个静态 MOD 里,如果有提示重复文件,那就表明它们会发生冲突;如果没有,那它们则可以一同使用。

例如下面添加了物品敌人随机 MOD 和寒潮 MOD,它们都包含 regulation.bin 文件:

代码块
Python
自动换行
复制代码
mods = [     
  { enabled = true, name = "Coldspell", path = "mod\\ColdSpell" },
  { enabled = true, name = "Randomizer", path = "mod\\Randomizer" } 
]
复制成功

物品敌人随机 MOD:

寒潮 MOD:

由于寒潮 MOD 排序靠前,因此它的 regulation.bin 文件会被加载;而物品敌人随机 MOD 的regulation.bin 会被忽略,其他文件都会被加载——结果就是寒潮 MOD 生效,而物品没有被随机(因为 regulation.bin 没有加载)。

(5)MOD 合并

读到这里的读者大概希望这一小节会讲解如何解决静态 MOD 文件的冲突,但很遗憾,绝大多数静态 MOD 文件冲突都难以被解决,而动态 MOD 一般不会互相冲突。

事实上,各个静态 MOD 的文件都类似于一个压缩包,其中包含作者修改了的文件和未经修改的原版游戏文件,合并静态 MOD 就是要找到多个 MOD 中作者修改过的文件(这很难),然后把它们重新打包,以供 Mod Engine 加载。

一些作者会在 MOD 简介里说明自己修改了哪些文件,一些作者并不会这样做,这就导致只有作者本人才知道哪些文件被修改了。而大修类的 MOD 例如法魂、法环重铸、物品敌人随机往往有很多冲突。

好在物品敌人随机和雾门随机 MOD 的随机器提供了合并其他 MOD 的选项,如果读者是使用物品敌人随机、雾门随机,可以比较方便地与其他 MOD 合并,在下一章节我们会详细讨论。

而其他 MOD 暂时没有简单的合并方法。目前,可以解决的是 regulation.bin 文件的冲突,有许多小幅修改的 MOD (例如所有武器可附魔、骨灰随机、护符武器数值修改、)都只包含这一个文件,因此合并 regulation.bin 可以解决相当多的 MOD 冲突问题。

由于篇幅原因,合并 regulation.bin 的内容不在本文中展开,后续应该会单独制作一期专栏。读者也可以参考其他 UP 的视频,学习如何使用 Yapped 或 Dark Souls Maps Studio 自行合并 regulation.bin 文件。

(6)错误排查

Mod Engine 每次运行都会生成日志文件,其文件名和日期相对应。

日志文件会记录 Mod Engine 的工作状态。

如上图所示,第 2 行表明我们这一次 Mod Engine 的运行尝试加载 E:\ER\Game\config_eldenring.toml 这个配置文件,后面的 "Local_settings loader: true" 表明顺利找到了这个文件且成功读取,"Enabling extension mod_loader" 表明正在同步加载 Mod Loader(以及 Mod Loader 包含的各种动态 MOD),"Installing mod localtion" 表明在配置文件中提供了这个 MOD 的路径,"Resolved mod path" 表明这个路径是正确的且已被找到,最后 "Starting worker thread" 表明 Mod Engine 已经成功启动,开始启动游戏。

Unable to resolve mod path 表明 Mod Engine 按照配置文件中的路径去找 MOD 文件夹失败了,检查你的配置文件看看是否有问题。

关于使用 Mod Engine 启动器没有反应的解决办法,在系列专栏的答疑部分:

(7)注意事项

① Mod Engine 放在游戏根目录里运行时,需要确保游戏根目录文件夹的名称是 Game。

② Mod Engine 会自动屏蔽 EAC,你可以按你的心意使用各种工具修改游戏,前提是你备份了存档。

③ 配置 MOD 路径时,注意使用英文逗号,注意使用双反斜杠“\\”。

④ 如果遇到某个 MOD 没有按照预期工作,请检查是否是和其他 MOD 冲突,且该 MOD 在mods 列表中位置更靠下。

5. 关于 Mod Engine 2.1.0

Mod Engine 2.1.0 版本新增了对动态 MOD (DLL 类 MOD)的支持,因此我们可以不必再安装 Mod Loader 来加载动态 MOD,而是使用 Mod Engine 2.1.0 版本同时加载动态和静态 MOD。其配置文件 config_eldenring.toml 和之前的版本有所不同,新增了 external_dlls 列表。

这个列表可以填入 DLL 文件的相对路径或绝对路径,从而加载这些 DLL。每个路径需要使用双引号,且用逗号分隔。以刚刚安装的无缝联机、暴力随机、守财奴以及死亡不掉落卢恩这四个 MOD 为例,mods 文件夹下面有:

则可以修改 config_eldenring.toml 的 external_dlls 列表为如下内容,来脱离 Mod Loader、使用 Mod Engine 加载动态 MOD。同样注意使用英文双引号、英文逗号和双反斜杠。

代码块
Python
自动换行
复制代码
external_dlls = [
  "mods\\DisableRuneLoss.dll",
  "mods\\elden_ring_item_randomiser.dll",
  "mods\\elden_ring_seamless_coop.dll",
  "mods\\RuneKeeper.dll"  
]
复制成功

 加载静态 MOD 的方法不变,仍是修改配置文件中的 mods 列表。

6. Mod Engine 3

Mod Engine 2 在2024年7月19日正式宣布停止开发,ME3(Mod Engine 3) 作为其继任者已在开发当中。

https://github.com/garyttierney/me3