#💻・modding-dev
1 messages · Page 92 of 1
also whoops
Most "normal" runs don't really exceed 100, let alone 1000 iirc.
Unless you account for repetitions, of course.
yippee
How can I have a deck not show up in the deck selector like the challenge deck?
Where does the game reset hands and discards? And how can I intercept that process?
two places, state_events.lua (line 296 in source) and button_callbacks.lua (line 2914)
you can use a lovely patch to change it
i fear lovely patches
i will do anything to not make a lovely patch
they look WEIRD
good practice
lovely patches are amazing but can be confusing/annoying
much easier to handle when you can look at the lovely dump
im dipping my toes in lovely patches (it hasnt been going well)
(self.role.wh_bond == 'Strong' and (self.velocity.x * 8)) or (self.velocity.x * 2) is this how this works?
Have you done Champion Belt?
oooo
every blind is a boss blind?
is that how you think it'd work
That’s kind of what I did
i'd need to balance it with some kind of reward
Here
we should work on an isaac pack together
lowk
i'm having hella fun working on isaac themed balatro jokers
oh riiiight
i wanted to add greed and greedier into shops
like. just. straight-up shops have a chance to be a custom boss blind and have no items
I just made Champion Belt and an unrelated Red Hand
I just used the name but not the effect
left hand or red hand
okokokok but no fr @zealous glen if ur down, i can start a new modding thread and we can brainstorm (pun intended) and come up with some cards and make a pack
i want to add like. a LOT of isaac mechanics and themed bosses and jokers
maybe even music
i was thinking about replacing the boss theme with the bum-bo shop theme
I know what I said XD
Ah, I don’t know if I’m that Isaac-brained. But someone else had drawn Isaac Jokers
i am very. isaac brained
right now am using notpad ++ for coding, if there something that would be better for this?
I’ve used Sublime Text and VSC
what are those
just think that using a different software to code it can help with some of my problems
looking at my code in VS Code, it is saying the start of my calculate function is a problem
Can you share the code?
how should I share the code, just don't want to make a post that is a large block of text
you can do this
you forgot a comma after loc_vars function
I just feel like this is inferior to a codeblock in literally every way
common mistake
idk man its easy to see
right ere
what do you even mean "easy to see"
thank you, going to see if that fixed it
idk i am just used to using it
also
im p sure you can do this with it anyways
by just changing the file to a lua file
Thank you! I'm assuming I can't just copy this into a .lua file and have it work immediately?
Doing it that way is immensely annoying on mobile
understandable
Oh, neat! That is actually better that a codeblock on desktop, but it absolutely sucks on mobile
yay now have a new problem XD it is giving the chips on all cards and not just the enhanced ones
I love having to download a file and open it in my editor to then scroll through and find stuff 🙃
just discord mobile things
✨
also you can't search through uploaded files while you can search through codeblocks iirc
You also don’t get line numbers like you would in a well taken screenshot
Each has its benefits and downsides
try context.other_card.config.center ~= G.P_CENTERS.c_base instead of card.ability.name ~= 'Default Base
by the way
card in that context would be the joker, not the other card
you're basically saying if the joker's name isnt Default Base, then
that is good to know
reversed hiker lol
Eh, if you need a line number the person asking already knows where the issue is, they just can't see what it is. Usually a fundamental misunderstanding of Lua itself
Depends what sort of crash it is
I guess. Something something "minimal reproducible example"
maybe I should just start linking that stackoverflow page 🤔
ok now with the changed context for what it does, I now have the problem of the chips amount in the description showing as nil
can i have the link yo your thread these seem cool i want to add them
#1248287850512781452 but it is not updated yet
so like no sprites are ther
e
There any good UI examples? Basic buttons and altering background colors and stuff.
nevermind i found out
Where’s your atlas definition?
i didnt know the atlas needed frames n allat
Blind atlases do, yeah
it hath been fixed
Idea: A utility that lets you just directly change the source lua code, and then auto generate a lovely.toml file based on the difs.
Actually anyone else find lovely easier to use? it might just be my experience with computer science but like I find this way nicer than fiddling with lua's objects.
both have pros and cons
lovely can be a bit fragile when you're not the only one editing the code (also when source code changes with updates)
but it does allow very elegant solutions for problems that would need complete override otherwise
and uh do you really need a tool to generate lovely files when you can use something like git for diff
I guess it'd be useful for those less familiar with lovely patches
Lol that's exactly what I thought of after i typed it
created a pr for this issue
it does say above the if statement that this seems to be intentional
unless I'm misunderstanding it
hello again modders
got a problem
so to start, the locked_loc_vars function works the same as the loc_vars function does right? im pretty sure it does
but i've been trying to implement some variables into my unlock messages and I keep getting this error when hovering over it
return { vars = { "Test" } }
end```
code is dead simple, dunno what the issue is here. I looked at the line of code the error is referecing and i couldnt figure out why that variable is nil, its not a variable that should be in the `locked_loc_vars` function afaik
```unlock = {
"Use an {C:spectral}#1#{} card"
},```
how would I implement this into the mod?
the dependencies SMODS.Mods[v.id].disabled check is kinda unnecessary because of the check_dependencies(SMODS.Mods[v.id], seen)
my previous assumption was that that was for "unable to load" mods, not mods explicitly disabled by the user
Trying to use the immolate seed finder program and I'm trying to use a vector when making a seed filter using c++, and I had #include <vector> at the beginning of my code like I saw online but when I do that I get this error
Fatal CL Error -45 when trying to execute clCreateKernel - Creating OpenCL kernel
Anyone know what this means and if I can fix it?
ngl Im looking at other mods and doesnt seem like any uses locked_loc_vars, might just be a bugged feature. though from quick glance over it in steamodded I can't tell what's wrong exactly
I can technically use arrays but like, I want to return that array and from what I'm reading I need to do something with pointers and I don't wanna learn pointers yet
yeah its a bit frustrating, cant find any other references for how i can achieve what i'm trying to do
you're trying to make C++ filter with OpenCL version
i want to make it so that the unlock messages censors out the names of undiscovered cards
C++ rewrite is on a different branch
Ah, I see. So there's no way I can use vectors then?
in OpenCL version - not that I'm aware of, you can only use static arrays
See if Bunco censors undiscovered cards
I checked bunco it doesnt use locked_loc_vars
I think most people just hardcode values in description
I thought of that, yeah it doesnt use that
but I'd recommend using C++ version anyways
FUUUUUUUUUUCK
if theres an example of a hardcoded way to achieve this i'd like to take a look at that
by hardcoded I mean it's not a loc_var, it's just written in localization file
oh
so you just replace #1# with Test
Maybe someone in the Steamodded thread would know
Yeah I'll do that
wish they got the other issue I submitted too
submitted that a while ago
need that other one to be addressed before I can finish up Cardsauce
yeah people have been pretty busy, I'll have some time closer to new year, might look at some if I feel like it 
the previous issue I submitted is a small change but a major issue for the Cardsauce mod
its like a one line fix
Do pointers get destroyed when a function is done running in c++?
but if its not merged in steammodded by Cardsauce's release i'd have to bundle a different steammodded download like cryptid or a patch to apply to steammodded in the mod
cause its a loader thing
cant lovely patch it afaik
if you have the time i'd very much appreciate taking a look at that
what are you trying to do exactly? also should probably ask these questions in #1209513992519946250
the incorrect version detection? yeah that should probably be fixed asap
YYYYESSSSSSSS
yep exactly
Has anyone made a util to auto generate 2x sprites?
I have a Python executable that does that that I made for my own personal use
I can throw it to you if you want
Pls
I wonder if a better fix would be to look for Deck except DeckSkin
I got around it in Faces of Sin by just using the option to write the key explicitly
(Which is a texture mod)
I haven't really polished this at all in a lot of ways so be careful with it. This should only work on windows, and it should automatically detect the location of your appdata folder to find your mods folder.
It will automatically scale up every mod in your mods folder with assets, and will delete 2x files that dont have a matching 1x file.
It will also ignore every file that ends with a dash (ex: balatro-.png) because I use that to flag which of my files are old or alternate versions
Thanks!
also, if you scale up a big replaced spritesheet of all the vanilla jokers, its causes Hologram to break a bit and create this weird candle shaped hole in it. I dunno why that happens but i do know that the 1x and 2x versions for the Jokers spritesheet are not identical, hologram has some differing transparency
Someone had made one
But it shouldn’t be hard with whatever imagine editing program
Especially Aseprite
people in here said the fix should be to replace the line with this
outdated = { pattern = { 'SMODS%.INIT', 'SMODS.Deck[:.]new' } },
works for me
speaking of things working and not working I just updated Steammodded and now all my achievements I added dont unlock at all wtf
bet its this
or something else that got changed maybe
Probably better to just override the whole function instead of injection anyways.
override what function?
unlock_achievement
i've been basing my achievement unlocking on how cryptid handles it
i wonder if that override method might be better
eh maybe not my main complaint about achievements is the lack of text formatting on them i doubt that will change with a new method
yeah
Doing a table would be so much better
dont think i have the time to overhaul achievements from now til release though so i'll just have to force that patch off with another patch
oh I think I know why this messes with it
I updated this line to prevent the memory leak but then it ends the function before actually running the code to unlock the achievement(?)
or maybe the achievement unlock function doesn’t like being called only once
preventing the memory leak by not running the code? 😏
Nah, this breaks the lovely injection used to do modded achievement logic before this if statement (so mods can redeem achievements whilst vanilla are still disabled).
all right, so
how do we actually go about making a function that can change a hand's base values on game start?
we'll work on the conditional part later, right now we just want to make it happen at all
oh, silly me 
should be an easy fix then
whats the conditional you have in mind? cause that conditional might be easier to implement than a ground floor change to the value
(idk if thats an actual turn of phrase)
"deck has a lot of suits (exact definition of this TBD) or a relevant config option is checked"
i've been dithering on the exact condition that should lower the scores
cause like if we do a cryptid compatibility thing and have Deck Of The Cat: All cards are the 3 suit, that'd be 100% custom suits but wouldn't make it easy to play a spectrum. so a simple count of custom-suit cards won't do it
Oh when I was going through patch conlicts earlier some achrivmeny related patches didn't go through
May be worth an investigation
you know ive looked into it just now, im not exactly as confident in this as I thought I was anymore
i swear i changed the values before but the methods im trying now arent working so im not sure
though when I changed the values before I ended up deciding against implementing something that did that in the mod, it felt not good
I originally had a joker idea to double the upgrade values of high card but I ended up changing it to just doubling the levels you recieve when leveling up high card, and that worked out way better cause it meant that the level number always stayed consistent with vanilla
ik cryptid has an exotic that makes levels give 2x instead of +whatever, so i'm reasonably sure it's doable, and i might be able to figure it out by digging through that code
i'm also reasonably sure i know how to make hands check on game load to determine their value conditionally. but for obvious reasons that wouldn't work to have it care about the deck
this is balatro everything is possible
the real question is how much work will it take and how compatible with other mods
true
this is really weird
this one patch seems to break purple seals??
like very specifically only purple seals and i dont know why
does it match multiple lines?\
Does it need to be “at”?
,,,good, question for that second part actually
no it doesnt
seems like it does have to be "at" since its just replacing the context.card == G.consumeables entirely
OH
okay i see the problem now
the code that fixed purple seals as injected as a steamodded lovely patch that looked for the code i was also replacing
ok I didnt notice the memeory leak before but I am really noticing it now my fps tanks after I undid the change you made
this is real bad damn
please fix soon good sir or madam MathIsFun_ 🙏
how do I make the joker react to its effet being used?
card:juice_up
where would I put that?
so before the return?
yes
well after a return nothing can exist so
what is that play sound in that example there?
function that plays a sound
lmao???
anybody know the answer to this?
I put the line into the code and when I go to use the joker it crashes
what does your code look like
use round brackets () not curly brackets {}
card:juice_up{0.5,0.5} -> card:juice_up(0.5,0.5)
awe, got to hate when the problem is something small like that Xd
could be one of the uhh... 42 mods installed
fair. i packed it full lol. had no issue till ante 7 when i got a card to exploit
it isn't doing what I would want, I was wanting it to react as it triggers a chip gain from the enhanced cards, or should I change the card = context.other_card to card:juice_up(0.5,0.5)
shouldn't it be card = card
one sec
if you want the card scoring to react, then changing it to context.other_card:juice_up(0.5, 0.5) should do it
I think I have done a dumb and just been doing this wrong
its easy to make mistakes dw about it
ok, so each time the +50 chips would hit from an enhanced joker being played, how do I make it then react when that happens
think I am going to break from working on this and play some of the crypted mod
Can anyone help point me to the right direction? I'm trying to add a specific booster pack into the shop after a boss blind, but I don't know where to insert the logic of adding the booster pack itself... update_shop doesn't seem to be the right place for it
Hello, I'm attempting to test out more UI functions, but I'm not fully understanding it just yet. Trying a button that calls UITests_misc_options and brings up an overlay menu, but I'm getting a crash saying that colour is nil in function UIElement:draw_self, and I'm not sure where I'm going wrong with it. Would appreciate if someone pointed out where the issue is.
G.FUNCS.UITests_misc_options = function(args)
G.FUNCS.overlay_menu({
definition = { create_UIBox_UITests_misc_settings() }
})
end
function create_UIBox_UITests_misc_settings()
local tab = create_UIBox_generic_options({
back_func = 'exit_overlay_menu',
contents = {
{
n = G.UIT.R,
config = { colour = G.C.CLEAR, align = 'cm', minw = 12 },
nodes = {
{ n = G.UIT.T, config = { text = "Test", colour = G.C.UI.RED, scale = 0.4 } }
}
}
},
})
return tab
end```
the basegame always guarantees a joker booster pack (p_buffoon_normal_1 or p_buffoon_normal_2) for the very first shop, maybe that helps you?
Yeah, I think check out get_pack in common_events.lua.
try definition = create_UIBox_UITests_misc_settings() instead?
That makes it crash in UIElement:click(), so, don't think that's it.
Thanks @tepid crow @shell tangle I'll check them out
it is the proper way to nest the UI tree (if I'm to believe my own mod and steamodded), so there might be a second issue
is there a way to add a card to the card options in a booster pack?
you might also need to set G.SETTINGS.paused = true?
Maybe, I'm using Eremel's Malverk as a reference, which here's the snippet I'm using as a reference, I'll probably go back and double check his lovely patches to see if I missed anything.
G.FUNCS.texture_config = function(e)
G.FUNCS.overlay_menu({
definition = create_UIBox_texture_config(e.config.ref_table.texture_pack)
})
end
function create_UIBox_texture_config(texture)
local label = {text = 'Page 1'}
local t = create_UIBox_generic_options({ back_func = 'textures_button', contents = {
{n=G.UIT.R, config = {colour = G.C.CLEAR, align = 'cm', minw = 12}, nodes = {
{n=G.UIT.C, config={align = "cm", padding = 0.15, r = 0.1, minw = 12}, nodes={
{n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR, r = 0.1, padding = 0.2}, nodes={
{n=G.UIT.T, config = {text = 'Configuring', scale = 0.8, colour = G.C.WHITE, shadow = true}},
{n=G.UIT.T, config = {text = localize({type = 'name_text', set = 'texture_packs', key = texture}), scale = 0.8, colour = G.C.WHITE, shadow = true}}
}},
-- Main Texture Select Display
{n=G.UIT.R, config = {colour = G.C.BLACK, r = 0.1, minh = 7.5, minw = 12, align = 'tm', padding = 0.5}, nodes = {
{n=G.UIT.R, config = {align = 'tl'}, nodes ={
Malverk.texture_config_toggles(texture)
}},
-- Page cycler
{n=G.UIT.R, config = {align = 'cm'}, nodes ={
EremelUtility.page_cycler({
object_table = Malverk.config.texture_configs[texture],
page_size = 18,
key = 'texture'
})
}},
}},
}},
}}
}})
return t
end
Eremel's stuff is great as UI reference, I did the same thing
Trying to do it within a page in steamodded's mod config, I assume it's already paused by the time it tries to call this function.
but like in his code, it's definition = create_UIBox_etc(...), not definition = { create_UIBox_etc(...) }
Should be yeah. Balatro does some weird stuff with UI sometimes though 😅
That is true, I think I mixed it with the {} from the overlay menu, but, still run into the click crash, though.
Sorry, was double checking and reading to see if I missed anything myself, but I'm not seeing it. Would appreciate you looking through it.
colour is nil errors are generally tied to depth errors
the depth error is (presumably) fixed now
Had a feeling, haven't been able to pinpoint where.
Hmm, the error says G.FUNCS[self.config.button] is nil, which is weird, since apparently self.config.button is defined.
Looks like an issue with you (or someone else?) referencing a function (as string) that doesn't actually exist 🤔
Wait, figured it out, I moved the function up to group it with other code, but, forgot to delete the previous instance, so all the changes I've been making were getting overwritten.
It was the definition = {} thing.
:)
nvm i got it
SMODS.Booster isn't documented, but in the create_card func it passes in the booster card alongside the index
can i add an image to a gui
index nil with "c_gems_infusion"
could make a document about it perhaps? I need to make a booster myself
i'm not well knowledged on the inner working of steamodded so i wouldn't try writing an article lol
anyways been trying to get the nil to show up as 2 but haven't gotten it to work
is the reason why all of these checks fail and go straight to the else because i'm doing nested ifs wrong or is it because of how SMODS.Sound works
the code works to replace music layers when its formatted like this but this is not nicely scalable for more conditions
you want to put the checks for the return instead
yeah, you'll have to use this method instead
damn
is there a way to exclude groups of checks without just making each one only true of all others are false individually
the other one is "if, when this mod is loaded, these globals exist (they don't), then it will initialize that sound"
for the overlapping checks, you can return a larger number so its priority becomes higher and it'll be the one that plays
oh i see
that will help a lot
when returning a number greater than 1 does "and" just equate to multiplication
no
oh cool, didn't know that
(condition and 1) means
if condition == true: return 1
ok, so i can do the conditionals with a "and x" where x is the priority
more niche layers get higher priority
mhm
cool awesome
oh hey speaking of that with the SMODs music replacement
I noticed that if I reset my profile while SMODS is playing a modded music track the track starts playing again on top of the previous one
and it doesnt stop doing that and i have to restart the game
has anyone else come across that or found a way to fix that
smods.sounds has some problems
i had to get around the syncing issue by manually shifting one of my tracks by like 1500 samples
mostly works
Didn't see this get answered, it'd be load an image into an atlas, make a sprite object referencing that atlas, and then use G.UIT.O to use that sprite.
basically that ^
I do something similarish here https://github.com/larswijn/CardSleeves/blob/main/CardSleeves.lua#L1157
Any examples of using art larger than the regular card sizes? Or is it not really possible
It can depend, but for the most part, it depends on what you set your atlas x and y to.
the px/py of the atlas definition should define the width and height of the 1x version of the asset right?
How come my booster pack shows ERROR when opening it?
The atlas x and y sets how big each individual object in an atlas is, and for some objects, loading that will try to squeeze it into the same space, I know vouchers definitely do, and for others, it gets pasted on top at full size with no refitting, which I believe stickers do.
Here's my code:
{
key = 'einherjars',
group_key = 'k_einherjars',
loc_txt = {
name = "Spiritual Concentration Pack",
text = {
"Choose {C:attention}#1#{} of up to",
"{C:attention}#2# Einjerhar{} cards"
}
},
weight = 0,
cost = 8,
name = "Spiritual Concentration Pack",
pos = {x = 0,y = 0},
config = {extra = 2,choose = 1},
create_card = function(self, card)
return create_card('Joker', G.pack_cards, nil, 'valkyrie_einherjar', nil, nil, nil, nil)
end,
in_pool = function(self)
return true
end,
loc_vars = function(self, info_queue, card)
return { vars = {card.config.center.config.choose, card.ability.extra} }
end,
draw_hand = false
}```
Gotcha so it'll depend on the type, any idea on how jokers handle it?
I don't remember it off the top of my head, I say just set the px to a wild amount and see what happens when you load it in.
I will say, even if you don't know the ins and outs of Steamodded, writing a document on it, just covering things that didn't make perfect sense at first, issues that you ran into, and solutions you found to said issues, even if that's as simple as figuring out how to make text not show error, will help out both people looking to learn, and the people writing documentation - it helps them know what parts need further elaboration, and what not might be clear on first glance.
I believe you need either a localization file or a function SMODS.current_mod.process_loc_text(), do you have either of those?
I haven't made a localization file yet. I guess I better get started on that!
Wait, you might not need the process loc text, but you do need to define it at least.
that would also mean that it's better I move all the loc_text values from other cards to my localization file too, right?
You can if you want, but it's not necessary.
It's just a specific oddity with Boosters and possibly a few other objects, I think stickers as well for example, that require external loc_txt.
Got it. Thank you!
thanks
il try it out
I think it needs two, one is definitely G.localization.descriptions.Other.b_modprefix_boosterkey = {name = {blah}, text = {blah}}, and you can probably just have that as a line in your code, and the other is G.localization.misc.dictionary.k_booster_group, which, I think gets defined when you do a consumabletype, but, you might need to set it manually, I don't remember.
what does the sleeve center part of this do
local sleeve_sprite = create_sleeve_sprite(0, 0, _scale*1.5, _scale*(95/71)*1.5, sleeve_center)
It's a variable, look for local sleeve_center = whatever.
CardSleeves.Sleeve:get_obj(G.GAME.selected_sleeve or "sleeve_casl_none")
though that's not really the interesting part
the interesting part is create_sleeve_sprite
i just want mine to be a set image that wont change
so this take the sleve and finds its atlas and pos G.ASSET_ATLAS[sleeve_center.atlas], sleeve_center.pos)
so i could make the function take a position isnted and have a set atlas
Yeah, should be G.ASSET_ATLAS['prefix_atlas'], pos = {x=0,y=0},
prefix atlas is just the key the atlas is?
Yeah, plus your mod prefix if you don't set the atlas prefix config to false.
Actually, you may not need your prefix anymore, but can't say for sure.
p sure you do
I know you used to, but I feel like I might've saw someone use it in a case where they didn't recently.
so if my prefix was mc then it would be mc_(atlas key)
Yeah, should be.
you don't need the extra function around it, unless you plan on doing this multiple times?
fair point but i don't know how to add a page to the SMODS wiki
just throw it in #1209564621644505158 and ask if someone could add it to the wiki
you can't make a pr so... ¯_(ツ)_/¯
I got it to work via localization now, so things are good. Thanks for this! I do have a couple of other questions though:
- Is there a way to set color names in text? (like I saw in Reverie that they're using {C:cine} for their own color)
- Where does localize() pull from exactly when used? Does it look up immediately from the dictionary? I've tried using it for labels of my own consumeable cards, but no dice
localize is an incredibly complex function that I've looked at a couple of times now and still don't fully understand lmao
And the wiki isn't the only place for it, you could make a new post in #1209506514763522108, or you could throw it here and people could save it as a txt file and give it to people when needed. That's how Eremel's UI notes were for quite a while.
i might
for the same picture or multiple different pictures?
loc_colour I'm pretty sure, don't remember the specific .lua it's in off the top of my head. I don't remember where localize pulls from either immediately, apologies. Maybe try some sendDebugMessages to narrow it down?
it's at functions\misc_functions.lua:1689 if you care
I just found another mod that uses this, thanks for poining it out
ohmygod this is... complex
yeaahhh
Put the mc_resource_sprites in quotation/apostrophe marks.
oh shit ok
nope
nvm wait
im just an idiot i frogto to save
what does the color do
but anyways YAy thanks guys
I have no clue. It's possible it crashes when you don't have it? Try it I'd say
yo chat is there a way to change a blinds' text when you're not fighting it?
like in the blind select screen
like this blind is supposed to be summoned
but how would i change the text here
nothing, nothing happens
you dond need it
dont*
this is what i could find for SMODS.Booster (haven't done a deep dive into the functions)
@tepid crow Apologies, but I'm apparently pretty rusty, could you help me again and pinpoint where I'm missing? I'm going for
Row
>Col x2
>>Row x3
>>>Col Toggle
>>>Col Name
but, I'm apparently getting just the row output, and I haven't been able to narrow down why.
function create_UITests_misc_options()
local TexturesIn, TexturesOut = HEX('FE5F55'), HEX('f83b2f')
local settings = {
'a',
'b',
'c',
'd',
'e',
'f'
}
local lists = {col1 = {}, col2 = {}}
for i = 1, #settings do
if i <= math.ceil((#settings/2)) then
table.insert(lists.col1, settings[i])
else
table.insert(lists.col2, settings[i])
end
end
local output = {n=G.UIT.R, config = {}, nodes = {}}
for i = 1, #lists do
local col = {n=G.UIT.C, config = {padding = 0.1, align = 'tm'}, nodes = {}}
for j = 1, #lists[i] do
local option = lists[i][j]
local row = {n=G.UIT.R, config = {padding = 0.1}, nodes = {
{
n = G.UIT.C,
config = { r = 0, align = 'cl', minw = 0.8, minh = 0 },
nodes = {
create_toggle { label = '', active_colour = TexturesOut, scale = 1, w = 0, shadow = true, ref_table = config, ref_value = option } }
},
{
n = G.UIT.C,
config = { padding = 0.2, r = 0, align = 'cl', minw = 2, minh = 0 },
nodes = {
{ n = G.UIT.T, config = { shadow = true, text = option, align = 'cm', scale = 0.5, colour = G.C.UI.TEXT_LIGHT } } }
}
}}
table.insert(col.nodes, row)
end
table.insert(output.nodes, col)
end
return output
Updated version btw
Wrote this a few weeks ago, hasn't been added yet iirc
oh, bet
ah didn't realize someone already made this
I'll take a look in a min
ste
I've narrowed one of the issues down to how I tried the lists,
local settings = {
'a',
'b',
'c',
'd',
'e',
'f'
}
local lists = {{},{}}
for i = 1, #settings do
if i <= math.ceil((#settings/2)) then
table.insert(lists[1], settings[i])
sendDebugMessage('1 '..tostring(lists[1][i]))
else
table.insert(lists[2], settings[i])
sendDebugMessage('2 '..tostring(lists[2][i]))
end
end
For some reason, lists has to be {{},{]}, and the first part crashes if it doesn't, and the second part crashes no matter what. I'll probably manually separate them for now and come back to it later.
Oh I see. Lua cannot get the length of a table that isn't ordered properly (e.g. {[1] = ..., [2] = ...})
It was 100% in my list, and I was getting confused about why it was vertical because I needed to set either a minw or maxh on the output row.
Nice to know about, that'll definitely help, thanks.
you can use pairs to iterate over an unordered table, you might also want to read What is the difference between pairs() and ipairs() in Lua?
Used to python indexing, I think.
Anybody know why my consumables look like this when undiscovered? Its name also strangely shows up on the upper left side of the screen too, past the boxes
This does not appear to work. I'll settle with manual lists for now, though.
I believe you might need a SMODS.UndiscoveredSprite { key = 'consumablegroup', atlas = 'consumableatlas', pos = {x=whatever,y=whatever} }. Unsure about the text.
ok now i have an even more Rediculus GUI question
ridiculous
is it posible to change the shape of a GUI
this is when the text fails to render in the card uibox
got saved by jokerdisplay
Seems more like an issue with the wheel mod not accounting for compatibility checks.
ive got a really strange crash here
seems to be something to do with joker retriggers according to the code? but this crash only comes up when i play a hand with a specific joker from my mod
Not accounting for context.repetitions
but i put and not context.repetition
is the
is it a different context because it's reptitions plural
why is this a problem with this joker specifically and not any others i've made
Is there a better way to do this?
Ah yeah my bad you already fixed it in your latest message. How are you loading this UI element btw? Seems to work for me
you can do center = SMODS.Centers[x] or G.P_CENTERS[x]
Yeah but it still feels a bit hacky checking both tables, it's weird that there isn't like a unified refrence table
I have fixed it... weirdly, it specifically required the undiscovered text to work properly
Is there a way to get the back key ID out of a card? I know you can get the actual back data with Card.config.center, but like is there way to get the key name?
anyone know what part is used for the unlocking or the discovered animation
what's a good way to check if a consumable is a specific type?
I hate writing UI, but I do enjoy seeing the results of said UI.
that looks pretty clean
Honestly same
(i have yet to make the ui) 😔
Check card.ability.set, maybe?
Can confirm the best part of DebugPlus's config is I don't have to write ui now
this works perfectly, thank you! I've been scratching my head for a few hours since I was looking at config instead lmao
huh? wdym by that
i gotta know if theres like a generator for the ui or something
im super new, got a simple question. How to get the current mult variable and current chips variable that has been scored so far?
or anyone knows a mod that uses this so I can just check code to understand it?
I see mods using local "chips" that would then override it no?
My mod checks them for the "La Révolution" joker
thx a bunch, learning the most by looking at code directly

I assume its G.GAME.chips then
Yea hand_chips is the current chips and mult is the current mult
aighty thx
G.GAME.chips is the current score you got
ah okay makes more sense now
Looks pretty clean, what’s it for?
one last general thing, is there a reason we use loc_vars to store data and return it when needed/scored? why cant we just do a local var within the calculate function and just return that?
im just trying to understand
loc_vars is to replace the #1#, #2# etc.. in description to said value
Do you mean config?
nah just general
like this should work
all examples I find they use loc_vars in the return function
yeh, I get that
was just wondering if there is some kind of deeper meaning, like interactions with other jokers or something
You didn't specify a message in the return value so nothing shows up
actually I found a pokermon that uses it
yuh thx, I didnt get to that yet 😄
The major point is mostly clean clode, magic numbers is a bad coding practice usually, also it helps with mod compat like Cryptid and their randomized values. For your joker it's different tho since it's based on preexisting values (like Abstract or Swashbuckler)
Is there a "stage" or other global I can check for to prevent add_to_deck and remove_from_deck triggering SFX?
if G.STAGE == G.STAGES.RUN and not G.screenwipe seems to have done it, more leaning towards the G.screenwipe.
wait can I not lower the chips or mult? 
chips_mod does not seem to accept negative numbers
ok nvm on mult I can
mispelled it
its "chip_mod"

coolio works great
THX SDM 🙏
that was pretty painless compared to Yomi Hustle modding ngl
first take ownership of the card
and then?
i think they more mean "how would you change the text"
can you even take ownership of a regular playing card?
i mean, it has a center (G.P_CENTERS.c_base)
I'm looking trough the Steammodded/SMODS wiki , and I cant fidn anything on SMODS.DeckSkin
what does it refer to ?
I'm using Balacord's code as a reference
DeckSkin is used with the DeckSkinLite mod
i think?
oh nevermind i forgot it was implemented into base a while ago
there's no documentation on it yet
what does this mean
how do I make this crash not happen
What's its function tho ? In Balacord for exemple - when I look trough my decks its the base set.
it creates the deck skin object, which appears in the Customize Deck screen
oh dang thats neet
Thank you so much, very helpful !
i am messing with functions and im scared
wdym?
i dont know how to stop this
litterally wtf did you do ?! ._.
do NOT change Movable:move_xy
lmao
ok i did it
we have achieved bounce
do NOT look at skill issue
also i forgot to turn off talisman
The ever useful delta time:
Is there a way to use high contrast variation with this syntax :
Still using Balacord , as reference
thats youu!
i wanted to ask if anybody got in a nutshell all the things i must know to mod balatro
Being able to read vanilla and mod code to learn how they do things and being able to google
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
card.ability.extra.chips = card.ability.extra.chips + card.ability.extra.chips_gain
return {
message = '+'..tostring(card.ability.extra.chips_gain),
colour = G.C.BLUE,
card = self
}
end
end
Any idea why this is not popping up on every scored card?
the visual? like its working functionality wise
but under the joker I dont get the "+5" in blue
Should be card = card
same thing
Can you show what the full code is?
ah nvm I got it now, those weird messages that are inbetween are weird for a first timer
but thx for the help anyways
SMODS.Joker{
-- Virtous Contract
key = 'VirtousContract',
loc_txt = {
name = 'Virtous Contract',
text = {
'This Joker gains {C:blue}+#2#{} Chips per scored card.',
'Resets when blind is defeated.',
'{C:inactive}(Currently{} {C:blue}+#1#{} {C:inactive}Chips){}'
}
},
rarity = 2,
cost = 5,
blueprint_compat = true,
eternal_compat = true,
unlocked = true,
discovered = true,
atlas = 'Jokers',
pos = {x = 1, y = 0},
config = {extra = {chips = 0, chips_gain = 5}},
loc_vars = function(self,info_queue,card)
return {vars = {card.ability.extra.chips, card.ability.extra.chips_gain}}
end,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
card.ability.extra.chips = card.ability.extra.chips + card.ability.extra.chips_gain
forced_message('+'..tostring(card.ability.extra.chips_gain), card, G.C.BLUE, nil)
end
if context.joker_main then
return {
message = '+'..tostring(card.ability.extra.chips),
colour = G.C.BLUE,
chip_mod = card.ability.extra.chips
}
end
end
}```
is the whole thing now, and the function forced message lifted of Bunco
You don’t need that function
local function event(config)
local e = Event(config)
G.E_MANAGER:add_event(e)
return e
end
local function forced_message(message, card, color, delay)
if delay == true then
delay = 0.7 * 1.25
elseif delay == nil then
delay = 0
end
event({trigger = 'before', delay = delay, func = function()
card_eval_status_text(
card,
'extra',
nil, nil, nil,
{message = message, colour = color, instant = true}
)
return true
end})
end```
well return does nothing when it comes to sending a message when other cards get scored
gotta use that weird, G.E_Manager add event thingy
Lemme check real quick, that sounds wrong
To get it on the joker you just need to use card_eval_status_text, you need buncos weird spaghetti function
But if it works, it works
You don’t need*
haha I see
Bunco does some really weird things
card_eval_status_text(card,'extra',nil, nil, nil,{'+'..tostring(card.ability.extra.chips_gain, cG.C.BLUE}))
so this should work?
The table at the end needs keys, like message = blablabla
Let me find an example, hold on
okm thx
see thanks but I tried that already a couple times
errors out and wants me to use a [ "near the ="
which makes no sense
Then you’ve got a syntax error somewhere
if context.individual and context.cardarea == G.play then
card.ability.extra.chips = card.ability.extra.chips + card.ability.extra.chips_gain
card_eval_status_text(card,'extra',nil, nil, nil,{message = '+'..tostring(card.ability.extra.chips_gain], colour = cG.C.BLUE}))
end
if context.joker_main then
return {
message = '+'..tostring(card.ability.extra.chips),
colour = G.C.BLUE,
chip_mod = card.ability.extra.chips
}
end
end```
oh wait
I see it now

