#💻・modding-dev
1 messages · Page 365 of 1
N i managed to pull off the jump cards
they are genuinely insane
with the first effect or with the changed one
i implemented them completely differently
tbh i find how i did them to be quite clever
Hey N
Heaven!!!
hii
hi!!!!
Hey garbb !!!!
have you seen the jump cards
i am so proud of these
I love the art
thank you! i'm more proud of the code really
they work and they allow for FLUSH FIVE STRAIGHT
You always cook
😭pick a side bro
smth like this?
if self.debuff then return nil end
if context.final_scoring_step then
for k, v in pairs(context.full_hand)
do if not SMODS.has_enhancement(v, “m_stone”)
then stone = false
return { balance = true }
end
end```
i'm gonna add Straight Four, Straight Five and FLUSH FIVE STRAIGHT tomorrow
yes FLUSH FIVE STRAIGHT is always uppercase
Flush five gay when
excuse me flush five straight?
soon
Bro’s serious
evil and twisted poker hand
^
devious poker hand
Poker hand i need to pull to pay my debt
is it possible to use a trance function in another mod to edit the colour scheme? trying to make a midnight-type mode for a custom stake and i want to see if i can set the palette when entering a run on that stake
i mean there's missing logic there but yes
also you dont need to check for debuff because calculate already doesnt run on debuff AND self is not an object so it's never debuffed
Mods bring me his head
jump cards are truly the first thing i make where i can confidently say no one has made before
oh and calculate = function(self, card, context)
Anyways chat you have an amazing rest of your day i’m gonna head to sleep now
gn
ya me too
More jonklers pwease
gn chat!!
Gn pony
i probably should sleep too
me too goodnight chat
but this mod is driving me insane
Take a chill pill
do they have a default rank if they arent used in a straight
its an enhancement
ah
this is why they allow for Straight Four, Straight Five and FLUSH FIVE STRAIGHT
god i wish there was an easy way to check the origin of an event
i just had a mini heart attack thinking i accidentally completely deleted my jokestar runner work but then i ralized i just moved it to an obliquely-named folder to prevent it from showing up in the mod list until i was ready to work on the darn thing again
so at some point i'm gonna try and rewrite my king of town joker code because i feel like i completely messed it up when trying to take code from hollow joker which works completely differently
i need to work on making an enhancement that turns cards blank
it's a sign... gotta get it safe on github
yeah but it is not even REMOTELY ready for release yet and i'd have to update it incredibly oncstantly with how much i added
you can just keep it private and only push it every so often, any backup is better than none
even if you dont want to upload it just having local git is really good
I don't think the return { balance = true } works for what I'm trying to do, or I'm missing something that I don't understand
what does it do compared to what you want to do
from what I can tell, it does nothing regardless of played hand, what I want it to do is balance when played hand contains only stone cards
can i see the code? if it does nothing the logic might be wrong
that's what I'm thinking
calculate function rn is at:
if context.final_scoring_step then
for k, v in pairs(context.full_hand)
do if not SMODS.has_enhancement(v, “m_stone”)
then stone = false
return { balance = true }
end
end```
yeah that's missing a ton of logic like i said
that will balance when you dont play a stone card
Straight Pair when
what's missing the logic? the stone card part or the balancing part of it?
the stone card part, the balance is just the return
if context.final_scoring_step then
for _, card in ipairs(context.full_hand) do
if not SMODS.has_enhancement(card, “m_stone”) then return end
end
return { balance = true }
end
oh oops I forgot to save it again, that was an outdated one
also if the return doesn't work you just need to manually copy what the plasma deck does in back.lua
that's what I did originally and it kinda worked, but N told me about the return { balance = true } thing
let me know if it still doesn't work and i will test it myself in a bit
it might be an smods bug/restriction
I'll give it a try using both here in a sec
hi, how can i make a custom message?, like the message = localize('k_gold')
but i want to do one with the lucky cards
I'm having some problems with installing cryptid and entropy. Cryptid says I dont have talisman when i do and entropy says i dont have cryptid. im installing from balatro mod manager btw.
add it to misc.dictionary in a localization file
like this?
i'm having an issue where the game is saying my lua file is calling on a nil value, but i don't see anything wrong with it. would anyone be willing to take a look at my code and see what the issue might be?
im going insane
for some reason
when i have no cards in my hand
my event queue gets filled up with what seems to be calls of ease_value??
at least, the event that's generated during ease_value
if
(context.joker_main and context.scoring_name == card.ability.extra.type and context.scoring_hand[1].base.suit == "Hearts" and context.scoring_hand[2].base.suit == "Hearts")
or context.forcetrigger
then
return {
message = localize({
type = "variable",
key = "a_powmult",
vars = { number_format(card.ability.extra.mult) },
}),
colour = G.C.DARK_EDITION,
Emult_mod = lenient_bignum(card.ability.extra.mult),
card = card,
}
end
end,```
ye
cant find where cc is created? which file is it
any idea why this exponent isn't applying?
should be a ^2 mult if played hand is a royal flush of hearts
maybe smods/util or something
i genuinely cannot find a call of ease_value that would maybe cause this
how would i write out the name and description of a rarity in a localization file
ok so where would consumable stuff be categorized here
would first checking for not context or final_scoring step be an issue? if I don't and I obtain a tower card, the game hard crashes
if not context or not context.final_scoring_step then
return nil
end
if context.final_scoring_step then
for _, card in ipairs(context.full_hand) do
if not SMODS.has_enhancement(card, “m_stone”) then
return { balance = true }
end
end
end
end```
just tried this, balance does not work. going to try it out with the plasma code
the game seems eternally locked into the drawing hand state until it gets a card
that makes sense
but also sucks for me
it shouldn't no
maybe you could fake it a bit, add a "UI element" that displays like "out of cards!" that's secretly actually a card
hook it and use context.using_consumeable like you would in a joker
oh literally ok
so i cant put in a description for a rarity like for enhancements
rarities dont have descriptions
in time G.hand will be useless and can be fazed out entirely
until then i kinda just gotta
deal with the issues it causes
this works perfectly for me
calculate = function(self, card, context)
if context.final_scoring_step then
for _, pcard in ipairs(context.full_hand) do
if not SMODS.has_enhancement(pcard, "m_stone") then
return
end
end
return { balance = true }
end
end,
Does the message show up?
nope
OKAYYYY TURNS OUT THIS WASNT IT
CAUSE I PATCHED IT. AND ITS STILL HAPPENING
or wait did the patch not go through
I get "attempt to index local 'context' (a nil value)" whenever I pick up a tower card
hard crash
does modding work on the gamepass version yet?
sure, just a sec
not yet
i think im gonna need some help with this first joker... how do i actually make it functional?
damn
what's the problem
no problem... im just new to lua and have no clue what anything does
IT DID WORK!!!! I CAN FUCKIGN SLEEPPEP
i tried following a turorial, but it just didnt make sense
i want to just start by giving the joker 5 mult
right there with ya brother
you are using really old smods syntax lol
would this work
yeah it was some template syntax I found on youtube to try and learn what I was doing lol
probably dogshit, but oh well
the logic is correct but you need to check for context.consumeable.ability.mod_conv or something like that
SMODS.Joker{
key = "joker",
name = "Joker",
loc_txt = {
name = "Joker",
text = {
"{C:mult}+#1#{} Mult",
},
},
config = {
extra = {
mult = 5,
}
},
loc_vars = function(self, info_queue, card)
return {vars = {card.ability.extra.mult}}
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.joker_main then
return { mult = card.ability.extra.mult }
end
end,
}
i recommend trying to copy the syntax for one of the smods example mods or the one i just sent
you dont need cardarea with joker_main
what is all that loc_vars stuff?
so more like
yes

