#💻・modding-dev
1 messages · Page 312 of 1
G.jokers.highlighted[1].config.center.key
If you have DebugPlus you can run eval dp.hovered.config.center in the console
i thinkkkk
ty i'll try it
If I did do this, I had some cool ideas for new hands.
Flush Six - Six cards of same suit and rank
Fuller House - 4 of a Kind + 2 of a Kind
Flush Full - Fuller House, but all of the same suits
Six of a Kind - Six cards of same rank
Two Three - Two three of a kinds
give me a few minutes
okay i got it ty
bump
didn’t work 💔
?
local orig_add_to_highlighted = Card.add_to_highlighted
function Card:add_to_highlighted(card, silent)
local cardio = find_joker(AST.JOKER.CARDIO.KEY)
local old_highlighted_limit = self.config.highlighted_limit
if self.config.type == 'hand' and next(cardio) then
for i=1,#cardio do
self.config.highlighted_limit = self.config.highlighted_limit + cardio[i].ability.extra.extra_discards
end
end
orig_add_to_highlighted(self, card, silent)
self.config.highlighted_limit = context.old_highlighted_limit
end
that works for discards, HOWEVER, you might will have to also hook into G.FUNCS.can_play function cause it cheks if there are less then 5 highlighted cards
cause thats what it does
makes the button not work if you have 0 or more than 5
that increases the highlight limit temporarily
big fan of this guy
damn
how would i make a text color green if a variable was true, and red if it was false?
thatsssss complicated af actually, ui stuff is beyond my understanding
there no easy way of doing afaik
so would something like this work? (minus the thing i just asked)
looks good, but put {} after the closing bracket
why is your code in times new roman lol
i code in notepad (im too lazy to get vscode)
you could return different values in loc_vars depending on weather or not you have the turtle
thats what im doing
ye
this is the most horrifying thing i've ever read in this channel
Look into how to use the {V:} modifier instead of {C:}. You can pass a custom colour variable in loc_vars.vars.colours
how do i make using set_ability
- play the card flip animation like when adding an edition/enhancement
- update the sell cost
oh okay peak
oh i didnt know about that
like, base notepad?? not notepad++?? 😭
yeah
Why would you do this to yourself? It's so much more needlessly complicated and difficult to use notepad...
i can read it relatively fine
set_ability is for setting config variables in an advanced way
ah
vscode is like, 10 clicks max to install
you do all that in consumable use function
coding in notepad is just making the experience a lot more difficult
thats TEN TOO MANY 🔥
you get text highlighting, you get git integration and its so much nicer
like its super worth it
not using vscode or something different isn't really laziness, that's more stubbornness at this point
i mean i technically do have vscode
stubbornness for the most inefficient possible code editing tool 😭
its just that its vscode 2017 (i make ktane mods too)
its visual studio not vscode
oh
that's visual studio
Starts up a hell of a lot faster than Visual Studio too, if that's what's putting you off
is <key> a string value
yes
okay peak
how do i refer to this in a string?
for jokers its gonna be "j_<your_mod_prefix>_<joker_key>"
if in SMODS.JOKER the key = j_turtle then ye
okay peak
refer to what? i dont understand what you mean
how would i localize XMult?
{X:red,C:white}text{}
no im ean
message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.Xmult } },
this
but for
a_xmult
okay peak
Now that my computer is running better, I'm sending ss of what the sticker is looking like, including the localization entry. Why doesn't it load in?
badge color also looks weird
can you not do it like that
HEX("000000")
i love using pantone 448 c as my mod's badge color
ok so it HAS to be hex
I don't see why it wouldn't work, HEX just returns an array of 4 numbers. They should be equivalent
actually...
oh ok
does it not appear in the collection?
is it in a sperate file?
do i have to load the toml file too
no
is the file in x1 and x2 called that?
the file in 2x doesnt exist because im an idiot
ok THIS TIME for sure
there it is! thank you guys 😭
yay
do stickers auto tooltip or no
youll need
misc = {
labels = {
<mod_prefix>_<sticker_key> = {
"Text"
}
},
and
Other = {
<mod_prefix>_<sticker_key> = {
name = "",
text = {
"",
""
}
},
in localization file
and that’ll make the sticker’s description show up next to the joker?
yes
got it
okay so small issue
when the 2 jokers are paired, they say "false" until you play, is there anyway to update the text constantly?
show loc_vars
loc_vars = function(self, info_queue, card)
return {
vars = {
card.ability.extra.mult,
card.ability.extra.Xmult,
card.ability.extra.turt,
}
}
end,
i think it should request that eveyt time you hover over it
how would i do that?
no i think it does that by default
no it
doesnt
when is card.ability.extra.turt set?
if its set in the calculate function then that explains it
yeah i figured it out
loc_vars = function(self, info_queue, card)
return {
vars = {
card.ability.extra.mult,
card.ability.extra.Xmult,
#find_joker(<turtle_id>) > 0,
}
}
end,
ill be working on the 6 joker soon
i legit just added an if then statement before calculate but that works too ig 😭
what a funny reference
okay nevermind the if didnt work
ye it shouldnt be in calculate
nice
okay i fixed it
also so many people from ktane move over to balatro modding lmao
does anyone know how to make a joker that gives chips when a suit is scored (like arrowhead)
is this in the calculate function?
no, this is seprate from SMODS.Joker
like how jokers do j_ do stickers use s_?
its called a hook, were basically making a copy of old function, and appending our own code
should be:
if
context.individual and
context.cardarea == G.play and
not context.other_card.debuff and
context.other_card:is_suit(YOUR SUIT) and
not context.blueprint
and calling the old function inside if our overwritten one
so do i need to replace AST.JOKER.CARDIO.KEY with the key of my joker
yesss
and add stuff to config extra cause it has some
extra_discards
rename it to your liking
so:
local orig_add_to_highlighted = Card.add_to_highlighted
function Card:add_to_highlighted(card, silent)
local cardio = find_joker("j_JCJ_j_andrew")
local old_highlighted_limit = self.config.highlighted_limit
if self.config.type == 'hand' and next(cardio) then
for i=1,#cardio do
self.config.highlighted_limit = self.config.highlighted_limit + cardio[i].ability.extra.extra_cards
end
end
orig_add_to_highlighted(self, card, silent)
self.config.highlighted_limit = context.old_highlighted_limit
end
with config being:
config = { ability = { extra_cards = 1 } },
```?
yeee
jippie
is this right for a consumable that changes the edition of 1 to 2 selected cards
how would i hook into this function
local orig_can_play = G.FUNCS.can_play
G.FUNCS.can_play = function(e)
-- do your stuff
end
I have it as such, if this helps any.
local canplayref = G.FUNCS.can_play
G.FUNCS.can_play = function(e)
canplayref(e) -- execute original first before we do anything.
if #G.hand.highlighted <= G.hand.config.highlighted_limit then
if #G.hand.highlighted >= 52 then -- Cryptid?
e.config.colour = G.C.EDITION
e.config.button = 'play_cards_from_highlighted'
elseif #G.hand.highlighted >= 10 and #G.hand.highlighted < 52 then -- 2x the base and more.
e.config.colour = G.C.DARK_EDITION
e.config.button = 'play_cards_from_highlighted'
elseif #G.hand.highlighted > 5 and #G.hand.highlighted < 10 then -- more than base.
e.config.colour = G.C.PURPLE
e.config.button = 'play_cards_from_highlighted'
end
end
end
okay peak so just change it to 6
you can do that
it just might brak compat with mods that also hook into that function
soooo
wait
thx it worked great
i know how
please
local orig_can_play = G.FUNCS.can_play
G.FUNCS.can_play = function(e)
if #find_joker("you thing") > 0 then
-- do your stuff
return
end
orig_can_play (e)
end
Best use if next(SMODS.find_card('j_modprefix_key')) then.
so it doesnt break compat with other mods
so would this work?
local orig_add_to_highlighted = Card.add_to_highlighted
function Card:add_to_highlighted(card, silent)
local cardio = find_joker("j_JCJ_j_andrew")
local old_highlighted_limit = self.config.highlighted_limit
if self.config.type == 'hand' and next(cardio) then
for i=1,#cardio do
self.config.highlighted_limit = self.config.highlighted_limit + cardio[i].ability.extra.extra_cards
end
end
orig_add_to_highlighted(self, card, silent)
self.config.highlighted_limit = context.old_highlighted_limit
end
local orig_can_play = G.FUNCS.can_play
G.FUNCS.can_play = function(e)
if #find_joker("j_JCJ_j_andrew") > 0 then
if #G.hand.highlighted <= 0 or G.GAME.blind.block_play or #G.hand.highlighted > 6 then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil
else
e.config.colour = G.C.BLUE
e.config.button = 'play_cards_from_highlighted'
end
return
end
orig_can_play (e)
end
ye try that
Maybe don't return in that particular hook.
nah you have to return so it doesnt call the original
If that's intended, sure then.
the original function doesnt return anything
still doesnt let me select more than 5 :(
-# I've shared what worked, that's my two cents in.
bump
stickers dont have a prefix
mmmmm hang on
i have a joker that does that however it's not meant for playing more than 5 cards, just selection/discard
found a small mistake that i left in,
self.config.highlighted_limit = context.old_highlighted_limit -> self.config.highlighted_limit = old_highlighted_limit
okay replaced
lets
pray
I STILL CANT SELECT 6 WHAT
local orig_add_to_highlighted = Card.add_to_highlighted
function Card:add_to_highlighted(card, silent)
local cardio = find_joker("j_JCJ_j_andrew")
local old_highlighted_limit = self.config.highlighted_limit
if self.config.type == 'hand' and next(cardio) then
for i=1,#cardio do
self.config.highlighted_limit = self.config.highlighted_limit + cardio[i].ability.extra.extra_cards
end
end
orig_add_to_highlighted(self, card, silent)
self.config.highlighted_limit = old_highlighted_limit
end
like
is anything wrong with this???
...
CardArea.add_to_highlighted
so this?
yes
okay
im sorry
...
so... also a note, this will stack, if you ahve multiple if them you can select more
so if you dont want that
you remoev the loop
i hardcoded it to 6 dw :)
ye in can_play but not in the add to highlighted
no i did that too
guys how would I use info_queue for seals?
SMODS.PokerHand({
key = "twothree",
chips = 50,
mult = 6,
l_chips = 20,
l_mult = 3,
visible = false, -- Change to true if you want it to appear in the compendium
example = {
{ 'S_3', true},
{ 'H_3', true},
{ 'C_3', true},
{ 'D_2', true},
{ 'S_2', true},
{ 'H_2', true},
},
loc_txt = {
name = "Two Three",
text = {
"Two sets of {C:attention}Three of a kind{}",
},
description = {
"Two sets of Three of a kind",
"Like two pair, but better!"
}
},
evaluate = function(parts, hand)
local threes = parts._3 or {}
-- Check if there are at least two distinct 3-of-a-kinds
if #threes >= 2 then
-- Combine the two 3-of-a-kinds
return { SMODS.merge_lists(threes[1], threes[2]) }
end
return {}
end
})
so like, this works in terms of scoring, but it doesnt play through the cards, any help?
how do i refer to this in a string???
like, this is a list of all the "ore enhancements", and i have a joker that adds a ore enhancement everytime a bblind is selected
how do i add this ore list to the string?
In lua concatination operator is ..
also can i get help on this
i dont get it
basically
when you use .. on two strings
it combines them
so "hello ".."world!" would be
hello world!
and how would it apply to what im looking for? i thought i would have to use some key for the list, im not sure how this would work?
wait are you storing them in a table
yeah
the humble table.concat():
This looks correct
yeah the thing is
it doesnt score the cards
it just
multiplies the two numbers together
what? like i didnt understand the phrase at all
Try just putting hand into return table instead of merging
so youre trying to string everything in the table, right?
no i already have the table part right, i wanted to know how i would use the table in a code
SMODS.merge_lists(threes[1], threes[2]) replace this?
Ye
with SMODS.hand(threes[1], threes[2])
oh
i meant like, in here, in the "pseudorandom_element({'Ore'}", what do i use instead of ore to call that table of ores?
Or parts._3 actually
my sticker won’t apply to my joker,,,,,, is there a specific way youre supposed to do it i’m just missing?
Hand woukd work but if something allows you to select 7 cards it will score every card
Six of a Kind and Flush Six are gonna be hectic to code
so what would i do for fuller house\
Four of a Kind + Two of a Kind
In some mods its called a mansion
I think so, honestly never tried adding a hand
i think what i need to do is call each card individually
Default_compat should be true
all i have is the badge color so yeah i’m missing an actual entry
how do i link it to the sticker?
cause yeah i have the sticker’s name and description but what about its badge
oh that’s for the badge too? not just the tooltip
label is for badge
ITS WORKING
works now! effect doesn’t though cause it can still be sold,,,
Show the hook again
Its <mod_prefix>_priceless
:)
for _, pair in ipairs(parts._2) do
if pair[1].base.id ~= four[1].base.id then
return {SMODS.merge_lists(four, pair)}
else
return {}
end
i think this isnt working
hypothetically do straight work straight out of the box with ranks above king? like if i were to add a rank 14 would it automatically work as a rank above kings for straights or do I have to add that functionality
im pretty sure aces are 14
i assumed they were 1 and hardcoded to work with kings instead of vice versa
question still stands though, like if I added cards with value 14 15 16 could i make a straight with them and K Q without changing anything else?
go for it, never know until ya try
see the problem with that is that's not what i'm doing and it's harder to tell what it's actually doing with my thing so i'm not sure it'll actually work or not but we do a little debugging
how would i trigger a repetition on the first scored card of a certain enhancment?
What is the source of repetition?
the joker itself, it retriggers the first scored card with a certain enhancment
p sure you can specify the next property of a rank
and prev
If the first scored card has the enhancement?
no, the first card with the enhancement that is scored
You'd probably have to iterate over the scoring hand and store said card somewhere, then reset after hand is played.
alright thats what i was afraid of doing lol
because i dont know how to iterate in lua yet, but its a single search away
-# Steel example.
for i = 1, #context.scoring_hand do
if SMODS.has_enhancement(context.scoring_hand[i], 'm_steel') then ... end -- You could store the card in the Joker itself temporarily.
end
Not particularly. You might wanna future proof for https://github.com/Steamodded/smods/pull/626 btw
oh
alright so when the it gets to the first that is steel is there a way to break the loop right there?
waot
is it break
heres all the hands i have so far (+ Three pair)
break, yes.
alr thanks
I already posted this but I kinda want some more feedback for balancing purposes.
What are yall’s thoughts on a joker (rare maybe legendary) that retriggers planet cards once for every 10-20 dollars you have. Be honest with feedback
that could be a rare, $10 does seem a bit low, i would say anything above $15 is considerable. Personally id say 20 or 25, since most players will be sitting at 25 because of the interest cap anyway so its a solid hand leveling joker like burnt joker.
Gotcha, thanks for feedback!
planet cards are super powerful
Cryptid has a system for this
Id look into how that works if I were you
?
and then flushes
in terms of card split
(ex: Two Three = 3 Cards + 3 Cards)
Ah
Trials of Osiris
it also allows some synnergy with the one that scores every card
you get 1 extra card to play around with
but overall im really happy with how this turned out
how do i add the animation of the card going to the deck when created? like in the marble joker?
can't you just... copy what marble joker does?
in my defense i have 2 neurons and both are fighting for thr third place of best one
understandable, have a great day
so i looked in the marble joker code but nothing about animation
bump
how to check if in game vs in menu in joker's update function? game crashes because of trying to access G.jokers
if G.jokers and ...
anyone know what the syntax would be to have the joker created by create_card be eternal? I've got:
local card = create_card('Joker', G.jokers, nil, nil, nil, nil, 'j_TYN_explodedJoker', nil, nil, nil, 'eternal')
but its only making the joker itself without adding the eternal sticker
I don't think the last parameter of create_card works (I couldn't get it to work).
Instead I did:
local new_card = SMODS.add_card({ key = joker_key })
SMODS.Stickers['sticker_key']:apply(new_card, true)
SMODS.add_card({ key = 'j_TYN_explodedJoker', stickers = { "eternal" } })
can someone give me a quick primer on how cards are moved around on the screen?
and what functions one might call to move cards around
im working in something similar but im not sure how id do, its a tarot card that you select 2 cards with enhancements and it fuses both cards into one card based on the enhancements they had
holy, minecraft modpacks in balatro?
I... had to reference one of my older projects to remember how I did this sort of thign before with today's adjustments... and, well, honestly not sure whether to keep this mechanic actually around?
And... I suppose so, lol. Bunco already has Copper cards... pair 3 of them with 1 Tin card and I'll need to come up with an idea for Bronze cards.
ok, im trying to get the first mult card scored retrigger twice, its a joker's ability. But it isnt quite working. the issue i think im running into is i cant figure out how to retrigger only the first card that is the mult card, but the code does indeed find it.
config = { extra = { repetitions = 2, card_found = nil, index = 0} },
calculate = function(self,card,context)
if context.cardarea == G.play and context.repetition and not context.repetition_only then
for i = 1, #context.scoring_hand, 1 do
if SMODS.has_enhancement(context.scoring_hand[i], 'm_mult') then
card.ability.extra.card_found = context.scoring_hand[i]
card.ability.extra.index = i
break
end
end
if card.ability.extra.card_found ~= nil and context.card == card.ability.extra.card_found then
return {
message = 'Again!',
repetitions = card.ability.extra.repetitions,
card = context.other_card
}
end
end
end
anyone know what i did wrong lol?
peak
idk what i did wrong here
it needs to be in a specific context, that will trigger in any context that has cardarea == G.hand
oooh, what is the context? is just a reguler held in hand thing
depends on what you want to do idk your effect
is there a way to check the current mult in a blind? is it G.GAME.mult like there is a G.GAME.chips
hand_chips and mult are globals of currently scored chips and mult.
i thought it was just chips?
ive used G.GAME.chips before with the intended effect working out
i can't find reference to G.GAME.mult in the game code
yup same
G.GAME.chips is tallied up chips.
hand_chips and mult are the current numbers in the blue and red boxes respectively.
yeah that makes sense
ah i see
how do i check tallied up mult
i don't think the game keeps tracks of that
unless you're talking about the red box mult?
actually wait
no i needed the hand chips
i think that should be perfect for my ability
It's just G.GAME.chips for amount of chips scored during the blind and hand_chips and mult for the currently scoring values of chips and mult of the hand.
obviously there cant be G.GAME.mult that would make no sense, im a ding dong
bump
awesome thank you
can't spawn in my booster using debug plus nor can i find it in the in-game shop. any pointers?
if hand_chips < 0 then
hand_chips = 0
end
if mult < 0 then
mult = 0
end
so i would just access it like this?
try it out
if i were to hit play right now, would it not be defined already?
im new to modding and following along with this video, having trouble getting my head around the loc_vars function? the video just types out the block of code that serves the example joker and nothing else, is there a better resource for that specifically
STEAMODDED 1.0.0
A tutorial on how to make a modded Joker.
https://github.com/art-muncher/Example-Mod -- EXAMPLE MOD
https://github.com/Steamopollys/Steamodded -- STEAMODDED
https://github.com/WilsontheWolf/DebugPlus -- DEBUGPLUS
-----------------------------------------------------...
what are you trying to do
It's standard practice to check if a given value is not nil and then compare and such.
the joker im trying to make is "gives x4 mult after 30 hands have been played"
if you see in the loc_txt, specifically in the text = section, you will see stuff like #number#, the loc_vars replaces those with the stuff you want to add dynamically
okay sounds good, let me try
but moreso i wanna get my head around like, the syntax of the loc_vars function
https://github.com/Steamodded/smods/wiki/
https://github.com/Steamodded/examples/tree/master/Mods/ExampleJokersMod
steamodded wiki + example jokers !
very good reference
like i have no idea what return {vars = {center.ability.extra.Xmult} means
chat am i cooked
ill check em out, thanks 🫡
When doing a rounds remaining counter what would be better, starting_shop or end_of_round (i dont mean the technicality, more like the overall experience)
wdym rounds remaining?
rounds start upon entering a shop
context.end_of_round
the humble in-game round counter
press_play = function(self)
local jokers = {}
if G.jokers.cards and G.jokers.cards[1] then
for i = 1, #G.jokers.cards do
if not G.jokers.cards[i].debuff then
table.insert(jokers, G.jokers.cards[i])
end
end
end
if #jokers > 0 then
local _card = pseudorandom_element(jokers, pseudoseed('denth'))
if _card then
if not _card.ability.multiplier then
_card.ability.multiplier = -1
end
_card:juice_up()
end
if hand_chips and hand_chips < 0 then
hand_chips = 0
end
if mult and mult < 0 then
mult = 0
end
end
end,
im trying to make a joker give the opposite effect in this boss but i dont want the hand_chips and mult go below 0 for each hand played
assume that i have the multiplier set up properly already
what could be causing that issue
the if condition is only checked once on pressing play but it seems at the time of that check the value is "nil"
so the negative value is still happening
...actually, do Blinds even support the calculate function like other objects?
You could've had the < 0 prevention happening there instead.
i dont believe they do?
let me check
i lied
they do
that should fix it
for some reason unscored_cards always contains all of the cards from the full hand, any clues as to why?
or is there a better way to get the cards that did not score?
Can't you just do the ones in the unscored hand but not in the scored hand?
What does your object do?
does context have a field for the unscored hand?
well eventually I want to yoink a random unscored card and place it in a special cardarea, but for now I'd be happy with moving any played, unscored cards to the consumables cardarea
here's the full calculate function
most of this does not work
Have you tried context.before?
no, do you think that somehow the full_hand and scored_hand arrays don't actually point to the same cards?
and that the timing is causing an issue?
this crash im getting seems to imply i forgot a close bracket somewhere even though ive certainly not?
[SMODS _ "src/loader.lua"]:571: [SMODS GRATLATRO "main.lua"]:30: '}' expected (to close '{' at line 17) near 'config'
no comma after pos
If you were using vscode there is a lua extension that tells you about syntax errors.
thats the issue, thanks
next(get_straight(hand)) doesn't return anything if Shortcut is used, and I am trying to tell if the hand contains a Straight while overriding get_flush(hand)
SMODS modifies this function and that's why isn't it
get_straight(hand) has more parameters in SMODS and the default values ignores skipping and wrapping around
b_
is there a way to show a longer lasting message on a card?
How could I make a tag that puts a seal on everything in the next shop similar to the coupon tag?
What do you mean?
Like instead of a message disappearing in like a second, if it could stay for the full hand
you'd have to look into how card_eval_status_text works for the specifics of the message function
gotcha ty
I believe delay?
I'm pretty sure delay makes it stay for longer but it also delays the hand.
Ah. Yeah probably
its blocking eh
delay is very much blocking yeah
yeah you might need to go through card_eval_status_text to find out how delay is used and how to make it unblocking
what am i doing wrong here for the xmult to not be applying?
im not seeing anything wrong, are you sure it's not applying? using Xmult_mod instead of just Xmult is going to make the joker not display a message
what
wheres the rest of the joker
elsewhere
what am i doing something wrong here? it is ALWAYS hitting the chance on every single one of those cards
SMODS.Joker{
key = "Control",
loc_txt = {
name = "Piece Control",
text = {
"Each played {C:money}Wood{} cards have a {C:green}#3# in #1#{} chance to become {C:inactive}Metal{}",
"Each played {C:mult}Brick{} cards have a {C:green}#3# in #2#{} chance to become {C:inactive}Metal{}",
"Idea: BoiRowan"
}
},
rarity = 3,
atlas = "Jokers",
pos = { x = 1, y = 23 },
cost = 9,
unlocked = true,
discovered = false,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = true,
config = {
extra = {
w_odds = 3, -- 1/3 chance for Wood to become Metal
b_odds = 2, -- 1/2 chance for Brick to become Metal
}
},
weight = 0,
loc_vars = function(self, info_queue, card)
return {
vars = {
card.ability.extra.w_odds,
card.ability.extra.b_odds,
G.GAME.probabilities.normal
}
}
end,
-- Checks the played hand and potentially transforms Wood and Brick into Metal
calculate = function(self, card, context)
if context.cardarea == G.play then
for _, played_card in ipairs(G.play.cards) do
-- Check if the card is Wood and transform it if the odds are met
if played_card.config.center == G.P_CENTERS.m_fn_Wood then
if pseudorandom('wood') < G.GAME.probabilities.normal/card.ability.extra.w_odds then
played_card:set_ability(G.P_CENTERS.m_fn_Metal)
end
-- Check if the card is Brick and transform it if the odds are met
elseif played_card.config.center == G.P_CENTERS.m_fn_Brick then
if pseudorandom('brick') < G.GAME.probabilities.normal/card.ability.extra.b_odds then
played_card:set_ability(G.P_CENTERS.m_fn_Metal)
end
end
end
end
end,
}
just released https://jsr.io/@pumpn/gicopast, a javascript git config and especially .gitmodules file parser - might be interesting for mod pack "developers"
i use it in the mod pack i'm working on here https://github.com/pumpncode/bamopa/tree/main/scripts
balatro mod pack. Contribute to pumpncode/bamopa development by creating an account on GitHub.
How do I prevent putting a sprite on a card from lagging my game permanently?
Even when I remove it?
i'm trying to make a retrigger joker but nothing's happening,,
calculate = function(self, card, context)
if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= self then
return {
message = "Again!",
repetitions = 1,
card = card
}
end
end```
Have you enabled retrigger_jokerin optional features?
SMODS.current_mod.optional_features = function()
return { retrigger_joker = true }
end
nvm i got it to work lol
It might be because your code is called on every scoring context so it has multiple chances to hit for each card. Try restricting it to a specific one
Besides Bunco's Copper... any other Copper cards I should be aware of?
Ortalab maybe
...does Ortalab have Copper enhancements?
yeah
im going to make a police joker and call it Copper Card
Reverse Tarot+
...not finding any definitions for Copper cards from a quick search for Ortalab.
The wiki's only got Bunco's at least, so if there's other copper cards, it's not in a notable mod
Rusty Cards?
oh my god
i forgot it was rusty
nevermind
the thought of the texture threw me off
me when someone asks why i didn't get a tetanus shot after stepping on a nail
Huger Joker
is that the guy who invented colors
omw making a tech mod with 20 new ore cards
is that the guy who invented rotating cards
Balatrocraft
how do i make cards use the flip animation when doing something?
card:flip()
is this WAY too cruel
👍
i think this should work but it isn't,,
use = function(self, card, area, copier)
local _c = G.jokers.highlighted[1]
local _j_key = _c.config.center.key
local _upgrade = elle_parasite_upgrades[_j_key]
if (_upgrade) ~= nil then
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
G.hand.highlighted[1]:set_ability(elle_parasite_upgrades[ G.jokers.highlighted[1].config.center.key ].upgrade)
G.hand.highlighted[1].sell_cost = G.hand.highlighted[1].config.center.cost
return true
end
}))
end
end```

Rise.
what's your code like?
bump - additionally, does loc_vars apply to the text defined in unlock? lkie if i write #1# etc. in an unlock description, will it do the matching thingy
don't create a new sprite every frame
i made this same error, don't define the sprite each frame
save it to a variable somewhere in the card and do a nil check if it exists
if it doesn't initialize the sprite from there
What card?
a drawstep's func variable is a function that takes in the card that's being rendered and the layer
you can reference the card from there
I'm aware. Where do I put the variable?
you can define it on the card. In this case it's a seal, so I'd take the approach normal seals make and create a global for the sprites
for some reason referencingG.hand.highlighted[1] in the event makes the game crash
what's the crash you're getting?
also, yeah, the highlight doesn't exist anymore when you have the event happen
just set up a local variable with that card, and pass that along
i rewrote the thing i did as you were discussing it - this is what i ended up doing, but idk if it works yet
i should probably move the house drawing function that property cards use to a drawstep now that i think about it
right now it's being done on an extension of SMODS.Consumable with a custom draw function
Would this work?
self here should be card
func = function(card, layer)
actually no self doesn't exist in drawstep functions
It does work.
probably that's just want the variable is named and it's working with it. but the actual var is card as outlined in the wiki https://github.com/Steamodded/smods/wiki/SMODS.DrawStep
draw = function(self, card, layer)
card.children.center:draw_shader('negative_shine', nil, card.ARGS.send_to_shader)
-- update soul_parts
if not card.children.soul_parts then
card.children.soul_parts = Sprite(card.T.x, card.T.y, card.T.w, card.T.h, card.children.center.atlas, { x = 0, y = 2 })
card.children.soul_parts.role.draw_major = card
card.children.soul_parts.states.hover.can = false
card.children.soul_parts.states.click.can = false
end
if card.children.soul_parts then
-- update position
card.children.soul_parts.T.y = card.T.y
card.children.soul_parts.T.x = card.T.x
card.children.soul_parts.T.r = card.T.r
card.children.soul_parts:set_sprite_pos({ x = math.min((card.ability.house_status or 0), 5), y = 2 })
-- draw it
card.children.soul_parts:draw_shader('dissolve', 0, nil, nil, card.children.center)
card.children.soul_parts:draw_shader('dissolve', nil, nil, nil, card.children.center)
end
end,
i only named it soul_parts because i didn't wanted it drawn twice like soul_pos does
lmao
unused variable moment
I prefer self
how do you activate a joker per played card?
context.individual and context.cardarea = G.play
🫡 thanks
How to destroy a consumeable? Is there a SMODS method or do I need to copy the code of joker destruction?
self would usually refer to the smod objecttype definition itself though
crashing because
[SMODS _ "src/loader.lua"]:571: [SMODS GRATLATRO "main.lua"]:93: '}' expected (to close '{' at line 73) near 'if'
i assume its a syntax error but i cannot find it?
you're missing a calculate = function(self, card, context)
Man, maintaining Steammodded must be a nightmare. Half of the GitHub issues are user errors or caused by another mod.
i got to the installing vscode part and got intimidated out of there 
that tracks, thanks 🫡
I downloaded the brainstorm mod to reroll for jokers but the config for it wont pop up in the settings anyone know why?
Does anyone know how to create new rank cards with steammodded? The API documentation doesn't really explain it all too well, especially with the sprites for the card in different suits.
bump;
- what should i do if i want to update a modded achievement's description during runtime

- does
loc_varsapply to the text defined inunlock? lkie if i write#1#etc. in an unlock description, will it do the matching thingy
- Return a
keyvariable in the table you return inloc_varspertaining to the key name in a localization file. set thesetto the achievement localization as well
return {
key = "j_payasaka_buruakacard" .. ((card.ability and card.ability.cry_rigged) and "_alt" or ""),
set = "Joker",
}
locked_loc_varsis designed for this purpose
i see
how does cloud 9 work
it goes through the whole deck to check if there's nines and increases in value if yeah right
...
wait so SMODS.Achievement has loc_vars or am i missing something
wow free $50 pog
definitely real
<@&1133519078540185692>
i think so yea
actually now that i think about it
it doesn't
only objects SMODS.Center and anything that inherits it have loc_vars and its function
oh ok
could i use SMODS.current_mod.process_loc_text() for this (or to be more safe, instead of SMODS.current_mod, SMODS.find_mond("my mod id")[1])
does anyone know why my joker (the one on the left) activates after everything else instead of left to right
if context.joker_main then
if card.ability.extra.mult ~= 0 then
return {
mult_mod = card.ability.extra.mult,
message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.mult } }
}
end
end```
photograph triggers on card trigger
try with other jokers
ah right
you could actually though then it wouldn't be handled on a separate localization file anymore
ty yeah i'm dumb 
FYI you don’t need to return a message if you just use mult = X
what? why would they be mutually exclusive? 
the localization file is loaded once, at startup.
process_loc_text() can be called during at any time during runtime to change the string value
i forget that you could just make the keys completely separate in the same localization file and dynamically change the actual key in runtime
im sutpid 🥀
i removed the message and now there's no message
so yes i do
ah, i see
but my issue now is that i'm defining my achievement loc in the actual achievement info, in loc_txt = { name = '', description = {} }. how do i work out the correct argument for process_loc_text()
SMODS.process_loc_text takes in 4 arguments
- the destination localization table
- the key name
- the localization table
- the key of the localization table to add to the destination localization table with the same key
can you show the changed code? it should be automatic, for sure (Eremel's one of the people that set up that system, iirc)
if context.joker_main then
if card.ability.extra.mult ~= 0 then
return {
mult_mod = card.ability.extra.mult,
--message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.mult } }
}
end
end```
just remove _mod
ok
ohhh there's a difference between _mod and not
i didn't know that
_mod works, but it's for when you want no message, and a custom message to be set instead, basically. There's not really a reason to ever use a _mod in the return, unless you specifically want the message to be a custom one, or no message to appear
omg discord flagged my message because i put fuck in it
gdi
i don't wanna type it again
i like naming my variables with the word fuck because that's how i cope with programming
talisman
cryptid ,,,,
talisman?
Reading the entire message is helpful
true but now i've removed the _mod
that specific error is basically always due to a talisman incompatibility
a
Yeah talisman is a piece of shit mod that makes everything specifically build around it
how do i make it compatible with talisman?
le to_big
talisman 
me and my friends like playing my mod with cryptid 😭
i don't know why removing the _mod would cause a talisman issue where it didn't before, however
lm check the stack trace
You get talisman to fix their shit
uhh looking at this i'll just continue using _mod
who is currently the dev for talisman?
What’s the value of the mult?
please don't
😇
because while this conversation may make it seem like it's more complicated, it's a lot easier and more readable if you're not consistently having to define your messages. Talisman crashes are entirely unrelated to the use of _mod in your return, generally
that's fair
"This joker gains {C:mult}+#1#{} Mult",
"for each multiple of",
"{C:attention}Round Score{} reached",
"at end of round",
"{C:inactive}(Currently {C:mult}+#2#{C:inactive} Mult)",
calculate = function(self, card, context)
if context.end_of_round and context.cardarea == G.jokers then
local _mult = math.floor(G.GAME.chips / G.GAME.blind.chips) * card.ability.extra.mult_mod
card.ability.extra.mult = card.ability.extra.mult + _mult
return {
message = "Hehe~ (+".._mult..")"
}
end
if context.joker_main then
if card.ability.extra.mult ~= 0 then
return {
mult_mod = card.ability.extra.mult
--message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.mult } }
}
end
end
end```
the only reason i started using it is cuz its in the example joker mod for steamodded
same
i should make a fork of talisman that does comparison stuff automatically and see how that goes
pretty sure luajit supports comparison metafunctions
yeah, metatables should be an option to solve this, I think. I'm just not comfortable enough with more fundamental code stuff to actually be the person to take a stab at it, haha
Yeah you’re doing stuff with the blind chips which talisman screws with, this should always crash the message 🤔
?
oh it does? I thought you'd need to properly define operator and comparator behaviour for that?
I guess this is a rare occasion to use _mod whilst talisman fixes itself
ok
is that the cause? Is it not math.floor doing a comparison internally?
i'll try disabling talisman
you do
though talisman already handles it automatically
except comparisons
🥲
bump
No its the message being given a table rather than a number iirc
yep it's talisman
I guess the localize handles that automatically
im not sure why doesn't talisman just use __le and __lt and just get away with it
ah, okay. I think that might also explain some niche talisman issues in Kino that I've been unable to properly squash
_ _
it's literally impossible to convince anyone of playing a mod as anything but a cryptid add-on, though ❤️
?
but my tetrations ,,,,,,,
I wish they would split the big number crap out away from the cool stuff with calculations and animations
crying 😭
regardless, i'm not making my mod incompatible with talisman just to save a few lines on messages
Woah what Malverk features are you waiting for?
you don't make a mod incompatible with talisman, you try and get it compatible with talisman and then scream as you get annoyed at the constant to_big and to_number statements in your code
I wonder if the author of talisman is still in this channel (or even contactable)
talisman is originally by mathisfun, no?
i don't know if it's maintained by someone else atm or anything
oh no, nothing big - just the locked and undiscovered graphics
and also to hear back about the seals thing i mentioned
nothing urgent
your pace is fine
i just thought this was funny lmao
math's still in the server but probably won't respond to anything
i've had no problems with talisman so far
granted it has been moved to the spectralpack organisation so
Oh yeh I should get on to that 😅
that's good! There's a chance it automatically works. Are you up to date on how to make sure a mod is talisman compatible? if you're not comparing with globals, generally, it should be good without any effort, but you do wanna wrap all comparisons with global numbers
Can you remind me of the seals thing?
even if they know, i may actually require this info since i have had people asking me about future cryptid compatibility
i will post in the thread
easiest approach is to define your own copies of the to_big and to_number functions that just return the input straight up if talisman isn't active. Then, you need to wrap any comparison with a global so that the global isn't compared with a number, but with a table, by to_big()ing it. So for example if G.GAME.dollars > 10 then should become if G.GAME.dollars > to_big(10) then
anything that happens inside of an equation is automatically transformed, so you don't need to worry about those
I've set the functions up like this, which I don't think has caused issues, but I haven't been thorough enough in testing with like 100 mods to for sure that this doesn't create something whacky, haha
if that would cause any problems people would scream at me for using it in jokerdisplay so youre fine
my general implementation of to_big is kinda fucked though, as I sometimes can't pinpoint where the crash is coming from in the comparison, so I just wrap every variable, haha
Oh yeah I'm having occasional issues, I forgot in which mods, which are probably talisman related (comparing number to table) because I have it set to vanilla to give most of my mods that don't require talisman a fighting chance of working
None of my mods should actually require bignum though so idk what's going on
i don't know how talisman is set up, but does it not still turn numbers into tables if you're on vanilla naninf?
It must do something different because having bignum on apparently totally breaks something in my pack
most of the issues are probably in cryptid tbh but theres like fixes being added for that
I don't personally use cryptid
there are a few things that talisman has to mess with to work that can mess with mods which is unfortunate
I only have talisman in my pack because some mods ask for it for reasons like xchips, but in my experience setting it to vanilla lets tucks things work without breaking much else
most issues should probably be resolved by using ice's method of just having a wrapper and using that for all comparisons
since regular arithmetic works between number types thats the main thing you have to worry about
well, i just learned that messages are broken in that context, so it doesn't fix everything 😛
but if a mod relise on talisman for xchips, it's probably old enough to generally have weird dependencies
you should probably try and support it if you can rather than not doing that but its understandably a lot more effort if you have a lot of things so not everyone can or will do that
I mean... talisman is literally the only nod I ever see as a dependency for anything ever
And it's been that way for a long time
some people will just naturally have it on even if nothing requires it anyway because watching the number go higher is fun
i think for players, it's nice to make sure your mod works with talisman just because it's so frequently in someone's mod folder, and they won't know what's causing crashes if they're not code literate (which they don't need to be to play mods ofc). But god, it'd be so great if talisman was set up to do more of that effort on its end, or at least have a better documentation on what good compatibility looks like
a lot of the issues with talisman are mostly due to lua being dumb tbf like attempt to compare number with table is literally impossible to fix cause lua doesnt let you override that operator
better documentation would be nice though
oh yeah, i don't mean on weird mods, just on features from talisman (or cryptid too sometimes but your pack already filters those out inherently, ofc), as a lot of those things are in smods now
there are some attempts to make talisman better just vaguely in progress though
idk i usually try to avoid creating hard incompatibilities unless i really have to but other people will see it differently
I wish I didn't have to supply one in my modpack. People won't know to set it to vanilla and the way settings are stored on talisman doesn't seem to be compatible with my yosbr hack that lets my nodosck users get my settings
if theres a weird interaction that doesnt really break the game for example id rather just let it be or fix it than marking it as incompatible if theres a worse issues ill try and fix it most of the time
some mods are just too weird to fix issues with though
Once I'm done setting up new stuff for Kino, I wanna add a feature to #1353866504743161886 that's explicitly set up for modpackers to have an opening message to players, so just wait, idk 3 months? idk how long mystery cards and this quest system are gonna be an issue for, haha
Maybe also add my yosbr hack to that too when you can? Seems to be pretty much the right place for it. He originally code is by @rough furnace and the modified version that does it the way that works for modpacks is in my modpack
yosbr back?
Fixed the operative typo
ah, i'm entirely unfamiliar with it, i'll have to look into what it does, honestly. But that might be a good add-on yeah
only problem there is that it's the side of balatro modding that i don't really interact with, which would make me a terrible person to maintain and bug fix it, which i definitely can with the current gameplay oriented changes for #1353866504743161886
I forgot the exact original purpose but I modified it slightly so I could provide default configuration files for mods alongside my modpsck
It's a very simple thing that just copies the provided mod configs to the main configuration folder is none for each given mod exist
i somehow fixed this, it works as intended but i have no idea why
retriggers suck
such a pain
the issue you're having is that you're treating context.repetition like it's a generic context like context.joker_main, but it's a per-card context like context.individual
ah no wait
i see what you're doing
lol ive spent too many hours on this
yeah no i read your code wrong and was too cocky in my correction 😛
config = { extra = { repetitions = 2, card_found = nil, found = false} },
calculate = function(self,card,context)
if context.cardarea == G.play and context.repetition and not context.repetition_only then
for _, played_card in ipairs(context.scoring_hand) do
if SMODS.has_enhancement(played_card, 'm_mult') then
card.ability.extra.card_found = played_card
card.ability.extra.found = true
break
end
end
if context.other_card == card.ability.extra.card_found then
return {
message = 'Again!',
repetitions = card.ability.extra.repetitions,
card = context.other_card
}
end
end
end
is this supposed to trigger every mult card two extra times?
hmm, but this would retrigger the first mult for each card scored, no?
oh, no i see, because the second if statement filters it, yeah
i guess that works
The way I would go about it is to mark the playing card as 'first scored mult' in some way, and just clean that up in the after. That gives you a bit more freedom there. But if this works, it works
yea. the issue i was having was it was retriggering everything regardless of mult, but it works now
You don’t need to iterate through like that, you could just check if other card is a mult card and then set an internal flag that’s reset after the hand is played so it doesn’t check other card
the way to generally go about finding these arbitrary qualities in cards, I find, is to do so in the before context and then execute on it later.
yeah, basically what eremel's saying
I wouldn’t use before here
i attempted that, but i couldnt get it to work so i opted for this
Just repetition would do the job
no? Oh I guess you can just check in this context, yeah
i could add another condition to the first statement so it doesnt check for mult cards after the first mult card has been found, but ive found that it causes problems trying to maintain that variable
or, i did it wrong, which is far more likely
Something like lua if context.repetition and context.cardarea == G.play and not card.ability.extra.triggered then if SMODS.has_enhancement(context.other_card, “m_mult”) then card.ability.extra.triggered = true return { — values here } end end if context.after then card.ability.extra.triggered = false end
Might be scuffed mobile typing is a pain
no that sounds right
i can actually just try it again and see if it works now
since there were more than one issues at play when i tried it before
wait when retriggering with .rep, its called once per scoring card right? with other_card being the scored card?
so like, in a flush its called 5 times (usually)
that was my original idea, but i just dont know lua well enough to really know what im doing yet. I mostly used java and c# lol
but yea that would work
how do i copy a value instead of a reference
Yea this is correct
how can i change the required score of the current blind
ok cool, that makes a lot more sense now
yippie
im just using my testing sprite for now lol
but it works
nvmd i was being stupid
using ipairs instead of pairs
when did smods change Seeing Double in card.lua
and why was the same thing not done with Flower Pot
now I need to hook this function...
Is there a way I can give a perishable Joker at the start of my challenge?
nice
how do I edit a vanilla joker description?
I have tried patching localization/en-us.lua and it has not worked
Take ownership and define a new description? That's mostly a guess though
can you not just define a new entry, and that'd override it?
what kind of oddity is this
find_card prints an empty table for some reason even if there are multiple of this joker
is it possible to make a joker with this effect? I had this idea but I couldn't find a solution
lucky cards of hearts
have 3x probablities
how do i add config?
this feels so cursed
inside of Game:set_language() of game.lua
but hey, if it works it works
That sounds very possible
you could do it in a similar way to cryptid's rigged
maybe look at the code for all 6's?
I think you're better off looking at the lucky card code itself
and also the code that generates its tooltip
Or just have luckies of hearts be its own invisible enhancement that overwrites real luckies
that's probably the better solution tbh
But you still want it to work with lucky cat and stuff
And it's actually a bad idea because it's joker based not card based
So yeah prolly don't do the thing the non-coder half jokingly said
the fix was not to use SMODS:find_card, instead using the default find_joker 
But yeah applying conditional probability modification sounds feasible just by using similar code to any other probability modification
G.GAME.probabilities.normal * 3^(#find_joker('j_prefix_joker_key'))

you could have the heart lucky cards use this probability
that way, it'll work no matter how many of the joker you have
you'll still need to figure out where to put that line though
and also any contitionals or restructuring for hearts suits
if you don't define your own 'heart lucky' enhancement, then you'll need to hook or patch both Card:get_p_dollars() and Card:get_chip_mult() in card.lua
and then also figure out how to change the tooltip to display the affected odds when you hover over a lucky heart
how do i add buttons for config settings?
give $6 when held in hand
theres SMODS.Joker:take_ownership
Perhaps I should look into that
At least, I will if I have to do something like this again. For now though, if it ain’t broke don’t fix it
localization is like sometimes reloaded from filesystem and it might undo what you did if i understand
You can just add it in your localization file
ok yeah then it might be worth it to do
so just kinda starting out but what size do i need to make the atlas and the jokers in the atlas? i know i need the 1x and 2x but i cant find the size i need to make them?
71x95 per joker on x1
is like default
but i think you can define an atlas with custom withd and highet per unit
and im guessing just double that for 2x. do i need a specific size for the overall atlas or nah
ye you just double it, no limitation on how big or small
however big you need it to fit your stuff
is there a way to count scoring cards in a hand? ie output 3 if you play a three of a kind with two non scoring cards
coolio. thanks!
also! is there a place i can find answers to these types of questions so i dont have to come here and ask every time
theres Smods docs https://github.com/Steamodded/smods/wiki/API-Documentation
best pfp for api docs ever

and there are examples https://github.com/Steamodded/examples/tree/master/Mods
yeah ive got that link, it doesnt seem to be covered in the example jokers
thats non trivial tho
fair
thought maybe it was done before
am i doing this hook function correctly?
local start_run_hook = G.start_run
function Game:start_run(args)
start_run_hook(args)
-- my code
end
local start_run_hook = Game.start_run
also youll have to pass self to the original as first param
ye usually the sign
where would i find the function? having trouble navigating the wiki
its not on the wiki, its in balatro source code
uh. right
hello
hi
can i ask a question about sprites here?
What do you want to count them for?
sure
for a joker
specifically i wanna debuff the joker if the hand doesnt have 5 scoring cards
how do i make this work?
create_toggle({
ref_table = SMODS.current_mod.config,
ref_value = "test_config",
label = "Test Setting"
})```
(ui stuff)
i have a sprite for a joker that is 71x95 but in the game is a blue rectangle instad of the square
then do #context.scoring_hand < 5 in one of the contexts
🫡 🫡 🫡 thank you
may i have a screenshot?, and the atlas
ok what about the joker definition, this looks good so far
are you using a different atlas for each joker
looks like only one joker is done so far to me
fair
the path = "j_chaos_joker.png", is a bit of a red flag though
how?
why
oh i see
ye you can use one atlast for multiple jokers
but its not the problem
do you have the pos set inh your joker definition?
i have only one atlas also maby this is the prob
rarity = 3,
atlas = 'j_chaos_joker',
pos = { x = 0, y = 0 },
cost = 6,
soul_pos = { x = 1, y = 0 },
you only need one atlas, it should contain all your jokers
i remoive it ima reload
the black rectangle is probably the soul overlay sprite
heres my atlas for reference
it was that thanks
yw
now uhhhhh
i think i got it now
how do i make a joker's atlas position change based on a config setting?
bump! still need help with my booster not spawning
maybe in set_ability you could... card:children.center:set_sprite_pos({ x = ... y = ... })
is it not showing in collection too?
it shows in collection due to me making a consumable type for them, but oddly enough it shows 0/0 despite there being boosters
they just can't be spawned in using debug plus nor do they spawn in-game naturally
first off... delete the pools completely, this looks like copy pasted example code, you dont need pools here
yeah i figured but it wasn't working prior to the pools anyway so i was just grasping at straws
thats my example
other than you dont return a card, it looks fine, but that wouldnt make it not spawn, it would make it crash if you tried to open it
maybe me making a consumable type for it broke it somehow?
boosters wouldnt be in the seprate tab also, it would be in boosters
consumable type would be in the separate tab
you shoulkdnt specify set property in the pack
they seem to be working now
yeah i commented that out
same with the type
that seems to have fixed it
yay
now i just have to set up the text and background cuz all it says is ERROR at the bottom lol
thats group_key
and in localization file it would be in misc->dictionary-><group_key>
i'm moreso referring to this ERROR text
ye me too
did you set group_key for every booster?
yes every booster shares the same group_key, here's my en_us file
must i format it like k_chakra_pack?
actually i should do that anyway
looking at this function SMODS.debuff_card(card, debuff, source), what parameters does card support
what are you looking to do?
just do card = card and it'll target itself right
so SMODS.debuff_card(card, debuff, source) = card?
no
no, SMODS.debuff_card(card, true, ...)
ah
im not sure what source is
Oops! The game crashed: [SMODS _ "src/utils.lua"]:401: table index is nil
what table 
if context.before then
if #context.scoring_hand < 5 then
SMODS.debuff_card(card, true, gort)
end
end
end```
ah yeah that figures
what function do i call to draw cards from deck
G.FUNCS.draw_from_deck_to_hand(1)
still not working by the way
the joker is debuffing as intended 🫡 thank you
none of the animations though, how would i implement that
you could do card:juice_up(0.5, 0.5)
uhmmm
lol its called juice up? thats wacky
it does the wiggle
it juices up the card
i assume the parameters are x and y wiggle?
scale, rot_amount
that actually doesnt make sense tho, all that worked with my pack, maybe theres like a subtle mistake somewhere
or you you forgot the save a loc file
i'm also looking in balatro's code and it's the same way
i've tried entering k_chak_chakra_pack directly into the group_key and still didn't work
is it called chakra_pack in loc file?
i sent a picture of the en_us file
with steamodded it automatically appends the prefixes to keys
add k_chak to group_key in definition
imma be real i have no idea whats causing this. all i have is a basic joker that adds 20 mult. https://github.com/Batthew627/BatthewMod
not here
i tried that earlier and it didn't work so ill try it again
your atlas is wrong
honestly maybe it's because my e_chak_ignited code doesn't work?
BMjoker
BMJoker
oh, and also
just return mult = card.ability.extra.mult
it will auto handle the message for you
better-calc stuff :3
ah ok. tbh i was just pretty much going off one of the example jokers
one thing i will say is it is saying +nil mult when i hover over it in collection
how do i make a joker check for another specific joker?
if #find_joker(<key>) > 0 then ... end
you didnt return loc vars
ty
thats just how i did it idkk, thats very strange
it doesnt seem to do this. unless im missing something lmao.
the mult = card.ability.extra.base here is just not doing anything?
you return object that contains mult =
wait
yeah im stupid thanks
Also you can’t return mult in context before
yeah im seeing the consequences
i get the mult before scoring starts and then once the cards start scoring the mult is retracted
