#💻・modding-dev
1 messages · Page 274 of 1
Here's an example of it only playing 2 notes because 2 cards are converted
does anyone know how misprint has the changing effect?
calculate = function(wtv goes here)
if context.joker_main then
mult = card.ability.extra.mult ^ card.ability.extra.mult
this is so cool, yeah i really like the sound effects, only thing to keep in mind is game will also play its own sound effects over yours if other things are triggered
but i dont think thats an issue
it sounds well regardless
First sound plays before anything is scored, last sounds play after everything is scored
also i think someone mentioned talisman mod for emult which basically does what you want @tawny narwhal
yup i just meant the lasting effects of the first sound
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
}
Tru but that means dependencies and I started learning lua + modding today
IDK how ez/hard it may be
thank you
If you search "Misprint" in the source code you'll find how it does it in the card.lua file
clarification i meant on the description
the card.lua only has the code
yeah, dont know where the description is for cards in the main code
The card.lua part has the description changing code
shouldnt be too difficult, plus always good practice to use mods that are tried and tested for implementing base functionality than implementing it yourself. alternatively, you can just see how they implement it in talisman
gotcha
This is in the Card:generate_UIBox_ability_table function
It's not even part of localization, it's just brute forced into the code that makes the description text itself
what is G.GAME.consumable_buffer used for?
It might be better to put a hook on get_flush(hand)? You can also use SMDOS.PokerHand:take_ownership(...) to modify the hands
nvm i get it
I've also got this joker and enhancement with really gross sound design
is there a context for whenever a joker is added?
istg if smods does not provide this
no but that's for
Like calculate and update
Well yeah, what else do you want to check if a joker is added for?
it is the sound version of the word "moist"
I want to destroy every Legendary that is added
jesus
and that's a thing, just undocumented?
huh weird
if context.card_added and context.card.ability.set == "Joker"
but it doesn't do anything to the mult
doesn't show in intellisense for me
@rain slate
yes I got the gist
key = 'singular',
loc_txt = {
name = 'Singularity',
text = {
"Squares the Mult{}",
}
},
config = { extra = { Xmult = mult } },
rarity = 1, -- Rare rarity
atlas = 'singularityatlas',
pos = { x = 0, y = 0 },
cost = 1, -- Adjust cost as needed
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.Xmult } }
end,
calculate = function(self, card, context)
if context.joker_main then
return {
message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.Xmult } },
Xmult_mod = card.ability.extra.Xmult
}
end
end
}
This currently gives "Xnil mult"
mult isn't defined in your extra table, you need to use a literal
text = {
"Squares the Mult{}",
}
whats happening here with the {}
Why not just use talisman?
Excellent question... I think I had colour params and whatnot that I deleted
So many people saying this... I may as well at this point aye?
yes please you will make your life a lot easier
It has exponential mult integrated into it.
I'm making the mult and xmult noises for this joker gross too [=
Speaking of, how do I change the sound of a mult trigger on an enhancement, since it just does it with the config?
I'm trying to move a played card to the hand, but for some reason it returns with both sides being the card back. What's causing this?
draw_card(G.play, G.hand, 100, 'up', false, v) --v = played card```
hi aiko
sorry there was an earthquake
what's the way to check a card's rarity
card.config.center.rarity
Balatro
Also, bump
Is there an equivalent to joker_main for enhancements?
it's not actually doing anything no message no nothing so the context has to be wrong somehow
That's what the documentation says
yea
I think you can return a sound attribute to replace the trigger sound with one of your choosing
In here?
Also I think context.post_trigger or smthn like that is the usual enhancement trigger context
Ah, alrighty
No in the return in the calculate
I was looking for what context to use
Ah
just checking that this is the correct context, yes? if context.card_added and context.card.ability.set == "Joker" and context.card.config.center.rarity == 4
for when a legendary joker is added
I've decided not to replace the sound but instead layer the sound
That looks right to me
In that case just do an event manager
other contexts do get called it seems but this one just does not
context.post_trigger does not work
I mean it probably gets called somewhere, but it doesn't go inside the if statement
why would i lie
are you alright 😭
Ah my apologies, try context.main_scoring instead
even without the = true there's 7 results and none with card_added, only playing_card_added
That's what I tried before post_trigger, that also doesn't work
I’m pretty sure card_added is not a vanilla context
it's the dumped lua with SMODS patches included
Hmm
- also SMODS itself
phew, thats good to hear
It's in calculate_card_added.toml. It's a lovely patch
Weird
I have no such file...
Wait, main_scoring does work, but it isn't actually adding the mult
How up to date is your smods
let me reinstall SMODS
I mean I only started modding like a week ago
so probably pretty up to date
It updates constantly
Show code?
Add context for adding cards to the deck by @VictinZero in #560
ok
Just realized that context will let me refactor a few cards 
latest update
This is in calculate, it adds the mult, but about a quarter second later, and doesn't show the message or make the sound
It makes the fleshmult sound, but not the actual mult sound
Set blocking to false I guess?
Okay that fixed it
fleshmult sounds spooky
Let me test again
It's for the Flesh Joker which will slowly convert your entire deck into Flesh Cards, and it'll start infecting your other jokers too if your entire deck is already Flesh Cards
It's good if you can keep it under control
Because your Flesh Cards slowly decay over time
i got the cutscene thingy from lcorp to work on my mod :3
-# about 0:18 in
Actual boss fight holy shit
only phase 1's passives r finished so far though, but im happy with the visuals
I forgot to return true at the end of an event and accidentally summoned a beehive from hell
Banger
how can i check whether a card is in a booster pack or in a consumable slot? like what its 'area' is
Warning level 2's track better be included somewhere in the mod I swear to god
-# maybe?
I'm pretty sure booster pack cards are literally just G.hand or G.play or smtn and as for consumables it's just G.consumables
Watch beehive from hell balatro and millions of other Balatro videos captured using Medal.
This song is too good not to include
https://soundcloud.com/takov-tsarkov/lobotomycorporation-ost-second
Listen to [ LobotomyCorporation OST ] - Second Warning by Zena #np on #SoundCloud
true...
TERRIFYING
(Currently X2,931 Mult)

yea but like, how to i check based of the card itself? im basically making an emperor for my own consumables and need to change the can_use function based on if its taking up a consumable slot
I think this takes the cake as the most unhinged video I’ve ever seen here
I mean cards have card.area I think
but also you can just base your code off of the Emperor code in that case: ```lua
if self.ability.name == 'The Emperor' or self.ability.name == 'The High Priestess' then
for i = 1, math.min((self.ability.consumeable.tarots or self.ability.consumeable.planets), G.consumeables.config.card_limit - #G.consumeables.cards) do
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
if G.consumeables.config.card_limit > #G.consumeables.cards then
play_sound('timpani')
local card = create_card((self.ability.name == 'The Emperor' and 'Tarot') or (self.ability.name == 'The High Priestess' and 'Planet'), G.consumeables, nil, nil, nil, nil, nil, (self.ability.name == 'The Emperor' and 'emp') or (self.ability.name == 'The High Priestess' and 'pri'))
card:add_to_deck()
G.consumeables:emplace(card)
used_tarot:juice_up(0.3, 0.5)
end
return true end }))
end
delay(0.6)
end
its between that and the fucking donkey kong
I don’t think I’ve seen Donkey Kong 
ohh, i was trying self.area that explains it
Boss blind effect: SO YOU HAVE CHOSEN DEATH
Average aikoyori boss
you'd better have bought the reroll voucher :)
I wonder if X10 mult is too little gain for this
cuz it only increments when you get another legendary which is like, rare
oh, actually?
wait
@sturdy compass
actually it's probably quite useless unless legendary cards are more common
hmm
maybe starts out at X5?
the abhorrent chicot:
u need 2 legendaries to even get it working, and even then, x10 is not even that good
😭
Y’know I feel like I should be more surprised but I’m not
truly
It has since been resolved and now that my mod has created 15 more Cursed Jokers, the "creates 5 cursed Jokers on spawn" is more meaningful now
I don't understand the Chicot hate
i mean, at least it can be used right when you got it
number no go up therefore useless card
those r some cool cookie run jokers
Fwoop
No boss blind that fucks my run
= yes happy
That's why it's legendary
yeah but no other legendaries make your game lamer
all of them contribute to the actual gameplay
chicot turns boss blind into colored big blind with more rewards
Imo legendaries should be focal points of a build and you should do everything in your power to build around it. Chicot does not follow that
its also why i hate chicot
i dont hate it because its weak, in fact, its strong, but it makes your game more boring
I mean chicot kinda enables you to build your deck around something without having to fear everything you built crumbling down
Sometimes you have a really cool run going and the game just goes no fuck you
Thanks
Only Moonlight is a Cookie Run character though (she gives ^1.3 Mult per planet card held in consumables)
that is an abhorrent font
However Chicot is not the focal point here
I like jokers that mitigate the RNG of the game that can easily fuck you, you can't deckfix your way out of never getting a reroll voucher or the level 1 reroll voucher not give you a good blind or the level 2 reroll voucher steal all your fucking money and not give you a good blind
and that is coming from me
your pixel font is just way too small
usually, only 1-2 blinds counter you
this is true
so there r not that many cases when you will waste too much money rerolling boss blinds
incredible
It's also good if you get it early game, because some blinds aren't full on run killers, but if you don't have your deck super fixed, there's a good chance you just won't draw the cards you need
i will actually argue its worse early game
idk how to justify Gorr's status as a legendary
you need actual e-con and scoring jokers
else you are immediately falling off in ante 12+
its only when you have your deck built, and your joker setup all set that chicot shines
I've made a joker that draws one of your most abundant card ranks in hand from your deck on your last discard and one that draws one of your most abundant card suits in hand from your deck on last discard, just so you don't end up using all 2-4 discards trying to find the one card you need for a full house or flush and the game just goes no fuck you
like, think about it
most of the times, you are 1-shotting/2-shotting boss blinds already right?
it's inspired by Gorr the God Butcher but
- legendaries are exceedingly rare so it's not much use until you get another one
- in this analogy the "gods" are the legendaries, but gorr isn't a god himself I think so he should really be rare however
- I feel like only legendaries should have like actual identities
whats the point of chicot then
i mean, its definitely there to "save your run", but thats not the case when nothing is built
Chicot is good for people who haven't gotten absolutely cracked at the game (me, I suck) and can't usually oneshot boss blinds in one hand, and semi-regularly lose to The Needle
you have a variety of options, since your deck is not full of the same cards
You are good at the game, you do not need Chicot
I am not good at the game
We are not the same
nah, its just rng hating u ❤️
but i really think rng from boss blinds is also one of balatro's biggest selling points, you never know what to expect and to keep your guard up after every ante, in case a threatening boss blind comes up
maybe he also makes legendaries show up in the shop
I legitimately feel like the game just hates me sometimes, I wanna deck fix and the game refuses to give me Hanged Mans, Trading Card, or Spectral packs
but only while you have him
chicot takes that away, you only need to keep up with the ante scaling this time
like you can't just pick him up, sell him, and roll for perkeo
game does be like that, yeah 💔
but also you can just do that while you have him and then sell him once something better shows up
so Gorr is really just perkeo rolling simulator