what should I do with the rest of the file? is there anything important in there that I should keep?
When you have a #n# in your description, it replaces that string with the nth variable returned in loc_vars, so loc_vars allows you to dynamically change the description. It's good practice to do it with constants like this, too
or you can do context.consumeable.config.center.key == "c_devil" if you want the devil specifically and not every modded gold card tarot
other than the jokers and the atlas, no
but the atlas is defined differently now
nope
🙏
look at the top here https://github.com/nh6574/JoyousSpring/blob/main/src/jokers/01Dragonmaid.lua
(dont look at the rest it uses a lot of my mods exclusive stuff so it will confuse you)
what line am I looking to this shit is eldrich lmao
very top
now i have one more question
how do i make the card change its mult once ante 8 comes around?
ye im on phone so i didnt want to copy it :3
these are the conditions... i just have no clue how to make it follow that condition
all good, sweet
no way
a nubbys reference in my funny joker game?
nubbys number factory reference
(im making a mod out of all the custom joker ideas i see on reddit)
wacky, have fun with that
can you make the old void perk jake the snake build possible in balatro?
that could actually be interesting
question is would i make the void perk count negatives or no?
lmao well, does stencil?
although i guess jake wouldnt be too op in balatro
fair enough
the logic wasnt correct 😔
utils crash at line 1700: attempt to index local ‘context’ (a nil value)
oh replace self with context in the return, it doesnt take self
once i get better at modding i might do some more nubbys jokers
oh okay
for now though i want to keep it simple
does it matter whether you use ' or "
a dedicated nnf mod could be cool though
no
thanks n
Trying to hook Card:use_consumable, and I'm not sure what I'm missing. Ankh is the only consumable that works now, the rest immediately crash the game. Anything obviously wrong?
local olduseconsumable = Card.use_consumeable
function Card:use_consumeable(area, copier)
if self.ability.name == 'Ankh' then
"code"
else
olduseconsumable(area, copier)
end
end
should I be using the atlas for every new joker entry?
:3333 GOT IT
how do i make my joker change to 50 mult after ante 8?
no, it's better to use one for all jokers or at least one for each category of jokers
so I should leave that atlas up at the top like it's formatted in your lua file
i like putting it at the top but the order doesnt matter
random question, why does the first joker use the joy_ prefix for the atlas name but none others do?
try
extra = {
early_mult = 5,
late_mult = 50
}
...
local ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante
return { mult = card.ability.extra[ante >= 8 and "late_mult" or "early_mult"] }
that was the first joker i made and i thought i needed it
smods removes the prefix if you add it
ah
balatro mod but it praises lebanese food
how did you pull from the assets folder properly? I noticed you don't use the path param like it recommends in the smods documents
but not for each joker, just in the atlas
how do I pull separate pngs from one file through the atlas?
you can't put the path for each joker
in that case I have this file with all the jokers
if i want the top left i do pos = {x=0,y=0}
if i want the 3rd purple one i do pos = {x=2,y=2}
theres probably something obvious im missing.. but i have no clue where to put the end statements here
is it difficult to add in jokers in the future with that kind of format?
I would recommend learning some lua basics then.
But it's for example at the end of if and for statements and function definitions
those 2 lines should be inside the calculate function and behind a context check
my homie's currently in the process of pumping out cursed joker designs lol
youd just need to add more jokers, replace the pngs, and have the new jokers point to the new positions
there are programs that let you add to it easily, i dont add extra ones so i couldnt tell you
i think you can do it with asesprite using tilesets
or something
i waited until i had all the jokers i wanted in the png before starting to code lol
oh dope, I'll look into that
i mean if all fails you can do an atlas for each
true, I'm just not sure how many jokers my homie plans on making lol
i know cryptid has like 3 different atlases, each with a diff key to it
i have like 25
you can just expand your atlas and all you have to change is the atlas definition, very extendable
but i also have 330 jokers
lemme count up mine because i should have a list somewhere of whats planned on being added
actually you don't even need to update the atlas def because that just takes the tile size, you just add more jokers onto the edges and use the new coords
In case anyone else has this question you just gotta add self as the first argument in the return
local olduseconsumable = Card.use_consumeable
function Card:use_consumeable(area, copier)
if self.ability.name == 'Ankh' then
"code"
else
olduseconsumable(self, area, copier)
end
end
my plans are
Jokers - 52
Tarots - 1
Spectrals - 1
Vouchers - 2
Enhancements - 1(?)
Decks - 4
so why is line 8 giving me trouble now?
If there's an syntax issue there I can't see it, maybe something off-screen at the top? Couple other issues though: you don't need to do {C:black}, you can reset the color with just {}, like{C:color}colored text{}; and you aren't using loc_vars because you don't have any #n# vars in your description, it should be a calculate function instead
crash was because you forgot to save btw
possible, but im pretty sure i did save
i had one bad experience with a game i was making a while back, and now i save every time i make an edit
huh
well damn
that dot means file was modified and hasnt been saved yet
i believe its "self, card, info_queue" as the function parameters
you have info_queue and card swapped
no, it's info_queue in the middle
ah hm
wait why is it named calculate
ah i see
change parameters to "self, card, context"
nope, that caused a crash
can u send code
SMODS.Joker {
key = 'joker2',
loc_txt = {
name = 'Cheese House',
text = {
'{C:red}+5 {}Mult.',
'If current {C:attention}Ante {}is {C:attention}8,{}or',
'higher, {C:red}+50 {}Mult instead'
}
},
atlas = 'cheese house',
pos = {x = 0, y = 0},
blueprint_compat = true,
rarity = 1,
cost = 4,
config = {
extra = {
early_mult = 5,
late_mult = 50
}
},
calculate = function(self, card, context)
local ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante
return { mult = card.ability.extra[ante >=8 and 'late_mult' or 'early_mult']}
end
}
uh
how do yall do the embed thing
```lua
<code>
```
?
thats how you embed the code in a code box, you put the code inside that kind of text
e.g.
```lua
while true do end
```
becomes
while true do end
you need to put the code in the calculate function behind a context check
if context.joker_main then <those two lines> end
SMODS.Atlas {
key = 'cheese house',
path = 'cheese house.png',
px = 71,
py = 95
}
SMODS.Joker {
key = 'joker2',
loc_txt = {
name = 'Cheese House',
text = {
'{C:red}+5 {}Mult.',
'If current {C:attention}Ante {}is {C:attention}8,{}or',
'higher, {C:red}+50 {}Mult instead'
}
},
atlas = 'cheese house',
pos = {x = 0, y = 0},
blueprint_compat = true,
rarity = 1,
cost = 4,
config = {
extra = {
early_mult = 5,
late_mult = 50
}
},
calculate = function(self, card, context)
local ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante
return { mult = card.ability.extra[ante >=8 and 'late_mult' or 'early_mult']}
end
}
idk if that will fix the crash, depends why it's crashing, but it is something you want
this is probably a dumb question, but is there a way to make an edition that uses an image file instead of a shader
so would i put it below the calculate function in that case?
is that what im understanding?
calculate = function(yada)
if context.joker_main then
local ante = yada
return yada
end
end
anyone know why my stake sticker is returning an error?
ok, so it is what i was thinking
code?
but why 2 end statements?
oh,,, i found out why
is there a way to insert a picture into a custom joker?
sorry, no clue :(
what do you mean by that?
for an atlas sprite sheet do you need both a 1x and 2x?
ok so the joker is half working again... but ante 8 is not giving 50 mult
it stays at 5
i have 0 clue about programming or modding or anything lmao but i rly wanna create a custom mod for this game
is there a way to change the text when hovered?
and i been wondering if one can just put a picture on the joker while creating the joker
semantic nitpicking but obviously there is...you can literally change everything
hm, I based the ante get off of how Hieroglyph/Petroglyph work, but you can try print debugging it to see if that's wrong
What that means is, you add a print(ante) line and check the lovely console to see what values it's set to at different points
i mean, i think i found the code for it in the source code, but idk how would i change it from the mod
I don't know what you mean by inserting a picture or putting a picture on, like an additional layer on top of the base image?
lovely patches?
i mean do u make the art urself when u create jokers? or do u download pictures and put it as a layer
how does the process work
how does that work?
so all i get from print ante is nil
the game takes an image, usually an atlas (a sprite sheet), and that's the image it uses for the joker. you create an Atlas object with SMODS and tell it what dimensions each tile on the tilesheet has (the default Joker dims are 71x95), and then when creating a Joker you point it to the right coordinate, like { x = 0, y = 0 } for the top-left-most tile. reference another mod as a base if you're unsure
the images themselves can be anything
Oh hell yeah
btw amary, you are absolutely goated... your help is amazing to have
does anyone know where I should put sprite sheet for my atlas?
does 1x and 2x even matter when you're using an atlas?
afaik you need 1x and 2x but I haven't tested it, just copied what Extra Credit was doing
you do, it crashes if you have pixel smoothing on/off
so... what is the fix if the print ante function only gives my nil?
I have assets/Nx/jokers.png and atlas path = "jokers.png"
i think thats why the change to 50 mult isnt happening, but how do i fix it?
I'm not sure, it seems like it should work. double check, what code do you have?
how should I pull from two sprite sheets using atlas?
you just register one atlas and it handles the 1x and 2x variants
config = {
extra = {
early_mult = 5,
late_mult = 50
}
},
calculate = function(self, card, context)
print (ante)
if context.joker_main then
local ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante
return { mult = card.ability.extra[ante >=8 and 'late_mult' or 'early_mult']}
end
end
}
oh dope
Is it okay if someone could help me out
oh, it's nil because you're trying to print it before the variable is declared and given a value, the print needs to be after the line beginning local ante
wdym
So I tried to install the Balatro Mod Manager on the steam deck to play the Balatro Mod but I can't seem to get it to work is it okay if someone could send me a already install version of it through a Zip File
i have 0 idea about modding or programming but i rly wanna get into those stuff and make a mod for balatro
in case u wodnering why i sound clueless its because i am lmao
have you looked at this
#1349064230825103441 message
modding is honestly a pretty good way to learn programming if it's in your nature to throw yourself at a problem and figure it out yourself, since you have a pre-built reference to meddle with
I mean we will see how it goes lmao
holon imma look into it
I'm going to figure out how to do it on steam deck
THIS IS SO FIRE
ure goated fr
and u too yall fr nice ash
❤️
good news... i think the issue was because i was using debug to set the ante to 8
ima do a quick cheese house run to see if naturally reaching 8 does the thing
hm, I don't think it should matter since it's getting evaluated when the jokers are being calculated, so there's no event to miss by bypassing it, but maybe?
fr tho thank you guys, I've gone from a blubering idiot who thought I might know what I'm doing to a blubering idiot who knows I have no idea what I'm doing
y'all have been a huge help
naw you've got it, just gotta reference what other mods are doing and you'll be alright. Extra Credit is a good reference
i came into this channel earlier not knowing any lua and came out with a mod you guys are goated
sweet! cheese house is now fully functional
(self deprecating humor, it's genuinely been really fun learning lua)
hey, awesome! now you can take that as a base for making new jokers
indeed i can! thank you so much for your help! couldnt have done it without you
welp... off to reddit to find more jokers to make
i need to start working on my own mod again too..
to the person who deleted their comment, if you add a new deck for debugging, you can set a bunch of options really easily, like ante_scaling = 0.5 in the config
does anyone know how to do randomness without a listed probablity? (not affected by Oops All Sixes, trying to generate a random number)
simply call pseudorandom
OA6s only affects G.GAME.probabilities.normal which you have to explicitly test against
how can you reliably locate a ui element by it's ID
like, i cant do G.round_eval.UIRoot.children[0].config.object:get_UIE_by_ID('cash_out_button') for some reason and I can't figure out why
it worked before with blind buttons
how do you add hands and discards
how the hell did he open smods
or whats the program is he using
what parameters does pseudorandom take? i can't find lua or steammodded documentation on it
in the video
bump
haven't seen the video but probably vscode
i see isee
a string for the seed
pseudorandom(seed, min, max)
I've done everything I can think of, and still no real change on negative or any of the ones which aren't doing much of all. Some of those work a lot better if I don't render the dissolve shader first, but idk how to check for if it wants that, the method built in doesn't seem to work
ease_hands_played and ease_discard
tyy
how can i make it so that the spectral card shader isn't drawn for a specific spectral card
wanna make it so that this one doesn't have the weird sheen
bump again
seriously nothing i do works
how do i check how many playing cards are played (not scored)
#context.full_hand
so ehh how did he use the smods as a header
i assume its how he starts the program to make the mod
i recommend using the json instead but both are explained here
https://github.com/Steamodded/smods/wiki/Mod-Metadata
bump again G.round_eval:get_UIE_by_ID('cash_out_button') returns nothing even when the cash out button is visibly present
did something patch out that id?
nope
also are you sure it's under that root?
afaik it should eventually with:
UIBox{
definition = {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={id = 'cash_out_button', align = "cm", padding = 0.1, minw = 7, r = 0.15, colour = G.C.ORANGE, shadow = true, hover = true, one_press = true, button = 'cash_out', focus_args = {snap_to = true}}, nodes={
{n=G.UIT.T, config={text = localize('b_cash_out')..": ", scale = 1, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
{n=G.UIT.T, config={text = localize('$')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}}
}},}},
config = {
align = 'tmi',
offset ={x=0,y=0.4},
major = G.round_eval}
}
this is from add_round_eval_row
does get_UIE_by_ID go through multiple UIBoxes or only one?
no clue
that might be it
here's how it looks without rendering dissolve first
but then it ruins some like foil
if you're just trying to interact with the button, it might be better to simply call G.FUNCS.cash_out with a faked node
all it does w/it is do e.config.button = nil
ok i kinda get it now
any ideas?
seems like it prevents resursive valls
that's supposed to prevent repeat interactions
ohhhhh
that .button tells the node what to do on click
so if you G.FUNCS.cash_out { config = {} } it should work fine, then
isn't there a field for if it replaces the dissolve shader?
or was that only on enhancements
ahhhh ok
card:should_draw_base_shader() doesn't seem to work
yo i'm in the process of rewrighting one of my joker's sphaghetti code, if the joker is supposed to gain 50 chips every time a card is destroyed, am I supposed to use both if context.destroyed_card and if context.remove_playing_cards? or is that redundant?
maybe try checking p_edition.override_base_shader or p_edition.disable_base_shader on the edition center?
y'all- i need opinions on if she should be buffed or not. i am thinking of raising the 1.5 to 2, since this is like a more niche version of Canio
maybe tack on a marble joker effect and lower the xmult gain? Otherwise this seems super hard to enable
yeah im having difficulty figuring out how to make her work well since like
the character she's based off of, her whole thing is destroying stone related things
so it wouldnt make a lot of sense for her to make them too
maybe i can make her rare and lower that 1.5 to 1
destroyed_card is never actually used, just remove_playing_card
(context.destroy_card on the other hand is used to actually destroy cards)
hello, there is a great mod called first round joker made by LnxFCA. it lets you pick your first shop joker, but the joker always has a negative multiplier which is not possible in vanilla play, is there a way for me to remove this and add the normal, foil, multi and poly chances to this selected card?https://www.nexusmods.com/balatro/mods/105?tab=files
marinara'd?
i recommend checking my vanilla rewrite mod instead of the vanilla code :3
would I have to use it as a dependency?
no, i mean for checking the code it's not an API
i think i may do this
whats the command on giving money for jokers like (give 10 at the end of the round)
where is the center that there would be on? I checked G.P_CENTERS[key] SMODS.centers[key] and G.jokers.cards[1].edition
there doesn't seem to be a center object with those parameters
G.P_CENTERS.e_negative, e.g.
in calculate return { dollars = value }
anywhere else ease_dollars(value)
oh i saw the edit
for that you need calc_dollar_bonus
Awesome! You're really making a lot of fun jokers here! And there are so many fun opportunities. How about a Bacteria Enhancement? It's like a stone card. But it doubles in Chips every time it is played/ scored?
yeah, no luck, override_base_shader, disable_base_shader and ignore_base_shader don't seem to exist on anything
yo I'm trying to have the game multiply the number of removed playing cards multiplied by an amount of chips to be added to the card, does anyone know how I could do this? here's the code:
if context.remove_playing_cards and not context.blueprint then
for _, removed_card in ipairs(context.removed) do
card.ability.extra.chips = card.ability.extra.chips + (number of deleted cards) * card.ability.extra.chip_mod
return { message = localize { type = 'variable', key = 'a_chips', vars = { card.ability.extra.chips } } }```
also this syntax fucking rocks btw @red flower, it's so much easier to work with and digest
thanks again
@red flower , I love the idea of Vanilla remade. A great way to explain how to do things via SMODs, and I think your syntax is very clean and easy to follow as well!
actually wait I could use context.removed or 0
I do as well, @red flower I'd be happy to help out with other features besides jokers because I think it's a great resource
he's beautiful
ITS MARKET PLIERS
what does he do,,,,
holy shit multiplier i loved your work in peggle dinners
plays five nights at freddy's (random amount of mult/xmult when scored)
"the first night is never usually that bad in any of the games so I'll play through-"
X0.5Mult jumpscare
it can only give positive mult rn but thats really funny im changing it
lol
negative mult doesn't seem to work
what does your atlas code look like?
shame
What should I be doing to give skip tags from jokers?
i wouldnt call it my code lmao
but here
i think someone was trying to do it on their custom joker, there may also be some code from cryptid i can find that may help
dont mind the whole tonka yeat stuff
ohhh
wait
i didnt give it value
nvm i think ik now
thx tho yall nice fr
nvm it does work
might not have seen the mult go down because markiplier was polychrome
oh
is mark a standalone thing or part of a larger mod
because id love to just mess around with the markiplier card
all of my stupidest balatro ideas in one mod
i can release him separately though
hell yeah
and not context.repetition prevents jokers from being retriggered right?
oh nvm now it works?
Can someone help me with my code? I copied it from cola, and it seems to be doing nothing. Am I checking something wrong in the if?
loc_vars = function(self, info_queue, card)
info_queue[#info_queue+1] = G.P_TAGS.tag_ethereal
return { vars = { localize { type = 'name_text', set = 'Tag', key = 'tag_ethereal' } } }
end,
calculate = function(self, card, context)
if context.cardarea == G.play and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
local queens = 0
local twos = 0
for i = 1, #context.scoring_hand do
if context.scoring_hand[i]:get_id() == 2 then twos = twos + 1 end
if context.scoring_hand[i]:get_id() == 13 then queens = queens + 1 end
end
if twos > 0 and queens > 0 then
return
{
func = function()
G.E_MANAGER:add_event(Event({
func = (function()
add_tag(Tag('tag_ethereal'))
play_sound('generic1', 0.9 + math.random() * 0.1, 0.8)
play_sound('holo1', 1.2 + math.random() * 0.1, 0.4)
return true
end)
}))
end
}
end
end
end
Uh, I think "I'm dumb" sufficiently explains it.
how do i get the current deck?
if a joker doesn't have any values on it that can change, does it need a loc_vars?
nope! it can be left off
G.GAME.selected_back
awesome! I officially have no idea why my joker doesn't work lol
would you mind taking a peek?
tysm
sure
key = "fool",
unlocked = true,
discovered = true,
blueprint_compat = false,
rarity = 2,
cost = 6,
atlas = "cottage",
pos = { x = 1, y = 0 },
loc_txt = {
name = "dartboard",
text = {
"Balance {C:chips}Chips{} and {C:mult}Mult{}",
"if played hand contains",
"only {C:attention}Stone{} cards",
},
},
config = {},
calculate = function(self, card, context)
if context.final_scoring_step then
for _, card in ipairs(context.full_hand) do
if not SMODS.has_enhancement(card, “m_stone”) then return end
end
return { balance = true }
end
end,```
the joker is supposed to only balance chips and mult if played hand contains only stone cards, regardless of how many cards played
ok im starting my KOT joker over let me send the code again
SMODS.Joker {
key = 'kot',
loc_txt = {
name = 'King of Town',
text = {
"+#1# hand size for every King scored",
"Gains X#2# mult per hand size above #3#",
"{C:inactive}(Currently {X:mult,C:white} X#4# {C:inactive} Mult)"
}
},
config = { h_size = 1, extra = { xmult_per = 0.1, thresh = 8, Xmult = 1 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.h_size, card.ability.extra.xmult_per, card.ability.extra.thresh, card.ability.extra.Xmult } }
end,
rarity = 4,
atlas = 'hsr',
pos = { x = 6, y = 0 },
soul_pos = { x = 7, y = 0 },
cost = 20,
calculate = function(self, card, context)
if context.joker_main then
Xmult = card.ability.extra.Xmult
if context.cardarea == G.jokers and context.joker_main and G.hand.config.card_limit > card.ability.extra.thresh then
return {
message = localize{type='variable',key='a_xmult',vars={card.ability.extra.xmult_per * (card.ability.extra.thresh + G.hand.config.card_limit)}},
mult_mod = card.ability.extra.xmult_per * (card.ability.extra.thresh + G.hand.config.card_limit),
Xmult = card.ability.extra.Xmult
}
end
end
end
}```
what it's supposed to do is gain x0.1 mult for every hand size above 8 and return it when triggered
none of the variables work properly and it returns x1.7 mult instead of x1.1 with 9 hand size
does it work for dollars = 2 instead?
instead of balance = true?
ye
lets give it a shot
nop
So, now my joker works a little too well, and gives a tag for every played queen or two, anyone know why?
if context.cardarea == G.play and context.individual then
local queens = 0
local twos = 0
for i = 1, #context.scoring_hand do
if context.scoring_hand[i]:get_id() == 2 then twos = twos + 1 end
if context.scoring_hand[i]:get_id() == 12 then queens = queens + 1 end
end
if twos > 0 and queens > 0 then
return
{
func = function()
G.E_MANAGER:add_event(Event({
func = (function()
add_tag(Tag('tag_ethereal'))
play_sound('generic1', 0.9 + math.random() * 0.1, 0.8)
play_sound('holo1', 1.2 + math.random() * 0.1, 0.4)
return true
end)
}))
end
}
end
end
end
context.cardarea == G.play and context.individual runs once for every playing card. Did you mean to use context.joker_main?
Yes, that's it, thanks.
does it work if you remove the check for stone cards?
just calculate = function(self, card, context)
if context.final_scoring_step then
return { dollars = 2 } ?
ye
let's give it a whirl
or balance = true
im seriously at a complete loss as to what to do here. i have no clue what i'm doing wrong and i think i just need to completely wipe the code and start from scratch
yeah im tearing it down. i got most of my code from hollow joker which is a WAY different use case
i finally now know how to load other lua files so i can finally split my one big lua file into multiple others
no more scrolling!!!
calculate = function(self, card, context)
if context.final_scoring_step then
return { balance = true }
end
end,```
does not work
idk what to tell you then other than smods borked
OMG I DID IT
I ADDED A MOD
yooo thx thx fr fr
only one joker
took me way too long
thx yall
all I fucking had to do
these past six hours
was check the repository
I've been going insane
:agony:
I FINALLY FIGURED OUT KOT. THE XMULT EFFECT IS FINISHED
it turns out that i was way overcomplicating it
now i need to add 2 things
- the xmult on the joker updating since right now it's just 1 and i can't figure out how to change it
- the "kings add +1 hand size" effect
im completely blanking on how to add the current total xmult as a hashtags variable. it surely can't just be calling the variable that stores it that seems like it'd give some kind of math error
try it and see
oh i just forgot i got rid of a_xmult variable since i thought i iddnt need it I Think I Need It
ok hold on i think i need to do something like this but for when you gain hand size. is there a function call for that
as soon as i'm able to add to the localization the current xmult i think i've got it
how would i apply a shader to a soul sprite?
ok i SEEM to have it all under control but as soon as i add hand size, the current xmult becomes xnil again
here's the almost-final version of the joker for until i figure out the xmult display problem which is shaping up to be way more of a problem than it should
SMODS.Joker {
key = 'kot',
loc_txt = {
name = 'King of Town',
text = {
"+#1# hand size for every King scored",
"Gains X#2# mult per hand size above #3#",
"{C:inactive}(Currently {X:mult,C:white} X#4# {C:inactive} Mult)"
}
},
config = { h_size = 1, extra = { xmult_per = 0.1, thresh = 8, xmulttotal = 1 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.h_size, card.ability.extra.xmult_per, card.ability.extra.thresh, card.ability.extra.xmulttotal } }
end,
rarity = 4,
atlas = 'hsr',
pos = { x = 6, y = 0 },
soul_pos = { x = 7, y = 0 },
cost = 20,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.joker_main and G.hand.config.card_limit > card.ability.extra.thresh then
card.ability.extra.xmulttotal = card.ability.extra.xmulttotal + card.ability.extra.xmult_per * (G.hand.config.card_limit - card.ability.extra.thresh)
return {
Xmult = 1 + card.ability.extra.xmult_per * (G.hand.config.card_limit - card.ability.extra.thresh)
}
end
end
}```
i don't understand why my variable updating returns nil when the Xmult works perfectly
yeah i cant find a single joker anywhere in my collection that updates on hand size set
¯_(ツ)_/¯
i ALMOST have it, i SWEAR i do, but now for some reason it works outside of hands drawn but when a hand is drawn it skyrockets up to x14.3 mult
i'm assuming it's because i'm using context.cardarea == G.jokers
keep in mind, xmult itself works just peachy. but no matter what i do, whenever ANY card is drawn ANYWHERE, the value updates
Does anyone know why my smods related stuff say undefined even tho I got smods in my workspace and the Lua extension?
Not sure why it doesn't auto complete n stuff
Is there any way to fix this?
did you add the lovely/dump folder as well?
(not that that would fix the SMODS stuff being unrecognized)
Talisman?
Talisman is installed
for instance, how would i apply the Chip flame effect to the mask on this card?
Do you have cartomancer?
I don't even know what it is😀
look into SMODS.DrawStep (which I can't help with)
how do i run code that enhances specifically face cards
i don't think there's code in base game that calls for enhancing a card to a specific edition when a card is scored but i could be wrong
What's a cartomancer?
card:set_ability?
im trying to use set ability but what im trying to make throws an error
Log?
hold on let me get the log
i can also post the code im trying to use int he meantime
if context.cardarea == G.play and context.other_card:is_face() and not context.blueprint then
return{
context.full_hand:set_ability(G.P_CENTERS["m_wild"], nil, true)```
I figure it's a longshot, but there's no chance Xchips is a possability with smods is there?
crashlog
oh no wait im doing context.full_hand not card:
let me change that i think that'll fix it
It already is?
hsr???
I don't even think you need talisman for xchips
liike, honkai star rail??
Return xchips = number
ok wait hol don
oh neat, from what I was seeing there was no way to call for it
i made it card:set_ability but then the joker itself becomes a wild card texture and the face cards aren't enhanced???
If I'm wrong tell me
Check:
Number of hands
Hand size
And the size of the hand you're playing
Right?
for some reason, i is correct everytime, but it keeps creating cards from index 1 to 15
weird
im assuming that the card itself is affected by card:set_ability but how do i affect the face cards?
yeah the wiki only says chips, mult, and xmult on one page but another page mentions xchips somewhere i think
check for :is_face()
dope, didn't know that
Which one looks better with the background colour?
no context, so hard to say honestly
i am checking for is_face()
here's the code again
if context.cardarea == G.play and context.other_card:is_face() and not context.blueprint then
return{
card:set_ability(G.P_CENTERS["m_wild"], nil, true)
}
end```
i didnt know either at first lol
dont return it
ohhhhh that must be it
How to increase the size of the hand that will now play standard size 5
nope, does the same thing
i have no clue why it's just randomly decided that it wants to make the joker a blank wild card texture
Your trying to enhance the joker.
i know i am but i don't know how to enhance the cards
Which case looks better?
is it context.other_card:set_ability?
random thought but does anyone know if thered be a way to make a system that works like seals but doesnt take up the same "enhancement type slot" (or however that would be worded)
Yes.
well, no, because it can't pair set_ability with a context
so im back to square one
i've tried multiple times to do context.whatever:set_ability and it immediately crashes
so it has to be a non-context thing but i have no clue how to do it to scored cards
remember kids, if you value your ears, make sure your events eventually return true, especially if they have a call to play_sound
Does context.other_card exist?
stickers?
how would i use this
it does, but it crashes when i try to use context.other_card:set_ability, as i have said
a bit outdated but look at https://github.com/JustinBanzon/Bird-Jokers/tree/main
where are variables set upon the start of a run set?
Code?
wait, nevermind
SMODS.Joker {
key = 'cardgage',
enhancement_gate = 'm_wild',
loc_txt = {
name = 'Senor Cardgage',
text = {
"Played Face cards become Wild",
"Retrigger Wild cards twice"
}
},
rarity = 2,
atlas = 'hsr',
pos = { x = 1, y = 0 },
cost = 4,
unlocked = true,
discovered = true,
loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS.m_wild
end,
calculate = function(self, card, context)
if context.cardarea == G.play and context.other_card:is_face() and not context.blueprint then
context.other_card:set_ability(G.P_CENTERS["m_wild"], nil, true)
end
if context.repetition and context.cardarea == G.play then
if context.other_card.ability.name == "Wild Card" then
return {
message = localize('k_again_ex'),
repetitions = 2,
card = card
}
end
end
end
}```
You need to check for context.individual
What feature are you trying to accomplish that prompted you to ask for a method that can coexist with seal/enhancement?
so "context.individual:set_ability(G.P_CENTERS["m_wild"], nil, true)?"
No.
remember kids, use a helper function so you never forget again
local function q(f)
G.E_MANAGER:add_event(type(f) == 'function' and Event { func = function() return f() ~= false end } or f)
end
then where do i put it
im completely lost when it comes to lua
i mean, if i can make stickers that can be applied to playing cards (and not jokers) then i suppose so?
Where your checking for face cards.
"and context.individual:is_face()?"
Stickers work in playing cards.
No.
you have to be a bit more explicit then
again, completely lost when it comes to lua
context.individual is a boolean that tells you if it's currently processing one-card-and-another or not, context.other_card is the scoring card that it's currently processing.
and context.individual
is it possible to make a sticker that can only be applied to playing cards and not jokers
To the workspace? No I didn't
well stickers are not applied to anything by default, you need to manually add it for it to show up
Should I add it?
I would highly recommend
Hopefully it would fix my problem 
if context.cardarea == G.play and context.other_card:is_face() and context.individual and not context.blueprint then
context.other_card:set_ability(G.P_CENTERS["m_wild"], nil, true)```
???
But thanks!
Yes.
well, i saved it as that and then it crashed on play anyways
same crash log as previous
in should_apply, use if card and card.playing_card then
here's the log a second time in case there's something different but i doubt it
Here are two examples from the mod I'm working on:
the problem seems to come into it attempting to index some field for face cards but that was code that i borrowed from another working joker
your checks are out of order, make sure context.individual comes before context.other_card:is_face()
oh ok
thank you, i would not have figured that out on my own
joker works as intended now
context.other_card only exists if context.individual is true, but you're checking the other_card before you're checking context.individual, which means you're trying to access context.other_card in every context whether it's there or not
How to play for example 8 cards instead of 5
i need to make a reminders doc to look back at
what does area==G.play do here
easiest way is to wait for this pr to merge
It's to check if the card you're about to apply this sticker on is in G.play (i.e. in played hand).
And since only playing cards can be played (unless specifically modded), this sticker can only applied to playing cards.
so say the only contexts the sticker would be applied in is during tarot packs and before playing a hand, what would the area be
or is that all just G.play
both of those situation should be G.hand
so does this look alr then
G.play: played cards
G.hand: cards held in hand
G.deck: cards that haven't been drawn
G.discard: discarded cards and finished-scoring cards
i'm having issues with a joker that has x0.1 mult per hand size above 8, once again
the xmult itself triggers just fine but the (currently xmult) thing increases whenever a card is drawn to hand instead of only when hand size is increased. lemme post the code, the only thing i have a problem with is the xmult display
SMODS.Joker {
key = 'kot',
loc_txt = {
name = 'King of Town',
text = {
"+#1# hand size for every King scored",
"Gains X#2# mult per hand size above #3#",
"{C:inactive}(Currently {X:mult,C:white} X#4# {C:inactive} Mult)"
}
},
config = { h_size = 1, extra = { xmult_per = 0.1, thresh = 8, xmulttotal = 1 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.h_size, card.ability.extra.xmult_per, card.ability.extra.thresh, card.ability.extra.xmulttotal } }
end,
rarity = 4,
atlas = 'hsr',
pos = { x = 6, y = 0 },
soul_pos = { x = 7, y = 0 },
cost = 20,
calculate = function(self, card, context)
if G.hand.config.card_limit > card.ability.extra.thresh then
card.ability.extra.xmulttotal = card.ability.extra.xmulttotal + card.ability.extra.xmult_per * (G.hand.config.card_limit - card.ability.extra.thresh)
end
if context.joker_main then
return {
Xmult = 1 + card.ability.extra.xmult_per * (G.hand.config.card_limit - card.ability.extra.thresh)
}
end
end
}```
You can always calculate it in loc_vars
there's plenty of space before return { vars = {...
not quiiiiite sure how to do that
It's easy! Just put local xmulttotal = 0 as the first line and start calculating from there!
like, under function self info queue card??
this stuff is making my head hurt im sorry
is it possible to grab the key of a card without the mod and class prefix?
Let me fix my reply:
You can just replace card.ability.extra.xmulttotal in loc_vars with 1 + card.ability.extra.xmult_per * (G.hand.config.card_limit - card.ability.extra.thresh)
question how do i change the sprite of a joker when a condition is met?
ok i directly replaced "card.ability.extra.xmulttotal" in return {vars} and i got this crash evidently that aws not correct
You remove everything before the underscores?
The atlas or the pos or both?
🤔 but what if the key itself has underscores in it
pos
i could just make it so the key is cut in a certain position
but i wonder if theres a better solution than that
why do you want to do that? this seems like an XY problem
card.children.center:set_sprite_pos({x, y})?
thanks
so basically my mod uses these to determine which cards should be created in the inventory
now i have to figure out how to grab just the key (no mod prefix, no class prefix) of the card to get this
i have a massive headache trying to figure all this out. it's midnight. im feeling really crummy. i might just come back to this later
card.config.center.mod.prefix?
add the prefixes to the id there lest i make an object with the same name specifically to break your mod
i just keep getting the same crash
its not an object 😭
the object's key itself is like, ygg_mat_ygg_card_scrap lol
im still puzzling over this i have no clue where i'd actually put it because it doesn't work when i put it in the loc vars brackets
can i have a sticker with the same initial key as a joker since the localization file calls for the full prefix anyway
aw dangit
anyways, my point is that if you want to make ygg_mat_ygg_card_scrap match card_scrap you can modify either side of the equation and the right side is likely easier
nice
You need to set x and y to the pos you want.
this works, thanks :p
i did?
No I meant like x = number
({x = 2, y = 1})
Did Cryptid create this or smods?
G.hand.config.highlighted_limit
thats built in, im pretty sure
is that the config that allows for +card selection limit
honestly i just give up on the variable thing. it's just not working. i'll come back tomorrow
I mean it works without cryptid and will allow to take for example not 5 cards but 10, right?
idk
Standard can play 5 cards, how to increase this value ?
Yes, but it wont let you play it.
if i mod my balatro will it ruin my steam achievments
How do you make it playable?
You need to make a lovely patch.
how do i get the current score the player has?
will modding my balatro allow me not to get achievments even when i remove the mods
Current score of the blind or current chips or current mult?
You need to enable them in steamodded settings.
i got it already, i wanted G.GAME.chips
the chips the player already has
i wanted to get the amounf of chips left to win
How difficult would it be to have a UI that shows up with the jokers that a joker is replicating and changes their values to match?
Would I just set card.ability to what is saved?
Also is there a way I could make it not lag?
What do you mean?
How can I add exponential mult to a Joker?
Install talisman then return emult = number
Just like x_mult? or is there some special stuff since it's through Talisman
Yes there is emult, e_mult and Emult_mod
oh
I mean when the joker is triggered and as it copies another joker, the other joker's animation is triggered.
not sure if that is something ni balatro had but I just randomly thought of this.
So you want it to copy the joker but you want the animation to play on the copied joker?
do you have a guide for holotro installation? I'm not too familiar with how to apply it
It looks awesome, very fleshed out
Just open the balatro mod loader and get holotro iirc
Yeah, I submitted both MTB and Holotro to Balatro Mod Manager myself.
How does one move a card area mid-game?
yeah.
You can directly move it's T
I can't find it on v0.2.6, is there a dependency I'm missing?
I already had the copy code already implemented (thanks to ErictheToon) but right now I'M wondering if it's possible to like give the card to trigger an animation of another card.
You can make any card do the wiggle animation by calling :juice_up() on it
Jut curious, do you have prior experience of installing mods for Balatro?
a little bit, I installed steamodded a while ago for balatro multiplayer but that was before the mod manager
huh. so how I can implament this?
does anyone know how animated colors like dark_edition and edition update their color in ui properly?
just call scored_card:juice_up() somewhere
Maybe?:
Here's the mod link: https://github.com/RivFalcon/Holotro
just in case if searching "Holotro" instead of "holotro" in BalatroModManager doesn't help, and you want to install it manually.
Holotro: A Hololive-themed fanmade Balatro mod. Contribute to RivFalcon/Holotro development by creating an account on GitHub.
im already doing that actually, that's why the color is changing when i keep hovering over it
I saw the link, would I just drop the whole directory into the mods folder in appdata?
I assume yes, if you mean the mod file.
got it.
I think now I just need to figure out how I can have the animation play at the same time as the main joker card does. but yeah.
Press the Mods button?
You steamodded is ANCIENT.
can you find me a link to a newer one im trying to find one atm
Or otherwise I can display one of those notifications: "Copied"
so i shouldnt be using r2modman
is there a way to display one of those notifications when triggered?
No, not for downloading mods.
k thanks
How do I make a message pop up that the card is copied?
When?
Or triggered?
what the fuck it works like THIS??
Yes.
I was thinking like this:
SMODS.calculate_effect({message = ""}, card)
or maybe wehn it's triggered
I tried to put it after the juice_up and this happened.
wait
Code?
alright. one moment
You should be using SMODS.blueprint_effect
switched it out for a separate table that will hold other animated colors if i need to but why does it work like that
ok. I'll try that
this looks wrong
it worked until this:
How does one turn a localization name into a key?
Code?
can2t show whole code again but. I'll show the updated:
SMODS.blueprint_effect({message = 'Copied!'}, random_joker)
Why not?
I don't know
Also I meant use SMODS.blueprint_effect for the blueprint effect, not the message?
okay hold on
I was paranoid
But if it's fine to share then yeah
-- Process the random joker, if it exists
if random_joker and random_joker ~= self then
context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1
context.blueprint_card = context.blueprint_card or card
if context.blueprint > #G.jokers.cards + 1 then
return
end
local random_result, random_trig = random_joker:calculate_joker(context)
if random_result or random_trig then
if not random_result then
random_result = {}
end
random_result.card = context.blueprint_card or card
random_result.colour = G.C.GREEN
random_result.no_callback = true
table.insert(results, random_result)
random_joker:juice_up()
SMODS.blueprint_effect({message = 'Copied!'}, random_joker)
end
end
I was just paranoid if anyone steals the code but then I realize.
it's best maybe it can help someone who wants to try to do something similar
sorry for the confusion.
but here is the code again.
Yes, but this is just a blueprint? People have done this many times before, also everybody steals code, and its fine.
well sorta but also I want to make it that it makes the copied joker to play a trigger animation and also a pop up that says: "copied"
Replace everything except juice_up and the message with SMODS.blueprint_effect(card, random_joker, context)
@daring fern i got it downloaded and im playing thanks, but should i have achievments on enabled or bypass restrictions, what does the bypass one mean
Bypass restrictions I think, lets you unlock achievements on seeded runs?
I forogt to put something that makes sense but I was thinking this.
I jsut forgot to put the "copycat" o nthe orignal card
So you want the joker to copy another joker but you want the copied joker to say "Copied!"?
did work but I don't have the joker just play the animation and have the message says: "Copied!"
true or the otherway around
do you know if it matters if i start a run and leave and turn it on will it change
So you would also be fine with the copied joker copying the copier of itself?
here's the code I have so far.
No, I said replace everything there with the blueprint effect.
Actually I thought of like how blueprint works except I don'tk now if this is ever done but I was thinking of like having the trigger being played the targeted joker to be coppied play the aniamtion or maybe message too
oh. so like, replace what I had to that?
--- get random joker
local effect = SMODS.blueprint_effect(card, random_joker, context)
if effect then effect.colour = G.C.GREEN end
return effect
If you want to change the colour you’ll need to save the result of blueprint effect, modify it, then return it
is there a way to manipulate pool flags to make all of one type e.g. no jokers except default can appear unless specified
yes i know i could add a yes pool flag to every joker but that seems
unneccessary
ah. Well I see where you're coming from.
is there a reason a joker that would fire before or after scoring would just stop working in the middle of a run?
i've messed with a mod that simply displays animated sprites of the upcoming Blinds and moves around UI and i keep encountering jokers breaking even after they've activated at an earlier point in the run.
Ice Cream not losing chips, Trading Card not doing anything, Vampire not scaling, Obelisk not reseting/scaling. not seeing any errors. i've tried to add delayed events for the Sprites appearing/disappearing and removing events and just running them in sync, but random Jokers keep breaking
the mod's called Condensed_UI if anyone would be inclined to look at it, i want to make more mods like it but this is holding me back
Can some explain how to have this code summon a certain rarity from a certain mod?
(Code yanked from Yahimod)
SMODS.add_card({rarity = "modprefix_rarity", set == "Joker"})
So just have that instead of all the lines (321 - 324)?
What smods version are you on?
Yes.
Thanks
And is there a way to destroy certain Jokers too?
No look at the top right of your menu screen
my mod only has a single SMODS call as well
You mean all jokers of a certain rarity or key or a specific joker?
Just specific ones.
card:start_dissolve()
you need to update smods then
Right now I'm in testing mode but of course, I tried to mess around a little bit more and I got this effect:
(also I did this for the fun of it laso testing to see how it works)
It did work also I know I have modified the code a little more but yeah...
also how do you see a debug message?
wait.
print("debug")
ACtualy I've been wondering is it possible to trigger the calculate two times?
or at the same time?
You mean it would copy the joker twice?
I meant like 1st the copied "message" which actually grabs the targeted joker then the main copycat card acutally blueprints.
I don't know how else to like explain in detail but I was thinking like giving a message to the copied joker when the copycat joker is triggered and then after the copied message it then does the trigger with the copied joker
I'm sorry if my words are mixed up
but hopefully but explaining this does get an idea.
of what I meant
you can add that to where you return the retriggers
right now the code is like this now:
hm.
oh wait its not retriggers hold on
I just realized one more thing I forgot to add
is that not what it does?
I don't know cause I thought the idea of a card uppon trigger it sorta triggers the other card iving the "copied!" message
then the main card displays the copied joker result
that's what I thought.
that I don't think I see anyone does that.
you want the repeated triggers to have a green background?
just something experimental.
I didn't said anything about repeated triggers but yeah.
also
see this video?
what it's supposed to do is that after the "copied" it supposed to trigger that card (on the middle)
if random_joker and random_joker ~= card then
SMODS.calculate_effect({message = "Copied", colour = G.C.GREEN}, random_joker)
return SMODS.blueprint_effect(card, random_joker, context)
end
oh.
I'll try that and see.
the way you select a random joker is also way overworked
hm...
and is it correct that you only want to copy effects that trigger on scored cards?
I don't know how Balatro normally copy cards.
I mean I know blueprint one
it depends on what you want it to do
but I don't know how if it's possible the card can just copy a random card and that cchosen card to play the trigger animation.
what's the effect supposed to be?
I think what it supposed to do was on this order orignally in my head:
or how I imagined.
no, what does the text of the card say
alternatively would be this:
I know it's a rough drawing.
ah.
So what's it supposed to do based on description?
yes
cause the og description of that card is:
Copies the Effect of a Random Joker Per Hand
yeah one joker but also tries to make the joker that was copied on to play the trigger animation.
that's also what I thought too
so yeah.
otherwise maybe have the message o nthe card that is copied.
then the result
I don't know how the order should work more better.
I don't know how to like get the concept properly based on the descritpion of this card I found
calculate = function(self, card, context)
if context.press_play then
if #G.jokers.cards > 1 then
local copied = pseudorandom_element(G.jokers.cards, pseudoseed('random_joker'))
while copied == card do
copied = pseudorandom_element(G.jokers.cards, pseudoseed('random_joker_repoll'))
end
card.ability.extra.copied = copied
else
card.ability.extra.copied = nil
end
else
if card.ability.extra.copied then
local ret = SMODS.blueprint_effect(card, card.ability.extra.copied, context)
if ret then
SMODS.calculate_effect({message = 'Copied', colour = G.C.GREEN}, card.ability.extra.copied)
return ret
end
end
end
end
I'm 99% sure this is what you want
This will select a random joker to copy each hand and then it should copy it's effect, with a copied message on the copied card before the effect
which quality of life setting lets me hold on a card and drag instead of clicking every card one by one
You have to click and drag on an empty space though.
@daring fern thanks dude youre the goat
Getting a lua error when attemting to load the game with this mod enabled
":51: unexpected symbol near '}'"
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play and context.other_card:get_id() == 4 then
G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + card.ability.extra.dollars
return {
mult = card.ability.extra.mult,
chips = card.ability.extra.chips,
Xmult_mod = card.ability.extra.Xmult,
message = 'x' .. card.ability.extra.Xmult,
dollars = card.ability.extra.dollars,
func = function() -- This is for timing purposes, it runs after the dollar manipulation
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.dollar_buffer = 0
return true
end
}))
} --51
end
end
The joker should +4 mult +4chips x4mult +$4 when a 4 is played.
The joker gains +4 chips, +4 mult and x4 mult when a 4 is played like this, but does not gain $4.
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play and context.other_card:get_id() == 4 then
return {
mult = card.ability.extra.mult,
chips = card.ability.extra.chips,
Xmult_mod = card.ability.extra.Xmult,
message = 'x' .. card.ability.extra.Xmult,
dollars = card.ability.extra.dollars
} --51
end
end
}
You are missing an end on the function.
why use Xmult_mod instead of xmult?
Because that's what the tutorial video showed 🙂
Literally 0 background on this, I'm googling what I can but this is difficult to phrase in a google search
different between xmult_mod and xmult is that xmult automatically returns a message for the mult value, while xmult_mod doesnt
since you're just returning the xmult value with message, you might as well use xmult, saves you some effort haha
I've tried to play with that, do you mean literally end or }
cos if it's end, i can't figure out where it should be lol
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play and context.other_card:get_id() == 4 then
G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + card.ability.extra.dollars
return {
mult = card.ability.extra.mult, -- 39
chips = card.ability.extra.chips, -- 40
xmult = card.ability.extra.Xmult, -- 41
dollars = card.ability.extra.dollars, -- 42
func = function() -- This was missing an end, 43
G.E_MANAGER:add_event(Event({ -- 44
func = function() -- 45
G.GAME.dollar_buffer = 0 -- 46
return true -- 47
end -- 48
})) -- 49
end --- here, 50
} --51
end -- 52
end -- 53
the end should be before the } that's causing an error i think
Ah, thankyou, sorry to make you do my homework :p
What function was I not ending? I wasn't too sure how to account for that as easily as commas and brackets
Ahhh i see!
Thankyou i think i get it better now
is there like a karma/sticker thing? Like to rate someone as being helpful
I don't think so.
darn
Alright, I tried this somehow it did work one time but somehow it's not triggering the "copied"
eeven if I tried the 4 cards
unless I did something wrong
There's a context.press_play? Doesn't it cause issues with the Pillar?
Does SMODS wiki have a guide about unlock_condition and check_for_unlock?
it shouldn't do, I'm pretty sure all the blind contexts that were added are fine to use for any effect
I'll give it a try in a bit
there it is.
Now it's actually what I'd thought for.
🧙♂️
Now, I think there's another card that I want to try to recreate into balatro as new part of the experiment and the description is this:
"Copies the Effect of a Random Played Card Per Hand"
Of course this is different than the joker but rather it's about played cards.
but then again thanks!
also is there a way to learn about how basic game codes work?
just read it a lot 🤣
I tried but I couldn't figure out which is which.
like what is the varible for "playing cards" and among other things.
...can two "defined" atlases use one image?
You do the same thing you did the first time.
arlgiht
also...
I tried to do sometihng with the playing card thing code and after adding it it gave me this rror when I try to add any other card
Code?
Is it possible to change a back's config values in the start run menu? I am trying to do something similiar to cryptid's edition/seal/enhancement/sticker decks and while i figured out the clicking on the deck part i'm struggling to understand how to get the back itself.
I don't know if this is actually right way to do so but yeah.
Is there a way to draw a sprite on something that makes things under it invisible?
i did that and it still is undefined 
Can't figure out why this won't repeat. I tried having repetitions = card.ability.extra.repetitions in the same function that adds mult/chips/etc., it does everything else but just not that. I've looked at Hack, Sock & Buskin and Hanging Chad, I don't see anything clear that they do that I don't except for have an unlock requirement
calculate = function(self, card, context)
if context.repetition and context.cardarea == G.play and context.other_card:get_id() == 4 then
return {
repetitions = card.ability.extra.repetitions,
}
end
if context.individual and context.cardarea == G.play and context.other_card:get_id() == 4 then
G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + card.ability.extra.dollars
return {
dollars = card.ability.extra.dollars,
mult = card.ability.extra.mult,
chips = card.ability.extra.chips,
Xmult_mod = card.ability.extra.Xmult,
message = 'x' .. card.ability.extra.Xmult,
func = function() -- This is for timing purposes, it runs after the dollar manipulation
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.dollar_buffer = 0
return
anyone know how to fix the undefined stuff in VC , i tried adding steammoded and lovely folder to my workspace but it aint working
help i still don't know how to work shit out
looks ok to me honestly, the repetitions should work
that's not how you format a UI table
the n= should go inside the {}
but also i dont remember if overlay_menu requires a root node
-# no fucking clue what I am doing sorry
it's ok UI is hard
what
How should I uh... format it so it doesn't implode?
{ n = G.UIT.T
This is the actual result.
My config is
config = {extra = {
Xmult = 4,
mult = 4,
chips = 4,
dollars = 4,
repetitions = 4,
}
},
test for the 4983214th time
oh, I made it work!
Now I just need a way to not have the moving up animation
did you restart a run before changing any values
can i do local card = SMODS.add_card({key = card_key, area = G["ygg_crafting_show"]})?
so that card refers to the card created 🤔
I have not restarted the run, didn't think that'd matter. Just tried this and it has resolved this issue :)
yes
nice
config values are not changed until you get a new one of the joker
Ah, I had assumed it was loaded when the game started
Btw is there a way to just restart the Lua code in game so I don't have to restart the game everytime I change my code?
no
Is there a way to do just that?
you can hold M

