Lovely est un injecteur Lua qui intègre du code dans un jeu LÖVE 2D au moment de l'exécution. Contrairement aux correctifs exécutables, les mods peuvent être installés, mis à jour et supprimés encore et encore sans nécessiter une réinstallation partielle ou totale du jeu. Ceci est accompli grâce à un détour par l'API Lua en cours de processus et à un système de correctifs facile à utiliser (et à distribuer).
Téléchargez la dernière version pour Windows. Ce sera lovely-x86_64-pc-windows-msvc.zip
.
Ouvrez l'archive .zip, copiez version.dll
dans le répertoire du jeu. Vous pouvez accéder au répertoire du jeu en cliquant avec le bouton droit sur le jeu dans Steam, en survolant « Gérer » et en sélectionnant « Parcourir les fichiers locaux ».
Mettez un ou plusieurs mods dans le répertoire mod (PAS le même que le répertoire du jeu). Cela devrait être %AppData%/Balatro/Mods
(si vous modifiez Balatro).
Uniquement Steam Deck / Proton / Wine Définissez les options de lancement de votre jeu dans Steam sur WINEDLLOVERRIDES="version=n,b" %command%
.
Exécutez le jeu via Steam.
Téléchargez la dernière version pour Mac. Si vous possédez un processeur de la série M (M1, M2, etc.), ce sera lovely-aarch64-apple-darwin.tar.gz
. Si vous avez un processeur Intel, ce sera lovely-x86_64-apple-darwin.tar.gz
Ouvrez l'archive .zip, copiez liblovely.dylib
et run_lovely.sh
dans le répertoire du jeu. Vous pouvez accéder au répertoire du jeu en cliquant avec le bouton droit sur le jeu dans Steam, en survolant « Gérer » et en sélectionnant « Parcourir les fichiers locaux ».
Mettez un ou plusieurs mods dans le répertoire des mods Mac (PAS le même que le répertoire du jeu). Cela devrait être /Users/$USER/Library/Application Support/Balatro/Mods
où $USER
est votre nom d'utilisateur (si vous modifiez Balatro).
Si vous ne trouvez pas ce dossier, essayez d'appuyer sur Shift-Command-.
(point) pour afficher les fichiers cachés dans le Finder.
Exécutez le jeu en faisant glisser et en déposant run_lovely.sh
sur Terminal.app
dans Applications > Utilitaires, puis en appuyant sur Entrée, ou en exécutant sh run_lovely.sh
dans le terminal dans le répertoire du jeu.
Remarque : vous ne pouvez pas exécuter votre jeu via Steam sur Mac en raison d'un bug dans le client Steam. Vous devez l'exécuter avec le script run_lovely.sh
.
Important : les mods avec des fichiers de correctifs Lovely ( lovely.toml
ou dans lovely/*.toml
) doivent être installés dans leur propre dossier dans le répertoire du mod. Aucune exception !
Notez que le format du correctif est instable et susceptible de changer jusqu'à ce que Lovely soit sorti des premiers stades de développement.
Les fichiers de correctifs définissent où et comment l'injection de code se produit dans le processus de jeu. Un bon exemple (complexe) de ceci peut être trouvé dans le dépôt Steamodded ici.
[manifest]version = "1.0.0"priority = 0# Définir une règle de substitution var. Ceci recherche les lignes qui contiennent {{lovely:var_name}} # (var_name de cet exemple, cela peut vraiment être n'importe quoi) et remplace chaque correspondance par la # valeur fournie.# Cet exemple transformerait print('{{lovely:var_name} }') to print('Bonjour tout le monde !').# # UTILE : Lorsque vous souhaitez réduire la complexité des injections répétitives, par exemple. intégration des # numéros de version à plusieurs emplacements.[vars]var_name = "Hello world!"# Injectez une ou plusieurs lignes de code avant, après ou (en remplacement) d'une ligne qui correspond # au modèle fourni.## UTILE : Pour lorsque vous devez ajouter/modifier une petite quantité de code pour configurer les # routines d'initialisation, etc.[[patches]] [patches.pattern]target = "game.lua"pattern = "self.SPEEDFACTOR = 1"position = "after"payload = '''initSteamodded()print('{{lovely:var_name}}')'''match_indent = truetimes = 1# Injectez une ou plusieurs lignes de code avant, après, à ou entrelacées dans un ou plusieurs # groupes de capture Regex.# - Je vous recommande d'utiliser un terrain de jeu Regex comme https://regexr.com pour créer # vos modèles.# - Regex N'EST PAS EFFICACE. Veuillez utiliser le patch de motif sauf en cas d'absolue nécessité.# - Ce patch prend en charge le groupe de capture.# - Ce patch ne coupe PAS les espaces de chaque ligne. Tenez-en compte lors de # la conception de votre modèle.## UTILE : Lorsque le patch du modèle n'est pas assez expressif pour décrire comment la # charge utile doit être injectée.[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 et obj.apply et type(obj.apply) == 'function' then res = obj.apply(self, _context)endif res puis return reselseif $cond''' times = 1# Ajoutez ou ajoutez le contenu d'un ou plusieurs fichiers sur la cible.## UTILE : Lorsque vous vous souciez *uniquement* d'introduire votre code dans le jeu, rien d'autre. # Cela ne l'injecte PAS en tant que nouveau 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", ]# Injectez un nouveau module dans le jeu *avant* un fichier cible qu'il a chargé.# UTILE : lorsque vous souhaitez cloisonner votre code dans un module obligatoire séparé OU injecter une dépendance "globale" avant que le code du jeu/mod ne commence à s'exécuter .[[patchs]] [patches.module]source = "nativefs.lua" avant = "main.lua" nom = "nativefs"
Utilisez des correctifs pattern
pour intégrer chirurgicalement du code à des emplacements spécifiques de la cible. Prend en charge *
(correspond à 0 ou plusieurs occurrences de n'importe quel caractère) et ?
(correspond à exactement une occurrence de n'importe quel caractère) caractères génériques.
Utilisez les correctifs regex
uniquement lorsque le correctif de modèle ne répond pas à vos besoins. Il s'agit essentiellement du correctif de modèle, mais avec un moteur de requête regex de support, des groupes de capture et tout.
Utilisez des correctifs copy
lorsque vous devez copier une grande quantité de code indépendant de la position dans la cible.
Utilisez des correctifs module
pour injecter un module Lua dans le runtime du jeu. Notez que cela ne prend actuellement en charge que les modules à fichier unique, mais cela devrait bientôt changer.
Les fichiers de correctifs sont chargés à partir des répertoires mod à l'intérieur du dossier mod ( MOD_DIR
). Lovely chargera tous les fichiers de correctifs présents dans MOD_DIR/ModName/lovely/
ou chargera un seul correctif à partir de MOD_DIR/ModName/lovely.toml
. Si plusieurs correctifs sont chargés, ils seront injectés dans le jeu dans l'ordre dans lequel ils ont été trouvés.
Les chemins définis dans le patch sont enracinés dans le répertoire du mod. Par exemple, core/deck.lua
se résout en MOD_DIR/ModName/core/deck.lua
.
Chaque définition de correctif possède une seule cible de correctif. Ces cibles sont les chemins relatifs des fichiers sources lorsqu'ils sont vidés du jeu avec un outil comme 7zip. Par exemple, on peut cibler un fichier de niveau supérieur comme main.lua
, ou un fichier dans un sous-répertoire comme engine/event.lua
.
Lovely dumps les fichiers source Lua corrigés dans MOD_DIR/lovely/dump
. Les journaux sont également écrits dans MOD_DIR/lovely/log
.
manifest.version