Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1450 commits
Select commit Hold shift + click to select a range
a2c567f
Merge pull request #296 from Chlebqowy/main
V-rtualized Sep 15, 2025
a83e617
Merge pull request #293 from Balatro-Multiplayer/0218b-sandbox-fixes
stephenkirk Sep 18, 2025
4113388
Remove backwards compatibility for old server in action_lobbyInfo fun…
Brawmario Sep 22, 2025
483f16f
mp_include and bugfix gradient
Toneblock Sep 22, 2025
507834a
Removed "j_mp_magnet"
alexxyo3 Sep 26, 2025
2e69b55
Merge pull request #300 from Brawmario/fix/remove-guest-ready-hack
Toneblock Oct 15, 2025
9c74780
Merge branch 'Balatro-Multiplayer:main' into main
alexxyo3 Oct 16, 2025
d79d1a8
Change override of blind_choice_handler function to lovely patch
larswijn Oct 16, 2025
c417aff
Merge pull request #311 from larswijn/blind_choice_handler-as-patch
Toneblock Oct 18, 2025
d8e3041
Merge pull request #305 from Toneblock/main
Toneblock Oct 18, 2025
8730d0b
fix preview and add cocktail editing
Toneblock Oct 19, 2025
29e5373
add controller lock during countdown
Toneblock Oct 20, 2025
e56df2d
improve cocktail select
Toneblock Oct 22, 2025
d67434a
add indigo deck + cocktail stickers
Toneblock Oct 24, 2025
bf195cb
better hot potato compat (wip)
Toneblock Oct 25, 2025
24752f3
Update lobby.lua
toobing Oct 25, 2025
fe636ff
Merge pull request #1 from toobing/toobing-patch-1
toobing Oct 25, 2025
a17f441
make preview events unblockable
Toneblock Oct 26, 2025
c5ca3cc
salvaged sibyl + remove duplicate options
Toneblock Oct 27, 2025
97132e8
Merge pull request #314 from toobing/main
Toneblock Oct 28, 2025
6525d6f
Merge branch 'Balatro-Multiplayer:main' into main
Toneblock Oct 29, 2025
27ad31b
polymorph spam
Toneblock Oct 30, 2025
f0d1b23
fix preview hook + midas
Toneblock Oct 30, 2025
ce9cb7e
wip white deck (still)
Toneblock Nov 4, 2025
3361255
cleanup
Toneblock Nov 7, 2025
318d0a5
fix json stuff
Toneblock Nov 12, 2025
02bcf86
cleanup
Toneblock Nov 13, 2025
687720f
Merge pull request #316 from Toneblock/main
Toneblock Nov 13, 2025
74c204c
fix cocktail deck crashing
Toneblock Nov 13, 2025
1ef7db0
fix crashes
Toneblock Nov 13, 2025
d04704f
indigo deck to +1 choice instead of X2
Toneblock Nov 13, 2025
2eca742
fix preview lag (remove coroutine)
Toneblock Nov 15, 2025
cbb9ee2
(release prep) update version
Toneblock Nov 16, 2025
755e8bb
rename blitz -> standard, update READMEs
Toneblock Nov 16, 2025
161665b
fix some indigo softlocks
Toneblock Nov 17, 2025
692a374
fix odd gradient crash
Toneblock Nov 18, 2025
83086fd
fix hit the road
Toneblock Nov 21, 2025
4f94724
add flag to switch between old and new networking implementations
stephenkirk Nov 21, 2025
d42750f
idol
stephenkirk Sep 15, 2025
dea47dd
update bloodstone caption + add ANOTHER idol...?
stephenkirk Sep 16, 2025
9434c11
Idol naming changes
stephenkirk Sep 17, 2025
fb3c293
ecto rolls the dice
stephenkirk Sep 18, 2025
25f83e5
weegee + localizations
stephenkirk Sep 18, 2025
d9ee7d4
fix ectoplasm roll
stephenkirk Sep 18, 2025
d29f512
asd
stephenkirk Sep 20, 2025
13118b5
jp localization
stephenkirk Sep 20, 2025
897707f
fix spectral mp stickers
stephenkirk Sep 22, 2025
1aee1bc
ouija description localization, cange timings around
stephenkirk Sep 22, 2025
685d0c9
add juggle tag, rename gambling tag
stephenkirk Sep 23, 2025
a8c2960
investment taaaag
stephenkirk Sep 23, 2025
5872340
Comeback money change
stephenkirk Sep 23, 2025
a46d0e7
Idol banning system
stephenkirk Sep 26, 2025
b9665fa
shuffled loading screen! yay!
stephenkirk Nov 7, 2025
fb2bd4b
refactor idol banning code
stephenkirk Nov 7, 2025
5de3b1c
Add stake atlas
stephenkirk Nov 10, 2025
888a0ff
centralized banlist
stephenkirk Nov 10, 2025
1b0e9b6
banlist + mappings
stephenkirk Nov 10, 2025
9126c66
improve planet stake description
stephenkirk Nov 11, 2025
a041078
the big joker description replacement
stephenkirk Nov 11, 2025
07a5ba3
fix broken rebase
stephenkirk Nov 18, 2025
2b8096e
take out the broken idol
stephenkirk Nov 18, 2025
b09baac
bump veresion
stephenkirk Nov 18, 2025
ec3f53c
better descriptions
stephenkirk Nov 18, 2025
e06ab0d
the order is back
stephenkirk Nov 21, 2025
a3156a7
the order (joker) now does consec straights style
stephenkirk Nov 21, 2025
fe8c4f6
properly play reset anim
stephenkirk Nov 21, 2025
0110018
revert version
stephenkirk Nov 21, 2025
50091f8
fix idol selection
stephenkirk Nov 21, 2025
b76c20d
oops debugging hotswitch silliness
stephenkirk Nov 21, 2025
a13b190
Merge pull request #318 from Balatro-Multiplayer/sandbox/idol
Toneblock Nov 21, 2025
ca9d78a
release prep, stylua pass
Toneblock Nov 21, 2025
17bc4e6
Merge pull request #317 from Balatro-Multiplayer/networking-switch
Toneblock Nov 25, 2025
6136001
use new networking for now
Toneblock Nov 25, 2025
10a4d9d
fix bugs, compat for hotpot and galdur
Toneblock Nov 25, 2025
05c77ad
stylua pass
Toneblock Nov 25, 2025
2f4c32c
add option to disable timer sounds
shepgoba Nov 27, 2025
316e19f
adjust wording
shepgoba Nov 27, 2025
f0110fd
Merge pull request #323 from shepgoba/disable-timer-sounds
Toneblock Nov 27, 2025
e7524ea
reimplement reworkcenter
Toneblock Nov 27, 2025
ea5fecb
Merge branch 'main' of https://github.com/Toneblock/BalatroMultiplayer
Toneblock Nov 27, 2025
584c86a
Merge branch 'main' of https://github.com/Toneblock/BalatroMultiplayer
Toneblock Nov 27, 2025
ecc90f5
add timer sfx option, fix bugs
Toneblock Nov 29, 2025
4eed201
Add a challenge deck
KilledByLava Dec 2, 2025
1bcc361
C O M M A
KilledByLava Dec 2, 2025
1bf191d
add stylua for localizations
oliviaBahr Dec 8, 2025
13c2867
fix missing comma and extra whitespace in Polish localization
oliviaBahr Dec 8, 2025
87444a6
Merge pull request #324 from KilledByLava/main
Toneblock Dec 8, 2025
cd6ad7b
Merge pull request #325 from oliviaBahr/main
Toneblock Dec 8, 2025
417a947
Merge branch 'Balatro-Multiplayer:main' into main
Toneblock Dec 9, 2025
747b5a6
Fix Pokermon crash
KilledByLava Dec 18, 2025
3a56400
alt stakes (may disable later) and bugfixes
Toneblock Dec 19, 2025
86727e0
Merge pull request #327 from KilledByLava/main
Toneblock Dec 21, 2025
93d0388
add speedlatro, fix bugs
Toneblock Dec 22, 2025
e70f87a
run stylua
oliviaBahr Dec 22, 2025
68ac8e2
some linter fixes
oliviaBahr Dec 22, 2025
8299472
fix duplicate keys in localizations
oliviaBahr Dec 22, 2025
1d03b17
ignore depreciated math.pow warning
oliviaBahr Dec 22, 2025
838652e
Merge pull request #328 from Toneblock/main
Toneblock Dec 23, 2025
eaae1cf
Merge branch 'main' into linter-fixes
Toneblock Dec 23, 2025
95fe965
Merge pull request #330 from oliviaBahr/linter-fixes
Toneblock Dec 23, 2025
d179322
reorganize ui dir
oliviaBahr Dec 24, 2025
f3ffc64
Merge pull request #332 from oliviaBahr/ui_reorg
stephenkirk Dec 25, 2025
01f5d9c
mirror changes from #332 in current networking
Toneblock Dec 25, 2025
5703e78
fix ttm desc
Toneblock Dec 29, 2025
518e407
fix sandbox glass
stephenkirk Jan 2, 2026
77bccbf
remove dead code
stephenkirk Jan 2, 2026
b6a546e
begin big rewrite
stephenkirk Dec 25, 2025
6b62510
Use `ruleset_key`` in ApplyBans
stephenkirk Dec 27, 2025
de735f2
initial active_ruleset wrapper around rulesets
stephenkirk Dec 27, 2025
b1d2e69
fix ecto, ouija stuff
stephenkirk Dec 27, 2025
96cd102
fix tags
stephenkirk Dec 27, 2025
217129a
separate out vanilla sp to separate button
stephenkirk Dec 27, 2025
0895aa3
refresh ruleset order
stephenkirk Jan 2, 2026
702ecb6
Merge pull request #334 from Balatro-Multiplayer/feature/sp-rulesets-…
stephenkirk Jan 2, 2026
6aa7049
fix broken locstrings
stephenkirk Jan 2, 2026
eeca97b
Rename custom stakes to ensure order planet -> spectral -> spectralplus
stephenkirk Jan 3, 2026
3f10f55
also force ruleset order using `above_stake`
stephenkirk Jan 3, 2026
f52687d
Add experimental feature flag for stakes etc
stephenkirk Jan 3, 2026
ddc7438
fix crash from #332
stephenkirk Jan 3, 2026
e59b70a
Refactor ReworkCenter + add `loc_vars` injection
stephenkirk Jan 4, 2026
8ca7737
Alternate API for ReworkCenter
stephenkirk Jan 4, 2026
34f5856
misc -> lib + begin refactor
stephenkirk Dec 30, 2025
eb6fa1e
ui_helpers
stephenkirk Dec 30, 2025
acb5d2a
move mod badge override
stephenkirk Dec 30, 2025
b6d3717
table stuff loads first, card_utils, overrides etc
stephenkirk Dec 30, 2025
060fa8c
done moving things around
stephenkirk Dec 30, 2025
8083a66
move disable_restart, kill mod_hash.lua
stephenkirk Dec 30, 2025
e54a414
ui_helpers -> ui, move more stuff to ui
stephenkirk Dec 30, 2025
c30700f
move last override
stephenkirk Dec 30, 2025
24d8f72
move hide_content to overrides
stephenkirk Dec 30, 2025
19bb164
yoink
stephenkirk Jan 4, 2026
cccd3cc
Merge pull request #335 from Balatro-Multiplayer/refactor/misc-folder
stephenkirk Jan 4, 2026
19d5f95
Merge pull request #339 from Balatro-Multiplayer/feat/reworkcenter-re…
stephenkirk Jan 4, 2026
529d72d
Add Spanish (Latin) translation updates
stephenkirk Jan 4, 2026
ec4bf24
fix: hanging chad rework in sandbox
stephenkirk Jan 4, 2026
b3c3afc
fix dangling pointers to old hanging chad
stephenkirk Jan 4, 2026
bb6e273
rebrand
stephenkirk Jan 4, 2026
bd63436
edit ruleset descriptions
stephenkirk Jan 5, 2026
09a9cfd
respect the meta
stephenkirk Jan 5, 2026
4176660
Initial implementation
stephenkirk Jan 11, 2026
a555538
Merge pull request #341 from Balatro-Multiplayer/joker-stats
stephenkirk Jan 14, 2026
c02d8bf
Added mac hwid logging (finally)
12problems Jan 20, 2026
c5d98e3
Add Korean translation
toppeak-web Jan 22, 2026
2367950
no calc for major league
davidmolgard Jan 26, 2026
c616928
Implemented TheOrder's voucher fix for major league ruleset (as reque…
davidmolgard Jan 26, 2026
729a33c
remove extra arg in MP.UI.Main_Lobby_Options
oliviaBahr Jan 27, 2026
b64ab90
Fix glass rework
oliviaBahr Jan 27, 2026
89d7188
Fix glass rework
oliviaBahr Jan 27, 2026
ca3ebe6
Voucher fix for Major League (but for real this time)
Fantom-Balatro Jan 30, 2026
2f9e2a0
Flattened comeback money
Fantom-Balatro Jan 30, 2026
af12282
Comeback money no longer given outside of pvp
Fantom-Balatro Jan 30, 2026
02a640e
comeback money halved on blue+ stake
Fantom-Balatro Jan 30, 2026
6bfbb6e
comeback money reverted for major league
Fantom-Balatro Jan 30, 2026
99d5f5f
Comeback money for non-pvp blinds re-enabled for major league
Fantom-Balatro Jan 30, 2026
a46ad56
Update Lovely Injector version requirement to 0.9
HelloIlovegimkit4 Feb 10, 2026
26efecd
Fix: timer doesn't send client messages if pressed when at 0
Casjb Feb 11, 2026
2dce542
Fix: fixed insta ready-up bug
Casjb Feb 11, 2026
0e9edc3
Merge pull request #350 from Balatro-Multiplayer/Casjb-patch-1
Casjb Feb 11, 2026
b288dd5
Update functions.lua
Casjb Feb 11, 2026
d509736
Merge pull request #351 from Balatro-Multiplayer/pause-timer-on-unready
Casjb Feb 11, 2026
a61560c
Merge pull request #349 from HelloIlovegimkit4/main
stephenkirk Feb 14, 2026
63ce140
Merge pull request #301 from alexxyo3/main
V-rtualized Feb 18, 2026
8130e02
Merge pull request #343 from 12problems/main
V-rtualized Feb 18, 2026
6742a9f
Merge pull request #344 from toppeak-web/main
V-rtualized Feb 18, 2026
cd6aa8b
Merge pull request #346 from oliviaBahr/main
V-rtualized Feb 18, 2026
cfc396f
Merge pull request #347 from oliviaBahr/glass
V-rtualized Feb 18, 2026
b9a44bb
Merge pull request #355 from Fantom-Balatro/main
V-rtualized Feb 18, 2026
ef5f38b
Fix deck duplication in rare circumstances (#298)
V-rtualized Feb 18, 2026
804a305
Removed patch that fixes an smods bug that was patched officially
V-rtualized Feb 18, 2026
ff63b97
Updated Multiplayer to use new SMODS.upgrade_poker_hands
V-rtualized Feb 18, 2026
5df5496
Big update number
V-rtualized Feb 18, 2026
05f3c8d
3rd party mod server integrations
V-rtualized Feb 18, 2026
a23fc52
Move standard reworks to /standard/
stephenkirk Dec 28, 2025
4191f03
Refactor into separate files
stephenkirk Feb 18, 2026
6b887d5
add consistency fields and mp_sticker_balanced to standard v2 jokers …
stephenkirk Feb 18, 2026
6eea612
wire reworked jokers and ouija into all standard rulesets
stephenkirk Feb 18, 2026
2fb322c
ban vanilla ouija
stephenkirk Feb 18, 2026
457ddb5
silent ban reworks
stephenkirk Feb 18, 2026
6120346
add missing bloodstone ban
stephenkirk Feb 18, 2026
19f7297
oops
stephenkirk Feb 18, 2026
29007ae
hanging_chad_standard -> hanging_chad
stephenkirk Feb 18, 2026
57fc3b7
Added delayed modded action registration
V-rtualized Feb 19, 2026
4bffce5
Updated SPEEDRUN description
V-rtualized Feb 19, 2026
dc8ac0a
Merge pull request #356 from Balatro-Multiplayer/feat/ranked-patch-an…
stephenkirk Feb 19, 2026
e3ee254
fix lovely version
stephenkirk Feb 19, 2026
c0e36cb
Possible judgement reimplementation
V-rtualized Feb 20, 2026
4b73510
Classic
V-rtualized Feb 21, 2026
46e624d
fix(glass): migrate ReworkCenter calls to opts-table API
stephenkirk Feb 22, 2026
5533bea
Merge pull request #359 from Balatro-Multiplayer/feat/ranked_03
V-rtualized Feb 22, 2026
6bafd77
Merge branch 'main' into Classic
V-rtualized Feb 22, 2026
f6402dc
New Ouija 2.0 art and custom atlas for ouija_standard
stephenkirk Feb 22, 2026
3cb2e07
oops
stephenkirk Feb 22, 2026
018d52d
Proposed changes
V-rtualized Feb 22, 2026
cfaf7b2
Legacy description update
V-rtualized Feb 22, 2026
1d3c417
No hanging chad rework in legacy
V-rtualized Feb 23, 2026
8d12903
Merge pull request #357 from Balatro-Multiplayer/fix-lovely2
V-rtualized Feb 23, 2026
e3bab82
Merge pull request #358 from Balatro-Multiplayer/Classic
V-rtualized Feb 23, 2026
f01460c
Merge pull request #360 from Balatro-Multiplayer/weegee
V-rtualized Feb 23, 2026
a454e47
Update Steamodded and Lovely Injector version requirements
V-rtualized Feb 23, 2026
1c43512
Fixed lovely check and made a util
V-rtualized Feb 23, 2026
0956dfe
sandbox v3 big commit
stephenkirk Feb 24, 2026
242f5f9
remove seltzer; fix quantum mechanics w alloy etc
stephenkirk Feb 24, 2026
6cb6d5d
Bump comment
stephenkirk Feb 24, 2026
8aa8bfd
clean up idol keys
stephenkirk Feb 24, 2026
f7f3c9a
attribution
stephenkirk Feb 24, 2026
0da78ca
remove gripes
stephenkirk Feb 24, 2026
db206b4
Seltzer Bean changes
V-rtualized Feb 24, 2026
1260ffd
Merge pull request #362 from Balatro-Multiplayer/sandbox/v3-rebased
stephenkirk Feb 24, 2026
fb8a657
refactor ruleset bans/reworks data handling
Toneblock Feb 25, 2026
5b47cc0
oops
Toneblock Feb 25, 2026
107950e
Fixed Standard Ranked not being set as starting ruleset in UI properly
V-rtualized Feb 27, 2026
dc1f678
Added joker display compat with reworked standard jokers
V-rtualized Feb 27, 2026
04cf2be
Reconnection logic
V-rtualized Feb 27, 2026
19e98a0
fix hide_content bug with challenges (oops)
Toneblock Feb 27, 2026
37ccb94
last minute bugfixes
Toneblock Feb 27, 2026
a7623fb
vantablack + disable sandbox collection flag
Toneblock Feb 27, 2026
3537a0b
Gate Extra Credit hooks on active ruleset instead of defunct lobby co…
stephenkirk Feb 28, 2026
9a013dc
S E L T Z E R
KilledByLava Feb 28, 2026
d485e69
speedlatro
Toneblock Feb 28, 2026
6b87e11
fix(sandbox): ban vanilla hanging chad
stephenkirk Mar 1, 2026
351fee2
fix(sandbox): don't leak cards into collection
stephenkirk Mar 1, 2026
0f1d052
update smods (?)
Toneblock Mar 1, 2026
a8f6e0d
fix(cocktail): filter deck pool to only decks with sticker art
stephenkirk Mar 2, 2026
c18979d
Merge branch 'Balatro-Multiplayer:main' into main
KilledByLava Mar 2, 2026
1e6faa5
Merge pull request #364 from KilledByLava/main
stephenkirk Mar 2, 2026
9cfdacc
Echo Deck
KilledByLava Mar 2, 2026
bbb2862
Load JSON module in thread (#368)
SleepyG11 Mar 2, 2026
4a6c11b
feat: load experimental flags from .env file
stephenkirk Mar 2, 2026
55238fb
fix(sandbox): simplify hoarder ease_dollars hook to avoid eval_card
stephenkirk Mar 2, 2026
5de402d
feat: Echo deck Cocktail sticker + calc support
KilledByLava Mar 2, 2026
f033b59
Update total lives lost message in en-us localization
V-rtualized Mar 3, 2026
a92e862
Merge pull request #363 from Toneblock/main
Toneblock Mar 3, 2026
653008c
Merge branch 'Balatro-Multiplayer:main' into main
KilledByLava Mar 5, 2026
443f4fb
Added guard so save_run hard respects G.F_NO_SAVING
Russolves Mar 7, 2026
5632446
Bump version
V-rtualized Mar 7, 2026
9124954
Merge pull request #371 from Russolves/main
V-rtualized Mar 7, 2026
b14fe15
Updated smods version and release checklist
V-rtualized Mar 7, 2026
8e127f4
Removed match indent on regex
V-rtualized Mar 7, 2026
82c18f7
Merge branch 'Balatro-Multiplayer:main' into main
KilledByLava Mar 8, 2026
422f479
Fix seltzer crash, again
KilledByLava Mar 8, 2026
b32e713
fix ankh on negative interaction
Toneblock Mar 10, 2026
57e553b
remove obsolete fix
Toneblock Mar 10, 2026
d19c321
Merge pull request #372 from KilledByLava/main
V-rtualized Mar 10, 2026
4196d94
Bump version
V-rtualized Mar 10, 2026
451156f
Reconnection handling
V-rtualized Mar 10, 2026
6d56c9b
Fix connection message position when resizing the window
Brawmario Mar 10, 2026
4624679
fix perkeo
Toneblock Mar 11, 2026
48a5e04
Merge pull request #374 from Brawmario/fix/connection-message-when-re…
V-rtualized Mar 11, 2026
c381890
Bump version
V-rtualized Mar 11, 2026
0571fb3
Remove debug
V-rtualized Mar 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Experimental flags — copy to .env and edit as needed
use_new_networking=true
show_sandbox_collection=false
alt_stakes=false
1 change: 1 addition & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ko_fi: virtualized
23 changes: 23 additions & 0 deletions .github/RELEASE_CHECKLIST.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# RELEASE CHECKLIST

## Creating the main ZIP
*(This ensures we keep the DEV tag on the source code and ensures BMM and balatromp.com don't break, since they rely on the "BalatroMultiplayer.zip" file existing for each release)*
1. Download the source code.
2. Uncompress the source code and open `Multiplayer.json` to remove "~DEV" from the version tag.
3. Recompress the source code, ensuring to recomopress from the files instead of the outer folder, and name it exactly "BalatroMultiplayer.zip".
4. Upload `BalatroMultiplayer.zip` with the release.
5. Upload `BalatroMultiplayer.zip` to [balatromp.com's releases page](https://balatromp.com/admin/releases)
- Ensure that the Steamodded version is set to the intended Steamodded version for ranked
- Ensure that the Lovely version is set to the intended Lovely version for ranked
- Ensure that the Branch is set to main
- Ensure the Version matches exactly the version in Multiplayer.json

## Uploading the server files
*(We upload the server files for each OS with every release so that people don't have to go digging for these files)*
- If the server **has not** changed since last update then simply download the `server-win.exe`, `server-macos`, and `server-linux` files from the previous releasee and upload them with the new release.
- If the server **has** changed since last update then run the build script for the server files locally, and upload the `server-win.exe`, `server-macos`, and `server-linux` files created in the `build` folder.

## After release
- Increase the version in the `Multiplayer.json` of main branch to be one patch version above the previous release, and ensure the "~DEV" tag still exists.
- Eg. "0.2.18~DEV" -> "0.2.19~DEV", Or if a higher version like 1.0 was released then it should become "1.0.1~DEV"
- If the recommended Steamodded or Lovely was updated then be sure to update `README.md` and `CONTRIBUTING.md` with the correct versions.
9 changes: 6 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
ref.lua
node_modules
.vscode
.luarc.json
.idea
.lovelyignore
.vs
.DS_Store
.env
Config.lua
123 changes: 123 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# Contributing to Balatro Multiplayer

Thank you for your interest in contributing to Balatro Multiplayer! We're building the definitive multiplayer experience for Balatro. Ready to make poker roguelikes even more unhinged? You've found the right repo.

This little guide will help ensure consistency and quality across the codebase. Follow it and your PRs will merge. Ignore it and maintainers will reject your PR with the enthusiasm of a Neptune card.

Let's build something that would make Jimbo proud.

## Quick Start

**Prerequisites**: Install [Steamodded 1.0.0~BETA-1016c](https://github.com/Steamodded/smods/releases/tag/1.0.0-beta-1016c) and [Lovely Injector](https://github.com/ethangreen-dev/lovely-injector) (>=0.8)

```bash
# 1. Fork on GitHub, then clone
git clone https://github.com/YOUR_USERNAME/BalatroMultiplayer.git
cd BalatroMultiplayer

