#💻・modding-dev
1 messages · Page 313 of 1
For some reason my sticker's applying to a card a joker generates? Like I give it to 8 Ball and the sticker applies to the consumable it makes. How do I make it not do that? Also does the same thing when I copy playing cards in my hand with Debug, each one gets the sticker despite the original not having one
So a copier joker I made isn't copying another retriggering joker I made:
I need help.
It copies Xmult joker, though.
how would i debug a blind? i need a way to just set myself to ante 8 and force it to appear since it's a finisher
just go to ante 8 and reroll the boss
DebugPlus
Press 3
oh
oh true spawn
ah
i forget that's not just cards
proud i was able to figure this out on my own
holy shit 900n1
ya
does it have a shortcut to reload all mods?
or is there some shortcut for that in general
you can reload atlases but youd reload the game to reload mods
Hold M
or alt +f5
ah
bump
vibe coding in balatro modding is really brainrot, don't try it guys
name every variable and function nonsensical and based on how your mood is currently coding it
27 prompts deep and still crashing, lil bro will get insulted by me in a minute
i might actually have to learn lua :/
is that being fed to ai
yes, why?
trying to make a pack, but rn i just play around with balatrobot and can't get it to run
People will be pissy about most things ai related here. My take is just it won't get you far
i'm making fun of it
Fair enough. I'm fine with ai and in my limited modding projects I do use it to automate menial tasks like writing the mod list in my Readme for my modpack. I'm really just rambling nonsense ngl
Amazing
well i found a bunch of other issues so far
firstly this is debuffing jokers as well as playing cards, but it's only meant to target playing cards. i'm guessing is_suit() still works on jokers for some reason
the intended effect is it only leaving one suit not debuffed, and changing which one isn't debuffed each hand. currently it isn't changing which suit is spared from the effect, and as i said also targeting jokers
local playableSuit = "Spades"
return {
name = "af_final_wand",
key = "final_wand",
atlas = "chips_atlas",
pos = {x = 0, y = 0},
dollars = 8,
boss = {
min = 8,
max = 10, -- does nothing
showdown = true
},
boss_color = HEX("E34234"),
discovered = true,
-- stole this from castle lol
drawn_to_hand = function(self)
playableSuit = "Spades"
-- find valid cards to target
local validCards = {}
for _, v in ipairs(G.playing_cards) do
if v.ability.effect ~= "Stone Card" then
validCards[#validCards+1] = v
end
end
-- set the suit if valid targets exist
if #validCards >= 1 then
playableSuit = pseudorandom_element(validCards, pseudoseed("vermillion_wand")).base.suit
end
end,
recalc_debuff = function(self, card, from_blind)
return not card:is_suit(playableSuit, true)
end
}
does anyone know where i can find every pool?
i use it rarely, i sometimes try it out, especially when learning new languages or frameworks, but as i reported above, it almost always disappoints and i can stay happy knowing i'll keep my job for some time lol
I do have no shame however and if an ai could suddenly write competent smmoded code, you bet I'd jump right on that
And finally release mods of my own, lol
i love reddit
i think i'll start a new balatro automation project, no one seems to have up-to-date balatrobot running, at least on mac, and gcbot seems outdated as well
An echochamber for any occasion
i love echo chambers, i think my opinions are the best honestly
just learn to code
did already, thanks
From their replies it's pretty clear that they are a dev and are just fucking around
i just learned a real programming language (javascript with seven million transpiler between me and the customer) instead of yucky lua
my bad, seemed like you were one of surprisingly many people here who try to code an entire mod with only chatgpt and zero experience otherwise
Can you show the sticker code?
ok now trying to fix localization the mod just crashes when i mouse over the blind in the collection
ok but js is like the funniest follow up to "real programming language"
i'm on holidays so i feel like i'm slowly becoming that person
sure thing!
bump
how do i get a joker's edition?
card.edition.key
python best, they should remake balatro to run on python /s
is the edition key
ty
"why doesn't chatgpt have the entirety of smods documentation in its data set :( i don't want to have to learn everything"
python sucks just as much as lua and js
yeah but it sucks in a way i like
lua sucks in particular just because it's 1 indexed
i'm at least used to lua's weirdness
TRUE
when they realise smods has a bunch of features not in the documentation and even uploading the entire documentation wont help them
I mean there are pros and cons in different languages.
even smods documentation doesnt have the entirety of smods lmfao
atleast luas weirdness is novel and unique, python and javascript are just kinda bad
i will not have python slander happen on my watch
jsfuck is the one good thing you can do with javascript
True...
i grew up on lua because i grew up on roblox studio and fnf knowledge 
I mean... I'd be the first one to flagrantly make ai-coded mods if it did, lol. But I know too much about ai to expect that
is that like brainfuck
and then they feed the docs into copilot and get surprised when it still doesn't really get the game's code
tables and metatables are so uniquely funny but like weird wacky type casting is just a thing that always happens with non strict typing
can i actually get help though
wait you cant just upload entire balatro source code to chatgpt?! /s
basically via arcane wizardry you can write any js program using just the characters []()!+
i've used copilot as a problem solving tool, like, twice, but it feels legit evil to try and use it to code anything major
real
I haven’t done a whole lot of sticker work but I’m pretty sure the apply function needs to have some sort of condition in it otherwise it will be applied to everything
i have never really used ai for anything before
i will make my work myself, thank you very much
basically i am like better than everyone else
e.g. ![] == false, +[] == 0, +(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]]) == +("1e100") == Infinity
i use it for like algorithm creation if anything
can anyone help me fix this
I use ai for labor saving like turning a list of github links into my modpack's readme
i don't really get access to powerful ai in particular so i just never use ai for ideas
that and im lazy
it's good for automating tedious stuff and logic testing without opening the game but i never use it otherwise
what's the crash log?
hold on
i wouldn't really feel like i "made a mod" when chatgpt did most of it
having to do menial tasks is my penance for writing shitty code so i dont even use ai for labor saving
yeah theres no sense of accomplishment
and at that point it feels like it's going against the thesis of modding and programming in general
like sure i get to play it but...its not mine
ok actually like a week ago i asked an ai about my mod and it continuously lied to me about what the joker did so that's. something
Tbh.. unlike with creative writing, which I do have that sorta relationship with. I don't with coding at all
its not really your mod unless you lose your mind over one hyperspecific bug that has the dumbest possible fix
True...
If it's my ideas It's my mod imo
REAL
never had a bug in my code cant relate
case in point:
this man pushes perfection on initial release
i have that kind of relationship with all creative work i make, and so using ai feels like it goes against the entire idea of it
spend like half the day on one problem only to find a solution that was right infront of you
ok so this is crashing in mix_colours? which is odd
I see the concepting as the creativity in modding and the coding as the grunt work
Which probably shows I was never meant up me a programmer
no feeling like getting humbled on this chat when youve been staring at documentation for 30 mins and someone points out that it was in front of me
the coding is the entire fun of it imo
same lol
is there anything wrong in this line then boss_color = HEX("E34234")
or at least a very big part of it
i enjoy all parts of it other than shaders and music/sfx cause i suck at those
oh that probably might be an issue?
I... despise mathematics, which is strange for someone who always wanted to be a programmer growing up
idk i've never touched smods.blind
sfx is more fine atleast, but shaders is
a different hell
i didnt see your reply it got drowned out lmfao
will this work? (is there a place i can see each pool so i can just go down the list
for my experience going to dev channels to ask for help mostly never gave back a response so i spend most of my time just searching key words into the seach bar and read documentation like im absorbing it
i just have someone to do shaders for me anyway
ah
coding ai won't evolve anyways as long as the only new training material is either regurgitated ai slop or hidden in discord servers - stackoverflow is dead
i've also just been left with a bad taste in my mouth by ai in general seeing as how its current "pushed use" by every company ever is to replace human artists and workers because capitalism, so i'm just not really a fan in most use cases
using the search function in a forum is already more than what 90 percent of people online ever do anyways
I assure you that if all gpl code was scraped compentently that'd be nore than enough. The problem is never the training set its current methods
Imo
but then you're using gpl code which is an entirely different issue
if it has a use case it's as a tool, which i support but that's basically it
pretty efficient though but sometimes it just won't cover this one hyperspecific thing i want to make so i just get ghosted
Well... copyright and ai have a very adversarial relationship at the best of times, lol
I'm anti-ip in general
ah I see how they work now, you'll need this function to be true when you want it to apply, oir you can write your own
should_apply = function(self, card, center, area, bypass_roll)
if
( not self.sets or self.sets[center.set or {}]) and
(
center[self.key..'_compat'] or -- explicit marker
(
center[self.key..'_compat'] == nil and
((self.default_compat and not self.compat_exceptions[center.key]) or -- default yes with no exception
(not self.default_compat and self.compat_exceptions[center.key]))
) -- default no with exception
) and
(not self.needs_enable_flag or G.GAME.modifiers['enable_'..self.key])
then
self.last_roll = pseudorandom((area == G.pack_cards and 'packssj' or 'shopssj')..self.key..G.GAME.round_resets.ante)
return (bypass_roll ~= nil) and bypass_roll or self.last_roll > (1-self.rate)
end
end,
oh maybe try making the es lowercase?
i dont know
hex is case insensitive
tried, still crashes
card.edition doesn't exist apparently
😭
oh lmao
it only exists if the card has an edition
Damn Canadians
wdym
you'll need to do card.edition and card.edition.key
that has a true or false value
so where would this go, though? in Stickers.lua or no?
i get that but your main enemy then should be companies, not the method they use to exploit us
oh yeah technically morefluff's en_us localisation is incorrect because they're called colour cards
but I Cannot Be Bothered Fixing It
i did and it's saying edition doesn't exist
meh america isnt real anyway
also a point lol
this is the should_apply that exists on every custom sticker object, you'd just rewrite it like you'd add any function to your object
?
ohhhhh ok
one follows the other
show code
??
companies will exploit us, with or without AI
weird i did a tprint and i see it
at a very close point they're one and the same, the technology is only existing to serve that purpose in many cases. take the suno ai music guy saying "people don't enjoy making music", ai art generator guys saying "traditional art is dead", etc
people say that??? damn
my brother in christ you are destroying art
Imo there's a major difference between corporations using ai internally and common folk who couldn't even afford to hire a human using it for personal projects
either way people using it is contributing to the image that its unilaterally good and people want more of it which is always going to lead to more companies using it for evil
this i can understand, the flip side is that you are actively contributing to the dataset that is used to do bad things
theres not really a good seperation with some things
i get that, but also a mission they definitely intend is to devalue the worth of human art, therefore making it easier to replace human artists and creators with ai derivatives. at the end of the day it's a capitalism problem, but they're trying to rope everyone into it
I don't think genies can be stuffed back into bottles. It's really as simple as that. It's here, it's morally gray and we need to live with it as a society
while the details and the magnitude of AI might be different, this is just capitalism like it was always, companies will make money at every cost
we can definitely do something about it we just probably wont fully
acting like its unstoppable so people should just use it is exactly why it might be unstoppable
its the same mindset as "well one vote wouldnt make a difference" so then no one votes and it makes a difference
so right now i have that in there as is
where would exceptions be like how would i format them in this
I do believe that's a fundentally luddite philopshy. As much as that might make me look like an 'ai bro'
Whatever the fuck that's supposed to be
I'm probably older than you, lol. I'm 26
not to get all radical but... capitalism bad
aaand it turns out it was some weird event behaviour for the 2nd time today
Agree. I'm an anarchist
yeah. i said it
probably older than me because i got 26 yesterday haha
so brave
I'm gonna be 20 this year I'm so young
it's a pretty uncommon opinion
sadly ye
i feel like a baby as a 15 year old lmfao
everyone always imagines that one day they might be a billionaire
so they support it because they actually believe it can happen
which is not true
you get there by sheer luck you may as well literally buy lottery tickets
I'm lucky to be a thousandaire being on ssdi
And I'd lose my money if I have two of them... thousands that is
Poverty trap ftw
yes that's the problem - i thought about that recently - thats like the universal hindrance to leftism becoming more popular in first world countries; most people still believe the capitalist lie of "everyone can do it if they work hard enough!!!"
but i'll stop here before some discord mod disciplines me or worse
guys it's okay just trust me it'll work this time just one more ruling class guys it's great just one more recession and it'll work i swear
just make me supreme queen leader of earth already smh
my only hope is the tiktok generation, they all seem more lefty and i'm all for it
all commerce will be done by balatro modding. the most jokers the more capital (<-- biased)
time to for loop joker generation
gen z voted much more right wing than anyone else in 2024 lol we're cooked
how to implement tarrifs in balatro? /s
shit
when will localthunk implement marxist economic philosophy into balatro?
when will thunk add raised fist 2
durak in balatro would be actually dope though
anyways i need help fixing the other issues here
besides the boss color crash
(that's fixed now)
remember when modding-dev was about mod development
no?
nah, never
cant remember when that happened
you can check for card.ability.set == 'Enhanced' or card.ability.set == 'Default' for playing cards
ah
is it the not in your return (im literally guessing)
that's meant to be any playing card not of a given suit
oh i see
that just included jokers
i didn't know how to check if something was a playing card before
then yeah do n''s thing he's goated
i have lua experience from the minecraft figura mod, literally coded a physics engine in that lol
a very basic one but still
For some reason the first line (green) doesn't copy retriggering effect, but the secong line does.
Is this a smods bug or have I done something wrong elsewhere?
I think you need the above bit too
is there anywhere other than G.UIDEF.card_focus_ui in functions/UI_definitions that can set the buttons that appear on a card?
im trying to get the buttons to work properly on cards that appear in the custom cardArea i made, and based on that function there shouldnt be any buttons on the cards at all, but it still has a use button for some reason
neither of these are true
still having an issue with it not switching the debuff, although it does appear to select a new suit
yeah recalc_debuff isn't getting run i think
that seems to be the issue
The biggest thing I'm confused about for your code is that it's all a return table and not an SMODS.Blind
i'd assume that it gets passed to SMODS.Blind eventually
it does
ok yeah not even directly running recalc_debuff works
current code
-- Designed to work like how Castle selects its suit, only being able to choose cards from your deck.
return {
name = "af_final_wand",
key = "final_wand",
atlas = "chips_atlas",
pos = {x = 0, y = 0},
dollars = 8,
boss = {
min = 8,
max = 10, -- does nothing
showdown = true
},
boss_colour = HEX("E34234"), -- canada caused my game to crash!!!! /j
discovered = true,
playable_suit = "Spades",
-- stole this from castle lol
drawn_to_hand = function(self)
sendDebugMessage("Drawn")
self.playable_suit = "Spades"
-- find valid cards to target
local validCards = {}
for _, v in ipairs(G.playing_cards) do
if v.ability.effect ~= "Stone Card" then
validCards[#validCards+1] = v
end
end
-- set the suit if valid targets exist
if #validCards >= 1 then
self.playable_suit = pseudorandom_element(validCards, pseudoseed("vermillion_wand")).base.suit
sendDebugMessage("Switched to " .. self.playable_suit)
end
for _, v in ipairs(G.playing_cards) do
self:recalc_debuff(v)
end
end,
recalc_debuff = function(self, card, from_blind)
return (card.ability.set == "Enhanced" or card.ability.set == "Default") and not card:is_suit(self.playable_suit, true, true)
end
}
i dont know anything about blinds but you can try using the new blind calculate with context.debuff_card maybe
oh?
Oh yeah that might work
i don't see that method in the docs
Cuz it isn't
😭
you need to return { debuff = true } it seems
what are the parameters for it
since it's not in the docs
It's basically the exact same as a Joker calculate function
oh
i forgot to say but it's telling me a need a return value
better ss
what determines the position of a button on a card? / how do i move a button?
The UI tree in the create_shop_card_ui() function
is this a monospaced font?
well that crashed my game
return {
name = "af_final_wand",
key = "final_wand",
atlas = "chips_atlas",
pos = {x = 0, y = 0},
dollars = 8,
boss = {
min = 8,
max = 10, -- does nothing
showdown = true
},
boss_colour = HEX("E34234"), -- canada caused my game to crash!!!! /j
discovered = true,
playable_suit = "Spades",
-- stole this from castle lol
drawn_to_hand = function(self)
sendDebugMessage("Drawn")
self.playable_suit = "Spades"
-- find valid cards to target
local validCards = {}
for _, v in ipairs(G.playing_cards) do
if v.ability.effect ~= "Stone Card" then
validCards[#validCards+1] = v
end
end
-- set the suit if valid targets exist
if #validCards >= 1 then
self.playable_suit = pseudorandom_element(validCards, pseudoseed("vermillion_wand")).base.suit
sendDebugMessage("Switched to " .. self.playable_suit)
end
--[[for _, v in ipairs(G.playing_cards) do
self:recalc_debuff(v)
end]]
end,
calculate = function(self, card, context)
if context.debuff_card then
return {
debuff = (card.ability.set == "Enhanced" or card.ability.set == "Default") and not card:is_suit(self.playable_suit, true, true)
}
end
end
}
now ability is nil i guess
context.debuff_card instead of card
wdym
context.debuff_card is the card you need to check, card is the blind
I had a fun idea for a joker
The ability changes depending in what day of the week it is
So on monday its really bad (mondays are aaaaa)
But on Friday and saturday its really good
...so, same Joker, but with Garfield on Mondays, Sonic on Fridays & Dexter's Dad & Car for Saturdays?
it still doesn't work as intended somehow
Basically yeah
Its ability fully depends on the day of the week
Would that be cool and innovative
as long as all the abilities are roughly equal in strength it should be cool
you want to avoid it being more favourable to mess with your system clock though
what's it doing
it's switching which suit should be excluded internally, but doesn't show that in-game
in-game the same suits stay debuffed
do the messages in drawn_to_hand work?
yes, that's how i know it's changing internally
hmm no idea
Are you un-debuffing the cards
calculate = function(self, blind, context)
if context.debuff_card then
return {
debuff = (context.debuff_card.ability.set == "Enhanced" or context.debuff_card.ability.set == "Default") and not context.debuff_card:is_suit(self.playable_suit, true, true)
}
end
end
this is currently responsible for debuffing them
actually i wonder if the debuff is interfering with the ability
the check that's meant to detect if something's a playing card
it shouldnt because that context is also used to undebuff cards
but if it does its an smods bug
when i emplace a card into the custom cardArea i made the button alignment breaks for some reason
it somehow triggers when i sell a tarot card???
whats the code
this is what im using to make my card area, there is a lot of other code to try and make this work but i probably shouldnt send it all lol
its mostly based on the implementation of abilities in betmma's mods
# remove use button from biome cards
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''
if card.ability.consumeable then
if (card.area == G.pack_cards and G.pack_cards) then
'''
position = "at"
payload = '''
if card.ability.consumeable and card.ability.set ~= 'biome' then
if (card.area == G.pack_cards and G.pack_cards) then
'''
match_indent = true
# add sell buttons to biome cards
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''
{n=G.UIT.T, config={ref_table = card, ref_value = 'sell_cost_label',colour = G.C.WHITE, scale = 0.55, shadow = true}}
}}
}}
}},
}}
end
'''
position = "after"
payload = '''
if card.area and card.area.config.type == 'terraria_biome' then
sell = {n=G.UIT.C, config={align = "cr"}, nodes={
{n=G.UIT.C, config={ref_table = card, align = "cr",padding = 0.1, r=0.08, minw = 1.25, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'sell_card', func = 'can_sell_card'}, nodes={
{n=G.UIT.B, config = {w=0.1,h=0.6}},
{n=G.UIT.C, config={align = "tm"}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 1.25}, nodes={
{n=G.UIT.T, config={text = localize('b_sell'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = localize('$'),colour = G.C.WHITE, scale = 0.4, shadow = true}},
{n=G.UIT.T, config={ref_table = card, ref_value = 'sell_cost_label',colour = G.C.WHITE, scale = 0.55, shadow = true}}
}}
}}
}},
}}
end
'''
match_indent = false
its all vanilla as far as i know
its works perfectly fine when its in a consumable slot
It's because G.consumeables has it's own logic for buttons
ahhh
Ill just go with the honors system, because
Op saturday = funny
You will probably need to hook/patch card:highlight kinda like you do here but for your custom cardarea
i can send my code where i do that if you want but its somewhat complicated by this point haha
Is it possible to totally change the main menu background to a different animation or even like a video
uh
any help with formatting
i can probably manage if i know how G.consumables handles it
how are you writing the description
it pulls the string ability from a table
i would need to see the code to understand what that means lol
heres is how i do it if it helps https://github.com/nh6574/JoyousSpring/blob/fb16223af3fe80af6b97c41c2dc7e27307014512/src/general_ui.lua#L307
oh ok, the formatting doesn't work in vars
oh
you need to either: set up a localization file and return a new key in loc_vars for each day OR use main_end and make a UI table
(or do a complicated set up with variable colors but i dont recommend that)
ill just
have no formatting
itll look odd and i think that would be funny
This is cool
wait, does Card:highlighted even set the sell button? it looks like it only sets use_button
use_button is all the buttons
well i got it to work correctly
okay so, in a joker, how would i access the current mult and chips?
Can anyone help me in turning Toml lovely patches into Smods
that mostly depends on what the patch is doing
how do i edit a joker's description with debug+? is it even possible?
i know how to edit the values (ex hanging chad = 10 retriggers)
Its the same as the name but its called text instead of name
And it's a list of strings instead of a string
how would i get the chips value of a playing card
trying to do this as a hand is being played
will this work? like make the sticker only joker-applicable, so if a card (like 8 ball) creates a consumable then the consumable wont have the sticker?
how do i check if i beat a boss blind
what editors you use?
consumables can have a calculate function right?
how you set up a localization config for jokers mods?
[ There are many supported languages in such. ]
i had no idea until yesterday lol
code editors? I use VSC because it links to github and has a million plugins
# EAT
*THIS*
* JOKER
yummers
we eating good tonight
and what lua exension you have bcs all i use give me errors
none actually, i use a c# one because i like how it colors things, i just use an ai to check my syntax instead of an extension
i also just havent found an lua one i like
to be fair, i started using lua 5 days or so ago, so im not the best to respond to your question, but i didnt see anyone else respond
its in the smodded docs, ill grab a link
i seen te template but i think it is for controls
erm guys does context.selling_self work?
https://github.com/Steamodded/smods/wiki/Localization
i also have no clue for the controls, i have yet to get into localization
i thnk you should use
remove_from_deck = function(self, card, from_debuff)
return true
end,
for that
obv with the code you actually want to use put into there
it should i think
isnt that for if its removed? including if destroyed by smth like ankh? i want it so its only when actually sold
it does ^^
i meant the solution i gave
is it possible for blinds to throw hands using calculate function
this is what i wanna do
Can't you throw hands the usual way?
the debuff hand doesn't have arguments for cards in hand
so I'm asking if there's a better way to do it
just check G.hand
i dont think theres any other way to do this
other than manually checking G.hand.cards
do i also need to check game state
i think you just need to make sure that the blind isnt disabled
oh about that i wanted to make it so that you can't disable it either way
You can just access them directly
for some reason the calculate function in the card i made isnt running
G.hand
this isnt ever running
you don't need to access everything via the context
just make sure to use :is_face so you instantly lose if you have eternal pareidolia
oh, will cards still calculate if they arent in a vanilla cardArea?
if not, how can i make them calculate in the modded cardArea too?
sucks to suck
i mean yeah thats the point
these won't appear until ante 9 anyway
SMODS provides a patch target to add custom CardAreas
how do i do that
something like:
# Zodiac calculation
[[patches]]
[patches.pattern]
target = '=[SMODS _ "src/utils.lua"]'
match_indent = true
position = 'before'
pattern = '-- TARGET: add your own CardAreas for joker evaluation'
payload = '''
if not VIC_ALPHA_RELEASE then
local vic_joker_idx = 0
for k, v in ipairs(t) do
vic_joker_idx = vic_joker_idx + 1
if v == G.jokers then
break
end
end
table.insert(t, vic_joker_idx, G.ca_vic_zodiac)
end
'''
oh thats what the target comments mean
I'm searching the table to choose exactly when my CardArea is calculated
G.ca_vic_zodiac is your CardArea right?
Yes
how do you check if high constrast is on or not?
I think like this
does that work for smods too? since it splits it into separate high constrast settings per suit?
smods does what now
yeah there's still the toggle in settings but there's also a toggle per suit in customize deck
unless i'm just crazy
deadass wtf, this code adds 17 AT THE END OF EVERY ROUND TO heldfor
I didn't know about the per suit toggle
so I have no idea
Jokers apply effects at the end of round, and they also apply individual effects at the end of round
And maybe there's repetitions at the end of round
put a return of some kind
what does the "Mipmap level" do?
So you need to check for more context
even just a blank return
it's something to do with textures
I don't think we should care about it
how do i change a joker's atlas position depending on a config variable?
yeah that didnt work...
uhh, this is deleting every card held in hand when i play a hand
oh nvm
im returning true no matter what
maybe check Bunco's tape
@placid star
bunco's tape?
oh wat other context would u think?
ok i looked at it and nope
hm?
it has each joker as its own png
has sombody localized a mod before?
someone has
is bcs i have a localization/"lang".lua and the joker has a blank name and desk onn avery lang "lang" is the lang code
what's the localization file looking like
return {
descriptions = {
Joker = {
cdv_cosmic_devourer = {
name = 'Cosmic Devourer',
text = {"{C:legendary}Legendary{} Joker", "When leaving shop, {C:red}consume{} random Joker",
"Gain {C:mult}+#1#{} Mult and {C:chips}+#1#{} Chips",
"Create {C:dark_edition}Negative{} copy of", "consumed Joker {C:inactive}(Excludes self)"}
}
}
},
misc = {
labels = {
k_cosmic_feast = "Devoured {C:attention}#1#!",
a_cosmic_power = "+#1# Mult, +#2# Chips"
}
}
}
missing a j_
does anyone know how to make the amount of chips this joker gains a variable?
SMODS.Joker{
key = 'Blue Card',
loc_txt = {
name = 'Blue Card',
text = {
'This Joker gains {C:blue}+10{} Chips',
'when any {C:attention}Booster Pack{} is opened.',
'{C:inactive}(Currently {}{C:blue}+#1#{} {C:inactive}Chips){}'
}
},
atlas = 'Jokers',
pos = {x = 0, y = 0},
config = { extra = {
chips = 0
}
},
rarity = 1,
blueprint_compat = true,
loc_vars = function(self,info_queue,card)
return {vars = {card.ability.extra.chips}}
end,
calculate = function(self,card,context)
if context.open_booster and not context.blueprint then
card.ability.extra.chips = card.ability.extra.chips + 10 -- TODO: find out how to make the chips it scales by a variable
return {
message = 'Upgrade!',
colour = G.C.BLUE
}
elseif context.joker_main then
return {
chips = card.ability.extra.chips
}
end
end
}
j_PREFIX_JOKERNAME
variables in config can be named anything but chip_mod or extra is probably your best bet
you can define it inside config.extra
then you refer to it the same as extra.chips
I'm doing some bug testing- how does one log something to the console?
i used chip_add = 10 and chips = 0 and it gives me this
print()
whats loc_vars look like
oh, i may be stupid hang on
loc_vars = function(self,info_queue,card)
return {vars = {card.ability.extra.chips}}
end,
youll want to return multiple vars
{ vars = {card.ability.extra.chip_add, card.ability.extra.chips}}
#1# will always refer to the first one here then #2# the second etc
so if you dont return enough vars it defaults to nil
Can anyone tell me how I would display a message on a joker from the "add_to_deck" function? My first thought was to just send {message = "insert message"} in the return statement just like you would at the end of the calculate function, but that isn't doing anything. Figured it out, I used SMODS.calculate_effect({effects}, card)
whats the proper way to use context.repetition?
The rep context has examples displayed in the smod example jokers in the sock and buskin section
how do i make a card debuff itself
how can i localize the name and desc of a mod?
SMODS.debuff_card(card, true, card)
thanks
can i replace card with self in this instance
or must i use card
wait
stupiud question
n vm
how do you change them btw? i get the flip thing but is it like flip -> destroy -> create? dont they have their own animations too
card.ability.odds probably?
oh
but im just giving it context.other_card at times when context.other_card shouldnt be nil
the context.destroy_card does not have context.other_card in it i think
i think in context.destroying_card, context.destroy_card is its version of context.other_card
in the calculate function, can you use self to change the key and atlas of a joker ?
or is it just card.key
yep that fixed it
are you trying to change the sprite of it? because i don't think changing the key and atlas directly would change the sprite (i would know because i tried that myself)
ah
well there goes that idea
ill just have to destroy and create then
there's an example of like
someone changing the sprite
but i don't remember who did it
i'd say look at like
oh look at cryptid's double sided then
ofc
do you need all instances of the joker to be changed or just one of them
each joker would have its own round counter
so if you had a showman and bought the same joker in the next round, then it would transform one round after original
so just one of them i suppose?
ok if it's just an instance at a time you can do joker:set_ability("j_modprefix_otherkey")
oh sick and that chages everything about the joker? loc_vars, calculate, sprite, etc
yeah, it makes it into the other joker
but keeps editions and stickers i think
that should be fine since the joker its changing into cannot be bought
its an upgrade
with "i think" i mean i dont know if it keeps anything else, i know it keeps that
is it possible to track the number of hands played in an ante
if context.end_of_round then
card.ability.extra.rounds = card.ability.extra.rounds - 1
if card.ability.extra.rounds == 0 then
card:set_ability('j_csmr_ladymistborn')
end
end
like so?
yeah
awesome
remember that end_of_round runs multiple times
it does?
okay yeah it does...
now why would it do that
does context.setting_blind do that too?
so does smods just fully make the high contrast setting in options not do anything at all in favor of the individual suit toggles in the customize deck menu? that's what it seems like but i can't quite tell
do any of you know any mod incompatibilities that would cause this error?
[SMODS _ "src/overrides.lua"]:1669: attempt to index local '_center' (a nil value)
line 1669:
for key, _ in pairs(deck.wins_by_key or {}) do
oh hi toma
basil,,,,,,,,,,,,,,,,,,,,
was it you who pinged me i think it got lost in the chat
i did
idk
😅
ohhhhh hey
halo
well what happened (i cannot find it for the life of me)
no worries, i was wondering if you achieved this by doing this
card:flip()
card:set_ability('j_csmr_ladymistborn')
do you do it within context.end of round ? because when i try to do the same a. it runs that particular context multiple times, b. it stays flipped for a long time before flipping back in the middle of the cashout screen
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.15,
func = function()
card:flip()
return true
end,
}))
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.15,
func = function()
card:set_ability(G.P_CENTERS["j_yourmodid_yourjoker"])
play_sound("card1")
card:juice_up(0.3, 0.3)
return true
end,
}))
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.15,
func = function()
card:flip()
return true
end,
}))
legend
what context dod you use for it
whatever context i want it to occur in
right because i learnt today context.end_of_round runs multiple times so i was wondering if this would make it flip unlip multiple times if i were to define it within that
but i suppose once the ability is changed, it wouldnt happen?
it's in calc_dollar_bonus
i see okay that makes sense
i'm trying to write a function using a mathematical formula, is this correct?
you did it so its not connected to the round stages but rather the joker itself
i think?
mystic summit example
also, is there a way to perform arithmetic on your score after the ChipsXMult operation?
ive been looking into multiple ideas but im a bit stumped
since literally nobody has done this before to my knowledge
Hey chat
im trying to make what i thought was a simple mod, but has quickly proven troublesome.
i want all stickers except gold (including no sticker) to show up as red x's and gold stickers to show up as green checkmarks. The issue arisies from me not super understanding how to get this to work with malverk.
I looked at similar mods and found the less intrusive sticker mod, but that isnt malverk compatible and i would like my mod to be
any help/resources is greatly appreciated!
I can also share my current code if wanted
it runs individually for each card with context.individual
you can do this (i have a snippet for it)
ah okay, thank you
how do you check if a specific poker had is played (not if it contains it)
could you not just do
if context.before and next(context.poker_hands['Straight']) and not next(context.poker_hands['Straight Flush']) and not context.blueprint then
or something
context.scoring_name?
is there a list of every "context" and what they do anywhere
https://github.com/Steamodded/smods/wiki/Calculate-Functions lists a bunch in groups.
calculate = function(self, card, context)
if context.before and context.cardarea == G.play then
print('step one')
for k, v in ipairs(context.scoring_hand) do
print('i am in loop')
if v:is_preservation() and not SMODS.has_enhancement(v, 'm_glass') then
print('this is preservation card')
if pseudorandom('lady_mistborn') < G.GAME.probabilities.normal/card.ability.extra.odds then
print('being glassed')
v:juice_up()
v:set_ability(G.P_CENTERS.m_glass, nil, true)
SMODS.calculate_effect({message = 'Glassed!'}, card)
else
print('not being glassed')
SMODS.calculate_effect({message = localize('k_nope_ex')}, card)
end
end
end
end
end
what am i doing wrong here, im getting no prints in my game
like even print('step one') this isnt happening
context.cardarea == G.play doesn't exist in context.before
documentation wrong?
-# This is for a Joker, Enhancement or what?
joker
Then use G.jokers.
Probably for enhancements.
i see...
it worked thx
np!
what have i done wrong here? i'm trying to take the additive factorial of the round score after the ChipsXMult operation
What area/table are cards in when you open them in a booster pack while they are waiting for the player to make a selection?
I tried G.hand.cards, but that wasn't it
G.pack.cards
It's G.pack_cards.cards
ty
-# I am not immune to getting things close, but still wrong.
bump
crashes when playing a hand with "attempt to call a table value"
ah i see
i havent mastered syntax yet
i think i've gotten the context wrong lmao
it's performing the operation, but only before playing a hand
for some reason
literally the opposite of what the documentation says
Does anyone know what the context is for right when a hand is finished playing/after the ChipsXMult operation?
so, after all the scoring?
as you can see, it's modifying the round score, but only before scoring
i want it to work after scoring
everything you do in calculate runs before scoring, the steps apply for what you return in calculate
im a bit lost in here, am i doing it right
how would i run it after scoring then?
an event probably
hm
anyone have experience with drawing an extra layer on top of cards with an enhancement? i thought i had it working by just setting a sprite and using draw_shader('dissolve', ...) but it doesn't show up with certain editions for some reason (any besides foil
question, what happens if two different mods try to take_ownership() the same thing, for different purposes?
for instance, mod A wants to alter... uhhhhh... let's say certificate? to adjust it to account for some custom seal it adds (even though this is a bad example and you'd probably do that by hooking poll_seal(), bur there's probably some kind of mod functionality that requires a take_ownership() to properly accommodate it, idk) and mod B wants to alter it to redefine its loc_vars to make it have a main_end for whatever reason - maybe smth like predicting the card and seal it'll create, idk not that great an example, but yeah
what happens? do those two things conflict or what
They both should do it in order of priority.
i thought as much, but i didn't want to assume 
ok, i want to make a joker only show up when a mult card is enhanced in the deck, like how luckycat and glass joker work. where would i go about writing that? i know it cant go in the joker function, would i need to make a new function at the end or is there an easy way to just use the one the game uses?
Use the in_pool function. If return true, the Joker will appear in the Joker pool. If return false, it will not.
don't do that, jokers have a function specifically for that
set enhancement_gate = 'm_mult' in your joker definition
same place you define rarity cost etc
-# Ah, another undocumented feature.
but for stuff other than specifically enhancement requirements yeah the in_pool function works
i'm not sure how to use events to make this work
what's the problem
i've never worked with events before
YES, thank you. i knew there was something like that but i didnt know what it was
I think this might work for your effect
im not sure if the ease event gets blocked tho
hm
if not then you want to do
G.E_MANAGER:add_event(Event({
func = function()
-- your effect
return true
end,
}))
alright i'll try this
does anyone know how i could make a joker that only activates once per shop? (also I'd like the description to change depending on whether it's active or inactive)
where is the syntax error here im so lost
hey guys is there an inherant way to change the spawn rate of specific sets of consumables without using something like soul_rate?
I have my own set of planet cards that kind of clog up the planet pool for other modded planets, so I want to make all planet cards that aren't in my mod or vanilla 3x more likely to appear to balance that out
Hello, I'm really new to modding and I'm trying to make a tarot which enhances a card, but I cant find a function like "set_edition" for enhancement, am I missing something ?
you're missing an end before the return
also don't check for the context inside the event do it outside
oh i think i see
oh and inside calculate lol
this is so weird lmao
enhancement conversion tarots are built in, set effect = "Enhance" and config = { mod_conv = key, max_highlighted = # }
and if you want to be consistent add it to the info_queue to make it the enhancement's description show up on the side by adding info_queue[#info_queue+1] = G.P_CENTERS[self.config.mod_conv] in the loc_vars function
-# dm me if you need more help this is a probably a lot if you're new
Ohhh so that's why, thank you very much 👍
should be like this
is this right?
oh wait
yeah
that seems right
doesn't seem to be doing anything ingame though
is it the same as before
wdym
like, is it not working or is it doing the same thing as it was before?
oh you might need to manually update the text if you do it after scoring
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
i haven't done any personally that trigger on/after the final scoring step so i don't know for sure but the ones i have done I always have return the chips/mult value so i assume you'd need to do that after calculating it no?
i cant even tell what its doing at this point
i think you're just setting your round score chips value which does nothing because it's immediately overwritten by the actual scoring bit
one sec lemme try
maybe you need to use after yeah
wdym
have you tried this
I would think update_hand_text() would be preferable
I wanted to develop a mod; anyone have any suggestions where to start?
used 42 times compared to setting G.GAME.blind.chip_text manually being only used once, and thats defining the ui
Simple Jokers first, then branch out to consumables and such.
but i dont think they do the same?
also oops.
can vouch, this is where i started too !
it seems to work without this
unless i misunderstood you
What is the exact result wanting to be achieved?
changing the scored chips
not the poker hand text
grey
every time im helping someone you come in the middle of the conversation and give solutions confidently without understanding the context lmao
ive already achieved the desired effect lol
Does anyone know what file contexts are defined in?
tysm for the help
be it vanilla or smods
many of them
look for SMODS.calculate_context
I've not had much luck tracking down what I'm looking for w/ that but I'll give it another go
what are you looking for?
You gave the wrong answer to their problem?
No I didn't, read what I said immediately before
they didn't
one sec, I may have actually found it. I'm still on my context.stay_flipped shit
trying to figure out if I can grab where the card is coming from so my stuff stops getting affected on the way to play and when they're discarded/exit play
it should have to_area and from_area
okay cool that's what I thought
I swear I tried that before and it didn't work
okay, it does seem to tentatively work! maybe I just missed something last time
im trying to modify joker stickers without modifing the stake icons, but right now this is doing the opposite-- can anyone give suggestions?
--- MOD_NAME: simple stickers
--- MOD_ID: hazel-sticker-adjuster
--- MOD_AUTHOR: [hazel410]
--- MOD_DESCRIPTION: turns gold sticker into checkmark, and everything else to red
X
--- PREFIX: stiadj
--- VERSION: 1.0.0
--- DEPENDENCIES: [malverk]
AltTexture({
key = 'sticker',
set = 'Stake',
path = 'stickers.png',
loc_txt = {
name = 'simple stickers!'
},
original_sheet = true
})
AltTexture({
key = 'sticker',
set = 'Stickers',
path = 'stickers_stickers.png',
loc_txt = {
name = 'simple stickers!'
},
stickers = true,
original_sheet = true
})
TexturePack{
key = 'hazel-sticker-adjuster',
textures = {
'stiadj_sticker',
},
loc_txt = {
name = 'simple stickers',
text = {
'simplifies the stickers',
}
}
}```
Does anyone know why this crashes?
SMODS.Joker{ -- Orange Card implementation
key = 'Orange Card',
loc_txt = {
name = 'Orange Card',
text = {
'This Joker gains {X:mult,C:white}+X#1#{} Mult',
'when any {C:attention}Booster Pack{} is skipped.',
'{C:red}Works once per shop{}',
'{C:inactive}(Currently {}{X:mult,C:white}+X#2#{} {C:inactive}Mult and #3#){}'
}
},
atlas = 'Jokers',
pos = {x = 1, y = 0},
config = { extra = {
xmult_gain = 0.1,
xmult = 1,
is_active = true,
active_msg = "Active"
}
},
rarity = 1,
blueprint_compat = true,
loc_vars = function(self,info_queue,card)
return {vars = {card.ability.extra.xmult_gain, card.ability.extra.xmult, card.ability.extra.active_msg}}
end,
calculate = function(self,card,context)
if context.skipping_booster and not context.blueprint and card.ability.extra.is_active then
card.ability.extra.is_active = false,
card.ability.extra.active_msg = "Inactive",
card.ability.extra.xmult = card.ability.extra.xmult + card.ability.extra.xmult_gain
return {
message = 'Upgrade!',
colour = G.C.ATTENTION
}
elseif context.ending_shop then
if not card.ability.extra.is_active then
card.ability.extra.is_active = true,
card.ability.extra.active_msg = "Active"
return {
message = 'Reactivated!',
colour = G.C.ATTENTION
}
elseif context.joker_main then
return {
xmult = card.ability.extra.xmult
}
end
end
}
whats the crash log?
thanks N, that was totally it, I think I just mistyped something last time I tried it
get rid of these commas
it's in card.lua
oh i was using the wrong pluralization for telescope when I was searching lmao
you should set up your editor so it warns you
i love being evil
how do you detect the amount of cards played in a hand
trying to get the number of unique ranks in the player's hand, why is this still crashing from G.hand.cards being nil when hovered over? how do i cover for if it's nil (just returning a 0 instead)?
check for just G.hand instead
weird, alright
G.hand is nil if you are outside of a game so if you do G.hand.cards you're indexing a nil value
ah, that makes sense
works now, ty!
i am going insane why doesn't this drawstep render when the card has an edition
If Im trying to grab a random, suit and rank should I just use the same functions as Idol? or must I make my own function
bump
how exactly do quantum enhancements work?
this is the only reference in documentation
I know they let you use any enhancement without actually applying the enhancement itself but how would you use it
^unless im mistaken on how they actually work
does anyone know where i could find legendary backgrounds without the nameplates
thanks
does context.full_hand take unscored cards too
G.play.cards takes unscored cards
idk about context.full_hand
yes
how do I add a playing card to the deck
certificate/marble joker
then modify that card idk
does anyone know how to modify the layering of objects? A cardarea I created is sitting on top of a joker so I can't click or move the joker
the answer was card.children
jarvis, how do you use context.modify_scoring_hand
how do i grab a card's suit
i don't wanna check it against another suit i wanna save it as a value
so is_suit("Hearts") doesn't work here
card.base.suit and checking that it doesn't have no suit.
oh god what the hell do I do if a card has no suit
it shouldn't because this is happening at the very very start of a run
ii'll just make it default to clubs because i like that suit
has anyone noticed gluttonous joker is spelled wrong in its id
i was breaking my mind for like a good 10 minutes because of this
impressive
caino heirophant consumeables aswell.
everyone knows about consumeables
consumeables pissed me off a lot
yeah i have no idea how to make a playing card
it's crashing attempt to index P what the fuck is P
oh my god
Did you put a . instead of an _ when refrencing something like G.P_CARDS
yes
yes I did
I've done this so often
well
this is the exact opposite of what I wanted.
3
i'm trying to add more face cards
??????
why did it remove one of the jacks
why are there two extra 5s
IT'S RANDOM
WHY IS IT RANDOM
Magic ✨
erratic deck called
it wants its job back
fuck man
im changing my approach
fuck adding playing cards this shit dumb as hell
why does applying the negative then the negative_shine shaders to a sprite seem to make it way way more shiny than actual negative cards? comparing directly side by side
alright how do I change card ranks then
surely that will be easier
SMODS.change_base(value, nil, "11") isn't working
value is an existing card it doesn't crash
it just doesn't do anything
it crashes when i assert it
I used to assert it but removing the assert made it work for jokers
rah.. idk
Doesn't assert just crash the game if what it contains returns false?
hmm
This is what strength does.
calculate = function(self, card, context)
if context.final_scoring_step and context.cardarea == G.jokers and G.GAME.current_round.hands_played == 0 then
if #context.full_hand == 2 then
print('only 2')
card.ability.extra.destroy = true
end
end
if context.destroy_card and card.ability.extra.destroy then
for k, v in ipairs(context.full_hand) do
print('destroying')
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
v:start_dissolve()
return true
end,
blocking = true
}))
return {
remove = true
}
end
card.ability.extra.destroy = false
end
end
help how am i deleting the whole deck here - point is to destroy 2 cards if first played hand had only 2 cards
Anyone know whats going wrong here?
You don't start_dissolve when using context.destroy_card
remove = true already does that.
ah
so i just remove the event then?
You should be doing ```lua
if context.destroy_card and context.cardarea == G.play and #context.full_hand == 2 then
return {remove = true}
end
how does it know which card to get rid of
Your destroying the whole played hand if there are only 2 cards played right?
yeah
ah okay so it only needs a sepcification when im not removing the whole hand
it doesnt care about those held in hands or joker area
awesome
thanks this works
well that doesnt seem right
The text is sample text copied from another joker so it looks messed up. please ignore the top line
What does your joker do?
Creates a [Tarot] when played hand contains a [Rank] and a [Suit]
this seems to only remove scored cards
Replace context.cardarea == G.play with (context.cardarea == G.play or context.cardarea == 'unscored')
awesome ty
You need to put localize(G.GAME.current_round.alchemist_suit.rank, 'ranks')
Still aint working, maybe I messed up to hook
Its using some of example jimbos code for hooks
Did you replace localize(G.GAME.current_round.alchemist_suit.rank)?
chat am i cooking
Yup
i think
ok I thought I knew what I was doing but I'm still running into issues. Does anyone know things about card draw order?
currently: joker has a child cardarea, cards in cardarea draw on top of joker
goal: joker draws on top of cardarea
i hope to god this works
what is the context for cards held in hand?
context.individual and context.cardarea == G.hand
tyty!
It does depend on what you’re wanting them to do though
just a enhancement that gives $6 when held in hand
like steel joker but gives $6 dollars
After scoring or during scoring?
after scoring
context.after and context.cardarea == G.hand
tyy!
is that it
what are you trying to do?
if hand no straight base mult and chips are 1
i think you should make
vars = {ch = 1, mult = 1} instead of just vars = {1, 1}
but ive never messed with debuff or blind so im not sure
ive only messed with enhancements and some jokers so far
I think as is it should work
But I haven’t used collection localization variables
I just imagine they have the same syntax
Why use the Blind to save the values though?
It is better coding practice but the way Blinds are implemented it’s more like jank IMO
what is the context for enhancements giving ppoints when held? like during scoring, like the steel card make
i forgor
and i lost the code that already had it
guys i'm safe: https://typescripttolua.github.io/ 🤙
You are not safe.
no? 
what is this cursed logo
Did you make a Vtuber typescript logo
no
they even have this: https://github.com/hazzard993/love-typescript-definitions
why is it saying nil?
Do you have loc_vars?
yeah
What does it look like?
glad you found your issue, but a monospaced font could help you identifying problems faster btw
what is a monospaced font?
a font where every character has the same width
look at this for example
ooh gotcha gotcha, ty!
it seems like just another preference thing but trust me
github has a nice free font here: https://monaspace.githubnext.com/
but there's a lot online
how do i make it so a card only is removed after it is fully scored?
i have a card that after 3 uses is destroyed, but as soon as it is used the last time it is destroyed before scored
Use context.destroy_card
how would i use it?
Replace the remove one with ```lua
if context.destroy_card and context.cardarea = G.play then
return {remove = true}
end
but then how will the game know that it have to destroy after 0 uses?
Also check for that.
i think ill just catch some sleep and try again tomorrow, its already 5:34AM and i dont sleep since 11AM from yesterday
im too eepy to figure out how to do things
gngn
how do you make a joker that bases its values from joker slots like joker stencil
try checking into stencil's code! always gives a little help to look at how balatro does things
something with G.jokers.config.card_limit
if self.ability.name == "Joker Stencil" then
if (G.jokers.config.card_limit - #G.jokers.cards) > 0 then
return {
message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}},
Xmult_mod = self.ability.x_mult
}
end
end```
what do i put in loc_vars to make this show up properly?
Change n to score
Useful for game text in game dev
i also think i've formatted these wrong too
What a unique font to use
specifically the #1# part and the +(score) part
Balatro font 💀
how do you use inter mod patching?
have target be like
=[SMODS modid filename] i think that's what you are looking for
oh yeah i figured that out
what would the loc_vars function for the fortune teller look like
🤔 alr
Function that returns { vars = { card.ability.extra.<variable for mult gain>, card.ability.extra.<current mult variable> }}
this was annoying to add but now colour cards have jokerdisplay support
wait what about steel joker
how can i change the required score of the current blind?
how should I word/format this? should I say "evenly divisible?" should I highlight Total? do I even need the word total?
G.GAME.blind.chips = number I think.
🤔 "X3 Mult if total money ends in 5 or 0"
balatro doesn't refer to money as "$$$" i think, as you see with wraith
ok so the reason I have it not as 5 or 0, is that I might change the divisor to another number
i feel like 5 is fine anyways
if I determine 5 is too annoying to get consistently
thank you
ah yeah, couldn't think of an example of the game broadly for money so wasn't sure how to word it
forgot about wraith
oh there's also ox isn't there
ok yeah money works then
yeah that too
how did u do it? maybe i can add it natively
what if money has a decimal point
I mean that just can't happen in vanilla right, and I wouldn't have any like that in my mod