#š»ć»modding-dev
1 messages Ā· Page 266 of 1
so true
curious
Hello there, I have a question as I am trying to set up the balatro mod manager on Garuda Linux, it is an arch based distribution of Linux and I am going to send the entire backtrace text error. I got here from when I did the installation of the mod manager if anyone has installed the Balatro mod manager on any distribution of Linux. Any tips would be helpful. it is running and fully completely installed however, it is having issues. The main problem is that I have done everything to my knowledge on what to do. Iām binary divided all the way down to rebooting my PC through the terminal along with getting new bottles opened for the mod manager through many more forms of bottles this is just a part of the problems. Iām having on here with the mod manager for Linux.
you need to loop through full_hand and check which ones are not in scoring_hand
context.cardarea == 'unscored' might work?
or use the unscored optional
only know about that one because Aure called me an idiot when I suggested this last time someone asked
i know about it because i read the commits but i dont want to explain to people how to enable optional features š
does the smods wiki not explain optional features?
if it does I don't know where
oh they in fact do not
yea the wiki isnt exactl;y the most up to date with the here and now as far as im concerned
i think this function is my problem but idk why it wouldnt be working
good night balatro modders
it seems to return false when it shouldnt
gn
what does this do?
i use it to check if a card is in the table i give it, pool is the table, object is the card
the if ~= 0 check seems unnecessary btw
you need to either return true instead of changing return_value or break the loop there
and so does the whole return_value argument
if the length of pool is 0 then pool[1] is nil and caused a error
wait, lua does that?
i was getting an error there and that addition fixed it, so i assume so
any idea why this is happening
Can you access the badge_colour from a mod as a property?
why would it fail here when its calling the original method
so this instead?
yes but return false at the end as well
well yeah, but that doesn't impact your function's behavior
added the false return
true
try reducing the amount of lines here as example of the crash, there's a bit too many
it still works the exact same, so it wouldnt fix my issue
that's not true
returns the exact same values
return_value changed to false after the next loop
here
it's different logic
no?
it didn't?
got set at the beginning, only changes to true when the if statement is true
let's say you have {1,2,3}
and you need to check for 2
return_value goes to false then true then false and returns false
oh yeah i guess i misread
you forgot to pass self to the original func
ok so what's object
a card generated by create_card
similarly, what is is_in_pool for?
oh then its object.config.center.key
im gonna give more cotext for this functions use
i wrote this to generate the cards for my booster packs
mod.badge_colour
value_in_table does the same as is_in_pool but checks the values directly instead of the object.key
(you can find the mod with SMODS.find_mod)
yeah it should be object.config.center.key afaik
well idk if thats it there might be more problems
do local functions exist? and if so should i make this one of those?
its only used in this file
if you plan to only call it in that file then yes
what most mods do as well is create their own global table and add their utility functions there
but local functions are fine
I don't recommend globals because they can cause conflicts
i may do that
its not in an infinite loop anymore! :D
that one is probably a wrong call to create_card
I'd recommend using the smods one because it's less confusing
i keep meaning to use the smods one but i forget sometimes
same error
this is the line that caused it
ugh
i cant make sense of the drawing code
to fix it so scaling works from top left and not the center
what's the code now
the stuff i wrote?
yeah
the smods one takes a table with keys
ohhh
is there a way i can get the default card i set for my TerraPotion class?
instead of just writing it in
it's probably stored somewhere but I couldn't tell you where rn
can i see it again
RAGGHHH
nice art
that looks correct, are you sure the consumabletype is loaded?
yes
potion has the consumabletype, booster has the function im working on
oh wait this was a different spot i think
this error is at function copy_card()
How do I get jokers to not crash my game when trying to access a context inside the update function?
don't access a context in the update function?
wait nvm, thats in the base game without the lovely injection
Do copy cards not even acknowledge the update function?
can i make a card where its 50% for one outcome and 50% for the other but its one or the other
yea just use "if else"?
I DID IT
but one outcome is guaranteed to happen, like a coinflip
like no matter what something happens
like blueprint? no
outcome 1
else
outcome 2
end
oh thatās easy enough lol
What context would you use for a joker that randomly copies the abilities of one other joker that a player owns?
when blind is selected
stencil only run
i think i figured it out and istg if it was this simple of a fix
stencil, invis joker, ankh, and this new joker
i might make ācursedā cards that destroy after theyāre played 3 times
or if the player attempts to change them back
no upside
then why make them
itās a bad effect of a ritual card
Does anyone know what the problem might be?
itās designed to be awful
well whats the good effect of that ritual card?
if i have no reason to use it why use it?
maybe +1 joker slot
or something like that
yea thats worth it
in exchange for your entire hand becoming cursed
op
if played right it could assist in deck thinning
that too
like baiting it into making all the cards you donāt want disintegrate
this is the error im currently getting, any idea why?
boss blind that makes all cards held in hand at the end of the hand cursed
would that be regular boss blind level or showdown level
because once a card is cursed itās pretty much fucked
and isnāt an empty deck a lose condition
yep
so yeah
maybe showdown? iām not sure
or makes every card that exists on the field cursed
if i wanted to make it into a showdown
so it encourages you to hurry up and play big numbers
im pretty sure balatro multiplayer has one
please š
oh i got this
can i see your code
what are you trying to do?
something like this worked for me
you were there when we solved the problem š
but its getting past that function
oh hm
its returning the table
idk then sorry
same lol
or somthing like this
local card = create_card('Perkeo', G.jokers, nil,nil,nil,nil,'j_perkeo')
idk what youre doing
this is just how i make perkeos
i managed to fix the error with create_card that i was getting
SMODS.create_card{key="j_perkeo"} is nicer
are you sure c_terrapot_builder exists
well i need to make it neagtive too
SMODS.create_card{key="j_perkeo", edition="e_negative"}
yes
this is saying juice up is returning nil, not sure how to fix that here
remove card = self (you don't need to return card and self is a center, not a card)
what's the code for the booster?
ty
get_potion_booster_cards returns a table with the cards right?
yep
yes
ah
yea
What determines if you can hook a function? It looks like I can hook end_round, but not start_run
that fixed it thank you
you can hook most functions but some might be called before the mod is loaded
you can hook start_run I'm sure
how do i delete cards?
depends on the type of deletion but card:start_dissolve() is fine in most cases
When I try it crashes when the mod is loading, and the intellisense wants a parentheses after start_run to call the function, but that doesn't happen for end_round
i just need to remove the cards that dont end up in the card pack after being checked
you can do card:remove() too
well the start_run one might have a syntax error?
i was thinking about āunstableā cards that have a 1 in 16 chance to destroy themselves and all cards adjacent to them, 4x mult
this is gros michel 1 in 16 btw so more like 1 in 2
i feel like this is only upsides depending on how you play it
not that thats a bad thing
it was originally 1 in 50 to destroy every card that it shares a rank with
i suppose
if you are purposefully deck thinning itās great
if you are playing off of one rank
i mean
and then that rank fucking kills itself
like i would say
1 in 50 is rolled on play AND discard
itās rolled any time the card is scored
and even if u somehow got it randomly
i never said that.
u can hanged man it
dont play em if u dont have to
i think
thats a good way of making it harder
tho
i actually like that a lot
ah ah ah you see itās checked on discard. held in hand effects. and when played
the blind scaling is higher
oh boy
yea
that can be tough
baron builds will die š
baron mains watching another boss blind counter their strat
thereās also curses that destroy themself after being played thrice o
i like this
or if the enhancement is changed
because it could fuck you up if u got only reroll and not retcon
reroll plant into this boss
and then hit the 1/50
go from The Wasteland to the Plant
yea
then faces donāt work anymore
itās fun making card enhancements that hurt
but still bad
im making the opposite
or āenhancementsā
stickers that are very helpful and nice
i have one enhancement thatās good called āgalacticalā
itās a 1 in 20 chance to upgrade hand when played
like space joker
and ofc it applies right with 6s
a lot of oa6 is needed
itās like luckies p much
but thereās a joker that like midas mask but for galactical
the Alien Joker
so theyāre easy to stock up on
i have a really nice mod cooking up
i also have a Bomb Joker that does what unstable cards do but for jokers
higher xMult
but it blows up itself and jokers around it if you get unlucky
making blueprinting it really risky
im adding a bomb sticker too :)
its for playing cards only tho
the tag to get a mega pack is gonna be the āpentagram tagā
im getting another error :/
somehow smods.create_card is getting a nil value
I think I figured it out, you have to use Game.start_run, not Game:start_run?
hereās one of the Rituals btw
it destroys a random joker and grants 2 random Ritual Cards
I'd need to see the code
here is juxtaposition
yes
50% shot to dupe a joker
u do
50% shot to destroy it
as another note, if ur hook returns the original function you need to return self as the first argument before the other arguments
also thereās Blood Pact that makes a eternal rare joker
And you have to add self when you call the original function from in the hook function
As I just found out lol
how do you access the key of a specific Joker in the calculate function? Like this value in particular without the mod prefix or j_
I forgor
added my mod to my nickname like it seems everyone here does
nvm im dum
crap its still there
isn't it like card.config.center.original_key
Bingo, that's it. Thanks
yes
my phone aināt charging desperate times call for desperate measures
are these balanced for legendaries (art not by me)
Can't speak on the last one because I've never played with exponents but yea
Yea that one may be a little unbalanced relative to vanilla
my phone started charging
i love when the documentation lies :D /bout to crash out
well
hmmm
maybe not
15 minutes on a single typo
okay
30^1.3 = 83, around 2.5X
300^1.3, = 1660, around 5X
1000^1.3 = 7943, around 8X
Fix it
i low key might write some more documentation
or try to
itās open source
if i canāt put it in main then ill make it elsewhere
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
for k, v in ipairs(context.scoring_hand) do
if SMODS.has_enhancement(v, 'm_lucky') then
return {
mult = card.ability.extra.mult,
dollars = card.ability.extra.gold,
v:set_ability(G.P_CENTERS.c_base, nil, true)
}
end
end
end
end
I am trying to create a function that checks if a card is lucky, if it is, it gives both 20 mult and 20 dollars but removes enhancement.
The current implementation removes the enhancement first before giving the bonus mult and gold, is there a way to reverse the order?
yes, use an event
also you don't need to return the set_ability call, it does nothing
ah okay
how does one go about doing this š
lol, would it be feasible to limit the suit pool to just 3 suits?
thank you!
here's an example from my mod https://github.com/nh6574/JoyousSpring/blob/9731a0a2f148d9b872b1160aae8051422d867fc9/src/jokers/12Labrynth.lua#L44
thank you :)
Is there a way to make negative have no extra cost?
wouldnāt an event let you delay the effect you want later
so i have this consumable and a few others that all should be added to the 'HealingPotion' pool but G.P_CENTER_POOLS['HealingPotion'] is blank
if iām not wrong
that would be done though time right, i want it to be dynamic
Is it possible to make an enhanced card do something from inside the deck? When I do context.end_of_round it doesn't run anything for deck cards
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
for k, v in ipairs(context.scoring_hand) do
if SMODS.has_enhancement(v, 'm_lucky') then
return {
mult = card.ability.extra.mult,
dollars = card.ability.extra.gold,
},
G.E_MANAGER:add_event(Event({
func = function()
if v.ability.name == 'Glass Card' then
v:shatter()
else
v:start_dissolve(nil)
end
return true
end
}))
end
end
end
end
My current implementation, the lucky card immediately gets destroyed and the +20 mult, +20 gold happens over empty space...
I suppose, I just have to time it takes for a card to score and add a delay accordingly?
To do something similar for my own thing I just made it do it on the final_scoring_step, and it iterates through G.play.cards to find the cards
Might not be the exact order you want, but that worked for me
thats a great idea actually incase i want to keep the card till all the scoring is done then i can destroy it
is there a way to multiply chips?
there probably is a way to fetch the current chips, then you can just modify it with your multiplier
joke answer: yes, it is called mult
fair.
There is also xchips.
let me try that again it was adding last i used xchips
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
for k, v in ipairs(context.scoring_hand) do
if SMODS.has_enhancement(v, 'm_lucky') then
return {
mult = card.ability.extra.mult,
dollars = card.ability.extra.gold,
}
end
end
end
if context.final_scoring_step then
for k, v in ipairs(context.scoring_hand) do
if SMODS.has_enhancement(v, 'm_lucky') then
if v.ability.name == 'Glass Card' then
v:shatter()
else
v:start_dissolve(nil)
end
end
end
end
end
It is being destroyed immediately here
thanks, thought i was up a creek, its now working
before scoring
wait a minute...
and the scoring happens after the destruction animation lol
I just realized something
Needs to be inside of an event
can't you make double resolution sprites and have pixel smoothing be a toggle between regular 71x95 and enhanced 142x190 sprites? :O
Technically the final scoring step happens at the start of scoring, but it waits until events or returns to actually do anything
so it's like 2 texture packs in 1
anyone know the code to have a joker destroy specific scored cards? I have a joker that I want to score cards, and then destroy them. I tried
if v:is_suit("Hearts") or v:is_suit("Diamonds") then
v:start_dissolve()
end
end```
but it destroys the cards at the beginning of scoring
would be at the same indentation as the if context.individual? or one step further?
Inside context.individual
okay let me try
Dissolve =/= deleting, use the context.destroy_cards, this is my code for making it work
if card.ability.extra.joker_triggers == 0 then
for k,v in pairs(G.play.cards) do
G.E_MANAGER:add_event(Event({
func = function()
v:start_dissolve({G.C.CONSUMED, G.C.WHITE, G.C.WHITE}, true, 5)
return true
end,
blocking = true
}))
delay(0.2)
end
end
card.ability.extra.joker_triggers = 1
delay(0.5)
return {remove = true}
end```
Change the colors for the dissolve though
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
for k, v in ipairs(context.scoring_hand) do
if SMODS.has_enhancement(v, 'm_lucky') then
return {
mult = card.ability.extra.mult,
dollars = card.ability.extra.gold,
}
end
end
G.E_MANAGER:add_event(Event({
func = function()
if context.final_scoring_step then
for k, v in ipairs(context.scoring_hand) do
if SMODS.has_enhancement(v, 'm_lucky') then
if v.ability.name == 'Glass Card' then
v:shatter()
else
v:start_dissolve(nil)
end
end
end
end
return true
end
}))
end
end
I did this but it just discards without destroying the card
Put joker_triggers = 0 in the extra config, and set card.ability.extra.joker_triggers back to zero in final_scoring_step
What I just said to the other person is actually exactly how you should structure it
making a joker only for this pun (ignore how the joker color is incorrect)
HOLY SHIT YOU CAN
someone should make a texture pack for this ngl
Is there a way to change the colour of xmult on playing cards instead of just being red?
in your return table, write this instead:
{
Xmult_mod = [XMULT],
message = "X"..[XMULT],
colour = G.C.[COLOUR]
}
reminder to change [XMULT] and [COLOUR]
how?
No, on playing cards it's always red.
because the atlas for the 2x jokers, as an example, is at 142x190
and the game doesn't look for if they're the exact same sprites
it just looks for if they're the same file name
so if pixel smoothing's on, you can use the 2x textures as actual double-resolution textures
If I already have an if statement in my calculate function doing scoring, should I add this into it or add it after? for reference my calculate function is:
return {
x_mult = self.config.extra.xmult,
message = 'X' .. self.config.extra.xmult,
colour = G.C.MULT,
}
end```
so in the SMOD.Atlas youd just change the size to 142x190? based on the pixel smoothing option?
nono
it's still 71x95 in the code
the game automatically switches the atlas?
yeah
oh sick
it'll automatically switch to the 142x190 textures if you turn on pixel smoothing
so it turns the pixel smoothing toggle to a texture resolution toggle
which is already what it is, ppl just haven't realized that yet ig lol
this is HUGE for the modding and texture pack communities!!!!!
yeah lol
I honestly might make a texture pack that's just an enhanced version of the regular textures for pixel smoothing
anyway back to my broken code 
(andalsothatmakesbrainstormlookleftbcwhythefuckdoesitnot)
wait i never noticed this lol
This is my code. It's still shows as red.
You need to put it in a separate condition
Does SMODS automatically create a pool for a new consumable type when you use SMODS.ConsumableType to create one?
yes
Great
How the hell do I make an enhanced card just give mult, this doesn't work
medium rare š
I'm pretty sure if you just define mult in the config it automatically does that.
Also, gonna bump this
What are you wanting it to do?
Spread it's enhancement to cards in the deck of the same suit or the same rank
It works when held in hand, but not if there's none left in the hand
wait this is a cool idea
there is so much potential there
i may or may not steal that idea for something i want to implement in the future
What if you hooked calculate and checked for cards with the enhancement, get their suit and rank and look for any cards that share that suit and rank and give them the enhancement?
could you have a table of all the cards in the deck and enhance them by index?
The problem isn't actually doing that, it's that it doesn't do anything if there's no cards left in hand, as in, it doesn't consider itself to be in any context unless its outside of the deck
This is my current code, and it only runs if the card is held in hand
Are you hooking calculate?
It is inside calculate yes
I've made 11 jokers so far I hope I'd at least know to do that
gang, slide some mods that are adding some new stakes
Does it look like this at the top?
Okay so apparently I'm not hooking calculate
I'm just using the normal calculate function
You need to do something like this.
Outside of any objects?
Yes.
And I'm guessing slap a if SMODS.has_enhancement(v, 'm_aether_flesh') then card = v inside?
I think so.
I think you also need to change every thing inside the calculate hook to be self instead of card.
Would this work?
Jokers are not triggering at all now
Wait, it's because I didn't add the args
I think it should work.
Calculate_joker triggers whenever a context happens.
I think.
You need to change self.ability.extra.infect_odds to G.P_CENTERS.m_aether_flesh.config.extra.infect_odds
They still aren't doing anything
This is the code
Is it working?
.
Oh.
This is also for some reason isn't getting a tally of the cards in your deck
does anyone know how i can set jackpot to card.ability.extra_value only when it hits the return rather than being constantly updated?
You need to hook update to check constantly.
This is in a joker, not an enhancement
So it should be running at all times that the joker is on-screen
Try G.playing_cards instead of G.deck.cards
It's also not getting a tally of how many jokers of the same type you have
You're setting infected_cards to infected_jokers + 1
I... am not very smart
Can anyone explain
context.cardarea == G.play and context.main_scoring?
I dont really understand
context.cardarea == G.play checks if the card is in the scored hand.
It will run when the main scoring logic is happening, and it'll do stuff to the cards you're playing
So if i play 5 cards and only 3 cards score the context will trigger for only the 3 cards?
My mistake I meant played cards.
So context cardarea == g.play will trigger when cards is played regardless of being scored or not?
I tried it and it only works with scored cards.
But it still includes unscored cards.
I should try too
with the new smods beta release, bettercalc 2.3 apparently allows context.ignore_debuff to allow debuffed cards to score in a context - is this a context i check for or is it a value i set? i can't figure it out
my goal is to score an effect on debuffed cards and only debuffed cards
Same
how doooo i get the big text on the screen like blinds have
I found this in plasma deck and it does a similar thing ```lua
attention_text({
scale = 1.4, text = text, hold = 2, align = 'cm', offset = {x = 0,y = -2.7},major = G.play
})
There is also this ```lua
if G.GAME.blind and G.boss_throw_hand and self.STATE == self.STATES.SELECTING_HAND then
if not self.boss_warning_text then
self.boss_warning_text = UIBox{
definition =
{n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, padding = 0.2}, nodes={
{n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={
{n=G.UIT.O, config={object = DynaText({scale = 0.7, string = localize('ph_unscored_hand'), maxw = 9, colours = {G.C.WHITE},float = true, shadow = true, silent = true, pop_in = 0, pop_in_rate = 6})}},
}},
{n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={
{n=G.UIT.O, config={object = DynaText({scale = 0.6, string = G.GAME.blind:get_loc_debuff_text(), maxw = 9, colours = {G.C.WHITE},float = true, shadow = true, silent = true, pop_in = 0, pop_in_rate = 6})}},
}}
}},
config = {
align = 'cm',
offset ={x=0,y=-3.1},
major = G.play,
}
}
self.boss_warning_text.attention_text = true
self.boss_warning_text.states.collide.can = false
G.GAME.blind.children.animatedSprite:juice_up(0.05, 0.02)
play_sound('chips1', math.random()*0.1 + 0.55, 0.12)
end
else
G.boss_throw_hand = nil
if self.boss_warning_text then
self.boss_warning_text:remove()
self.boss_warning_text = nil
end
end
Hi, just wondering if anyone would be able to help. I'm making a joker that draws all Spades to hand on the first hand, and I've been trying for about a week now and just can't get it right. I could be going about this wrong, but because the draw_card function will just draw a random card if it's not in the deck, I'm checking if the deck contains any of the spade cards and then drawing the correct one to hand. However, it's not detecting them in the deck when I check. Would anyone know how to fix this?
ooo, thanks!
best way i can think to do that would be a for loop checking the deck for spades then draw anything it gets as a result, not to sure exactly how to do that though sorry
yeah, that's what I'm trying to do, and I started by testing if it could detect a 2 of Spades and it couldn't
I did
i then deleted it to see if G.deck would work, but no
I've tried just having S_2 instead of G.P_CARDS.S_2 as well
gimme a sec to try and cook
nw
If I were on my laptop rn Iād probably be able to bang smthn out
I've been looking pretty heavily through the game files, and talked with a friend of mine who's an expert in lua, and we couldn't figure it out
What if you hooked CardArea.shuffle?
I've tried looking at The Goad or Effarclair from cryptid, but they work differently
in what way
no clue why this is happening, it's driving me insane!
can somebody help if possible?
SMODS.Consumable{ -- Exorcism
set = 'Spectral', atlas = 'bpp_tarots',
key = 'exorcism',
loc_txt = {
name = 'Exorcism',
text = {
'Turns a random',
'{C:attention}Consumable{} {C:dark_edition}Negative{}'
}
},
can_use = function(self)
if #G.consumeables.cards < 2 then
return false
end
local bank = {}
for i=1, #G.consumeables.cards do
local card = G.consumeables.cards[i]
if (not card.edition or (card.edition and not card.edition.negative)) then
table.insert(bank, card)
end
end
return #bank > 0
end,
use = function(self)
local bank = {}
for i=1, #G.consumeables.cards do
local card = G.consumeables.cards[i]
if (not card.edition or (card.edition and not card.edition.negative)) then
table.insert(bank, card)
end
end
local card = pseudorandom_element(bank, pseudoseed('exorcism'))
card:set_edition({ negative = true })
print('a') -- THIS SHOWS UP BY THE WAY (even with the error)
end,
discovered = true,
config = {},
pos = { x = 1, y = 0 },
}
What would it say if you printed bank?
need help
version = "1.0.0"
priority = 0
# LOEVlTy
[[patches]]
[patches.pattern]
target = "game.lua"
pattern = '''function Game:update_game_over(dt)'''
position = "after"
payload = '''
play_sound ('audjung_youdied1', 1.0, 1.0)
'''
match_indent = true
times = 1
it keeps looping when the game over screen happens
i just need it to happen once
(this is right before the crash)
times thing doesnt work i presume
i might be tweaking with this but give it a go
for i = 1, #G.deck.cards do
G.deck.cards[i]:is_suit('Spades') then
draw_from_deck_to_hand
ĀÆ_(ć)_/ĀÆ
oh wait
what's wrong
wait I think i know
say i = 3 and the third card is spades, it draws that card and removes it, changing the list and the order, throwing things off
Guys does anybody know how to make a consumable level up most played hand in a run 2 times?
might be able to tell it to keep looping until thee are no more spades?
would this work? If I define a variable as n...
for i = 1, #G.deck.cards do
G.deck.cards[i]:is_suit('Spades') then
n = n + 1
and then I repeat drawing cards per n
If you wanna be even more funny, you could do a for in loop
But yes that implementation should work
okay I'll give it a go
Anybody?
i'll try look into it
how do I tell it to draw a card with suit spades?
as opposed to the whole card key?
it should draw the card its currently on in the loop as far as i know
I'm doing it in a separate loop
plus I want to know how to do it as a general action
Try this. ```lua
local tempplayed = 0
local hand
for k, v in pairs(G.GAME.hands) do
if v.played > tempplayed and v.visible then
tempplayed = v.played
hand = k
end
end
if hand then
level_up_hand(card, hand, nil, 2)
end
I'm sorry to be a bother, but would anyone know how to draw a card of a certain suit to hand?
weird, this doesnt seem to work, hm
Well this is the entire thing ```lua
G.E_MANAGER:add_event(Event({
func = (function()
local text = localize('k_balanced')
play_sound('gong', 0.94, 0.3)
play_sound('gong', 0.94*1.5, 0.2)
play_sound('tarot1', 1.5)
ease_colour(G.C.UI_CHIPS, {0.8, 0.45, 0.85, 1})
ease_colour(G.C.UI_MULT, {0.8, 0.45, 0.85, 1})
attention_text({
scale = 1.4, text = text, hold = 2, align = 'cm', offset = {x = 0,y = -2.7},major = G.play
})
G.E_MANAGER:add_event(Event({
trigger = 'after',
blockable = false,
blocking = false,
delay = 4.3,
func = (function()
ease_colour(G.C.UI_CHIPS, G.C.BLUE, 2)
ease_colour(G.C.UI_MULT, G.C.RED, 2)
return true
end)
}))
G.E_MANAGER:add_event(Event({
trigger = 'after',
blockable = false,
blocking = false,
no_delete = true,
delay = 6.3,
func = (function()
G.C.UI_CHIPS[1], G.C.UI_CHIPS[2], G.C.UI_CHIPS[3], G.C.UI_CHIPS[4] = G.C.BLUE[1], G.C.BLUE[2], G.C.BLUE[3], G.C.BLUE[4]
G.C.UI_MULT[1], G.C.UI_MULT[2], G.C.UI_MULT[3], G.C.UI_MULT[4] = G.C.RED[1], G.C.RED[2], G.C.RED[3], G.C.RED[4]
return true
end)
}))
return true
end)
}))
ok so apparently this negative thing is just a problem with steamodded
i swear im on the verge of something but like kjhdskfjhgkjhsdkgjhsdkfhgksdfhdkjshdf
ive Almost got it
Guys
It works
I just need to figure out how to draw specifically spades
If anyone could help, please let me know
Saturn is broken
idk how many times i have to repeat this
yeah... i figured
Thanks
Is there way to check what card a blueprint is copying even if there are multiple blueprints?
I'm pretty sure the simplest way is creating a table and adding all cards in deck that have the spade suit to it, then use the draw_card fuction on a random element from that table
You already have the for loop figured out
I just need a general way of drawing a card with a suit instead of a card key
so what causes crash
Yeah, i could be wrong but i don't think there's a way to do that directly, the next best way is grouping together all card keys with that suit.
You might not even need to create a table actually, let me share some code from my mod
This is what i did to draw ALL cards from the deck with a certain rank or suit
You just need to break out of loop once you've drawn the number of cards you wanted in your case
Thank you!!
It looks like you've already solved your issue but there is also this ```lua
local oldshuffle = CardArea.shuffle
function CardArea:shuffle(_seed)
if self == G.deck then
local spades = {}
local notspades = {}
local cards = self.cards
for i, k in pairs(cards) do
local priority = 0
if k:is_suit("Spades") then
priority = 1
end
if priority > 0 then
spades[#spades+1] = k
else
notspades[#notspades+1] = k
end
end
pseudoshuffle(spades, pseudoseed(_seed or 'shuffle'))
pseudoshuffle(notspades, pseudoseed(_seed or 'shuffle'))
for _, card in ipairs(spades) do
table.insert(notspades, card)
end
self.cards = notspades
self:set_ranks()
else
oldshuffle(self, _seed)
end
end
i think it sounds good
Yeah it's pretty cool
ty, would you say its an uncommon?
i think that makes sense yeah
which lua is the one responsible for playing the chips and mult sound effects
is it game or back
or is it main
I think it is common_events.lua
That's really cool, but isn't that just polychrome?
absolutely
Maybe make it x1.75 or smth
nah, i think X1.5 is pretty balanced already
So it's different and still a good effect
thanks doc
ur getting an enhancement which gives X1.5 Mult with no downsides
True
yeah and you can still add polychrome on top
exactly
Up to personal preference, I prefer my mods to be a bit more broken so that's what I'd do, but those are still good points
vanilla-plus enjoyers when a cryptid-enjoyer shows up
I'm trying to keep mine somewhat balanced to vanilla
real lol
So true lol
jen enjoyer
Somebody make this a meme
sorry i prefer my art assets homegrown
DAMN
wait where is this located again
on the subject of balance, what we thinking about this?
the functions folder in balatro, probably?
thanks
By it so you mean the joker or the card
the card
very strong when u got it early
I think you may need to balance it a bit more, because it basically allows you always trigger it if you're not doing a 5 card hand build, but I do like the concept and the art is great
Does it start at 1x or 0x?
1 otherwise youd be losing mult
1X, duh
Yeah but if you started at 0x then you'd need to build it up before it's good. That'd be a bit more balanced
Again, personal preference
X0 is so deadly that you never want to make use of it, haha
I did a playthrough with having it shop 1 and it didn't seem that strong, and then i got sock and buskin AND hanging chad
By start at 0x, I mean that it has no effect until the card gets the initial 0.2x, so actually it starts at 0.2x
Damn
its so slow in which case its probably not even worth it š
It depends how much effort you want put into it to make it good
you can only increase its mult by X0.2 once per round, since you are supposed to play it unless you got blueprint
But either way it's a really cool effect, great idea
you need 5 rounds to even get one card to X1, and thats if you even manage to draw it consistently every time
True
Good point
ah shit
asbestos:
i'm going to postpone working on this create_card hijacking and just make some boss blinds today
i had it on .25 originally lol
cant find the lua where theyre responsible for playing the dagger sound
"it wasn't that strong until i forced it to become photochad"
thought that was a bit much
is it in card.lua?
me when fucking
photochad
probably in card.lua, yeah
a threesome?
LMAO
š?
balatro goes kink
I've always wondered why Hanging Chad is Common
its uh
thanks doc
Retrigger a card twice is op
id still argue riff raff is the best common joker tbh
btw bepis. gonna test your mod out today because I have no work-work to do! excited to try it and finally get back to my literature degree roots and just do a bunch of reading
i should give my mod an achievement/unlock/whatever for getting the Big edition on hanging chad
And that's pretty fair
4 retriggers lets goo
:3 aww, but also, there r some localization errors here and there which i fixed, but haven't committed yet
speaking of š i think i need to reduce this to once
shouldnt have any actual impact on the gameplay itself though
you know what, i think its fair
:3
oh wow i wouldn't have recognized you as flutteren until you said this, hahaha
Make it rare and I think twice is fine
its inconsistent
lol hii thats me
i'll go back to my balatro playing roots and just be part of the 98%
i have become kermit at the whims of whom i am matching pfps with
Actually, maybe make it so that it doesn't trigger on a retrigger
hi
hi aiko
but wait
it can't anyway
hey hey aiko! I hope you're less tired today
did anyone say anything about boss blinds
what happens if you retrigger a lucky card
Oh good
still tired
I'm cosplaying you today
I'll take a nap for you, nw
It rolls the chances again
and the rng rolls successfully like 2 times
but i was playing video game
game wont allow it bc 3 oops's would make it go infinite
true...
chat what do we think of this edition
getting the first of these set up today, then just hoping it'll make for fun ones, haha
I don't have art yet for the other 14 I have planned
ooh movie villain jokers?
boss blinds
Channeling my inner Aiko and seeing how quirked up these'll get
what does parasite do
it is parasite
crap
it applies itself to a new joker when the one it's on runs out
it forgor
question, does everything in G.GAME.blind gets removed when you enter a new boss blind?
there was no documentation about the implementation for boss blinds, right?
Oops! The game crashed:
Thread error (Thread: 0x012d9e3bf820)
engine/sound_manager.lua:62: bad argument #1 to 'newDecoder' (filename, File, or FileData expected)
stack traceback:
[C]: in function 'newDecoder'
engine/sound_manager.lua:62: in function 'PLAY_SOUND'
engine/sound_manager.lua:197: in main chunk
Additional Context:
Balatro Version: 1.0.1o-FULL
Modded Version: 1.0.0~ALPHA-1304a-STEAMODDED
LĆVE Version: 11.5.0
Lovely Version: 0.7.1
Steamodded Mods:
1: Copyrighted by Nxkoo [ID: audio_jungle, Version: 4.2.0, Uses Lovely]
2: Incantation by jenwalter666, MathIsFun_ [ID: incantation, Priority: 9e+301, Version: 0.5.10, Uses Lovely]
3: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.3.1, Uses Lovely]
Lovely Mods:
Stack Traceback
(3) LĆVE function at file 'boot.lua:352' (best guess)
Local variables:
errhand = Lua function '(LĆVE Function)' (defined at line 553 of chunk [lovely debugplus.console "console.lua"])
handler = Lua function '(LĆVE Function)' (defined at line 553 of chunk [lovely debugplus.console "console.lua"])
(4) upvalue C function 'error'
(5) LĆVE function at file 'callbacks.lua:181' (best guess)
Local variables:
t = Thread: 0x012d9e3bf820
err = string: "engine/sound_manager.lua:62: bad argument #1 to 'newDecoder' (filename, File, or FileData expected)
stack traceback:
\9[C]: in function 'newDecoder'
\9engine/sound_manager.lua:62: in function 'PLAY_SOUND'
\9engine/sound_manager.lua:197: in main chunk"
(6) Lua function '?' at file 'main.lua:923' (best guess)
Local variables:
_n = nil
_a = nil
_b = nil
_c = nil
_d = nil
_e = nil
_f = nil
touched = nil
(for generator) = C function: 0x1c1dfb10
(for state) = nil
(for control) = string: "threaderror"
name = string: "threaderror"
a = Thread: 0x012d9e3bf820
b = string: "engine/sound_manager.lua:62: bad argument #1 to 'newDecoder' (filename, File, or FileData expected)
stack traceback:
\9[C]: in function 'newDecoder'
\9engine/sound_manager.lua:62: in function 'PLAY_SOUND'
\9engine/sound_manager.lua:197: in main chunk"
c = nil
d = nil
e = nil
f = nil
(7) global C function 'xpcall'
(8) LĆVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '?' (defined at line 906 of chunk main.lua)
inerror = boolean: true
deferErrhand = Lua function '(LĆVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LĆVE Function)' (defined at line 355 of chunk [love "boot.lua"])
what the hell is this
sound doesn't exist
this is probably not necessary, if every var in G.GAME.blind resets
How do I prevent an enhancement from appearing in booster packs?
have you declared the smods obj for it
with the mod pref
mod pref?
prefix
I've got 2 enhancements that are only supposed to be summoned by jokers and nothing else
Put weight = 0 in the enhancement.
idk why but gong.ogg is quite comical
Thank you
Taco Bell
yes exactly
it doesn't disappoint
And this ```lua
in_pool = function(self)
return false
end
Man I wish Taco Bell was real
im trying to mod that gong in to this
everything works fine
wait no
fuck
I MEAN SLICE
TO MOD THE SLICE IN
I hate it but I love it
I'm just working on The Flesh That Hates but it's a joker
I currently have the Hannibal Lecter blind set up to destroy the final hand of a round, buuuut should I just make it turn every joker perishable like Gros Michel so it starts 'eating' jokers š¤
and the patch too
Do .wav files work?
oh
oh fuck im so dumb
AAAAAAAAAAAA
its ogg,,,,,,,,,,,,,,,,,,,,,,
how am i real
why am i so dumb
every joker would be insane
its supposed to play this
Did you change the file into an ogg using audio software?
Did you change the actual file path in-game?
Sorry, I think Aiko's spirit's overtaken me, yeah
I'll keep it as a destroy effect now, I reckon, just because that feels a bit more balanced
yes
No idea then
i was patching the line where it says slice
Maybe you cursed it
damnit
im asking reddit
also holy shit
i was trying to patch the chips and mult sounds
but holy
there's alot
how am i supposed to patch all of that
does the patch cover all lines that contain the pattern or
@tall wharf you said you stored all your data in the debuff, right?
i think my pixel art smoothing has just, stopped working?
yeah todd is not usually looking that crispy
ye
Do any of the variables you set in a blind save and load?
if iām not mistaken, the fire effects show up when the total number of chips you have currently earned in your hand exceeds the total required to pass the round, yeah?
Yup
then it grows as you get more and more
how do i check if a joker is debuffed
try card.ability.debuffed thatās a guess though
so take it with salt
Thanks Myst! I'll set up a hook once I get to the blinds that need it, I guess!
i woke up 17 minutes ago
iām just throwing it out there
:3 ic
I think it's debuff, not debuffed but yeah
Isn't it just card.debuff
does debug plus allow you to force a boss blind to show up?
not sureā¦
yes
I assume through the console it for sure does, but I'm not sure what the command would be
okay
turn on Collection, and press 3 on the blind
oh, that works?
thatās what i thought
does this work for showdowns too?
:3
yes
in antes that arenāt every 8th one
That's the scarier truth of my keyboard being broken
just download a program like AHK
Oh no wait, I'm not on my test mod folder, so debugplus isn't even on, haha
on-screen keyboard.....
and then just bind a macro to press 3 to something else
That works.
showdowns are every 8th ante, right
if my 3 button'd stopped working, I'd honestly just grab the bike and go buy a new keyboard real quick, haha. But the keyboard works, I just don't
i havenāt made it to ante 16 yet so i donāt know šµāš«
Or you can request it here, or do the PR after you implement it https://discord.com/channels/1334988047229653042/1354225980096512081
thatās why you need to be like me and have 3 backup keyboards from keyboards that youāve had before
if I get it functional, I'll for sure set it up in a way to push it to smods
I donated a bunch of old computer stuff to the local library a while back, so all my old keyboards that still worked were given away, haha
average selfless L /j
like mission impossible to steal a $5 keyboard
my job pays like shit but luckily it pays enough to buy a not terrible keyboard every few years š
Iām reminded of my first year in college when a professor asked us for help emptying out a computer lab then the dean showed up and asked up to put it back
hey, uh...
wanted to ask why the consumable does not see self (self returns nil)
use = function(self)
G.E_MANAGER:add_event(Event({
delay = 0.4,
trigger = 'after',
func = function()
local bank = {}
for i = 1, #G.jokers.cards do
local card = G.jokers.cards[i]
if (not card.ability.eternal) then
table.insert(bank, card)
end
end
local card = pseudorandom_element(bank, pseudoseed('infinity'))
local sticker = SMODS.Stickers['eternal']
-- add an eternal tag
play_sound('gold_seal', 1.2, 0.4)
card:juice_up(1, 0.5)
sticker:apply(card, true)
-- double money
play_sound('timpani')
self:juice_up(0.3, 0.5) -- here
ease_dollars(math.max(0, math.min(G.GAME.dollars, self.config.limit)), true) -- and here
return true
end
}))
delay(0.4)
end,
yall ever stole a mouse from the it room before? :3
What IT room 
the it room? you mean the sewers?
no but one time i got back from my school and i looked in my bag to find a laptop charger.
I had a friend who reverse stole a computer from a lab
And by reverse stole I mean that they brought theirs from home and permanently installed it there
accidentally stole a laptop charger because in the moment i thought it was mine
me with my suspiciously mouse filled tote bag: what IT room? I've never heard of it
so it can get all the yummy spyware š¤¤
my leaving the it room with a conspicuous yellow raincoat stuffed in my big sharp clown teeth
how schools feel after installing spyware that takes up half the computerās resources just so their students canāt play games on the computer (this could have been solved with a firewall rule)
my laptop fucking crashed
because i ran balatro with discord at the same time
amazing
kid named crashed:
:3
The tall lad wearing a long coat whoās definitely not a living pile of discarded computer mouses titled the Rat King: āIām a tall lad wearing a long coat whoās definitely not a living pile of discarded computer mouses titled the Rat King.ā
please, no one in any way hint to me that you're younger than 18, I can't handle mentally the idea of interacting with people that are still in high school. or worse... middle school
swing it around like a bola
š¶: āMother, I require sustenance.ā

The minimum age is 13
don't remind me they exist lmao
im currently procrastinating on my linguistics work
that doesnāt stop anyone
But I suppose some people do their PhDs at 13
what language
Funnily enough i think if you write something on the lines of "i'm x years old" with x being a number lower than 13 Discord will lock your account until you verify it's not the case
when i was teaching, I moderated a big creative writing server and it was very awkward to learn that one of the people on that place telling people their writing was shit was a student at the school i was teaching at. Ever since then, I've decided children nor teenagers exist whenever I'm nearby
linguistics is all languages
oh hey another linguist???
but rn its malay
Yeah but people studying language usually focus on one or two
eh not really there yet
At least for undergrad
tf is purple day
Itās like green day but purple
tag me if you ever end up info dumping here about the fun quirks of a language, I'd love to read it š
I misread that as simlish at first
wow creative writing instructor too ...
any clues why this doesnt seem to debuff the jokers?
i'm moreso grammar cop without the cop though
iām pretty decent at programming
I wonder if thereās logical/philosophical sense to have 4th, 5th, and 6th persons in a language š¤
I'm a grammar anarchist, so sorry to say we won't get along
i know Lua, Python, Dart, C, Java, Kotlin, GDScript, Bash
chat is not a 4th person pronoun
Itās not about chat
But it was inspired by the conversation
But many languages have constructs specifically for āno oneā, āsomeoneā, and āeveryoneā
isnāt āsomeoneā a 4th person pronoun
no
oh alright
oh my go
I made a simply but funny joker that I'm surprised I've never seen
well it is now. because i said so. wrap it up everyone /j
They either repurpose existing pronouns or avoid pronouns
I've seen people argue that 'collective POV' is 4th person perspective, but that's based on severely misunderstanding with xth person means, haha
someone is an indefinite pronoun
Yeah Iām not taking about āchatā
In English itās an indefinite pronoun conjugated in the third person, but other languages have other rules
yeah
But that's I think because a bunch of creative writing people don't study in linguistics in any way, so they're not gonna know the definitions
Portuguese has constructions with no pronouns
Because the subject is unknown or nonexistent
can i make a language derivative of english that does nothing but make me correct
For example, āRains.ā is a complete Portuguese sentence
Go make English but not stupid and inconsistent
š
i've tried on multiple occasions, not possible
too many lines that cross
letās make english but itās not english
i hate most english spelling reforms
wawa
they kinda suck
letās make a pidgin language for this server
yes. If you wanna go further, become a personal language purist and decide that because language is a set of assumptions, not rules, every person inherently speaks their own idiolect of a language perfectly
generally the purposes of language is to express ideas though so that's the only metric
why are they not debuffed!!!gghghgh
Thereās also āRobbed me.ā, but this one is conjugated in the third person plural instead of singular
recalc_debuff
i do not subscribe to this notion
"does the other person understand? congrats you are speaking correctly"
And it indicates an unknown subject
or join the post-chompskian use-based grammar perspectives that says that any form of grammar is an imperfect system, as proven by the fact that ai systems construct their own arbitrary grammar encodings when trained on language
bruh i have no idea how to fix this
actually, i couldve just returned true inside the loop itself, but it shouldnt matter right
Trying to explain linguistics to someone who thinks chat is a 4th person pronoun is not speaking correctly then 
here's the code that im using to open the pack, what should i add to prevent it bugging like that?
No, that's noise and is inherent to any communication. As Derrida states, language is inherently imprecise and exact communication is impossible, therefor all communication is inherently miscommunication
not the linguistic talk in modding dev channel š
yea
its still not debuffed
:3
wtf r those jokers made out of
are they just natrually resistant to being debuffed š
Finally the two linguistic Balatro players found the modding channel
gold by the looks of it
I think normal booster packs change the game state, which you may have to do
okay no more linguistics
doesn't opening a pack auto change the state
creative writing instead
or am i delulu
have you heard of the flashback past tense trick
No
i think flashbacks are eh but the past tense trick is fun
No, because I think it's the gamestate that changes the UI. It's just that in almost any context, you don't get to open a pack that doesn't change the state. But I'm very likely to be misremembering, Myst, haha
WHY
Earlier this week we talked about āhistorical presentā where the present is used to describe the past
all the two jokers are there, tf u mean š
dw I'm on my phone so I can't check whether I'm posting misinformation
Are you sure the function gets called for Jokers
Aiko was debuffing Jokers differently
i'm on my pc so i can check if i am, but I haven't. I'll check now, I guess
So did Crimson Heart
this should just check if card is in the table, right?
and if it is, return true and hopefully it gets debuffed
Does the table exist?
so if iām using a consumable how do i target whatever card i selected
a Joker
G.jokers.highlighted
alright thatās it
also feel free to talk over the people not discussing modding š You're allowed to take precedence in this case haha. I had this error sometimes when opening a pack, closing the game, then reloading it, because the states got mixed up, but I'm not sure how to solve it in this case š¤
mhm
alright
Canicha charging up the wall-of-text beam
because i have this card which is a 50% chance to replicate a joker, and a 50% chance to obliterate it
oh wait, its a table containing all the highlighted jokers, so you still need to see it as a table btw
G.jokers.highlighted[1]
canāt you only highlight one joker at once
iirc
would it not start at 0?
yeah but for consistency, its still a table containing all the highlighted stuff
In vanilla
Peano axioms when starting from 1 also works