You can treat it like Showman, keep rerolling until you get the legendary you want, sell Gorr, and take the legendary, but also, it'd be really funny if when selling Gorr, it destroys all legendaries in shop, just to mess with people playing with the mod for the first time
that would be really funny

I think I will do that
and then it just plays the "Nope!"
peak cinema
✋
🤚
New yucky sound design just dropped
Placeholder
aha
They'll be made of flesh in the finished version
Ewwy
I have a card that actually does that and it’s called the Hammer and Chisel lol
I have a challenge that revolves around it
hi, i keep getting this crash and was wondering if anyone could help me out? Oops! The game crashed:
[SMODS _ "src/utils.lua"]:1245: attempt to call method 'juice_up' (a nil value)
what does your code look like?
whats the code
This is what it sounds like when a flesh card fucking dies
is there a way to check whether a card has any enhancement (mult card, etc)
SMODS.Joker {
key = 'alexandria',
loc_txt = {
name = 'Alexandria',
text = {
"{C:green}#1# in #2#{} chance for each",
"scored face card to become{C:dark_edition} Negative{}"
}
},
config = { extra = { odds = 3} },
rarity = 4,
atlas = 'Jokers',
unlocked = true,
discovered = true,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = false,
pos = { x = 1, y = 0 },
soul_pos = { x = 1, y = 1 },
cost = 20,
loc_vars = function(self, info_queue, card)
return { vars = { G.GAME.probabilities.normal , card.ability.extra.odds } }
end,
calculate = function(self, card, context)
if context.scoring_hand then
if pseudorandom('alexandria') < G.GAME.probabilities.normal / card.ability.extra.odds then
local faces = {}
for k, v in ipairs(context.scoring_hand) do
if v:is_face() then
faces[#faces+1] = v
v:set_edition(G.P_CENTERS.m_negative, nil, true)
end
end
if #faces > 0 then
return {
message = localize('k_:3!'),
colour = G.C.MONEY,
card = self
}
end
end
end
end
}
card.config.center ~= G.P_CENTERS.c_base
SMODS.has_enhancement(card, "m_mult")
oh yeah any enhancement
Well, now you have both interpretations
the context is not right
I think there's also
what timing do you want?
#SMODS.get_enhancements(card) > 0
either context.before or context.after will work here
for any enhancements
what should i replace?
dunno, depends on the timing you want
bump
upon scoring
ah i see
How could one make it so you draw your most played hand when blind is selected?
wait
I did a janky ass method to do it with my deck back, you could do the same without the rarity comparisons and not removing the previous joker
that is indeed quite jank
I'd hope there's a better method out there
I will go scour the archives
(github pages of existing mods)
It's mostly the same idea as rare tags, but it replaces a joker rather than just shoving in one
I mean I don't wanna shove something in or anything
I just wanna add legendaries to the shop pool
SMODS.Joker {
key = 'alexandria',
loc_txt = {
name = 'Alexandria',
text = {
"{C:green}#1# in #2#{} chance for each",
"scored face card to become{C:dark_edition} Negative{}"
}
},
config = { extra = { odds = 3} },
rarity = 4,
atlas = 'Jokers',
unlocked = true,
discovered = true,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = false,
pos = { x = 1, y = 0 },
soul_pos = { x = 1, y = 1 },
cost = 20,
loc_vars = function(self, info_queue, card)
return { vars = { G.GAME.probabilities.normal , card.ability.extra.odds } }
end,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play do
if pseudorandom('alexandria') < G.GAME.probabilities.normal / card.ability.extra.odds then
if context.other_card:is_face() then
context.other_card:set_edition("e_negative", nil, true)
return {
message = localize('k_:3!'),
colour = G.C.MONEY,
card = card
}
end
end
end
end
}
with their respective weights or whatever
god, the indentation is horrible
i wrote that on discord 💔
oh wait
the key for negative isnt m_neagtive, is it?
it's e_negative
neagtive
cuz it's an edition 💔
there, fixed :3
shhhhhhh
ngl i have no idea how emperor even functions after reading through its implementation
I almost have four of a kind working but some of the cards that get drawn are ghost cards.
watchu confused about
i can probably break the code down for u
Some of the base game code is actually incomprehendible because it relies on like 5 other functions you wouldn't think it relies on to work, and you can't easily search for them
thats very vague, since its hard to determine which rank you should draw
when its in a consumable slot and you use it, it still makes the right amount of tarots even though its currently taking one slot up, specifically in the case where you have 2 consumable slots
I have it so it chooses random ranks.
i am still getting errors :(
you could do smt like:
- if first card about to be drawn has 3 other copies in the deck, prioritize them
- have a pool for ranks which can do a 4oak
specifically unexpected character near the last }
wha
oh yeah, i see whats wrong
if context.individual and context.cardarea == G.play then
if pseudorandom('alexandria') < G.GAME.probabilities.normal / card.ability.extra.odds then
if context.other_card:is_face() then
context.other_card:set_edition("e_negative", nil, true)
return {
message = localize('k_:3!'),
colour = G.C.MONEY,
card = card
}
end
end
end
here
sorry, its kinda inconvenient coding on discord lol
its ok you are fixing my code for me lol
hmm
unexpected symbol near "if" error message
-# wtf
2 consumable slots, one with emperor, one blank
use emperor, properly makes 2 tarots even though only one slot is open
basically i just need to differentiate between when its in a consumable slot or not so i can account for that when writing thecan_usefunction
LOL
yes
i just get an error every time i boot up the game
show me your joker's full code rn
mkay
SMODS.Joker {
key = 'alexandria',
loc_txt = {
name = 'Alexandria',
text = {
"{C:green}#1# in #2#{} chance for each",
"scored face card to become{C:dark_edition} Negative{}"
}
},
config = { extra = { odds = 3} },
rarity = 4,
atlas = 'Jokers',
unlocked = true,
discovered = true,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = false,
pos = { x = 1, y = 0 },
soul_pos = { x = 1, y = 1 },
cost = 20,
loc_vars = function(self, info_queue, card)
return { vars = { G.GAME.probabilities.normal , card.ability.extra.odds } }
end,
if context.individual and context.cardarea == G.play then
if pseudorandom('alexandria') < G.GAME.probabilities.normal / card.ability.extra.odds then
if context.other_card:is_face() then
context.other_card:set_edition("e_negative", nil, true)
return {
message = localize('k_:3!'),
colour = G.C.MONEY,
card = card
}
end
end
end
}
B r u h
😭
its fine its fine
another error?????
-# :3
SMODS.Joker {
key = 'alexandria',
loc_txt = {
name = 'Alexandria',
text = {
"{C:green}#1# in #2#{} chance for each",
"scored face card to become{C:dark_edition} Negative{}"
}
},
config = { extra = { odds = 3} },
rarity = 4,
atlas = 'Jokers',
unlocked = true,
discovered = true,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = false,
pos = { x = 1, y = 0 },
soul_pos = { x = 1, y = 1 },
cost = 20,
loc_vars = function(self, info_queue, card)
return { vars = { G.GAME.probabilities.normal , card.ability.extra.odds } }
end,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
if pseudorandom('alexandria') < G.GAME.probabilities.normal / card.ability.extra.odds then
if context.other_card:is_face() then
context.other_card:set_edition("e_negative", nil, true)
return {
message = localize('k_:3!'),
colour = G.C.MONEY,
card = card
}
end
end
end
}```
you are missing an end
WHU
i gotcha
im just confused as to how im so bad at copy pasting
also, the joker displays "ERROR" instead of my text
should i just have plain text in there instead of a function?
the function is fine, i think having ":3" in there kinda fucks it up
thats just the key to the spot in the language file right?
it can still say ':3'
just have a different key
ol reliable divide by zero error
0/0 for the funni
still error
did u change the key in your localization file
this does have actualy reason behind it tho lol
im printing a table and to make it only print once im just making it crash immediately afterwards
ah, icic
the what
no
it should and does!
plan b
💔
i just need to know where the beginning of this table is
wat r u tryin to achieve here
i want to see if i can figure out if a card is in the consumable slot with card.area in the can_use function
so i want to read the card.area table
so i need to know where it starts
you can just
#G.consumeables.cards
nope
which will print out how many cards there are in the consumeable area, no?
^
im basically making custom emperor
ah ic
local cardInArea = nil
for _,v in ipairs(G.consumeables.cards) do
if v == card then cardInArea = true break end
end
wouldnt that return true if i have a copy of the card in my consumable area?
if you want it to check for copies then you should check for their keys instead
got this lad workin
card.config.center.key
yea idc about copies
mhm, just saying so that you know how to in the future :D
mainly just so it doesnt break when showman is there
yep, thanks!
what about A, 3, 5, 7 and 9 tho
may be worth putting that in the description
reduced to atoms
i think it would be funny if i didn't
because it is what it says on the tin
1000 (8)
0100 (4)
0010 (2)
0001 (A)
0000 (uh ohj)
well i just meant abt it rounding down, the aces thing should be discovered not told
bitshifts works by just ignoring the right digit and replacing the left digit with 0
so 0101 (5) -> 0010 (2)
i want to show this behaviour in the card art
so i think it's fineeee
I'm imagining something like just a binary number with an arrow going from a bit on the left to a bit on the right
im so close to being done here, but for some reason its returning false while its in a booster pack
can_use = function(self, card)
local cardInArea = nil
for _,v in ipairs(G.consumeables.cards) do
if v == card then cardInArea = true break end
end
if cardInArea then
if #G.consumeables.cards + G.GAME.consumeable_buffer + self.config.extra.num_potions - 1 <= G.consumeables.config.card_limit then
return true
end
else
if #G.consumeables.cards + G.GAME.consumeable_buffer + self.config.extra.num_potions <= G.consumeables.config.card_limit then
return true
end
end
return false
end,
self.config.extra.num_potions is just the number of consumables its making
i never reset the consumable buffer, oops
no...?
for some reason the consumable buffer is equal to 3
and wont change
let me try a new run
yea that fixed it
Good example of the rng legitimately just hating me, I just died on round 1 because the game absolutely refused to give me the card needed to complete a full house
In all discards and all hands
something tells me i absolutely didn't do this right
I think if you're using the new calculate method for Blinds, you can just return {juice_up = …}
SMODS.juice_up_blind()
or whatever the key was
try that
mhm, i know that
but is there a way to not use return for that?
maybe this
god my brain is bring fried
function SMODS.juice_up_blind()
local ui_elem = G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff')
for _, v in ipairs(ui_elem.children) do
v.children[1]:juice_up(0.3, 0)
end
G.GAME.blind:juice_up()
end
is there a calculate phase or a hook for when after the deck is shuffled?
I think you can refer to the blind with G.GAME.blind and that works with :juice_up()
yeah
I'm ok thanks for asking you too
this is what i wanted to figure out, and it seems G.GAME.blind is the answer, thanks everyone
-# power went out for 3s, so my wifi went down
oh and uh, this too :3
that earthquake was scary
yep it sure was
i love how everyone on Twitter was mentioning how they thought they were just dizzy
i was at school
haha same
me too
why tf are there elements in balatro
are you making balatro rpg
-# and equipments, status effects, buffs, debuffs and such
iffff you know about honkai star rail, then its a lot easier to explain
but basically, yes
so it's like genshin impact
thats a close comparison
how do i make it so that it also shows chips cause i dont know how to add the chips value and i also have thing to scale the chips
i added gacha to hsr too
:3
like, you dont just get jokers from shop now
you need to roll for it
wait lemme show u
now we just need to add gacha to balatro as well
hey belis
hii
it takes the var corresponding to that order in loc_vars, and put it in there
#1# is the first variable in the loc_vars table, it's inserted into the text
im bad at explaining :3
#2# would be the second one, #3# would the third one, etc...
so would this be #1
And if you're wondering C: is for the text color, and X: is for the background color
#1#, it has the symbol on both sides, but yes
so for 2 would i do another return under the return
No, you would add a second variable inside the vars table
Oh I didn't realize you were in the region. Good to hear that you're ok
So if you wanted a #1#, #2#, and #3# variable, you'd put return {vars = {variable1 = thing, variable2 = thing, variable3 = thing}}
Bangkok is affected
correction, no variable =
I'm fine
For loc_vars you just put in the variable name, and add card/center.ability.extra. before it
No
i know im stupid im sorry :<
To be honest I thought you were in Vietnam
You put the center.ability.extra.chips as a second variable inside the already existing vars table
everyone felt as if they were lightheaded
So it'd be return {vars = {center.ability.extra.Xmult, center.ability.extra.chips}}
Also notice how it's underlined in red, because that's incorrect formatting
No
It's a table, every entry in the table is separated by a comma, not a completely separate set of curly brackets
ok
The curly brackets make it a table
I honestly think it'd be a good idea for you to just read up on how lua works so you get the actual formatting / syntax of it down
look it took me 3 attempts but i think i got it
center.ability.extra.chips
close enough :3
You also need to put chips = number into the same place as Xmult in the extra table right above loc_vars
i have
Can you please send a screenshot of that, I am legitimately not convinced it will be accurate
Okay, strange indenting, but that will work
fuck my stupid baka life
Wait, take a screenshot of the area directly below that please
how exactly am I supposed to make legendary jokers appear in shop
You've always got my horrible method
yeah that won't work
I mean I haven't tried it but I don't like it so I'm not doing it that way
Okay, that's working, good, for a split second I thought the loc_vars text was a closing square bracket
Fair enough, always an option worst case scenario though
vanilla dictates legendary jokers only come from Soul so what i usually do is just make a consumable that spawns my legendaries
no somone taught me to end a function with a return
everytime i fail i learn and therfor evolve
I'm pretty sure yours did something subtly different to putting them in the shop pool
its a slow proscess but it works (sometimes)
and I wish to undictate that
You end events with returns you end functions with end
and to be fair i have only been learning lua for about a total of 3hours
and a hour of that was during a math exam
You could make Gorr give you a tag that spawns legendary jokers in the shop, just a straight rip of the vanilla tag with a different rarity pool
(i passed dw)
but the code is unbelievably cryptic and I have no fucking idea what does what
I'm not making them forcibly appear, I just want them to be in the pool with their own weight
like they can appear but it's not a guarantee
you might wanna make a custom rarity?
If you don't wanna take any shortcuts at all and want to make it 100% the way you want it you might not get what you want
... it's supposed to be legendaries not a custom rarity
like perkeo and shit
Also that looks pretty damn cool, only issue I have is that it conflicts with the Balatro color scheme pretty badly and on a big part of the screen consistently
ahh it works
it says how many chips
im so smart
gotta be in the top 10 billion smartest people
🫡
maybe even top 8 billion
ehh i wouldnt go that far
will my boss blind be fun to fight against i wonder
yeah the violent lime is pretty bad
AUGH
I'd make it lean more toward olive and darken the background color a bit
ACID TRIP UPON YE
once again i am back to ask more dumb questions
today i will be asking about colours
whoaa...
so X:mult makes background red but what makes it blue :3
You can use blue or chips
yeah
The G.C colors are used for message backgrounds and visual effects
so {C:chips}text here adlskjfhasldkjffhkja{}
{} is used to reset to the default color
Negative always looks nice
Like, I feel like you can't make a bad looking negative card
Also, off-topic, but thank god lua actually tells you where the hell your code stops working
-# Most of the time
yeah
line too!
less assaulty
(ignore the bottom right nightmare that one's atrocious on purpose [it is referencing a horrible ad])
It still doesn't look that bad
the violent magenta kinda pains me
YEAH BUDDY
I really like the flat colored minimally shaded object jokers
ok so basically that works
polychrome is interesting
✋
🤚
some of these negative suck imo
i cant figure out adding another colour so i think its time for bed and tomorow i will wake up and continue to slam my head against a wall
:3
This is how I've added legendaries to the shop pool ```toml
Add Legendary to Joker ObjectType
[[patches]]
[patches.pattern]
target = '''=[SMODS _ "src/game_object.lua"]'''
pattern = '''
{ key = "Common" },
{ key = "Uncommon" },
{ key = "Rare" },
'''
position = "after"
payload = '''{ key = "Legendary" }, '''
match_indent = true
times = 1
lua
add_to_deck = function (self, card, from_debuff)
SMODS.ObjectTypes["Joker"].rarities[4].weight = 50 -- temp value just to see if it works
end,
remove_from_deck = function (self, card, from_debuff)
SMODS.ObjectTypes["Joker"].rarities[4].weight = 0
end
Very nice, I have no idea what any of that means
although technically this is wherever jokers go
so you could pull a perkeo from a judgment if you're really lucky

unless judgment has some restrictions I'm not aware of
Also, balance question: I have a joker that destroys all cards played in first hand, but stores them inside the joker, and puts them into your hand all at once when you sell it, and they gain bonus chips while they're stored, is 10 extra chips per hand played while stored too much?
I actually feel like it's kinda weak
If you consume like, 5 hands worth of cards, 25 cards, the first 5 cards you stored would have +50 extra chips
nah cause you get to remove cards + when you get them back they are all scalling more thatn if you had 2 hikers
if i am reading correct
cause if you have say 5 hands
2 blinds is all those cards +100 chips
It adds 10 chips every time you play a hand, not just whenever you consume cards
i know
I'm just clarifying
honestly i would call the joker the bank and have the amount of chips it adds equil to the rate of inflation
I called it the Joker of Holding
or intrest rates
is that a dnd refrence
I wanted to add an alternate method of getting to naneinf, because you could consume your entire deck, and then draw your entire deck at once
Yeah, like Hiker
Trying to get it to destroy scored cards, and it does destroy them but also doesn't?
I feel like you're not getting to naneinf easily with this though
Add remove = true to a return table
And put context.destroy_cards in the if statement
mainly cuz it's chips and not mult, but also cuz you still gotta get through the blinds so consuming your entire deck isn't too viable
Not the best method, an alternate method
If you've already turned the majority of your deck into like, steel red seal kings for Baron, you can start consuming them to prepare for naneinf
No Perkeo + Cryptid or Burgler + Serpent needed
Just the Joker of Holding
oh hoh ho
I suspect that it'll be a help in early antes, but the chips seem negligible compared to the deck fixing potential
Good schmorning chat
What's up Dillster
Ice my goat
also
what's the card area for shop cards?
help
G.shop_jokers i think?
maybe ```lua
local playing_cards_created = {}
for i = 1, 30, 1 do
-- ...
playing_cards_created[#playing_cards_created + 1] = true
end
wdy want to do
and then put that in the return table
It's the card you find later in your run that allows you to go further beyond
im pretty sure i'm supposed to return all the added cards into playing_cards_added
I think generally the chips aren't going to be very useful, so I wouldn't worry about them being unbalanced
but DNA just does TRUE so...
Have you implemented it yet?
is this the correct way to init Talisman compat
Yea considering your deck let's you play all of 10 5 card hands the chip gain isn't really that great
Bepis!
hi dillyyy
Hello :)
Oh boy
I got a really stupid idea: What if it adds the base chips of all scored cards to the currently stored cards for each hand?
Give it xchips and now we're talkin
Haven't watched yet but I'll say yea
each card in hand has 50% to turn into glass (no steel kings for u)
Alright I've watched and what the heck
is there any website to download sprite from sheet
AND destroy all glass cards in hand
:3
and this is not the last phase yet
hehe
i will give the player every played card back into the deck
at phase 3
-# that is if you still have any
this is boutta be devious if it works
is your mod's gimmick every card name starts with a B
Myst hates the letter B confirmed
Byst
is this real chat
Is anything ever truly real
this is one of the "i like pancakes so you hate waffles" moment of all time
finally.. cryptid: 🅱️ edition
oh shit forgot to turn off ping my bad
yes
wow
wow
man discord really needs to add a "default: no reply ping" option
Btw, I don't know if you've implemented it already, Kàeda, but if you want, I can send you the code for Kino's abduction mechanic, because maybe the card indicator might be useful for it!
I tapped the no ping button so hopefully it worked :)
only phase 3 left
yeah unfortunately it's not just the jokers that start with b
discord should really let users decide what the default is when other people try to ping them, would solve so many issues
then im also pushing this one hell of a boss to my mod
Bepis when can I commission you to make me some blinds with a firm handshake
can we have a bepis joker :3
i should have mod commissions frfr
im hard-carried by #1339575571377557557 ngl 💔
i stiliatlsmtlmatilmom ;3;3;3;3
its basically "i made this and now i'm forcing this on you"
i can't tell if you mean the undertale error message, the misspelling of pepsi, or the other thing
how do i properly get the localized name of an enhancement? tried localize(key) but that returns ERROR
blind that summons itself forever until you score the exact amount of chips
its my name lel
🪺
It's alright I'll just comm you to port expander specifically to my mod so i don't have to require it 😎
I should break apart Kino and see if there's anything there that I can set up to be an API mod, because surely at this point I've accidentally set up some systems that are useful for others
use localize with set Enhanced
Maybe once I get the localization for quests working, I guess
Quests would be cool to implement
abduction mechanic?
would anyone want an API made for making RPG systems
the b in Bountiful stands for balanced (hopefully)
🤔
kid named copying it over and requiring it if blindexpander isn't loaded yet
this is also true for the b in Cryptid
Balatro: the way home
I didn't think it was allowed to just copy it and include it and didn't want to step on ur toes
That's smth we can do?
I assume we just leave you credit n shit
n mentioned
i have decided that all the mods i was going to make seperately (save for Imaginarium because it's essentially gonna have to be a complete overhaul) are just gonna be crammed into the same mod
Kino's got a mechanic in which certain jokers move cards to a separate card area and store those in the joker, and return the cards with an addition. There were some issues I kept running into when it came to visually having everything work, so unless you already solved it yourself, it might be a good thing as an example
the prerequisite is asking me
I literally just have the cards stored in a table variable on the joker
does that survive a save/load?
Well, do you mind if I gain some notion of intelligence including blind expander into my mod leaving you credit on the page?
I think so, it's not referencing cards that already exist, it destroys the cards themselves, it just stores the information of the card to create a new card later
what have i done
maybe i should just port blindexpander's code over to my mod too
and put a bigass billboard in the main menu
crediting myst :3
Currently table: 0x3df43690
if anyone here has made a mod that adds more suits, how do you actually implement them? i dont mean how do you make them, i mean like. how do you make it so the player can actually get them, from a game design perspective
sure
extra deck? overhaul every deck to include it?
add blindexpander as a provide for your mod probably idk
I assume you can make them unlock through beating some stakes or smth
hmmmmmmm
ahh, yeah, that'd work as well of course. I opted for moving the cards just to store things to be sure that if a mod adds anything I didn't account for, it doesn't get deleted
but with smods handling card upgrades of any kind now, that's also less of a problem
what i mean by this is like:
- if blindexpander (the separate mod) and lcorp (THE mod) arent installed, dont load the file with blindexpander's code
- else, loads
If it exists in the card data, it gets stored
Bunco had them unlocked by playing a Spectrum using a Wild Card and base suits
that's a very good point. I'm happy with the way I've set up abduction now, because it allows me to copy the abilities of jokers too, and do other weird things, but I think you've set up a smarter solution that is probably less work to set up without breaking everything, hahaha
i think im stupid i genuinely can't figure out how to do this properly
we are feeling earthquake with this one
development resumes today when i feel less tired
I also want the cards to be completely inert while inside of the joker
cos u make my earfquake
i might make a "Petrification" card or smth that converts every card of a random/selected suit to the modded Snakes suit
-# (there was an earthquake in Myanmar that reached Bangkok)
-# oh
hi aiko
-# being serious btw
-# mb gang
oh damn, aiko, I was just reading about it in the news. Glad you're not closer to the center of it!
-# at least I'm fine
-# ye glad ur safe c:
how are you dealing with the visuals, btw? I had real issues trying to set that up, so I'm curious how you solved it. 90% you did it in a more efficient way than I, so in that case I'll beg to steal your code 😛
I think Bunco adds some? And that's with tarots mainly, iirc
also how do you guys deal with localisation? because right now i put in the loc_txt, let it generate the dump file, and then copy that over to the en-us file and remove the loc_txt lol
I just write in the localization file directly
I've never used loc_txt, in that regard
what the fuck is this
a table
ui table
i know that much
^ the person who made blind btw
why did i get a uibox when trying to get the name of an enhancement
i feel fundamental anxiety about the universe when one of the people I've categorized as 'real good at UI' says things like these, haha
we are fucked if eremel ever says he hates ui
me? good at ui? never!!
we are fucked if eremel says he hates anything
aiko is good at css they should be also good at ui
fr...
Aiko's also in that category
I'll upload a video
oooh thanks! I'm really curious! 😄
what if i
Check out Bunco, although personally I don't find their approach very vanilla
make it so it wipes out HALF of your deck
I guess I'll see it as well once your mod's out there ot be played with, haha
Paperback does it too
Thanos blind
2/3 of your deck it is
hi vic
Bunco strayed away from being vanilla a long time ago
but that makes the mod fresh
i am a wee bit tired but i am well, how are you?
I think Firch would disagree
Debuff all even cards or odd cards, swap which one is debuffed after each hand played [=
could be better
i am sorry to hear this, i hope you feel grand soon
is it unethical to hide mod badges
That's actually such a banger idea that I'd love to steal it and put this in Kino, haha
thanks
no
WHAT BLIND
it is illegal though, straight to clown jail with you
well you see, that's unethical
is my mod vanilla
yea
what
but it's not illegal
hands up in the air and drop your honky horn
belis told me you added a new blind
you never catch me alive
what
what
what
what
flavors.vanilla = flavors.plutonium
Yes
did you not add a new blind to your mod
@manic rune i know how to mod joker in now
when does it trigger
nice, congrats!!
the Gaslight is insane
that one she told me about
what is this
Today list for today is figuring out how the fuck I make a nice and dynamic localization method for randomly generated quests, or set up the system to make arbitrary pools for joker generation. I'm not sure I've solved either. Which one do I choose?
Gaslighting gatekeeping girlbossing
Destroying cards and the deck is a benefit
I don't understand what the score reduction does exactly
but it's the only negative part
G.localization.misc.v_dictionary allows for single-line variable replacing, otherwise you might want to make a new set in G.localization.descriptions
but it reduces score to 0 instead
have i been remembering wrong this whole time
-# i think its pretty much a loss if you trigger that effect
I wonder if my mod is compatible with Blindexpander
for arbitary joker pools, make fuctions that are similar to get_current_pool() and hook it to call your custom function
myst hello!!!
hi aiko did you survive
Because I decided not to use it since I had already copied some functionality and added some on top
I'm not dead
glad to hear
hows the wifi in the afterlife aiko
myst and aiko talking look like a short person talking to a tall person
yeah, i might need to either do clever stitching things together, or make a new set, because quest descriptions are stacking variables quite a bit. The other option is to go for broader quest descriptions as a base, so I need to do less stitching, but just have a lot more base descriptions
F
photo taken before the earthquake
maybe this is too op
fucking finally
ooh
i've set this part up. The main issue I'm having is storing a pool longterm so that I can make forced orders. But I'm thinking now I can set up a global table that just stores the next card it needs to spawn, and check if there's anything in there, and otherwise just move on
either way you'll still need G.localization.descriptions for quick and easy multi-line support
holy tarot looping
Do you know some of any mods that incorporate this? Does lobcorp do it? I'm sure I'll figure it out without an example, but I think it'll save me an hour if I can check somewhere 😛
thanks for the help btw, myst, it's appreciated ❤️
lobcorp does not, sorry
wtf
@hushed field Here's the consuming sequence
Isn't that where Jokers and other descriptions are?
how is a man supposed to mod if he cannot steal the exact functionality from better modders???
also I use the quips localization table for Joker messages
And here's the releasing process
oh, i think
i think it might be just stitching two UIBox returns from localize into one generate_UI return
i added autoline splicing to the sticker which shows debuffs/buffs in my mod
yeah, they are. I'm just trying to figure out how I go about stacking elements from there
Huh someone else doing Consuming
-# probably not what ur looking for tho
and I think it's exactly the same mechanic, minus other stats
oh, are you even using a customized shader? I love the look of that.
Nope, just start_dissolve and start_materialize with a custom color
I have no idea how to do shaders
i completely forgot you can pass colours to them
@hushed field actually it might be easier than I thought
Not my fault it the closet thing to documentation I can get
just pass nodes = table as an argument and it'll append the localization into the nodes table
and you can return the nodes after adding a few localizes
so, the thing you have to remember about this is that partial localization and assembling will just not work; even within germanic languages there can be a significant difference between the order of components within a sentence
Reference to Goya's "Saturn Devouring His Son"
Feel like the name is to long
you either drop localization or make templates for each different quest you implement
I also just added custom sounds for the joker
i considered this very same problem with baliatro bonus objectives
bag_noises.ogg
Do patches like ```
[[patches]]
[patches.pattern]
target = '=[SMODS _ "src/game_object.lua"]'
i can’t localize for shit so i just hope they can speak english
I think they should but Idk the proper formatting
no clue why it says ERROR before using the devil but hey at least it does the thing
they work and that is the correct formatting
man representing a concept like "snake" in a 11x11 solid colour suit icon is kinda hard
here is an example SMODS patch that i do and know works
## Calculate goals on individual playing card scoring.
[[patches]]
[patches.pattern]
target = '=[SMODS _ "src/utils.lua"]'
pattern = 'if next(effects) then'
position = 'before'
match_indent = true
payload = '''
if BALIATRO.feature_flags.loot then
BALIATRO.calculate_goal_context(context)
end
'''
wow
Also yesterday I reimplemented a "play again" mechanic #1343670935122870342 message
me and worm blind
I'm fully aware, haha (not to brag but I have a degree in linguistics after all 😛 ) But my current approach is that I'm making a mod that is not being translated as of now, so it's mainly just about using the localizatin file because that's where I keep text, more so than actually allowing for localization to work. Systems like this need a whole in-between layer between the text and the code to account for grammatical structures if you're going for generated text that can be localized, and that's at the moment a step I'm not really keen on developing, haha
just hide a tiny clone of ice inside each copy of the mod so they can translate in real time
you're not translating it, anyone playing it may contribute a localization and anything preventing proper translation will discourage that
how random are the quests going to be?
this is kind of why i'm saying, your quests won't be fully random, they're still probably going to follow a general structure (fixed set of goals), each goal can have its own full, normal localization template
then they can just localize{} into the same desc_nodes
what i'm saying is: building blocks can be treated as GameObjects that each can individually localize
and just build up from the bricks
yeah, I know, I know. It's more so that I'm developing this mod with mostly myself in mind, rather than taking a professional and player-oriented approach. But you're fully right in that sense, of course. But having that voice that tells me to account for it be externalized by someone else is definitely a more convincing argument to actually set it up properly, so I'll do that instead
So now my 3 rare jokers have custom sounds, and also an uncommon joker that has Wii Sports sounds, do you think custom sounds are too much for Balatro, or should I try to add as many as I can to make my jokers more unique?
Because it makes it quite obvious that I'm using that logic on my end just as an excuse not to have to make things that seem difficult 😛
It'd run into the same problem because I only speak european languages 😛
I wanna have an in-between of vanilla and Cryptid, not quite as faithful to the original game, but also not completely batshit insane and off-model by default
Try learning an American language like Portuguese, Spanish, or English
hahaha
...
in hindsight i probably should've read the context but i got mildly triggered for a second, well done

epicly trolled
You’re right I forgot French
ok
