Lovely هو حاقن lua الذي يدمج الكود في لعبة LÖVE 2d في وقت التشغيل. على عكس برامج التصحيح القابلة للتنفيذ، يمكن تثبيت التعديلات وتحديثها وإزالتها مرارًا وتكرارًا دون الحاجة إلى إعادة تثبيت اللعبة جزئيًا أو كليًا. يتم تحقيق ذلك من خلال تحويل واجهة برمجة تطبيقات lua قيد التشغيل ونظام التصحيح سهل الاستخدام (والتوزيع).
lovely-x86_64-pc-windows-msvc.zip
.version.dll
إلى دليل اللعبة. يمكنك الانتقال إلى دليل اللعبة عن طريق النقر بزر الماوس الأيمن فوق اللعبة في Steam، ثم تمرير مؤشر الماوس فوق "إدارة"، واختيار "استعراض الملفات المحلية".%AppData%/Balatro/Mods
(إذا كنت تقوم بتعديل Balatro).WINEDLLOVERRIDES="version=n,b" %command%
.lovely-aarch64-apple-darwin.tar.gz
. إذا كان لديك وحدة المعالجة المركزية Intel، فسيكون ذلك lovely-x86_64-apple-darwin.tar.gz
liblovely.dylib
و run_lovely.sh
إلى دليل اللعبة. يمكنك الانتقال إلى دليل اللعبة عن طريق النقر بزر الماوس الأيمن فوق اللعبة في Steam، ثم تمرير مؤشر الماوس فوق "إدارة"، واختيار "تصفح الملفات المحلية"./Users/$USER/Library/Application Support/Balatro/Mods
حيث $USER
هو اسم المستخدم الخاص بك (إذا كنت تقوم بتعديل Balatro).Shift-Command-.
(فترة) لإظهار الملفات المخفية في Finder.run_lovely.sh
على Terminal.app
في Applications > Utilities ثم الضغط على زر الإدخال، أو عن طريق تنفيذ sh run_lovely.sh
في الوحدة الطرفية داخل دليل اللعبة. ملاحظة: لا يمكنك تشغيل لعبتك من خلال Steam على جهاز Mac بسبب وجود خطأ داخل عميل Steam. يجب عليك تشغيله باستخدام البرنامج النصي run_lovely.sh
.
هام : يجب تثبيت التعديلات التي تحتوي على ملفات التصحيح الجميلة ( lovely.toml
أو lovely/*.toml
) في المجلد الخاص بها داخل دليل التعديل. لا استثناءات!
لاحظ أن تنسيق التصحيح غير مستقر وعرضة للتغيير حتى يخرج Lovely من التطوير المبكر.
تحدد ملفات التصحيح مكان وكيفية إدخال التعليمات البرمجية أثناء عملية اللعبة. يمكن العثور على مثال جيد (معقد) لهذا في Steamodded repo هنا.
[ 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
لتضمين التعليمات البرمجية جراحيًا في مواقع محددة داخل الهدف. يدعم *
(يطابق 0 أو أكثر من تكرارات أي حرف) و ?
(يطابق تمامًا تكرارًا واحدًا لأي حرف) أحرف البدل.regex
فقط عندما لا يلبي تصحيح النمط احتياجاتك. هذا هو في الأساس تصحيح النمط ولكن مع محرك استعلام regex الداعم ومجموعات الالتقاط وكل شيء.copy
عندما تحتاج إلى نسخ كمية كبيرة من التعليمات البرمجية المستقلة عن الموضع إلى الهدف.module
لإدخال وحدة lua في وقت تشغيل اللعبة. لاحظ أن هذا يدعم حاليًا وحدات الملفات الفردية فقط، ولكن من المفترض أن يتغير هذا قريبًا. يتم تحميل ملفات التصحيح من أدلة التعديل داخل مجلد التعديل ( MOD_DIR
). سوف يقوم Lovely بتحميل أي ملفات تصحيح موجودة داخل MOD_DIR/ModName/lovely/
أو تحميل تصحيح واحد من MOD_DIR/ModName/lovely.toml
. إذا تم تحميل تصحيحات متعددة، فسيتم إدخالها في اللعبة بالترتيب الذي تم العثور عليها به.
يتم تجذير المسارات المحددة داخل التصحيح بواسطة دليل التعديل. على سبيل المثال، يتحول core/deck.lua
إلى MOD_DIR/ModName/core/deck.lua
.
يحتوي كل تعريف تصحيح على هدف تصحيح واحد. هذه الأهداف هي المسارات النسبية للملفات المصدر عند تفريغها من اللعبة باستخدام أداة مثل 7zip. على سبيل المثال، يمكن للمرء استهداف ملف عالي المستوى مثل main.lua
، أو ملف موجود في دليل فرعي مثل engine/event.lua
.
مقالب جميلة تم تصحيح ملفات مصدر lua إلى MOD_DIR/lovely/dump
. تتم كتابة السجلات أيضًا على MOD_DIR/lovely/log
.
manifest.version