# 2. Set up remotes and install stylua
git remote add upstream https://github.com/Balatro-Multiplayer/BalatroMultiplayer.git
# Install stylua from: https://github.com/JohnnyMorganz/StyLua

# 3. Ready to develop!
git checkout -b feature/your-feature
# Make changes, then:
stylua .
git commit -m "your changes"
```

## Development Workflow

```bash
# Sync and create branch
git checkout main && git pull upstream main && git push origin main
git checkout -b feature/your-feature

# Develop → Format → Commit → Push → PR
stylua . && git add . && git commit -m "feat: your change"
git push origin feature/your-feature
# Then create PR on GitHub
```

**Verify Setup**: Test that stylua works (`stylua --version`) before starting development.

### Code Formatting

We use [stylua](https://github.com/JohnnyMorganz/StyLua) for consistent code formatting.

**Before submitting a PR**:
```bash
stylua --check .
stylua . # to format all files
```

**IDE/Editor Setup**: Most editors have Lua language support plugins that can format code on save using stylua:
- **VS Code**: [Lua Language Server extension](https://marketplace.visualstudio.com/items?itemName=sumneko.lua) + StyLua
- **JetBrains**: [SumnekoLua](https://plugins.jetbrains.com/plugin/22315-sumnekolua) + StyLua

**File Structure**:
- Keep related functionality in logical directories (`objects/`, `ui/`, `networking/`)
- Use descriptive filenames that indicate purpose
- Group similar objects together (jokers, consumables, etc.)

### Balatro-Specific Patterns

**Mod Integration Pattern**:
* Use standard SMODS patterns
* Refer to existing implementation in objects/ directories for working examples

**Networking Actions**:
```lua
-- Follow the established action pattern
MP.ACTIONS.example_action = function(data)
-- Validate input
if not data or not data.required_field then
return
end

