#💻・modding-dev
1 messages · Page 505 of 1
do you have skip_materialize = true
this time for sure
ALMOST.
okay everything else works. should i add a check or make it like a fun thing like hey you got the wheel of fortune... too bad it was on that fortune cookie
I think card.T.x and card.T.y work
That’s pretty hard to mesure
i've tried that and it just ends up at the top-left of the screen
(my cursor that is)
maybe because it uses balatro units instead of pixels?
Why does it look like Susie is about to slap Kris to the floor?
I don't see option "remind me in 3 days"
still don't know what does it do :(
all i managed to figure out is that it's a hook for the create_mod_badges() function and that it sets up some UI, but that's about it. what does it do exactly still eludes me
is there a way to translate that to on screen coordinates?
is this for a specific card
idk, ask Tobyfox
you can probably jkust use this like lars said
... Nah, I'm good. I don't want to know that badly
i have no idea myself sorry
real_x = ingame_x * G.TILESCALE * G.TILESIZE
why dont my jokers of this rarity show up in the shop?
thanks :D
YEAHHHH
i just pushed a deletion be sure to accept that
can i see the joker code
im gonna bite you

it worked, thanks
how would i say "if G.jokers and not any other card area" because if i hover over it in the collection while i own the card i get a locvars index crash despite having a G.jokers check
if G.jokers and card.area == G.jokers?
i feel stupid a lil
i looks fine to me
this fixed it btw thank you
should fortune cookie be common or uncommon?
if i was n id have fixed it tbh
can you fix mine 👉 👈
WHAT
so idk what im looking at
ugh
joker ideas:
if you didn't skip the small and big blind, give a xmult for the boss blind
i chips (or even i xchips) for every win on your profile
i mult (or even i xmult) for every loss on your profile
i could rework the ct/t jokers in being something similar to baseball joker
(x)mult or chips for every vanilla or modded joker slotted
maybe something related to your progress?
maybe one where you open a booster you get chips and have it relate to commuserism
lets goo
now to make it look nicer
Easy enough
I wonder who’s passionate enough to read it
this guy https://youtu.be/-e8iYQxZLiU?t=451
This video was somewhat rushed, so it's a little all over the place.
Important links:
https://www.youtube.com/watch?v=zr-AjL4UDfM
Joyous Spring: https://github.com/nh6574/JoyousSpring
Steammodded: https://github.com/Steamodded/smods/wiki
Lovely: https://github.com/ethangreen-dev/lovely-injector
Does someone knowledgeable in UI knows why, no matter in which order I put those 2, it always shows like this in game? (The patch's is applied inside the generate_card_ui function before "_c.set == "Other"")
not sure if there is a clearer way
that's actually more clearer thanks
might have a hare joker that does the opposite for xchips?
max skip for 3x is not worth it in any world
what would you suggest
there isnt anything i can think of that makes max skip worth it
maybe the boss blind's chip is lowered?
More progress on modded challenge menu
Ever slightly annoyed by the story node making the total width a little wider due to added padding, I want to make it universal if I can
why is winter always doing some crazy shit with ui 😭
idk maybe money or guarantee serpent..?
how to check if a joker is modded?
Because I gotta. It hurts me and I'm addicted to pain
serpent blind?
yeah
i could do money, but serpent blind seems oddly specific
its hardly a boss blind, it benefits you
card.mod
yup it tells you the mod info
how do you know the rank of a card?
cool
card.base.rank i believe

i mean only if you have a specific poker hand like high or pair and you can discard
yeah buddy just look at the number on the card
if you play more a three of a kind you will lose cards over your played hands
face card ranks are numbered or lettered?
turn a joker negative and rental then maybe?
Now I guess I'm just on implementing challenges
11 to 13 if i can remembered
that might be a good idea
turn a random joker negative
if context.skip_blind and not context.blueprint then
card.ability.extra.chips = false
return {
}
end
if context.setting_blind and context.blind.boss and card.ability.extra.active then
return {
}
end
the pot of greed consumes us all
not sure how like get a context of finishing a round or at least a boss blind
@chrome widget @sonic cedar do either of you have any experience with rarities 👉 👈
:3
too many jokers jumpscare
what the FUCK
I do yes
i do not no
ask winter
my cs cards arent showing up in the shop and i have no idea why
Are the cards being successfully added to the rarity pool?
how might i check?
Did you put the rarity on their centers with your mod prefix?
in my joker center
Is that a string?
If it's still not working then you might need to output the length of your rarity pool to check it anything's in it directly. Not at my computer though, I think it would be G.RARITY_POOLS.jjok_cs
How do you get the Balatro font in VS Code?
they are going in
how do you access a scoring card? context.card didn't work for me
Huh, then idk
or does it depend on the context?
context.other_card
It's contextual
in context.destroy_card
context.destroy_card itself is the card being flagged
Helo
If you're ever unsure, check the calculate functions page on the SMODS wiki
i always check before asking
it says that context.destroy_card is for marking cards to be destroyed
so it doesn't have to be currently in process of getting sliced
not sure if i did it right
in any case, this didn't work
Correct, context.remove_playing_cards is the context for when cards are actually destroyed
In which case it passes in context.removed, an array of cards currently being destroyed
wait, it did work, but i didn't check the correct thing
do i need to add this? 😭
and do i need any patches/hooks
depends on what you're trying to do with it
It says it should have it set to jokers on default but idk? Can't hurt to give it a go
it works!
HOLY FUCK IT WORKED
should i make some sort of indicator if it's active during the boss blind
Probably say Active! When entering the boss blind
juice_card_until(card, eval, true) makes it jiggle like invis or trading card
bump, but this time specifying "in loc_vars"
I would say yes, just for the sake of simplifying your own code
huh
card.mod no work
oh wait mb i was thinking of checking G.P_CENTERS
Is there a variable to see how many times have you used each type of hand in a run?
and that's for general? like i can check if that's true or false?
it's a table, not a boolean
did both active and the jiggle but uh is it normal to be that fast
if nil then vanilla if not then modded
If it exists it's modded
define fast, and what's your game speed set at currently?
show your code
SMODS.Joker({ -- Tortoise
key = 'tortoise',
pos = { x = 9, y = 9},
rarity = 2,
shop = 7,
blueprint_compat = true,
config = { extra = { active = true, xmult = 3 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.active, card.ability.extra.xmult } }
end,
calculate = function(self, card, context)
if not context.blueprint then
local eval = function() return card.ability.extra.active and G.GAME.blind.boss and not G.RESET_JIGGLES end
juice_card_until(card, eval, true)
end
if context.skip_blind and not context.blueprint then
card.ability.extra.active = false
end
if context.end_of_round and context.game_over == false and context.main_eval and G.GAME.blind.boss then
card.ability.extra.active = true
end
if context.setting_blind and G.GAME.blind.boss and card.ability.extra.active then
return {
message = localize('k_active_ex')
}
end
if context.joker_main and G.GAME.blind.boss and card.ability.extra.active then
return {
x_mult = card.ability.extra.xmult
}
end
end
})
ill clean it up after i'm done
I feel like the speed is fine, but maybe it needs a bit of a delay between triggers
thats not it i have a perpetually active juice_up_until
pretty sure that happens when it gets multiple juice_card_untils
yeah your calculate function literally adds another juice_card_until on every event
how do you make sure it's not getting multiple? have it in the set blind and stop the animation when blind is over?
only apply the jiggle on the context that occurs when entering the blind
what is the hiker chips bonus called?
is there a value for total chips given?
as in, base chips + hierophant + hiker in a single total_chips or something
that would be really convenient
what do you need it for?
probably make it either uncommon or rare
@placid star is this how you want to be credited?
getting the total chips from a card...
yes but for what
oh yoi dont have to do that
but if you are i usually do in a badge
add them into the joker
preferably fey-fish however but im not picky
specifically, add half the chip value from the card to the joker
you can use card:get_chip_bonus() but it won't have things like editions or most modded enhancements
for _, playing_card in ipairs(context.scoring_hand) do
lChips = lChips + playing_card.base.nominal
end
@split saddle
lChips is what I call the additional chips in variable
is this clear and a fair trade off (for the server at large)
is there a P_CENTERS for modded cards?
this is good, but it doesn't include bonus from the hierophant or perma_bonus from hiker
i see sorry
is nominal the base chips?
the chips from the played cards which includes enchanements if i can remember correctly
G.P_CENTERS
unless you mean modded only
then no
youd have to loop over G.P_CENTERS and check for not center.original_mod
doesn't seem like it
but thanks regardless
woops
would this check for modded
you can just ignore the answer too I guess 🙃
original_mod exists if its modded
ok i thought so
what's the loc_vars check for?
trying to render modded jokers ijiraq infoqueues without crashing
might format it for four lines but what do you think
they insert differently so i have to make sure i only use this version of the insert when it's a modded card
do non-modded jokers have a loc_vars property on the center?
Generally I try to put the condition first, tho I dunno if that's good or bad
this is for nonmodded
modded
Would this happen if they were taken ownership of
no I mean why do you need to check it's modded after you've checked if it has a loc vars function
see above
2 different vars values
can you send the whole block?
i think that's better with four lines
your casing is triggering my OCD (Negative instead of negative)
oh yeah negative supposed to be capitalised
set_blind = function(self)
local count = 0
for _, hand in ipairs(G.GAME.hands) do
if hand.played and hand.played > 0 then
count = count + 1
end
end
if count > 3 then
G.GAME.round_resets.discards = G.GAME.round_resets.discards - 1
ease_discard(-1)
end
end```
I'm trying to substract 1 discard if quantity of hand types played is more than 3, any reason this doesn't work?
could i return my main_end in a second lox_txt box?
calculate = function(self, card, context)
if context.skip_blind and not context.blueprint then
card.ability.extra.skips = card.ability.extra.skips + 1
end
if context.end_of_round and context.game_over == false and context.main_eval and G.GAME.blind.boss then
card.ability.extra.skips = 0
end
if context.setting_blind and G.GAME.blind.boss and card.ability.extra.skips >= 2 then
local jokers = {}
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] ~= card or G.jokers.cards[i].edition.negative then
jokers[#jokers + 1] = G.jokers.cards[i]
end
end
if #jokers > 0 then
if #G.jokers.cards <= G.jokers.config.card_limit then
local chosen_joker = pseudorandom_element(jokers, 'hare')
chosen_joker.edition = negative
return { }
end
else
return { message = localize('k_no_other_jokers') }
end
end
end
not sure it's something like G.jokers.cards.edition == negative or something
pretty sure it should be that instead
but idk how you can actually get the edition of a card so that also might not work
how do i make a joker debuff all cards
'e_negative' for both
assuming its the same for the editions i.e e_foil
oops
if context.debuff_card and context.debuff_card.area ~= G.jokers then
return {
debuff = true
}
end
yeah its e_negative
thanks
pog
also you should probably check for non-boss blinds being selected instead of 2 skips in the current ante since that would have better compat with other mods
make it so that it doesn't target itself XD
it already doesnt i think
not G.GAME.blind.boss
i mean isn't that an issue? i can make it either way but not sure if that's a problem
it isn't something like madness where it cannot be itself
Well, it would be a little too powerful imo
yea
it already cant be itself because you did if G.jokers.cards[i] ~= card
its still skipping an entire ante
i love democracy
i love democracy too...
why do you check if the joker count is less than the joker slots before adding negative
i dont really see the point in doing that
also #jokers 🔥
i mean if you have all negatives it would do nothing
should be #G.jokers.cards
well yeah but thats not even what youre checking
youre just checking if theres no joker overflow
i fixed it
local jokers = {}
for i = 1, #G.jokers.cards, 1 do
if G.jokers.cards[i].edition ~= 'e_negative' then
jokers[#jokers + 1] = G.jokers.cards[i]
end
end
if #jokers > 0 then
if #G.jokers.cards <= G.jokers.config.card_limit then
local chosen_joker = pseudorandom_element(jokers, 'hare')
chosen_joker:set_edition('e_negative', true, false)
return { }
end
else
return { message = localize('k_no_other_jokers') }
end
currently it can invis itself but if it wins the electral college to make not do that ill add that
oh #jokers is the eligible jokers
why do if #G.jokers.cards <= G.jokers.config.card_limit though
whats funny is that im pretty sure vanilla invis doesnt even have that
oh wait no nvm im thinking of the wrong thing
but yeah you dont need it
thats just checking if theres room
the modded check crashes the game
if context.skip_blind and not G.GAME.blind.boss not context.blueprint then?
...because it's already a center oh srklngdhn
no i mean more like
hold on
CURSES
if context.setting_blind and not G.GAME.blind.boss and not context.blueprint then
will_trigger = false --or whatever you would name the variable
end
so it wont trigger if you selected any non-boss blinds
instead of checking for 2 skips
and then you can set the variable back to true at the end of the ante
because some mods do stuff with the small and big blinds so this makes it work better with those kinda mods
if context.skip_blind and will_trigger and not context.blueprint then?
will_trigger is what you use to see if everything has been skipped
well if happens if you skip one and do the other?
like skip the small and do the big
will_trigger becomes false because the selected blind is not a boss blind
and then the joker wont trigger when you select the boss blind
and this will work with wierd stuff like cryptid which deletes the small blind on one of its stakes
and other such things
calculate = function(self, card, context)
if context.setting_blind and not G.GAME.blind.boss and not context.blueprint then
card.ability.extra.trigger = false
end
if context.end_of_round and context.game_over == false and context.main_eval and G.GAME.blind.boss then
card.ability.extra.trigger = true
end
if context.setting_blind and G.GAME.blind.boss and card.ability.extra.trigger then
local jokers = {}
for i = 1, #G.jokers.cards, 1 do
if G.jokers.cards[i].edition ~= 'e_negative' then
jokers[#jokers + 1] = G.jokers.cards[i]
end
end
if #jokers > 0 then
local chosen_joker = pseudorandom_element(jokers, 'hare')
chosen_joker:set_edition('e_negative', true, false)
return { }
else
return { message = localize('k_no_other_jokers') }
end
end
yeah
💯
also apparently you can just do and (not) context.blind.boss to check if something is a boss
vanillaremade madness does that
theres probably some way you can check if a blind couldve been skipped but if so i dont know it
would remove like most of the downside anyway if you didnt have to skip some blinds because skipping it is disabled
also tbh i think this is a really good take on a joker that applies negative
it works
you can thank @placid star for that idea
was going to xchips 😭
xchips in my vanilla+ mods... 🥀
xchips is litteraly the same as xmult unless youre on plasma deck
tbh i think xchips is fine if its thematically appropriate, theres no reason to do it otherwise other than just being different
its just a blue xmult anyway
i have an idea of gaining/getting its variable (mult, chips, xmult) from the number of wins / losses you have on your profile
theres not too much reason for it other than its visually appealing
metaprogression in a roguelike 🥀
hold on... LET ME COOK with this one 🌹
yk theres just 🌹 right
plenty of people have added stuff like that
some mfs got quest tabs
true but i personally dont like metaprogression that much
okay that's too far
well isnt unlocking jokers meta progression
i think it would encourage people on finishing their runs even on losing because some might quit and start a new one so they can keep their streak
also a ton of roguelikes have unlocks
like have a message of something like if it doesn't kill you makes you stronger or at first you don't succeed
🪫
oh are you using it for art?
i fucking hate redoing old joker ideas because i see how ass my code was and it so much work sometimes
because if so you should look at https://discord.com/channels/1116389027176787968/1224362333208444989
I kinda want to do a fake collab HAHAHAHAH
Im just starting with balatro modding
Thanks for the thing btw!
and in the game all the colors can just be accessed pretty easily
i honestly think uncommon is fine despite the negative part
because like
skipping everything is like a pretty big deal
you should also check out vanillaremade if you ever need a reference
https://github.com/nh6574/VanillaRemade/tree/main
throw it back
(throwback is a favourite more so the art but skipping blinds can make or break your run)
I just got it hahaha
you could base aspects of your mod around increasing the value of skipping?
then it would def be a rare
well i want to make cards (or even other stuff like blinds, tarots, and editions... 🤫) that aren't like unbalanced. try to keep it vanilla, but overall just wanna have some fun
might have to wait until the polls are done until i can fully decide LMAO
both are tied
i think more skip oriented stuff would be cool though, since skipping definitely needs a buff
gl with editions lmao .fs files are fuckjng ridiculous to code
even as something simple as a hue shift? (have an idea for a forgery edition that changes the hue a tad bit)
yup
ask any experienced modder they fucking suck to code
i would rather use some shitty online shader editor than actually code shaders
if that even exists
because ive looked at a single .fs shader and it looks like hell and torture and pain
i asked one guy that had coded his own and he said it took years off his life
still im gonna learn them lmao
localthunk and love2d developers on the deathbed at the tender age of twelve weeks
literally even the old cryptid astral shader (which does nothing but make cards very purple by the way!!!) is already 150 lines of code
like
what.
no way the lean enchantment
truth nuke
what is G.RESET_JIGGLES 
yeah i think it does that when the round is over to flush it out
what is a face card in code?
as in the rank ids?
11 - 13?
i want to append this ```
SMODS.Ranks['paperback_Apostle'].straight_edge = false
SMODS.Ranks['paperback_Apostle'].next = {'rfCAV_Sun'}
wait i can check ride the bus lmao
not sure why thunk didn't just make ace one probably for the rank order
but to find if something is a face card you can use <whatever card youre targeting>:is_face()
that too
playing_card:is_face()
pretty much
does that count in Pareidolia?
yup!
yes
how do you exclude it from the check?
that's how the face joker cards and the plant work
wdym
do this instead i think
depends on what you want to exclude from what check
not sure if smods does that though
the only issue is that it may break compatibility with other mods
only pareidolia bc it's a little broken
in what way
adding more ranks?
i mean pareidolia is cool and all but thats a whole extra joker slot
ahh i see
and photochad is X8 with 2 commons
i mean that is how pareidolia works
it treats every single playing card as a face card
But at that point it's kind of like hologram with extra steps
so it's probably fine i think
it comes with all the benefits (smily/scary face, photograph, midas touch) and cons (the plant)
yeah pareidolia just makes it wierd worse kinda-retroactive hologram
so it seems fine
even after all these years when i hear photograph... it's the nickelback song
look at this graph
it was even on the radio recently and i went turn that shit off and switched to a different channel lmao
look at this chad
every time I do, it gives me mult
okay i think three cards fully is good enough today
especially since the polls are going and my twin brother offered to make some art which would be awesome
yo can someone give me a hand? my joker is doing nothing for some reason
SMODS.Joker {
key = 'tyrs',
loc_txt = {
name = "Tyrsfall_JK",
text = {
'Every played {C:attention}King{}',
'has a {C:green}#1# in 7 chance',
'of giving {X:red,C:white}X3{} Mult'
}
},
blueprint_compat = true,
rarity = 3,
cost = 9,
discovered = true,
atlas = 'Jammbo',
pos = { x = 1, y = 1 },
config = { extra = { odds = 7, xmult = 3 } },
loc_vars = function(self, info_queue, card)
local numerator, denominator = SMODS.get_probability_vars(card, 1, card.ability.extra.odds, 'tyrsfall')
return { vars = { numerator, denominator, card.ability.extra.Xmult } }
end,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play and context.other_card:get_id() == 13 then
if SMODS.pseudorandom_probability(card, 'tyrsfall', 1, card.ability.extra.odds) then
return {
xmult = card.ability.extra.Xmult
}
end
end
end,
}
its case-sensitive so card.ability.extra.Xmult doesnt exist
you need to replace it with card.ability.extra.xmult
happens to the best of us
also just fyi in your loc_txt the denominator should be #2# instead of 7
since the denominator is the second variable in your loc_vars and get_probability_vars will handle compatibility and other probability modifications so it displays correctly
nitpick, only the #1# in #2# should be in green
oh that is supposed to be the case
missed the brackets
currently trying to reduce sell value of a joker by a percentage and i have it working besides the rounding, how would i make the sell value of a joker be cut in half, but specifically rounded up?
should i add a way to prevent the fortune cookie from being enchanced
3
3
2
allow to be enchanced and let it go to waste
😈
How do you destroy cards without leaving broken empty cards
math.ceil(5.2) = 6
oh its ceil
i guessed ceiling and it crtashed and i went here LOL huge
use context.destroy_card
in it you need to make sure that context.destroy_card == <card you want destroyed> and return { remove = true }
i think
im like 55% confident
sanity check, context.joker_main and context.main_eval is both a valid and necessary check (specifically the main eval part) right? 
no
joker_main is for jokers, main_eval is for cards (like for enhancements)
iirc
i see 
so context.discard and context.main_eval is also not something that works, by the same metric?
that's main_scoring
main_eval is for jokers
but it doesn't do anything in joker_main
can someone give me an example of adding use button to a joker
or is there a mod that does it?
i mean i can tell you one that does it
oh i see ok i got them mixed up then
i made a ui test that did that
can i see?
yeah one sec lemme find it
https://github.com/JustOsquo/Osquos-Extensions/blob/main/src/ui/ui_test.lua
everything below --[[ Functions for allowing jokers to be used ]]-- should be it
its not annotated like at all though because i didnt end up using it
okay so this is for the button itself
what about their functionality?
yes
can_use_joker fills in for a consumable's can_use
same story with the G,FUNCS.use_card hook
you can see how i did it for the test joker i made j_osquo_ext_test
correction it uses card:use_joker mb
not the hook thing
its been a decent bit idk how my own code works
basically where it checks for the self.config.center.key of that specific joker in can_use_joker and use_joker everything after that is what would normally go in can_use and use for a consumeable
feel free to just copy most the code from there if you want tbh
i see
its basically how it works for vanilla code since SMODS.Joker{} doesnt include any fancy stuff for this
at least not tmk
you can use those functions to check for functions in the joker's center
in my mod i add a use and can_use function to centers
like if type(self.config.center.use) == "function" then self.config.center:use(self) end
talisman crash?
ooooh thats so clever
didnt know you could do thsat
so then you'd just define the use in the SMODS.Joker{}? like it just gets added to the center?
lol from what i know about JS that tracks
is there a context for starting shop
compare numebr to table
talisman crash yup
context.starting_shop
this is correct right
no
think it should be to_big(401)
you did it in the exact opposite way first of all and second you want both to be the same type
i even have lsp :3 https://github.com/nh6574/JoyousSpring/blob/550f4393015b0c2987444537bcd01c1c4c38e99c/src/monsters.lua#L12
noooo not the tennas
he had it coming
just to make sure, this is where i put my own use function right?
yup
just without the use of course
just the stuff that would be inside it
or you could try to rewrite it to make it the way N' suggested if you feel like
but it should be the same functionally
i can just write it how i would write calculate function right
it has to be in a form of use
yeah the same way you'd write a use
someone rmeind me how i get to the ability table from self?
is it self.ability or self.config something
self.config.center.config I think
what self
in what function
a way to interfere with scaling is gonna be in the modding api i'm developing
this already works
whenever any card gets any operation done to it the calculate_scaling_mod func is called
one i wrote myself
kinda regret not making a card argument for this, but i wouldn't know what to pass in anyway
yeah in that self is the center so it would be self.config
but keep in mind that it doesn't have any changes from the ability table
for that you need to pass the card
?
self.config has the default config
ahhh
ok, so i need to write the card arg because this would just crash because this joker has no default config and is only obtained by changing another joker into it
yeah
your card here is jkr
are you able to use these shaders are a base for your own edition(s)?
can someone explain why it wont clear the image away
you're still replacing love.draw
oh brrrr
swoon moment
i can't for the life of me understand how hooking works so this makes my life hell
do you need hooking for that
what if just use whats inside love.draw
it seems to be working
or i guess that will clear it instantly?
it's the "getting rid of the image" is the issue
quick question, i want a joker that when a flush is played it uses straight's hand stats, how do i do that (on JokerForge)?
i have no idea how graphics work
i would use the balatro sprite object instead personally
ask on the jokerforge thread
smods2
good
steamodded is a terrible name for a balatro mod api
like actually so bad
laughably
im a big fan of smods but its fully because theres a celeste joke that sounds phonetically similar
i smile every time i say it
i woulda called it bmod
balamod already exists
thats very different than what i said
it's not, it would have been confusing
it sounds plenty different
plus. this is a hypothetical scenario thatd take place when smods was created
so it wouldnt have been confusing
modbala
they were created at around the same time
then itd be an easy issue to solve
like why are we debating my funny name idea
this is what they look like
i think it's bad :3
but this happens when adding it to any of the jokers did i forget to add something
i actually just wanted to mention balamod didnt even plan to argue
can i see the code for the edition
SMODS.Shader({key = 'flipped', path = 'flipped.fs'})
SMODS.Shader({key = 'gold', path = 'gold.fs'})
SMODS.Shader({key = 'laminated', path = 'laminated.fs'})
SMODS.Shader({key = 'sepia', path = 'sepia.fs'})
SMODS.Edition({
key = 'flipped',
shader = 'flipped',
})
SMODS.Edition({
key = 'gold',
shader = 'gold'
})
SMODS.Edition({
key = 'laminated',
shader = 'laminated'
})
SMODS.Edition({
key = 'sepia',
shader = 'sepia'
})
its barebones
they're missing the text
e_galore_flipped = {
name = 'Flipped',
text = {
{'test'}
}
},
e_galore_gold = {
name = 'Gold',
text = {
{'test'}
}
},
e_galore_laminated = {
name = 'Laminated',
text = {
{'test'}
}
},
e_galore_sepia = {
name = 'Sepia',
text = {
{'test'}
}
}
did you do the misc.labels thing
so the other?
?
where the bubbleGum1 and hare1 is
no
i see
it's in misc.labels
what you have now in edition is correct but you're missing that part
no matter what i do
AHAAA
can i see how the localization file is now
misc should be outside of descriptions no?
misc goes outside of descriptions
same error
can i see the code again
SMODS.Shader({key = 'flipped', path = 'flipped.fs'})
SMODS.Shader({key = 'gold', path = 'gold.fs'})
SMODS.Shader({key = 'laminated', path = 'laminated.fs'})
SMODS.Shader({key = 'sepia', path = 'sepia.fs'})
SMODS.Edition({
key = 'flipped',
shader = 'flipped',
})
SMODS.Edition({
key = 'gold',
shader = 'gold'
})
SMODS.Edition({
key = 'laminated',
shader = 'laminated'
})
SMODS.Edition({
key = 'sepia',
shader = 'sepia'
})
instead of saying same error u should tack on the updated localizations
i meant the localization
no idea lol
can you go to lovely/dump/functions/misc_functions.lua and screenshot what's at line 1923
if loc_target then
args.AUT = args.AUT or {}
args.AUT.box_colours = {}
if (args.type == 'descriptions' or args.type == 'other') and type(loc_target.text) == 'table' and type(loc_target.text[1]) == 'table' then
args.AUT.multi_box = {}
for i, box in ipairs(loc_target.text_parsed) do
for j, line in ipairs(box) do
local final_line = SMODS.localize_box(line, args)
if i == 1 or next(args.AUT.info) then
args.nodes[#args.nodes+1] = final_line -- Sends main box to AUT.main
if not next(args.AUT.info) then args.nodes.main_box_flag = true end -- 1923
elseif not next(args.AUT.info) then
args.AUT.multi_box[i-1] = args.AUT.multi_box[i-1] or {}
args.AUT.multi_box[i-1][#args.AUT.multi_box[i-1]+1] = final_line
end
if not next(args.AUT.info) then args.AUT.box_colours[i] = args.vars.box_colours and args.vars.box_colours[i] or G.C.UI.BACKGROUND_WHITE end
end
end
return
end
guys do you know why this joker keeps crashing my game (i used jokerforge)
name = "NaN",
key = "nan",
config = {
extra = {
odds = 8,
xchips = 10000,
Xmult = 10000
}
},
loc_txt = {
['name'] = 'NaN',
['text'] = {
[1] = 'If the played hand its {C:attention}High Card{},',
[2] = '1 in 8 probabilities of...',
[3] = '{C:red}x10000{} Mult, {C:blue}x10000{} Chips'
}
},
pos = {
x = 4,
y = 0
},
cost = 20,
rarity = 4,
blueprint_compat = true,
eternal_compat = true,
unlocked = true,
discovered = true,
atlas = 'MoreJokers',
loc_vars = function(self, info_queue, card)
return {vars = {}}
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.joker_main then
if next(context.poker_hands["High Card"]) then
if SMODS.pseudorandom_probability(card, 'group_0_0257144b', 1, card.ability.extra.odds, 'group_0_0257144b') then
SMODS.calculate_effect({x_chips = card.ability.extra.xchips}, card)
end
if SMODS.pseudorandom_probability(card, 'group_1_8763bef3', 1, card.ability.extra.odds, 'group_1_8763bef3') then
SMODS.calculate_effect({Xmult = card.ability.extra.Xmult}, card)
end
end
end
end
}```
what's the line
i commented it i copied the entire code block to give more context
if not next(args.AUT.info) then args.nodes.main_box_flag = true end
oh i didnt see because it's hard on phone lol
woops
i would try removing the {} in your edition text
i know that feeling
it might not take multibox properly
yeah maybe
update smods
programming in a nutshell
true
bullshit bugs 99% of the time ,dopamine 1%
99% programmers quit before they make the next minecraft
its kinda why i havent really programmed much in a long time
been programming on and off for most of my life
with nothing to show
fucking same😭😭
only real stuff i have to show is like, a few rlly old jam games i did a few years back
have been getting into music stuff in the past few years but i still program time to time but the closest would probably be something like this
its less like i hate computers im still fascinated and like learning new things but the more i have programmed recently the more i haven't liked it that much
this cant work so it's back to the drawing board
be my guest
also wym disguised btw
oh no, toma has to explain the joker again
i can make it not work if that helps
true
but i can't say that to her, she's been working on this since like february apparently
life would be a dream i decided if we all worked on the same mod
i dont have an emoji that can convey the anguish coursing through my veins
what If we work on a mod together I don't have good ideas
but I can code
very good
then you're in
i can be moral support
W
i can also code not very good and also do really bad art and also do really bad at everything else
if that helps
i am not touching localiztion
forgive me revo the demons almost took over
oh no my worst nightmare
how would i check if hand has an unscoring card?
if #context.full_hand > #context.scoring_hand probably
oh thats really smart
is the unscored area sitll an optional feature
as far as i know at least
they're not anymore
oh fr?
forced feature
oh nice
ohhh so he turns into a random joker
but all the jokers are custom coded to have different abilities i think
I'mma take a shower sleep and try that
i was about to remove it from my optional features, turns out its not there anyway so my idiot self knew that
yep
most
I thought of something but just as a base idea(probably wouldn't be good but I can reform it later on)
store all joker functions
store a table of joker with their variables
what happens with modded jokers?
example with Moriah
here's his loc vars
what is the function that calls his loc_vars
is there a way to conditionally change the amount of dollars that gold cards give?
for example, i want to write a joker that makes gold cards give $5 instead of $3 if they're face cards
tried the thing he told me back when we were doing it but it crashes
this does work, but it shows the hand will not score text unconditionally, do you know what the process would be to fix this?
but what does your current code look like
hare be able to invis itself
2
4
I don't know how blinds make that text tbh
so not really
💔 no worries
take ownership
how are you storing the values cuz card.ability is equal to card.config.center.config
what does ijiraq_savedvalues look like, when it has saved values
anything other than nil
okay so it should be :loc_vars({}, { ability = G.GAME.hpfx_ijiraq_savedvalues[card.sort_id][v] }).vars
please for the love of god work

i must've just mistyped the variable name
why would it not exist then
[Do you see any problems here?](#💻・modding-dev message)
only thing I can think of is that you loaded a save file where the table didn't exist yet
this is the same file i did this one
srock my buddy pal once you are compelted with assisting toma i have a questionfor you
and if you print it out in console this pops up?
what is the question
no this is with a joker that works
with a modded one it's just nil
remember that nice little fridge patch we did for it to be read as joker cardarea
ive realized when selecting a joker it brings fps to 35 frames
is there any way to work around that or am i sol
for some reason this last week after updating smods my balatro has been getting extremely low fps 😔
hmm, maybe i should test on an older ver...wonder if itll still be present
wasnt there a similar issue with cryptid a while back too ?
it used to like lag every single time you select a card
maybe, honestly youd know better than me
i steer clear of anything cryptid related
i couldnt play cryptid then cause everytime i clicked a card it would put me in the calculate screen
i'm sorry, I don't really see why modded jokers' values would not be saved
idk though
it's....fine.....
can_calculate() works on jokers, right?
yes
where are you somecom 
can you send the cooked dog seperately

if your repo is updated i can do some testing myself
hi
thank u now i have a low quality cooked gif
that's so funny
another stolen meme in my collection >:D
you can run transformtest() btw
I ran that and it spawned ijiraq with moriah already
are you actually deadass
man why tf is it not doing it for me 😭
I think the problem is with your transformtest function, you're skipping the process of the costume
I didn't get the crash here cus I had tried to spawn ijiraq myself before you told me of the function
so it properly initialized the values
so you spawned ijiraq and then ran the command?
start a new run and do eval G.GAME.current_round.fodder_card.jkey = 'j_hpfx_moriah'; SMODS.add_card { key = 'j_hpfx_costume' }
go thru the process and it'll work fine, besides the effects on scoring not being copied right
does SMODS.blueprint_effect() prevent infinite loops? from cards copying other instances of themselves for example
or do i need to cover for that
it prevents it
sick
I think it has to do with your moriah's calculate function
I replaced it with this and it copies right
I don't really understand why you did that
no i got that new ram remember 😭
it was like weeks ago i just never got around to changing it since uh
i ddint have that issue until now
so im gonna do some replacing rq
does this really happen only cus of the patch?
like, removing the patch fixes the lag
yes
can you remind me what the patch looks like
[[patches]]
[patches.pattern]
target = '=[SMODS _ "src/utils.lua"]'
pattern = '-- TARGET: add your own CardAreas for joker evaluation'
position = "after"
payload = '''
for k, v in pairs(G) do
if string.sub(k, 1, 16) == 'DMODS_fridgearea' then
table.insert(t, v)
end
end
'''
match_indent = true
Maybe your code is accidentally creating a lot of cardareas?
or maybe looping through G is not the best idea
why is bro crashing 
what do you think would be the alternative
when you create the cardarea store the keys in a list somewhere else
and then just loop through that list instead of the entirety of G
does anyone know the formatting to draw_card()??
it tells you right there
attempt to index field
atlas(a nil value)
yea i was being silly, i meant like i have atlas defined
like i think this is correct
are your atlases in a folder?
yuh
*in a folder that this file is not in
ye theyre in assets folder
because if they are, I'm fairly certain you need to add the folder to the path
oh wait nvm
the atlases i mean i can try adding the path rq
btw, atlas_table = 'ASSET_ATLAS' is the default so you don't need to add that
hmm
do you mind sending the whole crash report?
ah ok
im using uhh that one sample for stuffs
lua is an opp
nothing in the crash message references your file, and the crash originates from an engine file, meaning something you didn't write
that's crazy
gg lmfao
ok, here's what I would suggest I guess
comment out one of the atlases (and the code in deckskin relating to it). If that doesn't work, uncomment it and comment out the other one. If it crashes both times, then it might be something with the files maybe?
but I have no idea what's going on lol
what's a good resource to look into how to make jokers retrigger?
do local atlas_lc = SMODS.Atlas .... and then in the palettes pass atlas_lc.key instead of "collab_SG_1"
same for hc
sum lioke dis?
without the quotes around atlas_hc.key and atlas_lc.key
how would i choose a random joker from all of the jokers?
SMODS.add_card({ set = 'Joker' })?
if it makes sense, I'm trying to make my joker copy the ability of a random blueprint compatible joker
ahhhhh
i figured out how to get the center, but how would I get it's name?
How do I create a custom GUI?
how do i get a card from its center?
guys what is the key for crown and star suit from peperback. Like I want to create a consumeable that create a card white one of these suit
So normally for boss blinds, when a hand is debuffed, text will appear below this saying why the hand won't score. Is there a way to do this for things other than boss blinds?
localize { type = 'name_text', set = 'Joker', key = 'j_joker' }, change key to the joker you want the name of
what kind of UI do you want to make
paperback_Crowns and paperback_Stars
one for selection and one for displaying info
where do you want them, is what I meant to ask
I try that but it doesnt work
do SMODS.add_card { set = "Base", suit = "paperback_Stars", area = G.hand }
replacing all the code you have rn
kk
I want one to pop up upon new run and the second to be a button press
to make a UI pop up, you can do this (just an example that says Hi)
G.SETTINGS.paused = true -- you can choose to skip this if opening the menu shouldn't pause the game
G.FUNCS.overlay_menu {
definition = create_UIBox_generic_options {
contents = {
{
n = G.UIT.T,
config = {
text = "Hi",
scale = 1,
colour = G.C.WHITE
}
}
}
},
}
and I recommend you read the guide to ui by smods if you're confused https://github.com/Steamodded/smods/wiki/UI-Guide
as for adding a button, you probably have to patch your UI somewhere, i'm not the most knowledgeable on where to patch tho
this looks fine, if the crash says trying to index center or smt along those lines, then you put the wrong key
thank you
function Card:can_use_joker(any_state, skip_check)
if not skip_check and ((G.play and #G.play.cards > 0) or
(G.CONTROLLER.locked) or
(G.GAME.STOP_USE and G.GAME.STOP_USE > 0))
then return false end
if G.STATE ~= G.STATES.HAND_PLAYED and G.STATE ~= G.STATES.DRAW_TO_HAND and G.STATE ~= G.STATES.PLAY_TAROT or any_state then
if self.config.center.key == 'j_tngt_mahlazor' then
local my_pos = nil
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
my_pos = i
break
end
end
if not my_pos or my_pos == 1 then
return {
message = "...",
colour = G.C.RED
}
end
local total_value = 0
local destroyed_jokers = {}
for i = 1, my_pos - 1 do
local left_joker = G.jokers.cards[i]
if not SMODS.is_eternal(left_joker, card) and not left_joker.getting_sliced then
left_joker.getting_sliced = true
total_value = total_value + left_joker.sell_cost
destroyed_jokers[#destroyed_jokers + 1] = left_joker
end
end
if #destroyed_jokers == 0 then
return {
message = "...",
colour = G.C.RED
}
end
G.GAME.joker_buffer = G.GAME.joker_buffer - #destroyed_jokers
G.E_MANAGER:add_event(Event({
func = function()
for _, joker in ipairs(destroyed_jokers) do
joker:start_dissolve({HEX("ff0000")}, nil, 1.6)
play_sound('slice1', 0.9 + math.random() * 0.2)
end
-- trying to figure out how to add all of their sell value to the joker
card.ability.extra.mult = (card.ability.extra.mult or 0) + total_value
card:juice_up(0.8, 0.8)
G.GAME.joker_buffer = 0
return true
end
}))
return {
message = localize{type = 'variable', key = 'a_mult', vars = {total_value}},
colour = G.C.RED,
no_juice = true
}
end
end
return false
end
does this looks right
How would I make a seal copy the card it's on, and add it back into where it was when it gets destroyed?
shrug
u just gotta try and see
what's the key for the stone enhancement?
m_stone
i want to make a consumeable that undebuffs all card held in hand
how
@normal crest sorry for the insanely late 2am ping no rush in answering just ping me lol but i just noticed a weird bug now where for some reason high contrast on the custom deck halfway works? like the face cards are correctly high contrast but the rest of the diamonds arent and i got no clue why lol
contrast isnt flipped/reversed its just messed up on hc specifically
to your hc palette add hc_default = true
thank yuo bro
question for the actual channel i should have been asking this in: how could i implement this in a stake?
bump
or you can use coroutine.create
you can do something like love.timer.sleep(1) and then call the function you wnat
smth like
coroutine.create(
function insanity_bar(count)
love.timer.sleep(1)
return count + 1
end
)
?
-# (if you can't tell i've never even heard of coroutines before this moment)
yeah something like that
but define it into a variable
because when you create it its not immediately active
local cor = coroutine.create(...
youll need to do coroutine.resume([insert coroutine here]) after that
wait
youre defining a function inside the coroutine, right?
you can just do this:
smth like
coroutine.wrap(function(count)
love.timer.sleep(1)
return count + 1
end
)
i think you should make a variable outside the wrap though
since returning in the coroutine will kill it
What are you trying to do
@subtle merlin needs to make a function that executes every second in a blind
...oh
-# this to be specific
https://github.com/Steamodded/smods/wiki/Guide-‐-Event-Manager
specifically this page
ty both, ill be back when the UI part comes (that'll be in hours tho)
no problem!
why does the game think the table is nil
nvm
its just that the unpack somehow fails and gives nothing
i managed to fix it myself
turns out i could have just passed the whole table instead of unpacking
???
what causes this to happen
your code may be of help here
here^^
better screenshot
@subtle merlin found anything?
you'll have to call on someone with more experience, as i don't know what's wrong and i can barely even read through all of that
-# (most ppl here have more experience than me, so much so that you could throw a stone and find 5 ppl with more experience than me)
have yall seen somethingcom
hi there, how do i change this little guy to be another/add one other card instead of it ?
yo, i tried using ancient jokers code to determine random suits but ive very obviously done something wrong 😭
please help
crashes and says salesman is nil or something
There are a ton of mods you can use as examples, the one that comes to mind for me is Aikoyori's shenanigans
yeah
They have a local that's underneath the code
ohhhh
They also should have a reset_game_global which is at the very bottom of the code
gotcha
how would i trigger the game over effect so that Mr. Bones can still save you
i tried
if G.STAGE == G.STAGES.RUN then
G.STATE = G.STATES.GAME_OVER
G.STATE_COMPLETE = false
end
but that completely ignores Mr. Bones. i also tried just calling the end_round() function but that does this:
idk try setting the current hands to 0
I tried to make a counter for this joker to activate its effect after 2 cards are discarded but it doesn't work.
my goal is to not make the joker activate the effect for each card discarded.
How can I fix this?
the counter resets every time
i'd put the counter into the config and then reset it in the if counter == 2 check
now that I'm finished with the joyousspring update i can finally work on the vanillaremade wiki
How would one make the small text that's on Joker Stencil?
it works now! thank you so much!
nice!
(what is the joyousspring update?)
put {s:<whatever scale multiplier you want>} as formatting
Adds gambling!
Im sold
In your text add {s:0.8} or a diff value
Damnit
thx
oooh interesting!
thx to you too
small s no?
Yea its lowercase S btw, its caqe sensitive
Funny when s needs to be lowercase but everything else is uppercase
when will you add
once i can steal the counter mechanic from ice
does set_seal work with an array of multiple cards
no
Check other people’s code