#⚙・modding-general
1 messages · Page 14 of 1
It will
So will the consumables like planet cards be mostly useless?
How the duck do I center this chips counter, i can't get it
the explaining for printf is so tough
Can someone explain?
from the looks of it i think your chips are "centered" but the background of the text is centered relative to the entire width of the window itself
so maybe find a way of offsetting the background off to the side?
thats just my two cents
unless youre trying to center the chip text to the bg
nonono, the background image is not centered at all
it have only x, y with some scaling for different resolutions
maybe fiddle with the x and y offsets then
designed a few new jokers any ideas for what they should do
names are "suspicious joker" "photocopier" "minimalist joker" and "pastel joker"
im thinking photocopier will give +0.1 xmult per duplicate card in your deck
Photocopier (Uncommon):
All hands in this round will be the same poker hand as first played hand of round
So if you play 5oak as your first hand then if you play high cards you’ll still get the base 5oak scoring
that seems more busted than an uncommon T~T
It could also screw you over
true
but playing a high card as a 5oak with baron or steel cards
stronger uncommons are fine
tbf ig anything with baron is op
yea the more i think about it that does sound pretty unique
any ideas for the other ones?
ooh
what about having it buff diamonds and clubs since theyre the lighter colors of the black and red cards
i like that yeah
oh also
thoughts on my other joker
im planning on making it basically sacraficial dagger except instead of + 2x sell value mult +7x sell value chips
a bit boring
true but it provides chip scaling to a degree that doesnt really exist in the game
wee joker
Bull
compare that to how many xmult jokers there are T~T
you mean scaling?
?
yea
idk
im too tired for this shi T~T
any better ideas for the carnivorous plant card?
I need balance ideas, as soon as you add any mult joker this joker becomes way too overpowered
Could also just cap it
Add excess chips (up to X) from last blind to the first hand of the current round
Even better could scale that with ante. So cap * ante
just to throw out an idea into the ether, something that would be neat is a mod to toggle or disable boss blinds before a run starts. that would let people avoid ones they dont like or make challenge runs where every bossblind is the mark or something

