#💻・modding-dev
1 messages · Page 133 of 1
now the value isn't changing at all???
I'm not certain but I believe it causes (or at least is related to) the effect that plays when cards get destroyed, where it like burns up from the edges almost
juice_up is the wiggle things do when they do something
ah gotcha
This is how I was tracking unique ranks, although I perhaps should've used get_id
has_no_rank is probably better
wait I forgot the top
its less backwards compatible but thats fine
I thought juice_up would be the function to put the card down (like after you enhance it) but that didnt work
no juice just shakes
you want to deselect it
IIRC
this is actually just kinda bizarre, it's just not changing from 14 now
which is weird because there isn't even 14 ranks in a deck????
now the card renders incorrectly
I think Aces are 14
ace is 14 yea
well
it was supposed to be a mista' face but it draws 4 of hearts from 8BitDeck.png
And # returns the largest integer index
You still need to count manually
unless im very mistaken # does not return the largest integer index
or at least I did here
ty i was looking at cryptid source code and they didnt do that (a code card that changes all cards in hand whoops!)
yeah for me it's always returning 14 which it shouldn't be if it's checking array length
because even if Ace = 14 there's still only 13 ranks
because Ace is both 1 and 14 (well 11 in the actual rules but still)
interesting
alright that shouldn't be too bad of a fix
Lua when indexing tables: 
some dirty
inside my code
causing mista four to not render correctly
might be hyperstoneia?
trying to find the default len implementation in luajit is hell
yk what ill just trust that its the same as 5.1
manually adding front might cause problems
like
G.P_CARDS["Mista"] = tabledeepcopy(G.P_CARDS["S_4"])
G.P_CARDS["Mista"]["suit"] = "Mista"
G.P_CARDS["Mista"]["pos"] = {["x"] = 2, ["y"] = 0}
G.P_CARDS["Mista"]["atlas"] = "gerioc1_gerio_p1_geriolish_1"
G.P_CARDS["Mista"]["name"] = "Mista Four"
G.P_CARDS["Mista"]["value"] = "4"
I found this for 5.4. Do you think this is it?
is using context.using_consumeable trigger after or before the consumeables effects
if its for 5.4 its not useful
wish it was but alas
luajit is old
balatro is using love2d right
Y'know I forgot that Balatro uses an outdated version
ya
yes
actually is it context.consumeable or context.using_consumable
But Balatro doesn't
best we can do is x/y - (x%y)/y
and define it as fslashfslash
because neither seemed to update correctly lol
strange, it's not updating when I use hanged man
it's a minor issue but I wonder why
probably detecting hanged man wrong
how to add front? (does smods have front method?)
hey im new to balatro specific modding ive read through steamodded wiki and cant find what im looking for just wondered if anyone already knew, basically im adding a joker that has a chance to be debuffed each hand played obviously when you debuff a joker its not going to be calculated the next hand is there any way i can remove the debuff between hands?
is debuffing important or do you just want to deactivate it
Anyone else run into an issue with mod config updates not being pulled after changes from a prior config?
So essentially say I have mod config.lua like so
return { cool_music = true }
And in the mod config menu I change it to off making the saved config table translate to something like { cool_music = false }
Now I added some new thing I want in the config, and now the config.lua looks like so
return { cool_music = true, cool_colours = true }
However when I launch the game after the new var is added, my SMODS.current_mod.config still spits out { cool_music = false } which is fine except the new cool_colours var is not in the config now.
Never Mind I figured out my issue, it had to do with nesting lol, covered it in more detail in this PR: https://github.com/Steamodded/smods/pull/407
not finding any mention of a "//" anywhere in luajit other than here (which is in dynasm anyways)
Is there a way to disable all scoring in a blind with a flag? There are some mechanics you have to go through before you can unlock scoring again\
just deactivate will work but i would prefer to have it looked debuffed i guess i could fake it with draw commands
maybe poke though base code for that blind that disables scoring until you sell a joker?
Ohhh right I forgot that blind existed
you can make it set chips and mult to 0 after all other jokers
I think I'd rather have it deactivate and not look debuffed. Anyways, you can just save its state in a variable then not execute part of the effect
unless you mean like just completely skipping scoring which might be possible
but execute the part that reactivates
probably make it so it does that boss blind thing were it says hand can't score then throws it away
idk what that'd be called but ya knwo
its really simple honestly its just straight up a 50/50 of the card working next hand or not but i didnt consider at first that setting the debuff would stop me from being able to rebuff the card through itself
trying to make a boss blind where high card wont score but i keep getting this error
i wrote it just like how the smods wiki says i should
not sure whats wrong here
does it work for other hands
lemme see
no
put in 'Flush' got the same error
changed to this, this works. just confused why the other thing that the smods wiki says to do doesnt
maybe get rid of the brackets in the first vers?
how can I make something in set_ability not trigger while looking at it on the title screen
like hand = { 'High Card' = true } ?
G.STATE == G.STAGES.RUN
no that's how you do table keys in lua
maybe? but i doubt it. it's not what the wiki says
its got the brackets
ty
huh
depending on your issue you might not want it to run in the Collection while you're in-game
also I'm not sure how that solution interacts with other game states
actually just checking for if there are playing cards in the deck would probably work
I think the easiest would be like
if G.GAME
maybe it needs something else inside G.GAME?
I guess both G.GAME and G.playing_cards are similar
the only other situation would be if you had no playing cards in your deck which is like technically possible
maybe just test if it works when reloading
but it just would be the default value which is what it should be
it seems to
nice
Question: With all the base game hand types, how would you rank it from easiest to hardest?
High-Card
Pair
2 Pair
3OAK
Straight
Flush
4OAK
Straight Flush
Full House
5OAK
Flush House
Flush Five
Just like the game does
can you clarify what you mean by easiest? like, easiest to make, easiest to win a run with?
maybe odds of getting it + effort to get it
probably easiest to play yeah
that looks pretty solid
Easiest to make
High-Card
Pair
2 Pair
3OAK
Flush
Straight
Full House
4OAK
Straight Flush
5OAK
Flush House
Flush Five
imo
maaaybe strush over 4oak but probably not
just for fun this is the slop that AI decided to spit out
straights are easier than two pairs fr 
where are card enhancements defined? I'm trying to see how gold and steel cards are calculated
Is there a way to keep jokers as individual luas while still having them appear as the same mod
HELP ME PLEASE GOD PLEASE HELP
make/copy code to load files from a directory
SMODS.load_file
from a directory,
for i, v in pairs(NFS.getDirectoryItems(SMODS.current_mod.path.."myJokerDir")) do
SMODS.load_file(v)
end
is anyone else having trouble using set_ability()ing a card in an event?
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.15,func = function()
while faces[i].ability.effect ~= "Bonus Card" do
print(faces[i].ability.effect)
faces[i]:set_ability(G.P_CENTERS.m_bonus, nil, true)
print(faces[i].ability.effect)
end
faces[i]:flip();
play_sound('tarot2', percent, 0.6);
faces[i]:juice_up(0.3, 0.3);
return true end }))
i have an array of face cards and within this, the code says each card is now a bonus card
but within the game nothing happens, they don't score as bonus cards
outside of an event everything works 100% as expected but without any regard for event scheduling
so idk what the issue is, is this an issue with the api itself?
it had been a while since i pulled from the smods repo so i did that and nothing changed
idk
whats the code used for purple seal? i wanna make green seal for my consumables
green seal is taken by cryptid, but still you can make green seal
fuck cryptid, i never use it
i have no idea why this not working so i drop this
hello,
i'm trying to make a joker that triggers at least when a debuffed card is played but i feel like i might need to make a fancy work around. i'm just trying to make a way to return the mult mod for now. Is there an easy change to this bargaining code so i make it kinda work?
calculate = function (self, card, context)
if context.cardarea == G.play and context.individual
then
if context.other_card:is_debuffed() then
return{
mult_mod = card.ability.extra.mult,
message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.mult } },
card = card
}
end
end
end```
nice one
reading the smod wiki, it says debuffed cards = do nothing. feels like its skipping the if trigger entirely here.
how to retrieve run's seed?
You’ll need to look in context.before to undebuff them for them to score
G.GAME.pseudorandom.seed?
is there a wiki page for particles?
i could be sneaky and just see if the chips didn't change between the score initialization stage and the Scoring cards phase...
might test something like that too.
Anybody know? I'm really just trying to make a held card enhancement that goes off after a hand is scored but I'm not sure what the context should look like
it took me a while to find g.hand but this works like a steel card
how to use other mod's atlas?
Thank you, that actually helps a lot
if you still want to know where steel cards implementation is, its in common_events.lua
there's no such page as github.com/Steamodded/smods/wiki/SMODS.Back
Found it, I appreciate it
Does SMODS.Front exist?
https://discord.com/channels/1116389027176787968/1318248620125851749 exists but SMODS.Front?
¯_(ツ)_/¯
was thinking of ideas for custom jokers and accidentally just made another "perky joker"
something like
'Add Negative to a random consumable card at end of shop
-1 consumable slot"
somewhat interesting imo as you can ensure tarot cards don't show up by just keeping them in your consumable area
probably somewhat exploitable obviously
if you get the +1 consumable slot voucher you could probably do the emperor/fool/judgement trick ...
(need a showman momentarily but still)
Looking through SMODS.Sticker's documentation, I'm calling SMODS.Stickers.fm_voltaic_overflow:apply(_card, true) to apply my custom sticker to a playing card, do I use this same line again to remove it?
i think its applied using
if G.jokers.highlighted[1] then
G.jokers.highlighted[1].ability.rental = true
end
Yes, if the value is nil then it would remove the sticker.
for jokers at least
Oh so I have to explicitly define nil in the third parameter?
SMODS.Stickers.fm_voltaic_overflow:apply(_card, true, nil)?
That’s 4 args not 3
Also you can omit the val arg form the call, lua will treat it as if it’s nil
4 args? What's the fourth one? apply(_card, true) is what worked for me to apply and it already doesn't have a val arg
Using the colon is adding SMODS.Stickers.fm_voltaic_overflow as self.
card and true are occupying 2nd and 3rd leaving the explicit nil as 4th
So this function call would basically just be adding the sticker again, not removing it
how would i get the entire played hand without context? i thought this would work but its not quite it
I see I see
So it's just SMODS.Stickers.fm_voltaic_overflow:apply(_card) to remove it?
Should be yea
SMODS.Joker { --Third sun
key = 'third_sun',
atlas = "adofai-jokers-1",
pos = { x = 2 , y = 0},
config = { extra = { chips = 0, chips_gain = 5, mult = 0, mult_gain = 3, other_ice = 0, other_fire = 0 } },
loc_vars = function(self, info_queue, card)
return { vars = {
card.ability.extra.chips ,
card.ability.extra.chips_gain,
card.ability.extra.mult,
card.ability.extra.mult_gain,
card.ability.extra.other_ice,
card.ability.extra.other_fire
} }
end,
calculate = function(self, card, context)
if context.joker_main then
for k, v in pairs(G.playing_cards) do
if v.config.center == G.P_CENTERS.m_sbc_ice then
card.ability.extra.other_ice = card.ability.extra.other_ice + 1
card.ability.extra.chips = card.ability.extra.chips_gain * card.ability.extra.other_ice
end
end
for k, v in pairs(G.playing_cards) do
if v.config.center == G.P_CENTERS.m_sbc_fire then
card.ability.extra.other_fire = card.ability.extra.other_fire + 1
card.ability.extra.mult = card.ability.extra.mult_gain * card.ability.extra.other_fire
end
end
return {
mult_mod = card.ability.extra.mult,
chips = card.ability.extra.chips
}
end
end
}
tryna make a joker that gets upgraded for every fire and ice enhancment in deck, but the joker keeps upgrading every hand played when you have the same amount of fire and ice ehancments as last hand
i think its something with not making the game stop calculation but idfk how to fix it 
tryna make a joker that gets upgraded for every fire and ice enhancment in deck,
So when you obtain them?
yeah ig
You need an update function on the joker, like this
```update = function(self, card, dt)
if not G.SETTINGS.paused and G.jokers then
card.ability.fire_tally = 0
card.ability.ice_tally = 0
for k, v in pairs(G.playing_cards) do
if v.ability.prefix_ice then card.ability.ice_tally = card.ability.ice_tally + 1 end
if v.ability.prefix_fire then card.ability.fire_tally = card.ability.fire_tally + 1 end
end
end
end,```
Then, in your joker loc_vars
return {vars = {
center.ability.fire_tally,
center.ability.ice_tally,
}}
end,```
In the calc function, you simply return either fire_tally or ice_tally as chips, mult, xmult or whatever
you mean like this?
yes
mine does not work, even though i set it up similarly
sending your code may help
balatro quirk moment, tyy
high card gaming
how would i go about adding these changes to my own lua file without having to use Trance? (not the splash, just the suits) even just the SO_2 tbh cuz i use hc cards
yeah but unconventionally i need to do a lot of patching
this is what i have so far but id like to get these in as well so that it fully replaces the colors.
it's not the biggest deal if i can't do this without Trance, just wondered if I could just add this in to my own without needing another mod
wtf does this error mean???
non of the mods im working on go until line 1105
is this the game itself 😭
look in lovely folder, then dump, main.lua in there
its most likely your mod having an issue that causes the game to crash somewhere else
this doesnt have anything to do with anything im doing??
check 1780
time for random bullshit go !
i recommend commenting out the newest parts of your code to narrow down what code is causing the crash
ah i see
soemthing to do with evaluating play
seems relevant enough to be my mod
bug fixing go !
wtf literally everything in the joker i added causes a crash
this is fun
If it ain't breakin you ain't codin
hmm
do i just send all the code here again for help
Wouldn't hurt probably
SMODS.Joker { --Third sun
key = 'third_sun',
atlas = "adofai-jokers-1",
pos = { x = 2 , y = 0},
config = { extra = { chips = 0, chips_gain = 5, mult = 0, mult_gain = 3, other_ice = 0, other_fire = 0 } },
update = function(self, card, dt)
if not G.SETTINGS.paused and G.jokers then
card.ability.extra.other_ice = 0
card.ability.extra.other_fire = 0
for k, v in pairs(G.playing_cards) do
if v.config.center == G.P_CENTERS.m_sbc_ice then card.ability.extra.other_ice = card.ability.extra.other_ice + 1
card.ability.extra.chips = card.ability.extra.chips_gain * card.ability.extra.other_ice end
if v.config.center == G.P_CENTERS.m_sbc_fire then card.ability.extra.other_fire = card.ability.extra.other_fire + 1
card.ability.extra.mult = card.ability.extra.mult_gain * card.ability.extra.other_fire end
end
end
end,
loc_vars = function(self, info_queue, center)
return {vars = {
center.ability.extra.chips,
center.ability.extra.chips_gain,
center.ability.extra.mult,
center.ability.extra.mult_gain
}}
end,
calculate = function(self, card, context)
return {
mult_mod = card.ability.extra.mult,
chips = card.ability.extra.chips
}
end
}
(hopefully this is the last time
)
it needs loc_txt
when does the game crash?
when you play a hand
actually not that
when the hand starts to be scored
like when the card would usually give chips to the chips thats when it crashes
you need to check for context.after in the calculate function
Would this be too complicated to read for a joker?
i think its too convoluted, but also the first line could be rewritten as 'Copy the far left card's suit to every other played card'
unless you mean you can actually pick the suit
very
i assume it's a reference tho
Was also planning on not showing square braket part,
make them hidden mechanics.
then it'd be confusing
become a WHAT
the square brackets could be stream lined to (random chance to copy Enhancement, seal, edition, or rank) using small text
that one person who fails a straight to a 1 in 715 (its upgraded above 5oak):
I mean it like the eyedrop tool in picture editing softwares
you would be able to pick it by dragging your selected cards around
It would be like playing a Flush hand while wild card(s) getting sucked away by Vampire.
The game still count it as a Flush hand.
so the effect is applied in context.after I see
It's meant to make a Flush build that painfully-ly slowly goes toward Flush Five.
welp...
Trying to figure out how to make a joker destroy a specific joker on pickup
Possibly
if not from_debuff then
for i = 1, #SMODS.find_card('j_prefix_name') do
SMODS.find_card('j_prefix_name')[i]:start_dissolve()
end
end
end,```
you'd need to make a add_to_deckfor both
wait so like if I already have the other one, picking the first one woudld destroy both at the same time?
or only the old/new one
no, just the older one
ok then thats correct
anyone know where stuff like g.hand and g.play are defined? i cant find anything in game.lua or globals.lua
in game.lua:
this is mostly uninteresting though
properties of card areas are defined in cardarea.lua
aah thats good to know. im just trying to figure out which one to use for all cards played, scored or not
G.play.cards
might be bugged then because that one only counts all cards up to an always scoring card is played (stone cards)
cooking
what is your joker doing
its an ehanced card that checks for burnt cards in the played hand, but if it always stops checking once it gets to an always scoring card
you should include whe whole calculate function
if G.STATE == G.STATES.DRAW_TO_HAND then if self.burnt then sendTraceMessage("Reset!") end self.burnt = false end
if self.burnt then return end
if G.STATE == G.STATES.HAND_PLAYED then
sendTraceMessage(#G.play.cards)
for k, v in pairs(G.play.cards) do
if v == card then
self.burnt = true
break
end
end
if self.burnt then
for k, v in pairs(G.play.cards) do
if v.ability.name ~= "m_imaginary_dragonCard" then
local percent = 1.15 - (k - 0.999) / (#G.hand.cards - 0.998) * 0.3
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.15,
func = function()
v:flip()
play_sound("card1", percent)
v:juice_up(0.3, 0.3)
return true
end,
}))
local percent = 0.85 + (k - 0.999) / (#G.hand.cards - 0.998) * 0.3
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.15,
func = function()
v:flip()
v:set_ability(G.P_CENTERS["m_imaginary_burntCard"])
play_sound("tarot2", percent)
v:juice_up(0.3, 0.3)
return true
end,
}))
end
end
end
end
end,```
its an update function because enhanced cards dont calculate until they are scored
and i needed it to happen before the hand was played
pairs is not always in order
I dont think I understand, why wouldnt this work in the calculate function in
if G.play.cards and context.cardarea = G.play then
🔥
try ipairs instead of pairs
i have, I used sendTraceMessage to see how long the array was and it wasnt 5 despite 5 cards being played
because cards dont calculate until they are scored, and context.before never works (afaik)
why is this is an update function though?
what else can it be
edited
actually probably not
update runs every frame, and I think played cards don't get added to G.play on the same frame
context.before in a calculate function should do
they dont which is why i was checking G.state
context.before wasnt working earlier but i could try again
otherwise you can create a new context that runs at the beginning of evaluate_play
this is how its working rn
I did it like this (I have a few jokers that make changes before cards score)
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = "G.GAME.hands[text].played = G.GAME.hands[text].played + 1"
position = "before"
payload = '''
for i=1, #G.jokers.cards do
if cs_utils.contains(beforeall_context, G.jokers.cards[i].ability.name) then
--calculate the joker before hand evaulation
local effects, scoring_hand = eval_card(G.jokers.cards[i], {cardarea = G.jokers, cs_beforeall = true, scoring_hand = scoring_hand})
if effects.jokers then
card_eval_status_text(G.jokers.cards[i], 'jokers', nil, 1.1, nil, effects.jokers)
end
end
end
'''
match_indent = true```
-# I hardcoded which jokers can enter in order to avoid other Jokers breaking
wait what is that animation lol
i made it lol
anyways you can try a new context if all else fails
its pretty cool
thx, i think it'll be a lot cooler when the art is done & the dragon sound when the explosion happens
i see nothing in the console when i do this so im not really sure
it should be print("before")
-# or thats what I use at least
the earliest i can get a console message is when the card gets scored w/ chips, so im not sure a new context will help
i use the logger for debugging
if you use debugplus, print works
you're not on latest steamodded
im on old calc
it'll work on new calc
should i update then? i heard some stuff breaks
im using it, its fine for now
if you have other enhancements/editions you probably need to change them
just make sure youre using context.joker_main for jokers that give mult, chips, xmult
only thing that broke from updating was this, in an enhanced card, what do i need to change
it says effect is nil
nevermind needed context.individual check it seems
updating fixed it thank you...!
if context.cardarea == G.play and context.main_scoring then
return { x_mult = card.ability.x_mult }
end
do we not use effect at all anymore
yes
this makes the thing happen after the played hand has already been scored
atleast im one step closer ig
seems like context.joker_main is the one i needed
I wonder which part is overflowing when you have calculate code not in a context 🤔
I got a "if all cards in played poker hand are debuffed" function working. Here's a solution if someone comes looking for a similar thing later. can be touched up in the good lua department but it works.
calculate = function(self, card, context)
if context.before
then
card.ability.extra.hand = context.scoring_hand
card.ability.extra.all_debuffed = true
for _, v in ipairs(context.scoring_hand) do
if not v.debuff then
card.ability.extra.all_debuffed = false
end
end
if card.ability.extra.all_debuffed then
for _, v in ipairs(context.scoring_hand) do
v.debuff = false
end
return{
mod_mult = card.ability.extra.mult,
message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.mult}}
}
end
end
end
is the joker's calculate function ignored if its debuffed? like would I need a lovely patch if I want one joker to be able to debuffs itself
I guess I could intercept it through remove_from_deck with from_debuff but I want it to undebuffs during its turn
how do i put a random seal and edition on a card?
Hey everyone sorry if this question might seem a bit redundant but I'm trying to make a card skin mod (to replace face cards with little hand drawn cards of mine) and I can't seem to figure it out. So far I've got the assets set up and the lua file and everything but whenever I load up the skin in game the face cards just appear blank... any ideas?
Hopefully this is the right channel for this
For the seal you can use the SMODS.poll_seal function as an argument to set_seal. That will do all the random business for you since the base game does it somewhat ham-fisted, which is fair enough since only certificate requires a random seal to be picked.
Nevermind, figured it out. I was exporting the images wrong.
I imagine it is similar for the edition
is it SMODS.poll_seal or just poll_seal
yeah you'll need SMODS. at the beginning since it is a modded function by steamodded
check the documentation it only requires two vars
here's how i used it
dont worry about the print bit I just wanted to see the number in the console
uhhh i will not mind the pseudoseed.... thanks?
oh i meant to change that
you can have the pseudoseed as whatever you like it just processes a string and spits out a number between 0 and 1
obvs the G.hand.highlighted[i] bit is specifically the card im referencing in my chain, youl have to change it to what yours is
i got that, maybe check the screenshots before you send them 😭
wow so embaraasing
not really idc
it's a meme I stuck in cus my friend and I brought it up
I'm making a custom SMODS sticker, what context check should I use to see if any hands are played without the card with the sticker on it
it is a ability
in the code
if context.other_card.ability.rental then
similar to this
I'm trying to make a deck that gives you extra cards to start out with, but I can't for the life of me find an example of how to do so! I'd like to ask for some help.
Here's what I've got now - I suspect this should work, but I'm unsure what to put for the "area" option, and (if I want one extra card for every rank) what I should make the Key to force a specific card
that's not how SMODS.add_card works?
should be more like SMODS.add_card{set="Base", <etc>}
so more like, card = SMODS.add_card{set="Base", area="(something)", key="(something)"} ?
its probably like card = SMODS.add_card({set="Base", area="(something)", key="(something)"}) i think
I got a problem with trying to get a new global variable to work across multiple jokers. I have it initialized at 0 with init_game_object and it'll function in the first joker, but it doesn't seem to function in the second joker.
I use it to hold money that the first Joker steals from the player wallet and follow that up by using ease_dollars to subtract the player's wallet from itself, and this all works and successfully changes the value.
ease_dollars(-G.GAME.dollars, true)```
I want the second Joker to return the value in G.GAME.thiefwallet to the player wallet and set its value to zero, but this doesn't work.
```ease_dollars(G.GAME.thiefwallet, true)
G.GAME.thiefwallet = 0```
Both of these jokers operate at context.end_of_round, but the thing is that doesn't matter, since even if the second Joker tries doing this during context.joker_main, it still doesn't work. I'd love if someone can check this out - I'm gonna make this a thread where I'll dump my code for everything.
what did poor perishable_compat do
i think it'd be really really funny for the joker to disappear with all your money
how do i get a random edition?
another day, another stealing codeing session
im so close.. just like 7 more runes to go
guys do you vibe with
it should remove all your discards like the water
or just set the boss blind to the water
it does feel like that doesnt it
anyone know how to add debugging comments and how i'd access them?
if you use debugplus mod, you can print with print('hi')
Ahhhh I could have sworn I did that
I'll give it another spin
it'll be in the console, right?
do i need to have it open?
you do not need debugplus for this
Gonna give this another bump. To explain the intended functionality a bit better, I’m trying to track the number or retriggers prior to the second joker hitting joker_main and use that to calculate Xmult, but currently it's tracking any Joker trigger
with debugplus it opens automatically so its better ig
yo does anyone know were the example mods for steammodded went? They were very helpful
no
meh debugplus only handles lua prints
i prefer the raw lovely console
- cant look at dbp console after a crash
programists:
CTRL + C
CTRL + V
from a design perspective , what r people’s thoughts on giving a single joker multiple effects to push it towards viability , even though it isn’t something that’s done in the base game ?
Personally I'm not a big fan of that. Makes it too easy of a choice compared to other jokers that "Won't do as much"
lmao
well, as in example joker mod
-# more description line than 3 looks odd
thank u
Haha...
-# I don't think I've shown the Poet here yet
i was mainly thinking about it in terms of tacking something like +chips or +mult onto a utility joker
it’s something i think i’ve seen some people do
if its a legendary its justified right?
or a joker that is an enabler to its own payoff , which u would never normally see
Passive scoring as a secondary effect I'm quite against because it removes the tradeoff of holding on to a utility joker
mhm
mhm this is the kind of stuff i was talking about
i don’t have any actual thoughts on it cuz i haven’t done any modding but it’s a good example
nah
I need to split it into two jokers? ;-;
This is true
this is why i wanted to have this discussion though
But in terms of balance that thing is nuts
lemme rephrase, would it make sense to split it into two jokers?
it’s difficult to judge cuz it’s legendary
I personally think it would since the rank seal itself seems very powerful
my personal design philosophy would lean towards yes
The interactions with it are good, but it's just so much for one joker
but once again it’s legendary so i don’t know
u could put the effects on non-legendaries or something
It really does depend on how unbalanced you're willing to go lol
here’s a good example of what i’m talking about from the paperback mod
i don’t know how to feel about things like this
i’m not criticizing it whatsoever of course i’m just curious what others think
Yeah that card is really out of left field for being a vanilla-inspired mod
fair enough
This one actually seems fine since there's a tradeoff with it creating fakes
😭
i would never take it because my ass cant recognize the diffrence
LOL

