Lovely คือ lua injector ซึ่งฝังโค้ดลงในเกม LÖVE 2d ขณะรันไทม์ ต่างจากโปรแกรมแพทช์ปฏิบัติการตรงที่ม็อดสามารถติดตั้ง อัปเดต และลบออก ซ้ำแล้วซ้ำเล่า โดยไม่ต้องติดตั้งเกมใหม่บางส่วนหรือทั้งหมด ซึ่งสามารถทำได้ผ่านการเบี่ยงเบน lua API ในกระบวนการและระบบแพตช์ที่ใช้งานง่าย (และกระจาย)
ดาวน์โหลดรุ่นล่าสุดสำหรับ Windows lovely-x86_64-pc-windows-msvc.zip
-x86_64-pc-windows-msvc.zip นี้จะเป็น
เปิดไฟล์เก็บถาวร .zip คัดลอก version.dll
ลงในไดเร็กทอรีเกม คุณสามารถนำทางไปยังไดเร็กทอรีของเกมได้โดยคลิกขวาที่เกมใน Steam วางเมาส์เหนือ "จัดการ" และเลือก "เรียกดูไฟล์ในเครื่อง"
ใส่ mod อย่างน้อยหนึ่งตัวลงในไดเร็กทอรี mod (ไม่เหมือนกับไดเร็กทอรีเกม) นี่ควรเป็น %AppData%/Balatro/Mods
(หากคุณกำลังดัดแปลง Balatro)
เฉพาะ Steam Deck / Proton / Wine ตั้งค่าตัวเลือกการเปิดตัวเกมของคุณใน Steam เป็น WINEDLLOVERRIDES="version=n,b" %command%
รันเกมผ่าน Steam
ดาวน์โหลดรุ่นล่าสุดสำหรับ Mac หากคุณมีซีพียู M-series (M1, M2 ฯลฯ ) lovely-aarch64-apple-darwin.tar.gz
ก็จะเป็นเช่นนี้ หากคุณมี Intel CPU มันจะ lovely-x86_64-apple-darwin.tar.gz
เปิดไฟล์เก็บถาวร .zip คัดลอก liblovely.dylib
และ run_lovely.sh
ลงในไดเร็กทอรีเกม คุณสามารถนำทางไปยังไดเร็กทอรีของเกมได้โดยคลิกขวาที่เกมใน Steam วางเมาส์เหนือ "จัดการ" และเลือก "เรียกดูไฟล์ในเครื่อง"
ใส่ mod หนึ่งตัวขึ้นไปลงในไดเร็กทอรี mod ของ Mac (ไม่เหมือนกับไดเร็กทอรีเกม) นี่ควรเป็น /Users/$USER/Library/Application Support/Balatro/Mods
โดยที่ $USER
คือชื่อผู้ใช้ของคุณ (หากคุณกำลังดัดแปลง Balatro)
หากไม่พบโฟลเดอร์นี้ ให้ลองกด Shift-Command-.
(จุด) เพื่อแสดงไฟล์ที่ซ่อนอยู่ใน Finder
รันเกมโดยการลากและวาง run_lovely.sh
ลงใน Terminal.app
ใน Applications > Utilities จากนั้นกด Enter หรือโดยการรัน sh run_lovely.sh
ในเทอร์มินัลภายในไดเร็กทอรีเกม
หมายเหตุ: คุณไม่สามารถรันเกมของคุณผ่าน Steam บน Mac ได้เนื่องจากมีข้อบกพร่องภายในไคลเอนต์ Steam คุณต้องรันด้วยสคริปต์ run_lovely.sh
สิ่งสำคัญ : Mods ที่มีไฟล์แพตช์ Lovely ( lovely.toml
หรือใน lovely/*.toml
) จะต้อง ติดตั้งลงในโฟลเดอร์ของตัวเองภายในไดเร็กทอรี mod ไม่มีข้อยกเว้น!
โปรดทราบว่ารูปแบบของแพทช์ไม่เสถียรและมีแนวโน้มที่จะเปลี่ยนแปลงจนกว่า Lovely จะออกจากการพัฒนาในช่วงแรก
ไฟล์แพทช์ จะกำหนดตำแหน่งและวิธีที่การแทรกโค้ดเกิดขึ้นภายในกระบวนการเกม ตัวอย่างที่ดี (ซับซ้อน) ของสิ่งนี้สามารถพบได้ใน Steamodded repo ที่นี่
[manifest]version = "1.0.0"priority = 0# กำหนดกฎการทดแทน var การค้นหานี้จะค้นหาบรรทัดที่มี {{lovely:var_name}} # (var_name จากตัวอย่างนี้สามารถเป็นอะไรก็ได้) และแทนที่แต่ละรายการที่ตรงกันด้วยค่า # ที่ระบุ# ตัวอย่างนี้จะแปลง print('{{lovely:var_name} }') เพื่อพิมพ์('Hello world!').# # มีประโยชน์: สำหรับเมื่อคุณต้องการลดความซับซ้อนของการฉีดซ้ำ ๆ เช่น การฝัง # หมายเลขเวอร์ชันที่วางจำหน่ายในหลาย ๆ ตำแหน่ง[vars]var_name = "Hello world!"# ฉีดโค้ดอย่างน้อยหนึ่งบรรทัดก่อน หลัง หรือที่ (แทนที่) บรรทัดที่ตรงกับ # รูปแบบที่ให้ไว้## มีประโยชน์: สำหรับ เมื่อคุณต้องการเพิ่ม/แก้ไขโค้ดจำนวนเล็กน้อยเพื่อตั้งค่าการเริ่มต้น # รูทีน ฯลฯ[[แพทช์]] [patches.pattern]target = "game.lua"pattern = "self.SPEEDFACTOR = 1"position = "after"payload = '''initSteamodded()print('{{lovely:var_name}}')'''match_indent = truetimes = 1# ฉีดโค้ดอย่างน้อยหนึ่งบรรทัดก่อน, หลัง, ที่, หรือรวมเข้าเป็นกลุ่ม # Regex capture groups.# - ฉันขอแนะนำให้คุณใช้ Regex Playground เช่น https://regexr.com เพื่อสร้าง # รูปแบบของคุณ# - Regex นั้นมีประสิทธิภาพ โปรดใช้แพตช์รูปแบบเว้นแต่จำเป็นจริงๆ# - แพตช์นี้มีการสนับสนุนกลุ่มการจับภาพ # - แพตช์นี้ไม่ตัดช่องว่างออกจากแต่ละบรรทัด โปรดคำนึงถึงสิ่งนั้นเมื่อ # ออกแบบรูปแบบของคุณ## มีประโยชน์: เมื่อแพตช์รูปแบบไม่ชัดเจนเพียงพอที่จะอธิบายว่าควรเพิ่มเพย์โหลด # อย่างไร[patches.regex]target = "tag.lua"pattern = "(? <เยื้อง>[t ]*)if (?<cond>_context.type == 'eval' แล้ว)"position = 'at'line_prepend = '$indent'payload = '''local obj = SMODS.Tags[self.key]local resif obj และ obj.apply และพิมพ์ (obj.apply) == 'function' จากนั้น res = obj.apply(self, _context)endif res จากนั้นส่งคืน reselseif $ cond''''times = 1# ผนวกหรือเพิ่มเนื้อหาของไฟล์ตั้งแต่หนึ่งไฟล์ขึ้นไปบนเป้าหมาย ## มีประโยชน์: เมื่อคุณ *เพียง* สนใจที่จะใส่โค้ดของคุณเข้าไป เกมไม่มีอะไรอื่น # สิ่งนี้ไม่ได้ฉีดเป็นโมดูลใหม่ [[แพทช์]] [patches.copy]target = "main.lua"position = "append"sources = ["core/core.lua","core/deck.lua", "core/joker.lua", "core/sprite.lua" ","debug/debug.lua","โหลดเดอร์/loader.lua", ]# แทรกโมดูลใหม่เข้าไปในเกม *ก่อน* ไฟล์เป้าหมายที่จะโหลด# มีประโยชน์: สำหรับเมื่อคุณต้องการแยกโค้ดของคุณไปไว้ในโมดูลที่ต้องการแยกต่างหาก หรือแทรกการพึ่งพา "สากล" ก่อนที่โค้ดเกม / ม็อดจะเริ่มดำเนินการ .[[แพทช์]] [patches.module]source = "nativefs.lua"before = "main.lua"name = "nativefs"
ใช้แพตช์ pattern
เพื่อฝังโค้ดโดยการผ่าตัดที่ตำแหน่งเฉพาะภายในเป้าหมาย รองรับ *
(จับคู่อักขระใดๆ 0 รายการขึ้นไป) และ ?
(ตรงกับอักขระใดๆ ที่ปรากฏเพียงตัวเดียว) ไวด์การ์ด
ใช้แพตช์ regex
เมื่อแพตช์รูปแบบไม่ตรงตามความต้องการของคุณ เท่านั้น โดยพื้นฐานแล้วนี่คือแพตช์รูปแบบ แต่ด้วยเอ็นจิ้นการสืบค้น regex ที่สนับสนุน กลุ่มการจับ และทั้งหมด
ใช้โปรแกรม copy
ลอกเมื่อคุณต้องการคัดลอกโค้ดที่ไม่ขึ้นอยู่กับตำแหน่งจำนวนมากไปยังเป้าหมาย
ใช้แพทช์ module
เพื่อแทรกโมดูล lua ลงในรันไทม์ของเกม โปรดทราบว่าขณะนี้รองรับเฉพาะโมดูลไฟล์เดียว แต่ควรมีการเปลี่ยนแปลงเร็วๆ นี้
ไฟล์แพทช์ถูกโหลดจากไดเร็กทอรี mod ภายในโฟลเดอร์ mod ( MOD_DIR
) Lovely จะโหลดไฟล์แพทช์ใดๆ ที่มีอยู่ภายใน MOD_DIR/ModName/lovely/
หรือโหลดแพทช์เดียวจาก MOD_DIR/ModName/lovely.toml
หากโหลดแพตช์หลายอัน แพตช์เหล่านั้นจะถูกฉีดเข้าไปในเกมตามลำดับที่พบ
เส้นทางที่กำหนดภายในแพตช์นั้นถูกรูทโดยไดเร็กทอรีของ mod ตัวอย่างเช่น core/deck.lua
แก้เป็น MOD_DIR/ModName/core/deck.lua
แต่ละคำจำกัดความของแพตช์มีเป้าหมายแพตช์เดียว เป้าหมายเหล่านี้เป็นเส้นทางสัมพัทธ์ของไฟล์ต้นฉบับเมื่อถูกทิ้งจากเกมด้วยเครื่องมือเช่น 7zip ตัวอย่างเช่น เราสามารถกำหนดเป้าหมายไฟล์ระดับบนสุด เช่น main.lua
หรือไฟล์ในไดเรกทอรีย่อย เช่น engine/event.lua
Lovely dumps ได้แพตช์ไฟล์ต้นฉบับ lua ไปที่ MOD_DIR/lovely/dump
บันทึกจะถูกเขียนลงใน MOD_DIR/lovely/log
เช่นเดียวกัน
manifest.version