#💻・modding-dev
1 messages · Page 527 of 1
SMODS no longer uses the default drawing behavior. You'll have to use the draw function on the center, add a new draw step, or hook an existing one
thank you
i believe i had this code written before that update
definitely prior to january this year
Actually Eremel sorry to bug you when I've already probed for it over in SMODS, but do you know a reasonable way to accomplish what I'm doing here? I need to retrigger/rescore a glass card only if it's going to shatter, but I'm not sure the most effective way to do that after the point that the shattering is determined
I suppose I could use probability prediction for every glass card in hand, since it's typically only calculated once
That just feels messier
I think it'd be predicting the shatter event and then adding the retriggers but I am not sure
for retriggering since someone could have vampire or another joker that changes or removes the enchanment, should i make it where it will only trigger if it's both a seven AND a lucky card, or trigger all sevens
What do you use to record gifs / videos? I use s2gif and each one is extremely heavy
obs studio with low video settings
Hmmmm I can def predict the shatter event, but I'm mulling on it, because it's harder to know what modded items might influence it
yea id say either steam recording or obs
ok actually how do you replace an atlas image i cannot figure it out for the life of me
Helo, sorry for not responding, my laptop ran out of battery and I couldn't charge it until now.
https://obsproject.com/download the only reason why its low setting is so its under the video limit my computer is able to handle 720p/1080p recording
Download OBS Studio for Windows, Mac or Linux
For example I have a modded iem that internally reruns the glass card break chance, and it wouldn't necessarily know how to handle this if a specific case isn't made for it to know to do it twice
local ref_glass_calc = SMODS.Centers.m_glass.calculate
SMODS.Enhancement:take_ownership('glass', {
calculate = function(self, card, context)
local ret, post = ref_glass_calc(self, card, context)
if context.destroy_card and context.cardarea == G.play and context.destroy_card == card
and not context.destroy_card.glass_trigger then
local shatter_mes = SMODS.find_card('c_fnwk_iron_shatter')
local valid = false
for _, v in ipairs(shatter_mes) do
if not v.debuff then
valid = true
break
end
end
if valid and SMODS.pseudorandom_probability(card, 'glass', 1, card.ability.extra) then
card.glass_trigger = true
ret = ret or {}
ret.remove = true
end
end
return ret, post
end,
}, true)``
I mean my main problem is that I want to share vids on disc and as I don't have nitro size fk me
and even still, this occurs well after retriggers are added. ugh
you could be mega jank and move where the calculation for destruction of the glass card is done to be before your context
ooughghgh yeah mega jank
should retrigger all sevens
mainly cuz 7s kinda suck in general lol
I'm not sure though really, in simple terms, you're trying to influence a prior step of the game, which obviously isn't very easy
also thank you for telling me about this i now have it working
But if there's some way to rerun scoring this late, I'll try that
hmmm main_scoring context with eval_card? Cause I don't want it to do any more repetitions---this is supposed to be basically a "fake" repetition done by this card only
that might work
in many ways bad and evil
i looked at the code for buskin and hack
and it seems like the same so i'm not sure what i did wrong
that seems like it would run whenever a glass card is destroyed though, not just when it breaks from being played, right?
lmao all sixes after that round its like fate itself...
uhh I could use the glass_trigger variable that doesn't seem to be used elsewhere
https://github.com/nh6574/VanillaRemade/blob/1618a7660d84a41efa2275e78b79a66e666400c8/src/jokers.lua#L878C1-L878C6
https://github.com/nh6574/VanillaRemade/blob/1618a7660d84a41efa2275e78b79a66e666400c8/src/jokers.lua#L3281C4-L3281C5
yeah thatshould work
maybe it works differently since its a new joker?
you aren't returning the repetitions
Seemingly still does nothing
Im more just curious why
oh OH
guys, what is the identifier in the new probabilty code? just another random seed or something else?
and i must replace "card" by my joker key?
oh it might be because you're using the removed context, I don't remember how the stacking works with them actually being deleted
It does run through the code at least yeah
the identifier is just a string that lets you know that that check is from your joker, I tend to use "modprefix_jokername". Card almost certainly remains as card
What is the function to set rental to a joker?
okay thank you!
bump
Specifically it's a custom context added here to run for each destroyed card individually
or is it card.ability.rental = true?
the two things left until its done is the art and seeing if i can make something else then having a lowercase active
SMODS.Stickers.rental:apply(card, true)
im still confused on how to take ownership of an atlas, nothing seems to be working :p
And for perishables can I modify the rounds left?
What do you mean?
Perishable jokers debuff after 5 rounds
can I modify the rounds left for a certain joker?
Have you tried overwriting the atlas?
Yes.
how do you mean? just making an atlas with the same name as the one im trying to replace?
How can I do it?
you can also do card:add_sticker('rental', true)
how do blinds fetch hand score?
Change card.ability.perish_tally
G.GAME.chips?
why is dt 0 in my update function for my joker?
anyone know i could change a joker's price based on the sticker they have, similar to rental?
to my knowledge rental's hardcoded so idk how do do it myself
Hook Card:set_cost()
hand_chips*mult?
main thing is i want the sell value to always be $0, even disregarding effects from other jokers like giftcard
yeah let's do that
i thought there was like another way
but yeah let's do that
Yes, you would hook it and set self.sell_cost = 0 after the old function runs.
this doesnt seem to be working
And the label I think.
Yes, you need to do raw_key = true
how can i prevent legendaries and duplicates from spawning in packs?
create_card = function(self, card, i)
local key = pseudorandom_element(G.P_CENTER_POOLS.Shape, 'booster_SGeo').key
return { area = G.pack_cards, skip_materialize = true, soulable = false, key_append = "btct_ShapePack", key = key }
end,
how do i fetch the hand debuffing in a calculate function
context.debuffed_hand? or what do you mean
Code?
SMODS.Atlas {
key = "Tarot",
raw_key = true,
px = 71,
py = 95,
path = "Tarots.png"
}
im trying to trigger the "not allowed!" from blinds inside a calculate context though i don't know if that's possible (since blinds take debuff = { argument = 'value' }})
actually do tables take higher than
out of nowhere this code has started crashing in the collection?
no they dont
G.GAME does not exist outside a run in the collection
it wasnt crashing before tho
were u in a run in the collection menu before
no
context.debuff_hand then
check the blinds in vanillaremade, their contexts work for jokers
well i know how to stop it crashing i was just confused lol
G.playing cards also does not exist outside a run
Is there a way to make a game over when a condition is met?
find the code that causes a game over and add your condition to the if condition
G.STATE = G.STATES.GAME_OVER
G.STATE_COMPLETE = false
im not making a joker sorry i poorly worded it
or that
Bump
oh then check the blinds in vremade anyway
they use the context
okay got it
@daring fern
okay would this work (effect is Score must be positive for Sine in radians)
is there a context thats basically just "is playing the game"
yeah
No, because you can't calculate the score before scoring.
Like constant updating?
debuff_hand is before scoring sadly
ohhhh...
also it doesnt happen at the same time as press_play
well i guess the elegance is lost in this one then
yeah changed it to final_scoring_step
no
What is that name 😭
this is a case for mods right cause this shit aint allowed
<@&1133519078540185692>
oh wow ok
That is a name of all time
mods, strike this user down where they stand
top 10 discord usernames of all time?
<@&1133519078540185692> !
shut the fuck up pal
<@&1133519078540185692>
Why are we pinging mods multiple times
One suffices
They'll get there when they get here
this is the longest I've ever seen them take 😮
oh my god
is there any way to modify the tooltip that appears using info_queue?
Ive seen them take up to a few minutes, it happens sometimes D:
I've only seen them one time and it took them like 2 secs
Truly one of the names of all time
there we go
There he is
Yay
thanks mods
Def one of the names.
that was a name
they have been banished
ty mods
Thanks mods you each get a cookie
Sorry I was in the shower okay mods are people AND we shower
Thank you mods
Proof?
mods taking that long actually gave me enough time to report the account
thanks mods
did you have an answer or not hehe sozzers
Doubt
They do?
Proof that mods are people, not in the shower
ok pal
Youre all secretly monsters i know it
im going to take it from the 🤔 reaction you have no clue how to solve this
N you are #1 mod pinger, I reckon
🫡
im in here too much
I got this guy games so he wouldn't be in here and he wont even play em
N’ helps so much even in pinging mods
He's so dedicate
LLMs shower too man
@grok is this true
grok would have allowed that name
HAHAHAHA
llms do shower, but specifically not grok
i was watching tiktok i got a lecture in a hour but i dont want to get up 😭
It's always N'
Oh yeah. This a good ping
i was doing maths until 2am :( again
I got the ping 5 minutes after it was sent
o7
This but it's N'
i shout like them
nobody ever makes memes of me
Mod-ding dev chat
Someone help me out and Photoshop this please B
as far as I know I guess
I'm on my way to king gizzard
card.children.floating_sprite = Sprite(card.T.x, card.T.y, card.T.w, card.T.h, G.ASSET_ATLAS['maxboism_CustomEnhancements'], { x = 0, y = 0 })
card.children.floating_sprite.states.hover.can = false
card.children.floating_sprite.states.click.can = false
card.children.floating_sprite.states.drag.can = false
card.children.floating_sprite.states.collide.can = false
card.children.floating_sprite:set_role({major = card, role_type = 'Glued', draw_major = card})
card.draw_bypass = {floating_sprite = true}
end```
i feel like im almost getting set sprites, but i still cant get it to show up
wait hold up why are there mods here what happened
Something happened
it’s mod chat dog
Praising @red flower
weird question since I was doing some testing with a buddy, does spawning in a joker via debugplus not prevent it from also showing up in the shop? I assume its just from that since the shop stuff should be handled by the game itself.
i got told there was a free cookie
fair enough
Mods in mod chat? Fork found in kitchen
thats correct, it doesnt set the flag
Is there a way to keep a variable saved for the next time the calculate gets used or does it always reset to the base value I've set?
The mod ping went through late on my end and happened to show up while everyone’s talking
you need to save it to the card's ability table
excuses
a local will reset
chat, is there a context for being in a run
How do I do that?
Anyone have an example of a joker that levels up multiple hands?
no, but G.STAGE == G.STAGES.RUN does the trick
Is there a way to detect if you're playing with a specific deck?
card.ability.extra.variable = value
config { = extra = { variable = 0 } }
card.ability.extra.variable = 0
G.GAME.selected_back.config.center.key == "b_key" iirc
Does that work in Stickers too?
uhhh probably
I think it's effect.center.key for decks.
I PROMISE IT SHOWED UP LATE AGAIN
return {
level_up = true,
level_up_hand = "High Card",
extra = {
level_up = true,
level_up_hand = "Pair",
}
}
etc
I didn’t get that ping until just now
if anyone can help me figure out how to replace a vanilla atlas without using malverk they get a cameo joker in rascal
im desperate
i just wanna replace the texture of the atlas, taking ownership wont work idk why
why don't you want to use malverk 💔
G.ASSET_ATLAS[key] = reference_to_atlas should suffice probably maybe
lmk if thats secretly super janky
because i dont want a dependency for something that seems like it should be simple to do without
reference_to_atlas being something like
local my_atlas = SMODS.Atlas{...
id use malverk if this was like a fun optional thing but the updates to planet cards in my mod are gonna make the textures completely inaccurate in showing poker hands so id like that updated
i will try it
you can always take ownership of each card one by one and change the atlas there
i mean like. rascal is held together with shoelaces and dreams
i think something that isnt best practise will be fine
lol
rascal removes the entire concept of poker hands so im changing the planet card textures to show suits instead
what
the game is no longer crashing but raaah i cant see am i just doing the entire thing incorrectly?? i literally copied another mods method but tweaked it 😭
honestly fire
didsnt worked
damn
wait hang on i forgot to remove the raw_key property
lemme try that
unlikely to change much but who knows
yeah still no
WAIT IM DUM
i put Tarots instead of Tarot
What are the things that I definetly need to define in SMODS.Sticker?
key, and loc_txt or a localization entry.
still stioll didnts works
gonna try combining both previous attempts
hey fun fact the documentation answers that :) https://github.com/Steamodded/smods/wiki/SMODS.Sticker
blegh
its weired because like. G.ASSET_ATLAS["Tarot"] is the atlas i want it to be. but its just not. showing up?
oh you want planets, right?
yeah
do Planet instead of Tarot
theyre on the same atlas though ??
ok sure i trust you
you literally made The Texture Mod
Realized that too
well thats dumb
I don't know why we make planets and spectrals use these atlases
its beautiful
Looks nice :O
What's the best way to test if my sticker works?
I don't understand how should_apply(self, card, center, area, bypass_roll) -> bool, apply(self, card, val) & draw(self, card, layer) work or what they do TwT
ok i dont think overriding the front was a good idea
should_apply is a boolean (truthy or falsy value is returned) that determines if the sticker should be applied on something
apply actually applies the sticker
draw draws the sticker
And how do I use them?
apply and draw can generally be omitted
most stickers should just work as is out of the box without worrying about any of these
except for should_apply
which directly determines if the sticker is applicable
should_apply = function(self, card, center, area, bypass)
if area == G.shop_jokers then
return true
end
return false
end
this would mean that the sticker will always be applied if the card is on the shop for example
note ALWAYS
Okay, so what do I do to make it work on only jokers?
clearly im doing some janky hack, is there a way to for me to get the same effect as here without replacing card.children.front? becausei want the rank and suit to still be visible (it should still overlay over the entire card)
stickers should only work on jokers by default anyway
use a custom drawstep
what are you trying to do?
Oh, so I don't need to declare that somehow?
Sounds like something I came across when I was making an enhancement to no longer count its' own rank.
How could one make a cards sprite a combination of other sprites, like half one sprite, and half the other?
i want to make an enhancement that overlays a sprite over the card (that is transparent), but still shows the rank and suit
noted, ill look into that
what do you think so far
Got an error while I was testing...
key = "death",
config = { extra = { roundsTillDeath = 3, roundsWithSticker = 0 } },
badge_colour = HEX '000000',
pos = { x = 0, y = 0 },
default_compat = true,
rate = 1.0,
atlas = "death",
unlocked = true,
discovered = true,
should_apply = function(self, card, center, area, bypass)
if area == G.shop_jokers then
return true
end
return false
end,
calculate = function (self, card, context)
if context.end_of_round and not context.repetition and not context.individual then
card.ability.extra.roundsWithSticker = card.ability.extra.roundsWithSticker + 1
print(card.ability.extra.roundsWithSticker)
end
end
}```
Looks really good :D
you need an apply function to set your values
I don't know why they aren't automatically done tbh
I will try and remember to fix that
is there a way to make a joker reroll the boss blind?
Yes.
Instead of config?
what is it?
no, as well as config
G.FUNCS.reroll_boss()
So I just write it again into apply?
that function is formatted awfully too
it is late and I should go to sleep, but this is not cursed, right?
Is this duplicating an ability config’s values into the ability config???
shouldn't it use copy_table or something, i feel like this will break with table values
wtf why is apply used to add and remove stickers
Lmao
it probably should, yeah
looks like it spends a dollar everytime it rerolls, is there a way to do it without spending money?
I don't get what I need to write into apply
Okay
there, download latest smods and you don't need an apply function
or wait a couple of days for a new release
v is a card not a number
oh shit how do i fetch the number then
number of what? the size of the hand?
rank
v:get_id() <= 5
and you would probably need v:get_id() >= 2 too
How can i make a certain card selectable in hand (like the player can select as many as these as they want but not other cards that don't meet those specifics)?
I did and I still get that same error
Bump
why are you using psuedorandom_element instead of using set?
how do i check a card's modifiers(if it has an enhancement, an edition, a seal or extra chips/mult)?
if next(SMODS.get_enhancements(card)) or card.edition or card:get_seal() or (card:get_chip_bonus() > card.base.nominal) or (card:get_chip_mult() > 0)
thanks somethingcom515!
btw, what does SMODS.get_enhancements(card) return when a card has no enhancement?
A table with keys of enhancements that the card has... or does not.
An empty table.
question - if i wanted to process a string like "{s:0.8,C:red}test text" into localised text the same way the game does, how can i do that?
is this for UI, or
u want to use loc_parse_string first, then use SMODS.localize_box me think
Slr
Idk, somethingcom gave me code so i just used it
what do you think of this?
looks clean
try set = "Shape" instead of key
and this is one reason why i draw in 1x first.
SMODS.DrawStep {
key = 'sand_overlay',
order = 75,
func = function(self, layer)
if SMODS.has_enhancement(self, 'm_maxboism_sand') then
self.children.sand_overlay = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS['maxboism_CustomEnhancements'], { x = 0, y = 0 })
self.children.sand_overlay.states.hover = self.states.hover
self.children.sand_overlay.states.click = self.states.click
self.children.sand_overlay.states.drag = self.states.drag
self.children.sand_overlay.states.collide.can = false
self.children.sand_overlay.role.draw_major = self
self.children.sand_overlay:draw(self, layer)
end
end,
conditions = { vortex = false, facing = 'front' },
}
im not doing them correctly, im crashing because of the draw but if i dont have the draw it wont render raah
do you think this is good like am i ready to set up the atlas and finish up before pulling it to main
did i cook
i can try odd todd real quick to see since someone said it should retrigger all jokers and vampire too
Ok ill try, the main problem tho is legendaries still spawning how do i prevent that?
i think you need to set the rarities in your objecttype but i dont know how exactly
i am thinking on letting it be blueprint/brainstorm compatable but should it only retrigger if its a lucky card?
all i can think of apply a simple lighting similar to oops
Mmmm i see, thanks tho
hmm
someone told me the myth cards from prism and the myth cards in my mod were shown together in the same spots in the collection menu
Would i have to rename my consumable type to something else to prevent this or is there another way?
I don't think ConsumableType gets automatically prefixed with the modprefix
ah so i will have to prefix my consumable type myself then
the localization file is gonna look so dumb 💀
hmm
I think another thematic word that could describe the set is "Artifact"
what do you think
Im trying to get the rank of the first held in hand card before the hand start to score
okay last balancing thing: should the lucky seven only trigger lucky or all sevens
SMODS.merge_effects({ret1 or {}, ret2 or {}}) where ret1 and ret2 are two calculation returns
you can add as many as you want
that was just an example
I have this, but for some reason printing it up doesn't grab the message nor the rest of the last stuff
maybe i'm doing something wrong?
that table needs to be inside another table
damn i think im doing something wrong with my Drawstep because my :draw(self, layer) is giving a crash related to setcolor arugment being nil
it takes tables of return tables
and i have no clue why, all the examples I see use draw
oh i remember why its set to key, its cause stickers wont show up on higher difficulty
Oh, ill try hold on
hmm no idea, that sounds like something that create_card should maybe be able to handle
i can look into it tomorrow to PR it to smods
what's results here
This is the setup, i'm trying to force activation on both jokers
No message nor effect gets applied to the joker (leaf)
I think you need to pass results.jokers
i mean the variable
can you send what the print gives with results.jokers and results1.jokers
in merge_effects
sure
yo do i have to mess with custom ui to be able to dynamically change the amount of text on a card
I want to make a spectral card give all cards eternal, but if you currently own a joker that is incompatible with eternal, i want the card to additionally say that it destroys all jokers incompatible with eternal
you can have 2 different descriptions in a localization file and switch between them using key in loc_vars
or look at invisible joker for the ui method
Both return a card and mult_mod = 4
why is there jokers in the extra table
Lemme send you the code
is this some cryptid jank
Yeah
it says cryptid.forcetrigger smh
Tbh i'm just making a bunch of random stuff to test how does the enviroment works
no i mean i know this is cryptid, i just dont know if the jank comes from cryptid
SMODS.Joker {
calculate = function(self, card, context)
if context.joker_main and not context.blueprint then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
if Cryptid.demicolonGetTriggerable(G.jokers.cards[i + 1])[1] then
local results = Cryptid.forcetrigger(G.jokers.cards[i + 1], context)
local resultsl = Cryptid.forcetrigger(G.jokers.cards[i - 1], context)
if (results or resultsl) and (results.jokers or resultsl.jokers) then
local merged_effect = SMODS.merge_effects(
{ results or {} },
{ resultsl or {} },
{
{
message = "SPIN!",
colour = G.C.RARITY.cry_epic,
sound = "testplora_smb3-tail",
}
}
)
print("\n"..dumpster(results,1).."\n^^^^results^^^^")
print("\n"..dumpster(resultsl,1).."\n^^^^resultsL^^^^")
return merged_effect
end
return {
message = "tf is this",
colour = G.C.RARITY.cry_epic,
sound = "testplora_smb3-tail",
}
end
end
end
end
end,
}
if i want to use the loc_vars and key method, i would do something like
loc_vars = function(self, info_queue, card)
local k = "normal"
if has_incompatible_joker() then -- pretend this exists
k = "destroy"
end
return {key = k}
end
right?
then how would i format it in a localization file?
tbh this is straight stolen from demicolon joker, i'm just trying to see if i can make it work
I meant this
local merged_effect = SMODS.merge_effects(
{ results.jokers or {} },
{ resultsl.jokers or {} },
{
{
message = "SPIN!",
colour = G.C.RARITY.cry_epic,
sound = "testplora_smb3-tail",
}
}
)
I would just do return {key = has_incompatible_joker() and "j_modprefix_key_2" or nil} and then you add an entry for j_modprefix_key_2 that's the same as the original but with the extra line
alr seems fair enough
np
How do I get the amount of card held in hand like I tried .length and .count and those doesnt work
#G.hand.cards
oh yeah
scaled the seven
also
bit of a long shot but do any of you guys happen to know how to access the gpu of a steam deck? i dont have a steam deck so i have no idea how to even look at it to see what its gpu is
my gpu joker dont work for steamdeck so trying to figure that out
is it able to work on linux pcs?
It's lua, I was thinking about C#
as far as i know yea, im gonna be having a friend of mine retest it
i can retest it for you since im on linux but i don't have a steam deck
i do have a 3ds and vita and stuff but not a deck unfortunately
hi smt i see u thinkin
I am learning to many language at the same time 😭
i have a love hate relationship with c#
same
I hate it because of school I think
i think i honestly much prefer it. it fits well with the other jokers
finally the final test
it is fair to say it is completed
how do i use pseudorandom_probability?
Bro, this thing is Broken as hell with the correct cards (super leaf) XD
I'm glad it works now
I cant even tell what is visually happening
what is going on with the zigzag
Super leaf forces the triggering of the joker at its side, so its triggering joker and the M card
1 in 4 of spawning unusual jolly jokers
cryptid, that's the "jolly" edition (the edition gives +8 mult and makes the joker count as Jolly Joker for the purposes of any other joker that synergizes with them. cryptid has a lot of those synergies because of an inside joke)
anyone know how you'd go about making a joker with "debuffed cards always score (splash) and give x2 mult"? context.modify_scoring_hand and context.other_card.debuff don't seem to work, on account of the card being debuffed
Card:can_calculate hook?
hmm, maybe
Or patch, as this is a small one with a clear target.
function Card:can_calculate(ignore_debuff, ignore_sliced)
local is_available = (not self.debuff or ignore_debuff) and (not self.getting_sliced or ignore_sliced)
-- TARGET : Add extra conditions here
return is_available
end
this is my code to try to select a random joker, then retrigger said random joker. It has no problem selecting the joker, but dosent retrigger it
im trying to use this to retrigger the joker
i would use debugplus to check that the other joker is in fact getting stored in card.joker as intended, because that seems unusual
oh that's what the print is for i guess?
it is, because it prints the selected joker and it prints the information of it fine
the problem is that I dont know what the problem is

okay, my next thought would be to put a print inside the if context.retrigger_joker_check ... block to see whether the problem is that this block isn't being reached or that this return doesn't work
that is very good
i printed a message in the context retrigger block and its not printing so
Try: ```lua
if context.press_play and next(G.jokers.cards) then
card.joker = pseudorandom_element(G.jokers.cards, 'seed').sort_id
end
if context.after then
card.joker = nil
end
if context.retrigger_joker_check and card.joker and context.other_card.sort_id == card.joker then
return {repetitions = 1}
end
ok, so i've worked out that loc_parse_string will break the string up into individual parts of the line and the modifiers that should apply to those parts, but i don't know how to use SMODS.localize_box with that 
is it safe in the long run to delete these kind of branches
i believe this is formatted properly but tell me if its not
It looks fine.
i think since you're already storing .sort_id in the first block, you want to compare to card.joker in the last block
i believe context.after happens. after. context.retrigger_joker_check so that shouldn't be the issue?
Try again, I fixed it.
can i print the joker that was picked then make it nil
well, it's only storing the sort_id and not the whole joker
but you can certainly print that before clearing it
Yes.
elaborate, would i need to store more then the sort_id to retrigger it
No.
the sort_id is only being used to check whether you've got the right joker
but i dont think its reaching the retrigger context at all
what does the if check in the final block currently look like?
Do you have retriggers enabled?
card.joker is currently storing exactly the target joker's sort_id
Yes, I fixed that, use the new code.
so you want context.other_card.sort_id == card.joker
how would i know?
did you actively enable the optional feature of joker retriggers in your mod
if you didn't, the answer is no
no. How would i do that
SMODS.current_mod.optional_features = function()
return {
retrigger_joker = true,
}
end
in the main script or deck script
main im guessing
main script
this is for the whole mod
No, outside of anything.
for me it's line 12 of the main file
after only some other very basic initialization
i have it in line 10 of main.lua
before anything even loads
i think as long as it gets set somewhere in your mod files, it's fine
but earlier is easier to keep track of
it crashed
normally i can kinda make since of crash logs but this one just looks like gibberish
INFO - [G] 2025-08-06 22:03:41 :: ERROR :: StackTrace :: Oops! The game crashed
main.lua:1925: [SMODS construction-deck-mod "./data/decks/construction.lua:21: attempt to index field 'joker' (a number value)
you're trying to get sort_id.sort_id in the final if check
don't do that
really confused on how to use localize_box
any idea why the use function of this card is throwing this error?
right now i just care about it creating a negative copy of the selected joker
so just get rid of the part that says sort_id
Yes, G.jokers.highlighted is a table of jokers.
has anyone here developed w the partners mod
yes
in that one specific spot only, to be clear
like this
nope
can i hook into this to mess with their trigger order?
you want context.other_card.sort_id == card.joker
anyone know how to make a partner?
Yes.
context.other_card.sort_id is a sort_id
card.joker is also a sort_id
you want to compare apples to apples
h o w
you haven't indexed the highlighted table. you're just trying to copy the whole table.
also, you can only ever select one joker, so you don't need to iterate through G.jokers.highlighted, you can just check if it exists and has a length of one, then copy G.jokers.highlighted[1]
No, you would have to patch for that probably.
yes well i would like it to be potentially increased by other mods
Yes.
ok
i see
can anyone teach me how to make a partner?
i heard from aiko they were made like jokers
Try looking at other mods that do it.
i ask myself that question every day
which one should i patch
it does retrigger the same joker every time though
What do you mean?
Try looking at TOGAPack because that mod has a deck that reverses trigger order.
i currently have 3 jokers, the chip one for flushes, the mult one for flushes, and the chip one for pairs. I made sure that the 3 hands i played had both a flush and a pair. it retriggered the flush chip one 3 times in the 3 hands i played
actually nevermind i was unlucky
i played another hand and it chose the pair one
tysm both of you
but also it crashed
I cant find a crash log in this log.
how do i info key jokers?
What do you mean?
Question that may be really hard to answer quickly: how could I make a new menu pop up after selecting the deck and stake?
(If not possible as of rn then just adding a button that makes the same menu pop up to the start screen should suffice)
mb i worded that horribly
i want to put on the side of a jokers description what another joker does
does the retrigger feature already check if the joker is able to be retriggered? or should i check if the joker is blueprint compatible
info_queue[#info_queue+1] = G.P_CENTERS[joker key]
in your loc_vars
info_queue[#info_queue+1] = G.P_CENTERS.j_modprefix_key in loc_vars
No, it just retriggers a random joker.
All jokers are able to be retriggered.
Some jokers don't do things that are retriggerable though.
I think i will add the check
also what is the variable for the number of jokers the player has
#G.jokers.cards i believe
ok thanks i was just wondering how to add the joker key thanks
how would i write a check to see if the joker number is greater then 0 because the one i wrote crashes
if context.press_play and next(G.jokers.cards) then
you're short an end there, i believe
how do i check if [i] is a joker?
I need to make a consumable that lets me choose a card from the collection and emplaces it in the shop at full price
if [i].ability.set == 'Joker'
thanks
I should probably copy the code of open to lan
How do I make blind debuff consumables
In set_blind, iterate over held consumables and debuff.
for k, v in pairs(G.consumeables.cards) do
SMODS.debuff_card(v, true, self.key)
end
underweardetection = 0
for i = 1, #G.jokers.cards do
if [i].ability.set == 'j_btct_Underwear' then
underweardetection = underweardetection + 1
end
end
what did i do wrong? its just red
G.jokers.cards[i]
does anyone here call jokers "jonklers" or is it just me
Also you should be using SMODS.find_card
if context.check_enhancement and context.no_blueprint and context.other_card and context.other_card:is_face() and context.cardarea == G.jokers then
return { m_stone = true }
end
seems to be crashing me...
oh i see thanks
Yes, you can't use Card:is_face() in context.check_enhancement
How does open to lan work?
-# There goes the intended shtick for a Joker--
how can i destroy a specific joker? would i go through the joker table and check if joker is the specific joker?
Yes, but you can do if SMODS.Ranks[context.other_card.base.value].face
@red flower any way to make your modded jokers to work with your display mod?
That wouldn't let Pareidolia influence it...
I need help with understanding the spectral card of yahimod that is “open to lan”
like you want to make your own or how to use it?
It’s a card that lets you spawn a card of your choice
yeah i seen the video and played the mod myself, i like yahi's stuff
But the way it does it is different from pointer
How do I debuff a certain tarot card
Instead of taking you directly to the collection, you have to go there and press enter on your chosen card.
oops.
Classic
Yes, but you could check for that.
I’m trying to make a similar card called Wishlist but instead of directly getting it, you have to buy it at the shop full price (doubles price with every use), and it sets your money to zero.
hm.
honestly i think wishlist would be more like
look at the code for the uncommon/rare tags
they put jokers in the shop for a set price (free)
you have a higher chance to get it but you have to buy it full price even with vouchers
Yes, that’s the idea
bump
And when you get it, it never shows up in the shop again
yeah
ok thanks
Useful for blacklisting common jokers from the shop.
What do you think is the best upper limit of the price?
I think it’s 1 billion.
Ok I still need to make it work somehow.
Even if it’s unbalanced.
...well, this 'lads happy.
Yummy
Just... not sure how to work around the rank and suit not being rendered because a card is considered as Stone too.
ali
have you ever made code for a consumable that works like pointer or open to lan?
I've not gone that far, no.
damn
How do I debuff certain tarot cards
ali have you ever bought splash from your shop
Why is this activating on the cards held in hand at the end of the round? This is only supposed to activate on the joker itself
how can i make a wishlist mechanical card if i can't make it spawn any card from the collection of my choice? that's like the whole point of wishlist.
I have, yes. Helpful against Joystick.
how do i get the current number of hands
i'm making a joker that retriggers every joker for every 5 dollars you own, what did i do wrong?
Wrap the result in to_number.
G.GAME.current_round.hands_left
thnk you!!!
Note on to_number and to_big related checks: these are talisman related and will not exist when talisman is nonexistent
thank you!
add dummy functions for them so it doesnt crash without talisman
to_number = to_number or function(a) return a end
to_big = to_big or function(a) return a end
can we just abolish talisman already. thx
we need our score cap removal
i outright do not support it and never plan to
good
i feel like nowadays you dont have much choice but to support talisman
haya
my mod is supposed to be balanced for 8 antes, there is no reason to even think about supporting it
do you not just have this kinda utility function lying around for no reason
what
Adjusted hook somewhat...
hehehe != support is very funny to me
mostly because its what lua should use anyway but they decided not to for no goddamned reason
(as in !=)
what does no id was provided mean
ofc
This code is supposed to add the hand name to a table if it's not already in the table. Why is it allowing repeats?
table.insert inserts a value, not a key (it auto-sets the key to a number, starting at 1 and increasing normally). but your condition treats the scoring name as a key, not a value
How do I get the name of a played hand?
context.scoring_name in pretty much any context as long as the context is during a hand scoring (e.g. context.before, context.individual, etc)
whats the line for destroying a specific joker in the joker table?
sorry that i didnt do the dreamcast one as i tried several times and couldn't get the perspective down
i should probably color it lime like i promised
i still don't know how to code in the main function of the card though.
if anyone does want to give making it a vmu i genuinely would appreciate it
question:
does the 'Joker' rarity pool update with modded rarities or you must create a new pool?
question
Why is this not spawning a black hole with blueprint?
if #card.ability.extra.hands... etc is the only condition for the card spawn event, and I'm testing it with both consumable slots free
I think I've got a skeleton of this joker, but I'd like to upgrade any unplayed hands (currently it upgrades played hands), and it also adds played hands to the table multiple times, so they get levelled up multiple times (maybe not an issue once it upgrades unplayed hands). There's also the issue of numbers being left over from the level up animation (not a big deal, they get erased when another hand is selected).
calculate = function(self, card, context)
if context.before and context.main_eval and not context.blueprint then
card.ability.extra.scored_hands[#card.ability.extra.scored_hands+1] = context.scoring_name
end
if context.end_of_round and context.game_over == false and context.main_eval and card.ability.extra.scored_hands and not context.blueprint then
for i = 1, #card.ability.extra.scored_hands do
level_up_hand(card, card.ability.extra.scored_hands[i])
end
card.ability.extra.scored_hands = {}
end
end
I actually had the time to make this 😭
this is a mechanical card that lets you put any card into the shop and buy it
is there a defined context or piece of code for seals triggering?
hey I have a challenge that I only want to use 1 joker in (one you get at the beggining) but when I go into the shop I can still buy other Jokers how do I fix this?
The main idea is that this pulls out the collection and if you click on a card, it places it into the voucher slots at full price.
It disappears when you don’t buy it and leave the shop.
The card only works when you’re in the shop.
I guees you can set G.GAME.joker_rate = 0
Ok first off, I need to make the card pull out the collection.
What do I do to make that?
Is it possible to animate soul?
would you just put that in SMODS.Challenge?
Oh
You can place custom = {{ id = 'no_shop_jokers' },} inside of your rules
How do I make a custom deck start with a Joker?
Spawn it with an event
Also you should add other restrictions
thanks
how do you info_queue a sticker? they're not in G.P_CENTERS and none of the obvious alternatives i could find worked
What do you mean?
Have you tried SMODS.Stickers.modprefix_key?
yep, didn't work
info_queue[#1116390750314307698_queue + 1] = { key = "<sticker>", set = "Other" }
what does this mean?
G.FUNCS.overlay_menu({ definition = create_UIBox_your_collection() })
Also, this method requires localization files
That function will create the collection UI
very new to modding, how would I make a joker that gains X1 mult everytime a hermit card is used?
do i have to manually code in the definition?
So apparently eternal = true doesn't work to make a Joker spawn in as Eternal. Anyone know how to do that?
if context.using_consumeable and context.consumeable.config.center.key == 'c_hermit' then
card.ability.extra.xmult = (card.ability.extra.xmult or 1) + 1
end
if context.joker_main then return { xmult = card.ability.extra.xmult } end
Is it possible to animate soul?
thanks!
just tried this thank it it works
SMODS.add_card({ key = "j_prefix_key", stickers = { "eternal" } })
Like not the background but the front soul instead
instead of eternal = true (boolean), do stickers = { "eternal" } (table of keys)
card.children.floating_sprite:set_sprite_pos({x = 0, y = 0}) -- change x and y values accordingly.
Okay, i've got this idea for a joker but i have no idea what to even start researching for
Basically, when you play a hand, a random card from your deck is also played, and should count in the hand (i.e. if you play a flush of AKQJ7 and play a 10 as well it counts as a straight flush).
What do I even go looking for in smods or lovely dumps?
Yes.
what should I use to edit my code? (i'm on mac btw)
vscode, probably
...well, the drawing part before the final scoring poker hand is determined is already something I've been doing with Notification enhancement and Solitaire Joker.
im not aware of a better program. Although Kate is pretty good, if there's a mac version
Like, add their functions and everything?
Oh dayum ok, how would i put that in this (if this was a joker for example)?
--EvilDeckAnimation
local btct = {ticks = (5)}
local upd = Game.update
local btct_DEvil_dt = 0
function Game:update(dt)
upd(self, dt)
local DEvilobj = G.P_CENTERS.b_btct_DEvil
btct_DEvil_dt = btct_DEvil_dt + dt
if DEvilobj and btct_DEvil_dt > 0.1 then
btct_DEvil_dt = btct_DEvil_dt - 0.1
if DEvilobj.pos.x > 28 then
DEvilobj.pos.x = 0
else
DEvilobj.pos.x = DEvilobj.pos.x + 1
end
end
for k, v in pairs(G.I.CARD) do
if v.children.back and v.children.back.atlas == G.ASSET_ATLAS["btct_DEvilAtlas"] then
v.children.back:set_sprite_pos(G.P_CENTERS.b_btct_DEvil.pos or G.P_CENTERS["b_red"].pos)
end
end
end
context.modify_scoring_hand is relevant to your interests
https://kate-editor.org/get-it/ Kate is pretty good, although the setup for the LUA lsp does suck.
https://code.visualstudio.com/download vscode is what probably a majority of people who mod balatro use, because its free and easy
if you're gonna use vscode use vscodium
https://vscodium.com/
I have one that has a steady animation of the card itself... you could adapt this to be on the soul instead.
it helps to read things 👍
I think i figured it out but i wont be sure till tomorrow cause i cant test rn, thanks for the advice and help!
is there a way to instantly fail a run
aikoyori, a couple others. we were chatting about it in modding-chat
Cryptid
the real question is
where did he get the cup of tea
is there any mod that adds achievements whose creator is also okay with x person taking the whole system
and putting it in their mod
answer: he's the doctor, just accept it
because otherwise the rules prevent you from ripping an achivement system from another mod
what rules
got it
5th rule
https://github.com/Steamodded/smods/wiki/SMODS.Achievement this is already a thing, for the record
though i don't know how much it actually, like, does, in terms of Achieving
the little trophy on the side at least, i imagine
But if i just get inspiration of a code and do it my way without copying anything, do i just credit them for the idea? Or do i still have to follow rule 5?
pov: entire smods wiki
it doesn
it doesn't seem tooo bad
lemme see if i can get it to work
i might check out Cryptid for achievements
if the key for the achievement was test would it be
"misc" = {
"achievement_names" = {
"test" = {
"Name" = "test"
}
}
}
or
"misc" = {
"achievement_names_test" = {
"Name" = "test"
}
}
in localization?
Probably ```
misc = {
achievement_names = {
test = "Name"
}
}
I’d have to check the code though
is there any documentation for this, do you know, lol
uhhhhhhhhhh probably somewhere, but i can't navigate the smods wiki at all so i literally just search code for stuff
but for an example here's how i use that context for one of my jokers
--Force flipped and debuffed cards into play
if context.modify_scoring_hand and not context.blueprint and context.other_card and (context.other_card.debuff or context.other_card.facing == "back") then
return {
add_to_hand = true,
}
end
you'd want to enable the optional feature to use the deck as a scoring area, pick a card at random, and do that when your randomly-selected card is context.other_card
Hi, i was just wondering, has anyone made like a chart or something explaining code terms? Im kinda new in programming, but i dont know wth does G.C. or "for [i] = 1 ~=10" means 
consider doing a programming beginner course and looking at the lua manual https://www.lua.org/manual/5.1/
Thanks bro
How do I make joker unlock upon obtaining a specific consumable?
I mean, this is obviously a lovely patch, but what do I have to modify?
Alright thx 
Okay, here's where I'm at:
calculate = function(self, card, context)
if context.modify_scoring_hand and not context.blueprint then
local c = pseudorandom_element(G.deck.cards, "mystery_play")
if context.other_card and context.other_card == c then
return {
add_to_hand = true,
message = localize("k_mystery")
}
end
end
end```
I doesn't work :(
I know its never entering the second `if` block and i have no idea why. I could instead get like, `sort_id`?
Diagram for wishlist
how can I get error messages while writing the code instead of having to run the mod?
The only thing an editor can do is tell you if you screwed up syntax or, occaisionally, what type something should be, since lua is an interpreted language
basically it means theres literally no way to test stuff without running it fully
@mystic river do you notice any glaring issues with this? besides renaming my local variable to not be "card"
(already fixed that bit, lol)
oh, i also fixed G.deck to include .cards
it's rerolling the card every time it calculates, which is approximately several dozen times per action
you want to store the result somewhere more permanent than that and only reroll when you need to
not sure
you could do science and find out though
that is true
Before before.
oh, yeah hm
Well, then the question becomes how do i choose a card in advance of seemingly the most advance thing
well, hm
Doing some stuff, Ima dump some screenshots of the mod I'm making
Its an addon inspired by the almanac
ic.....
Found it in a random wiki page
lmao
if context.modify_scoring_hand and not card.ability.target then card.ability.target = pseudorandom_element(etc etc I'm typing on a phone and don't have things memorized)
wait, wouldn't other_card never go to G.deck? its just looking at G.play
that's why you need to activate that one smods feature
No
oh, does that mean it indexed g.deck too? I figured it just means it also lets you do that but doesnt change functionality
Other card isn’t to do with card areas
but it is? other_card = G.play.cards[i]?
does that not mean what i think it means 
like, isn't that just indexing G.play.cards? Or does enabling the optional feature also tell the game to index G.deck.cards?
they done put henry stickmin in the gambling video game
if context.modify_scoring_hand and not card.ability.target then card.ability.target = pseudorandom_element(G.deck.cards, "mystery_play") end
if context.modify_scoring_hand and not context.blueprint then
if context.other_card == card.ability.target then
return {
add_to_hand = true,
message = localize("k_mystery")
}
end
end```
This never returns, despite a print clearly showing it *has* picked a card. I'm thinking `other_card` has not indexed the deck. It might be that im not enabling the feature correctly, since there's a pile of crumpled papers where there should be documentation
```lua
SMODS.current_mod.optional_features = {
quantum_enhancements = true,
cardareas = {deck = true}
}```
i tried cardareas.deck = true but it yelled at me for making a syntax error
after trying this: print(context.other_card.sort_id), it is more than obvious that it only indexes the played hand, and not the full deck.
It prints one number, a couple times. Not 40 some-odd numbers.
wouldtest have to use an object type prefix or a mod prefix or both or neither
Yes, context.modify_scoring_hand is only called for cards in G.play
Is this not the context in which i'd insert another card into the played hand?
if i had to guess you first have to insert the card into the hand
I add cards to hand even before modify_scoring_hand is called, I think.
is there a context even before modify scoring hand?? Or do I just have to do a lovely patch
I technically do.
And that function is https://github.com/TheOneGoofAli/TOGAPackBalatro/blob/be03c8e1a778cbc9ea6ba461cbacce6257d71a9a/togastuff.lua#L1119-L1159
I thought i might try to do it before the hand is processed at all, but this doesn't appear to work. Do I just have to move it after the hand is processed? Or did I make some other mistake?
[[patches]]
[patches.pattern]
target = "state_events.lua"
pattern = "inc_career_stat('c_cards_played', #G.hand.highlighted)"
position = "before"
payload = '''
if next(SMODS.find_card("j_mode_quiet"))) then
table.insert(G.hand.highlighted, pseudorandom_element(G.deck.cards, "mystery_play"))
end
'''
match_indent = true```
oh wait im stupid
...you should just call draw_card there. Better yet, just put a call to global function of yours that you can freely modify.
forgot to change the joker key
I mean the idea is that the game does that on its own, since im putting it before the draw loop
¯_(ツ)_/¯
am i stupid, why is this not doing anything
[[patches]]
[patches.pattern]
target = "state_events.lua"
pattern = "check_for_unlock({type = 'run_card_replays'})"
position = "before"
payload = '''
print("hello???")
'''
match_indent = true```
functions/state_events.lua
Pitch of card drawn sound.
oh, okay. I thought it might be how quickly it goes to the next part since it pauses there for about 4 seconds before finishing scoring really quickly
is this going through the entire deck a bunch of times?
if SMODS.find_card("j_mode_mystery") then
draw_card(G.deck, G.play, 100, 'up', nil, pseudorandom_element(G.deck.cards, "mystery_play"))
end```
What is wrong with my code?
key = "death",
path = "death.png",
px = 71,
py = 95
})
SMODS.Sticker{
key = "death",
config = { extra = { roundsTillDeath = 3, roundsWithSticker = 0 } },
badge_colour = HEX '000000',
pos = { x = 0, y = 0 },
default_compat = true,
rate = 1.0,
atlas = "death",
unlocked = true,
discovered = true,
should_apply = function(self, card, center, area, bypass)
if area == G.shop_jokers then
return true
end
return false
end,
calculate = function (self, card, context)
if context.end_of_round and not context.repetition and not context.individual then
card.ability.extra.roundsWithSticker = card.ability.extra.roundsWithSticker + 1
print(card.ability.extra.roundsWithSticker)
end
end
}```
what is happening or not happening?
When I go into the Collection with all Stickers it shows this Error. But if I go over my mod and look on the additions, it doesn't crash
the crash log has useful information outside of the first line.
im tired tho, so im going to bed
this seems to be problem with the new commit, can u post the whole thing
My bad, didn't know that
seems to be an smods bug to me
Should I go back to the other smods version?
well if you go back you wont have the automatic apply thing
So what now?
dont go to the collection and wait for the fix?
im checking if it's actually an smods thing
Okay, thank you
yeah it is
@wintry solar it crashes if the sticker doesn't have a config
Okay, I'm sure this error is because of my code. What did I do wrong?
i think it needs to be card.ability.modprefix_key.extra
I did that and it now crashes with this
key = "death",
config = { extra = { roundsTillDeath = 3, roundsWithSticker = 0 } },
badge_colour = HEX '000000',
pos = { x = 0, y = 0 },
default_compat = true,
rate = 1.0,
atlas = "death",
unlocked = true,
discovered = true,
should_apply = function(self, card, center, area, bypass)
if area == G.shop_jokers then
return true
end
return false
end,
calculate = function (self, card, context)
if context.end_of_round and not context.repetition and not context.individual then
card.ability.sj.extra.roundsWithSticker = card.ability.sj.extra.roundsWithSticker + 1
print(card.ability.sj.extra.roundsWithSticker)
end
end
}```
sj_death
So card.ability.sj_death.extra.roundsWithSticker?
Modify scoring hand is to change which cards that are played score/dont score
Woops
Nope, still crashes
oh it says its cstorm_death
I forgot that I changed my modprefix from sj to cstorm, sorry
this is what happens when i boot up my challenge. i just want to test my joker 😭
Yes, it should be j_modprefix_key
You can spend some time browsing the basic information of the API to understand how to make your own partner. If you encounter any problems in the process, you are welcome to feedback in the partner main post and I will try my best to help.
I'm having trouble setting up the atlas for my mod
I tried following what is on the SMODS documentation, but no matter what I try the game crashes while loading
I might be doing something wrong with the path thing
gimme a sec
Are you sure the atlas key in the joker is correct
Are you using animated atlas for jokers
just use debugplus to spawn in your joker instead of making a challenge
the atlas key is correct
SMODS.Atlas {
key = "ch_jokers",
px = 71,
py = 95,
path = "CharlatanJokers.png"
}```
I think it's the path that's the problem
guys im trying to install cryptid but, when i install all the mod and that i get in game, there is NO mod
it says thats its trying to look for a subfolder
tho there is lovely command prompt
try asking in #⚙・modding-general
hold on a sec
aight now the game loads and gets to the new screen
(I moved the atlas code to my assets folder in a separate lua file)
but if I try to view my jokers in collection it crashes
it doesn't seem to be loading the atlas anymore
the code doesn't need to be in the assets folder
can i see the file structure
correct me if im wrong but you shouldnt be putting them inside another folder (Jokers)
it's 1x and 2x
ohh
atlas.lua also probably shouldnt go inside assets
also this
hold on
doesnt make a difference iirc but its better practice not to put code inside the assets folder
thanks for the help
me using loc_txt folder instead of localization 
quick question, for a future joker i need to play a sound file on top of the already playing music/sound, is it hard to do ? Im starting to work on said joker so i wanted to know before hand
What is a shader in Balatro?
No,you just need to register the sound using SMODS.Sound then use play_sound somewhere in your joker
Or atleast thats how I did it and it worked
'k thanks :)
A shader is (among other things) the visual for editions
Iirc
Can I make one for my sticker? Like, if a card has it, it looks different
Yeah, but I wouldn't be able yo help you, because I think your implementation would need a custom SMODS.Drawstep and I'm currently failing at that
And you'd need to learn how to make the shader because iirc a shader is written in GLSL
Oh, I don't know anything about that <_>
Do you have like any recommendations on that? Or maybe links to learn it?
Speaking of drawstep, bumping this again as it keeps crashing and i dont see what's wrong? Might just not know how the thing works though
Sorry, haven't started on learning shaders yet
Iirc if you did in this channel you can find some links
I know its the draw fucking things up, but why
Log?
Guess I'll do some research on shaders and stuff then...
engine/sprite.lua:157: bad argument #3 to 'setColor' (number expected, got nil)```
I'll get the full log in a bit, can't grab it rn
As soon as I load a card with my enhancement
Where is the code for the selecting hand?
How does Yahimod’s Open-To-Lan spectral card work?
I want to try and replicate the code
But idk how it works
so i have another question, maybe harder, bu how do i make so that my joker make the two buttons switch position at random times (or like every x seconds) ? (and by buttons i mean the Play hand and Discard buttons)
what the fuck removing draw made it work?? but that didnt work before???
wait
does alt+f5 not reload sprites/atlases or smth
💀 alright time to perform code cleanup now that it works
...
?
I’m stumped.
pretty sure paya has a dos card that does just that
Yeah, I tried asking them but they seem not to respond, atleast in the way i would’ve expected.
pretty sure its available in the mod's code if u want to research
Where?
Also pointer’s kinda hard to read
I thought it would be simple to just define a simple collection overlay