like, i mostly play flush five, but the moment a fake card appears looking like mine
i will have existencial crisis
they get an enhancement when you trigger them once
any1 know how to fix this?
just visual tho, if you change enhancement they are still fake
so i guess the ultimate question i’m trying to answer is what should one do if they’re trying to make a really cute utility joker or something that u would rarely want to give a joker slot to in comparison to actual scoring
just design good cards , i guess ? LOL
first off, only fucking list of mods wont let us do shit
just paste the log
It's not out yet lol
understood
I'm taking my time with it
glhf
0614a seems like an ancient steamodded
so i should update smod?
yup
can any1 send em an updated one
Thanks for a reminder to do a pull sometime today
i still have no idea what i am doing in my mod lmao
I too once in a while remember to pull only to see I'm 16 commits behind 😭
Yeah lmaooooo
im making mine inspired by a game on roblox 
Mine is very much vanilla+
someone made consumables inspiried by roblox
does this count 
This card is actually getting its second effect removed in the next update

can i just do consumables that do nothing so i can see how they look like in game?
yes
yea
I do it with jokers all the time
got template for that?
so i dont mess up
oh cool , thank u for the insight ^w^
fuwwy spotted
this one is the new
its a specific game tho
oh it's cryptid, iirc cryptid should include a certain steamodded version in order to work correctly?
I cannot blame math for doing that ngl lmao
I have no idea honestly, I might be wrong
i will need the consumable empty template so it wont crash under any chance
i was playing the run untill i got something and after e250 crashes
I just don't think it's up to the better calc yet
also guys, how do you sort your code?
Oh yeah that
Yeah I do that
Yeah...
wdym sort my code
by type
i see alot of people sort code
also i dont mean files, i mean code
I have all my code in a single file, I find it more easy to access things that way - the file bar is already bloated with base game stuff
oke, i need walkthrough about that one cuz nothing like this is in examples
oh huh, I swear there was an entry on the wiki about that, doesn't seem to exist now
i just want to make my own potions man ,w,
yeah it did exist for sure
if it doesnt anymore, what do i do?
what the fuck is 1 in 0.1 😭
oke, i think i found it in diffrent mod
key = "Potion",
primary_colour = HEX("9933FF"),
secondary_colour = HEX("9933FF"),
collection_rows = {4,5},
shop_rate = 0,
loc_txt = {},
default = "c_emperor",
}```
something like dis?
though i dunno what default means
...great...
forgot to ask the other time, but is there a way to create a new cardarea with smods
Oops! The game crashed:
main.lua:1780: [SMODS _ "src/utils.lua"]:1140: bad argument #1 to 'next' (table expected, got nil)
Additional Context:
Balatro Version: 1.0.1n-FULL
Modded Version: 1.0.0~ALPHA-1308a-STEAMODDED
LÖVE Version: 11.5.0
Lovely Version: 0.6.0
Steamodded Mods:
1: Talisman by MathIsFun_, Mathguy24, jenwalter666, cg-223 [ID: Talisman, Version: 2.0.2, Uses Lovely]
Break Infinity: omeganum
2: Gemstones by Halo / OfficialHalo [ID: Gemstone, Priority: -50, Version: 0.8.0-pre3, Uses Lovely]
3: DebugPlus by WilsontheWolf [ID: DebugPlus, Uses Lovely]
Lovely Mods:
Stack Traceback
===============
(3) global C function 'error'
(4) Lua upvalue 'gfep' at file 'main.lua:1780'
Local variables:
success = boolean: false
err = string: "[SMODS _ \"src/utils.lua\"]:1140: bad argument #1 to 'next' (table expected, got nil)"
(5) Lua field 'evaluate_play' at file 'main.lua:1897'
Local variables:
e = nil
(6) Lua field 'func' at file 'functions/state_events.lua:544'
(7) Lua method 'handle' at file 'engine/event.lua:99'
Local variables:
self = table: 0x07263700 {start_timer:true, timer:TOTAL, blockable:true, trigger:immediate, func:function: 0x06d35ff0 (more...)}
_results = table: 0x066e08e0 {blocking:true, pause_skip:false, time_done:false, completed:false}
(8) Lua method 'update' at file 'engine/event.lua:182'
Local variables:
self = table: 0x069f53c8 {queue_last_processed:8.1166666666666, queues:table: 0x069f53f0, queue_dt:0.016666666666667 (more...)}
dt = number: 0.016781
forced = nil
(for generator) = C function: next
(for state) = table: 0x069f53f0 {unlock:table: 0x069f54e0, other:table: 0x069f5580, tutorial:table: 0x069f5530 (more...)}
(for control) = number: nan
k = string: "base"
v = table: 0x069f5508 {1:table: 0x06bab918, 2:table: 0x07263700, 3:table: 0x07263440, 4:table: 0x07148058 (more...)}
blocked = boolean: false
i = number: 2
results = table: 0x066e08e0 {blocking:true, pause_skip:false, time_done:false, completed:false}
(9) Lua upvalue 'gameUpdateRef' at file 'game.lua:2629'
Local variables:
self = table: 0x066e7308 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06d1c5d0 (more...)}
dt = number: 0.016781
http_resp = nil
(10) Lua upvalue 'upd' at Steamodded file 'src/ui.lua:81'
Local variables:
self = table: 0x066e7308 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06d1c5d0 (more...)}
dt = number: 0.016781
(11) Lua method 'update' at file 'main.lua:1760'
Local variables:
self = table: 0x066e7308 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06d1c5d0 (more...)}
dt = number: 0.016781
(12) Lua upvalue 'oldupd' at file 'main.lua:996'
Local variables:
dt = number: 0.016781
(13) Lua field 'update' at file 'main.lua:1787'
Local variables:
dt = number: 0.016781
(14) Lua function '?' at file 'main.lua:935' (best guess)
(15) global C function 'xpcall'
(16) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '?' (defined at line 906 of chunk main.lua)
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
fr gonna crash out
something with this
put this in a file instead of whole copy paste it, chat flooded lmao
steamodded doesn't provide an API for it, no. You'd just use the game's CardArea constructor
understandable, thanks 👍🏽
anyone know how to check if specific cards in played hand are of a specific enhancement
am i being stupid rn because i just copied code from what cryptid did for rigged
guys, why its an "error"
missing loc txt
MixedPotions also have it empty and for em it works
maybe they have an en_us?
they had localization file
I guess im asking how do you check for enhancements on cards
Hey guys, i used to play this a bit, and I had mods installed back then but nothing is working anymore other than the base game, is there something I need to change or update to get mods working again?
card.ability.effect, its a string value of the enhancement's name
#⚙・modding-general is enough, you dont have to post twice
anyway, so how i fix my "error" if i dont wan localization file?
add loc_txt
Sorry, people were just ignoring my question there so i wasn't sure if this was a better place to ask
this is mostly a place about developing mods, ngl
Sorry i didnt know
its oke
Has anyone tried to mess with the particle generator?
wait, what is can_stack and can_divide?
Because I think they’re just in texture squares right
So you should be able to texture them
so how would I use this in context?
if card.ability.effect == "Stone Card" or smth
halo, got empty consumable template i can use? so i can see how they look in game
Don’t check string names pls
is there a standard way to make a page like this

Yeah lmao
you came to the right guySMODS.Consumable{ unlocked = true, discovered = true, atlas = "ATLAS", set = "SET", name = "set-NAME", key = "NAME", pos = {x = 0, y = 0}, --Atlas position cost = 4, order = 1, can_use = function(self, card) --!!CONDITION FOR USING!! end, use = function(self, card, area, copier) -- what the rune does return true end })) end, }
what does caesar do
Hedonist: Gains 0.5x Mult when leaving a cleared out shop
thank you dude
thats interesting
does it count voucher too?
vagabond synergy 🔥
also i think i fucked something up
Oh shit truuuuue
do you have a loc_vars?
hi, is there a specific file where the code for jokers is stored in the game's source code? i've looked everywhere and could not find it
loc_vars?
dont seem to have it
you need it
It depends what you're after. If you want trigger functionality you want card.lua. If you want definitions you want game.lua
oh ok. thanks !
well, what exacly do i write in it?
return {
vars = {
center.ability.extra.mult_gain,
center.ability.extra.mult,
}
}
end,```
(swap mult_gain and mult)
i think i need to swap em lmao
speak of the deviool
and how i color the PotionUP nametag thingy?
drop to rare or leave it legendary?
its your choice
yes i want suggestions
"badge_colour": "<hex here>", in the .json file
False
rare tbh
?
json? the fuck
the header is obsolete
--- BADGE_COLOUR: ABCDEF for header
i only have lua file, no json
at the tippy top of the lua you should have something like this:
ahhhh
"id": "CrazyStairs",
"name": "Crazy Stairs",
"display_name": "Crazy Stairs",
"author": ["Me"],
"description": "",
"prefix": "cs",
"main_file": "CrazyStairs.lua",
"priority": -2,
"badge_colour": "FFFBBB75",
"badge_text_colour": "",
"version": "0.1",
"dependencies": ["Steamodded (>=1.0.0~ALPHA-1310*)"],
"dump_loc": false
}```
and name it "main file name" + ".json"
i should make a json
so frustrateing
bump
so what i do with this old thing?
do i remove the header? edit: yes
remove it
how do i get all of the jokers and cards in hand
closure on this: so it turns out this only happens when you load a save state in DebugPlus and add another card
do i need the dependencies?
what will happen if i remove it?
(cuz i am 2 versions behind)
how could I prevent context.remove_playing_card from being triggered when a hand is played?
In other words, is there a better way to run code only when a card is destroyed?
calculate=function(self,card,context)
if context.joker_main and card.ability.extra.mult > 0 then
print('this way')
return {
card = card,
message = '+' .. card.ability.extra.mult,
mult_mod = card.ability.extra.mult,
colour = G.C.MULT,
}
end
local multAdd = 0
if context.remove_playing_card then
print('that way')
for i= 1, #G.hand.highlighted do
multAdd = multAdd + G.hand.highlighted[i].base.nominal
end
card.ability.extra.mult = card.ability.extra.mult + multAdd
card_eval_status_text(card, 'mult', card.ability.extra.mult, nil, nil, {message = '+' .. card.ability.extra.mult})
end
end
What are you trying to do?
haven't been able to figure this out 😭
Eval card has two return values
oh i've just been returining the ret 😭
how do i flip a card, and how do i check if a card is flipped?
i know its :flip, is there any arguments?
I'm trying to trigger some code when a card is destroyed (via hanged man for example)
awesome it works now
No, no arguments. If you ever want to check information like this, you can look in the game files for it. Most anything card related will be in card.lua
Then check card.facing=='back'
What’s wrong with context.remove_playing_cards?
it also triggers when cards are removed from the played hand
Also check that context.removed and #context.removed > 0
It should only trigger when cards are destroyed
Yeah, but I had the same issue as well. Was getting trigged when playing hands
Might be a bug idk
ok, now it doesn't trigger anymore when I remove cards via hanged man
not necessarily
i dont think im doing things right
Can you paste the code here?
calculate=function(self,card,context)
if context.joker_main and card.ability.extra.mult > 0 then
print('this way')
return {
card = card,
message = '+' .. card.ability.extra.mult,
mult_mod = card.ability.extra.mult,
colour = G.C.MULT,
}
end
local multAdd = 0
if context.remove_playing_card and context.removed and #context.removed > 0 then
print('that way')
for i= 1, #G.hand.highlighted do
multAdd = multAdd + G.hand.highlighted[i].base.nominal
end
card.ability.extra.mult = card.ability.extra.mult + multAdd
card_eval_status_text(card, 'mult', card.ability.extra.mult, nil, nil, {message = '+' .. card.ability.extra.mult})
end
end
then i gonna yeet it out
Pretty sure that should be context.remove_playing_cards and not context.remove_playing_card
hmm, let's test it
alright
that fixed it
thank you
So hey. When you take ownership of a seal/enhancement/edition or whatever using steamodded... are you expected to also like, take ownership of everything that also makes reference to it such that an info box pops up? Because if you don't, and the seal/enhancement/edition uses a different set of loc_vars than vanilla, then the game will just crash!
When trying to render the info box that is.
I encountered this when modding blue seal. Hovering over blue seal gives no issue. Hovering over trance crashes the game, because then vanilla code kicks in and gives my localization function for blue seal the wrong loc_vars.
I have a hard time believing I'm the first to encounter this. This problem would exist for any seal/enhancement/edition override of vanilla's.
So maybe I'm just missing something(???)
this is crazier than the time i got the plant on a baron run! (insert losee screen)
is there a list somewhere of all of the text color options?
best i know of
thanks
I would assume this applies to seals and seals only. Enhancements and editions are referred to by their prototypes as info_queue entries, but seals indeed aren't. They work a bit differently from anything else, and simply passing the prototype just doesn't work
So this is way more niche than you're making it, but still unexpected behavior
I guess overriding vanilla seals isn't something many people do, then.
I'll figure something out to make it possible to simply pass the prototype for seals too. I was working on something similar for jokers and tags the other day, tbh I just forgot seals also have issues in that regard
I did see that for e.g. editions, it adds G.P_CENTERS.e_holo instead of a hardcoded table like {key='blue_seal, set='Other'}. But I didn't investigate that since I didn't get how that would've made a difference (since I didn't see a function call involved)
And loc_vars must be determined by a function call
each table added to info_queue gets passed through its own iteration of generate_card_ui. If the center is used, it has your loc_vars function defined on it, while a hardcoded table doesn't
Ah, now I get it.
... but... hmm. I think I can see the code you're talking about, but the relevant conditional you have for it is first_pass and not (_c.set == 'Edition') and badges. Wouldn't that mean enhancements would suffer the same problem?
no wait, hold on, i'm bad
how do i make a joker with the functionality of the steel joker? i need to check for specific enhancements in deck
Check for them in your locvars and calculate functions
i dont really know how though
Let’s try once more lmao I keep asking at bad times seemingly
retrigger_joker_check seems like the wrong context to use?
(disclaimer that I haven't really worked much with joker retriggers)
does it work correctly for other jokers?
What do you mean by “works correctly?”
Because right now it tracks all joker triggers, not just retriggers like it should
yeah that sounds like it doesn't work correctly 🤣
Yeaaaaaah
try context.retrigger_joker and not context.retrigger_joker_check instead?
Alright I’ll give that a whirl when I get the chance
can't seem to figure that one right rn without breaking vanilla seals
i'll stash this and get back to it later
any idea why this might be crashing?
Are you doing a runes mod? I thought I was being original lol
ooo thats about how many I have done
this is the link to my github https://github.com/Elswre/Balatro-Rune-Magic
You definitely have different
Mine are more get something but something, not very random
ah yeah I went with the randomness theme to reference how tricky runes are in the myths
Hello, need some help here
I don't understand, I'm trying to create a Joker who can destroy himself like Gros Michel but the game keep crashing because of line 38 when I look into the Joker description ("main.lua"]:38: attempt to index global 'card' (a nil value)
what's the crash? 🤔
how to check if a card stays in hand?
"bad argument #1 to 'next ' (table expected, got nil)"
what version of steamodded are you running?
1.0.0 alpha 1313a
The key probably shouldn’t have spaces. Also we don’t know what’s line 38
Sorry 😭 it's that one
full crash report
cheers
Ah that’s easy: look at your arguments and the variables you used
You didn’t define card
This just doesn't detect the triggers at all now
Ohh thanks! I'm a beginner and I'm trying to learn with premade code
interestingly when I copy-paste the code it doesn't even detect steel/gold/stone cards
wow I just read that code like 5 times and didn't see the issue
why are you checking card and not context.other_card for an enhancement
card is the joker
ohhhh
also I needed to change == "stone" to == "Stone Card" etc
so like this?
and I think it's better to use SMODS.has_enhancement(context.other_card, "m_stone") or <etc for gold, steel>
yeah I think that'll work
how would I do your suggestion?
if context.other_card.ability.effect == "Steel Card" or context.other_card.ability.effect == "Stone Card" or context.other_card.ability.effect == "Glass Card" then
into
if SMODS.has_enhancement(context.other_card, "m_steel") or <etc for stone, gold> then
sweet
also the description of the joker says steel/stone/gold, but the code checks for glass 🤔
uhhh idk 😭
whoops
damn lol
let me try some things
I already have something I'm working with but thanks
aight
Did you get it sorted?
no
Lars is helping me work it out rn
You probably want if context.post_trigger and context.other_card == G.jokers.cards[1] then I think
It might be other joker
I don’t remember off the top of my head
post_trigger was one I was also looking at but assumed it would trigger even on non-repetitions
That's what I was thinking as well and hence have not tried it
Also that second half would just detect the first joker in hand??
only 25 mult?
... yes
it was other_joker at some point, erroneously
Did I misread what it’s supposed to do? I thought it was the number of triggers of the first joker you wanted?
It's supposed to be tracking the number of all retriggers
Gains x0.5 mult when a joker or playing card is retriggered
iirc
Correct
context.other_context.retrigger_joker?
Yeah post trigger is still the correct thing to use
I have that in the circulation but it seems to not do it for me
show code then?
(I read through the chat when you first asked your question and I'm not sure how so many people misunderstood lol)
Here's the isolated bit that's supposed to be tracking the retriggers
Me neither 😭
yeah you're not using post_trigger
You want post trigger and the snippet aure posted
ughh im still getting the same crash
I'm saying something along the lines of
if context.post_trigger and context.other_context.retrigger_joker then
That should give you successful retriggers
alrighty
main.lua:1793: [SMODS _ "src/utils.lua"]:1147: bad argument #1 to 'next' (table expected, got nil)
I cant figure out what table I might be passing an argument to
This is the first I've seen other_context though, what exactly does that give?
that gives the context the retriggered joker was triggered on
It works for me! How are you testing it?
I'm using Hack as a baseline for retriggering
hack doesn't retrigger jokers?
But it retriggers cards
Joker retriggers are fully modded
context.other_context.retrigger_joker specifically checks for joker retriggers lol
This worked to copy Jokers in the previous calc
The other bit is a bit more of a complicated check, give me a minute
shouldn't it just be repetition_only? 🤔
nope
I'm very lost, it worked fine on my end
look at the lovely dumps
this is the fastest way to see what's going wrong
unless
what's the full file path
for the error
wait fuck ignore that
I like half the chat being in there
shhhhh
lmao
here is the crash report
Cuplrit Cryptid
I think what you need to do is hook SMODS.calculate_repetitions and check for the presence of your joker, and increment a value in it internally to then use in your context.joker_main check
yeah individual card retriggers don't get thrown to jokers becuse they can come from the actual card itself
the repetitions given to them from jokers do get passed, but not from seals etc.
no, it's repetitions you need here
retriggers is for jokers
repetitions is for cards
I cannot believe there's different terminology for that 
🤷♂️ I didn't name them
I'm not blaming you lol
So I take it I'd have to take ownership of the function then? If that is the case I have yet to do anything with taking ownership lol
can't take ownership of a function, would need to hook or lovely patch
its not a difficult hook, I can write it for you if you need
my suggestion was going to be counting context.cardarea == G.play and context.other_card and context.individual and subtracting 1 from the final counter
but I'm not sure that's any cleaner
Yeah hooks are still something I'm still having a tough time wrapping my head around for the most part
hooks are pretty simple
Also sidenote, would this hook take red seals into account too? Asking in case I can get rid of that check
yes this hook would take everything in
awesome
oh that might work too actually
wait no
that would count times jokers trigger on the cards
I'm unsure what the difference is?
unless there's a scenario where a playing card retriggers but doesn't trigger the jokers with that card as context
hey does anybody know why this event only works properly once?
that context counts effects like the basic suit jokers
ah yes, string addition
local rep_calc = SMODS.calculate_repetitions
function SMODS.calculate_repetitions(card, context, reps)
local rep_return = rep_calc(card, context, reps)
local jokers = SMODS.find_card('key here')
if next(jokers) then
for _, joker in ipairs(jokers) do
joker.ability.extra.card_repetitions = joker.ability.extra.card_repetitions + #rep_return - 1
end
end
return rep_return
end
I think this counts them correctly
I'll give it a go
it makes sense in any language except lua
you'll also need to reset the count in context.before
I've been doing that already so we good
return true in your event else it'll loop forever?
... yes, that's the context basic suit jokers use? I still don't see the issue 😅
tysm, I'm still very new to events so I don't really get how they work yet
they aren't repetitions of a card
let me introduce you to https://github.com/Steamodded/smods/wiki/Guide-‐-Event-Manager before the author himself can link it
I think some use multiplication
OH wait I see what you mean
string multiplication with an integer actually makes sense!
I was already skimming this before, but I guess I missed the part about having to return true to properly end it
I think the logic is
xy
is multiplication
is concatenation
that might actually be cleaner, hmmmm
I think your hook is fine actually
the hook should work
This looks like it works. tysm for the help here
what's the effect
it'd be something like if context.cardarea == G.play and context.individual and not context.retrigger_joker then right?
yeah that'll also work, though I think you only really need the context.cardarea == G.play and context.individual
I think retriggers would mess up the count if you didnt exclude them
though I'm not sure
it would be for playing cards, so I don't think retrigger_joker is relevant?
I mean you'd have to start keeping track of individual cards so the hook is cleaner anyway
but you're counting the times the context comes into the joker to track the times the card triggers
oh the joker that's counting getting retriggered?
yeah
oh my bad didn't realize that's what you meant
On note of repetitions... I think updating Steamodded potentially broke something in this bit 'cause I crash whenever I have a "in hand" ability card like Steel.
if context.cardarea == G.hand and context.repetition then
return {
message = localize('k_again_ex'),
repetitions = repeats,
sound = not silent and togabalatro.config.SFXWhenTriggered and "toga_officehammer"
}
end
yeah might need to handle that, not sure
see this is why the hook idea was cleaner
huh, a table index is nil
looks to be coming out of talisman
it expects there to be a card when there's repetitions
i don't think we do? not sure though
can you try if it works sans talisman?
Adding card = context.other_card no longer crashes it, but sure, I'll try.
better calc doesn't expect cards in any returns
So I'm realizing I need to do another hook into an SMODS function, but I want to replace part of it instead of just tacking functionality on. For this case I wanna specify the number of cards pulled in random_destroy, so I'd have to add a loop where this now is. How would I do that?
Guess it's the Talisman-specific thing, then.
'cause w/o it and the card =, it works as intended.
I'll leave it as card = card until I notice the fix.
i keep getting my amount of xmult come up as nil when i test my joker in game, what am i doing wrong with the card.ability? ``` SMODS.Joker {
key = 'vaingloriousjoker',
loc_txt = {
name = 'Vainglorious Joker',
text = {
"{X:red,C:white}1.5{} Mult for each",
"{C:diamonds}Diamond{} suit held in hand",
}
},
config = { extra = {
X_mult = 1.5,
suit = 'Diamonds',
}
},
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.x_mult } }
end,
rarity = 3,
atlas = 'SinfulJokers',
pos = { x = 0, y = 0 },
cost = 8,
unlocked = true,
discovered = true,
blueprint_compat = false,
eternal_compat = true,
perishable_compat = false,
calculate = function(self, card, context)
if context.individual and
context.cardarea == G.hand and
context.other_card:is_suit("Diamonds") then
return {
mult_mod = card.ability.extra.x_mult,
message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.x_mult } }
}
end
end
}
you have X_mult in your config but x_mult elsewhere
...
you're also using mult_mod
thank you
what smods version are you on?
im testing in 1.0.0~ALPHA-1309c but using the example joker mod guide best i can, even though theres no clear documentation on the names of everything for effects and areas
your return just needs to be xmult = card.ability.extra.X_mult then
though you should also update smods
i downloaded this two days ago
4 days ago
thoughts on balance?
my only concern is if .25 will divide since its a decimal, punishing instead of boosting
nah, it's gain X0.25, so it'll be X1.75 after first trigger
mkay!
it kind of limits itself since you run out of stars and moons to play spectrums with if you don't find a way to convert them back
it can still give a lot of mult quickly
It depends on how easy it is to get a Spectrum. But it seems too good for a deck effect instead of a Joker.
What does the suit change to?
i think it might depend on how you are building your deck in a playthrough, sounds like a fun challenge!
it changes randomly to something that isn't stars or moons
spectrum i believe is a hand played with five suits
sorry geez
I was just clarifying :<
it's not a bunco spectrum, it's fairly easy to get but doesn't score a lot
So I imagine your deck starts with 6 suits
this would mainly synergize with composite hands such as straight spectrums
yes
How does the math work out for spectrums compared to flushes
or straights
Spectrum Flush 🤔
Straight Spectrum Flush Pair 🤔
i have them at 20X3
Pretty sure the math for 5 different suits is much nicer than five of the same suit
though flushes are rarer in decks with more suits, so they should also get a boost
I'd kinda like putting it where Bunco Spectrums are, just starting at Level 2
I think it should start at X1 honestly
I've thought about either that or reducing the gain
colorful 😭
I think both would be good
but starting with 1.5X might make it too free early-game
is X0.2 gain still too much?
I was thinking 0.1
I think starting at X1 and have gain X0.2 sounds pretty good
yeah same
what could i do for a unique sleeve effect
X100 mult ezpz
spectrums can be made with 4 cards?
Why so serious?
what does it turn Moon and Star into with the 1 in 4 chance?
i think any other suit
.
no, it doesn't change stars into moons or vice versa
-# should it?
oh ok
it might prolong the effect of runnign out? idk
should probably be specified
What Tarot changers are there for them
The Star? and The Moon?
The Diamond and the Club?
i could have made them that
It'd be funny
cool joker, what does it do
i'll consider if given art
i was looking at one of the example mods trying to figure out how to make a custom deck, and i noticed this line of code:
"full of {C:attention,T:e_polychrome}Poly{}{C:red,T:m_glass}glass{} cards"
What exactly does T do? ive only figured out C, X, S, and V so far
Makes a random held joker negative at the end of every ante
makes tooltips when hovering over that part of the text (or next to the description when using galdur)
sounds like a good idea for a deck
That does sound like a neat deck
Ahh i see. thanks!
probably a bad idea for a deck/sleeve effect, but idk
could it retrigger spectrums perhaps?
how would it decide between flush and spectrum
I guess it picks the highest in position
picks flushes because they're higher on the list
wild flushes are still considered to contain a spectrum though
Since there's some activity here can anyone help me out with this? Still in the process of learning hook stuff 
smodsman will six suits support spectrum franework
i don't think spectrum framework wants me supporting it
there's already bunco support being added
im pretty sure thats literally just because you add spectrums
hmmm, the seal loc changes have broken my curse tooltips
i love me some breaking changes disguised as innocent fixes
it's the steamodded way
thac is going to be supporting spectrum framework going forward 's why i ask; i like six suits also tho and wanna have support for it where applicable :333
aight i'll add support for it
:3 nice
Oh thank goodness I don't see any failed patches after update 
Last time I updated my joker that returned suits and ranks back to stone cards broke completely 
That was quite a bug fixing adventure
please tell me you can change the shit jimbo says when you lose a run i NEED to make this (og post https://www.reddit.com/r/okbuddyjimbo/comments/1huyg9y/me_when_local_skunk_gives_me_perishable_rental/)
💀





