#💻・modding-dev
1 messages · Page 533 of 1
whats the question
is there a context for add/remove from deck for stickers
i mean there's apply
but i don't know how to use that
apply will occur whenever it shows up in the shop lol
is this for the extra joker slot
yes?
thats hard
yes
hi me
theres a context 0for add and some different ones for remove but isk iif theyre called on themselves
hey you
hi me
also they are most likely not called when removing the sticker or applying it
do you play balatro metherulo
I haven't in a while
i would just do it in update tbh
i like to play balatro
what about you
it is a nice game
crazy
game is good
it is so good
agreed
i enjoy it
me too
do you like cats
cats are chill
bro when is lovely adding godot support brooooooooooooooooo pls i need godot support😭😭😭😭🥺🥺🥺🥺🥺🥺
never
from ace attorney?
you dont need godot
godot is bad
real
love 2d
i love 2d
i love love 2d
i don't how to say it
did you guys know
if you press right click to open the context menu
then hold your mouse button
it doesn't do anything
until you release the button
when applied, by default it gives +1 joker slot, when removed, it removes the slot, how do i do that with my sticker?
(left button btw)
idk but it's probably like
if custom.sticker is on joker
add.joker.slot(1)
--EDIT: I'M FAMOUS
wait let me see
only reasonable way is through update
ok i can't find it
i don't know the exact logic for that though
i'm using tenebris from exotic.lua as reference
add_to_deck = function(self, card, from_debuff)
G.jokers.config.card_limit = lenient_bignum(
G.jokers.config.card_limit + math.min(card.ability.immutable.max_slots, to_big(card.ability.extra.slots))
)
end,
remove_from_deck = function(self, card, from_debuff)
G.jokers.config.card_limit = lenient_bignum(
G.jokers.config.card_limit - math.min(card.ability.immutable.max_slots, to_big(card.ability.extra.slots))
)
end,
too cruel
<@&1133519078540185692>
this person is sharing free robux scam
no it's not
i've seen these before
scammer
man.
we're friends
BANNED
methrul is my friend
oh m
DUDE
lol
robox dot COM
HOLY
love you mods but also wtf
I'm kidding
Nickelback's latest album, The Best of Nickelback, Volume 1 is available now on Roadrunner Records.
- CD: http://smarturl.it/NickelbBestOfCD
- iTunes: http://smarturl.it/nb-bestof-itunes
- Stream: http://smarturl.it/NickelbBestOfStream
Subscribe: http://bit.ly/171a3Ya
Site: http://www.nickelback.com/
Facebook: https://www.facebook.com/Nickelba...
guys i'm pinging localthunk
<@&1133519078540185692> this person is sharing illegal links
piracy is not allowed
epic embed fail
you remind me of someone
Find a better time to report
no way he did it again
it's the music video for photograph 😭
slay, egg
whats your issue?
stickers
i'm not caught up with the bit was that guy not a metherul alt
no metherul said it isnt
stimckers
@grand violet Can you unban my friend Kate
nothing to do with me
DID KATE ACTUALLY GET BANNED???
YES
IT WAS AN ACTUALLY WEBSITE
EGG THEY WERE JOKING
lmfao
It's okay
It literally wasn't me
wait so if we send certain links we get auto banned?
No
Yeah they dmed about it and I was so confused
different mod
Different mod
ye that was me
ahh
shoot first, revive the victim later
FREE KATE
SMODS.Sticker {
key = "teef",
loc_txt = {
name = "Teeth",
text = {"+#1# Joker Slot, {X:chips,C:white}X#2# Chips{} and {X:mult,C:white}X#3#{} Mult."}
},
atlas = 'stickers',
pos = { x = 1, y = 0 },
badge_colour = HEX 'C1DAFF',
default_compat = false,
compat_exceptions =
{
Joker = true,
},
rate = 0.3,
config = { extra = { slots = 1, chip = 1.5, mult = 1.5}},
loc_vars = function(self, info_queue, card)
return {
vars = {
self.config.extra.slots,
self.config.extra.chip,
self.config.extra.mult
}
}
end,
calculate = function(self, card, context)
if context.joker_main and not context.blueprint then
return {
xchips = self.config.extra.chip,
xmult = self.config.extra.mult
}
end
end
}
-- STOLEN FROM TENEBRIS BRAHHHHH
-- add_to_deck = function(self, card, from_debuff)
-- G.jokers.config.card_limit = lenient_bignum(
-- G.jokers.config.card_limit + math.min(card.ability.immutable.max_slots, to_big(card.ability.extra.slots))
-- )
-- end,
-- remove_from_deck = function(self, card, from_debuff)
-- G.jokers.config.card_limit = lenient_bignum(
-- G.jokers.config.card_limit - math.min(card.ability.immutable.max_slots, to_big(card.ability.extra.slots))
-- )
-- end,
this is the thing
i need help with
specifically the joker slots part
what isnt working?
i haven't added in the code yet.
are you just trying to add another joker slot?
this is for applying stickers
so use apply = function, then in that function do G.jokers:change_size(1)
yeah but :change_size is better for easing
since instead of doing G.jokers.config.card_limit = G.jokers.config.card_limit + 1 you can do G.jokers:change_size(1)
it also auto checks for certain unlocks like the handsize voucher criteria
apply = function (self, card, val)
G.jokers:change_size(1)
end,
i think that would do it on removal and application of the sticker
in honesty i ament too sure on how youd do it in such a way that it removes on strip but i think youd check for the card.ability table to see if it contains the key of your stickers
i cant tell whats with :change_size() but its genuinely annoying to work with when multiple things are running that at the same time
the math becomes wrong
so, these work?
-- stickers.lua
-- Footprint Sticker - retriggers jokers
SMODS.Atlas {
key = "stickers",
path = "s_stickers.png",
px = 71,
py = 95
}
SMODS.Sticker {
key = "fprint",
loc_txt = {
name = "Footprint",
text = {"Retriggers the joker whenever it is possible."}
},
atlas = 'stickers',
pos = { x = 0, y = 0 },
badge_colour = HEX 'ff005d',
default_compat = false,
compat_exceptions =
{
Joker = true,
},
rate = 0.3,
calculate = function(self, card, context)
if context.retrigger.joker_check then
return { repetitions = 1 }
end
end
}
SMODS.Sticker {
key = "teef",
loc_txt = {
name = "Teeth",
text = {"+#1# Joker Slot, {X:chips,C:white}X#2# Chips{} and {X:mult,C:white}X#3#{} Mult."}
},
atlas = 'stickers',
pos = { x = 1, y = 0 },
badge_colour = HEX 'C1DAFF',
default_compat = false,
compat_exceptions =
{
Joker = true,
},
rate = 0.3,
config = { extra = { slots = 1, chip = 1.5, mult = 1.5}},
loc_vars = function(self, info_queue, card)
return {
vars = {
self.config.extra.slots,
self.config.extra.chip,
self.config.extra.mult
}
}
end,
apply = function (self, card, val)
G.jokers:change_size(1)
end,
calculate = function(self, card, context)
if context.joker_main and not context.blueprint then
return {
xchips = self.config.extra.chip,
xmult = self.config.extra.mult
}
end
end
}
thats why i resorted to just, changing .card_limit directly
i think it might be because its in an event?
nope
i tried both with and without events
it was back when i was still coding yggdrasil
lmao, well somthings never change
well you did rework a lot of the info queue system all for me :3
:3
hey thats me!
wave wave
anyways im making a new smods pr now (which shouldnt make eremel want to kill me 3:)
WHY DO YOU KEEP MAKING PR's
it should allow you to modify the interest shit much more easily
that is a sytem that needs changed tho i agree
im only proud of
- ease progress bar (its not even that hard)
- that info_queue change (my pr was SO bad though)
- this
:3
smods devs when they see bepis doing their coding for them
nah thats N'
How do I make it trigger only once per Boosterpack? I was thinking about using a bool for that but then I wouldn't know when to set it back to false
card.ability.extra.chips = card.ability.extra.chips + card.ability.extra.chipsMod
return {
extra = {focus = context.card, message = localize('k_upgrade_ex')}
}
end```
Bepis you should def replicate hsr battle on balatro. That would be fun trust
context.booster_open
trust me that was on my idea list
.
i think i should do that :3
bsr overhaul!
Bread taste better than ui
true
welcome back kate
im burning out from doing anything
relatable
Thats gonna be hell 😭
maybe you should use my new ct consumeable smile (i finally thought of a new one)
Also heyyyyyyyyyy
Hey psps
Can i call you psps
Please
I’ll do anything
man i just wanna see the day where i dont have to touch code for atleast a day but my mind doesn't let it happen
what is the meaning of psps?
Cat calling
Meow
That worked, thank you :3
ofc ofc! theres always the big list of contexts to default to on the smods wiki, and ofc you can always make your own :3
???
bepis can we call you woof
The message doesn't get shown under the Joker though... It's in the middle of the screen
can i see your code for it?
ahh
i think i understand
message = "your message here", message_card = card
}```
Nevermind, I fixed it
By the way, I didn't find a list with all contexts, just one with a few of them
Pweaaaaaseeeeee dude 😭
Only I can call them psps
you're older than me and saying pwease on the internet
Wait, I'm stupid. I literally looked at that and didn't see that. Guess my brain just thought "Nah, too much words. Ain't reading that"
tehe, no worries!
Listen man i thought we don’t judge here
my bad jus thought it was silly
Real men say pwease
Teto can call me anything 
pweetyyy pwease :3
glad I don't say it then cuz I am not a man
L
what is with the passive aggression 😭
Why not
i am eddy rob and i am woke
anyone got any idea what's happening here? game crashes when opening a buffoon pack but the second time it happened was somewhat delayed so i have my doubts on what it could be
I don't even know what pwease means
please but femboy
go to funcs/common_events then line 3352 in your lovely dump
(6) Lua upvalue 'alias__Card_generate_UIBox_ability_table' at line 167 of chunk '"C:\Users\noodl\AppData\Roaming\Balatro\Mods/A..."]'
Some mod starting at A
I'm assuming
if not G.localization.descriptions[set][_c.key] then set = "Other" end```
you need to have a loc_txt or loc entry for what your making
v = table: 0x322ae0c0 {key:gappie, generate_ui:function: 0x308f0d20}
``` who's gappie
so it could be AIJ, ArtBox or AMM
okay maybe coming to the dev channel for troubleshooting was a bad idea, i'm not making anything i'm just trying to figure out what mods are incompatible with each other
ctrl f is your friend on these kinds of pages
Also this part may be relevant ```
_c = table: 0x2fafeb00 {loc_vars:function: 0x2fdb2968, _saved_d_u:true, original_key:popcorn_bag, jest_real_rarity:1, mod:table: 0x2fe29370, unlocked:true, registered:true (more...)}
I FOUND THE ISSUE. Game crashes when I mouse over a joker that looks like a basket of fruit
We found gappie !
question: if my mod doesnt have quantum enhancements enabled and i play with another mod that has quantum enhancements enabled, will the effects of quantum enhancements still apply to my mod?
I do plenty of enhancement checks outside of a context check so just wondering
yeah
I feel like I'm getting better and better to understanding and programming stuff in lua/Balatro
Why are you doing any calculation stuff outside of context checks
somehow, Ortalab is the problem
i needed to hook the is_suit, get_id and is_face functions for an enhancement i made that forces a card to be treated as an ace of hearts
i mean if theres a better way then please tell me
Card.set(“ace of hearts”) 🗣️
G.E_MANAGER:add_event(Event({
func = function()
G.hand_text_area.blind_chips:juice_up()
G.hand_text_area.game_chips:juice_up()
play_sound('tarot1')
card:start_dissolve()
return true
end
}))
return {
message = "MEOW!",
colour = G.ARGS.LOC_COLOURS.CC_evil,
sound = 'CC_meow2',
}
end
end,
locked_loc_vars = function(self, info_queue, card)
return { vars = { 5, G.PROFILES[G.SETTINGS.profile].career_stats.c_losses } }
end,
check_for_unlock = function(self, args)
if args.type == 'career_stat' and args.statname == 'c_losses' then
return G.PROFILES[G.SETTINGS.profile].career_stats[args.statname] >= 5
end
return false
end```
what's wrong? trying to make it so it keeps going if you lose a blind, but it just doesn't, it just shows game over
i'm gonna do some digging and see if this happens with other Ortalab cards
as an educated guess, look into how Mr Bones works in vanilla
I literally just copied that code and like edited a few things
i did something completely different (disabling artist credits) and it worked
i think i've found the problem and it is a Single Comma
that shouldnt crash it... i have multiple things with extra commas that doesnt crash it
sometimes commas crash it
okay, removing the extra comma didn't fix it. this leads me to believe the entire Ortalab Artist section is borked
i'm not here to debug someone else's mod in great detail, nor do i have the knowledge to, so i'll concede and just disable artist credits
How would i make a boss blind with a time limit?
🤔 is there a reason why firstToUpper works but firstToLower doesnt (it doesnt crash, it just, doesnt change the first letter to lowercase)
What does ease_background_colour do? It does nothing when I set it to a color (Or I'm not noticing it)
Doesn’t upper need ()
At least in python
no clue, the first function works though
i thought it would be the same for the lower one, but guess not?
Yeah idk lua dude
for Cardsauce players, how do i go about removing this from my collection
Disable the mod
...alright bro T_T
is there any way to remove it without disabling the mod?
hell, i could probably fix this one myself, come to think of it. the other "non cardsauce modded x" things don't crash on hover and i have a hunch this is another loc_txt issue
What's wrong with it
this can be found at the back of the Booster Packs collection and crashes on hover. i know it should be easier to fix this because similar things exist in other joker lists and work correctly
this'll be it - and this time it's the omission of a comma that causes the issue
bump
%L for upper
its actually %u
Can you show a crash again?
i see "loc_vars" so my suspicions are all but confirmed
Do you make your own mods
no, not yet
Use the smods release then
the smods release crashes on startup
how do i get the mods TT
You should be using the release
does steamodded make any changes to vanilla cards? currently one of my functions is doing absolutely nothing and my only idea for why would be that smods could be changing vanilla consumables to use card.ability.extra instead of card.ability.consumeable
i will be making my own mods eventually so this is the point where i find the fix too complicated to bother with
Just use the release
That’s why it’s a release
For people who aren’t experienced in balatro modding to use
i don't see why i should when it functions the exact same
well perhaps not exact, but the two things that crash can be walked around or disabled via the mods that add them
Well considering I have never seen those crashes before it suggests something isn’t right
i don't think i am going to see Non-Cardsauce Modded Boosters in gameplay for a long time, if at all (unlocking challenges in the first place takes 5 wins with different decks and all my progress with balatro has been on mobile before i started dabbling with mods)
given there's an "unlock all" function there's also likely a "mark all unlocked jokers as read" function somewhere which is the only reason why i'm complaining about this in the first place
how can i make music play only in one specific boss blind
sooo my last two questions got ignored but
im gonna try again
apply = function(self, back) G.E_MANAGER:add_event(Event({ func = function() for a, playing_card in pairs(G.playing_cards) do playing_card.ability.enhancement = "glass" end end return true end })) end
how do i enhance cards in apply
this is for a modded deck
anyone recognise this card? another hover crash
asking in case it's crossmod
oh it's another ortalab L
i really hope i don't have to disable ortalab
because besides the mishap with Cardsauce this is the only one that has been crashing at all
Good schmorning chat
I could be wrong but at a quick glance here isnt glass m_glass
...i wonder if Cardsauce is somehow the incompatible one here
alright
the vanilla remade mod had m_vremade_glass or something similar so you're probably right
let me try this
G.E_MANAGER:add_event(Event({
func = function()
if G.playing_cards then
for i = 1, #G.playing_cards do
G.playing_cards[i]:set_ability('m_mod_key')
return true
end
end
end,
}))
Hi ali
How would i make a joker always eternal, and how can i also remove eternal?
Change “glass” to desired enhancement
Uhhh idk
of course you dont im coding for you
then i'll just send you my current code
Ok
card:set_eternal(true)
card:set_eternal(true)
this worked thank you
Or that
Hes gonna spend that 300 dollars on N’
where would i put that?
its with set_ability iirc
random question. does the TUTORIAL seed fuck up anything with modding
Could be in add_to_deck
i'll try another run and if ortalab continues to be dickish i'll see if it's actually somehow Cardsauce's problem
@old epoch you coulda prob checked yahimod horse
What does ease_background_colour do? It does nothing when I set it to a color (Or I'm not noticing it)
Im trying to make a boss blind that destories random card from hand after playing, but it's not working
lemme do that
iirc smods.destroy_cards is for jokers, youll want context.destroy_card
https://github.com/nh6574/VanillaRemade/wiki#how-do-i-get-the-type-of-the-current-blind
--- Method 1
--- For playing cards while scoring/discarding
if context.destroy_card then
if context.cardarea == G.hand and context.destroy_card:is_suit("Diamonds") then -- If it's a Diamond held in hand
return { remove = true }
end
end
--- Method 2
--- For anything else
SMODS.destroy_cards(card) -- Singular card
SMODS.destroy_cards(G.jokers.cards) -- Can take multiple cards
I used the first one for consumables and it works
Thats what vremade hangman has iirc
well then how do i make it random
are you just trying to destroy a random card held in hand?
yeah
honestly i havent had it work b4 but ive never super looked into it so it didnt work for me but context.destroy_card always worked for me
it is decidedly not Cardsauce's problem. This is exclusively an Ortalab L
it seems Zodiac's the issue now. Scorpion crashed on hover because of artist credits, and now it seems all cards that even mention Zodiac are crashing
Ah
I tried this with the diamond suit for test and it crashes the game
hang on let me test something im just wakin up
if it works ill send it
help guys
ok uh
finally got the time to look into ts and
i dont get it
how does ts work
I keep getting this crash I tried everything and not work
quick question
what do you guys use to mod
coding
i mean
cuz rn i'm just editing ts in a damn notepad
use vscode and the lua extension
bump
press_play = function(self)
if G.hand and G.hand.cards and #G.hand.cards > 0 then
-- Get a random card from hand using pseudorandom_element
local target_card, index = pseudorandom_element(G.hand.cards, pseudoseed('hand_destroyer'))
if target_card then
-- Add visual effect
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
target_card:juice_up(0.3, 0.4)
-- Show destruction message
card_eval_status_text(target_card, 'extra', nil, nil, nil, {
message = "Destroyed!",
colour = G.C.RED
})
return true
end
}))
-- Destroy the card using SMODS function
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.4,
func = function()
play_sound('tarot1')
SMODS.destroy_cards({target_card})
return true
end
}))
end
end
end
}
hopefully the comments are simple enough for you i didnt put much effort into it
what are you trying to do
also here's the crash log. waiting on someone else's word that i know has gotten ortalab working on dev branch because they literally made crossmod for it
if i have to choose between going through the rigmarole of manually reinstalling release smods and disabling ortalab, i'd rather disable ortalab
I want to change the background color from my boosterpack. And from the other stuff too (like main menu, shop etc)
It works but there is a little problem
it can also destroy the card that you just played
prob just need a cardarea check, one sec
im not super sure, i use it to change colors mid blind but maybe you use it like ease_background_color(G.STATES.whateverstate)
press_play = function(self)
if G.hand and G.hand.cards and #G.hand.cards > 0 then
local remaining_cards = {}
for _, card in ipairs(G.hand.cards) do
if not card.area or card.area == G.hand then
table.insert(remaining_cards, card)
end
end
if #remaining_cards > 0 then
local target_card = pseudorandom_element(remaining_cards, pseudoseed('hand_destroyer'))
if target_card then
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
target_card:juice_up(0.3, 0.4)
card_eval_status_text(target_card, 'extra', nil, nil, nil, {
message = "Destroyed!",
colour = G.C.RED
})
return true
end
}))
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.4,
func = function()
play_sound('tarot1')
SMODS.destroy_cards({target_card})
return true
end
}))
end
end
end
end
in vsc click this then search lua
ah it has to be vsc i see
alr
wait
vsc as in
vs code or vs community?
Cryptid does it like this for their Code Booster Pack but I don't know how or if I should use it
ease_colour(G.C.DYN_UI.MAIN, G.C.SET.Code)
ease_background_colour({ new_colour = G.C.SET.Code, special_colour = G.C.BLACK, contrast = 2 })
end,```
still destroys the played ones
weird, it wasnt happening for me when i tested it
maybe you were just lucky
you started a new run?
yup
worked on an icon for the acorns and shields but couldn't get down the bell
maybe, but i played 7 cards so idk
ill try again
not sure how to get this down under a 18 by 18 pixel
maybe this... lua looking ahh one?
hm yea it did still destroy in my hand hmm
What does this do? I'm trying to understand it but I don't know what G:ARGS.LOC_COLOURS is...
function loc_colour(_c, _default)
if not G.ARGS.LOC_COLOURS then
lc()
end
G.ARGS.LOC_COLOURS.cry_code = G.C.SET.Code
G.ARGS.LOC_COLOURS.heart = G.C.SUITS.Hearts
G.ARGS.LOC_COLOURS.diamond = G.C.SUITS.Diamonds
G.ARGS.LOC_COLOURS.spade = G.C.SUITS.Spades
G.ARGS.LOC_COLOURS.club = G.C.SUITS.Clubs
for k, v in pairs(G.C) do
if string.len(k) > 4 and string.sub(k, 1, 4) == "CRY_" then
G.ARGS.LOC_COLOURS[string.lower(k)] = v
end
end
return lc(_c, _default)
end```
how can i add a new set?
nvm, got it to work
how do i make a deck that starts on a different ante? an ease_ante() call happens too late to change the blind scaling
Can you use g.game.round_resets.ante == num
I have a question, what are the modifiers/custom attributes for a challenge deck using SMODS.Challenge?
sets the ante to 0 but still applies ante 1 scaling
maybe apply() is too late somehow?
I was trying around with the constrast of the background, why does this kinda look not bad? (contrast = 30)
This may help you :3
yep, I found a similar one, this one
though still good to check another one
okay this is a lot better
how do i refer to this in G.C?
is there any easy way to add a button to a joker or is this a black magic
do gold seals have a stored dollar value or is that held elsewhere?
you can check how joyousspring did it
well i checked and i don't undestand anything there
decided to go ahead and make my own suits but kept the first one i made
is there a way to program an enhancement such that the enhanced card is treated as a face card while still being compatible with quantum enhancements? I know i could hook is_face but unless im missing something id have to check if the card is of that enhancement outside a context check
how can I refer to ecto_minus in code?
found it: G.GAME.ecto_minus
try looking at face seals from UnStable
whats the held in hand context for enhancements/seals/editions, is it not just context.cardarea == G.hand and context.other_card == card or am i tripping
Why does my game crash whenever i select a flipped card, like idek whats the reason it just crashes
is there not a crash log?
too advanced for me to help then lol
we should have a sticker or emoji for tailsman
So my suspicion was right
you need to wrap it in to_big to make it talisman compat
💩 there
Problem is thats not my mod file
yeah talisman is nothing but a pain sometiemes lol
My mod uses to_big
how would you patch the seals spectral cards localization to include loc_vars for how many cards can be selected? right now, it's hardcoded to 1 and it doesn't have any loc_vars
Its lovely screw talisman
When does it crash?
oh yea i wanted to ask again does anyone know if i can specify the collection pos of cards
cause id like to put specific cards in specific places in the collection
afaik the jokers in collection appear based on the order in which they were loaded
yea but i want to be able to move em elsewhere post load
oh
bump perhaps...
that's not really a thing unless you wish to extensively patch the collections menu i assume
bit cringe innit
do you want like, specific pages for your jokers
how am i suppose to make thematic cards now slot in with their counterparts of vanilla
i have a card that fits witht he trio and tribe and etc
so i want to slot it with them
if context.cardarea == G.hand and context.main_scoring then
as well as others elsewhere
oh yeah main scoring
hi eremel
bump
did you look at the face seals that they suggested
so...change it to work for the enhancement id wager
hmm but id need to do an enhancement check outside of a context check which i wager wouldnt be very good with quantum enhancements
i later do want to work with that feature
Hello dilly how are you today
im doing well, just bought more games for the wii and took my gamecube in for repairs
w
All got the manuals too
actually peak games

