Lovely ist ein Lua-Injektor, der zur Laufzeit Code in ein LÖVE 2D-Spiel einbettet. Im Gegensatz zu ausführbaren Patchern können Mods immer wieder installiert, aktualisiert und entfernt werden, ohne dass eine teilweise oder vollständige Neuinstallation des Spiels erforderlich ist. Dies wird durch prozessinterne Lua-API-Umleitung und ein einfach zu verwendendes (und zu verteilendes) Patch-System erreicht.
lovely-x86_64-pc-windows-msvc.zip
“ sein.version.dll
in das Spielverzeichnis. Sie können zum Verzeichnis des Spiels navigieren, indem Sie in Steam mit der rechten Maustaste auf das Spiel klicken, den Mauszeiger über „Verwalten“ bewegen und „Lokale Dateien durchsuchen“ auswählen.%AppData%/Balatro/Mods
sein (wenn Sie Balatro modden).WINEDLLOVERRIDES="version=n,b" %command%
ein.lovely-aarch64-apple-darwin.tar.gz
. Wenn Sie eine Intel-CPU haben, lautet diese lovely-x86_64-apple-darwin.tar.gz
liblovely.dylib
und run_lovely.sh
in das Spielverzeichnis. Sie können zum Verzeichnis des Spiels navigieren, indem Sie in Steam mit der rechten Maustaste auf das Spiel klicken, den Mauszeiger auf „Verwalten“ bewegen und „Lokale Dateien durchsuchen“ auswählen./Users/$USER/Library/Application Support/Balatro/Mods
sein, wobei $USER
Ihr Benutzername ist (wenn Sie Balatro modden).Shift-Command-.
(Punkt), um versteckte Dateien im Finder anzuzeigen.run_lovely.sh
entweder per Drag & Drop auf Terminal.app
unter Anwendungen > Dienstprogramme ziehen und dann die Eingabetaste drücken, oder indem Sie sh run_lovely.sh
im Terminal im Spielverzeichnis ausführen. Hinweis: Aufgrund eines Fehlers im Steam-Client können Sie Ihr Spiel nicht über Steam auf dem Mac ausführen. Sie müssen es mit dem Skript run_lovely.sh
ausführen.
Wichtig : Mods mit Lovely-Patchdateien ( lovely.toml
oder in lovely/*.toml
) müssen in einem eigenen Ordner im Mod-Verzeichnis installiert werden. Keine Ausnahmen!
Beachten Sie, dass das Patch-Format instabil ist und sich ändern kann, bis Lovely die frühe Entwicklung verlässt.
Patch-Dateien legen fest, wo und wie die Code-Injection innerhalb des Spielprozesses erfolgt. Ein gutes (komplexes) Beispiel hierfür finden Sie im Steamodded-Repo hier.
[ manifest ]
version = " 1.0.0 "
priority = 0
# Define a var substitution rule. This searches for lines that contain {{lovely:var_name}}
# (var_name from this example, it can really be anything) and replaces each match with the
# provided value.
# This example would transform print('{{lovely:var_name}}') to print('Hello world!').
#
# USEFUL: For when you want to reduce the complexity of repetitive injections, eg. embedding
# release version numbers in multiple locations.
[ vars ]
var_name = " Hello world! "
# Inject one or more lines of code before, after, or at (replacing) a line which matches
# the provided pattern.
#
# USEFUL: For when you need to add / modify a small amount of code to setup initialization
# routines, etc.
[[ patches ]]
[ patches . pattern ]
target = " game.lua "
pattern = " self.SPEEDFACTOR = 1 "
position = " after "
payload = '''
initSteamodded()
print('{{lovely:var_name}}')
'''
match_indent = true
times = 1
# Inject one or more lines of code before, after, at, or interwoven into one or more
# Regex capture groups.
# - I recommend you to use a Regex playground like https://regexr.com to build
# your patterns.
# - Regex is NOT EFFICIENT. Please use the pattern patch unless absolutely necessary.
# - This patch has capture group support.
# - This patch does NOT trim whitespace from each line. Take that into account when
# designing your pattern.
#
# USEFUL: For when the pattern patch is not expressive enough to describe how the
# payload should be injected.
[ patches . regex ]
target = " tag.lua "
pattern = " (?[ t ]*)if (?_context.type == 'eval' then) "
position = ' at '
line_prepend = ' $indent '
payload = '''
local obj = SMODS.Tags[self.key]
local res
if obj and obj.apply and type(obj.apply) == 'function' then
res = obj.apply(self, _context)
end
if res then
return res
elseif $cond
'''
times = 1
# Append or prepend the contents of one or more files onto the target.
#
# USEFUL: For when you *only* care about getting your code into the game, nothing else.
# This does NOT inject it as a new module.
[[ 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 " ,
]
# Inject a new module into the game *before* a target file it loaded.
# USEFUL: For when you want to silo your code into a separate require-able module OR inject a "global" dependency before game / mod code begins execution.
[[ patches ]]
[ patches . module ]
source = " nativefs.lua "
before = " main.lua "
name = " nativefs "
pattern
, um Code an bestimmten Stellen im Ziel chirurgisch einzubetten. Unterstützt *
(entspricht 0 oder mehr Vorkommen eines beliebigen Zeichens) und ?
(entspricht genau einem Vorkommen eines beliebigen Zeichens) Platzhalter.regex
-Patches nur, wenn der Muster-Patch Ihre Anforderungen nicht erfüllt. Dies ist im Grunde der Muster-Patch, jedoch mit einer unterstützenden Regex-Abfrage-Engine, Erfassungsgruppen und allem.copy
, wenn Sie eine große Menge positionsunabhängigen Codes in das Ziel kopieren müssen.module
Patches, um ein Lua-Modul in die Laufzeit des Spiels einzufügen. Beachten Sie, dass dies derzeit nur Einzeldateimodule unterstützt, dies sollte sich jedoch bald ändern. Patchdateien werden aus Mod-Verzeichnissen im Mod-Ordner ( MOD_DIR
) geladen. Lovely lädt alle Patch-Dateien, die in MOD_DIR/ModName/lovely/
vorhanden sind, oder lädt einen einzelnen Patch aus MOD_DIR/ModName/lovely.toml
. Wenn mehrere Patches geladen werden, werden sie in der Reihenfolge, in der sie gefunden werden, in das Spiel eingefügt.
Im Patch definierte Pfade basieren auf dem Verzeichnis des Mods. Beispielsweise wird core/deck.lua
in MOD_DIR/ModName/core/deck.lua
aufgelöst.
Jede Patch-Definition hat ein einzelnes Patch-Ziel. Diese Ziele sind die relativen Pfade der Quelldateien, wenn sie mit einem Tool wie 7zip aus dem Spiel gelöscht werden. Beispielsweise kann man auf eine Datei der obersten Ebene wie main.lua
oder auf eine Datei in einem Unterverzeichnis wie engine/event.lua
abzielen.
Lovely speichert gepatchte Lua-Quelldateien im MOD_DIR/lovely/dump
. Protokolle werden ebenfalls in MOD_DIR/lovely/log
geschrieben.
manifest.version