Lovely 是一个 lua 注入器,它在运行时将代码嵌入到 LÖVE 2d 游戏中。与可执行修补程序不同,模组可以反复安装、更新和删除,而不需要部分或全部游戏重新安装。这是通过进程内 lua API 绕行和易于使用(和分发)的补丁系统来实现的。
下载适用于 Windows 的最新版本。这将是lovely-x86_64-pc-windows-msvc.zip
。
打开.zip压缩包,将version.dll
复制到游戏目录中。您可以通过右键单击 Steam 中的游戏,将鼠标悬停在“管理”上,然后选择“浏览本地文件”来导航到游戏的目录。
将一个或多个模组放入模组目录(与游戏目录不同)。这应该是%AppData%/Balatro/Mods
(如果您正在修改 Balatro)。
仅 Steam Deck / Proton / Wine将 Steam 中游戏的启动选项设置为WINEDLLOVERRIDES="version=n,b" %command%
。
通过 Steam 运行游戏。
下载适用于 Mac 的最新版本。如果您有 M 系列 CPU(M1、M2 等),那么这将是lovely-aarch64-apple-darwin.tar.gz
。如果你有一个 Intel CPU 那么它会lovely-x86_64-apple-darwin.tar.gz
打开.zip压缩包,将liblovely.dylib
和run_lovely.sh
复制到游戏目录中。您可以通过右键单击 Steam 中的游戏,将鼠标悬停在“管理”上,然后选择“浏览本地文件”来导航到游戏的目录。
将一个或多个 mod 放入 Mac mod 目录(与游戏目录不同)。这应该是/Users/$USER/Library/Application Support/Balatro/Mods
,其中$USER
是您的用户名(如果您正在修改 Balatro)。
如果找不到此文件夹,请尝试按Shift-Command-.
(句号)在 Finder 中显示隐藏文件。
通过将run_lovely.sh
拖放到应用程序 > 实用程序中的Terminal.app
上然后按 Enter 键来运行游戏,或者在游戏目录中的终端中执行sh run_lovely.sh
。
注意:由于 Steam 客户端中的错误,您无法在 Mac 上通过 Steam 运行游戏。您必须使用run_lovely.sh
脚本运行它。
重要提示:带有Lovely补丁文件( lovely.toml
或lovely/*.toml
)的Mod必须安装到mod目录中自己的文件夹中。无一例外!
请注意,补丁格式不稳定并且容易发生变化,直到Lovely 结束早期开发为止。
补丁文件定义了游戏进程中代码注入的位置和方式。可以在此处的 Steamodded 存储库中找到一个很好的(复杂的)示例。
[manifest]version = "1.0.0"priority = 0# 定义一个var替换规则。这会搜索包含 {{lovely:var_name}} # (本示例中的 var_name,它实际上可以是任何内容)的行,并用 # 提供的值替换每个匹配项。# 此示例将转换 print('{{lovely:var_name} }') to print('Hello world!').# # 有用:当你想减少重复注入的复杂性时,例如。在多个位置嵌入 # 发布版本号。[vars]var_name = "Hello world!"# 在与提供的模式匹配的行之前、之后或(替换)处注入一行或多行代码。## 有用:对于当你需要添加/修改少量代码来设置初始化#例程等时[[补丁]] [patches.pattern]target = "game.lua"pattern = "self.SPEEDFACTOR = 1"position = "after"payload = '''initSteamodded()print('{{lovely:var_name}}')'''match_indent = truetimes = 1# 在一个或多个 # Regex capture groups 之前、之后、at 或交织中注入一行或多行代码。# - 我建议您使用 Regex Playground像 https://regexr.com 来构建 # 你的模式。# - 正则表达式并不高效。除非绝对必要,否则请使用模式补丁。# - 此补丁支持捕获组。# - 此补丁不会修剪每行的空格。 # 设计模式时考虑到这一点。## 有用:当模式补丁的表现力不足以描述如何注入有效负载时。[patches.regex]target = "tag.lua"pattern = "(? <indent>[t ]*)if (?<cond>_context.type == 'eval' then)"position = 'at'line_prepend = '$indent'payload = '''local obj = SMODS.Tags[self.key]local resif obj and obj.apply and type(obj.apply) == 'function' then res = obj.apply(self, _context)endif res then return reselseif $cond'''times = 1# 将一个或多个文件的内容追加或添加到目标上。## 有用:当您“只”关心将代码放入游戏时,无需其他任何操作。 # 这不会将其作为新模块注入。[[patches]] [patches.copy]target = "main.lua"position = "append"sources = ["core/core.lua","core/deck.lua","core/joker.lua","core/sprite.lua ","debug/debug.lua","loader/loader.lua", ]# 在加载目标文件*之前*将新模块注入到游戏中。# 有用:当您想要将代码隔离到单独的需要模块中或在游戏/mod 代码开始执行之前注入“全局”依赖项时.[[补丁]] [patches.module]source = "nativefs.lua"before = "main.lua"name = "nativefs"
使用pattern
补丁将代码外科手术式地嵌入到目标内的特定位置。支持*
(匹配任何字符出现 0 次或多次)和?
(精确匹配任何字符的一次出现)通配符。
仅当模式补丁不能满足您的需求时才使用regex
补丁。这基本上是模式补丁,但带有支持正则表达式查询引擎、捕获组等。
当需要将大量与位置无关的代码复制到目标中时,请使用copy
补丁。
使用module
补丁将 lua 模块注入游戏的运行时。请注意,目前仅支持单个文件模块,但这应该很快就会改变。
补丁文件从 mod 文件夹 ( MOD_DIR
) 内的 mod 目录加载。 Lovely 将加载MOD_DIR/ModName/lovely/
中存在的任何补丁文件,或从MOD_DIR/ModName/lovely.toml
加载单个补丁。如果加载了多个补丁,它们将按照找到的顺序注入到游戏中。
补丁中定义的路径以 mod 的目录为根。例如, core/deck.lua
解析为MOD_DIR/ModName/core/deck.lua
。
每个补丁定义都有一个补丁目标。这些目标是使用 7zip 等工具从游戏中转储时源文件的相对路径。例如,可以定位顶级文件(如main.lua
)或子目录中的文件(如engine/event.lua
。
Lovely 将修补后的 lua 源文件转储到MOD_DIR/lovely/dump
。日志同样写入MOD_DIR/lovely/log
。
manifest.version