#💻・modding-dev
1 messages · Page 577 of 1
yeah the tutorial im following does that haha
its prob outdated
-# yikes
its definitely outdated
its from 10 months ago so safe to say that it is yeah
how would I get information of the main balatro game?
wait nvm
for example?
also i have no clue what a json is is it a txt file with .json at the end?
yea its like file.json
basically (it has to follow specific rules but yea)
you cant really refer to main jokers, but you can override them
you can create your own jokers tho
so this works then?
yea ig
all jokers are inside of G.P_CENTER_POOLS.Joker, and then theres G.P_CENTERS which has like every card
no, right now thats metadata.json.txt
you need to change the file extension
im wrong then lol
you should turn on show file extensions in your file explorer...
its a good idea to enable viewing file extensions in explorer
same braincell
can I get a code example of how to get them. (I have never workt with multiple files outside a game engine)
how does that work?
weergeven > weergeven > bestandsnaamextensies
that's dutch
extensies?
yeah and that guys file explorer is also in dutch lol
all files have a file extension, which tell the puter what kind of file it is. text files have .txt, json files have .json, photos might have .jpeg, etc
lol
what does other_card do?
context.other_card is the secondary card being evaluated in most scoring contexts
by default, windows hides these, since they usually arent important. but for doing more you should turn them on so you can see them correctly
I have this so far for the function of the card, but I want to change it so it applies only to played sevens
like the playing card in cotnext.individual for example
yes i understand that but how do i make a .json file?
on windows 11
add and context.other_card.area == G.play
just turn on file extensions and remove .txt from it
what does that do
i feel really stupid but where do i do that?
or how
it checks if the card's area is the area for played cards
no you want context.cardarea == G.play
thats the same effect
by the power of google i smite thee
also its context.cardarea without underscore
ohfuck ur right
alr, what does and do and where do I put the code?
can I get a code example for getting G.P_CENTER_POOLS.Joker in my .lua file.
it checks to see where the card is, whether its in the play area, or in the hand, or in the jokers, etc. and its just another check, so put it in the if statement
ok
it goes into the if statement, making if context.check_enhancement and context.other_card.base.value == "7" and context.other_card.area == G.play then (in this case, context.cardarea is identical to context.other_card.area so you can use that too)
i recommend taking a basics in programming course, either from lua's website or something else. It's a fairly basic thing but if you're not certain about it its probably a good idea to learn or refresh yourself on the basics.
I programmed a couple years in Luau so I know most of it
which is just an extension on lua
ngl even after all the programming i've done before, I often have trouble figuring out how to implement pieces of documentation/where to put them because the technical terms are so hard to understand
but it's limited to a game engine
its a global table. I still recommend taking a refresher.
ok
smods has a built in table printer, so you can try just printing stuff in-game, if your code environment gives you nothing
something else i just thought of, the "lua" file iam working in is also .lua.txt, could that be another reason its not working?
ok so to make sure i'm understanding, this is one big and gate. I have no clue what check enhancement is, but it checks if it's true, then other_card.base.value checks for all current cards in the current hand/game area, and then the g.play one means it only passes as true for cards in the play area. Because it's an AND gate, all of these have to be true or it doesn't do anything.
everything else is just the file name
i got that im just a little confused on how to actually get rid of them XD
sure
check enhancement is a context thats triggered if the game checks for an enhancement on a card
how does one multibox for joker descriptions
just remove the end
make text be a table of tables of text rather than a table of text
i see thanks
on windows 11 it doesnt seem that simple
i say seem because it might be and im just not that smart
text = {
t1 = { "blah" },
t2 = { "blah2" },
Alright
literally just rename it and remove the end.
unless i have setting turned off i cant do that
how do i do that rahh
here
🥀
okay
can you maybe just google it
google is here for you
it can answer anything about file explorer
and windows usually
oh there
now i got it
sorry for waisting yalls time lol
are schools not teaching how to google things anymore? i feel like people have forgotten how to be normal but maybe we're not teaching the young'ns how anymore
my school legit just says ask AI lol
no but in all seriousness i was already in this discord asking
yeah i dont really learn much there if you couldnt tell already
literally google is 1 click away
well yeah but if im already asking here someone might have the answer easily ready yk
and you guys did
i just didnt know where to look
we've answered it a ton of times
hearing people say "just ask ai" instead of "just google it" feels fucking insane lmao
we cant reach into your computer and do it for you, you have to do some amount of work
yeah were encouraged to use it as a helping toll here
of course i was just a little confused on where the actual thingy was bcs again i havent really done anything like this before
although, to be fair, an ai tool could also answer that question
hey uhh how on earth do i hook a context
look at a lovely dump of uhhh state events and you'll find where the contexts are called
i think, lmao, its been a second
k uhh thx :3
SMODS.calculate_context({full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, final_scoring_step = true}) yes, state events
this is the function for final scoring step
how would I make a config file for steammodded
ok
oh i meant context.after but i found it anyways
oh, yeah there you go
for anyone wondering: it's line 850 of functions/state_events.lua
now that i think about it is there a more recent tutorial on how to get started? im getting an error upon launching that i feel like is just an outdated issue
whats the error
why
Failed to collect file data for Atlas (prefix)_Jokers
what's wrong with this ``` for _, j in pairs(jokers) do
if j.name == "Hanging Chad" then
print("Found Hanging Chad! Overriding ability...")
j.ability = function(card, context)
if context and context.joker_main then
local playerJokers = G.jokers.cards
for idx = 1, 2, 3, 4, 5 do
local target = playerJokers[idx]
if target and target ~= card then
for i = 1, 3 do
target:calculate_joker(context)
end
end
end
end
end
break
end
end
tryna make a card undebuff itself
there's a global calculate now
OH YOU'RE RIGHT I FORGOT ABOUT THAT
whuh
try using SMODS.current_mod.calculate = function(self, context)
it said got 'do' expected 'near' so should I do for _, j in pairs(jokers) near
im pretty sure thats an issue with the file path for an atlas, what does your atlas definition look like (if you have one, otherwise it probably is actually old version)
what is context.individual? i feel dumb for not knowing this
yeah, take a referesher course on lua
that's not what it says i can assure you
near just tells you something thats nearby
to the issue
maybe I should
it runs once for every card played and in hand
I read the handbook a bit
including at the end of round too
for the in hand cards
oh nvm i got it
issue fixed itself lol
not fully processing what that means atm
its called for on-scoring effects on playing cards, held in hand effects and held in hand at the end of round effects
if that helps
it's called individual because it runs calculate for each individual card
hm ok
I don't think it's needed since i slotted my boss bar into the section where the total score should've been, the only issue is that the ui reverts back to normal when hopping into the menu and back in the blind
what do i need to check to change the effect of a joker when it's being copied by blueprint/brainstorm? or is there anything for that
i thought there was something but not seeing it
context.blueprint is true for when an effect is being copied by blueprint
so to prevent something from getting copied by blueprint you add and not context.blueprint to whatever check you already have
ty <3
https://github.com/nh6574/VanillaRemade/blob/main/VanillaRemade.lua also have a look at vanillaremade its like peak
thank you N for making vanillaremade
Hmmmmmmmm strange. I should have sent similar code for Blind:load() in the text file. Does it have something to do with the multi stage blind thing interfering?
not sure, it's very likely..
i can show you the code
@lament agate i've gotten it to replace every joker's name with the name of another joker, in this case it always makes every joker have the name "Joker". obviously add an extra condition to that if statement if you want it to only happen sometimes
it'll be really complicated to do arbitrary text, so just add a fake joker to your localization with only a name, and it should do that name if you set args.key to the fake key in the localization (you shouldn't need to actually make a whole dummy joker for it, just the localization entry)
it's saying [SMODS UnbalancedJokers "Main.lua"]:16: 'do' expected 'near'
the line definitely does not end with near
when i hover over a joker i made i get "Attempt to index local 'center' [a nil value]" does anyone have a clue why?
that's what it says
i rlly need to
show the code
if not jokers then
error("Couldn't find Joker pool")
end
for _, j in pairs(jokers) do
if j.name == "Hanging Chad" then
print("Found Hanging Chad! Overriding ability...")
j.ability = function(card, context)
if context and context.joker_main then
local playerJokers = G.jokers.cards
for idx = 1, 2, 3, 4, 5 do
local target = playerJokers[idx]
if target and target ~= card then
for i = 1, 3 do
target:calculate_joker(context)
end
end
end
end
end
break
end
end
loc_vars = function(self,info,queue,center)
return {vars = {center.abilty.extra.Xmult}}
end
}
this is the only thing using center so im assuming its this?
for idx = 1, 2, 3, 4, 5 is not valid lua
you should use take_ownership for changing a joker effect
it should be info_queue
how
Additionally isn't G.P_CENTER_POOLS.Joker a list of keys and not tables?
damn beat me to it
@chrome widget i fixed it
local ref_blind_load = Blind.load
function Blind:load(blindTable)
local ret = ref_blind_load(self, blindTable)
if self.config.blind.score_invisible and G.GAME.modifiers.hide_blind_score then
set_blind_score_visible(false)
end
return ret
end
I removed the modifiers check
swag
Oh I wonder if that's bugged on my end too
it's possibly just a thing with how my blinds function
Basically it's just saying if the modifier for blind score was set on a previous save (since modifiers are also persisted separately), set the score visible to false again
If you happen to be doing anything else to modifiers it could interrupt it but idk
now i have the same error but on ability this time
my brain is leaving me how would i combine two joker descriptions using these
i never changed the modifier, which is strange
you wrote abilty
top 10 smart lol
illiteracy update
we caino-maxxing
I want to trigger an additional effect on Jokers and playing cards when they would have trigger but are instead debuffed, i tried context.individual and context.post_trigger but those don't seem to count debuffed cards.
heirophant
selzer and gluttenous
i dont even wanna think about that yet lol
i made my first joker thats a W for today
true!
not really a mod issue but assuming someone here has used debug plus, how do you spawn in a joker with that mod?
hover over in collection, then press 3 to get it
hold tab to see the magic debugplus cheat sheet, which explains that keybind + nearly everything else you can do with it outside of the console
ah thx yall
I tried taking ownership and change it but the hanging chad still won't change ```
local function deepCopy(orig, seen)
if type(orig) ~= "table" then return orig end
seen = seen or {}
if seen[orig] then return seen[orig] end
local copy = {}
seen[orig] = copy
for k, v in pairs(orig) do
copy[deepCopy(k, seen)] = deepCopy(v, seen)
end
return setmetatable(copy, getmetatable(orig))
end
local pools = G.P_CENTER_POOLS
local pool = pools and pools.Joker
if not pool then error("Couldn't find Joker pool") end
local function resolveEntry(e)
if type(e) == "table" then
return e, nil
elseif type(e) == "string" then
local def = (G.Jokers and G.Jokers[e]) or (G.JOKERS and G.JOKERS[e]) or (G.P_CENTER_POOLS and G.P_CENTER_POOLS.Defs and G.P_CENTER_POOLS.Defs[e])
return def, e
end
return nil, nil
end
local def, key = resolveEntry(entry)
if def and (def.name == "Hanging Chad" or (type(entry)=="string" and entry:lower():match("hanging") )) then
local owned = deepCopy(def)
if key then
pool[k] = owned
else
pool[k] = owned
end
owned.ability = function(card, context)
if not (context and context.joker_main) then return end
local playerJokers = (G.jokers and G.jokers.cards) or {}
for idx = 1, 5 do
local target = playerJokers[idx]
if target and target ~= card and type(target.calculate_joker) == "function" then
for i = 1, 3 do
local ok, err = pcall(function() target:calculate_joker(context) end)
if not ok then
warn("retrigger error:", err)
end
end
end
end
end
print("Took ownership and replaced Hanging Chad at pool index:", k)
break
end
end```
you dont need allat
why what do I need
its just
SMODS.Joker:take_ownership("hanging_chad", {
--values to overwrite go in this table
},
false) --true if you want to remove your mod badge
bruh
Keep in mind that the silent argument also does prevent the item from registering which mod the change came from as well (which has some niche uses to consider)
i want a sticker that shatters the card it's attached to after it scores, and i've tried a bunch of different permutations of calc funcs and they all either end up shattering it immediately and then still scoring it as normal, even though it's now gone, or shattering it immediately the next time i play it
this one just shatters it immediately:
calculate = function(self, card, context)
if context.after then
card:shatter()
end
this one shatters it immediately the next time i play the card:
calculate = function(self, card, context)
if context.after then
card.ability.fragile_shatter = true
end
if context.destroy_card and context.cardarea == G.play and context.destroy_card == card and card.ability.fragile_shatter == true then
card:shatter()
end
end
siiiick, thanks alot
i basically want a sticker that makes a card act like a guaranteed glass (and also work when attached to jokers)
I'm ass at modding I see because what's wrong ``` local jokers = G.P_CENTER_POOLS and G.P_CENTER_POOLS.Joker
if not jokers then
error("Couldn't find Joker pool")
end
SMODS.Joker:take_ownership("hanging_chad", {}, false)
for _, j in pairs(jokers) do
if j.name == "Hanging Chad" then
print("Found Hanging Chad! Overriding ability...")
j.ability = function(card, context)
if not (context and context.joker_main) then return end
local playerJokers = G.jokers.cards
for idx = 1, 2 do
local target = playerJokers[idx]
if target and target ~= card then
for copyIndex = 1, 3 do
local clone = SMODS.deep_copy(target)
clone:calculate_joker(context)
end
end
end
end
break
end
end
pro tip add "lua" after your ''' to make it format in lua
so like
'''lua
code goes here
'''
like this lua code
like this
no like how i showed it
also what is this meant to do?
makes hanging chad retrigger the first 2 cards played 3 times
ok then your code is nonsense im sorry lol
you're still not taking ownership correctly
look at hanging chad in vanillaremade also
someone told me that it's that
no they didn't
you ignored the comment
the what
you didn't, tomato ignored the comment in your message
oh
so I should do lua SMODS.Joker:take_ownership("hanging_chad", {j.ability}, false)
no
what should I do then
it would be ability = whatever
and also a center doesnt have ability
the values in the center are in config
i would start by making a joker that does what you want to do first so you understand the structure
then you can change hanging chad
ok
you can just straight up copy hanging chad's code from the vanilla remade wiki
once you're ready to make it edit hanging chad, look at the example of taking ownership on the smods documentation
also bump for my predicament
just do what glass cards do
i did
then hook SMODS.shatters
could i use an entire joker description as a loc_var?
elaborate?
i think there's description_text in localize or something like that
i want to put in the joker descriptions of the jokers this card consists of
ignore the tables i was doing dumb stuff
It's just descriptions
no but that's for the ui nodes
i mean there's one for just the text
it's not what they need tho
you will probably need some generate_ui stuff for this
sdm literally did this so you can bother him :3
Aw hell nah I'm out of here
:(
dont tell me i need to hook stuff
oh i could probably just directly modify card.ability_UIBox_table
via a jank card:hover hook if its updated every hover or maybe even inside the card surely :clueless:
jokers have a generate_ui function
the consequences of not knowing the smods wiki by heart
this code adds extra descriptions based on the jokers that are "fused" but it's very custom
https://github.com/nh6574/JoyousSpring/blob/fefb0aa1195ee596fb978629929e40c7023ba4a9/src/card_ui.lua#L296
also i dont use the generate_ui function anymore haha but because im trying to support crossmod
does generate_ui break crossmod?
but that function has the exact structure generate_ui would have
oh mb i just clicked the link i see
no, it's just that autumn adds yugioh properties to other cards and it required replacing the generate_ui
so i made it a patch instead
or hook i dont remember
but if it's just one card i would recommend generate_ui
You could cheese it. Make it like "Has the effect of X and Y" where X and Y are loc_vars of the name of the jokers, then reference those jokers as an info_queue
I don't know how specifically your joker work tho so maybe it's not what you want
genuinely where in the code does SMODS define that glass cards should shatter i can't find it
src/utils.lua, look for SMODS.shatters(card)
i think i could do it decently cleanly if i could extract loc vars from an existing joker card
are you making an enhancement?
no i'm making a sticker that is supposed to shatter after scoring
i hooked SMODS.shatters() successfully tho so it works now
ok glad it works
does this give me the description node
yknow hooks are way simpler than i originally thought
I found the lovely patch I used, but this requires your joker's desc to initially be a multibox one
# Add fusion ability to multibox
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = "if AUT.info then"
position = "before"
payload = """
if card and card.ability and card.ability.srl_fusion then
local _card = {ability = card.ability.srl_fusion.ability, config = card.ability.srl_fusion.config, bypass_lock = true}
local fusion_ui = Card.generate_UIBox_ability_table(_card)
multi_boxes[#multi_boxes+1] = desc_from_rows(fusion_ui.main)
end
"""
match_indent = true
(Don't forget to replace mod specific variable names 😅)
oh also super old bump i still need help with
ok im doing dumb stuff
Wild guess but try replacing G.FUNCS.use_card { config = { ref_table = booster } } by booster:open() bellow the start_meterialize line
still breaks, here's the log :/
What happens if you remove CHAK_UTIL.open_booster_pack(card.ability.extra.booster)? Can you send a screenshot?
almost lmao
What if your desc is an empty multibox?
my desc is not an empty multi box which is why im fixing that rn lol
i could do it a bit more jank way thats easier but i want to do it a bit better, how do i force an empty multi_box with a description
That's what my lovely patch does, it adds onto the existing multibox
yes, and i was wondering if i could initialize an empty multibox inside a localization file
would you perhaps know
Something like this?
j_your_joker = {
name = "Your Joker",
text = {{}}
},
anyone know why this joker is crashing? the odd thing is that it did work but something broke it and i have no clue why
config = {
extra = {
copying = nil,
},
},
loc_vars = function(self, info_queue, card)
local copying = card.ability.extra.copying
info_queue[#info_queue + 1] = G.P_CENTERS.e_negative
info_queue[#info_queue+1] = {key = 'chak_ethereal', set = 'Other'}
info_queue[#info_queue + 1] = G.P_CENTERS.copying
return { vars = { copying and G.localization.descriptions.Joker[copying].name or "None" } }
end,
calculate = function(self,card,context)
if context.joker_type_destroyed and context.cardarea == G.jokers and not context.blueprint then
card.ability.extra.copying = context.card.config.center_key
sendDebugMessage("copying:" .. context.card.config.center_key, "CHAK")
end
if context.ending_shop and card.ability.extra.copying ~= nil then
if card.ability.extra.copying.config.center.rarity == "chak_Token" then
local copied_joker = SMODS.add_card {
area = G.jokers,
key = card.ability.extra.copying
}
copied_joker:add_sticker('chak_ethereal', true)
else
local copied_joker = SMODS.add_card {
area = G.jokers,
key = card.ability.extra.copying
}
copied_joker:set_edition({negative = true})
copied_joker:add_sticker('chak_ethereal', true)
end
return {
message = "Copied!",
colour = G.C.CHAK_ETHEREAL,
}
end
end
this is the effect btw
'Upon exiting the shop, create',
'a {C:dark_edition}Negative{}, {C:chak_sticker_ethereal}Ethereal{} copy',
"of the last destroyed {C:attention}Joker",
"{C:inactive}(Currently: {C:attention}#1#{C:inactive})"
please don't save a card to the ability table
☝️
oh wait
you're saving the key but you later try to access it as if it was a card
or am i misreading
it would be G.P_CENTERS[copying], not G.P_CENTERS.copying
also copying is a string so like idk why youre trying to get copying.config
thats not gonna work
ah i see multi boxes is actually added after main
saving the key yeah
then how would i get the rarity of the copied joker from the key string
G.P_CENTERS[card.ability.extra.copying].rarity
that worked thank you 
whats the code for removing a booster pack from a shop?
hooray i did it
Neat
N how come you can react to people? The option doesn't show for me
to be fair i still need to do stuff as im doing evil chicanery that is probably incorrect because im directly storing the jokers in ability.extra lmfao
ive heard you need a role
i have the Steam role
I'm pretty sure saving jokers in card.ability will delete itself if you load the run because of recursion
Ah ok thanks
this is true
just noticed
You should look at Pinkprint from Ortalab since it's somewhat similar to what you're doing. I'm doing the same thing too but mine's unfinished and the code isn't public iirc.
noted, thank you
how do i remove a booster pack from the shop? G.shop_booster.cards[1]:remove() doesnt work
ok wait i may be dumb i see there is a fake_card thing but how do i utilize it
to my knowledge fake_card is for ui stuff, like showing the seals in the seals collection tab
How would you detect something like containing a pair but not a pair? The specific hand gets me
When are you calling the remove?
Pressing "R" using debugplus on packs in shop does remove them, and it uses :remove()
if context.before and next(context.poker_hands["Pair"]) and context.scoring_name ~= "Pair" then for example
So just to clarify, the next() detection finds all hands that contain it?
The poker hands table contains every possible poker hand, using next sees if the pair section has anything in
Gotcha. Thanks for the explanation!
i know it's bad practice to store cards as joker abilities, so how would i store a playing card with all its modifiers (edition, seal, enhancement, other modded stuff, etc) to be able to create an exact copy of it later as a joker effect
its not bad practice, its just impossible without an entirely unique saving system
objects cannot be saved
i personally would create a copy of the card in a hidden cardarea
but i dont want to explain it so dont do that :3
once you understand cardareas they're very easy
i have a bunch for different things lol
so i could do that instead of hooking card:save for my joker right
which is a combination of two other jokers
so, in a nutshell,
make a new card area somewhere hidden
copy the card to it
then, when i want it, make a copy of that card
probably the easiest
but i wouldn't have done anything with saving anyway, i would just have saved the key of the card and the values in ability if that's relevant
if you just want to store a reference of a card you can just store its sort order since thats unique per card, otherwise just save all the important information to a table in the joker
you can just move that card, you don't need to make another copy
i should probably just do that :clueless:
i want to be able to make multiple copies of it
then yes
bump
time to learn card areas it seems
actually, how would i make sure that if card.ability values change i could capture that to save that in my joker?
at that point youre probably better off saving a reference to the card
i imagine
sort order is very useful for that
i should not be doing this at 1 am but current setup is this, (joker cards gets passed along by a consumable since this joker only gets created from a consumeable)
this all works except that joker1 and 2 doesnt save and i really just want the easiest way to do that
an smods function to run calculation on a non existent joker would be cool
because idk how card save works yet and i dont know how custom card areas work yet
SMODS.pinkprint_effect
surely you could do some very dumb function that creates a card, runs the calculation and then destroys it
(probably not)
lmao
This will require more work from the self references tho
yeah the problem is that some things want the original card and some things want the card that is scoring, in a normal calculate call those are the same but here it would be two different cards
i think ill save actually saving the cards for later because i am reading pinkprint and im not comprehending
i also have the problem of the jokers just floating there that ive conveniently been ignoring
you can fix both by doing the cardarea thing
unless i could literally just make a new cardarea with minimal info and it suddenly exists
the biggest problem is effects that depend on the card being in G.jokers
yeah that's how you make one lol
yeah ive read the code partially, tangiably aware how that works i just dont know what "minimal info" is
the pointless joker_main cardarea checks 😨
oh my goodness thats surprisingly easy
one thimg im curios about when it comes to making multiple jokers
How do i make multiple jokers with different pngs?
Atlas is usually a spritesheet, and each joker sprite is referenced by their pos values
ohh i get you
so if i add an image in the folder second and give the pos value x=1 y=1 then it takes the second image?
you can see the msg im replying to haha
yeah i know but it's funny lol
the pos value is for the location of a sprite inside of the image file
so what im saying is correct? right?
but every file needs to have the same name right?
yeah thats what i was thinking

you just put multiple sprites in one image
wait what 😭
do i have one png with multiple sprites?
generally yeah
Yes
and then the pos value is for selecting the correct sprite from the image
another thingy i have, currently i have one joker in SMODS.Joker{
}
so i make an additional one in the first SMODS.Joker{
}
or do i need to make another joker do i make SMODS.Joker2{
}
just do SMODS.Joker again
the second joker is just an entirely separate SMODS.Joker { }
okay got it
thx
okay so the second joker im trying to make is invinsible.
could it be that i have to work vertically instead of horizontally in the png
Can you show your spritesheet and the pos of your second joker?
this is currently the sprite sheet that im using
and these are the pos of joker 1 and 2
ignore the Xmult
im getting to that lol
should be x=1,y=0
OH
as in
yeah i get it
also what is this yin and yang lol
other way around
Wow I'm tired
one only tells the truth and one always lies ahh
x is position from the left starting at 0, y is position from the top starting at 0
yeah yeah i get it
axis thingies
also MANGO!
thx
do you have 6 or 7 jokers
im making it for my friends and they really want a mango that gives 6 chips and 7 mult
absolute mustard
AHHHH
ikr
also the first one is my friend but i didnt want to leak his face publically lol
okay wait new issue
hello modding dev i have a joker that i want to make enhanced cards, but at the minute its only sometimes making enhanced cards. what can i do??
Show the calculate func
possibly, also did you setup the atlas correctly?
do you have a pixel_size on your joker? you should just remove that if its a normal sized sprite
i hope so?
i dont have a pixel size
this is my atlas btw if its releveant
IT WORKS RAAAH
if chrank == 1 or chrank == 2 then
local king = SMODS.create_card { set = "Playing Card", rank = "King", area = G.discard }
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
king.playing_card = G.playing_card
table.insert(G.playing_cards, king)
G.E_MANAGER:add_event(Event({
func = function()
king:start_materialize({ G.C.SECONDARY_SET.Enhanced })
G.play:emplace(king)
return true
end
}))
return {
message = 'Its a boy!',
func = function()
G.E_MANAGER:add_event(Event({
func = function()
G.deck.config.card_limit = G.deck.config.card_limit + 1
return true
end
}))
draw_card(G.play, G.deck, 90, 'up')
SMODS.calculate_context({ playing_card_added = true, cards = { king } })
end
}
end
ahem thank you very much
is this what ur looking for?
also interesting joker key scheme lol
i guess it doesnt really matter with loc_txt though
its from the tutorial im following haha
No context checks?
first time lua worker
What's chrank?
yeah but its a bigger function so i didnt include the whole thing
ah
why is it M:mult 😭
the C is for colour
not for Chips
10 trillion n' mentions in the credits.txt (im not biased wdym)
chrank is for deciding if its like a king its not really relevant lol
1 quintillion n' mentions when
https://github.com/Steamodded/smods/wiki/Text-Styling have a look at this handy text styling page
after 5 more dumb questions from me
1 SDM_0 vs 1 billion N'
n' single handedly carrying the balatro modding community /j
Why the /j when it's true 
okay thats fixed
now
actually commendable effort by everyone i love yall
i just realized this page still has oldprob... stinky....
why is my mango 3/2 pixels of another joker lol
mango?... those who know...




try enabling grid in whatever art program youre using (if it has one)
and set it to 71 by 95
just the usual paint.net
i think i have that?
wdym?
why
mick dicks cocked up
like your joker is 2 pixels from a different sprite instead of the mango
this is just true :clueless:
yes
6/7 meme
okay one more thing my brain is collapsing and the documentation aint entering how do i remove a card from existence again
you think thats bad?
did you remember to save the image
holy peak
just to be sure
card:remove?
omg youre so incredibly right
card:remove() yeah
i have 2 folders one in my documents the other in mods
😭
i keep the one in documents to make changes to make sure i dont accidently screw up
MUSTAARRRDDD
lol
and i have paint.net auto save in the one in my documents
my own genius sometimes frightens me
though the two pixels showing tells me that the first joker sprite is 2 pixels wider than it should be
so like... was that it?
holy reference
the stand is 71/95 tho right?
yeah
yeah you need a one pixel gap
i geuss that sjust paint blending
you dont need a gap
oh
ohh i see
Well it will be kinda hard without the full code, but rn I'm too tired, hopefully someone will figure it out for you
ill get to that eventually lol
first i want to get to around 20/40 functioning jokers
then ill do all the advanced styling
well that was everything relating to creating the card
but fair enough on tiredness
mango!!!!!!
okay so one more on the mango
i currently have this (nvm was just a lower case thingy fixed)
but when i run the mod it says "main.lua"}:51 '}' excpted [to close '{' at line 49] near Mult'
mult = 7 is line 51 btw
How do I make an enhancement apply an enhancement to another card
say what function is the end of round effects tied too
like if i wanted to hook it to add a consistent end of round effect regardless, not just based around a joker or card
just use the new global mod calculate function
https://github.com/Steamodded/smods/discussions/919
no need to even hook anything, it's a calculate function that will always run regardless of what cards you have in any given game state
ooooh 👀
-# i gotta update my smods anyway so this is a good excuse LMAO
i have a joker with this exact same effect and theming 😭
-# based off a friend of mine
no special Mustard card but
clip
i need to fix up the merge logic a bit
so it actually looks nice
but otherwise functional hooray
peak
woah this is gas
ok anyway ty lmao
i was thinking (if possible) to make the texture half one joker half the other one
but im not good at advanced texture manipulation so uhh
that would be cool but would definitely be quite complicated to implement
well this joker effect took me like help from 3 people + 5 hours so uhh
if i had to guess it would probably involve some shader nonsense
surely cant be that bad :clueless:
im no expert in the slightest in regards to shaders but
nvm its so fucking over
damn im reading this more this is really gas
i have ideas
yea this update is really cooking
custom jimbo quips 
i've got a mod taking advantage of the new scoring calculation stuff on the backburner, lemme pull up the funny video that's already getting old real quick
very balanced
oblivion did it first
yea but looking at the code they're doing it kinda jank (not a knock on them ofc, but still)
very nice ui
so i've made a new cardarea and cards properly get sent and retrieved from it, but whenever i exit a run i get this crash
i assume it has something to do with it trying to calculate or save and tripping up along the way
wait am i stupid cuz now whenever i play a hand This happens
this is the code
# Attempt to add new card area
[[patches]] # CHAK
[patches.pattern]
target = '=[SMODS _ "src/utils.lua"]'
match_indent = true
position = 'before'
pattern = '''-- TARGET: add your own individual scoring targets'''
payload = '''
-- CHAK start
t[#t+1] = G.stj_cards
-- CHAK end
'''
[[patches]] # CHAK
[patches.pattern]
target = 'functions/common_events.lua'
match_indent = true
position = 'before'
pattern = '''elseif card.area == G.hand or card.area == G.deck then'''
payload = '''
-- CHAK start
elseif card.area == G.stj_cards then
y_off = -0.05*G.CARD_H
card_aligned = 'tm'
-- CHAK end
'''
[[patches]]
[patches.pattern]
target = 'card.lua'
match_indent = true
position = 'after'
pattern = 'function Card:apply_to_run(center)'
payload = '''
local card_to_save = self and copy_card(self) or Card(0, 0, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center)
card_to_save.VT.x, card_to_save.VT.y = G.stj_cards.T.x, G.stj_cards.T.y
G.stj_cards:emplace(card_to_save)
SMODS.enh_cache:clear()
'''
rest of game seems to work ok lol
yeah idk why this is lol
my solution was to patch smods
patch where
Now that challenges are getting some love, with apply and calculate functions, how would I go about making a challenge start with one random card in deck?
it doesn't happen to me anymore without the patch tho so idk
did they maybe fix it in an update? i'm not on latest
there's a loop in get_card_areas that checks for area.cards
for some reason areas get their cards set to nil before they're destroyed
nah this stopped happening to me long ago
weird
you could remove all other cards with apply but challenges have a config option for the deck
ah but that wouldn't work if it's random so yeah apply
For context i just updated my lovely to 0.8.0 and smods to 0827c
do you have any other mods
i was about to check without other mods yeah hangon
just one line of the crash log doesn't help btw
-# oops
do you make your cardareas through hooks or patches, also how would i fix the loop via a patch
i hook start_run
i'll look into that then
you would patch this to say area.cards or {}
https://github.com/Steamodded/smods/blob/cb8c8746b8e5bcb5ba21bea26aa7311ec1c29ec6/src/utils.lua#L1649
ok wait i think it might be talisman cuz i removed that and it behaves now
-# you see i have not updated my other Mods in a while 😭
yeah i see the porblem nvm

yup that was it ok LOL
so for _, _card in ipairs(area.cards or {}) do?
yeah
still crashed
Hello, I have a question. How do I make a pool have custom music? the pool is called “tyler”
key = "tyler_music",
path = "tyler_music.ogg",
pitch = 0.7,
sync = true,
select_music_track = function()
return (G.pack_cards and G.pack_cards.cards and G.pack_cards.cards[1] and
G.pack_cards.cards[1].ability.set == "generic") and 10 or false
end
})```
here's the new crash
the classic blunder...............
the pool on a card would be in (G.pack_cards.cards[1].pools or {}).generic
unless you mean consumable type
Hi
im new to this server
i came here to ask for help for a balatro mod im making
(mostly the coding part)
like this?
key = "tyler_music",
path = "hell_music.ogg",
pitch = 0.7,
sync = true,
select_music_track = function()
return (G.pack_cards and G.pack_cards.cards and G.pack_cards.cards[1] and
(G.pack_cards.cards[1].pools or {}).tyler) and 10 or false
end
})```
ok
The booster pack is for jokers
yeah although it would probably be better to check the booster pack instead
but try that out
does not work
I just tried putting the mod prefix before “tyler” and the music still doesn't play
the key i believe needs to start with music_
yeah ^
ie music_tyler
also uh
is there a variable in game tha that lets you track you current run's round
like G.GAME.round_resets.ante but
Round
I usually use the name first and then _music, and it works for me
well hangon what's happening rn then
G.GAME.round
-# ty btw i forgor guh :3
how do you set a playing card to a specific rank
read the documentation
https://github.com/Steamodded/smods/wiki/Utility
oj thx i was only looking in vanilla remade
hey so my game completely closes outright when i try to spawn my joker
like theres no crash log and nothing notable in the lovely log
calculate = function(self, card, context)
local trigger = context.force_trigger
if context.before and context.cardarea == G.play then
for _, playing_card in ipairs(context.scoring_hand) do
if playing_card:get_id() == 14 then
trigger = true
end
end
end
local ace_hand = {}
for _, playing_card in ipairs(G.deck.cards) do
if playing_card:get_id() ~= 14 then ace_hand[#ace_hand + 1] = playing_card end
end
if not trigger or (#ace_hand < 1) then return end
local c = psudorandom_element(ace_hand, "nflame_acpart")
SMODS.change_base(c, nil, 14)
end```
does anything stand out here
also how do i get the whole hand played instead of just the scoring hand
assuming you mean to interact with cryptid demicolon stuff, i'm pretty sure it's context.forcetrigger without the underscore. but that doesn't seem like it'd cause a crash
you do have a typo in psudorandom_element (it should be pseudorandom_element), but i dunno if that'd be hard-crash-worthy either
that said, the loop through the deck and change_base call is happening outside of any context checks, so that's probably the main issue
well
it shouldnt trigger
because of the early return in if not trigger or (#ace_hand < 1)
Alright, tried to use Crustulum's approach (and some other things), but still getting nowhere. It needs to stay at $1 for good, but it keeps showing higher values before getting changed.
Hook calculate_reroll_cost
this voucher is the last one I need to fix before it's all stabilized.
There any quick documentation on how to do hooks?
Thanks
OH I THINK I FIGURED IT OUT
i forgot pseudorandom_element returns an INDEX
its still crashign help
🔫
HOLY SHIT ABSOLUTE SAVIOR
THANK YOU
Now how exactly do I check if a certain voucher is redeemed (modded voucher)?
any idea HOW this can be nil??
local c = ace_hand[pseudorandom_element(ace_hand, "nflame_acpart")]```
because its apparently nil
Hey does anyone know if multiplayer balatro was fixed?
wdym fixed?
pseudorandom_element returns the element as the first return, not the index (that's the second)
Well I heard that multiplayer got bugged with balatros newer update and yo couldn’t play modded multiplayer anymore
that isn't true
oh oops its not clear
Gotcha
just do local c = pseudorandom_element(...)
yea i mean pseudorandom_element doesnt say if its element or index in vanillaremade
if G.GAME.used_vouchers.v_modprefix_key
Anyone know where in the code the game decides to finish the round and start a new one, like after you beat the boss blind? I've looked around quite a bit but I'm a bit lost.
I made a code that replaces the small and big blinds with blinds from a pool, but since the blinds I put there are still registered as a "boss blind" it still ends the round afterward.
you mean ante, right?
how the hell are yall even setting up vs code for this
it literally does?
oh
check the vanillaremade wiki
Yeah yeah
Thanks fam, now it's fully working.
it's in end_round() in functions/state_events
ortalab uses small = {min = 1} instead of boss = {...} in the blind object definitions for their small/big blind variants, but i still need to dig through to see if they have any other special code to handle that or if smods can handle it by default
ah dang
Ohhh very helpful thank you
I think I should be able to hook in here
time to. go make a pull request maybe :3
i do not think vanilla remade say anything about the entire bottom field being marked with "the field must be defined after the class"
like actually why is everything piss flavored on the workspace
Oh wait I have a wayyy better way to do this, I can just hook into Blind:get_type() instead
I didn't see that there lol
How do I make enhancements/seals not appear in boosters? I thought the weight would do it but it just keeps showing up.
how do you know what that tastes like
/j
have you checked you dont have illusion?
entirely brand new run, spawning in booster packs, theyre appearing despite me trying both weight 0 and weight -9999
weird
am i doign something wrong here
...iirc the in_pool function has the args variable that can contain the "source" of where the check occurs.
i kept seeing that but couldnt find anything on how to use it T_T will see what i can do i suppose
args.source, specifically. Just need to print until you find what variable you need exactly.
good chance you want to do this
in_pool = function(self, args)
return args.source ~= 'sta'
end
(args.source usually seems to be the first three letters of the source, e.g. 'sho' for shop or 'buf' for buffoon pack. i'm not sure if 'sta' is correct but that's short for standard pack so it's worth a shot)
thinking of actually getting back into working on my mod tomorrow
question: uh
how the heck do i implement this
how do i check for what hand types are currently visibly above and below a specific hand type (buffing secret hands you cant even play with your current deck would definitely be. un-ideal.)
like.
in the run info menu
alternatively could try and get this one to actually work properly instead of just being a visual thing
how the hell do you change what hand type a hand is
also, itd be nice if i had a way to like.
somehow highlight applicable cards so you dont have to frantically keep track of every single card you’ve ever played
but only while owning the joker
2 connected questions
- can i have a custom joker pool in SMODS.add_card's
setparam and 2) does that joker pool need the modprefix
Ok, so my custom voucher works, but every redeem causes it to spawn a random Joker that can't be bought. It's just there.
Anyone know a fix?
(the code is a patched part of a function used by Illusion)
someone that have experience programing balatro mods could help me make one?, i have 0 experience programing in Lua but i have a ton of ideas and like 10 designed jokers.
Im trying to add new music tracks to the game with my mod but i don't know how any ideas on what i could do to get it working? 
Yes, no.
yeah i already got it working, thanks anyway
bump
message_card = context.blueprint_card
i may just be a bit dumb but can i get an example of what im meant to do
SMODS.Sound{
key = 'keymusic',
path = 'file.ogg',
sync = true,
select_music_track = function()
return 1e308
end
}
hey can I build my mod in like one messy lua file or do I need a file for every type eg. jokers, tarots etc
both work
or really any file structure
whatever you're most comfortable doing, although if you're working in a group the more structured the better
how to add a new line using UIT because when I try to do \n creates a new line but doesn't go back to the left instead it stays where it is
I am trying to make my joker change probabilities with oops all sixes but I can't seem to get it working
loc_vars = function(self, info_queue, center)
info_queue[#1116390750314307698_queue+1] = G.P_CENTERS.e_negative
local oopses = 0
if G.jokers.cards then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.key == "j_oops" then
oopses = oopses + 1
end
end
end
main_start = {
{ n = G.UIT.T, config = { text = "Has a", colour = G.C.BLACK, scale = 0.32 } },
{ n = G.UIT.T, config = { text = string.format("%d in 10", 2^oopses), colour = G.C.BLACK, scale = 0.32 } },
{ n = G.UIT.T, config = { text = "to make a Joker Negative\n", colour = G.C.BLACK, scale = 0.32 }},
{ n = G.UIT.T, config = { text = "At the start of a round", colour = G.C.BLACK, scale = 0.32 }},
}
return {main_start}
end,
How would I make an info queue that shows the interest cap
Have a localization entry under "Other" for the interest cap with a #1# then, in whatever you want your tooltip, you do info_queue[#info_queue+1] = {key = 'your_localization_key_for_interest', set = 'Other', vars = {G.GAME.interest_cap or 25}}
I don't know if the extra is necessary or not
Ok nvm it's not config with 'Other' it's 'vars' my bad
thank you 🙏🔥
Does SMODS.calculate_effect have a parameter for message's appearing time length?
delay = number

"rewards double the amount" at end of round.
does anyone have any methods at all
Methods to do what?
make something
at any concieveable metric
i have no bones for my mod at all so i must be doing something completely wrong
I suppose you're trying to make a deck?
Do you have lua knowledge?
no
which honestly on its own is a big sign im not cut out for this but hey im gonna at least try anyways
Sorry, I should've clip the whole section:
The multiplier goes up by time
I can help you with getting started if you've got ideas on what Jokers to add
Lua tutorial: https://www.lua.org/pil/1.html
SMODS wiki: https://github.com/Steamodded/smods/wiki
VanillaRemade, which recreates vanilla items using SMODS: https://github.com/nh6574/VanillaRemade
VanillaRemade's wiki: https://github.com/nh6574/VanillaRemade/wiki
Other useful ressources: https://discord.com/channels/1116389027176787968/1349064230825103441
Calculation contexts: https://discord.com/channels/1116389027176787968/1247703015222149120
Even just from this image I can share you some improvement: amysdeck = amysdeck or {}This single line is equivalent to those three lines you wrote.
i had two lists on two different computers so its kind of hard to tell you what i want to add first
ill probably add just a regular example joker then work my way up from there
why does the game crash when I start it? this is the only code I have ```lua
SMODS.Atlas{
key = "Jokers",
path = "Jokers.png",
px = 71,
py = 95
}
SMODS.Joker{
key = "joker2",
loc_txt = {
name = "ahmed",
text = {
'gives',
'a {C:attention}Joker{}',
'{X:mult,C:white}x#1#{} Mult'
}
}
}
Your Joker needs:
the Atlas in your Joker
the pos variables
acalculatefunction.
I'm watching a tutorial and there it ran just fine just not functioning
because there is no function yet
Link the video?
Jokers need none of those.
Also, what error do you get when opening?
nvm I fixed it
wrong png name
nvm. apparently I overdo it.
it was Joker.png instead of Jokers.png
what could I do instead of math.random(1,3)?
What is the context for “if played hand is most played poker hand”
You can use this from 0711a to let it be influenced.
local recipe_consumables = {}
for _, c in pairs(G.P_CENTER_POOLS.Consumeables) do
table.insert(recipe_consumables, c.key)
end
Can i make this only check for vanilla consumables
.
ty
There is no context for that.
This isn't guaranteeing an edition or enhancement on all playing cards in shop. What am I doing wrong?
why won't it add 100Xmult lua atlas = 'Joker', pos = {x = 0, y = 0}, config = { extra = { Xmult = 100 } }, loc_vars = function(self,info_queue,center) return {vars = {center.ability.extra.Xmult}} end, calculate = function(self,card,context) if context.Joker_main then return { card = card, Xmult_mod = card.ability.extra.Xmult, message = 'X' .. card.ability.extra.Xmult, colour = G.C.MULT } end
Change Xmult_mod to Xmult. I think.
ok
still won't add Xmult
It's context.joker_main, it's case-sensitive
Good catch.
Also you dont need message and colour
This is how my Joker does x_mult.
Just ignore all the stuff about x_mult_gain
it works thanks
Ima read this for learning purposes
You can sift through my mod code if it'll help.
ok
SDM, think you can crack this one? I've tried a few solutions to no avail
bet
what is it supposed to do
the voucher?
I see
Does your code make it trough the "if"?
Fair warning: This deals with hooking to already existing code in vanilla Balatro. This is even out of my skillset.
I'm assuming it does since I don't see why not.
Let me make that and test it rq.
Unless that's something else different
Oh my god, I am actually blind. Thank you for pointing that out.
-# Now to go hook the things for Retcon to make it 50% cost... aaaaahhhhhhhhhhhh
I read this and don't know how to add it to my code Lua atlas = 'Joker', pos = {x = 0, y = 0}, config = { extra = { Xmult = 100 } }, loc_vars = function(self,info_queue,center) return {vars = {center.ability.extra.Xmult}} end, calculate = function(self,card,context) if context.joker_main then return { card = card, Xmult_mod = card.ability.extra.Xmult, message = 'X' .. card.ability.extra.Xmult, colour = G.C.MULT } end
Xmult_mod needs to be Xmult.
it also works like Xmult_mod
Does your joker have a key value?
nevermind, misread.
like key = 'my_joker'
What if you just return this?
return {
x_mult = card.abilty.extra.Xmult
}
it's already returned return { card = card, Xmult_mod = card.ability.extra.Xmult, message = 'X' .. card.ability.extra.Xmult, colour = G.C.MULT }
Yea no but I mean what if you remove the extra stuff and just do x_mult
your key has to be unique, "joker" already exists and as a result bugs out
that's why it's capitalized 😭
it won't do that unless you have mod prefix disabled in your mod
The modprefix gets added onto it, I don't think that's the issue?
pretend i never existed okay byeee
it would work but the rest is there to add a message like "again" from mime
The message gets added automatically if you use default field names
like?
mult, chips, dollars etc..
true, but That's not what I'm trying to do.
I'm trying to make the Xmult a math.random(1,3)
you can just do x_mult and smods does the rest for you
there's no need to add the other stuff yourself
ok but let's get to the point please
what point
If you want to do random x_mult, check how Misprint does it for mult: https://github.com/nh6574/VanillaRemade/blob/34442a850d9ecbbac5d48b27507de99590908e27/src/jokers.lua#L633
Just return { x_mult = <whatever xmult you want to apply> }
there's nothing else to it
I want to make it random so it changes like misprint
but then with Xmult instead of Mult
return { x_mult = pseudorandom('my_xmult_misprint', min, max) } then
ok
how would I make this repeatedly update SMODS.Joker{ key = "joker2", loc_txt = { name = "ahmed", text = { 'gives', 'a {C:attention}Joker{}', '{X:mult,C:white}x#1#{} Mult' } },
Look how vanilla remade does it with misprint
Is right here
thanks
what
I checked it and tried this and now the game crashes the moment I hover my mouse over the joker do you know why? ```Lua
SMODS.Joker{
key = "joker2",
loc_txt = {
name = "ahmed",
text = {
"gives",
"a {C:attention}Joker{}",
"x{X:mult,C:white}#1#{} Mult"
}
},
atlas = "Joker",
pos = { x = 0, y = 0 },
config = { extra = { min = 0, max = 200, Xmult = 100 } },
loc_vars = function(self, info_queue, center)
local minv = (self.config and self.config.extra and self.config.extra.min) or 0
local maxv = (self.config and self.config.extra and self.config.extra.max) or 0
local r_mults = {}
for i = minv, maxv do
r_mults[#r_mults + 1] = tostring(i)
end
local dyna_string = {
{ string = "gives a ", colour = G.C.UI.TEXT },
{ string = "Joker", colour = G.C.RED },
" x",
r_mults,
" Mult"
}
local main_start = {
{
n = G.UIT.O,
config = {
object = DynaText({
string = dyna_string,
colours = { G.C.WHITE },
pop_in_rate = 9999999,
silent = true,
random_element = false,
pop_delay = 0.5,
scale = 0.32,
min_cycle_time = 0.5
})
}
}
}
local currentX = (center and center.ability and center.ability.extra and center.ability.extra.Xmult) or self.config.extra.Xmult
return { main_start = main_start, vars = { tostring(currentX) } }
end,
calculate = function(self, card, context)
if context and context.joker_main then
return {
card = card,
Xmult_mod = pseudorandom("my_xmult_misprint", 1, 100),
message = "X" .. (card.ability and card.ability.extra and card.ability.extra.Xmult or tostring(self.config.extra.Xmult)),
colour = G.C.MULT
}
end
if context and context.setting_blind then
local new_card = create_card("Joker", G.Jokers, nil, nil, nil, nil, "j_joker")
new_card:add_to_deck()
G.jokers:emplace(new_card)
end
end
}```
Can someone check if all good here, please? I'm very amateur at coding so I can't really tell
Tried making a simple effect but still struggling
Log?
It's #G.play.cards not #G.play
the probability and context check should be swapped
Hi H'!
hello
attempt to call a method 'gmatch' [a nil value]
that's the log
what's gmatch
don't know
ok
trying to make a joker debuff itself for 1 hand, it debuffs itself (and sets card.ability.extra.debuff_from_borrowed_time to true when it does) but doesn't undebuff after
function SMODS.current_mod.calculate(self, context)
if context.after and context.cardarea == G.jokers then
local card_t = SMODS.find_card("j_lcb_t_corp_rodya", true)
if card_t then
for i, v in ipairs(card_t) do
if v and v.ability and v.ability.extra and v.ability.extra.debuff_from_borrowed_time then
v.ability.extra.debuff_from_borrowed_time = false
v:set_debuff(false)
end
end
end
end
end
oh
hum heya how can I prevent a consumable's design from stretching to fit a normal card's size (I want it to be 21 by 21)
Hmm
Either change your atlas to be 21x21, but it's the only small consumable, try adding a display_size
you always have to do display size regardless of atlas dimensions, the game always stretches cards out to the default size regardless of atlas dimensions
What if I modify YOUR display_size? 
ok
Is this basically saying Talisman's not playing nice or did I mess up?
G.GAME.dollars is a table with talisman
Iirc
you need to to_big around the 0's
Damn you, Talisman.
just slap or (insert to_big thing here) by the 0's?
how can i get the current score accumulated during a blind
no, just replace them with to_big(0)
and if you havent yet put to_big = to_big or function(x) return x end at the top of your main file
so it works without talisman
Good news is: it's not crashing.
Bad news: It didn't halve the cost.
Wait, scratch that, I forgot to hook another function.
SMODS.calculate_round_score()
kty
Is there any way to make this $10 change to $5?
(Visually speaking, it works technically.)
lmao
The repaint I have installed is a complete tossup
why won't this work? if context.setting_blind then for i = 1, 10 do local new_card = create_card(joker2.config.self) new_card:add_to_deck() G.jokers:emplace(new_card) end end
idk what joker2 is but joker2.config.self probably doesn't exist
and create_card has many more required arguments
you probably want something like SMODS.add_card{ key = joker2.config.center.key} (you would remove add_to_deck and emplace too)
joker2 is the key of my joker
Hi, does anyone have a list of blind requirements past ante 39 on White Stake so I can help balancing?
you could use the ref_table and ref_value for this
Where can I find how to use that to modify that value specifically?
i dont imagine anyone has these on hand since they require bignum or some other library to even calculate, you could try opening the game with debugplus and talisman and doing eval get_blind_amount(ante) to get the amounts though
i assume your making your own ui so https://github.com/Steamodded/smods/wiki/UI-Guide#node-configuration
I'm trying to modify as little of the existing UI as I can while getting the change to go through.
But I'll check that later on.
what's your current code?
For the technical side or visual?
Gimme a bit to get what I have
Okay, lemme try
Just where it says "10$" to 5.
what game code exactly?
uhh generally all the game files
lovely/dump
Thank you H'
ok so it's kinda hardcoded
why is it localize('$')
does that even change with language
i thought it was just the dollar symbol in every language
If only there was an injector that let you change lines of code, that'd be lovely
Least questionable part of the source code
This is gonna require patching, isn't it?
...................................................................................
localize("my buthoel")
yes
why am i getting the nxkoo treatment
Alright, how do I do patches?
You've got 2 solutions
1: patch
2: have it change the text of the node every time (can be a bit messy)
Just patch it honestly
Blunderboard
Look at the lovely repo
Or basically any mod ever
i will have a lovely injection today
or vanillaremade wiki
inject me with lovely
lmao
toodles

How would I make it so that you can't skip a blind?
similar question here how would I make it so that you cant skip a specific booster pack
nvm
another hook
:D..
how can i make a joker retrigger other jokers
if context.retrigger_joker_check then return {repetitions = 1} end
kkty
Also you need to enable it.
the mere mention of the blunderboard made you forget
I know cryptid already did something like this but...
evil.....
where?
i legit opened balacord and just said shit i thought i left it on modding chat
😭
