#💻・modding-dev
1 messages · Page 298 of 1
but that'd mean id have to recursively put values on each extra table for each joker i want to trigger
thank god i decided to make my mod standalone so i dont have to deal with vanilla joker code
hmmmmmm
im probably just gonna say fuck this and just use card areas being added in calculate_context multiple times

oh, its 2
mhm, i assumed that much, thanks :3
I'm trying to balance this out a bit....
do you guys think when someone reads balatro code out loud and they encounter a variable name thats in all caps they scream it
I think it needs to fall off much more when glass breaks
yes
G !!!! STATES !!!! HAND PLAYED !!!!
FOR I PAIRS IN V_K JONKLER
its pretty... bad
i think it would benefit more from giving XMult instead of mult
have you heard of
local thunk
glass is like wheel of fortune because its 1 in 4 so yeah XMult would be more fair here
Maybe it makes glass give + mult, then the xmult has more to work with
-# its a literal variable, i dont know why
nop
the +mult gets added after the glass cards are all triggered
so it doesnt do anything much :p
look im the type of person that would put profanity in variables when i get angry about something this is surface level
local FUCK = 4
relatable
relatable, i threatened to kill myself in my sticker's code
or just
local a = b
WHAT
Yeah, right now it does not do much
thats ground level shit
yeah, its still in my code rn lmfao
turned out hide_badge hid the info_queue too, i didnt know that so it took me hours to figure out that was the problem
How about this, as glass cards are played and don't break the xMult bonus increases. Then when a card breaks, the accrued xMult is applied.
what about
have yall ever got so desperate you wrote a love letter for your code
so that it works
❤️
truth
x mult increases for each glass card played without breaking
a glass card breaking destroys this joker
usually i just threaten it by speaking to ym computer saying if it does not work then im going to create a case of domestic violence upon it
i name my code so weirdly man like heres a snippet from one of my srb2 lua projects
local DBU_SplitscreenFUCK = DBU_SplitscreenFUCK
local DBU_TallyHallOffset = DBU_TallyHallOffset
local BDD_SplitscreenFUCK = function(v,c,x,y,scr) return DBU_SplitscreenFUCK(v,c,x,y,scr,falsesplitscreen) end
local BDD_TallyHallOffset = function(v,scr) return DBU_TallyHallOffset(v,bdd.gameovertime,scr,TICRATE/4) end
most of the FUCK was me getting angry over splitscreen support
jesus
i think they might still be mad over it
my baby! I can't destroy my glass cards, theyr'e too cute!
just a feeling
bwomp bwomp
teehee
glass cards are meant to be destroyed...
that fucking train that i hate
that fucking train that i hate
or maybe just sets xmult to 0
Ok, it increases xMult by .25 but when breaking, it decreases xMult by 1x. Makes it more risky
Cute art
Like the wheel of fortune there's a good chance of you getting it multiple times in a row and making it do 0 xmult
Say it louder

my pc has been through heaven and hell
its not scared of being wrecked anymore
in fact, i think it wants to die
GLASS CARDS ARE MEANT TO BE DESTROYED 🗣️
my friend tested the custom title with multiplayer mod and cryptid
i think that might be a bit buggy
i disagree
CCryptidviids
I made a joker that destroys them on purpose because I like the noise :3
Multiplayer and cryptid work?
☝️
thank you!
using the versions on balatro mod manager, yeah
multiplayer cryptid and it's just a race of whoever gets to eeee6 faster
true
Oh neat, I haven’t looked at BMM yet, is it good?
yeah, it's basically just a big catalog of mods
i don't like it because it's built in rust slash j
Oh neat, I might get it, I just don’t want it to mess with my mod :3
local newspaper = true
local fever = bepis
Mood
Big
now its actually the window
lmao
If glass joker goes up when Glass breaks...
I am just working through whats fun to do with this stained glass joker
It could also gain mult for how many glass cards are in the deck, then it's more vulnerable to glass breaking.
oh also i made a blind specifically for deaths to decks if anyone needs that
For what
Losing to a deck?
yea
I love seeing my boosters show up in the store. Feels good man
The Deck boss blind you fight the deck
i cant record it rn but one of my decks has a loss condition where if you reach zero dollars you lose
so i made a custom blind for the game over screen
so credit card is completely useless
this is NOT pink
should add each before 2 rounds
or every
every 2 rounds
ask the triangle guy who made the mod
oh nvrm then
lmao
How about this
'Glass Cards Earn $1 when Scored'
'This Joker is destroyed when 5 cards break'
PANTONE colors?!! I love it!!!!!
what
mr krabs money sound effect
is that a good or a bad thing
i thought they werent supposed to be destroyed
good
i should make more jokers tbh i feel like having just 5 jokers for my mod is a bit lacking
i don't have a SINGLE common joker
😭
You can do it!
Just come up with an awesome idea and ask 'how can I make this kind of suck', and then you have a common joker
and i thought 43 is very lacking
I have 30 in the release version, a few more in the dev branch
another problem is that i can't make art so just making art for more jokers sounds like a pain
joers
thats what i wanted
joers
joers i barely know er
guvnah fancy you a cuppa joer
im matching ur joe rn
what have i started
ohhh so shiney
JoeousSpring this time of the year
small ahh screen
IDK why windows does that
Same
god damnit
SORRY NOTHING
oh no they got scared by their monitor 
scammed
** ** Pack
"choose air"
You gotta pay for that
heres a wip mod i'm making, this just shows the title and songs
how can i make it so that certain consumables only enter the pool if theres a card with a specific enhancement in the deck (a la, glass/steel joker)
reskinning tarot cards are going well
" "
Gives and
" " Rarity
enhancement_gate = string
mwah
if balatro came out on the wii would it run well
no
will that work on enhancements showing up in standard packs as well?
money money
@thin anchor if you're playing mods then please move to #⚙・modding-general
sorry
mr krabs money sound effect
uhh enhancement_gate should only check for cards in deck
which looks better
oh i meant if i want to prevent the enhancement from showing in packs unless theres one already in the deck
oh, it only applies to jokers/consumables
ah i see
its a lambda
half life
how do i draw a bee as an enhancement </3