-- Perform action
-- Update game state
-- Send response if needed
end
```

**UI Components**:
| | |
|------|-------------|
| [`ui/_common/`](ui/_common/) | Shared components. Config toggles, spacers, etc. |
| [`ui/utils.lua`](ui/utils.lua) | Home of `MP.UI.UTILS`. Utils for creating UI nodes |
| [`ui/game/`](ui/game/) | UI inside the pvp match |
| [`ui/lobby/`](ui/lobby/) | Lobby UI |
| [`ui/main_menu/`](ui/main_menu/) | Main menu UI |
| [`ui/smods_menu/`](ui/smods_menu/) | SMODS settings menu entry |

**Mod Injection**:
- The entrypoint is in [`core.lua`](core.lua)
- Files/dirs prefixed with `_` are loaded first in [`MP.load_mp_dir`](core.lua#L72)

## Contribution Guidelines

1. **Commits**: Write clear, descriptive commit messages
2. **Testing**: Test your changes thoroughly across different scenarios

## Testing Guidelines

- Test in both single-player and multiplayer environments
- Verify compatibility with supported Balatro / SMods / Lovely versions
- Test with different rulesets and gamemodes
- Include example seeds in PR description when relevant

## Code Review Process

All contributions go through code review. Reviewers will check for:

- Code style compliance
- Functionality correctness
- Performance considerations
- Compatibility with existing features
- Security implications (networking code)

## Questions?

- Check existing [GitHub Issues](https://github.com/Balatro-Multiplayer/BalatroMultiplayer/issues)
- Join the [Discord server](https://discord.gg/balatromp) for discussion
Loading