Lovely adalah injektor lua yang menyematkan kode ke dalam game LÖVE 2d saat runtime. Tidak seperti patcher yang dapat dieksekusi, mod dapat dipasang, diperbarui, dan dihapus berulang kali tanpa memerlukan instalasi ulang game sebagian atau seluruhnya. Hal ini dicapai melalui proses memutar lua API dan sistem patch yang mudah digunakan (dan didistribusikan).
lovely-x86_64-pc-windows-msvc.zip
.version.dll
ke direktori game. Anda dapat menavigasi ke direktori game dengan mengeklik kanan game di Steam, mengarahkan kursor ke "Kelola", dan memilih "Jelajahi file lokal".%AppData%/Balatro/Mods
(jika Anda memodifikasi Balatro).WINEDLLOVERRIDES="version=n,b" %command%
.lovely-aarch64-apple-darwin.tar.gz
. Jika Anda memiliki CPU Intel maka itu akan menjadi lovely-x86_64-apple-darwin.tar.gz
liblovely.dylib
dan run_lovely.sh
ke direktori game. Anda dapat menavigasi ke direktori game dengan mengeklik kanan game di Steam, mengarahkan kursor ke "Kelola", dan memilih "Jelajahi file lokal"./Users/$USER/Library/Application Support/Balatro/Mods
di mana $USER
adalah nama pengguna Anda (jika Anda memodifikasi Balatro).Shift-Command-.
(titik) untuk menampilkan file tersembunyi di Finder.run_lovely.sh
ke Terminal.app
di Aplikasi > Utilitas lalu tekan enter, atau dengan menjalankan sh run_lovely.sh
di terminal dalam direktori game. Catatan: Anda tidak dapat menjalankan game Anda melalui Steam di Mac karena ada bug di dalam klien Steam. Anda harus menjalankannya dengan skrip run_lovely.sh
.
Penting : Mod dengan file patch Lovely ( lovely.toml
atau lovely/*.toml
) harus diinstal ke dalam foldernya sendiri di dalam direktori mod. Tidak ada pengecualian!
Perlu diperhatikan bahwa format patch tidak stabil dan rentan berubah hingga Lovely keluar dari pengembangan awal.
File patch menentukan di mana dan bagaimana injeksi kode terjadi dalam proses permainan. Contoh yang bagus (kompleks) mengenai hal ini dapat ditemukan di repo Steamodded di sini.
[ 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
untuk menanamkan kode melalui pembedahan di lokasi tertentu dalam target. Mendukung *
(cocok dengan 0 atau lebih kemunculan karakter apa pun) dan ?
(cocok persis dengan satu kemunculan karakter apa pun) wildcard.regex
hanya jika patch pola tidak memenuhi kebutuhan Anda. Ini pada dasarnya adalah patch pola tetapi dengan mesin kueri regex yang mendukung, grup tangkapan, dan semuanya.copy
tambalan ketika Anda perlu menyalin sejumlah besar kode yang tidak bergantung pada posisi ke target.module
untuk memasukkan modul lua ke dalam runtime permainan. Perhatikan bahwa saat ini hanya mendukung modul file tunggal, tetapi ini akan segera berubah. File patch diambil dari direktori mod di dalam folder mod ( MOD_DIR
). Lovely akan memuat file patch apa pun yang ada dalam MOD_DIR/ModName/lovely/
atau memuat satu patch dari MOD_DIR/ModName/lovely.toml
. Jika beberapa patch dimuat, patch tersebut akan dimasukkan ke dalam game sesuai urutan penemuannya.
Jalur yang ditentukan dalam patch di-root oleh direktori mod. Misalnya, core/deck.lua
memutuskan menjadi MOD_DIR/ModName/core/deck.lua
.
Setiap definisi patch memiliki satu target patch. Target ini adalah jalur relatif dari file sumber saat dibuang dari game dengan alat seperti 7zip. Misalnya, seseorang dapat menargetkan file tingkat atas seperti main.lua
, atau file di subdirektori seperti engine/event.lua
.
Lovely dump menambal file sumber lua ke MOD_DIR/lovely/dump
. Log juga ditulis ke MOD_DIR/lovely/log
.
manifest.version