either draw some bees on the edges of the cards fluttering about, or give the card itself a bee-fluff texture and colours, I reckon
Make it look like a part of it ripped off and showing like some honeycomb
Give it a beekini
^
wouldbeed
I'd try and see if you can get something like that striped texture working on the cards
half life 3 when
i did
I'm dumb
how do i shade shit good
me when I instinctively click the spoiler and forget I even did it
Not going to lie, I was 100% expecting this to be the title theme song
Main Theme from Wii Sports (Nintendo) composed by Kazumi Totaka
why the fuck are you people saying would to that
people be down bad
would what
i chose a song that was chill and wouldnt send you insane from listening to it too much
BTW what is a reply ping. Is that like putting an emoji reaction on someone's message, or using 'Reply'
I feel like there is an evolved culture unique to discord that I am still learning
this
Oh I couldn’t read on mobile 😭
as opposed to this

I've seen more attractive wasps than that
They're the same picture
Ohhhhh
I never noticed that. Sorry everyone
Personally I prefer being pinged
yeah I prefer to be pinged too
If you don’t ping me you aren’t nice
there are 2 types of people in this world

Its not like i have any important business other than making jonklers
it's not like I have anything better to do with my time than look at replies
Whoever's idea this was about xMult was right!
fine i configured the plugin ya happy now
What plugin
noreplymentions
Owned
I’m reminded of some Reddit comments I saw recently
does this increase when a glass card is scored, or after all scoring ends and no glass is broken
whats the size of each stake
“I prefer option 2 because it’s more realistic.” versus “I prefer option 1 because it’s less realistic.”
what you have selected with 1 pixel extra
I want to say 34x34 but I'm not sure
without looking
I may be very wrong
It goes up when glass is scored, but resets at the end when any glass breaks. So the next hand is impacted
hmmm
29x29
tahnks
Bump
and so are tags
🏓
bro just pinged the pong
🏓
Should I worry about making enhancements actually look clean with the playing cards or should i just make it look cool
I.e what the playing cards suit n rank is being abundantly clear
am i shade good
What's it mad about?
That looks like it would stand out a LOT
As long as the rank is visible
All 3 are pngs?
make sure all the slashes are correct
idk if that it
but maybe
please put all of these images into a single atlas 😭
that too
can i change the weight of an enhancement after it has been obtained? (i.e., it's weight = 0 until obtained via other means and then it shows in standard packs)
english please t-t
all images in a spritesheet
lika dis
it's easier than having to create a new atlas every time you create a new joker
trust me
is there a default Xchips function?
:D
Malverk.badges.lttm_ame = function(self, card, badges)
badges[#badges + 1] = create_badge('Artist: Ame', G.C.PURPLE, G.C.WHITE, 0.7)
if self.key == 'j_shoot_the_moon' then
badges[#badges + 1] = create_badge('Common', G.C.RARITY.Common, nil, 1.2)
else
badges[#badges + 1] = create_badge('Uncommon', G.C.RARITY.Uncommon, nil, 1.2)
end
end
smods adds one
in smods yea
That is not that much space now is it
how can i make the center use the randtile outpit or smth
ah okay is it Xchips (like how youd return Xmult)
xchips specifically.
it's x_chips
That's for if its triggering on a playing card.
key = "febbles",
set = "Joker",
path = "febbles.png",
keys = { "j_baron" },
loc_txt = { name = "5 Pebbles" },
localization = {
j_baron = {
name = "5 Pebbles",
badge = "lttm_ame"
}
}
}```
this should work lol
no idea why it doesnt since it's the exact same as the other ones I made
AMEN
it doesn't matter what it's triggering on, all of my xchips jokers return x_chips
unless both are somehow valid expressions
if it's triggering on a playing card I just do this
Is there anyway for me to check how much money you have before something, because i have a card that summons a joker however i do not want it to summon it if your in the negatives
ty!
or I guess you'd probably check >= 0 but yeah
You also need to use the buffer
me when I forget the buffer
buffer?
if there are events in the queue that haven't processed yet but will change your dollar amount
the same thing happens with processing things that grant consumables
hw would i add a buffer?
And be mindful of Talisman changing 💀G.GAME.dollars to a table.
G.GAME.dollar_buffer
I hate that you're right, because I had to fix that for talisman compat
so just G.GAME.dollar_buffer < 0 ?
is the buffer also a table?
me when i show talis my man (attempting to compare number with table)
(G.GAME.dollars + G.GAME.dollar_buffer) >= 0
just turn the zero to be wrapped around to_big
...oddly enough, G.GAME.dollar_buffer is not made into a table.
this is how I handled the talisman stuff btw lol
(type(G.GAME.dollars) == "table" and to_number(G.GAME.dollars)) or G.GAME.dollars
also does anyone know what to do?
Most people define to_big
I wish I knew this...
to_number is a function talisman defines that changes bigs to numbers aswell
the
to_big = to_big or function(a)
return a
end
is to_big also a talisman thing?
yep
😭
Compare to tostring or tonumber
It’s a big number
Instead of a number
number go high
why couldn't they be normal and call it a double or something
because it isn't a double
It’s bigger
a double precision floating point is still a floating point number
it's still limited to some value
Python had a library for arbitrary precision numbers
this is true
They were there they were the number
at some point you need more bytes than a single register size to store a number I guess
Numbers so big they fit into an entire hard drive
that's it, I'm switching to coding my balatro mod in Assembly
now I want to make an Assembly-based Joker
Okay so how do i make a custum deck, is it somewhere on the smods thingy i cant find it
backs
thats what their called in engine
All i pretty much want is a Deck that has 6 joker slots, and grants you an Eternal Board Generator Joker i made, that is, the whole deck
id recommend stealing borrowing code from things like cryptid or too many decks
has anyone made a mod that lets you chose the stake difficulty on Challenge runs? 🤔
i think so????
I should probably ask that in the other modding channel
For apply of your SMODS.Back,
apply = function(self, back)
G.E_MANAGER:add_event(Event({
func = function()
if G.jokers then
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_modprefix_key") -- insert your Joker string here.
card:set_eternal(true)
card.ability.eternal = true
card:add_to_deck()
card:start_materialize()
G.jokers:emplace(card)
return true
end
end,
}))
end
-# Taken from one of my in-dev decks.
SMODS.add_card { key = "j_prefix_key", stickers = { "eternal" } }
Iont think this would look that good as an enhancement
Especially cuz of this stinky part
looks like a ticket
tickets to the balatro movie
jimbo says "The Plant" after entering The Plant
This, is a booster pack
Wrap the table in brackets too.
ive been banging my head against the keyboard for a solid 2 hours
i think i got the screen moving like how i want it to be
peak programming
you can actually see discord crashing in the background
thats how bad my pc is lmfao
may god bless this piece of technology to continue carrying me through this journey
before gutting a couple of unused applications my pc had like
3 megabytes left of storage
random query (that idk where it should go) getting this error on ARM with liblovely - has anyone encountered/solved this issue?: zsh: exec format error: /Users/-/Library/Application Support/Steam/steamapps/common/Balatro/liblovely.dylib
holy shit i didnt realize how BAD the vid looks
yeah not even proud of what i did anymore
what's ur specs
where do i check that again :p
windows settings idk
one sec
msinfo32 works too.
i got a shitty i5 with 8 gigs of ram and intel uhd grapchis
pretty bad
8 gigs is not enough nowadays
is there a context for the very start of the game
wat u tryin to do
hook onto Game:start_run idk
or is it init run
this is true
bumping
i3 at 1.20 ghz, ,,,,,
is that good or bad
let the cpu retire god damn
average 2010 laptop
mhm
surely it's older
i hate making stars on pixel art they just look like fat men tryna do splits on their tippy toes
i will continue cooking on this shit until it DIES
i also bump this again i want the card generation to be simple 😭
patrick
your cpu is the one cooking
true...
i have an enhancement that i want to have a weight of 0 at the start of the run, and then change it to 5 once it is acquired, I got the "changing to 5" working and have weight = 0 in the definition but i need it to reset at game start
but anyways
one clock cycle per sometimes
i need to be productive
but this kind of prevents me from making a modding guide vid, actually
would anyone want to see a slideshow 😭
i consider my pc as bad because i cannot get gmod to run with more than 40 frames per second
i cant run mc 1.8.9 with more than 30 FPS without optifine
oh that and the cpu randomly stutters sometimes
for NO REASON
and the gpu crashing because i have both firefox, discord, and some random electron app open at the same time
Is it possible to put the debuff shader on a blind?
:p i mean, at least urs doesn't seem to be suffering from occasional balatro crashes due to no memory left
everything is an electron app tbf
now, do yall think
Or a seal?
you get a puppet to do your instructions for you ❤️
that country that trump hates:
😭
i should probably sleep right now
hi just wondering what's the difference between "center" and "self"?
in what context
followed a tutorial where the dude uses center.ability etc
oh my god
replace all centers with cards
what does it mean?
card refers to the card itself during a run, self refers to the values you set when you add the joker
🥀 we need a new tutorial vid
self this self that
self:add("bi
other:
the bisexual enhancement
im gamemakerpilled
i used to mess around with gamemaker before
before i completely forgot about it and moved on
augh adding a v didnt work
hmmmmm
self in gamemaker is really weird because it doesn't exist
how do i make an attention text that lasts until i manually remove it
it's -1, technically
just don't add a {} until you need it
unless im stupid and talking about localization attention text
how do I fix this crashing the game when the joker is sold?
the one that adds a big ass white text into the screen
idk then
Why is this activating for every card remaining in hand? I only want it to trigger once.
-# damn
oop
true
X TRUE
true
if context.end_of_round and context.main_eval then
u dont need and not card.debuff i think, since it wont work when its debuffed anyways
This Mult was fact checked by REAL Jokers
add_card takes a table
i feel like it would pull out a knife and kill me when im sleeping eventually
Parameter should be in a table ({key = '...'})
does SMODS not store modded enhancements in G.GAME.P_CENTERS ?
Its G.P_CENTERS
ah, I see
how fucked am i if my laptop is so slow that vsc needs to wait 20s before code is loaded in
ehhh this is still causing crashes
I can relate I
so i'm not sure, what's the difference between center, card and self?
Is P_CENTERS initiated at that func?
sorry if im slow
tried printing randtile and its just blank AUUGH
Card is an extension of center, self refers to the SMODS object and card the card itself
im not initiating it myself but wouldnt init_game_prototypes be called before start_run?
Can't check rn soz
so i can replace all the center and self by card?
v_randtile?
i did v[randtile] necause other things are like that, if this works im gonna cry of happiness
if i write Cards that cannot rank down..., is it intuitive that it also triggers on Stone Cards
v_modprefix_randtile?
dont stone cards still have their rank and colors somewhere?
stone cards are totally not intuitive to me...
still nothing
just creates a randomcard and doesnt put any of my enhancements on
question question, where's the code that shows how much sanity you and ur boss got as an attention text :3
game_mechanics.toml
oh hm
ranking down sucks actually
there's next and strength_effect but no before
guh
DebugPlus does it?
There is prev
But I don’t think it’s supported
Press down
i got this uhhh function that handles decreasing ranks
Is prev supported
wanted to see if another variable would do it, hmmm (this didnt work)
idrk how that works
i think they put prev in all ranks now so
;3
ok this is not Scrabble right
I'm gonna be so mad if that's
Scrabble
how do I add an info box to a joker?
how can i use the smods event?
sans undertale in asriel undertale balatro boss blind
testing smt
Does DBP up/down work with modded ranks?
asriel will be using a different skill every hand
so the dynatext is there to show that
Idk
what's dbp up down 😭
im thinking about stuff like
"Every 2 seconds, marks a card. If its order in hand remains unchanged after 2 seconds, destroys it"
debug plus up down
oh...
hey sorry but what is a start_materialize animation?
it is when the card materializes in
idk how to explain it better
when the game starts
with the tutututu of the beginning?
you'll see an ace of spades materialises
ok thank you!!
sorry
is there a function to make a joker always a certain edition or is it better to just set the edition in add_to_deck
my solution
im fine with having like 15 chunks of card summoning at least i can bring the chances to like 1/100
without having like 60 or statements per card
does anyone know the code for making a card set itself to a specific edition, e.g. card.config.center...
:set_edition()
Do it in set ability
Making a Joker in similiar function to 👢 is proving to be quite a journey whilst retaining Talisman compat.
Is there anyway for me to make it that my custum enhancements can never naturally spawn?
in_pool = function(self)
return false
end
oh sweet
Nothing funny for it... I was this close to just scrapping it.
That’s a cool effect
Im locking Everything behind a singular joker lmao
Shame that, once the initial hand is drawn, if you exit to main menu and re-enter, the "forced to hand" cards will not be there. Any other method I tried produced ghost cards.
ok so in a mod i'm making i changed the position of the cards on the main menu
how would i fix this (cryptid + multiplayer mod)
You'll be able to toggle it on.
Kinda crazy joker but like.. You cant buy it ever, and its rn a 1/10 chance to appear from a Star Tile Card which also costs $30
so something like G.jokers.cards[card]:set_edition('negative')?
it also may dissapear at a random discard or hand played, its just whenever your generating another board card, acts like another turn and theres always a chance for your star to get stolen
gros michel if it locked in
(ill fix the text stuff later)
smth like that but iirc theres a bit more
can we have cross mod content pwease 🥺
is the star not $20
They don’t replace the initial cards?
it is 20 but rn i have it as 30 since its 1/10 to appear
as i add more tiles itll be 20
wow so you're asking Mario Party Superstars
Uninstall cryptid 🙃
i love ranks!!!!!
im back on the mlp grind, i added my favourite guyy on the left, he was actually done by me this time based on the other ones already done by rad
*as a cross mod content
Monopoly
The question is not can we have... it is what content should we have.
Only if in blinds... oddly enough, it works like that when opening booster packs.
i saw some of those windows 98 jokers
what's the difference between context.repetition and context.repetition_only?
wdym i can see the rank and suit theyre right there
you're a 10 out of 10 of diamonds to me, Myst
I’m sure you’d be able to intercept the draw function correctly in blinds to force draw them in all circumstances
hmm this isnt working... i had a look at the lovely dumps aswell to see what ecto does and this seems pretty similar
Classic theme ones, yes. If you have an idea for one, I could make a sprite for the atlas that includes your icon and text.
Thunk jank
sob????
classic
Honestly, I've even tried hooking draw_from_deck_to_hand... it produced ghost cards that would become actual cards on re-entering blind.
yea thats it
As an actual answer, iirc repetition_only is only present within card modifiers
can someone please help me with this issue?
ah, outside of that, is there any functionality difference? I'm making a retrigger card enhancement, so I guess if it was gonna be relevant, this'd be it
What’s the card value?
i get this error on adding my card to deck...
Nope, I recommend just using repetition in all cases
oh shit i thought i set that value to my joker index, im an idiot
Also that edition value is pointless, just out ”e_negative” as your set_edition argument
there we go
great, that's what I was already doing, luckily. I was just afraid there might be something I was overlooking, like repetition_only being for effects that only happen on retrigger or anything
@wintry solar Currently, the "safe" way without ghost cards I have is via calculate on the SMODS.Enhancement definition.
could i set it so that my joker is always negative, even in the shop or collection?
Yeah that’s a safe way, but I’m positive you can have it work in the “proper” way too
if it is not Burnt**
Yes, use set_ability
like this?
Well, I can't exactly get to said "proper" way on my own, at this point, unfortunately - don't want to burn out on just this, I still have other ideas for implentation for an eventual update push.
It’s a function, but yeah
Yeah ofc! Don’t get caught up on the little things
this is my implementation of a "Always drawn to hand" effect
-- Big Bird draw Enchanted cards
local draw_cardref = draw_card
function draw_card(from, to, percent, dir, sort, card, delay, mute, stay_flipped, vol, discarded_only)
if from == G.deck and to == G.hand and not card then
local enchanted = {}
for _, v in ipairs(G.discard.cards) do
if v.ability.big_bird_enchanted and not v.ability.big_bird_enchanted_marked_for_draw then enchanted[#enchanted+1] = v end
end
for _, v in ipairs(G.deck.cards) do
if v.ability.big_bird_enchanted and not v.ability.big_bird_enchanted_marked_for_draw then enchanted[#enchanted+1] = v end
end
if #enchanted > 0 then
local e_card = pseudorandom_element(enchanted, pseudoseed("enchanted_draw"))
e_card.ability.big_bird_enchanted_marked_for_draw = true
play_sound("lobc_big_bird_attract", 1, 0.8)
G.E_MANAGER:add_event(Event({
trigger = 'after',
func = function()
e_card.ability.big_bird_enchanted_marked_for_draw = nil
return true
end
}))
return draw_cardref(e_card.area, G.hand, percent, dir, sort, e_card, delay, mute, stay_flipped, vol, discarded_only)
end
end
draw_cardref(from, to, percent, dir, sort, card, delay, mute, stay_flipped, vol, discarded_only)
end
so
set_ability = function(card,self)
card:set_edition('e_negative')
end
```?
which is awful but it works
this is totally not extremely inefficient what do you meannnnnnn :clueless
mhm
fwiw this is what is there
if ((context.open_booster and (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or (G.STATE == G.STATES.SMODS_BOOSTER_OPENED and SMODS.OPENED_BOOSTER.config.center.draw_hand)))
or (context.first_hand_drawn or context.hand_drawn)) and G.deck and #G.deck.cards > 0 and card and context.cardarea == G.deck then
draw_card(G.deck, G.hand, nil, "up", true, card)
end
Swap card and self
yeah i got it working ty!!
😭
hand_drawn should be called within boosters btw
Instead of open_booster?
hey is there a way to manually debuff jokers for debugging?
Ah yes that’s the one
I wanted to differentiate between the two as it’s not really a hand imo
...well, the booster packs do now also draw the cards afterwards. At least this is saved because exiting mid-booster pack and re-entering the run executes all the booster pack stuff again.
You can also probably just throw the save function in your calculate after they’ve been drawn
...which one?
I think it might just be save_run()
Add that as an event after the if check within calculate?
Yeah wherever you’re drawing the card
...that's a lot of events per individual calculate call.
Unless I add it inside the conditional actions of the if check... outside, yeah, that's a lot of saving delay. 😂
-# That'd do it, actually, cards are staying in place.
hearts are done!
is it possible to make a blind that goes over every joker the player owns and reduces the effects by like 25% for example
without having to take control of every joker (hell for mod compatibility)
anyone have any insight?
hi i have an unexpected error, i don't know where this comes from, here's the script and the error
@daring fern hey again sorry this one is another joker I was trying to build and it has a small issue could you check it out for me? Ping me I will send you the codes
Hmm 🤔 lemme look at it real quick
@cursive sentinel
Not the whole error just send me still it says your device like windows etc
Send me the whole code too
key = 'j_boredom',
loc_txt = {
name = 'Boredom',
text = {
'This Joker gains {X:mult,C:white} X#1# {} Mult',
'per {C:attention}consecutive{} blind scored',
'on first played {C:attention}hand{}',
'{C:inactive} (Currently {X:mult,C:white} X#2# {C:inactive} Mult{})'
}
},
atlas = 'Jokers',
pos = {x=2, y=0},
rarity = 3,
cost = 8,
config = { extra = {
increase = 0.5,
Xmult = 1
}
},
loc_vars = function(self,info_queue,card)
return{vars = {card.ability.extra.increase, card.ability.extra.Xmult}}
end,
calculate = function(self,card,context)
if self.debuff then return end
if context.joker_main and not context.blueprint then
local reset = true
if G.GAME.current_round.hands_played == 1 and G.GAME.last_hand_played then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase,
reset = false
return{
message = localize ('k_upgrade_ex'),
colour = G.C.MULT
}
end
if reset then
if card.ability.extra.Xmult > 1 then
card.ability.extra.Xmult = 1
return {
card = self,
message = localize ('k_reset')
}
end
end
end
}```
@cursive sentinel check dms
bump
You could hook the calculate_joker function and modify the returned effects at the end
wait
youre so right
But not all Jokers do their effects thru returned effects
yeah it is called for each joker but
Some jokers do their effects manually so to speak
for example?
i could just limit the scope to only affect gold, chip, +mult, and xmult jokers
Just any joker that has return nil, true in card.lua
Yeah it'd work for this
ah gotcha
thank you so much
Good luck!
I'm wondering something.
Is it possible to make a Joker always act as if it is the rightmost one?
not easily, as far as I know. I suspect someone that's really skilled with LUA could set it up in a way that other mods wouldn't have problems with, but there's no function or anything to hook. You'd have to actually change the getter for the cards table for G.jokers, and I'm not sure how LUA handles those aspects
aight is there a good way of having an enhancement not show up in standard packs until it is acquired via other means? my current method is not working out well...
i currently have weight = 0 and then change self.weight as the first line in the calculate (so that once it exists in the deck, the weight is set to something else) but am having trouble finding a good context to set the weight back to 0 or a way to change the enhancements weight within a hook
rate the art
Does anyone know how to make an activ/ inactive badge like blueprints incompatible/compatible badge
It’s definitely arting
7/10
Needs more details
10/10 for color choice
Solid
im not good at details in pixel art 🔥
Same 🔥
does this look good for a legendaries nameplate
ye
.
return an UI element in loc_vars under the main_end field
I figured out I can just put an if statement in the set badges function
brand new modder here, are there any more example jokers available than just the ones in the steamodded examples page?
You can look at any mods jokers
so uh, my debugplus broke for no reason?
like, it was working fine, and then I restarted my game and now none of the keyboard shortcuts work
I tried reenabling the mod and reinstalling it but it doesn't work still
i'm trying to make a joker which adds a value to self when player succeed scoring on first played hand, but only after the hand as been played, i'm struggling with what to use to get the info that "player scored in one hand" and make it trigger on round end
ive tried multiple things but it doesn't work, probably due to my lack of knowledge in both balatro code and lua 😔
maybe make a local variable that increments by 1 when a hand is played, and then at end of round check if that variable is equal to 1, if it is then payout the extra money? I think that should work
i tried doing that but it crashes....
im bad at reading logs too
key = 'j_boredom',
loc_txt = {
name = 'Boredom',
text = {
'This Joker gains {X:mult,C:white} X#1# {} Mult',
'per {C:attention}consecutive{} blind scored',
'on first played {C:attention}hand{}',
'{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult{})'
}
},
atlas = 'Jokers',
pos = {x = 2, y = 0},
rarity = 3,
cost = 8,
config = {
extra = {
increase = 0.5,
Xmult = 1
}
},
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.increase, card.ability.extra.Xmult } }
end,
calculate = function(self, card, context)
if self.debuff then return end
local done = 0
if context.joker_main and not context.blueprint then
if G.GAME.current_round.hands_played == 1 then
done = 1
end
if G.GAME.current_round.hands_played > 1 then
done = 0
end
end
if context.end_of_round and done == 1 and not context.blueprint then
card.ability.extra.Xmult = card.ability.extra.Xmult + carD.ability.extra.increase,
done = 0
end
end
end
}```
here's how i had tried doing it
The game has an extant check for this already, though. I don't see why you'd check this
There's also a post-scoring context, which should let you check at the moment the score is in
You do not have to check for Debuff. Also, especially because the self will not be debuffed in this case
well you see, I am stupid
oh ok
i just added it because i saw it around
i still have a crash tho
I'd have to check what the best way to go about it would be, but also, you have access to the number of hands played during round end. You get paid out based on the leftovers, after all
What crash are you getting, btw?
wait imma screen it
You can ctrl c it and past it here 😄
whats at line 140 for your mod
where would i access the number of hands played uring round end? I'm really a beginner
You've set up a file or object wrong somewhere, by using a = where you don't need it
done = 0
its the last one, before the 3 ends
therse a comma at the end of the line before
The comma there breaks it
I think this breaks it, you shouldn't have a comma there
Damn, triple threat
why so? i'm really unfamiliar with lua
im trying to understand by reading it but it doesn't work entirely just yet-
You only use commas inside of lists/arrays
excuse me but theyre called tables! /j
That's why you do use it in loc_vars, config.extra and the return, but you don't use it in calculate, because that's a function
so no commas in calculate, got it
fixes the crash! also took off a and that was too much
although i'm curious, you mentionned i could access the number of played hands in end round, im searching in the base code of the game but it feels huge (i'm ctrl F "end" "round" "hands" xd)
tried to make it kind of like a bool, when 1 hand is played i make it true, if more i make it false, and end of round i read it
probably barbarian code from me
why not bool
i dont know lua...
list or dict
bumpywumpy
i think it reads /during/ the round no?
rather than once the player scored?
it updates as soon as the hand is played iirc
I'm not at my pc so I can't check the code, but I'd check for the word interest, as that'll be the same place where the amount of hands left is checked
ideally i would like to get it after the round is validated, and if the number of hands played is more than 0, reset the counter (like obelisk)
thank you all still,, it's really very kind of you to answer me
just try it
with g.game.current_round.hands_played == 1?
if it doesnt work i think i know what will
ohh i think i understand now
round refers to the round in-game (the blind) not the hand scoring
ohh ok ok so it indeed updates after the score is attained?
it updates before, as soon as the hand is played but you can check in context.after if it's > 0
context.after is after all calculations yes
okok
(read the docs ;))
only watched the video and the utility, and other mods, will look upon all the rest,, sorry
Hello. Again, where were the cards held in hand stored in the game?
G.hand.cards
thanks
man, there are a lot of similar functions that all just draw cards, huh
yup
drawing cards or drawing cards
what do you think of the updated wording
Clownfish reads like it could also just be flat mult rather than scaling flat mult, but otherwise, they're both good. I think the mechanic's just inherently a bit awkward to phrase, haha
man i cannot figure out deck skins, could someone help me out? the third image is what im replacing the hearts with but the hearts are just not being replaced ingame
<@&1133519078540185692>
jfc
anyways
is the key correct? It might need your mod's prefix
wait sorry i figured out the problem immediately after posting that, my bad
Goldfish and Clownfish in action, including Clownfish's dynamic UI
does anyone know how you would code a joker that triggers every time a tarot card is used? I can't find the calculate function for a similar joker in the source code and can't seem to fid anything straightforward in other mods
if context.using_consumeable and context.consumeable.ability.set == 'Tarot' then
tried this but it doesnt do anything (at least it doesn't crash)
if context.after and G.GAME.current_round.hands_played == 1 and not context.blueprint then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase
end
if context.before and G.GAME.current_round.hands_played >1 and not context.blueprint then
if card.ability.extra.Xmult > 1 then
card.ability.extra.Xmult = 1
return{
card = self,
message = localize('k_reset')
}
end
end
end```
Small tweak to Starfish's UI
I'm not sure on the wording, it's not very intuitive imo
anyone know what i need to hook into to make The Tower be able to be usable on stone cards(and do something different to them since they're already stone)?
or is that what take_ownership is for
Hmmm… It's the same wording as Juggler though
Do you recommend something else?
i will say the wording led me to believe every time a two pair in this instance was played it would give +3 levels instead of just having the joker grants those 3 levels while held once
Juggler?
oh you said starfish 🤣
I meant the poker hand tier stuff
-# I didn't watch the video because my connection is crap atm
What would you recommend?
I'm trying to find a good way to refer to it since the game doesn't
I'm not sure tbh
I don't really see them as different 'tiers'
they're just different hands
<@&1133519078540185692>
Yeah but they have an innate ordering
The tier is the order
Just saying a hand was above or below another was deemed too confusing
So it needs some specific wording to clarify this relates to the aforementioned order
I would have thought above/below in the list was more clear than introducing a new concept
anyone know what the variable name is for multiplying chips?
xchips
I don't like naming "the list" explicitly, especially since for the most part it's just Poker rules
but people have assumed anything from number of hands played, level, containment
Mainly level I think
also, how does the code look for identifying hands of a higher/lower tier?
strictly lower
does that respect custom hands?
it should
neat
actually
hmm
I think the list is ordered so it should
otherwise I'd need to have additional logic
Since the list is ordered the two ifs only ever happen in the other they should for strictly lower
bump
Uhh so I made a mod that has destroyed my lovely... its become dependent on the mod :/
main.lua:891: module 'mods.fps_limiter' not found:
no field package.preload['mods.fps_limiter']
no 'mods/fps_limiter' in LOVE game directories.
no file 'mods/fps_limiter' in LOVE paths.
no file '.\mods\fps_limiter.lua'
no file 'E:\Games\Other\Balatro Modded\lua\mods\fps_limiter.lua'
no file 'E:\Games\Other\Balatro Modded\lua\mods\fps_limiter\init.lua'
no file '.\mods\fps_limiter.dll'
no file 'E:\Games\Other\Balatro Modded\mods\fps_limiter.dll'
no file 'E:\Games\Other\Balatro Modded\loadall.dll'
no file '.\mods.dll'
no file 'E:\Games\Other\Balatro Modded\mods.dll'
no file 'E:\Games\Other\Balatro Modded\loadall.dll'
Additional Context:
Balatro Version: 1.0.1m-FULL
Modded Version: 1.0.0~BETA-0323b-STEAMODDED
LÖVE Version: 11.5.0
Lovely Version: 0.7.1
Platform: Windows
Stack Traceback
===============
(3) global C function 'require'
(4) main chunk of file 'main.lua' at line 891
(5) global C function 'require'
(6) LÖVE function at file 'boot.lua:323' (best guess)
Local variables:
c = table: 0x07d8b970 {identity:false, version:11.5, accelerometerjoystick:true, modules:table: 0x07d8b9c0, gammacorrect:false, title:Balatro, externalstorage:false (more...)}
openedconsole = boolean: false
confok = boolean: true
conferr = nil
(7) global C function 'xpcall'
(8) LÖVE function at file 'boot.lua:362' (best guess)
Local variables:
result = boolean: true
(9) global C function 'xpcall'
(10) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
At this point, just reinstall LOVELY.
That mod somehow won the fight.
got my joker to apply the xchips but it's not updating the xchips amount and it's not showing the xchips values when hovering over the card. Can anyone point out what i need to fix here?
the description should use #1#, #2#, etc. to put variables into it
also no spaces inside {} in the description
also
thank you!
so i can't use #0.25#?
it crashed my game when i tried to use the tarot T-T
what's the crash
no
{X:chips, C:white}X#1#{} Chips will fix it.
Doing the #1# tells the code to point to your first variable in the config.
coNsumeable instead of coMsumeable
oh my days. tysm!
how do you replace the card on the title screen with a different ace?
like replace the ace of spades with an ace of hearts
that's what I said
also I said to not use spaces in {}
Yeah, sorry, didn't check the channel until recent.
Try looking at cryptids lovely patches
Or talisman
oh yeah thats a good idea actually
probably something like SMODS.change_base(G.title_top.cards[1], 'Hearts')
(or patching the card of course but that one is simpler)
is it easily possible for a joker to make all cards be considered the first, or do i have to go and patch all the jokers that go by first scored
anybody know how to do the misprint code?
cause i got the image for this
but i dunno how to do the text
found out how talisman's card works
hi, where could i see details about the contexts? more specifically the "end_of_round"?
i am getting weird interactions and i don't find info about it on the gits
Why not just mult = temp_Mult?
Here's how I implemented mine in.
huh
i dont think so
ah ok
thank you!
I'll guess that you probably want context.end_of_round and context.main_eval
how would i do the text?
like you know what the joker says
on its description
if you couldnt tell i know barely anything about coding, do i just put that in the .toml file?
Yeah, about that.... I haven't figured that out yet.
oh
You'd probably have to do some timing shenanigans, but the main jist is passing the randomness as a variable to the description.
Or do the variable changing under update.
you probably want to hook Game:main_menu to do but try to copy what talisman or cryptid does first maybe
(i think cryptid hooks main_menu iirc)
i dont even know where to look for the cryptid card lol
i found where talisman puts it but not cryptid
i stole mine from cryptid if you want to look at it, but it just adds a card like cryptid does
https://github.com/nh6574/JoyousSpring/blob/ad8d37887e4f6cc7f4ab569e2667451e578f71d7/src/general_ui.lua#L573
well i tried cryptid with the mod im making and uh
this is with cryptid and multiplayer
i still dont know what to do with this bug or whatever it is lol
i also dont know whether this matters or not
did you figure this out?
im still trying to, the increment is working
the reset isn't
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase
return{
message = localize('k_upgrade_ex'),
colour = G.C.RED
}
end```
for the increment
just do an else
if context.end_of_round and context.main_eval and G.GAME.current_round.hands_played == 1 and not context.blueprint then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase
return{
message = localize('k_upgrade_ex'),
colour = G.C.RED
}
else
--code for reset
end
should i put the blueprint somewhere else?
wdm
blueprint will copy anything that isnt under a not contex.blueprint
so anything to do with scaling shoul be disabled with blueprint
yeah but
the main scoing should b copied with blueprint
ahhhh
don't do this
this else will run in EVERY context
wait what
oh dear
if context.end_of_round and context.main_eval
if G.GAME.current_round.hands_played == 1 and not context.blueprint then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase
return{
message = localize('k_upgrade_ex'),
colour = G.C.RED
}
else
--code for reset
end
end
i think this works better iirc
if context.joker_main then
return {
message = localize{type='variable',key='a_xmult', vars={card.ability.extra.Xmult}},
Xmult_mod = card.ability.extra.Xmult,
}
end
if context.end_of_round and context.main_eval and G.GAME.current_round.hands_played == 1 then
if not context.blueprint then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase
return{
message = localize('k_upgrade_ex'),
colour = G.C.RED
}
end
else
if card.ability.extra.Xmult > 1 then
card.ability.extra.Xmult = 1
return{
card = self,
message = localize('k_reset'),
colour = G.C.RED
}
end
end
end```
trying this
yeah this is better
i have a crash at "juice_up"
try this
okayy
i forgot how i do things
also remove the card = self
and you can change the first return to just be xmult = card.ability.extra.Xmult
if context.end_of_round and context.main_eval and not context.blueprint
if G.GAME.current_round.hands_played == 1 then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase
return{
message = localize('k_upgrade_ex'),
colour = G.C.RED
}
else
--code for reset
end
end
@cursive sentinel
i moved the not bluprint back to the main if
this will make it behave as intended
i try this
so i get this error when trying to use this
am i dumb or am i stupid
...seems slightly off.
so keep crashing and idk why but i have the error here
if context.joker_main then
return {
xmult = card.ability.extra.Xmult
}
end
if context.end_of_round and context.main_eval and not context.blueprint then
if G.GAME.current_round.hands_played == 1 then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase
return{
message = localize('k_upgrade_ex'),
colour = G.C.RED
}
else
if card.ability.extra.Xmult > 1 then
card.ability.extra.Xmult = 1
return{
message = localize('k_reset'),
colour = G.C.RED
}
end
end```
it crashes telling me the end has a weird symbol near
is the if unnecessary after the else?
Do you have the lua extension?
It tells you about syntax errors
I'd need to see the full patch but I would guess you're trying to use quotes inside quotes
I typed this in discord so it's very possible they have formatting problems
i deleted a part in it i tried earlier, that was the problem
booting it up now i get this error
i now have it installed but i dont understand what it changed
made it a trusted window and everything but nothing additional shows
im on vscode
Is the file name red?
hmm maybe change_base cant be used in the title screen or at least a mod makes it not being able to
calculate = function(self, card, context)
if context.joker_main then
return {
xmult = card.ability.extra.Xmult
}
end
if context.end_of_round and context.main_eval and not context.blueprint then
if G.GAME.current_round.hands_played == 1 then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase
return{
message = localize('k_upgrade_ex'),
colour = G.C.RED
}
else
card.ability.extra.Xmult = 1
return{
message = localize('k_reset'),
colour = G.C.RED
}
end
end
end,
yeah it was the extra if
i keep the "," at the end?
yes
is there a reason? (i dont know)
just in case you put anything afer calculate
elseif, actually.
isnt elseif an alternative if?
if is the initial set of conditions and actions... elseif is executed if former doesn't and so on.
is there someone here than can help me simply change the card of the ace on the title screen
right but im assumeing you want the joker so reset if the amount of played hands is not one
this should do that
did you load a new run
on launch
what is line 150
it is the "end"
remove it
wait what exactly does this joker do?
youre missing and en i think
would do smth like "gains X0.5 Mult per consecutive blind scored on first played hand"
and additional one?
key = 'j_boredom',
loc_txt = {
name = 'Boredom',
text = {
'This Joker gains {X:mult,C:white} X#1# {} Mult',
'per {C:attention}consecutive{} blind scored',
'on first played {C:attention}hand{}',
'{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult{})'
}
},
atlas = 'Jokers',
pos = {x = 2, y = 0},
rarity = 3,
cost = 8,
config = {
extra = {
increase = 0.5,
Xmult = 1
}
},
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.increase, card.ability.extra.Xmult } }
end,
calculate = function(self, card, context)
if context.joker_main then
return {
xmult = card.ability.extra.Xmult
}
end
if context.end_of_round and context.main_eval and not context.blueprint then
if G.GAME.current_round.hands_played == 1 then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.increase
return{
message = localize('k_upgrade_ex'),
colour = G.C.RED
}
elseif card.ability.extra.Xmult > 1 then
card.ability.extra.Xmult = 1
return{
message = localize('k_reset'),
colour = G.C.RED
}
end
end
}```
is the whole
no problem, thank you very much still!
will probably sleep by then so take your time
added a end and this time it works wtf
Just now finding out Blinds don't have a typical calculate function, but I'd like to do this effect. Anyone have any ideas? My first thought was hooking into eval_card but I'm not sure how much sense that would make
can you take owner ship of smth then hide it from your mods collection specifically and remove your mod badge from its description?
Take ownership has a silent input
with blind calc cant you still mess with post trigger?
Is there blind calc? If so I don't see it documented/could be 98%-ing myself