That looks so cursed omg
Jokonda?
Joka lisa
ye old joker
Hello all. Is there a mod out there that makes all cards in the shop negative jokers?
you could probably relatively easily just give yourself like 999 negative tags on a custom challenge
Is that done in the game.lua file?
🤷♀️
I mean with the save editor, you can increase the number of joker slots to a number so large, you can buy every joker you want
with debug mode you can just manually change the edition of every shop joker you want to make negative
Yeah, I already know how to do that in the game.lua file, but I just like the way negative jokers look.
i can't click its done
its not e
like 1.2054e12 its just big numbers that i can't click select
weird floating point error
if you type ante scaling to -1 in save editor that happends
maybe it only truncates positive values
does using mods prevent getting unlocks?
no it shouldn't
steamodded disables acheivments by default, but theres a mod to re-enable them
why does the mod injector flag the windows trojan protector
because it works the same way as a trojan, but instead of injecting something bad it injects steamodded
if it were a virus steamo would have been long banned by now
People would've realized by now yea
Yeah yeah, i'd just prefer to be cautious and ask before I end up in a bad spot
i get it
my balatro isnt opening its like loading 90% then closing ive tried uninstalling and remodding ive done it so many times i cant get it to work can someone help me?
how do I stop windows from flagging it and preventing me from launching it
is it saying its virus in a red window?
its doing a series of things
send ss
???
heyo, does anyone have a direct link to download steamodded? link I found set off virus protection
screenshot
dude, then why the fuck are there 3 named the same fucking thing
waow
I'm glad we've gotten to where this convo started, which is "i know this isn't a virus, how do I download it without windows stopping me from launching it, and then deleting the exe"
.
10, the good one
k
becouse of python thing steamodded is like virus for windows but its not virus
im not sure man he said somthing about windows defender try in task manager or somthing
how do i set up these mods
oh I've already made one like that
evil negative be like
I have lua code for the mod to set Unlucky Crow and Lucky Swallow to be compatible with blueprint/brainstorm and being eternal jokers, but in a challenge where they are supposed to be eternal, they can be sold and Blueprint claims it is incompatible with the jokers. Here's the code that initiates the modded jokers:
--[[SMODS.Joker:new(
name, slug,
config,
spritePos, loc_txt,
rarity, cost, unlocked, discovered, blueprint_compat, eternal_compat
)
]]
--
local jokers = {
unlucky_crow = SMODS.Joker:new(
"Unlucky Crow",
"",
{extra = {x_mult = 1 , x_mult_add = 0.1}},
{},"",
2, 6, true, true, true, true
),
lucky_swallow = SMODS.Joker:new(
"Lucky Swallow",
"",
{extra = {x_mult = 1 , x_mult_add = 0.1}},
{},"",
2, 6, true, true, true, true
)
}
any tips for making them eternal-compatible and blueprint-compatible?
Something like this?
oh seals don't work
even when both enhancers.png in separate mods are named different things and in different subfolders they still overlap weirdly and overwrite each other. is there any way around that or is that a steamodded thing?
like, the two mods specify different file names so thats not it
Fixed
Anybody know if somebody has made a hotkeys/keyboard shortcuts mod yet? I did a cursory search but didn't turn up anything and want to make sure I haven't just missed it.
I'd have to be able to play with 2 hands to speed up some of the menial tasks of playing with hotkeys instead of having to use mouse for nearly everything.
Ah cheers. This is almost exactly the kind of thing I was looking for.
even though they're different names, they might be occupying the same atlas
ty
not sure about the blueprint part, but to me it looks like these just aren't eternal, your blueprint is
How do you know if steammodded already work?
it should have a "mods" button
It doesnt have it tho
so it didnt work
in the feature read all of the mod description, check that first before reporting, might fix itself
sorry, that was rude of me
nah all good you help me thanks for the reply!
can someone help me understand why this effect don't work when i get my voucher?
first one is supposed to add two cards to every pack, and the other adds a pack to every shop.
note, the vouchers themselves are obtainable, game never crashes, the effect just doesn't work
ms paint joker
does using mods stop achievements?
lipographic joker counterpart
Okay why is windows freaking out that Steammodded_injector is a virus? I cant install it
Just click the underlined “run anyway”
Also I don’t think there’s a fix yet for this
Kinda just always will get a false positive due to how it works
ughhhhhhhh might have to scrap the current blind effect because there is no good way to change the text of anything
i can only change jokers via a function that is also used by playing cards without any distinction
and only affecting playing cards would be far too weak
Yeah but there's a mod to get around that
Well you can literally tell the code to enable them again I believe
sadly i dunno coding so i will look into the achievement mod first
thanks a lot actually
Not a problem!
Here's this to speed up your searching
NICE!
okay at least i still have two more blind effects that i can shove into them i guess
Permanent -5 Chips to played cards
Destroy all Consumables, 0 consumable slots this blind
this is so awesome for me
I may look into downloading mods myself but for now I'm a base game Andy. Mainly just waiting for safety tbh
especially i play the game wanting to see A LOT OF Joker interactions but having a 10000 joker limit causes achievement to be closed
ah
also there is this chinese made game tweaking stuff
you might wanna check that out
essentially it changes the basic game stats so yeah,we gonna open the game file with a rar reader like 7z and replace stuff
but it's quite powerful
allows the change of many card data like the amount of joker slots added by negatives,number of upgrades done by each planet cards,even the beginning hands and discards can be easily changed
Sounds like what cheat engine could potentially do
yeah true
but it's already there so yeah,pretty convenient
never figured out how to use cheat engine to change game mechanics sadly
i'm gonna look into that a bit
i made a mod* that lets you select up to 6 cards to play rather than 5, and added these new hands to go with it
i would like to add planet cards for them, but i unfortunately cannot art at the moment
two of a triple should be three pair
three pair is different
yup, between three of a kind and straight
you are clinically insane
i did this all in two hours, who's clinically insane now?
now combine it with six suits
oh is spectrum 5 different suits
yeah
yeah i think i'm good for now
now i need to make it an actual mod that people can download and play and stuff
you're still clinically insane
i'm taking that as a compliment
do we have enough stars with cool names to fit those hands even?
or maybe use constellations?
tbh i think we're good
#1216754656617693255 is a mod that gives a joker that enables 6 card hands, imo you should try and work together to either integrate it into his mod or just make them both work together
locking them behind a joker is excessive
also one is a steamodded mod one is a balamod mod
oh shit this is real now
hi! id be down to help make art for your mod if you want
can you make one for seven
10 card hands soontm?
full duplex 
hey, working on a mod to add a bunch of new tarot cards using center hook, but on disabling my mod two "ghost tarots" are left behind? they don't count towards collection number and don't have any text (see screen). on re-enabling i can figure out which ones they're supposed to be but the on_disable removeTarot call is literally the same for all four tarots implemented so far.
all the ids line up and everything but these ghost tarots are duplicated every time i disable and re-enable and i am losing my mind trying to figure out whats going on
@stone brook center hook is your thing i think
Alright, time to ask. Should I give Beta versions of existing decks a custom back?
The custom Checkered deck if I do make one
where do you download balatro mods
yeah, the differentiation is always nice
wonder if adding a version number to the deck back would be useful
along with custom back
I'm already gonna have the verison on the name so it's just custom back or not
And it seems like it's a positive to have custom back so i'll add it
k
the game doesn't have an API per say, most mods are done by hooking into the game's existing functions or by modifying the game's global variables. Steamodded has some apis for basic stuff like creating jokers and sprites though I believe, you can look its example mods for that. Also, Balamod has support for custom api extensions, with ones existing for doing similar things as well.
not currently, but the game's executable can opened as a zip archive, allowing you to read the source code directly in the meantime.
Oh, ok
Where can I get steammodded?
This is the first time that I've seen one of my own jokers in the shop naturally
Sadly I still can't get it to work
😢
here's the releases on github https://github.com/Steamopollys/Steamodded/releases
it also has a thread in the modding forum https://discord.com/channels/1116389027176787968/1209564621644505158
it will almost definitely set of any antiviruses you have, if you want to avoid that you can try installing it with the lovely injector (a dll style injector), which I believe there's a guide for somewhere in the modding forum too.
So how do you set up mods
check out the thread and linked github
painted deck resprite
W
based actually
had to use balatro colors so it isnt quite perfect
Its a w
you know, now that (to my knowledge) level 0 hands are essentially impossible to achieve, with the nerf to The Arm, i wonder if a deck that involves level 0 hands could be interesting...
you'd need like 0.5x base blind size or smth
Would be so free if it had 0.5x base blind
U get 1 planet card for your hand and its just like base game but easier
you'd have just 1 hand boosted tho
the rest would still suck
and you might roll neptune mercury mars from a booster pack or smth
Theres always more booster packs
All it takes is one
Not to mention if you happen to roll black hole :D
speaking of black hole
it doesnt trigger any "number of planet cards used" jokers
even if you get it from a celestial pack
its so bullshit
I think it counts as a spectral card
Soul probably doesn't trigger fortune teller
So in the game files it would be tagged as spectral, and those jokers would only act on cards tagged planet
yeah black hole is a spectral lol
it needs to be, for balancing reasons
imagine tarot/planet spawning jokers being able to spawn soul/black hole... and the fool could copy them, too
magic deck legendaries: buy find one, get two free
and once you have it in your consumables you could perkeo it
can random spectral things spawn black hole and soul?
i'd imagine they can but i've never seen it myself lol
no
I will note that Black Hole would need changed to account for Observatory
(Assuming you want it to count as a planet card)
i think counting black hole as a planet card has a really great description about it:
A Bad Idea
do you have other tarots that do get removed properly?
also sry i dont read this chat very often, so if you do encounter an issue with center hook, dming me is your best option
or opening an issue on the github
oh that would actually be super cool! i’ll work on making it a distributable mod first, then we can talk about that
been a while but I wanted to check in
has anyone modded anything to be able to disable jokers in the pool
I'm really losing steam after about 50 hours of fun because im so damn tired of seeing the same 10 middling common jokers over and over and over
if I could either mod some of the jokers off (I dont want to turn even most of them off, there's just about 10-15 im tired of), or allow more card slots to buy without the voucher that would be so much more fun lol
oh sure sure sure
they can! i've had it happen
they're spectral cards, and they appear in spectral packs, so they're in that pool, it just so happens that they also spawn in Arcana packs (for the soul) and Celestial packs (for Black Hole)
oh shit--so Perkeo CAN perform a ritual to summon his 4 friends!!!!
hypothetically yes
i think they meant from things like 6th sense and ghost deck
but for it to actually happen is EXTREMELY low odds
I think they can appear from those still, since they're still spectral cards, they just have a uniquely low spawn chance
idk i feel like if it was possible it would have beendocumented by now
Soul can only spawn in packs @strong swift @spice spear
yeah thats what i was thinking
huh, alright then
i’ve seen both black hole and soul in spectral packs before
They can both spawn in packs… just not from any spectral generators or in the shop
did someone put a holo charizard in the game yet
The challenge I have them in is coded so that they’re eternal. I’m looking for tips as to how to make sure they are compatible with Blueprint and becoming eternal.
no, but you just gave me a really cursed idea of a parody pokemon card joker that evolves the more antes you keep it for
i need to make charizard card
hey guys, for those of you who make customized jokers, what software do you use to make the drawings? any recommendations?
I use Aseprite, as do a lot of others
Thanks! If you don't mind me asking, is there a way for us to create 1x/2x version at the same time? like which one should we go for first and then convert to the next, or do we have to do them separately?
is there any sort of "best of" list to see what might be worth trying out?
Make the 1x first, you can upscale when exporting
(because the 2x is literally just the 1x upscaled 100% with nearest neighbor)
i use gimp xdd
good to know! thanks
will check that out, thanks 
photopea is what i use, as it's free and in-browser
but aseprite is a much better option lol
photopea's essentially just photoshop: Browser Edition, so it's great for photoshop stuff! but not really pixel art
it's nice if you know photoshop and don't wanna learn a new program though
just wanted to bump this because I was curious and I dont really know how the modding tab on discord works, still trying to figure out whats what and what mods exist in general lol
seems kinda weak tbh
1x into 2x for me, aseprite has resize functionality
Does it matter if I use Steamodded or Balamod? Or no big difference?
some mods are only available on some modloaders, but there's an effort towards unifying them
ahhhh ok ok thanks!
I hate how you have to directly edit the straight- and pair-detection functions for this, complete incompatibility with any other mods touching it.
you mean you have to change the code in those functions to check when the player has that Joker?
8ball but worse question mark
Yeah. If you play like a 5 5 Wild, the mod says it's a triple but the base game says it's a pair. So if you listen to the base game as well you get a full house with those three. So you have to ignore the base game, but that's also where the other mods touching that function would go. So there's no cross-compatibility.
way too high for how easy it is to play those
I disagree. It's like Torn Joker but you can discard 2 more cards. But you don't need to fish for pairs or high card, so the discards don't synergise with it.
it's a common
So's torn joker.
torn joker has a downside to it, this is strictly beneficial
the joker for 3 of a kind gives +12 mult
Torn joker doesn't have a downside. It won't trigger if you play 4/5 cards, but this won't trigger if you play three-of-a-kind (which torn joker will).
I think you're wrong, but I'm not going to sit here and argue it with you
that's seriously broken
25 dollars is a run-changing amount
that should be like, 3 dollars
five would be pushing it


not 3, faceless is already 5 and covers 3 ranks
When I had the same idea (apparently a common one) I made it $15
hey, can someone quickly test whether playing a flush house activates spare trousers?
it does
ok, thanks
new effect
Is it possible to treat card as different ranks and change the card draw order?
Can someone help me with steamodded joker? I added joker but it uses default sprite instead of custom one for some reason. I can't find where should I indicate which sprite joker uses
ho ho ho (this is too large)
also can't figure out what is "slug" supposed to do
not much of a modder myself (at least for balatro)
but I know all joker sprites are on a singular sprite sheet
you put the sprite there and use code to point it towards the correct part of the sheet
k so i'm almost almost done with actually making thisinto a mod, i'm just getting one weird error that only happens like half of the time for some reason
because it's taking the sprite with position {x = 0, y = 0} in the file "Jokers.png"
Slug defines it as j_[slug] in a couple of places (in adding sprites and .calculate, at least). And define sprite with that value to set the spritesheet, along with spritePos of 0/0 or whatever (used if you're putting multiple jokers on the same spritesheet)
no no, now it's working correctly, it is still taking path from the mod's directory
jokers.png is my own file
How do I use it in .calculate in my case?
71x95 is only one joker
I'm saying that code on screenshot works for me
it actually loads the correct sprite
but I was (and still is) confused a little about slug thing
ohhhh okay
the slug is the shortened version of the joker object
the mod automatically adds "j_" in front of it
apologies for misunderstanding the question
ohhhhhhhhhh
I guess I can't make multiple jokers (with different functionality) on the same sprite then?
because they all will relate to the same slug?
You absolutely can. Duplicate the Sprite:new line but change the slug and it works.
Then you can change the spritePos x/y in its Joker:new to get different places on the spritesheet, or don't if you want to use the literal same sprite for the different jokers.
you're the best, thank you very much!
oops
Turns out x = 1 isn't one card to the right
Wait, why does your Sprite:new line give height/width of 426/285?
That's what's used for x/y calculations, it should be 71/95 for a joker spritesheet.
because it's size of my spritesheet
Yeah, it's per sprite on the sheet, not the sheet's dimensions itself.
Because that's what you get when you start half-way through the spritesheet, I guess?
yeah
I suppose there's no hard rule about how to use it. You could set x to 1/6 to get the cassette I guess??
The formula would be something like 1 / 6 * position in spritesheet - 1 I think? So yeah?
yep
thank you again, saving my day
Those do look really nice.
it is best if you keep it at 71x95 and change the pos values to a whole number
I made my spritesheet ten times bigger than regular card now, so the numbers won't be so scuffed (x=0.1, x=0.2, x=0.3 etc)
You don't need to touch the spritesheet, just set the Sprite:new values to 71/95 and the coordinates to whole numbers.
Besides, 0.1 is still a scuffed number to a computer, since it's not very binary-compatible.
Oh that works too! I thought sprite size was referring to size of the whole thing, not the target
am I doing this correctly? Just in case
seems to work correctly

Yeah, that's the way I've done it. Easier to plug coordinates into, and no risk of floating-point error.
what should this do
+0.01 Mult for every pixel on the joker art that is not #FFFFFF
+0.01 Mult for every pixel on the joker art that is #4f6367
Anyone know why this might cause a crash whenever a round finishes with a red seal left in hand?
local get_end_of_round_effectref = Card.get_end_of_round_effect
function Card:get_end_of_round_effect(context)
get_end_of_round_effectref(self, context)
end
Card:get_end_of_round_effect(context) arguments should be self, context
with colon notation, nope
makes aces worth 0, +0.1 xmult for every ace played?
ty!
i think its fine, half joker is 20 but also wouldnt work with splash builds, when this is 15 and can
Wouldnt this be super OP with the vouchers that already do that?
is the bottom right one a final boss blind?
id probably call it 'noir silence' or 'midnight' or the like as many bosses have nonstandard color names
pretty cool tho, i like the effect
i'm referencing The Black Silence from Library of Ruina
though- that'd be cool methinks
ooo I wasnt familiar ;o
mm yea i'm gonna change it to Noir Silence
the 3 people that also play it can probably get the reference
What do you guys think
is there a way to make my joker use 4 slots on the spritesheet(?)
i want that card to be a joker
noir is just french for black. how about onyx silence? will also fit with amber acorn as it's a gem
meh. strays too far from main i think
i'll stick to noir for now
and for the insect
Where is located the code of The Serpent boss ? Apparently it's not in blind.lua
G.FUNCS.draw_from_deck_to_hand in functions\state_events.lua
Ah thanks
?
How can I add another descritption (like this description of the lucky card) ?
teehee
anyone? T~T
to my knowledge i'm not sure if anyone's even got legendary joker/hologram joker visual stuff working yet (As in, making a joker display 2 sprites, one of which is floating)--in my opinion, this seems like a much more difficult thing to do
so i doubt folks are ignoring you; more so a "we don't know (at least yet)" situation
The downside of Stuntman isn’t copied
what do you think about this effect? (I don't know all the effects in Balatro tbh, so maybe this or similar one already exists)
it is not
-2 from Stuntman + -4 from blind
this is a pretty neat effect! i don't believe any other jokers use anything like this
the closest is like. Card Sharp? but that's for a hand type you've already played
effect concepts for racist joker?
its too late to turn back its already on the spritesheet
does it need higher amount of mult? I was thinking that this can situation with same cards appear very rarely in early game and this mult kinda sucks for mid-late game
resize with aseprite
me pretending i know how to do that
hey so can we totally not
The WHAT joker?
the racist joker duh
so whats the joke
is the joke that it's funny because its based off a historical racist empire that built itself off the backs of black and brown people
because i dont think thats a really good punchline
wut
the joke is i put a confederate flag on the hat T~T
just don't do that
I LEAVE FOR FIVE MINUTES AND THERE'S RACISM NOW
stop?
yeah, the flag of a historically racist empire that built itself off the backs of black and brown people?
its easy
YUP
yeah please don't????
thats what im saying T~T

yeah, dont do that
very much don't
we get that it's a joke, but it's not a great one. it's very offensive and i would recommend not making this joker.
theres people here who's had their ancestors slaughtered by people waving this flag
Ngl, fitting with the name “not John Wilkes Booth”, yknow, the guy who killed the president who ended the civil war and all
im confused do you think im defending the confederates because im not T~T
We’re just saying not to make a racist joker
someone was named abraham lincoln and i was making a joke but yea in retrospect probably not the best name for this one--
that doesn't matter. just dont use that imagery in fucking balatro
listen, i dont think you personally support it, but you have to understand when you post things with this flag its like posting things with the nazi flag
man remember when ragebait used to Try
anyways no surprise this is the caliber of person that can't figure out how to resize an image lol
Could’ve been worse for the racist joker art
im not ragebaiting i didnt think it would be taken this seriously
honestly
im sorry
going forward just learn that its a very sensitive flag
people pls stop
like
stop discussing
it's not going anywhere it just floods the chat
Surprised it only took a month for this to happen
honestly just a stupid edgy joke ill take it out my bad
i figured as such, just be careful in the future
Don’t be the
and make something bad
honestly i am a little confused i wanna make it clear that if anything i was calling out the flag as racist because people still dont seem to get that
Okay enough about the flag
kk was not the right letter choice oml T~T
ill leave it at this but, just dont show the flag as racist, if you want people to know its racist, just dont use it
Is it a good joker?
which turns hearts into wild cards! does that sound fine as uncommon, or am i overestimating/underestimating
jonker?
yes a jonkler!!
unfortunately i'm not jank enough...... you out-jank me......
hearts into wilds sounds like its in the same realm as smeared joker
but anyways it's the effect for my new joker: "Joker (from Persona 5)"
just like when mind mage disabled credit card and negative jokers for some reason!

where can I see the code from other cards to reference them?
you can open up balatro.exe with any zip program
which file exactly
it should be in the .exe's card.lua
that's where most of the coding for jokers are going to be
Balatro.exe, and then the various .luas you'll see right there
i think joker stuff is in... card.lua or game.lua???
correct me if i'm wrong on that
its card.lua
yep it's card.lua
ty!
np
if you need descriptions of jokers and to see how they format text you can look in localization/en-us
oh hey black
did you see my new legendary jonkler
i think i decided on takin the half measure and just making this 12 mult
honestly i do feel like.
kind of weird about this one?
because isn't it just worse than Half Joker
i guess alongside splash (or just playing more cards to discard them)
but half joker also works with three-of-a-kind, and it's giving more mult for high card/pair
actually
hang on, i have a BETTER critique
lemme get out my Handy Dandy Screenshot
isn't this just objectively better than jolly
in every single way
...wait nevermind
it doesn't say contains it says
Is there a joker that knows that if you've played the same card before?
look i'm smart. i swear.
exactly pair and high pair
yeah i realized that the instant i posted the screenshot
critique retracted
bando foolishness proven
hey guys, I've been reading the code lately, but how do we put our custom card back into the game without changing enhancer.png?
card back as in like for decks?
yes
to my knowledge decks rn still require you to change that
we have ways to get around it for stuff like jokers at least, but not decks yet
yeah but that makes every deck mod imcombatible I think
the pillar boss blind knows what cards youve played this ante maybe you can use that?
yeah!
ooooh yes ty
we're early on in the modding stages for this game, so it's kinda just an issue we deal with
for me, what i've done is i make all my enhancers.png mods compatible with each other
hmmm
so Dice Deck, Pact Deck, and Baba Decks all include the graphics for the others inside their enhancers.png edit ((well dice and pact don't include baba, as it would replace textures, but baba does include them)
YEAH IT'S GENUINELY INSANE TO ME WE DON'T HAVE THAT YET
it's not a huge deal but MAN
i wanna see a FLOATING HEAD
might have to write an entirely new function for loading sprite... maybe it's worth doing
well, jokers have a field for soul_pos
if you're able to make it so i no longer have to edit enhancers.png i will be grateful eternally
i mean id imagine you would have to point to the joker soul like you point to as the soul in question and then assign the soul_pos accordingly
oh, for deck backs
lmao
reading comprehension
okay to be fair a function for soul joker boys would be great too
i wanna see fortuna and stancyzk floatin' at the function
so currently they are using x-y pairs where x is column index and y is row index right?
i reformatted stancyzk too
i believe that's correct, yes
wait is there an accent mark above his name on the plate but not his joker name
its literally canio's name
ok let's see what I can do 
i am not sure if the font they use supports the accented n
yeah!!! Canio's the Pagliacci guy!!!
have you tried?
authentically polish,,,
my polish friend would garrote me if i allowed inauthentic polish clowns in my general area
hell yes

the power of me BULLYING LYMAN asking you to try!!!!
ye
hmm. in your case, you'd want card played this round, not this ante, right
oh shit that's true, you did
sorry Lyman, officially a bad mod now
that's how the rules are
yeah
its ok i got chewed out by my polish friend
....i don't think card.ability.played_this_round would work, but part of me wonders if it does
actually wait, even if it did i dunno if that'd help you here
since you don't care about the specific cards being played, but the number of them, right
number + type
like if you play spade 4 and then club 4 in different hand it won't count
yes i think i did
if you play spade 4 and then another spade 4 in different hand then it works
or maybe even in the same hand
i thought it was this:
play a 5-card hand. this hand gets +0 mult, but now you have played 5 cards, so that's +3 for each
now, next hand gets +15 mult. play a 5-card hand, +3 for each
third hand gets +30 mult
now that i know your intention.... i think this joker's really weak actually lmao
doesn't do anything in most decks before tarots (except for checkered deck), and +3 mult is definitely a pretty low amount. it will EVENTUALLY be able to pop off a lot though, so you probably don't want it to be too high considering it's just a common
trying to think of how i'd fix this wording to ease that confusion, and i'm struggling a bit lol. i definitely suggest including "of the same rank and suit" in there
yeah don't get me wrong, i understand the mechanic now
the wording of the joker just didn't make that clear
did that image just in case
i thought it was essentially a flat mult joker that like. scaled up as you went through hands
balance-wise, i do think i'd at least suggest it being +4, so it's equivalent to the other similar jokers (Smiley Face, Even Steven, Suit Jokers, etc.)
it probably should be higher but i dunno how much higher is the right choice lol
I have a joker that gives a bonus if the hand is exactly the same as the previous round, maybe you could use part of this Firch?
-- Save previous cards
if context.cardarea == G.play and not context.repetition then
table.insert(self.ability.extra.current_cards, context.other_card.base.id)
end
-- Calculate chip score
if context.scored_chips then
self.ability.extra.chips = context.scored_chips
end
-- Apply chips if previous cards are the same as the current cards
if SMODS.end_calculate_context(context) then
if tables_equal(self.ability.extra.prev_cards, self.ability.extra.current_cards) then
self.ability.extra.prev_cards = tables_copy(self.ability.extra.current_cards)
self.ability.extra.current_cards = {}
return {
message = localize { type = 'variable', key = 'a_chips', vars = { self.ability.extra.chips } },
chip_mod = self.ability.extra.chips
}
else
self.ability.extra.prev_cards = tables_copy(self.ability.extra.current_cards)
self.ability.extra.current_cards = {}
end
end
It basically saves each played card to a table, and then checks if this table is the same as the previous hands table
I feel a little bit overwhelmed 😅
Do I understand correctly that hand-related joker abilities go into .calculate?
My bad lmao, I'll explain further
I feel like I need some kind of small example, because steamodded's examplemod is not enough for me
at least how i have it implemented, generally speaking almost all your actual joker code is going to be under function Card:calculate_joker(context)
and then depending on what your joker does, they're going to be under specific contexts.
Also wait, isn't there a thing where I can connect vanilla game's files to use them as library?
not sure what you mean by that
I never modded in Lua before and I don't know how it works here, but I did some modding for Terraria and Duck Game (both are on c#), and you can connect tmodloader and dg's source code to Visual Studio so it will show game's functions and such stuff
ah, im not sure how one would do that but in theory you could extract all the lua files and implement that as a makeshift workshop
when i started my mod i just mostly vulture'd off a lot of https://github.com/iJohnMaged/multi-jokers/blob/main/MultiJokers.lua because it was formatted in the easiest way on the mods that were out at the time
(i swear i didnt mean to end up recreating math homework a week later independantly of reading this)
Have u made any joker before 🤔
nope! I did set-up for the mod just today
i ought to set up a basic mult joker template
Ah okay, I'll give you a more simple example
For most basic jokers all your code will be in the .calculate function. In here you have access to the context variable, which goes about the current step that the calculation is in. An example would be context.discard which triggers whenever a card gets discarded, or context.end_of_round that triggers at the end of the round
If you want to do something after a hand has been played (like apply mult to the hand as a whole), you'd do it as follows:
SMODS.Jokers.j_your_joker = function(self, context)
-- Apply mult
if SMODS.end_calculate_context(context) then
return {
message = localize {
type = 'variable',
key = 'a_mult',
vars = { self.ability.mult }
},
mult_mod = self.ability.mult,
card = self
}
end
end
Where message is the little message that shows up underneath the joker card, mult_mod is how much mult your joker will apply and card is the card that will do the shake animation whenever it gets triggered
Does that still make sense 🤔
Yes, thank you very much! I think I need to try to tinker around it by myself to understand how things work
Is there an easy way to get myself a specific card?
(to debug)
Also, where can I find a list of contexts?
It gets a lot easier with time, I was struggling a lot with my first few jokers as well
To get an individual card you could use context.individual and not context.repition, which triggers for every singular card that is inside the played hand (but not repeated). To access the other card, you would use context.other_card
And I don't think theres a specific list of contexts anywhere, I just recommend looking at what other mods use to get familiar with it
slight rework
my work flow is usually thinking about what the closest joker to what i want to do is and look that up in the games good
I mean what do I do to acquire joker so I can test it?
its a good way of finding out what effects go under what contexts
youre going to want to install the debugmode mod
It is installed
Is there a hotkey for this?
assuming youre in debug mode
go to your collection
hover over the joker
and press 3
oh yeah that worked
ty
Can you use balamod and steamodded together?
no guarantees that it works
Some people have tried, i think they’re trying to merge the two but atm i don’t think it does
Alright, just curious
oh wow! that's quite good
kneejerk brain reaction is "maybe 3 levels since orbital is 3 and that's still really strong, despite being random"
but there's no real mathematic backing on that; just vibes
i like it, though!
my only problem is figuring out how to upgrade multiple times
I'm fooling around with joker abilities, this makes the message about +mult appear correctly, but doesn't actually add any mult, why?
mult_mod (as well as chip_mod and Xmult_mod) is only for SMODS.end_calculate_context(context). If you want to return mult for other contexts you need to use mult (and chips and x_mult)
iirc
now it works fine, ty!
gotta ask all the stupid questions so later this will be the easiest part of making an actual joker 
so true
how do I put variables from here to localization?
You mean so that they show up in the joker description?
yep
I was copying something from vanilla jokers earlier but got things like +ERROR
I use that now but this doesn't seem correct
(this works tho)
Hello I have a question for y'all, if I wanted to make a mod to change the names of stuff in the game, how would I go about that
probably just edit the localization files
chat i have a conundrum
i wish to upgrade a hand multiple times and i have half solutions for both ends
so the way space joker does it is just this simple return return { card = self, level_up = true, message = localize('k_level_up_ex') }
but i cant seem to figure out how to properly have this happen 4 times
burnt joker however uses the level_up_hand function as seen here
level_up_hand(context.blueprint_card or self, text, nil, 1)
which, when using this method, i can choose to level it up more than once, but the buff doesn't apply for the hand thats played (like how space joker upgrades your hand as its being played, not afterwards)
so right now the snippet i have is elseif context.before then if self.ability.name == 'Feste' then level_up_hand(self, context.scoring_name, true, 4) return { card = self, message = localize('k_level_up_ex') } end
any suggestions to make it apply the mult/chip bonus properly here?
i think level_up_hand itself happens after the hand is calculated, which is why its used with burnt joker, as the planet cards all use the same function
and if thats the case is there a way i can use event manager to... not?
oh
nevermind

just had to make it not instant
thanks for being my rubber duck chat
🦆
seance is no more 
Is it possible to check if list contains something?
what are you trying to do?
I'm creating a list of cards, and I need to check if specific card is in that list
bonus question: is there like an initialize context? for jokers first appearance in your active slot
what i'd do is first delcare a local variable
local HasYourCard = false
iterate through the list in some type of for loop
have it set the local variable to true if it iterates on a card that matches your specific card
then at the end, check if HasYourCard is false, and if it is, return nil, and then the rest is your code that you want to have happen
like when you pick it up? that's actually not under initialize jokers but its own thing in add_to_deck
IT'S JUST A TABLE NOW
this is really the more accurate version of the joker, because you always pick it up and then proceed to score 0 straight flushes for the rest of the run
here's a not quite exact implementation, this instead checks if your hand is only sixes or gold cards, and if it isn't it returns false, but you can do some basic logic engineering here
local onlySixes = true
for k, v in ipairs(context.full_hand) do
onlySixes = onlySixes and (v:get_id() == 6 or v.ability.name == 'Gold Card')
end
if not onlySixes then
return nil
end
return {
message = localize { type = 'variable', key = 'a_xmult', vars = { self.ability.extra.x_mult } },
Xmult_mod = self.ability.extra.x_mult
}
end```
what is the context for played cards?
Every played card individually is context.individual, the played cards as a whole is SMODS.end_calculate_context(context)
for some reason context.individual somehow includes cards in hand?
oh oops
if context.individual and context.cardarea == G.play then
is the one youre looking for
🫡
Where do I find them
Thanks
I'm still trying to figure out this one btw
it'll be something like this
I hope that it doesn't overwrite itself emptying the list
Right now you're only adding the id of the card to the list, which is the same across suits. You'd probably want to do context.other_card.base.id .. context.other_card.base.suit
fixed that
As for iterating over the played cards, it'd be
for k, v in pairs(self.ability.card_list) do
if v == context.other_card.base.id .. context.other_card.base.suit then
-- do something
end
end
wait hold on
pairs has nothing to do with poker pairs, right? Is it to addres both id and suit?
why is there two of them?
two smartest kids in class get different answers
who added a second scholar while i wasnt looking
Pairs is just a lua function
Has nothing to do with the game
ok this one just looks cursed
he didnt graduate 😔
Okay, it doesn't crash, but I think my first initialization of list keeps overwriting itself
because at first I accidentaly added cards to the list and then did a loop to check if it's in the list (and it always gave me +10 mult), I fixed that by rearranging and it doesn't trigger mult at all now
I think the list checking is correct tho
SMODS.Jokers.j_oonga.calculate = function(self, context)
self.ability.mult = 10;
self.ability.card_list = {};
if context.individual and context.cardarea == G.play then
for k, v in pairs(self.ability.card_list) do
if v == context.other_card.base.id .. context.other_card.base.suit then
return {
message = localize {
type = 'variable',
key = 'a_mult',
vars = { self.ability.mult }
},
mult = self.ability.mult,
card = self
}
end
end
table.insert(self.ability.card_list, context.other_card.base.id .. context.other_card.base.suit)
end
end```
I suspect that self.ability.card_list = {}; is bad
You should initialize the list (and all other joker variables like mult) along with the joker before u do joker:register(). This is how i've defined mine
printerJoker = {
ability_name = "MMC The Printer",
slug = "mmc_printer",
ability = { extra = { hand = {} } },
rarity = 3,
cost = 9,
unlocked = true,
discovered = true,
blueprint_compat = false,
eternal_compat = true
}
And for registering I do this, instead of value you'd do the printerJoker in this case, but I have a big list instead
local joker = SMODS.Joker:new(value.ability_name, value.slug, value.ability, { x = 0, y = 0 }, locs[key],
value.rarity, value.cost, value.unlocked, value.discovered, value.blueprint_compat, value.eternal_compat)
joker:register()
Is it the ability that lets me do this?
I think so yea
And to reset the hand at the end of the round, you'd use if context.end_of_round and not context.individual and not context.repetition then
YAYY IT WORKED
ancient joker's design is so cool
and suddenly it doesn't
it is weird that it tells that self.ability.card_list is a nil value, I initialize it right here
(I created new save/profile to test)
wait what the fuck. i thought you were doing a bit here but wasn't sure, then just checked in my jokers.png.... there's two scholars
yeah what happened there
maybe at one point localthunk had a diff joker there, and instead of having a blank space once it was removed, put scholar there to fill the space??? 🤷♀️
is there a list of mods or a modpack for steamodded?

awesome thank you!
to me it looks like the card_list isn't correctly constructed, but I'm not an expert in Lua
i.e. you want a key-value pair (dictionary) and have given it a value (array)
I guess this is the best place to ask. I was looking into how the polychrome (and holo) shaders worked, wanting to replicate them.
(Going to thread this as otherwise this message is going to be very tall and I don't want to be that disruptive.)
I'm not sure about why it says that it's empty, but you can initialize card_list as {} and it will work fine (that's what I do as well). You should also move the context.end_of_round outside of the if context.individual... area I think
If you wanna send your whole code file over I can take a look at it and see if I can find anything
oh yes it was {} without zero before, I added it just before taking the screenshot oops
I think I'll create repository then
for now here's the code
yeah that's an empty whatever type which has no keys or values (its not nil, just empty, so the loop never accesses the innards)
the error says it is nil tho
yeah and like I said, I'm not a Lua expert.
I think I know whats wrong
The problem is that you're defining card_list in ability, when it should be defined in a subtable of ability called extra
I'm not entirely sure why it is that way, but I think you can only define mult in ability (and maybe chips), everything else goes in extra
So this works I believe @rare shell
ability = { mult = 10, extra = { card_list = { } } },
let me check if that works, one sec
It does!!
🥳
I'm more surprised that it worked before for some reason
Might have been a weird question, but I just dug into SMOD's code and realized this:
for _i, sprite in ipairs(SMODS.Sprites) do
sendDebugMessage(sprite.name)
sendDebugMessage(joker_obj.key)
if sprite.name == joker_obj.key then
joker_obj.atlas = sprite.name
end
end
so this is the only difference between loading joker and loading deck
why don't we have something like this for deck sprite
(i.e. card backs)
As someone who's been looking into this kind of functionality for the past couple days for my own api, it's because it doesn't quite work the same way, leading to bugs in the deck selection screen due to the game relying on dynamically changing the sprite position when switching deck (and not resetting the card sprites). the way I've been looking at working around this is by appending backs to the existing atlas at runtime using love2d's canvas feature, in case anyone's interested.
could you elaborate on that? I think I get that it doesn't work, probably because they put loading card back function together with enhancers; What is the work-around you found? does that allow us put customized card back in single files?
as far as I've gathered, the deck selection screen doesn't actually change the cards being displayed when switching deck options, instead just changing the sprite position (which is stored as a reference) creating the illusion that it's a different deck. The workaround I've devised is a bit of a hack where I just create a new enhancers atlas when the game starts which is the base game's Enhancers.png with any additionally provided sprite atlases glued to the bottom. (this does allow card backs defined in single files)
how would you check the users deck to see if they have 2 more more of a certain card?
is this gluing dynamic? or we just edit enhancers.png?
it's dynamic yes, the aim is to avoid needing to edit enhancers.png so multiple mods can be compatible with eachother..
That's awesome work!! Would I be able to follow the convention you made? Or is this still WIP?
Collectors Coin Joker
Sure, The main issue it has at the moment is it only being compatible with itself so it might need to have a way of using the current version of the atlas loaded in game instead of the file itself, which creates another set of issues with figuring out the sprite positions, since they're dynamic.
Do you remember which part of the code correspond to this hacky card selection the OG game did? Maybe I can look into alternatives of overwriting some of those functions with additional statement that handles extra sprites
it's not exactly in one place, it might be possible to fix it by injecting some additional calls to set_sprites in the UI functions for the deck selection UI, I haven't really tested it as I'm happy with the current solution I'm working on.
that is expected, they're false positives. if you still don't want to run it you could look into using lovely to install it instead (a dll style injector), and I believe there's a tutorial for that in the modding forum.
The steammodded injector works by doing the same kinds of things that trojans do
i mean the virus scanners just call it a trojan because hypothetically it acts the same way even though its not malicious. the program injects itself into balatro the same way a trojan injects itself into your pc
but first of all the code is open source so whats happenening can be viewed by anyone, secondly if a trojan would end up posted on github with intent of hacking into peoples computers github takes the page down if need be
Hey, trying to fiddle with the sound files on this game to customize a few of them personally, y'know the sound for the balancing done with the Plasma deck? Yeah, trying to dig through the files to find which sound uses it, but I can't find it, anyone know?
looking at the code, it appears to be called "gong"
Cool, found it now, thanks!
Sound effect mods are going to be fucking hellish
it also looks like it plays it twice with one of them pitch shifted to play a chord with them, very odd
Bonjour savez vous quand la date du patch pour la langue en français sur Nintendo switch sortira ? Merci pour votre réponse 😀
no info yet as far as I know
I just realized my jokers never appear during a run lmao. They appear in the collection, I can spawn them using debug mode and they work fine but it looks like they can't be randomly generated.
you probably didn't add them to the proper pools
no mod to calculate points before playing a hand currently? just the external tools?
there's a joker that does that in this mod: https://discord.com/channels/1116389027176787968/1216754656617693255 but other than that, it's all external tools afaik
the joker in this mod isn't completely accurate, though
too bad, feels like a bit of an oversight with the game
like are you not supposed to know much your hand scores for
yes!
it's seemingly an intentional part of the game design seeing as there's a lot of chance-based effects
yeah but you're left doing tedious math outside of those scenarios
it's not actually all that bad in most cases and I rarely feel the need to actually calculate stuff
i'd say it's better to give your players options; if they want to know, let them check it
sucks to lose a run because you couldn't tell what was more valuable after 5-10 layers of chip addition and mulitplication
oh ok
Has anyone else had this problem? When using Better Mouse and Gamepad, when I scroll up to play hand, occasionally the cards sort of "re-sort" and the hand plays twice. This then results in each card I played getting doubled into my deck. Super weird issue that I have no clue what is causing it. Here's the mods I'm using currently:
There was a bug during the demo that caused this issue. Likely it’s a bug in the mod that is causing you to play the hand twice, as the same effect happened
I am curious about the game logs situation. Can gamestates be recreated exactly from the logs? I did some AI on spire logs, but was bottlenecked by their lossy/bad logging.
Trying to get Steamodded to install for mac but whenever I try I end up getting this error message even though I have 7zz, I'm assuming there's some obvious thing I forgot to do bc I'm a dummy
how did you install it
I followed the instructions on the Steamodded github, I'm pretty sure I installed all of the things correctly (python, pip3, Plocate, 7zip and python requests library)
Yeah, forgot to add table.insert(G.P_JOKER_RARITY_POOLS[v.rarity], v). thanks
replace +#1# with +1
that'll just make it print "+1" tho?
what do you want it to do?
Looking into other jokers from localization files, this #1# thing supposed to refer to first configured variable
so this
in your case the number looks like it doesn’t need to be a variable
yeah it doesn't, but I want to figure this out still
you need to add the joker in the function Card.generate_UIBox_ability_table()
like:
loc_vars = {self.ability.extra.money_gain,self.ability.extra.money }
customJoker = true```
In that case money_gain is #1# and money is #2#
ohhh I did loc_vars but I didn't realize I was supposed to do it in different function
My script is kinda outdated so there might me some easier way to do it now
How is the function itself should be approached tho?
Like, what should I write to make it a function
because looking at other functions right now they look a bit different from that
structurally
I know this is wrong, how should I make it?
or should I do something like
Card.Jokers.j_myjoker.generate_UIBox_ability_table = function
booster packs
mine uses that. But it looks like other joker packs do things in slightly different ways 🤔
code example from another joker pack
are all the textures public?
yeah, you can access them by opening balatro.exe in any archiver
7zip/winrar/etc
lol I tried to implement that and now my card boxes are gone
Okay
Now it works
but only for my joker
and any other joker lost their descriptions
I think I know why
This solution feels kinda scuffed, but it works
I guess I can take everything from here and make my own function to save space?
Does Lua require ; symbol at the end of line?
It seems like it doesn't
no shot balatro is made with python
I think that was an /s
Oof
How do I put ability name in function so later it can be used as self.ability_name?
Maybe I can enter it as a string and later from self."ability_name" somehow turn that into self.ability_name?
I keep trying to use values that are used in the game's code but they always appear nil, can someone help me figure out how to refer back to the game's functions?
What does your code look like?
how do I turn string like that into an actual table?
Are you still trying to get the Joker descriptions to work?
yes XD
I made this function
loc_var is supposed to get config things
but I can't just pass something like self.ability.mult because self doesn't exist on the location of function
so I was thinking maybe I can pass that as a string
and then later turn it into an actual table
hence why I asked this question
loc_var is supposed something like ToTable(vars)
I tried load() but with no luck
I think generate_UIBox_ability_table takes self as an argument, but I'm not entirely sure
Yes it takes
I could also just send you the function I use if you want
Yes it takes, but I can't put self. where it doesn't exist
like here for example
This is where function is called
Hmm
you can't pass variable names through a function, only the values
this is the case for most languages i think
Either way this is the function I use, if you just wanna copy that.
yes instead of using Card:generate_UIBox_ability_table() use Card.generate_UIBox_ability_table(self)
Why?
don't you need to reference self in your code?
yes but I think it already gets self inside Card:generate_UIBox_ability_table() without mentioning it
My main thing that I don't want to deal with is having checks for joker type in different places of code
It's just for my own sanity; I see that other people in their mods have checks for the same jokers in entirely different places
I think as long as you inject into a base game function you're gonna need to check for your joker name
Not sure if there is a way to prevent that
But from my experience it hasn't been too bad 👍
Okay, I did it in separate place and without calling the function
something from this hides card's rarity and editions



