#💻・modding-dev
1 messages · Page 257 of 1
wadafak smods wiki lied to me
and im honestly tired of smods patching stuff and not indicating if its their addition or not
use this as ref
These were added in 1.0.0~ALPHA-1428c-STEAMODDED.
ahhh yeah i figured
so yeah that should work provided youre using latest smods
which reminds me i need to update
this was the EXACT thing i needed to get it working TYSM!!!!!!!!
anyone know where rarities are defined in the base game i feel like ive searched everywhere
They aren't.
Just like stickers, rarities are kinda just a value handles in places it needs to without actual objects created to handle them.
ah
ok well umm anyone know any other mods that have custom rarities since i think cryptid just uses its own thing
yeah
theyre easy
SMODS creates vanilla rarities as well.
just make one
oh wait hang on
ok why is 0312b dying
set the other joker rates to 0
then they cant show up at all
uhh how do i do that
How many Jokers have this rarity?
SMODS.ObjectTypes["Joker"].rarities[2].weight = 0
SMODS.ObjectTypes["Joker"].rarities[3].weight = 0```
where 1 is common, 2 is uncommon, 3 is rare
4 is legendary and can't show up so it doesnt matter
Explained right there
Joker is the default when you can't add any more jokers of a specific rarity
I had to figure this out cause a joker i made needs to make all rarities have an equal chance to show up
Having only one means that you'll run into Jimbo any time it tries to generate two of your rarity.
in the case of vouchers, the game uses Blank
ok hang on lemme try adding a different joker for testing
ok well that works
actually that makes a lot of sense
in case anyone's wondering how to destroy/remove all cards held in hand upon selling a joker: (thanks @solar eagle)
interesting choice using k
saw someone else use k and was like "eh why not"
Whenever I start dissolving cards I start drawing these nothing cards that can't be selected, but take up deck and hand room
how are you dissolving them
dissolving ~= deleting
How do I make them do the second thing
look at hanged man
I'm looking hanged man and it seems like it just also does start_dissolve, and does shatter for glass cards
is it possible to add a gradient to the mods badge name?
read calculate functions in smod wiki
IIRC you need to return the cards like destroyed = true
just read the smods wiki
I've been getting 99% of my information from the wiki
Would "since taking this relic" be redundant?
I worded it this way because I wanted to differ from "in this run", but now I really wanna change it to "per Planet card used".
This makes it delete only one card, I want it to delete the whole hand
👁️👄👁️
return makes your code thread immediately exit from your calculate function at that moment.
Since you put it inside the for loop, it only gets to process the first entry before ejection.
Yeah, I know, how do I make it not do that while still properly removing every card?
I think, instead of context.final_scoring_step, try context.destroy_card?
Oh, and, context.destroy_card iterates through each card in scoring hand so you won't need the for loop.
The for loop is also putting all of the cards into a variable on the joker
And I want it in the full hand
So the destroy_cards method just isn't gonna work, tried making it work with the full hand, it doesn't
You can keep the table.insert and everything in the Event except start_dissolve inside the for loop under context.final_scoring_step then.
I've heard there's optional smods config that lets you destroy unscored played card, let me go check that.
I do not know how to reference the currently being destroyed card inside the destroy_card context to use start_dissolve on it
card just dissolves the joker itself
hey all silly question, does creating a joker with the normal SMODS.Joker ={ make it able to spawn in the shop?
or do you have to like put them in a shop pool or something like that
I need to find a different method than destroy_card, it doesn't work
Try keep everything in this pic except return {remove=true}.
If it's one of the 3 rarities that show up in the shop it should do it automatically.
are you trying to delete every card in hand?
oh in played hand
cuz this works in deleting your entire hand
maybe if you edit G.hand.cards to G.play.cards it'll work
That doesn't properly delete them
it does for me
They show up as ghost cards that can appear in your hand but can't be selected or played
maybe it's different with the played hand?
That's the whole reason I'm trying to find a way to delete them beyond start_dissolve
How can I replace the original atlas of all jokers with a custom file?
this doesn't work...
Like a texture pack?
perfect thanks
i edited my code to make it delete played cards and it does work
you can use start_dissolve just fine
No, I can't, because it started created ghost cards
I'm not saying that as a hypothetical
It started happening
im not either
I don't know what you're doing differently then, I was just using start_dissolve
how would i make a custom title? like instead of balatro, its fragment?
did you continue a run after modifying the code?
No, I'm starting a new run every time, specifically to avoid that problem
if context.destroy_card and context.cardarea == G.play and not context.blueprint then is fine for me
this might be a silly question but how do i make a custom deck? im looking at the wiki and theres no SMODS.Deck or anything
SMODS.Back
oh right
thank you btw
absolute peak
Ripping my hair out trying to do what should be simple math 😭
developing in a nutshell lmao
I am attempting to normalize a shader for texture atlases of different sizes (since vanilla cards tend to use big shared atlases and my modded cards each use an individual texture atlas)
And like........ this should not be hard?
Is there a way to check the current chips during calculation?
I think it is hand_chips
So do I reference something to get the value or do I literally just put hand_chips?
Because I wanna divide hand_chips by a number to get a different value.
There is also G.GAME.chips
you literally just do hand_chips. It's a global that's accessible during joker calculations
Attempt to diagram this out
Ok, will do.
Now I am literally copy-pasting code from Hanged Man and it's not deleting cards
i think the issue is that the deleted cards get shuffled into the deck after
i saw it happening on mine too
the only card that deletes played cards is sixth sense
so it's the only one where this is relevant
This should be able to work just to get the pixel position of only within where the sprite position is currently set, but I'm still getting weird results
float height_mod = texture_details.a / image_details.y;
float pos_x = (texture_details.x + tex_coords.x * width_mod) * width_mod; // Normalized pos_x
float pos_y = (texture_details.y + tex_coords.y * height_mod) * height_mod; // Normalized pos_y
vec4 pixel = Texel(tex, vec2(pos_x, pos_y));```
however the game code on how it achieves is either very hidden or i am very sleep deprived
maybe both
One card has a texture width of 71x95, so the base texture size, it works fine. One has 142x95, meaning it's twice the width, and another is 213x95, so 3x with
On both of the latter two it seems like it doesn't squish the shader texture appropriately
The code for deleting the card literally just isn't in card.lua or game.lua
Destroying cards shouldn't be this hard
i've been trying to figure it out too cause it might be something i want to do as well but it's suprisingly complex
how can i give myself specific jokers or consumables?
maybe deleting the ghost cards off your deck after dissolving them?
im not sure how you'd do that tho
i was trying to check judgement but couldnt find the judgement code
DebugPlus mod
debug plus mod
oh like
If you have a more recent version of SMODS (within the last two months), there's a specific context to flag cards for deletion
yeah thats what i was planning on doing i just dont know how to use it
i was just going to use the execute command
i think thats what its called
you press ctrl and 3 on any card in the collection
oh
tab for more info
it has this in there if its any help "context.destroying_card" can't spot it in your screenshots
¯_(ツ)_/¯
That only destroys scoring cards
Tried it before
Throw all obvious answers out the window, I've done them
what you trying to destroy?
All played cards
SMODS.optional_features.cardareas.unscored = true
After adding them to a table inside the joker that destroys them
Then yeah, you use the option unscored cards feature, and then just have each card add itself to the joker within that context
HOW DID I NOT KNOW THIS THIS IS SO USEFUL
is there a way to reload a mod from inside the game???
oh that would have been helpful a couple hours ago
HUH
Where do I put this?
i compared scoring cards and full played hand for a joker of mine
main.lua
like is there a mod reload button
ive just been closing and reopening the game
I though you said there was, my bad
oh right
I have a restart button though
I love accidentally typing mmmmmmmm in the last place my cursor was on my text editor [=
you can also press alt+f5
Ah, yeah, that explains it
hm
Is it context.cardarea = G.unscored?
WHERJES THE TOOLTIP
I just realized, why does holding m remove all spaces from the mod directory?
also whats up with C:dark_edition???
im guessing its used in place of a gradient but how do i add it?
how do i change the title splash????
I figured this one out, it was context.card.ability.set == 'Voucher'
How does one stop a voucher from redeeming?
ok how on earth do i use C:dark_edition and get it to work and also whats the tooltip for a red seal???
You put {C:dark_edition} before the text you want to be that color.
well thats the neat part, i did but it doesnt do anything
presumably because it changes colour
What does it look like in game?
oh wait hang on
wait how do i put a tooltip and a colour on the same piece of text?
turns out it was just applying the tooltip and not the colour
IM NOT ALLOWED SPACES FOR SOME REASON
OK THEN
WHY IS THIS FINE
BUT THIS ISNT
orange is fine just save and have a look
I'm going insane
smod is fully up to date
The vanilla joker example literally uses context.other_card in the exact same function
I swear to god the universe just hates me
I think I'm done, I wanna make mods, but this is way too much of a hassle to get working, especially for something that should be so god damn easy, and something that is LITERALLY DONE BY THE OFFICIAL DOCUMENTATION
How does one get the key of a vanilla object?
I've been trying to do ONE THING for the past what, 3 hours?
Still haven't gotten it working, not even a little bit
i think you can just look through the vanilla code and it should be the name of the variable i think
what object do you need?
The hardest part of the joker is working, and the easiest part is completely broken in a way that causes the game to stop functioning correctly
I'm trying to get so when you buy a voucher it creates a copy of itself in the consumable slot.
in the consumable slot??
Yes?
anyway this is them
interesting
I know but how do I get it from context.card?
oh wait
Also there is no redeem button when they are in the consumable slot.
i mean vouchers dont normally go in the consumable slot
I'm aware.
hey what if i want the joker to subtract money at the end of the roun
You remove if bonus > 0 then end
What font is the "JOKER" on the jokers in game?
As like, where can I find A-Z of that style so I can copy-paste onto my jokers?
i dont think it was originally a font but https://fontstruct.com/fontstructions/show/2622222/jokerfontbalatro might be useful
I figured it out, you look through G.P_CENTERS and match the name.
neat
yippee!!!
im started to think theres no tooltip for red seals
like i know you can get the little one on the side, its on deja vu
but no hover tooltip for some reason
HAMBURGE
is there a good way to add mult to a joker once the round is over?
Checking for context.end_of_round
Is there anyway to change this to +1 consumable slot?
how do i use modify_scoring_card to unscore a card? returning remove_from_hand = true doesn't seem to work
how do i create a specific joker
can you show your code? that should work fine
card = create_card("Joker", G.jokers, nil, nil, nil, nil, j_jokerkey)
card:add_to_deck()
G.jokers:emplace(card)
thanks
dont forget the mod prefix btw
Or simply use the SMODS.add_card function
how do i use it
bro
<@&1133519078540185692> smite this fella thanks
anyway
#G.GAME.interest_amount
is this not the correct thing for interest?
my game crashed when i tried to assign it to a variable
G.GAME.interest_amount is a number
# is used to return how many keys are assigned to a table
:3 sorry
basically, just use G.GAME.interest_amount instead of adding the "#"
my ass out here not knowing how to use SMODS
mhm, no probs
you actually
-# its not mine
Is this possible to do or can it only be done visually?
im pretty sure the negative editions of consumables and jokers are different
But this is a voucher.
interest amount is returning literally only 1 each time, even if i have 0 dollars or 20 lol
is that
is that the right one?
uh I mean the tooltip is based on what kind of card it is, not the area it's in
That’s the value you get per interest
the default is the joker version, and there's not exactly one that's voucher-specific
OH gotcha.
how can i calculate how much interest im actually getting? just take the amount of money in hand and do it manually?
is there like a G.GAME.Money_in_hand or
Yes, I don’t remember if there’s a function that does it, it’s probably manually done by thunk
oh its dollars
How do you use the pseudorandom function? Mostly how to do you put in a good seed for it?
I tried to look at hallucinations code but it's causing bugs.
I'm using G.round_resets.ante and it's crashing the game
any good?
wdym by "when a joker is debuffed then gain +X3"
Fixed it
when this joker debuffs another joker, the joker that debuff it gain +X3
no this is crazy work
yep
this shit debuffs like a X20 Canio and when the canio is undebuffed bro becomes X60??!
oh
i thought it was gonn agive the debuffed joker the XMULT i was like WOAH
thats some cryptd levels of shit
...the description is very unclear
would be funny as hell lol
how would you explain it?
Every hand, a random joker is debuffed,
gains X3 Mult
...
(Currently X1 Mult)
Upon selecting a Blind, this Joker gains X3 Mult, and Disables a Random Joker
Upon clearing the Blind, all Jokers are restored
How about this
thats nottttt its effect
but yes, i agree its overpowered as hell
i was suggesting a rebalance
i think it should just be X1 mult
every hand you are losing every other joker
X1 -> X2 -> X3
yes but
I would format the bottom line as {C:inactive}
either make it X1 per joker or X3 at start of round
lets say you have 4 fodder jokers
small mag would get X12 Mult from disabling them
thats busted
X1.5 then
my bad, it was not working because it was wrapped in an event
dont forget to credit them if you are
although, i want modify_scoring_hand to be separated by whether it's called from debuff_hand or evaluate_play
Yeah that was mentioned yesterday, I’m not 100% on whether debuff hand should use that context or not
as a current workaround, i'm using G.STATE == G.STATES.HAND_PLAYED but that still gets called twice. i suspect one is from debuff_hand
What the absolute FUCK
Anyone see any glaring errors with my logic lmfao?
interest cap is 25 okay nice
interest amount is one cool
cap it at 25 if i get more than 5 bucks of bonus
wait
You can just a math.min originally to avoid the if
It will fix the bad logic you have in your if statement too
me when bad logic :(
nope
did shit all
for whatever reason its just
not working
like the interest cap is not about to be a deciding factor in my joker
nope
fuck you
minus -12 dollars
What’s the intended effect?
this
basically
joker eats your interest and turns it into +mult
i want the user to see it subtract the exact amount of interest on the round end page tho
so they know its doin smth
key = 'greed',
loc_txt = {
name = 'Kulling Kopel',
text = {
"This Joker gains {C:mult}+#2#{} Mult",
"per {C:money}$1{} earned of {C:money}Interest{}",
"{C:red}Destroys all{} {C:money}Interest{} {C:red}Gained{}",
"{C:inactive}Currently{} {C:mult}+#1#{} Mult}"
}
},
config = { extra = { mult = 1, multgain = 1} },
rarity = 1,
atlas = 'BetterVanilla',
pos = { x = 2, y = 0 },
cost = 6,
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.mult, card.ability.extra.multgain } }
end,
-- calculate and return flat mult
calculate = function(self, card, context)
if context.joker_main then
return {
mult_mod = card.ability.extra.mult,
message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.mult } }
}
end
end,
-- Steal dollar value from interest
calc_dollar_bonus = function(self, card)
local bonus = - (G.GAME.interest_amount * math.floor(G.GAME.dollars / 5))
bonus = math.min(bonus,((G.GAME.interest_cap * G.GAME.interest_amount) / 5))
card.ability.extra.mult = card.ability.extra.multgain*(-1 * bonus)
return bonus
--message = "Stolen"
end
-- Since there's nothing else to calculate, a calculate function is completely unnecessary.
}
this is what im runnin with so far
local bonus = G.GAME.interest_amount * math.min(math.floor(G.GAME.dollars / 5, G.GAME.interest_cap)
return -bonus
I’m pretty sure this is what you want
With the mult bit added obviously
wait hold on lol
How could one check if a consumable is being destroyed?
like yeah no shit bonus is always gonna be smaller than interest cap its literally negative lmfao
the pesky minus sign
You don’t need to compare it with this statement though
yep
it works perfectly
thanks for catching that
while we on the topic tho
description fine?
joker in general a good early-mid scaling joker
i was thinking about turning bro into an XMULT joker tbh
like every one dollar is X0.05 mult so every 20 bucks it goes up by X1 or smth
i think as he is now he is a good common +mult scaler, about as balanced as a green joker or ride the bus as losing interest is about as bad as wasting all your hands to ramp a bus or a greenbo yknow
fix the formating
also 'all' and 'gained' dont have to be red
also you dont earn any interest right?
'This Joker gains {C:mult}+1{} Mult',
'per {C:money}$1{} earned of {C:money} Interest but,',
'does not earn {C:money} Interest{}'
I fixed this by always checking how many negative vouchers in the consumable slots there are.
Except the visual.
"page 1/4" 👀
check out my mod for more information!
#1338562637453066240
-# shameless plug
Can someone explain why editions are applied before cards even fly out of hand? (Midas mask does everything properly but my joker doesn't)
if not card.debuff then
if context.cardarea == G.jokers and context.before and not (context.individual or context.repetition) and not context.blueprint then
if pseudorandom("handsome") < G.GAME.probabilities.normal / card.ability.extra.denom then
local faces = {}
for k, v in ipairs(context.scoring_hand) do
if v:get_id() == 11 and not v.edition then
faces[#faces + 1] = v
v:set_edition(poll_edition('tag', nil, false, true, card.ability.extra.rates), nil, true)
G.E_MANAGER:add_event(Event({
func = function()
v:juice_up()
return true
end
}))
end
end
if #faces > 0 then
return {
message = localize('k_hnds_handsome'),
colour = G.C.dark_edition,
card = card
}
end
end
end
end
end```
it's a minor visual issue
add a delay
delay(0.5) or something
before the for loop
it probably does
\
like this?
nothing changed
thats weird
How do I make vouchers in the consumables slots give 3X mult each?
do it before set_edition
lets see if that works
make sure to restart your game obvi
1.5 delay
That won’t work
nothing has changed
replyng to this cause i have the same issue
You need to either put it in an event or use the delay in set edition
is there a param for this?
i just looked at my code and thats what i did
so try that
ah, so I put delay here?
Like observatory.
Because thunk hardcoded a solution
We also did it in Cosmos
If you want to both have the bonus from the Edition but also have the Edition wait until the correct time
You need to patch code to add a system similar to Midas Mask
What Midas Mask does is that it applies the Enhancement but sets a variable that tells the Enhancement to not be drawn
So the cards are already Gold, they just don’t show it
That’s what we had done for Spinagogue Champion in Cosmos
-# Although I suspect it’s slightly outdated now because I believe SMODS.DrawStep overwrite our patch targets
Hello good people! So, here is the problem: For some reason, this function seems to change the values of all localization stuff but the game just resets 'em back to normal. Any fix, maybe, idk?
I have a similar workaround in ortalab
It works like midas mask but only the first card gets and edition (fires once?)
I might did something wrong
mb I should return faces or something?
I don’t think it should use an Event
patches are dark woods for me xd
Events could end up mistimed IMO
Is there a tut for patches in balo?
Events will animate correctly but not count for scoring
very helpful balatro
Isn’t the timing of the Event sensitive to other Events, game speed, and processing power?
Which isn’t the Midas Mask behaviour. Midas Mask would count for scoring e.g. via Vampire and Golden Ticket
did you call one of your variables "table" and then try to use a table function
that has happened to me an embarrassing amount of times
Is this the right stuff?
possibly but i was doing random shit to try and get smth to work 😭
lemme see
Maybe I should just build delaying editions into smods properly
You don’t need the id check
Just your own variable
function localize(args, misc_cat)
FG.mila_iterate('mila')
return 'mila' end
function FG.mila_iterate(args.text)
for k,v in pairs(args) do
if type(v) == 'string' then v = 'mila'
elseif type(v) == 'table' then FG.mila_iterate(v)
end break
end
end
i know it looks bad but basically we're trying to change every text in the game to mila
did u just override localize...
i know it looks bad but basically we're trying to change every text in the game to mila
and why is one of the parameters args.text
do not question just i need help
some localize calls expect a table of nodes and not a string
i mean you needa be questioned to be helped sometimes
we've been trying to add a table the entire time but we just couldnt 
Localise is one of those funny functions that works in completely different ways depending on how it’s called
function FG.mila_iterate(ref)
for k,v in pairs(ref) do
if type(v) == 'string' then v = 'mila'
elseif type(v) == 'table' then FG.mila_iterate(v)
end break
end
end
FG.mila_iterate(ref)
this is the original function made by other dev that i was busy fucking up
@bold sleet get over here we're getting helped
i hate that function
I am reading.
This function, in theory, replaces every single piece of text with 'mila'.
But balatro does not give a single fuck and reverts it back to normal.
...why is there a stray break?
Because I am tired somewhat and my brain cannot work correctly.
here
A slightly updated version.
When loading balatro, the prints do fire (when I uncomment them).
The values DO get replaced.
In this rare case that is complete jank and I don’t know why you’d ever do this, you should just rewrite localize
But uh... balatro idk how reverts everything back to normal™️
we tried
We do not understand how the fuck that function works.
You can’t mess with localisation like that
if not card.debuff then
if context.cardarea == G.jokers and context.before and not (context.individual or context.repetition) and not context.blueprint then
if pseudorandom("handsome") < G.GAME.probabilities.normal / card.ability.extra.denom then
local faces = {}
for k, v in ipairs(context.scoring_hand) do
if v:get_id() == 11 and not v.edition then
faces[#faces + 1] = v
v.hnds_handsomed = true
v:set_edition(poll_edition('tag', nil, false, true, card.ability.extra.rates), nil, true)
G.E_MANAGER:add_event(Event({
func = function()
v:juice_up()
v.hnds_handsomed = nil
return true
end
}))
end
end
if #faces > 0 then
return {
message = localize('k_hnds_handsome'),
colour = G.C.dark_edition,
card = card
}
end
end
end
end
end```
even with that patch it doesnt work like midas
right, but how do i add my own colour?
Stick an extra true at the end of set edition and I will update smods to handle this later today
G.C.VictinsCollection = {}
G.C.VictinsCollection.ENHANCEMENTS = {
Stone = HEX("D0D2D6"),
Wild = {0, 0, 0, 1},
}
G.C.VictinsCollection.HAND_LEVELS = {
HEX('efefef'),
HEX('ffff87'),
HEX('ffd025'),
HEX('ff9f43'),
HEX('ff7b6b'),
HEX('ff6195'),
HEX('fb3fb7'),
HEX('d425d0'),
HEX('722be3'),
HEX('3269ff'),
HEX('58affe'),
HEX('2effc4'),
}
G.C.VictinsCollection.HAND_LEVELS[0] = HEX('FE5F55')
G.C.VictinsCollection.POKER_HANDS = {
['High Card'] = HEX("A10000"),
['Pair'] = HEX("A15000"),
['Two Pair'] = HEX("A1A100"),
['Three of a Kind'] = HEX("626262"),
['Straight'] = HEX("416600"),
['Flush'] = HEX("008141"),
['Full House'] = HEX("008282"),
['Four of a Kind'] = HEX("005682"),
['Straight Flush'] = HEX("000056"),
['Five of a Kind'] = HEX("2B0057"),
['Flush House'] = HEX("6A006A"),
['Five of a Flush'] = HEX("77003C"),
}
G.C.VictinsCollection.OTHERS = {
Purple = HEX("CB31DB"),
Zodiac = {0, 0, 0, 1},
Ophiucus = HEX("678900"),
}
this is how I do it
ah :D
would I need patch then?
cheers ^^
you'll need more to use it in text
No
oh, what else do i need?
I do it with a hook
local loc_colour_ref = loc_colour
function loc_colour(_c, default)
if not G.ARGS.LOC_COLOURS then
loc_colour_ref(_c, default)
elseif not G.ARGS.LOC_COLOURS.vic_colours then
G.ARGS.LOC_COLOURS.vic_colours = true
local new_colors = {
vic_HighCard = G.C.VictinsCollection.POKER_HANDS['High Card'],
vic_Pair = G.C.VictinsCollection.POKER_HANDS['Pair'],
vic_TwoPair = G.C.VictinsCollection.POKER_HANDS['Two Pair'],
vic_3OAK = G.C.VictinsCollection.POKER_HANDS['Three of a Kind'],
vic_Straight = G.C.VictinsCollection.POKER_HANDS['Straight'],
vic_Flush = G.C.VictinsCollection.POKER_HANDS['Flush'],
vic_FullHouse = G.C.VictinsCollection.POKER_HANDS['Full House'],
vic_4OAK = G.C.VictinsCollection.POKER_HANDS['Four of a Kind'],
vic_StraightFlush = G.C.VictinsCollection.POKER_HANDS['Straight Flush'],
vic_5OAK = G.C.VictinsCollection.POKER_HANDS['Five of a Kind'],
vic_FlushHouse = G.C.VictinsCollection.POKER_HANDS['Flush House'],
vic_5OAFlush = G.C.VictinsCollection.POKER_HANDS['Five of a Flush'],
vic_stone = G.C.VictinsCollection.ENHANCEMENTS.Stone,
vic_perishable = G.C.PERISHABLE,
vic_rental = G.C.RENTAL,
}
for k, v in pairs(new_colors) do
G.ARGS.LOC_COLOURS[k] = v
end
end
return loc_colour_ref(_c, default)
end
I’ll do it all for you so we don’t have multiple different systems trying to do the same thing
Huge thanks
if you want a reference we did it in Cosmos
thanks ^^
I’ve already done it in ortalab
also I had forgotten I already had defined poker hand colors
I'll try fuck w it when i get home 🙏
its scared of you
Sometimes its hiding, sometimes running away
ooh question, has anyone added en-gb as a localisation language yet? :D
just in case spellings differ for some Jokers
These are all added languages
right
i suspect they're effectively the same anyway, so it doesn't really matter
but it's a bit weird that it's en-us and not just en
#setEnGbToDefaultItsTheCorrectEn
is this code correct
I'm more confused why it isn't en_US
naur

the third line in this photo is doing nothing
are you setting a value?
your just douing a calculation with no return or member setting
oh
if context.joker_main then
if card.ability.extra.chips > G.GAME.money then
G.GAME.money = G.GAME.money + card.ability.extra.money
end
return {
chips = card.ability.extra.chips,
}
end
assuming its giving you money on joker_main if your chips are less than your money
also you forgot an end
nicely and quickly written i am on my phone or i woulda beat ya to it lol
that seems pretty right
I did what observatory does and it does not work.
thanks
im very new to this stuff
what did you do exactly?

can i see the full code
another day saved by egg
Of what?
of the thing you're making
or the function
in case you're changing calculate joker
god dammit
self not Card
Where?
everywhere except Card.calculate_joker and Card:calculate_joker
also, is this supposed to give Xmult for every voucher you have?
im not sure if joker_main is called for vouchers
No, it's for every voucher in the consumable slot.
Is there a mod that increases the power of Egg every time he bans a scammer?
voucher in the consumable slot?
is that like a thing your mod added?
sounds cool
I did that and the vouchers give Xmult but the deck also does.
that is weird
I have a video of a recent steamodded bug that is like this issue.
help please
the variables have values and i dont know whats wrong
there is a context for cards being destroyed
context.destroy_card
and context.destroying_card gives you the card being evaluated for destruction
im not sure if there is a context for a card being enhanced, thats sort of just a thing that happens
Is there a fix for this?
actually context.destroy_card is also the card. context.destroying_card is specific to played scored cards because it's a vanilla context
hello aure how are you doing today
Thanks a lot!
also, Im trying to use new permabonuses but it doesnt seem to work
Did I miss something?
i have been having trouble with perma_mult recently, it doesnt seem to handle individual scoring as a trigger very well
go see if it still works tho
trying to add a localisation file for the first time, and am incredibly lost -w-
i have the file, but how do i connect it to my Jokers?
Ik there's a card:set_ability
but is there a way to turn it into context?
it just does, by the joker's key
the entire file should be contained within a return
Like when card gets enhanced, do X
Why is the deck saying it is a voucher?
return {
descriptions = {
Joker = {
--snaz jokers start here
j_emerald_light_house = {
name = "Lighthouse",
text = {
"Increase by {X:mult,C:white}+#2#X{}",
"if played hand is {C:attention}#3#{}",
"{C:inactive}(Currently {X:mult,C:white}X#1#{})"
},
},```
this is the beginning of my localization file and an entry for a joker
Ooh that art's really fun, Salt
oh heck that's my spectral next to it
may someone check this code to see whats wrong?
Oh, that art is fun, Ghost!
do you have talisman installed
no
What line is 594?
im pretty sure G.GAME.money doesnt exist
its G.GAME.dollars
i think G.GAME.money is fake yeah
oh really?
mhm
thats odd
dollars are always called dollars
funcs, vars, etc etc always refer to it as dollars, never money
which is stangely consistent for localthunk
lol
odd
G.GAME.dollars, yeah
well darn
i personally would call it money
thats what i was confused on
Also, I recommend returning dollars , rather than setting the variable directly, in this case
mhm
C:money is the var for text
.
so like this?
how do you create the little boxes that show up when your card references an enhancement, etc.?
You can't return an if statement!
return {
dollars = sliced_card.sell_cost*2,
message = "Exposed!",
colour = G.C.MULT,
}```
info_queue[#1116390750314307698_queue+1] = G.P_CENTERS.e_foil
But I'd set a local value with the if statement, and then return the value of that local ad dollars
example of a return for money i have
Because if it's 0, nothing'll happen
i want it to give money if the joker's chips are more than dollars
```if not 0 then `
return {
#stuff
}
end
perfecto ✨
This is what it looks like.
can someone here tell me how to set custom badges for a mod?
can you show the code?
so like this?
https://github.com/Steamodded/smods/wiki/SMODS.Joker docs are useful btw
i did look through the docs but i couldnt find it 😅
try ease_dollars(card.ability.extra.money) instead of adding it directly
it'll add the animation
what would the tooltip code for a specific Tarot card be?
pretty sure dollars = in return does that too
but they're trying to set the value in the return
Return {dollars = card.ability.extra.money}, I think, should also work
this code in my edition doesn't work because the config hasn't been copied over to the card yet, is there any way i can make this code run after the edition ability has been set? (also the x_mult doesn't seem to actually be doing anything but thats another issue)
this?
add and G.consumeables to the find voucher if
this way it should only be checking the consumable slot?
i havent messed with cardareas much tho
god dammit
return { dollars = card.ability.extra.money } or move the ease_dollars outside the return.
Doesn't work.
dont return ease_dollars
just call the function
and you cant return twice in one function call
oh
Also how does one make the info queue for negative say +1 consumable slot instead of joker slot like perkeo?
and context.cardarea == G.consumeables
consumeables
ok so it gives the money but not the chips
😢
it also give 15 dollars even though its 20
one day i will learn how to spell
no you spelled it correctly
but thunk didn't 
greetings from caino and gluttenous joker
Now nothing happens.
even with the changed spelling?
Yes.
hm
check card.area instead of context.cardarea i guess
e_negative_consumable instead of e_negative
but i don't see how the calculate hook is necessary
you could use context.other_voucher
similarly to how observatory is reworked in smods
(bump)
aure, do custom badges for cards belonging to a mod need to be manually added to every single script?
wgar
This worked.
aure how are you doing today 😭
do you mean like when using set_badges or something
well if there's another method i wouldnt mind it
bump
what rarity should this man have
balala
How do I make every voucher trigger more times if there are more than one of Vouchero?
no, you can hook SMODS.create_mod_badges
doing good, ty
is the $20 really needed?
now i am a bit mad but dw
might be cooking
ah
Evil ass joker
Like this?
I have a deck that's making jokers give mult, and it's functional, but message_card isn't changing the location of the message, and it's instead stuck to the deck, any ideas?
if context.other_joker then
if context.other_joker.ability.hod_training then
return {
mult = context.other_joker.ability.hod_training[1],
message = localize { type = 'variable', key = 'a_mult', vars = { context.other_joker.ability.hod_training[1] } },
message_card = context.other_joker,
}
end
end
gumo
ya
i'd give $2, if anything. i don't think it needs any cash prize

Nothing shows up.
jenku draw me or something idk
death!!
peak art
bumblebee nest
NO
buzz buzz
can we please not have gore in #💻・modding-dev
anyway, question. how do i show the tooltips for these two Tarots?
Why can I hear the mouse clicks
she deserves it sory 🥀
why does everyone use this placeholder art
@stray terrace code what
standard placeholder joker
I made my own
and like not just have a blank
Idk where people got it from
I borrowed it from Cryptid.
i just use old textures
i also use blank cards
i give everything the same sprite and fix it later
oh, the multiple layers of souls
For now it’s slightly hardcoded since it’s only for a few specific Jokers, but you can add a new soul sprite with set_sprites. If you also want custom movement, you can pass a new draw method via soul_pos.draw, although that has a small bug where two sprites are drawn, which can be solved by telling SMODS not to automatically draw the key corresponding to your extra layer
i use 0.5, 0.5 in my atlas to make it obvious what it is and strongly incentivize myself to make real art

I referenced Cryptid, although it was slightly outdated at the time
thank you!
They do have a scalable system for this though
There is one small error with this sprite though
I wonder if people can spot it
I see this one has the same error
Put them in the info_queue
Working solution?
ya but the question is, what do i reference?
The centers
how would i make it so there are messages for upgrading
e.g. G.P_CENTERS.c_devil
ohhhh i see
so- ya was gonna say ^^
info_queue[#info_queue+1] = G.P_CENTERS.c_devil
grand
thanks!! :D
as if Hearts weren't strong enough already :)))))
I do want to make Spades the strongest
Spades gets the xMult synergy and Hearts gets Mult
But Heart gets Glass while Spades gets Steel
i thought it was Chips for Spades, XMult for Hearts, Mult for Clubs?
(Arrowhead, Bloodstone, Onyx Agate respectively)
right
i mean if you wanna give Mult to Hearts, you could give it Empress and it'd be perfectly strong :D
calculate = function(self, card, context)
if context.cardarea == G.play and context.repetition then
if (next(context.poker_hands['Three of a Kind'])) and SMODS.has_enhancement(scoring_hand, 'm_lucky') then
return {
message = 'Again!',
repetitions = card.ability.extra.repetitions,
card = context.other_card
}
end
end
end
``` Can someone help me with this, it feels like I'm missing one piece (omg) of the puzzle. I want it to only retrigger when the scored hand is lucky and a three of a kind
Thunk was incorrect 😈
It can’t be Hearts because of the Enhancement pairs
Steel pairs with Gold and Glass pairs with Lucky
Bonus with Mult
Wild with Stone
Did anyone figure out a way to not need to have the saml HSL and dissolve_mask functions in every shader?
In c# I would just put that in a base type but shaders in lua have defied my expectations so far
Also, I do like the concept of Hearts being fragile
There’s a Joker idea in there somewhere 💔
ah i see ^^
ohh it does support object inheritance
What’s wrong
look into include files? idk how it works in love, but that's what I'd do for shader in other engines
it crashes the game says local card is a nill value
i tried to put other things in has_enhancement like other_card, etc
I like the theme here but I don’t see why “The Devil”
but then it wouldnt work
also why “copy of”
There are a bunch of unused tarot from the larger set. I used one in my own mod
Shouldn’t it be context.scoring_hand?
oh you are right i think
two reasons for The Devil:
- referencing the story, where a man wins a fiddle-playing contest against the Devil
- Gold cards
Sorry I misspoke
I know the song
Like the Sword, the Raven, the Crow
consistent wording with the game
i keep forgetting about these small things
I meant to ask why The Chariot
meow
to lean into held in hand effects, and because it's a metal, and because of the strings on a violin
oh I forgot to put something for Ether I just realized
also possibly to represent the guy who was playing against the Devil
Also everything but the fiddle is golden lol
has anyone here set up talisman compatibility for their mod?
You could also think of 'The Mountain', which sounds weird but they play that song nightly at Stone Mountain in Georgia, and have for ~50 + years
that's an issue with the colours i chose :P it's meant to look golden
might fix that later
for some reason its saying config is now a nil value?
I think giving it the background’s palette and making the background white would work
oop uhm, is there a tooltip for Negative? i can only find everything but
myehhhh i mean, i'm happy with the background
calculate = function(self, card, context)
if context.cardarea == G.play and context.repetition then
if (next(context.poker_hands['Three of a Kind'])) and SMODS.has_enhancement(context.scoring_hand, 'm_lucky') then
return {
message = 'Again!',
repetitions = card.ability.extra.repetitions,
card = context.other_card
}
end
end
end``` but i have config as 1?
There are two
i'm happy to lighten it
return {
message = "UPGRADE",
colour = G.C.MULT,
card = card
}
what are they?
you probably meant to write config = {extra = {…}}
I found this in cryptid and it worked.
right
sorry i did have that
that was just done there
by mistake
hmm, weird, e_negative isn't showing up in my intellisense completion list
Does the game say that when it creates a card out of thin air?
the game doesn't have any Jokers that do that, no
but
ack i know there's a card that does that
trying to find it
yeah the game spits out the same error hm
The Soul?
no
Shouldn't it be this?
G.P_CENTERS.e_negative
Grim?
Marble Joker "adds" Stone Cards upon Blind start.
i mean ya but
idk it's probably correct
Are Editions centers?
I think it shouldn’t be called a “copy” because not only it’s not copying anything, it would also prevent you from getting more instances of it AFAIK
I just tried, that does work
So it’s like the game only has one of each card
Shouldn’t this be leftmost?
Also if it’s playing cards it shouldn’t use the Joker tooltip
wait it might be blue seal
hold on
nah it's not
i know that there's a card that says that though
The ones I can think of create copies
Like DNA and Fool
but anyway, regardless, i think "get" is clumsier and less intuitive
just my personal opinion
I didn’t say to use “get”
aware
I just said to not use “copy”
but like, how else do i say that?
Create The Devil
(must have room)
Creates The Heirophant or Temperance doesn't feel as readable as Creates a copy of The Heirophant or Temperance
at least, to me, so that's the wording i'm using
It doesn’t make sense to create a copy to me if it’s neither copying something nor if I can’t get another one
If I have one of these, I can’t find another in the shop or a pack
it doesn't mean to literally copy
So it’s like the game has a tarot deck you’re drawing from, and returning cards to
ya well i know that, but like
you can have multiple
it can create two Chariots in a row
But you can’t find it in the shop
so?
So it’s not “a copy”, it’s the Chariot the game has
idk i've argued about this before
And so the game can’t sell it to you because you already have it
it's the wording i settled on, and people seem to understand what it means, so i'm sticking with it
the highlighting makes it better
Well, same for me and my wording
At the end of the day it's their mod, if they want it then it's not a big deal it's just text that can be changed later
on my way to localize their mod to "british english" where i update that wording and change ize to ise
:)))
I think that’s one of the least read tooltips in the game
tempted to make two versions if i have the zed / ess problem
creates a planet card of the last played poker hand isnt it
To be fair
Streamers
I mean these are people playing Balatro everyday
ya but streamers
So they know the game inside and out
Yea i was just poking fun at streamers being incapable of reading shit and just doing shit
I think the issue was that thunk chose bad wording
if roffle won't get it then it's too complicated :))) /j/j/j
are there any streamers who stream dimserene's modpack
“final hand of round” and “final poker hand of round” and I think a third one
And they’re all different
ya that is an issue
Both Roffle and Murphy got a bit unsure at first
while the wording is understandable, it needs to be more rigorous
I don’t think it needs to be more rigorous
I do think it needs to be clear and somewhat consistent
...so, rigorous :3
I prefer to sacrifice consistency over clarity and brevity
Hi folks, does someone have a simple example of a custom planet card to level a custom hand? The SMODs docs don't really cover this
So not rigorous
I see “rigorous” as adhering to a consistent template
While brevity and clarity want to deviate from a template
also, consistency is its own clarity
by being consistent, you're making your abilities more clear
That is true, somewhat, but only for people deep into the game
I think clarity is better as grokkability
ugh i don't wanna argue with you, i could be doing other things
Someone reading the effect for the first time intuitively understanding it
Frankly just live life like I be and don't be reading that way you can't misunderstand it
-# I saw it more as a conversation than an argument 🤔
the fuck does balatro have to do with twitters ai
What doesn't balatro have to do with it
i'm not gonna argue over whether or not we argued 😭
Mom and dad,. stop fighting!
U taught me a new word today vic
who’s who 😭
😭 ya i was gonna say
i remind myself of my dad when i argue 😭😭😭
so twitters ai is named after the exact opposite of twitter gotcha
I think we should all be extremely aggressive
My autocorrect doesn’t want me to vibe
Back on topic : me asking for help while contributing nothing
i've got a constructive question! :D
no
what's the name of the centre for seals?
:D
SMODS.Seal?
ah no i mean like
The pool?
G.P_CENTERS.?
anyone see why, if I have more than one '2' in my hand, instead of the animation proccing for each '2', it procs x times for the final in the hand?
elseif context.destroy_card and context.cardarea == G.play then
--it was a high card, we will eat 2's
if context.destroy_card:get_id() == 2 then
sendInfoMessage("This is a 2 " .. context.destroy_card:get_id(), self.key)
card.ability.extra = card.ability.extra + card.ability.extraGrowthRate
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.45,
func = function()
play_sound("Fox_yoshiEat", 1.05)
context.destroy_card:juice_up(0.3, 0.3);
return { remove = true, card=context.destroy_card }
end
}))
sendInfoMessage("we are going to destroy this card", self.key)
return { remove = true,card=context.destroy_card }
end
end
i wanna add a tooltip for Purple Seals
I think there’s a P_SEALS
How do i do that?
I recommend setting Card.getting_sliced = true and using if Card:can_calculate(true)
That doesn’t help your problem
Grok's a word coined by Heinlein, the author of ' i have no mouth and i must scream', which makes Grok being named after a fun reference to Elon Musk being an idiot that doesn't understand the fiction he worships. It's also, through that, a reference to fucking Rocco's Basilisk, because he's a nerd that doesn't understand philsophy at all, haha
But I do recommend it
Roko’s Basilisk is also a stupid “problem”
Interesting, I will try
I have insanely strong opinions on it, but I'll refrain from shouting here because I don't wanna saddle the mods with giving me deserved warnings about the words I'd spout, haha
I think this might be easier to help with if we had the entire function
bingo :D
Also the Event can just return true
it's closely tied to that shit we talked about in DMs, haha
Weird...for some reason, when I broke my .lua files out into separate files instead of one huge essay, some process is loading them twice