shouldnt you return saved = true or smt then
hi bepis how are you
that's what i was looking at, that might be the case
since the mr bones one is saved = ph_mr_bones
now how do I make it so it says "Saved by Winston", because rn it says error
bump
you need to add it to a localization file in the same place as ph_mr_bones
whatever key you returned
alright
you dont need to patch, just add them to your localization file
you want to replace the localization with your own, and patch into localize to use loc_vars
or take_ownership
ye
ok which one is easier
same
with which parameters? this didn't do anything (though i think im doing something wrong)
loc_vars is a function
and loc_txt won't work, you need to do the localization file thing
bump, i also want a deck that starts on ante 2 and i really want the scaling to work properly
just add c_talisman = { to the file?
yes
u might want to run recalculate/manually change the chips in the blind selection ui idk
{key = 'eternal', set = 'Other'}
if context.type == 'eval' then
if G.GAME.last_blind and G.GAME.last_blind.boss then
tag:yep('+', G.C.GOLD, function()
return true
end)
tag.triggered = true
return {
dollars = tag.config.dollars,
condition = localize('ph_defeat_the_boss'),
pos = tag.pos,
tag = tag
}
end
end
end```
Is it possible to do this but replace tag with card?
no, the syntax for tags is very different
oh
that's just calc_dollar_bonus tho
unless i'm stupid this should do it, right? spoiler alert: it's not
right screenshot from lovely dump
also i tried patching stuff that crashes the game and it didn't, which means it's probably not even loading it in
I think patches.pattern needs to include the whole line
no thats always
What language are shaders written in? I'm considering learning how to do shaders
OpenGL
https://love2d.org/wiki/Shader which is basically glsl with some renamed stuff
wait i hit right in the money
@split saddle maybe check that line wrapping, looks kinda sus
Are there any good shader tutorials you can recommend?
anyone know why I have this error? am I missing something?
a comma before loc_vars
fixed it
thank you, I'll try
this is decent https://blogs.love2d.org/content/beginners-guide-shaders. for the specifics of balatro modding shaders, it might be best to look at examples like https://github.com/stupxd/Blueprint or https://github.com/jonathandw743/Illusion for how to add/replace shaders. there might be a smods way to do it, depends what kind of changes you want to make
took me a bit to figure it out lmao
G.GAME.round_resets.ante = 2
G.GAME.round_resets.blind_ante = G.GAME.round_resets.ante
in apply of course
thank you n
i saw blind_ante while looking through dumps but didn't know what it did
me neither but the blind calculates from that
how do i make it so you get 25 dollars when he explodes?
rn i got it like calc_dollar_bonus = function(self, card, context) if context.end_of_round and context.game_over then return card.ability.extra.dollars end end
calc dollar bonus doesnt have a context
need to come up with colours now. thinking on having leaves or flowers green and shield purple
also if it is destroyed it wont run it
damn so no way to make money?
i wouldnt say no way but i dont know what it is :3
for the face cards i got an idea. use the tarot cards as a basis and give it COLOUR™
you burn now/j
Ok thanks
ok im trying to have all bonus cards treated as a modded enhancement to figure out how quantum enhancements work
I understand that this is a problem but how would i go about this without a enhancement check
also when i did spawn in the joker the game just quit itself
not even a crash
context.other_card.config.center.key == "m_bonus"
yeah thats an infinite loop haha
huh so SMODS.has_enhancement causes issues with this check specifically
that calls check_enhancement
guys i need to justify making a consumable that adds eternal to a selected joker
would there be any strategy with this
what do you think for low contrast?
Stelle prob wouldnt joke and actually burn someone
wym justify
i wanna make sure im not making something useless
and also cuddle with trashcans
ANKH
can someone explain to me how context.blueprint (and ig by extension blueprint) works? i thought i understood but my code aint working
cuz ANKH exists
solid point
if context.joker_main and not context.blueprint then
card.ability.extra.playedHand = SMODS.shallow_copy(context.full_hand)
end
if context.joker_main then
local index = math.random(1, #card.ability.extra.playedHand)
if index > 0 and #card.ability.extra.playedHand > 0 then
local parkedCard = card.ability.extra.playedHand[index]
parkedCard.config.parked = true
table.remove(card.ability.extra.playedHand, index)
return {
message = 'Parked!',
message_card = parkedCard,
}
end
end
i thought this would allow blueprint compat with my jonkler but it dont work
and not context.blue_print
for blueprint compat
💀
yeah, not context.blueprint means it wont be compatible
unless you mean the joker_main
yeah
maybe im conceptually misunderstand then, because i dont want that variable to be overriden when blueprint triggers
and high contrast
yeah i read it wrong because of the identation sorry
or does blueprint not have access to a differnt jokers extra table?
what do you think of the colours low and high?
if context.joker_main has nothing making it not be blueprint compat though
I think
- what's the goal of this joker?
- dont use math.random
if context.joker_main then
local index = math.random(1, #card.ability.extra.playedHand)
if index > 0 and #card.ability.extra.playedHand > 0 then
local parkedCard = card.ability.extra.playedHand[index]
parkedCard.config.parked = true
table.remove(card.ability.extra.playedHand, index)
return {
message = 'Parked!',
message_card = parkedCard,
}
end
end
seems alright
oh yeah
use pseudorandom()
its the one card from played hand doesnt get discarded joker
i want it to have blueprint compat so 2 or more cards can stay in hand and not get discarded
the config.parked is used by the lovely patch to handle return and is also reset there
fair enough, will modify
I just made him give the money directly instead of in the win screen
that works
what's card.ability.extra.playedHand
its a shallow table copy of the hand played
also, this setup works on 1 card, so its probably me misunderstanding how blueprint works
answered like it was a jeopardy question lol
its 5pm
I sometimes forget time zones exist
follow up question: why
because of the table.remove(card.ability.extra.playedHand, index)
or am i just able to do this on context.full_hand with no consequences
yeah but what does that do i mean
idk how the rest of the effect works
aaa
would i have to deal with the draw function if i want an enhancement to not draw the base sprite but still give base chips
ah, well, i want to remove the card from selection once its parked, so blueprint cant park the same card
you could just make the list without the card based on .config.parked
when a baseball card is triggered would either of these have any reference to the baseball card
fair enough, let me try that then
like this
idk if it will solve the issue
if context.joker_main then
local hand = {}
for _, pcard in ipairs(context.full_hand) do
if not pcard.config.parked then
table.insert(hand, pcard)
end
end
if #hand > 0 then
local parkedCard = pseudorandom_element(hand, "seed")
parkedCard.config.parked = true
return {
message = 'Parked!',
message_card = parkedCard,
}
end
end
noted, let me try
is it possible to play a sound when a joker is added to the deck? i tried returning the sound but it didnt play
yes, with play_sound(key)
ah! thanks
damn that works, tysm
its possible because of this patch
<@&1133519078540185692> kill him
murder him dead
obliterate his entire continent
Real
trying to make a deck that starts all hands off at lv. 2, how do i set the level of a poker hand?
Do you have to use debug commands to discover every card in order for Ortalab to not crash upon hovering certain (undiscovered) cards?
i'm being told to just debug unlock all to fix the problems i'm having but assuming that's irreversible i'd prefer to find things naturally
this probably is impossible, but is there a way for the joker to check if Hearts are among us themed? calculate = function(self, card, context) if context.joker_main and context.self.COLLABS then if Hearts == {'collab_AU'} then return { x_mult = card.ability.extra.x_mult, message = 'amogus', colour = G.ARGS.LOC_COLOURS.CC_among, sound = 'CC_amogus' } end end end
because self is a nil value
what do you think
whats the objective
i can code it rq
if your hearts are themed to the among us collab cards, it gives x mult
i gotta be bugsnax!
im assuming youd check for the atlas sprite position of the card
do you have to play hearts or is it unconditional
if a heart card is scored ye
i'm pretty sure it has something to do with this
this then
if context.joker_main and G.SETTINGS.CUSTOM_DECK.Collabs["Hearts"] == "collab_AU" then
for _, pcard in ipairs(context.scoring_hand) do
if pcard.base.suit == "Hearts" then -- i dont check is_suit because a wild suit might not have the skin
return {
x_mult = card.ability.extra.x_mult,
message = 'amogus',
colour = G.ARGS.LOC_COLOURS.CC_among,
sound = 'CC_amogus'
}
end
end
end
i think this looks good what yall think
holy shit it works thank you so much
that's hilarious
should i make it so you have to play a face card or is that too much?
cool btw
i think that makes more sense yeah
k on it
thanks
looks like the fool, what is the idea here. may i ask
i made four suits and making their face cards coloured tarot cards
oh i see
cool
hey if pcard.base is the whole hand, what is it for just 1 card
that's not what that means
pcard is the current iteration over the whole hand
just 1 card
if you want to only count the first amogus face card just break out of the loop when u find one
no you dont, it seems your install is scuffed af
actually ykw, I'm just gonna leave it as is lol
is it possible to check the required blind score
thanks
What does patching do and where would i start learning about patching?
oh that should have a guide to the lovely doc
can someone make a balatro calculator where you can put custom jokers
no
Ok thanks N’
what
this is a really excellent rundown
thank you
this here deducts chips but doesn't return a message. why?
what
another similar piece of code is before (with another context, but the same result) and that one works so i'm really puzzled
wdym by make a balatro calculator

that code looks fine, it might be something else?
no idea really
the one on top removes chips and gives message
they're the same but one of them doesn't work
well gee sorry for asking
inb4 i discovered an obscure bug with context.skip_blind (probably not the case)
i mean maybe
try adding message_card = card
N, what does it mean “Let's say you want to make an effect that prevents the deck from being shuffle before a Blind while a specific Joker is held.”?
-# im not that good at balatro i only know basic stuff
nope
well the deck gets shuffled when you start a blind normally
yeah i couldnt find a better example of code that would be easy to understand for a patch haha
So you just gon get the same cards as the previous blind if you have a joker?
yeah basically
yeah
Ok thanks
no because they also get shuffled at the end
i have to go now but if you find a solution lmk :)
So… it doesnt give you the cards you got in the previous blind?
no
you would need to prevent both shuffles
i have a specific use for this but i dont think its relevant to the guide to say it
Ah
So if i were to patch both start and end to not shuffle, you would get the same cards you got the previous blind?
i dont know the order the cards discarded get returned to the deck but probably
What do you write into the localization file for Blinds?
blinds go in descriptions -> Blind as per the localization documentation, and they take a name string and a text table as per what N' just sent
I alway forget that I can just look into that code OwO
Ah ok thanks
Is this the correct syntax for overriding a mod prefix?
How do I make it, so the button isn't this big for this consumable?
pov:
Can someone help me? I want to create a joker that the most used tarot always appears in the boosters.
It was not 
and to check if you have defeat it? for an unlock condition
Sorry, google translator
no idea :3
bump
Please help
Is it possible to change a mod prefix to something different with prefix config? I'm trying to make an API mod for Maximus' Poker Hands and I want the objects to have the same prefix as Maximus ('mxms'), but keep the mod's actual prefix the same (if even possible)
do hands even use a mod prefix?
yes
they def do
and even if they didn't, I'd have consumables to worry about too
In a similar vein, I'm a little confused on how the Provides metadata field works. Do I use the provided mod's ID or name, and does it disable the provided mod or allow it to load?
how can i check if a joker have the eternal sticker?
^^
Who can help with my code?
you don't have to include the soul_pos if it ain't real i feel
This dont help...
why's your whole code outside the calculate func
no it should beinside
look
it's literally outside your joker code
definition . i mean
you have a syntax problem
I didn't understand...
Guys I might be annoying but having a Joker in this deck make the game crash idk why but the log is talking about the config having a nil value
what's the crash ?
i think it's a context issue
wait I'll send the crash log
Like....
this....?
I just play the winning hand with at least one joker
I absolutely don't understand
absolueetly not
ok but I tried without config and still don't work
take this code send it to chatgpt and tell it to fix your syntax
you need to remove the extra
like I just make an empty config
extras
let me check the wiki*
i hate those docs
the wiki doesn't mention anything
It dont work either
I was about to report lol
i have no idea
yeah its soo weird
i haven't coded decks so i didn't look into them much try looking at other people's code
Is it possible that its a smods feature that has change
did you look at the smods wiki for joker structure at all
and also use vanillaremade as a reference instead of other mods
Vanilla remade make me a car
is there a way to disable standard packs from showing up in the shop pool
-# i have my reasons lol
i THINK i know how but my memory is failing me
G.GAME.banned_keys[<booster pack key>] = true
What is the best approach to make sure only 1 instance of a joker can exist at all times?
As in if i get that joker i can never get another copy of that joker (either buy another, copy, etc..) until i sell it and then i can normally get it again.
in_pool combined with take_ownership of invis joker and ankh
depending on how they're implemented in vanilla you could hook copy_card
I just have a joker that manipulates the score in weird ways, and and while a copy likely wouldn't break it would first be useless secondly could have weird bugs i don't know about.
What does it actually do?
Four Fingers is useless with duplicates that doesn't mean vanilla doesn't prevent you from duping it
hook copy_card
and hook create_card
Any score above blind is saved in the joker (if you score 350 on a 300 blind the joker sets score to 300 and takes the excess 50 for itself), the saved score is later used if in a game over state to try and save the run (spending all the stored points in the process)
If it does actually set the score to 300 you should have no bugs
Can someone help me? I wanted to know if smods has something that sees which tarot is most used, for example, to make it always appear in the shop or in boosters.
Maybe, i haven't fully tested with duplicated but i do think i've seen both increase the score.
Maybe i should do more testing on the joker. Maybe i don't actually need to restrict only 1 instance
first suit completed!
this is the wrong channel but this is sick
its for my mod but i forward it to #🎨・fan-art just incase
this should be in modding-chat
maybe you should be in modding chat, how bout that
Someone help
I always thought of the devil as being made of gold
Okay that does actually work without any issues, and i could actually see uses where duplicates would be useful (as only the first joker takes the excess score)
you were told youd have to probably track it yourself, alternatively you can probably track tarots fom here
then idk what you have to do to make sure it shows up
i mean it does enchance it as gold, but https://en.wikipedia.org/wiki/The_Devil_(tarot_card)
me when 
does anyone know how the UIBox_button function works
How make joker desc?
ok, question.
if you had to format xdollars, how would you write it? X$ or $X?
makes sense
uh sanity check, it's G.GAME.round_resets.ante to get current ante, right?
2 questions:
How difficult would it be to implement a new menu after selecting the deck and stake where you can select new modifiers?
Is there a mod that has done something similar (at least the new menu part) that i could look at for reference?
galdur? 
Hard.Partner
galdur does a bunch of deck & stake selection stuff but it's old by current modding standards and does a lot of outdated stuff iirc
should still be good to use for reference for what you're looking for...?
If you have Galdur cardsleeves adds a second menu
oooohh, that could work, it'd be slightly annoying to figure out how to disable this if- wait i can just
if next(SMODS.find_mod("Galdur")) then
-- load file
end
yeah just look at what cardsleeves does
Galdur isn’t outdated what are you on about
huh?
i thought you said something along those lines before, my bad
No it just has everything in one file
Guess this is one way to deal with making a joker do something when entering the store 
-- Update texture when entering store in case we anter a new ante and saved score falls in range of change
if G.STATE == G.STATES.SHOP and not card.ability.extra.in_store and not context.blueprint then
card.ability.extra.in_store = true
card.children.center:set_sprite_pos({ x = self._new_pos_x(card.ability.extra.score_saved), y = 1})
--TODO: Card jiggle on texture change
--card:children.center:juice_up()
end
-- Reset when leaving store
if context.ending_shop then card.ability.extra.in_store = false end
that definitely is a way (<- has no idea what she's looking at)
its doesnt work....(
may we see your full localization file and joker code?
you uh
may want to use this https://github.com/Steamodded/smods/wiki/Localization
i cant find vannila remade on google does anyone got a link
thanks a ton
I'm still not able to get this to work, Idk where to move
what
doesn't look like a bad idea
I can just use langchain to vectorize all of the data
and then use embedding
do NOT
good
vanilla remade doesn't have a license
add vanilla remade license that allows people to steal the code
I think you should explode instead of using it for ai slop
🙏
no
you clearly didn't, the code fragment shown here would be G.localization.descriptions.Joker.j_[mod prefix]_[key], and it's what your code should be, yours is not that and instead uses misc.dictionary.j_[mod prefix]_[key]
also it doesnt have a license because its partly code for the game
I need to feed it to AI models and start balatro AI cult
do NOT
I think you should blow up instead
They should pin vremade and smods to this chat lmao
i dont think they be pinning things in here
To what actor
I'll blow up to you
😈
what.
I'm trying to make a Joker that works similarly to Duplicare from Cryptid in that it gains a very small amount of Mult every time nearly anything triggers. However, there's one Joker I have specifically that is problematic with it and causes it to trigger infinitely. How could I go about checkng to ensure that it doesn't trigger specifically for post_triggers that come from a Joker with a certain ID? Right now I have:
calculate = function(self, card, context)
if
not context.blueprint
and (
(context.post_trigger and context.other_joker ~= card)
or (context.individual and context.cardarea == G.play)
)
then
I tried to add and context.other_joker ~= "j_themod_gazinga" to the context.post_trigger section but that didn't do anything. I could have it use next(SMODS.find_card("j_themod_gazinga") but then it wouldn't work at all if you owned the other Joker and not just for its own triggers.
what did seu pai mean by this
Idk...
I think <@&1133519078540185692> should get this seird seu pai outta here
context.other_joker.config.center.key ~= "j_themod_gazinga"
Thank you!! :D
i don't know if this is worth pinging mods
don’t do AI slop shit
you have mentioned using ai for mods for a WHILE now, it clearly isn't.
oh yeah I thought it was the blow up thing
ok so i tried making a joker that retriggers all other jokers but that failed then i decided to just code it as a blueprint that copys the effect of all jokers at once so all jokers to the left if it but i dont understand the blueprint code which states which cards are blueprinted
retriggering all jokers is much easier lol
You need to enable the optional feature for retriggering jokers
did you remember to enable it?
nope....
thats why
i took a month or two away from coding
N i came across a fantastic surprise earlier
SMODS.optional_features.retrigger_joker = true
omg its N i remember you
u literally have me in your name
i was testing the wii games i got and thusly digging through my game cases to put game where they belong and in my wii fit case underneath the disc was a loose copy of mario kart double dash for the gamecube
so i discovered i had an extra copy and i bought it for the price of wii fit which was like 5.99 (double dash is worth 55)
I have it as:
calculate = function(self, card, context)
if
not context.blueprint
and (
(context.post_trigger and context.other_joker ~= card and context.other_joker.config.center.key ~= "j_themod_gazinga" )
or (context.individual and context.cardarea == G.play)
)
then
But after adding this line I get the error:
'attempt to index field 'other_joker' (a nil value)'
lets goo
you need to do and context.other_joker ~= nil too
it might be other_card
yeah
How would i find the total money ive gotten in a run?
how exactly does smeared joker work
do i have to add checks for that too in my suit based things
you'd probably need to code that I think
no as long as you use is_suit it will check for it

Don't worry it won't be that hard
I think
“I think”
function send_score(_score)
if G.F_HTTP_SCORES and G.SETTINGS.COMP and G.F_STREAMER_EVENT then
G.HTTP_MANAGER.out_channel:push({
set_score = true,
score = _score,
username = G.SETTINGS.COMP.name,
uid = tostring(G.STEAM.user.getSteamID()),
version = G.VERSION
})
end
end
can I change the uid so it sends the http request to another steam account instead?
or change my username
I lowkey dont know
a bad solution here you could do a while loop and whenever G.GAME.dollars value is different it increments total money by the difference
Might be my only solution cause idrk
You would hook ease_dollars
Frick, how would i do that?
what If someone does G.GAME.dollars = 93201930219032190321903203921039021930293 somewhere though
local l_ease_dollars = ease_dollars
ease_dollars = function(mod,instant)
local r = l_ease_dollars(mod,instant)
--rest of code here
return r
end
Invalid statement
It all depends on the context
if you are really worried about people changing G.GAME.dollars directly then you can hook to Game:update and check for changes in G.GAME.dollars
what if someone uses G.GAME.probabilities.normal
fr
who cares is the answer
the guy who uses G.GAME.probabilities.normal
well, he should update his mod
but seriously, you shouldnt care about someone doing it wrong since its on them
It's not wrong though
it depends on the context
I used to use G.GAME.probabilities.normal, i switched at some point cause i keep seeing people not use it, what does it do anyways? Just set to 1?
https://github.com/thenumbernine/lua-parser someone help me insert this into balatro
Lua parser and abstract syntax tree in Lua. Contribute to thenumbernine/lua-parser development by creating an account on GitHub.
Idk whats G.GAME.probabilities.normal
using the new probability api allows you to manipulate the numerator, denominator and shit much easier
and it also lets you "reroll" chances :p
The pseudorandom_probability or whatever?
mhm
idea why