day 1 lua for me
this stuff weird
had 3 typos somehow, I should eat lol
thanks again though!
yes works like a charm
!!!!
No worries!
i hate how += expressions don't work in lua 😭 luau spoiled me
Does this look right to you?
It’s off center
To me it looks like the Joker is thinner than it should be
But I'm not sure why
Bunco has a slightly different code than what I used in 0.9.8, but neither seem to get it right
i hate writing UI and i never enjoy seeing the results
how the fuck did you do that
writing UI looks soooo confusing to me
Not only it's thinner, it gets thinner when I reload the game
Biggest thing that helps me with UI is figuring out the tree at the start, like this one is
Row
>Column
>>Tall Row
>>>Vertical Text
>Column
>>Row x3
>>>Column with Toggle per row
>>>Column with Name per row
>Column
>>Row x3
>>>Column with Toggle per row
>>>Column with Name per row
Does anyone have an example of a wide Joker in Steamodded 1.0?
You can look at how vanilla does half joker or how Paperback does stamp.
The issue is that I used my code from 0.9.8 and it doesn't work as expected
I referenced Bunco but it also doesn't work
Time to dig into the 1.0.0 difs!
Paperback might address part of the issue by adding a load function
I used what stamp did to mess with vouchers and it worked perfectly fine for me, and it's still perfectly functional for stamp in Paperback.
I feel like all you would have to change is the card width and height no? Cards center by default so just changing the width and height parameters would do it maybe.
There's some issues if you reload it during a run without more things in place.
Ah, yeah that makes sense. I’ll have to look at the vanilla code for half joker some time.
As I said
I'm already doing the same thing as all examples I looked at
Including Paperback
But they're all smaller than normal
Instead of larger
When I messed with vouchers, I made them larger with no problem, but, maybe not the same for jokers. What's the code you're using?
I would assume it’s something to do with the ratios being off but that’s complete speculation. I know cryptid has quite a few abnormal joker shapes so maybe look there?
It's also off-center despite the image being centered in the atlas
Here's the format I used, but, yeah, not really sure what's going wrong there, I assume it's something specific to jokers only.
set_ability = function(self, card, initial, delay_sprites)
local w_scale, h_scale = (86/71)*0.96, (116/95)*0.96
local W = card.T.w*w_scale
local H = card.T.h*h_scale
card.T.h = H
card.T.w = W
end,
SMODS.Atlas{
key = 'Tests',
path = "VouchersTest.png",
px = 86,
py = 116
}```
Biggest thing is that I have no idea why your code would cause it to shrink over time.
do you need the set_sprites too?
Do i need to learn lua to make mods
Yes, but you can learn by modding
What mod u make
The sprite definitely seems thinner than the soul sprite
Even if I don't touch the sprite it shows up like this
So maybe there's an issue with the atlas?
what's your atlas definition?
man is ui hard
Victin can i boost ur server
Check the end
I don't have one
Ok
oops
its like
summoned blinds
harder blinds basically
so i want them to show up in the collection
this is basically the same code as in create_UIBox_blind_popup but using my localization instead
Would this kind of UI help?
idk maybe
i dont know ANYTHING about UI code
other than it has to do stuff with nodes n shit
As someone23832 suggested, try to imagine which nodes should exist
It's usually not too hard
Each line is a row, for example
If the text changes color, you need more than one text node
yeah i think i got that part but its a little confusing at times
I think biggest thing for UI is to keep in mind that within a node you can only have child nodes of the same type, otherwise alignment is broken
so basically all my code is doing is hooking at create_UIBox_blind_popup
but its overlapping with the old blind popup
Maybe it's overlapping because you're adding a second root node
I'd imagine it only expects a single root
Depending on what you want to do, you can add everything inside your root to the original root
Actually, that example I showed has two Blind descriptions inside the same root
@wintry solar Any insight?
not that I can think of, I've not really touched resizing sprites
I could see this pretty easily as a lovely patch, just put a check in the node construction before it's added for config, and then add the node right after the one that already exists if true. No reason you can't store where your config is in a global, right? Just something like G.jimbomod_config_global = SMODS.current_mod.config, and use that for an if check?
You could construct all the nodes and throw them into a global table to access them as well, might not be the best way, but it's probably an easy way to get it working.
what was thunk thinking writing this
all the other save functions seem to use a local
but theres just a pointless global declaration here 
heyyyyy how do i check if a joker is a specific joker?
bad phrasing. ok
so i am trying to detect if a joker to the left of another joker is a specific key, and i'm not sure where to get the key from
if (the card).config.center.key == 'j_joker' then --'j_joker' is the key of the card you want
alrii, thank you, let's see if it works!
ohhhhhhhhhh i needed to have the prefix
darn
yea
well ok thank you very very much!!!! significantly appreciated!!!!!!
is there a way to make a modded rank act as another rank?
i figured it out but it doesn't work for straights
right now, only exclusively
so you can make a 7 act like a King, but you can't make it act like a 7 and a King at the same time
so for now i can't make a modded rank act as its own thing but have all the interactions of the rank 2?
Old Joker, new art. Thanks to @dim ice!
Is this for the TBOI mod or for your mod?
it's very wide, but good job!
too long
You should be able to switch the alignment of the UIBox iirc
Add more line breaks
Also, interesting
I think variations of Blinds like there are Champions in Binding of Isaac could be fun
I'd also maybe throw a darken on the whole node so that the row at the top doesn't blend in as much
What's a good cheat mod for adding enhancements to cards and stuff like that?
DebugPlus
thx
Does the enhancement cycle not include custom enhancements?
it should last time I checked
Oh wait nvm I figured it out
why is my game flowy
its nice
Feels like I'm on something
how do i make a variable in lovely patches that i can modify with lua
Wdym
if self.role.xy_bond == 'Strong' then TGTMVelMult = (2200 * dt) end the 2200 i want to have as a variable i can change
with config UI
Just make it a global variable that your mod sets
You can tie it to the G object if you really want to. So like replace the 2200 with G.whateverName and in your mod code make it G.whateverName = value
Tho I haven't worked with the config api yet so idk how you load values from it
but this is initialized like at the start i think
this is the main movable function
wait...
definitely not if its going by dt
local TGTMVelMult = 0.99 i already initializes the variable....
how do i make a variable global
thats googlew my bad
Just don't put local. lol
But I would tie it to the G object to be safe
G.TGTMVelMult = 0.99
what would happen if no G?
it would probably crash when i startup because G doesnt exist in main menu i belive
It's just bad practice to set a global var inside a func. Tying it to the G makes it basically a global var but it's more controlled.
i never understood the idea of that tbh
the only thing I pay attention to is that i use G.GAME for things id prefer to be saved along with the run
global vars in lua are kinda all encompassing. They literally span the entire interpreter so it's stupid easy to collide with other places (which is also what makes injection into lua so easy).
i cant just multiply by dt...... we are doomed
well yeah thats why you sign your globals and whatnot, just moving the majority of globals elsewhere doesnt do a whole lot (especially when everything uses the same location anyways, like G is just as common as the normal global table)
i imagine thats already done in the velocity calculation
and the speed is just meant to be a constant
is dt nil or something? whats the issue
Well the issue is actually with love2d itself. it uses the default global table so that's why you don't wanna collide with it. Also putting it under a Table makes it easier to fuzz for errors.
the scal;ing doesnt scale
all of loves stuff is under _G.love
as dt decreases, velMult decreases at a rate different than dt * velMult
and i dont get what youre saying in that second bit globals are already in a table no matter what
Look in general in programming it's just bad practice to have floating globals. It causes unpredictability. Tying them to an actual object is usually better practice, as it also allows that object to monitor the Globals as well.
Like the whole reason the G object is needed is so that logic that's passed through it can be properly dealt with
Though I mean it's more of a style thing in lua. But like since the codebase is already built like how it is, no need to go doing something different now.
draawing to help
Wait how
i messed up my drawinf
forst image is dt small
ok maybe dt is just being a wierdo
Damn that shit is too complicated to think about. Hate working with dt in my own games I'm not tryna fuck with other games use of dt
in main menu dt * 2200 = 14, but in gameplay dt * 2200 = like 30
but i think im having same frames?
nope neverming
im getting 165 menu 60 gameplay
Yeah idk why one is capped and the other isn't
15 is good for 165 and i think 8 is good for 60
probably because it isnt
so my values are all wrong
hey, it's saying "attempt to perform arithmetic on hand_chips (a nil value)" when a hand is played. i know what's wrong but have no idea how to fix it, any help? apologies if this is a 'bad' question, i'm a newbie-
SMODS.Blind {
name = 'The Love',
key = 'bs_lov',
atlas = 'lovbossatl',
dollars = 5,
boss = { min = 1, max = 10 },
loc_txt = {
name = 'The Love',
text = { 'All hands start',
'at 20 Chips',}
},
discovered = true,
boss_colour = HEX('E05E69'),
modify_hand = function (self, cards, poker_hands, text, mult, hand_chips)
hand_chips = 20
return {mult, hand_chips, true}
end
}
yeah actually just tested idk what's going on then
Gl tho
wait
local hand_chips = 20?
oh my whole thing is invers
did you restart game that fast?
i have a game saved yeah
yeah nothing happened, same error
no clue why youre modifying hand_chips, youll get the same output from
return {mult, 20, true}
that was what i tried initially
any chance youre using talisman rn
maybe?
add talisman compat regardless but still
Is the return supposed to be an array or a table
i'll look and try to do it but
yea my whole thing is invers
:(
it should not be a table
oopsie
its not dt * velMult
it tells me to return three things, though?
im glad lua is like that i hate data structures
yeah
return thing1, thing2, thing3
iom gonna hopw its linear and we will be fine
as opposed to return {thing1, thing2, thing3}
local a = function()
return {1, nil, 3}
end
print(a()) -- {1, 3}
local b = function()
return 1, nil, 3
end
local a, b, c = b()
print(a) -- 1
print(b) -- nil
print(c) -- 3
alrighty, yeah that was my bad thank you
thus hand_chips is nil because it looks for the second argument returned
im sure you understand but gotta be thorough
np
might have accidentally made the exact same mistake as you
when i wrote that example
lmao
ok its almost working as intended
oh im going negative
ok i think its working maybe im not sure
works like a charm now, and i think it looks kinda nice too :>
thanks again for the help!!!
Anyone knows how to make this more separate? is the pack area of the shop. also, if i point my mouse close to the packets they get highlighted waaay far out of their "texture"
How do I run code after SMODS has put my stuff into the P_CENTERS table?
local obj = SMODS.Joker{
--bleh
}
local old = obj.inject
function obj:inject()
print("before registering")
old(self)
print("after registering")
end
Thx
for individual objects
should work with all gameobjects
alternatively hook SMODS.GameObject:inject_class if you want to do something immediately before or immediately after all centers are injected
this is a weird incompatibility error
the relevant patches/code on my end,,
i dont, get how its not sending a table-
is should, theoretically work, right???
the weirdest thing is that it doesnt look like it would break cryptid at all
rate my coding (I don't know what I'm doing)
What's the refrence for the CardArea that holds the played hand?
Are there any mods to have the card in hand appear bigger ?
context.full_hand
Jen's almanac has an edition that does so iirc
I'm gonna need a bit more than a line of code , if you will my friend 🙂 I'm just an noob
oh i'm replying to this message
oh my bad ! since I saw "hand" I tought it was for me x)
its ok lol
I looked trough their gethub and didnt find anything for it 😦
Jen's almanac doesn't exist on github
(don't ask me why)
it's available in the cryptid discord
Is there a link for that discord
it is the same jen, he just doesn't have it on github*
oh okay, sorry for the confuson
Nah seems normal to me tbh
none of that is your fault 😅
Where's the logic for the drawing cards into hand?
Nvm
does anyone here have documentation for blinds?
what's wrong with https://github.com/Steamopollys/Steamodded/wiki/08.-SMODS.Blind?
😔
how fun
Gotta love that screen
ayy nice
fr, my numbers just get to focking big
and yet, when i debug, it works flawlessly
Ewww put them at the end
awww
Trying to wrap my head around how the UI text elements work. If I want to write a piece of custom UI with a single highlighted word (like for example: a single {C:red}Red{} word amongst text) how do i get that formatting to be styled? I've got single-color strings rendering via G.UIT.T but it just prints out the formatting information.
if you aren't pulling from description localization, then use three G.UIT.T nodes back to back
Hmmm if i pass it through localization, can that handle arbitrarily formatted strings?
only via descriptions like Joker or Blind
ahhh gotcha
yeah they are supported aswell
do y'all know what i'm doing wrong here? it's throwing an error at the second if/then comparison that i'm trying to compare a table with a number, but i legitimately cannot find another way to get the chips for the hand
SMODS.Blind {
name = 'The Feast',
key = 'bs_fea',
atlas = 'feabossatl',
dollars = 5,
boss = { min = 1, max = 10 },
loc_txt = {
name = 'The Feast',
text = { '-2 Chips per',
'Dollar you have',}
},
discovered = true,
boss_colour = HEX('56845B'),
modify_hand = function (self, cards, poker_hands, text, mult, hand_chips)
if G.GAME.dollars > 0 then
if hand_chips - G.GAME.dollars * 2 < 1 then
return mult, 1, true
else
return mult, hand_chips - G.GAME.dollars * 2, true
end
end
end
}
(the "if hand_chips - G.GAME.dollars * 2 < 1 then")
classic talisman moment
wrap G.GAME.dollars*2 and 1 in to_big
? like if hand_chips - to_big(G.GAME.dollars * 2, 1) < 1 then?
apologies, it's been a late night
thank you!!!
and to prevent it from crashing without Talisman installed, add this to the start of your code:
to_big = to_big or function(x)
return x
end
(iirc)
works like a charm, thank you :>
what would i use to check how many cards the player has in their full deck?
#G.playing_cards
thank you!
anyone know how to stop this crash
all i know about it is it's something to do with joker retriggers but i don't understand what that means or how to fix it
Is it possible to disable certain blinds?
i mean if you do something like if G.GAME.blind.name == 'The Plant' then G.GAME.blind:disable() end
chat this might be my evilest invention yet
ok yeah this is too evil
im changing it to like 1 in 8
someone has to know about this 😭
that is probably one of the most vague crash errors
it's this line
i've been told i'm "not accounting for joker retriggers" but I don't know how to account for them?
the joker causing this doesn't do anything that extravagant and simplifying or altering its code has not helped
Maybe eval.joker.repetition is a table
i don't know what that is
well I can infer what it might be
but
what does that have to do with the joker
this is its code
maybe it's the pool flags?? that's the only idea I have but I need those flags
but why is that only happening when playing a hand with banana tree
Probably because it runs that line of code
I imagine the one you showed
that's line 1445 in the game's lua files
this joker is in my mod's lua file and no line is marked
I don't understand why this joker is causing this
But the line uses a variable that comes from somewhere else
that's what is confusing me
Hence the source of the issue is whatever changes that variable, if that variable is incorrect
It seems to be eval.jokers.repetitions
What does Banana Tree do
it gives +20 mult
after 6 unscored cards are played, it kills itself, removes gros michel from the joker pool and adds cavendish to the joker pool
that's it, that's all it does
Maybe there’s another Joker that’s the actual source of the issue
how would i figure out what joker it is
Which ones did you have in-game
Or maybe the way you’re manipulating the pool is the
this isn't during a hand where it'd be destroyed
the pool shouldn't be changing until it gets destroyed
the crash happens after the first hand is played, even if 0 unscored cards are played
1 negative eternal splash and banana tree when it crashed
2 negative eternal splash and gros michel when it didn't crash
i played the same hand (a single ace high card), seed, deck and stake on both
used the gros michel sleeve and splash deck for ease of testing
Maybe it’s Splash then?
It could be the deck of the deck was modified too

