Lovely es un inyector lua que incorpora código en un juego LÖVE 2d en tiempo de ejecución. A diferencia de los parches ejecutables, los mods se pueden instalar, actualizar y eliminar una y otra vez sin necesidad de reinstalar parcial o totalmente el juego. Esto se logra mediante el desvío de API lua en el proceso y un sistema de parches fácil de usar (y distribuir).
lovely-x86_64-pc-windows-msvc.zip
.version.dll
en el directorio del juego. Puedes navegar al directorio del juego haciendo clic derecho en el juego en Steam, colocando el cursor sobre "Administrar" y seleccionando "Examinar archivos locales".%AppData%/Balatro/Mods
(si estás modificando Balatro).WINEDLLOVERRIDES="version=n,b" %command%
.lovely-aarch64-apple-darwin.tar.gz
. Si tienes una CPU Intel, será lovely-x86_64-apple-darwin.tar.gz
liblovely.dylib
y run_lovely.sh
en el directorio del juego. Puedes navegar al directorio del juego haciendo clic derecho en el juego en Steam, colocando el cursor sobre "Administrar" y seleccionando "Examinar archivos locales"./Users/$USER/Library/Application Support/Balatro/Mods
donde $USER
es su nombre de usuario (si está modificando Balatro).Shift-Command-.
(punto) para mostrar archivos ocultos en Finder.run_lovely.sh
en Terminal.app
en Aplicaciones > Utilidades y luego presionando Intro, o ejecutando sh run_lovely.sh
en la terminal dentro del directorio del juego. Nota: No puedes ejecutar tu juego a través de Steam en Mac debido a un error en el cliente Steam. Debes ejecutarlo con el script run_lovely.sh
.
Importante : Los mods con archivos de parche Lovely ( lovely.toml
o en lovely/*.toml
) deben instalarse en su propia carpeta dentro del directorio mod. ¡Sin excepciones!
Tenga en cuenta que el formato del parche es inestable y propenso a cambiar hasta que Lovely salga del desarrollo inicial.
Los archivos de parche definen dónde y cómo se produce la inyección de código dentro del proceso del juego. Un buen (complejo) ejemplo de esto se puede encontrar en el repositorio de Steamodded aquí.
[ 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
para incrustar código quirúrgicamente en ubicaciones específicas dentro del objetivo. Admite *
(coincide con 0 o más apariciones de cualquier carácter) y ?
(coincide exactamente con una aparición de cualquier carácter) comodines.regex
sólo cuando el parche de patrón no satisfaga sus necesidades. Este es básicamente el parche de patrón pero con un motor de consulta de expresiones regulares de respaldo, grupos de captura y todo.copy
cuando necesite copiar una gran cantidad de código independiente de la posición en el destino.module
para inyectar un módulo lua en el tiempo de ejecución del juego. Tenga en cuenta que actualmente esto solo admite módulos de un solo archivo, pero esto debería cambiar pronto. Los archivos de parche se cargan desde directorios mod dentro de la carpeta mod ( MOD_DIR
). Lovely cargará cualquier archivo de parche presente en MOD_DIR/ModName/lovely/
o cargará un solo parche desde MOD_DIR/ModName/lovely.toml
. Si se cargan varios parches, se inyectarán en el juego en el orden en que se encuentren.
Las rutas definidas dentro del parche tienen su raíz en el directorio del mod. Por ejemplo, core/deck.lua
se resuelve en MOD_DIR/ModName/core/deck.lua
.
Cada definición de parche tiene un único destino de parche. Estos objetivos son las rutas relativas de los archivos fuente cuando se descargan del juego con una herramienta como 7zip. Por ejemplo, uno puede apuntar a un archivo de nivel superior como main.lua
o uno en un subdirectorio como engine/event.lua
.
Lovely descarga los archivos fuente de lua parcheados en MOD_DIR/lovely/dump
. Los registros también se escriben en MOD_DIR/lovely/log
.
manifest.version