#💻・modding-dev
1 messages · Page 350 of 1
ive done this
how do i grab the current scoring hand
Is there somewhere I can find all the tooltip keys?
where
in calculate?
yea
the localization files like en-US
context.scoring_name?
wdym
im asking if i can compare it to the most played hand
still dont understand lua super well, what is this line in strength doing?
local rank_suffix = card.base.id == 14 and 2 or math.min(card.base.id+1, 14)
i get the math.min part is so the rank doesn't go over 14 (ace) but idk what the card.base.id == 14 and 2 or does
ye
For anyone who wants a snake flip animation for cards left to right you will need to use twice to flip it back up 🙂 enjoy
if it's an ace it changes it to 2
gonna learn more in terms of how to do more intresting stuff but pretty cool for now
How do you exclude a joker from stake sticker collection tracking?
ooh ok
eternal_compat & perishable_compat
Just excluding the joker from the collection doesn't do that by default, seemingly
Neither of those things are what I'm referring to
stake stickers im guessing
can you get current mult scored by other jokers?
shaders are one of the few things it would probably not fail miserably at due to how many shader tutorials exist on the internet
like the total mult count at the moment or do you mean something else?
not that I support using gen AI
but this is one of the things it is actually useful for
yeah, like the current mult right before a joker scores its chips or mult or whatever
it's literally a global called mult
fantastic
Oh huh. Seems like there's no built in way to do this. You can omit decks, but not jokers. I'll have to add something to manually exclude it
hate this stupid squiggles
do u want me to tell u what's wrong
i dont even know whats wrong this seems alright
but the fact it keeps showing these makes me think somethings the matter
everything from atlas onwards is outside of SMODS.Joker
you can make the yellow squiggles go away if you open your balatro/mods folder in vscode instead of just your mod's folder
the yellow ones are there cause it doesn't know SMODS exists
Should this not be displaying a wild card tooltip?
the blue ones are there for other reasons that have to do with what N said
Ah alright. Ty
that is basically only for decks, is that a deck?
No, what should I use for a joker?
I've figured out a very scuffed way of doing exponential mult lol
info_queue there's an example on the wiki under localization/loc_vars
how can i see the cards left in the deck? i know G.playing_cards exists, but that gives me all the cards i only want the cards left
Sweet, I'll check it out.
G.deck.cards
tysm
currently, the joker with this code is turning negative even when it's already in possession. How do I specify if context.card_added to only this instance of the joker in particular?
10 jokers, 5 new blinds, and more to come as well
theres more im probably not mentioning but ah well
first you shouldnt use context inside an event
but can you elaborate on what it's doing?
or what you want to do rather
why do you need an event for this
all I want it to do is "if the player picks up this joker, make it negative"
what it's currently doing is "if the player picks up any card (including consumables and playing cards), make this joker negative"
i use it when i really get stuck with a coding problem but i still feel so guilty about using it, even though i am actively learning from it
idk 🤷♀️
why not? (genuine question)
you should do it on set_ability instead of calculate
like set_ability = function(...)?
imo that's fine
yes
better? Did I remove too much?
(moved here from #⚙・modding-general )
not sure if this counts as modding but does anyone know how the code works to swap the colors in the SPLASH_BACK shader once you get c++
I haven't been able to figure it out
(trying to debug why my menu didn't update when I got the achievement)
so you mean not from the .fs shader code?
god reading vanilla code is actually painful
I don't believe it's in the .fs file
or if it is it's not at all obvious how it works 😅
yeah i dont blame you
makes sense to me
im weak in shadermancy
I figure it has to have something to do with this
but then I don't see how col1 and col2 are being updated
one thought I had was that maybe it was setting it by a string key and not dot syntax but haven't found anything there either
fantastique
oh it probably just changed the color table
because Trance can change the colors
trance? the spectral card?
for more context this is what your menu is supposed to look like when you get c++
https://cdn.discordapp.com/attachments/1274739231654281317/1335715218906546291/Screenshot_20250202-155044.png?ex=681a773c&is=681925bc&hm=36033b9fd40f38e5d934a532833d4aba1a67c3143f2dd48c1344b726c1b59a2d&
oh completionist++
sorry lol
tbh anywhere outside the balatro discord I would have been more explicit haha
let me see if i can rummage through
but yeah I'm just trying to find the code path that makes it happen at the main menu
i know cryptid messes with the colors of the main menu
i think theres some hints in game.lua
does that help
i found this mod a little while ago
also can you not define multiple atlases? every atlas except the first is not loading
im trying to split each joker texture into a seperate image so its easy to add more
i have them all defined like this
yeah game.lua is where I'm looking
I see where the uniforms are being sent to the shader and all that I just can't find like
if (has_completionist_plusplus) then
flip_colors()
end
pseudocode obviously but
if I could find the logic that turns it on or off I could figure out why it's not showing up for me
ping me whenever/if ever (in case you change ur mind) you get this done btw
I cannot understand Lua broooo, idk why this isn't working
game was crashing so I looked through my code. Couldn't find anything so I decided to just reformat some stuff including deleting a comment... and that fixed the crash.
I just wanna trigger it when a 2 is destroyed
you can
Check the positions, maybe there is no image in the coords you picked for those jokers
oh oops
thanks
i have some tarot cards rn that look exactly like those placeholders 💀
idontknwo what hte fuck im doing there is probably like a list of things wrong with this code
someone please help 🙏
actyually i might have some idea of whats wrong ill return with different code that isnt working
it's a mod that lets yoy change colors
like to make themes
but yeah some of the colors it can change are for the splash, so they're just stored as normal colors in game
were were playing with any mods?
im pretty sure this is closer to what its meant to look like, though its crashing now
not since the sticker display feature got added natively
honestly I'm beginning to wonder if this is a mobile/console only feature lol
unless anyone around here plays on PC and has the colors showing up like in the picture I sent
for k, v in pairs(G.jokers.cards) do
if not v.ability.eternal then
eligible[#eligible+1] = v
end
end
local randomjoker = pseudorandom_element(eligible, pseudoseed('negative'))
randomjoker:set_eternal(true)
Hey all, I have taken this small script in order to make a random joker eternal. This triggers from a joker, but I want it to never pick itself. How could I do this?
I play with themes so much that idk what the difference is
I thought those two colors were just... the colors
but are they swapped or smth?
it's red outside and blue inside by default
when you gold all jokers (at least on mobile, where I did it before) it swaps

if anyone here happens to know I'd appreciate a ping
probably gonna give up on it for now though, it's not a huge deal
I don't understand why this wouldn't work
if not v.ability.eternal or card.config.key == "jokerkey" then
you have to do card.config.center.key i think
managed to get my challenge to show up in game, but it causes a crash upon selection, anyone have any idea why?
still seems to pick itself
starting to realize why this'd probably be easier to implement as a spectral card
When anyone can help, can someone please tell me how to make a context.remove _ playing _ card trigger when specifically a two is destroyed. Someone already tried to tell me, but I didn't get it right ._.
Balatro in C# would go so hard
because not is only applying to v.ability.eternal . you have to surround it in parentheses in order for it to apply to the rest of it
i assume you don't want it to trigger when the card's key is itself
correct
yeah but also i don't want to write more harmony patches in my life, lovely is so much better
Cryptid completely overrides create_card()
I'm wondering if it invalidates all function hooks to create_card() made by mods that load before Cryptid
yeah so you want it to look like
if not (v.ability.eternal or card.config.key == "jokerkey") then
thats what i had thought but this makes it still not work and crash if all jokers are eternal -- now i'm afraid the check doesnt go through at all
thoughts on the balance of this?
key = 'walkie_talkie3',
loc_txt = {
name = 'Enclose',
text = {
"Each played {C:attention}8{}",
"Causes a random joker to become eternal",
}
},
rarity = 1,
blueprint_compat = true,
atlas = 'ModdedVanilla',
pos = { x = 1, y = 1 },
cost = 4,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
if context.other_card:get_id() == 8 then
local eligible = {}
for k, v in pairs(G.jokers.cards) do
if not (v.ability.eternal or card.config.center.key == "walkie_talkie3") then
eligible[#eligible+1] = v
end
end
local randomjoker = pseudorandom_element(eligible, pseudoseed('negative'))
randomjoker:set_eternal(true)
end
end
end
}```
i think it seems fair enough for an uncommon, maybe a tad strong but i like the concept
how do i pick a random face card? i want to pick a random rank from J to K and a random suit. i dont want it to only pick cards from the deck.
dumb question
how do you set all poker hands a certain level through a deck
what does the crash screen say and also like what does the rest of the code look like
oh wait you already showed the code lol
something something index eligibile (a nil value)
i think first you have to check if #eligible > 0 before you get a random joker from it
then you wanna change pairs(G.jokers.cards) to ipairs(G.jokers.cards)
just have an array with the three ranks and then do pseudorandom_element(array, seed) on it
same thing with the suit but instead of "array" you put SMODS.Suits
Hi guys, anyone know which mod adds 'The Elk' boss blind? It was reported that whichever mod it is from has bad behavior with my mod
this has probably been done to death but this seems interesting enough
(this operation doesn't actually change what your final score will be, if done at the end of scoring)
more balanced than the Sync Catalyst that's for sure
good news! it no longer crashes!
...but it still picks itself
oh wait
change card.config.center.key to v.config.center.key
and then have "walkie_talkie3" be changed to "j_yourmodprefix_walkie_talkie3"
so Balance without actually increasing your score? seems fun
oh my god it works
thank you so so so very much for working with my incompetence
for k, v in ipairs(G.jokers.cards) do
if not (v.ability.eternal or v.config.center.key == "j_maro_walkie_talkie3") then
eligible[#eligible+1] = v
end
end
if #eligible > 0 then
local randomjoker = pseudorandom_element(eligible, pseudoseed('negative'))
randomjoker:set_eternal(true)
else
end
end
end
end
}``` (on the off but never zero chance someone has ctrl f'ed this, here is the fixed code)
i legit didn't realize what was wrong for a good few minutes either
Is the list of poker hands accessible anywhere organized by their priority rather than alphabetically or do I have to do that myself?
I would've thought that was what PokerHand.obj_buffer was but it still seems to access them alphabetically
the on_apply function here is meant to give each glimmering card its own random mult from 1 to 10, but it's just staying at 0 (from in config), anyone know why?
Okay it's G.handlist, cool
can someone tell me whats up with this
you closed SMODS.Joker before your joker code finished
@true glen
i said that before : (
well uh
math.ceil()?
consider yourself the true problem solver ig
it also didn't work when I used math.random() earlier cause i didnt know that was discouraged, so probably not the full problem
pseudorandom('funnyseed', 1, 10)?
Hey gang why does the card_eval_status trigger after the hand is done scoring
I'm trying to figure out why extra credit crashes the game with a stack overflow if combined with the mod this code is from, but if I remove the highlighted section, the crash goes away.
Said crash happens whenever you attempt to obtain a joker
yes, this is notepad, but I'm not coding, just debigging so it's fine :P
I think the issue might lay with Extra Credit using "quantum enhancements" features of smodded
See, get_enhancements also calls a context iirc.
And... well, you get a never-ending recursion.
this feels relevent
yeah thought it might be something like that
how do i made this centered
im surprised i havent seen anything from jen's almanac does anything with factorials
@willow plinth had experienced the same thing with one of mine and suggested a fix that I did in an earlier version. See these lines for fix.
Do so in the atlas image itself.
yea but also like
the thing with photograph and square/half joker
what happens if it flips?
forgor, use pixel_size = { w = n, h = n } in the definition.
how do i make it so this effect only runs once?
currently it can be retriggered
its an edition's code btw
and not context.repetition and not context.individual
@heady siren this might help? Like I said, I kinda Extra Credit and the quantum enhancements system itself for breaking things, not your mod, but it seems to be an inherent problem with any mod that uses quantum enhancements turning the feature on
thanks :p
oh
it didnt work
what are we doing
tryna do some shenanigans with patching editions' code
for a skill
i let the dummy joker retriggers all foil jokers/cards, which works, but it also currently retriggers the "increases the cards' chips" effect :p
i was wondering if theres a way to make it so it only runs once, regardless of retriggers
What if you call a special context that only is for edition upgrades?
if you're directly checking for foil why don't you just prevent the repetition from running at end_of_round
yeah thats what i tried to do, but im not exactly sure what context i need to use here
i mean adding not context.end_of_round here
oh i get it now yeah
I think they mean they get double and triple etc foiled?
chip wise
no i get that, that would prevent that
the problem is that it wouldnt retrigger foil gold cards
yeah, pretty much all seals/enhancements that rely on context.end_of_round wont get retriggered
can't you cotrol for that in the chip addtion code?
saying that you're the one doing that part too?
i was thinking about just having the dummy joker run through all jokers, playing cards, consumables to increase their chips and handle the message manually, but that doesnt seem like a good solution
I'd still delegate a special context to be called for upgrading edition stats.
thats probably a good approach
-# is there any mod that adds new contexts i can research from :3
joyo-
😭
Can you tell me what font says "Joker" on the cards?
does it??
i add like a dozen new contexts
dsalmdsa
i knew having joyousspring on my desktop just for code reading is a good practice
I mean yeah, because re-triggering end of round effects is something that follk do
sin't there a context for like... when the round is avtually done after gold cards pauoit? like when the win screen loads?
Do the SMODS.calculate_context({ editionupgrade = true }) and then check for context.editionupgrade.
though would that get retriggered by exiting and reloading the run on the win screen, lol
probably listen to the ones who know what they're on about like Toga though
where would i put that, though? im still tryna find the context code in joyousspring
actually, i dont even understand whats the purpose of calculate_context rn, i should take a look at that too
I know your pfp is most assuredly not a leafeon, and I'm pretty sure is a Transformer or similar, but the colors and my poor vision make me see a Leafeon unless I'm looking close
It is a TFOC, yes.
Can you tell me what font says "Joker" on the cards?
Consider calling that from your dummy Joker with context.end_of_round and not context.repetition and not context.individual as conditions.
question how can i make context.final_scoring_step retriggerable
as in joker retrigger
i have a card modifier that makes played cards return to the deck. while the card modifier works perfectly, the effect of returning them to the deck results in strange ghost cards on the deck ingame. what's going wrong with this? i'm simply lovely patching G.FUNCS.draw_from_play_to_discard() and draw_card()
is this how i add the new context? 🤔
im guessing i dont need Yggdrasil.calculate_context unless i want stuff to happen without requiring calculate, but just to be sure this is how to set up context's timings
I set a global variable called story_mode (default to true) via hooking Game:init_game_object()
and made a check here on starting a new run to have it apply a config variable (print() should output false as expected)
and for some ducking reason story_mode remains true in a run
can't seem to find the culprit because G.GAME.story_mode = something doesn't happen elsewhere
I hooked Game:update(dt) to have it print G.GAME.story_mode every 2 seconds and it's always true
wtf is happening
plasma joker is REALLY good, but it's not quite what plasma deck does
if you use it at the end of scoring, it doesn't change your score at all
my blind description is two sentences and you know the text popup when you enter the blind i get two sentences next each other in a single line
is there a way to force a newline in that
omg hi void :D
-# wait crap forgot to turn off reply ping
Hi, I was digging through the cryptid files for some inspiration for my own mods and noticed that Cryptid had its own global variable name. This is probably a dumb question, but does anyone know how this was defined? I tried it myself and I couldn't get it to work
don't add local in front of your variable
^
also, im pretty sure that text pop up uses DynaText, you would need to patch that (or the code that creates the DynaText to have two DynaTexts created), probably
I didn't define it at all, I thought it was a given. Thanks!
since DynaText doesnt really support multi lines rn
hey, i'm trying to add a blueprint ui to a custom joker, and make it point to the left card instead of the right. but atm, it's always displaying nil. anyone know why that is and/or how to fix it?
hi
👋👋👋👋👋👋
changed it to string instead of boolean and wtf it's still always taking the default value 😭
that align doesnt look right
why are you checking card.ability.blueprint_compat_ui here? or im probably misunderstanding what its for
-# and also the weird scale too, but its fine
well damn I'll just write it as one long sentence
what are you doing here 🤔
also, are you still running balatro with like 20 fps lol
this is ctrl+c ctrl+v from the blueprint code, the whole main_end section
oh
except self is changed for card
I'm trying to tie a mod config to a saved run so that changing it mid-way won't affect in-progress runs
yooooooo
yeah text is always nil and grey
like i said in #⚙・modding-general, this crash log doesnt really tell anything sadly
oh, i see i see
on starting a new run (args.savetext is nil), G.GAME.story_mode should take the config value
alrighty, debug time it is 😭
print() outputs false as expected
-# i was about to ask for more explanation, but you are doing it already so thats nice
but the per-2-seconds report says otherwise
btw a lobcorp joker set my mult to 0 at scoring so this might be the cause but idk
mmm i dont really think it should affect anything
no idea why a G.GAME variable respects changes but then suddenly not
hm
not to mention a while ago it worked normally (respects changes and stays the same)
this theory looks right, it's printing nothing to the console
let me try out blueprint_compat
nothing there either
question, what does per-2-seconds report mean here, does it print that out every 2 second?
I don't know a lot about saving and loading, but can you just run gsr first and then check if G.GAME.story_mode is nil?
😭
i had the same idea, but i wasnt sure about it lol
if you check prehook you're not actually checking for saved data
since the saved data gets pulled in start_run
you should make sure to check G.GAME.story_mode == nil instead of not G.GAME.story_mode, by the way
iirc
oh yea, btw pre-hook actually works on anything but story_mode
wait nvm
is that so
im in bed but im pretty sure start run contained the code to load saves
💀
Hi, when I try to run this code, I get the error that curr_obj is nil. Any ideas why?
Syntax error: functions/state_events.lua:1235: 'end' expected (to close 'function' at line 953) near 'else'
Additional Context:
Balatro Version: 1.0.1o-FULL
Modded Version: 1.0.0~BETA-0505a-STEAMODDED
LÖVE Version: 11.5.0
Lovely Version: 0.7.1
Platform: Windows
Stack Traceback
===============
(3) C function 'function: 0x2737cf38'
(4) global C function 'require'
(5) main chunk of file 'main.lua' at line 931
(6) global C function 'require'
(7) LÖVE function at file 'boot.lua:323' (best guess)
Local variables:
c = table: 0x2737a5a8 {identity:false, version:11.5, accelerometerjoystick:true, modules:table: 0x2737a5f8, gammacorrect:false, title:Balatro, externalstorage:false (more...)}
openedconsole = boolean: false
confok = boolean: true
conferr = nil
(8) global C function 'xpcall'
(9) LÖVE function at file 'boot.lua:362' (best guess)
Local variables:
result = boolean: true
(10) global C function 'xpcall'
(11) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
I deleted all mods that have been updated since it last worked
and no dice
so it's smodded breaking changes
that seems to be smods, or a lovely patch that went wrong
Cryptid the global variable is equal to SMODS.current_mod
it's a pretty hearty smods dif
the loc files make it look worse
but still there's a lot of changes to newcalc
that didn't fix the issue, but thanks for the tidy up
that's uh... pretty much every patch in the file
(line 29 is if curr_obj.init then
what sucks is the dumpwon't help me at all. it could be anywhere within at least 288 lines
I say at least, because luajit/love2d just be like that
all that's clear is there's some sort of weird syntax (doesn't even have to be an actual missing end)
and it's probably somewhere in the vacinity of the 288 line spread layed out
lmfaoo
probably caused by steamodded patching close to where mods want to patch
bro cooked and the whole village had a famine
-# ...do consumables even support eternal_compat?
i dont think so
mmm idk, thats all i can think of when i look at the crash log :p
i havent seen stickers on consumables before, now that i think about it
this is ridiculous
LMFAO
not sure what youre going for with the blm joke but its very 
How is perkeo retriggerable?
WARN - [♥] Pattern 'if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' for pattern patch from Talisman\lovely.toml resulted in no matches
WARN - [♥] Pattern 'if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' for pattern patch from Talisman\lovely.toml resulted in no matches
WARN - [♥] Pattern 'if effects[ii].message then' on target 'functions/state_events.lua' for pattern patch from Talisman\lovely.toml resulted in no matches
WARN - [♥] Pattern '--calculate the card edition effects' on target 'functions/state_events.lua' for pattern patch from Talisman\lovely.toml resulted in no matches
WARN - [♥] Pattern 'if effects[ii].edition.p_dollars_mod then' on target 'functions/state_events.lua' for pattern patch from Talisman\lovely.toml resulted in no matches
WARN - [♥] Pattern 'if edition_effects.jokers.x_mult_mod then' on target 'functions/state_events.lua' for pattern patch from Talisman\lovely.toml resulted in no matches
WARN - [♥] Pattern 'else\n mult = mod_mult(0)\n' on target 'functions/state_events.lua' for pattern patch from Talisman\lovely.toml resulted in no matches
WARN - [♥] Pattern 'G.GAME.current_round.free_rerolls = #chaos' on target 'functions/state_events.lua' for pattern patch from Ortalab\lovely\coupons.toml resulted in no matches
WARN - [♥] Pattern 'G.GAME.current_round.voucher = get_next_voucher_key()' on target 'functions/state_events.lua' for pattern patch from Ortalab\lovely\coupons.toml resulted in no matches
WARN - [♥] Pattern 'G.FUNCS.evaluate_play()' on target 'functions/state_events.lua' for pattern patch from Ortalab\lovely\jokers.toml resulted in no matches
WARN - [♥] Pattern 'if effects[ii].message then' on target 'functions/state_events.lua' for pattern patch from Ortalab\lovely\jokers.toml resulted in no matches
WARN - [♥] Pattern 'G.GAME.current_round.hands_left = G.GAME.round_resets.hands' on target 'functions/state_events.lua' for pattern patch from Ortalab\lovely\zodiac.toml resulted in no matches
WARN - [♥] Pattern 'if G.GAME.blind.name == \'The Serpent\' and' on target 'functions/state_events.lua' for pattern patch from Ortalab\lovely\blinds.toml resulted in no matches
INFO - [♥] Applied 109 patches to 'functions/state_events.lua'
here's the log on state events
might be useful
Actually, any "card" technically does.
its not that deep lol.
the symbols look similar
also where do you think thunk got the inspiration for raised fist lol?
cryptid figured it out
pretty interesting
like perishable consumables
on higher stakes
cryptid created their own function for it
I mean, I get why it fits raised fist, and it just seems like a shitpost loc file?
lmfao???
i don't think it's supposed to be a big thing
yeah its
that
exactly lol?
"all art is political" mf
no?

I mean... the name fits and the rest is just the same words used for the same things as the rest of the loc
yeah
its like
i changed everything LMFAO
incomprehensible lol
would evicerate a pesant from dark ages
im always weary of dogwhistles these days
Raised fish
some have a beer
actually?
i like this SO MUCH MORE lol
gimme a sec
what if i put a fish in the fist LMFAO
Edit a png of a fish on there
YEAH LOL
I notice that lovely and talisman are missing a lot of patches
lemme try to delete those one at a time
Blind: I have a huge score req.
Raised Fist: I has fish
ortalab not lovely
smh brain
could you elaborate
I mean... it does the thing twice
peasant: "I can't read"
real shit
and idek if it uses the blueprint logic
lol
Perkeo doesn't return anything, so it wouldn't retrigger, also I copied it's code exactly and it didn't retrigger.
idk what retriggers mean in this context
unbelievable
i presume having the perkeo effect go off more than once during the end of shop context
i gotta go fellas
might be something finicky with the end of shop context
i remember trying to work with perkeo's code was really finicky
retriggering a joker in context has the game basically "copy" the joker and do it again
its not like a blueprint
its like 2 jokers
No, I literally copied the perkeo effect exactly, and I put in the context.ending_shop context and it didn't retrigger.
but you only see one
...? really
that might be a steamodded thing
isn't that just what blueprint does with no defined behavior?
i did something similar a while ago one second
i recall vaguely running into a similar issue
someone told me that if you don't define blueprint behavior it basically does exactly like you said
Hi there, does anyone know why this error is occuring and how to fix it?
Syntax error: functions/state_events.lua:742: 'end' expected (to close 'function' at line 586) near 'else'
Additional Context:
Balatro Version: 1.0.1o-FULL
Modded Version: 1.0.0~BETA-0505a-STEAMODDED
LÖVE Version: 11.5.0
Lovely Version: 0.7.1
Platform: Windows
Stack Traceback
===============
(3) C function 'function: 0x1239cf38'
(4) global C function 'require'
(5) main chunk of file 'main.lua' at line 879
(6) global C function 'require'
(7) LÖVE function at file 'boot.lua:323' (best guess)
Local variables:
c = table: 0x1239a5a8 {identity:false, version:11.5, accelerometerjoystick:true, modules:table: 0x1239a5f8, gammacorrect:false, title:Balatro, externalstorage:false (more...)}
openedconsole = boolean: false
confok = boolean: true
conferr = nil
(8) global C function 'xpcall'
(9) LÖVE function at file 'boot.lua:362' (best guess)
Local variables:
result = boolean: true
(10) global C function 'xpcall'
(11) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
newest smods breaks talisman
this is just those two
well, this is the first issue I've had
and 99% of time it's the other way around recently
try this
where mods will need the nwer commits
once again i get these infinite logs when trying to load a previous run
INFO - [G] Error unpacking string: [string "return {["cardAreas"]={["riftraft_void"]={["c..."]:1: attempt to perform arithmetic on global 'inf' (a nil value)
INFO - [G] Error unpacking string: [string "return {["cardAreas"]={["riftraft_void"]={["c..."]:1: attempt to perform arithmetic on global 'inf' (a nil value)
INFO - [G] Error unpacking string: [string "return {["cardAreas"]={["riftraft_void"]={["c..."]:1: attempt to perform arithmetic on global 'inf' (a nil value)
INFO - [G] Error unpacking string: [string "return {["cardAreas"]={["riftraft_void"]={["c..."]:1: attempt to perform arithmetic on global 'inf' (a nil value)
INFO - [G] Error unpacking string: [string "return {["cardAreas"]={["riftraft_void"]={["c..."]:1: attempt to perform arithmetic on global 'inf' (a nil value)
INFO - [G] Error unpacking string: [string "return {["cardAreas"]={["riftraft_void"]={["c..."]:1: attempt to perform arithmetic on global 'inf' (a nil value)
please if anyone else sees this notify me+
i'm sure it'll work fine, if I don't happen to have any mods that need a newer version, but I'm also running a modpack
it's some random mod borking up saves
right right right
do you have extra credit?
ye
ah fair
I just know that my stack overflow bug which was very different I think, was because quantum enhancement code was being ran due to the presense of a mod that used it, extra credit, and it created an infinate loop when combined from a hook of calculate_joker from another mod
Hey there, I've got this code to load additional lua files as a part of a mod, but I'm getting this error message and don't know how to fix it. Does anyone know? (line 29 is if curr_obj.init then
you are massively overcomplicating it
I LOOKED FOREVER IN THE WIKI
which i see is the function you're using
but you're doing very complex things with it
THANK YOU SO MUCH
yw :3
it's on the Utility page
very bottom of the sidebar
i am making a wrapper around balatro's ui system because it makes me weep
what do y'all think
the idea of these is basically, you can declare your own modules and add them to the UI library so you have like
UI prefabs that you can recycle between things
I'm currently working on making a rudimentary config builder
so that configs are easier to read and manage
we're talking about function chaining here
stuff like that
i'll probably separate this from Balatrostuck once it has a decent amount of prefabs and let people play with it
So... here's my idea of the hierarchy of how to accomplish a given goal fir a mod most compatibly and ideally
Smods methods > game methods > love.[] methods > lua methods > hooks/patches
What are yall's thoughts on this?
smods methods can't be trusted 80% of the time because there's so much undocumented stuff
i just go by precedent of "whatever fixes the problem the soonest"
like yeah i could try to get smods to cooperate for 2 hours but i also could just hook into a game method and get it done that way
Well... that's probably not good for compatibility which is the goal I'm aligned towards as a modpacker
But game methods are fine too probably
i think a playable mod is better than a perfect mod
and whatever gets it to playable state faster is better for me as a designer
Well.. the issue is that in a larger mod ecosystem it might cease to /be/ playable
which isn't a problem for me because i'm not expecting it to work in a larger mod ecosystem
it's ultimately two different approaches
i care about getting things done, you care about having mod compat out of the box
you can get things done first and then worry about compat imo
Fair enough ig, especially in the context if something like balatroatuck
The typod ifg made that seem super passive aggressive lol
Was not intentional
thats fine hah
if there any way to change the "saved by mr bones" message for modded cards? I've had a look and it seems the save = true function uses ph_mr_bones from the localisation
I've seen it changed before
Return the loc string as saved = string
What do you think of my take here?
.
I don’t think there’s any need for a hierarchy, smods methods mostly just make it easier for people to do, if they want to use their own methods instead that’s fine but it might open them up to unintended side effects
Well yeah I'm taking mostly for purposes of compatibility within a greater molded ecosystem
Which tbh I think is a good goal to have in most cases
for the life of me i can't figure out how to make a custom menu UI thing help idk. I have read the SMODS documentation and I am not understanding.
-# trying to make shit appear when you press a certain key, idk
-# help
Can you tell me how to change the location of the Jokers in the collection?
As far as I am aware, the order of jokers in the collections are the order in which they are defined.
So, as far as I know, you cannot have your jokers before the vanilla ones.
What you can, tho, is define your jokers in a different order (usually just move your code around) to change the order of your jokers.
I have each Joker as a separate file.
Then the order in which you load said files.
I'm uploading just the folder, not each individual file
huh?
Code?
You can just download the folder they're in
anyone know what this is supposed to achieve? specifically the -math.huge?
are you making a mod or just playing them?
I think there's confusion afoot
I already made the mod, I wanted to change the order of the Jokers, I thought it could be done in code
you can, but if you're loading your jokers in a loop, then they;ll be in... well I guess alphabetical order of the filenames or something
because they're displayed in the order loaded
when returning anything other than true it doesn't work
at least that's my impression
Then you have a smods build that isn’t new enough for this feature
That's right, I was wondering if there was any way 🙂
Oh, SMODS.saved is a thing now? I can remove my Lovely patch for the custom saved text then. What commit added that?
so... I went back to the latest release of my modpack just to see how many lovely patches are missing.... turns out it's a lot. Apperent;y talisman has always messed up the order of state events, so that one makes sense that the ortalab patches there aren't hitting,what's weirder is a lot of the talisman ones themselves also aren't.
Anyone up to looking through this and decifering anything you see that truly might cause issues?
Besides ortalab and talisman (which also both misse patches on other files) I remember seeing missed patches from toga, prism, and betmma
order them by changing the file name?
it's janky but should work
unless you derive the key from it
Is there a way to check for a specific boss blind?
I presume there's a pool for those, and you just check if they're in_pool
G.GAME.round_resets.blind_choices.Boss is a string.
ah fair
I guess it makes sense that the blind system was designed different
(I don't have any proper mods yet and talk out of my ass a lot)
ah ty, for some reason I'm not getting the text out put, it just says error, I'm prob just doing somthing stupid
A direct localization string, not an actual message... 🤔
I'd thought a message string would be the one being passed through, not the key for it.
it allows for more flexibility this way?
if I'm conceptualizing it right
any good ideas to prevent Mr for being a bit too late?
Now that we are on the topic of saved™️
I don't remember why I did it that way
Oh yeah, since that commit, my method of custom message was borked, lmao.
doesn't this make it so you can more easily change the string externally if you so desire?
It'd make more sense to already accept a proper message string, not do the localize right then and there.
I suppose it forces people to use localization rather than hard code a message
I think it was because the mr bones text is localized in the moment, so I wanted a custom one to follow the same pattern
Such is fair too... I'll need to update my minimum SMODS version as well.
and like I was thinking, doesn't it make it so other objects can modify a joker's saved messaage more easily?
I can see why you might wanna do that in some cases
Either method would work in almost exactly the same way
I just chose this one I guess
ah fair, fair
Somewhat backwards to be passing a string directly as a variable, not a message, but that's just my two loops.
ah yeah I think I get what you mean
I really do wonder how much content in my modpack just isn't functional because of all these missing patches, and how many literally don't matter and miss even for the creator, lol
Still puzzled how to make seal display proper chances of its' own, though... here, this individual seal had the chance set to 1 in 10, but it still displays 1 in 25 of the prototype.
it's for this blind from mistigris
and leads to this when trying to continue any run: INFO - [G] Error unpacking string: [string "return {["VERSION"]="1.0.1o-FULL",["BACK"]={[..."]:1: attempt to perform arithmetic on global 'inf' (a nil value)
seems like mistigris needs talisman and is not just compatible with it? idk
reproduction is literaly this btw:
- start run
- play a hand
- go to main menu
- try to continue the run
latest smods, lovely and mistigris
i've used this method for a joker, although when the joker's flipped the soul sprite stays on, and im not sure on how to fix it
I think they were going just for compat
though for me, just having talisman has given few issues
I just set the scoring to vanillia
they were going for that but seems like saving a -math.huge value into a run is no bueno in vanilla
oh yes, i think it just puts -inf there
should be an easy fix
on vanillia i mean
is the fix in question enabling talisman and setting to vanilla numbers?
because talisman is completely fucked for me
I meant if they were to fix the code
can't even select a card
to not do that
ah ok
because it seems like an oversight
but i wonder why this isn't just -1 or 0...idk why negative infinity is needed here
i get why negative infinity is used now
but i guess the default could be set to something more reasonable
or just have 2 cases
or actually, yeah
just set it to nil by default, and check for that in the blind
alright, it's PR time
in general..
ah sorry
do you need the context for joker calc? or somewhere else?
calc
and with "in a blind" you mean like just in a run, i guess?
actively playing inside the blind
I presume 💔 mean in a well... blind
Whats the effect
where they play cards
im just making it so if this card is sold while inside the blind the blind req is increased
(couldn't pass up the oppurtunity to use emoju neos) :P
but you used the wrong one
oh broken heart
I am in fact.... blind
I noticed right after you said
whoopsie
made a FoolishCoonie out of myself once again
fixed it anyway, lol
I am curious exactly what makes it fucked for you? Like... I beleive that it no make worky, just curious on the specifics
No for tsutje
oh fair
just didn't see where 💔 gave enough info before that for that question to follow
I don’t remember the blind check off the top of my head
G.GAME.blind maybe?
I don’t remember if it gets cleared or not
That's what I did, just added the letters in order to the file name a_..., b_..., c_…😂
I think you forgot to reply to me
G.GAME.blind.boss for if current blind is boss.
but yeah, if it works it works, lol
I've also seen in some mods in Joker's settings there is an order, what is it responsible for?
also, it's so weird to have another person with Coonie in their name here
though you don't seem to be a raccoon?
I think it was for that, but for obvious reasons it doesn't make anu sense to keep around
well actually maybe not
it would make sense for it to work within a mod, if it was for that
but it might not have been at all
I'm from a slightly different country and the word has a different meaning😀
They probably have some other method that orders them before injection
It doesn’t do anything by itself
are you reclaiming it or being racist, lol
I know it's a slur in multiple countries
I just don't use it like that
I mean it was a thing in really old mods
and is in vanillia
is it supposed to be the collection order?
Yes, but I’m not sure it even does anything in vanilla either
G.GAME.blind.in_blind
And I use just to show that I like it, the act itself, if you know what I mean😉
it just freezes and gives infinite logs when selecting a card
guess it's not compatible with latest smods or latest lovely main branch
with nothing else?
mistigris and nothing else yeah
can't be smods because it had a different problem with talisman of it crashing at boot, but then was fixed
lovely main maybe because that's way ahead of the release
yeah idc anyway, don't wanna introduce talisman to my mess
hims manages with mine :P
mostly hims just exist and slep
so other mods don't run away
hims?
Does anyone know why when I discard the sealed card, it removes way more discards then needed? I only want it to lose 1 discard when you discard that specific sealed card. Code is attached
peak quality screenshot
try adding card == context.other_card
My absolute peak screenshot quality (Totally not just a screenshot from my friend's discord stream)
i wish i had friends 😢
same
same
sagatro
a manual crasha??
That is the most aesthetic crash window screenshot I've ever seen
how much do you have to hate users to do this when something goes wrong
i don't like this mod developer
oh that's
you
ok makes sense now
lmao
lol
i think that's just a normal mac screenshot
When you think about it, almost every crash is a "manual crash" caused by a dev somewhere deciding when to halt their program
DebugPlus' eval returns the error message as a string without causing any real crashes
I had to find a workaround for that
a side debugging
i fear you
lovely works differently on Mac, I'm just attempting to use the R key on the crash screen to restart the game as smods intended to
that's a thing?
deadass had no idea
this thing right here
I have to modify it accordingly
since I'm using lovely-integrated LuaJIT instead of running via a shell script
you and @willow plinth should talk
eval G.GAME = nil
pffft. "Okay then Balatro, let's just go nini"
ability to set fonts for the text so you can have whatever language you want to alongside a way to define fonts to be used
sounds like a really good idea to me
lets people use any unicode character as long as they provide a font that includes it
looks notmal to me
I guess the text shoulda read redeemed all along
you got these off scalpers and haven't turned them in yet
i love buying vouchers
How do I set a custom consumable type's shop rate?
Do you guys have balatro.exe archived?
sending it would be piraxy, lol
why would you even ask that?
and wym archived?
sorry I assumed too much from a simple question I don't quite know what is supposed to mean
am curious what you mean though
hell yeah
John Smodder 🫵
Bump
I need to see the misprint joker code and I'm not at my computer, I'm writing from my phone for now😀
Try putting it outside of the event?
well next time you''re at your pc, copy an unzipped copy of the exe over
I have one on my phone to look through
I'll do that next time
I'd appreciate it.
my way of doing things is still more convoluted, not even close 😎
local temp_Mult = pseudorandom('misprint', self.ability.extra.min, self.ability.extra.max)
return {
message = localize{type='variable',key='a_mult',vars={temp_Mult}},
mult_mod = temp_Mult
}```
this seems to be be pretty much all of it
no ot all of it
but idk where the other shit is

can G.FUNCS.draw_from_deck_to_hand() draw specific cards from deck?
You can check draw_card() function in source code
it can draw specific card
yeah @frigid blaze I think that's all, reletively simple for thunk code
not much different from smoddede code besides the eqivilant of the calculate functiion being in an entirely different fucking file from the defintion
Thanks bro, can you throw in more DNA😉?
wym?
what do they mean with "throw in more DNA" is the better question 💀
💀
idk, and they never did respond to this https://discordapp.com/channels/1116389027176787968/1233186615086813277/1369255736567398521
oh so dna is either racist, sexual or just harmless reference to the vanilla joker, perfect
Dnk
or they're asking for the whole file, lol
that.... doesn't help
😭
pretty sure bro meant https://youtu.be/VJy8qZ77bpE
こんばんは
2020.08.05 mini ALBUM『朗らかな皮膚とて不服』でました:)
CD https://lnk.to/ZTMY_HHTH
Streaming/DL https://lnk.to/HHTH_DL
*For people who live outside of Japan, you can buy at CDJapan.
『眩しいDNAだけ』 Music Video
Lyrics & Music & Vocal : ACAね
Arrangement : ぬゆり
Illustration & Animation : sakiyama
...
it has DNA in the title
i must be correct
zutomayo !?
are you surprised
not reallt
this just haunts me sry
what does that even mean
can you throw in more DNA😉?
im scared
we should put 🚃 in balatro
what if we add all emojis from discord to balala as jokers
i just think of the half life 2 train sound when i see that emoji
wake up and smell the ashes
loud af train horn
i'm kinda surprised some train/public transport nerd didn't already
thanks gman
also there is no thomas the tank engine mod yet???
alice from black souls???
yep
im still traumatized after playing both games
How do I recursively add extra to a return table again?
...can't exactly do such manually, need to do such according to a calculated amount.
for i = 1, amount do
return_table.extra = effect
return_table = return_table.extra
end
something like that
if the effects can also have an extra table i have another loop in my mod i can send for that
Nope, the effects don't have any extra.
then that should work
?
the table in the loop needs to be a temp one
like local return_table = result
result will only have the last extra table if not
Why you need this in a first place?
looks correct to me
I would like to have a joker do it. Making an ultrakill mod and I'm having that be part of Midas effect
😭
then you can do
if context.individual and context.cardarea == G.hand and not context.end_of_round and SMODS.has_enhancement(context.other_card, 'm_gold') then
return { xmult = value }
end
Got it, thank you
Would that also do chips or no?
yeah
yes in calculate
Thank you, very new to all this
lol
trying to make a joker that stops glass cards from breaking. ive got a function that should in theory do it but ive been told that glass cards have their own check? im not sure where this check is or what im meant to do with it
im pretty sure theres a mod that does this lmao

ours isn't implemented yet, though
just a concept for now
💀
well you're technically the first one then
can you send me the code so i can check myself
true but i was mentioning it because maybe you could check its source code
im pretty sure all glass cards use :shatter or something to actually be destroyed
SMODS.Enhancement:take_ownership('glass', { calculate = function(self, card, context) if not next(SMODS.find_card('j_grat_abyssjoker')) and context.destroy_card and context.cardarea == G.play and context.destroy_card == card and pseudorandom('glass') < G.GAME.probabilities.normal/card.ability.extra then return { remove = true } end end, })
and then a joker with 0 functionality
so if you hook to that function, maybe it will prevent the glass cards from being destroyed?
you can see here that another mod prevents glass from breaking, with the joker key j_grat_abyssjoker, you should be able to do the exact same by patching that line and putting and not next(SMODS.find_card('j_blahblahblah'))
j_grat_abyssjoker is my joker that im trying to make disable glass 
😭
its not working which is the whole point
oh LMAO
lmao
hmm
bumping this cause im not sure what they were talking about
i assume thats what shatter is
try
local hookTo = Card.shatter
function Card:shatter()
if not next(SMODS.find_card("your joker key")) then
local ret = hookTo(self)
return ret
end
end
maybe that will work?
i was about to send something like this i hate you
grab a bunch of all 6s to check
but also i think you could try just patching base functionality if all else fails
good idea, still works
i think theyre just doing something wrong :3
where do you have this
question, does context.card return the card thats being sold?
i think the glass is shattering from all this pressure
no that would be crazy
at the start of the main.lua file before any of the joker effects
wha
and are you sure the key is correct
no it is the card being sold
no that would be crazy
why isnt it context.other_card for consistency though
im going to guess its a vanilla thing
i was too used to context.other_card being the targeted card of contexts, so when i read that i immediately got confused
🥀
but thanks for tolerating my dumbness lol
anyway
im sure
can i see the full code
because it should work
also whats your smods ver
the jokers code is
`SMODS.Joker{
key = 'j_grat_abyssjoker',
loc_txt = {
name = 'Abyss Joker',
text = {
'The effect of {C:attention}Glass Cards{}',
'is reduced to {X:mult,C:white}X1.5{} Mult,',
'{C:attention}Glass Cards{} will {C:attention}never break{}'
},
},
atlas = "Jokers",
pos = {x = 4, y = 0},
rarity = 1,
cost = 4,
config = { extra = { }},
loc_vars = function(self, info_queue, card)
return {vars = {}}
end,
calculate = function (self, card, context)
end
}`
so not much
it was just abyssjoker before and that was also not working
your key right now is j_grat_j_grat_abyssjoker
can you try again with the proper key :3
no, we mean in the joker
i did and it didnt work 
i will again for redundancy
ok thats weird
i think the 4 wanted to shatter but cant?
funny
the card might be him
that didnt happen to me tho
[TITLE CARD]
it's not great practice probably but should I make each joker into it's own file or should they be in the same one?
i dunno why i didnt do this sooner heres the whole mod file
Remove the shatter hook.
Hello best friends
hi dilly
Does anyone have the code for the DNA joker handy?
ok, the cards are back to just shattering
ill try keeping the shatter hook and not the other function
Hey I'm thinking about making my own mod that just changes the cards texture and I've never made a mod before so is there anything I need and is there a video I could watch to do this
if self.ability.name == 'DNA' and G.GAME.current_round.hands_played == 0 then
if #context.full_hand == 1 then
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
local _card = copy_card(context.full_hand[1], nil, nil, G.playing_card)
_card:add_to_deck()
G.deck.config.card_limit = G.deck.config.card_limit + 1
table.insert(G.playing_cards, _card)
G.hand:emplace(_card)
_card.states.visible = nil
G.E_MANAGER:add_event(Event({
func = function()
_card:start_materialize()
return true
end
}))
return {
message = localize('k_copied_ex'),
colour = G.C.CHIPS,
card = self,
playing_cards_created = {true}
}
end
end
this one?
ah nvm i was late
Thanks, bro.
A playing card, or a non-playing card?
yeah the shatter hook just makes the cards linger on screen instead of shattering
Playing card
oof, i guess theres something else in the shatter code that still needs to be there, i didnt read it so i just assumed it doesn't need anything
you can go with the take_ownership method then, sorry
yeah i knew that much, thats what i was asking about in the first place
Try starting here: https://discord.com/channels/1116389027176787968/1349064230825103441
bump
Thank you
ohhhh this shader is so inspiring to me. - https://glslsandbox.com/e#109628.0
Galaxy Edition card
If the background input color is white, apply a shifting galaxy cloud affect (so clever how they acheived that too, through recursion!)
If the color input is above say 40% saturation we will assume we want to preserve the input color and instead do the psuedo glittery affect
one weird thing is the input format of time seems pretty different from the game vs most walkthroughs for some reason I don't know
Try replacing the take ownership with this: ```lua
SMODS.Enhancement:take_ownership('m_glass', {
calculate = function(self, card, context)
if next(SMODS.find_card('j_grat_abyssjoker')) then
return nil
end
if context.destroy_card and context.cardarea == G.play and context.destroy_card == card and pseudorandom('glass') < G.GAME.probabilities.normal/card.ability.extra then
return { remove = true }
end
end,
},
true)
oh thats gorgeous
i have a card modifier that makes played cards return to the deck. while the card modifier works perfectly, the effect of returning them to the deck results in strange ghost cards on the deck ingame. what's going wrong with this? i'm simply lovely patching G.FUNCS.draw_from_play_to_discard() and draw_card()
did you delete it?
they still are breaking 
i did and it didnt work. what youre replying to is me trying the hook instead of the take ownership
Ok, what is your code now?
Your problem is not the method because it works for me, it's probbably something else
heres my version
thats old
the only mods ive ever had installed are this and debugplus 1.4.2 so i doubt its mod conflict
-# no trust me thats what i believed too
i have no idea how to navigate github im just going through here
ah cool
try returning the cards using the event manager with an after value. I think your animation of returning them is conflicting with the state_event of drawing down cards from the deck, making these ghost cards
ooh, yeah that's fair. so put the draw_card() part in an event?
im not seeing a green button or a version 0502
exactly!
hmm alright, i'll have to try that in a bit





