#š»ć»modding-dev
1 messages Ā· Page 56 of 1
Thereās update_*_pack where * can be arcana, spectral, standard, buffoon, and celestial. Presumably Steamodded adds its own
yup, I see
Actually
There may be a simpler way
You can try cleaning the CardArea with the packās cards and refilling it
Arcana does it in create_UIBox_arcana_pack
refilling is the part that will break it potentially, especially if mods add their own behaviors
that's what I originally planned but reopening is much more reliable
Because it doesnāt manipulate states
Alright, but at least reword your vouchers then ;P
lmao what we just said is completely opposite
I mean I think refilling is easier and less likely to break
Remaking a CardArea seems simpler and more stable than controlling how the state changes
Iām being repetitive, sorry
its real but as i said it'll probably be only a couple jokers at most
dont rlly like how the art turned out but idk what to do for it to not be like that
Interesting
danganronpa mentioned
danganronpa sleeper agents...
Homestuck sleeper agents where are you
KAMAKURA KAMAKURA KAMAKURA-
didnt plan on making that one but when i realized how easy it would be to translate the original effect (pick two players - swap their hands) into balatro and how much value it would actually have i went to it
project moon sleeper agents where are you
The actual value is a bit limited but you can play one hand twice
is that like Touhou or Fate
15 card deck synergy
no that's type moon
either that or a selfdestruct button if u do it at the start of the round
its funny
also this being a one-time use makes it nearly worthless
@opal spade self-destruct
Oh I didnāt post Ouroboros here
I have a Joker that refreshes your Hands, Discards, and deck when sold
Itās at least more useful than my original idea for it IMO
the problem is that idk how else i could trigger the effect w/o taking away control from the player
Button
Or tie it to Consumeables
Or the first hand or discard or something
Or a specific hand or somesuch
that seems like a good solution
what about making it so the card comes back at the end of the round
only if it does the effect though
At that point I think it could be a button
quick question, i updated my steamodded and now senddebugmessage logs aren't appearing anymore, is there a setting i have to change or smth
mods menu settings
@zealous glen what do you think of this?
if effects[ii].x_chips then
if effects[ii].card then juice_card(effects[ii].card) end
hand_chips = mod_chips(hand_chips*effects[ii].x_chips)
update_hand_text({delay = 0}, {chips = hand_chips})
card_eval_status_text(G.hand.cards[i], 'x_chips', effects[ii].x_chips, percent)
end
--If hold mult added, do hold mult add event and add the mult to the total
--If dollars added, add dollars to total
if effects[ii].dollars then
ease_dollars(effects[ii].dollars)
card_eval_status_text(G.hand.cards[i], 'dollars', effects[ii].dollars, percent)
end
if effects[ii].h_chips then
mod_percent = true
print('yeah im supposed to be giving chips but fuck you')
hand_chips = mod_chips(hand_chips + effects[ii].h_chips)
update_hand_text({delay = 0}, {chip = hand_chips})
card_eval_status_text(G.hand.cards[i], 'h_chips', effects[ii].h_chips, percent)
end```
is there something obvious im doing wrong here?
x_chips works but h_chips doesnt
h_mult still works so its not like ive broken the game
judging by the eval message not working too its smth wrong with h_chips
but it clearly exists as when i print everything in eval it prints h_chips
Looks good! What do Tarot packs look like?
There's something that blocks the button from spamming in the shop
Hmmm⦠are you just recreating the pack cards or did you go with your original idea?
And I'm not sure what
I open the pack as I did but without getting rid of the previous one
and removed all delays/animations
I guess that doesn't really matter because I'm going for one-use reroll anyway
but I still want to know tbh
might be smth to do with button delay?
Where did you test the others
the others what?
Hmmm so you donāt redraw cards and skip animations, but still manipulate the state a bit
The other packs
You said thereās a delay only from the shop
no no no, I meant that the reroll button in the shop has a delay, the vanilla button
I want to check how to make the button unclickable like that too
if effects[ii].h_chips then
mod_percent = true
print(effects[ii].h_chips)
hand_chips = mod_chips(hand_chips + effects[ii].h_chips)
update_hand_text({delay = 0}, {chip = hand_chips})
card_eval_status_text(G.hand.cards[i], 'h_chips', effects[ii].h_chips, percent)
end```
its literally printing 13
effects[ii].h_chips is 13
it prints 13
and then doesnt add it to the total
or display the message
why
it literally exists
someone please help
im going insane
it says 13
š
Is h_chips a valid effect?
do i need to put somewhere as a valid effect?
ive made it
there isnt like a G.valid_effects is there?
if by valid you mean it is a thing
then yeah
i have the message working but im just feeding it a value of 13 chips
that was to test
because i cant pass it effects.h_chips apparently
If itās not I should add it
quite literally what im doing rn
okay so the message works too
it just wont add it to the total
if effects[ii].h_chips then
mod_percent = true
print(effects[ii].h_chips)
hand_chips = mod_chips(hand_chips+effects[ii].h_chips)
update_hand_text({delay = 0}, {chip = hand_chips})
card_eval_status_text(G.hand.cards[i], 'h_chips', effects[ii].h_chips, percent)
end```
this works apart from the mod_chips bit
omg i see it
no
no
no
please
i hate myself
its meant to be chips
so it was working
but didnt look like it
i swear i copy pasted that line
no idea how theres a typo
well now x chips and h chips and x h chips are all working
and so is my custom edition
ughhh i hate lua junk
how do i modify G.LANG.font without also modifying G.LANGUAGES["en-us"].font
aren't those the same table?
...yes, self.LANG = self.LANGUAGES[self.SETTINGS.language] or self.LANGUAGES['en-us']
that's why i complained about lua junk
ugh
what would be a good workaround
right now i have this at the start of Game:update
and uh. the problem is pretty clear
make it use copy_table when assigning to G.LANG
Is there a way to shuffle Jokers before a hand is scored? I tried to use this code from Amber Acorn, but it only takes place after the hand is scored, not before.
G.E_MANAGER:add_event(Event({ trigger = 'before', delay = 0.2, func = function()
G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 0.85);return true end }))
delay(0.15)
G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 1.15);return true end }))
delay(0.15)
G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 1);return true end }))
delay(0.5)
return true end }))
end```
Confused as to why I'm getting this error for this code:
-- If boss blind defeated, reset all rank flags and reset x_mult
if context.end_of_round and G.GAME.blind.boss and not context.blueprint then
for i=1, #card.ability.extra.ranks do
card.ability.extra.ranks[i] = false
end
card.ability.extra.x_mult = 1
return {
message = localize('k_reset'),
colour = G.C.RED
}
end
It only happens when I put the return statement in
'for' limit must be a number

Experimenting with SMOD's consumable type
Just goggle'd it and bread isn't a pastry nor is it spelled pastery but otherwise it's neat
Just tried it with this code and it calls card_eval_status_text 16 times?!
-- If boss blind defeated, reset all rank flags and reset x_mult
if context.end_of_round and G.GAME.blind.boss and not context.blueprint then
for i=1, #card.ability.extra.ranks do
card.ability.extra.ranks[i] = false
end
card.ability.extra.x_mult = 1
card_eval_status_text(card, 'extra', nil, nil, nil, { message = localize('k_reset'), colour = G.C.RED})
end
I'm doing something wrong, I just know it
There are multiple things called in context.end_of_round
Try context.end_of_round and not (context.individual or context.repetition)...
Yup, I forgot those exclusions.
the return works fine now
I don't think you need the individual one btw
He does... but usually nothing calls it
I was referencing Campfire's code for this, and I didn't see Campfire referencing those contexts, so I didn't think to use them
what is the best balatro mod? :)
I might have missed the individual context I suppose
but I'm pretty sure the game never sends a context that has end of round and individual
Oh, i see, the base game does reference context.repetition, it's just up in it's own elseif so I didn't see it in the breadcrumbs
Much better
JokerDisplay
literally the most useful thing in existence
Galdur coming for the crown š
that indeed seems super damn usefull
I can't really play without it anymore
It feels like something that should be in the base game
agreed, looks super clean!
what about the mod that adds colours?
Not sure which one you are referring to
me neither
Trance?
It's just missing the quick play feature
Then Galdur will be on the way to the crown
I'm pretty sure I can do that super quick but I'm down a rabbit hole with stake stuff for smods š¢
Anyone know of any example mods that add a custom button to the run area? Like where run info & options button would be
Ante 1: 300/300/300
Ante 2: 800/900/1000
Ante 3: 2000/2600/3200
Ante 4: 5000/8000/9000
Ante 5: 11000/20000/25000
Ante 6: 20000/36000/60000
Ante 7: 35000/60000/110000
Ante 8: 50000/100000/200000
ewwww thunk why are these just abritrary numbers
arbitrary numbers best numbers
Ante 4 just makes no sense
how so
Numbers were just picked based on feel by thunk I think
I'm not sure how to rationalize this
I can go with reasonably close formulas apart from ante 4 I guess
It's because they were altered in testing.
Initially it was a lot more uniform in its growth AFAIK
oh I guess I can just have an equation based system past scaling of 3
Ante 1 - 300
Ante 2 - 700 + 100*scaling
Ante 3 - 1400 + 600*scaling
Ante 4 - 2100 + 2900*scaling
Ante 5 - 15000 + 5000*scaling
Ante 6 - 12000 + 8000*(scaling + 1)*(scaling/2)
Ante 7 - 10000 + 25000*(2^scaling-1)
Ante 8 - 50000*(2^scaling-1)
thought's on these?
I'm not sure if ante 7 and 8 ramp up too fast or not
this also doesn't match the ante 4 values from in the game but I only plan on applying this past base game scaling anyway
Just fit a 9th degree polynomial 
Thereās a formula for past ante 8 in the files. I think it has some powers of powers/exponentials of exponentials going on
we love ante 4 scaling
Itās less important that the numbers follow a nice pattern than the game feeling good to play. Thus the game can have difficult spikes and valleys.
Eyeballing it, I get the impression each ante (for the first tier) is on the order of magnitude of twice the previous ante, so Iām guessing thunk started there then adjusted up and down.
The higher tiers are closer to thrice, except it slows down to twice on 7 and 8.
6~8
16~20
4~5
10~11
22~20
40~35
70~50
local ben_yes = SMODS.Sound{
key = 'ben_yes',
path = 'ben_yes.ogg',
volume = 0.6,
}
local ben_no = SMODS.Sound{
key = 'ben_no',
path = 'ben_no.ogg',
volume = 0.6,
}```
do i have to specify the whole path?
ah i havent registered them
mb
What's the dimensions for a Joker texture?
the image as a whole is 71x95
the actual texture itself is 69x93
so essentially just 71x95 with a 1px invis border
Thanks
context.other_card:is_suit('Hearts')
How do I convert this into triggering if it's a 6 or a Stone card?
if context.other_card.ability.name == 'Stone Card' then
and
if context.other_card:get_id() == 6 or
i think
And how do I add to Mult instead of multiplying?
return mult instead of x_mult
if thats what you mean
are you making a joker that gives mult for 6s and stone cards?
Yes.
if context.individual and context.cardarea == G.play then
if context.other_card:get_id() == 6 or context.other_card.ability.name == 'Stone Card' then
return {
mult = card.ability.extra,
card = card,
}
end
end```
should work
I'm trying to make a Joker where "On discard, Spade cards held in hand have a 1 in 2 chance to give $1". I've been trying to make this effect for a while and can't figure it out. This is what I have so far, where I've been trying to take code from Reserved Parking and adapting it to work with discards (without the 1 in 2 chance implemented yet), but all this does is juice up the first Spade card in hand and do nothing.
for k, v in ipairs(G.hand.cards) do
if v:is_suit('Spades') then
G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + card.ability.extra.dollars
G.E_MANAGER:add_event(Event({
func = (function()
v:juice_up()
G.GAME.dollar_buffer = 0
return true
end)}))
return {
dollars = card.ability.extra.dollars,
card = card
}
end
end
end```
Works flawlessly. Good work.
š
this im not so sure about
It's a pretty advanced effect, but I'm afraid I'm going to have to start understanding these if I want any chance to not completely die while attempting to mod this game
i mean looking at it im not even sure why it wouldnt work
maybe
ug
uh
probably because its returning inside the for loop
so it only ever checks the first spade card
and juices that
that would be my best guess
I donāt really know how to make it give the dollar though
you can call ease_dollars inside the event
this is because you used return, which terminates the entire loop
use ease_dollars and SMODS.eval_this for the message
actually eval_this has the dollars arg
no it doesnt
ease_dollars(card.ability.extra.dollars)
SMODS.eval_this(card, {
message = localize('$')..card.ability.extra.dollars,
colour = G.C.MONEY,
})
This is pretty much exactly what I needed, thanks! The only problems I had were that the animation was playing on the Joker (which I fixed by changing card to v), the effect being applied once per discarded card (which I fixed by adding and context.other_card == context.full_hand[#context.full_hand] to the condition) and another issue that I have yet to fix:
The spade cards that are currently being discarded are counted for money, which is not the intention. I'm not sure how to fix that quite yet. Here's what I have right now
for k, v in ipairs(G.hand.cards) do
if v:is_suit('Spades') then
ease_dollars(card.ability.extra.dollars)
SMODS.eval_this(v, {
message = localize('$')..card.ability.extra.dollars,
colour = G.C.MONEY,
})
end
end
end```
you can do v ~= context.other_card
But then if v is anything but the last card, it will still be counted, because context.other_card == context.full_hand[#context.full_hand] makes the block only run on the last card to ensure it's run once. Removing that would apply it to every card individually, meaning, discarding five spade cards, each spade individually would give $1 four times.
My first thought was to make an array of all the context.other_cards and check if v is contained within the array, but I don't know if I can get the array to not reset itself between each change in context.
My attempt to put the array in config lead to the game crashing, telling me that items cannot be appended to a nil value.
I'm not quite sure how to use that right now, but that did lead me to realize I was overcomplicating it and I could just use context.full_hand as my array. Here's the finished code:
local function has_value (tab, val)
for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
if context.other_card == context.full_hand[#context.full_hand] then
for k, v in ipairs(G.hand.cards) do
if v:is_suit('Spades') and not has_value(context.full_hand, v) and pseudorandom('gold_rush') < G.GAME.probabilities.normal/card.ability.extra.odds then
ease_dollars(card.ability.extra.dollars)
SMODS.eval_this(v, {
message = localize('$')..card.ability.extra.dollars,
colour = G.C.MONEY,
})
end
end
end
end```
(In case you were wondering, I already had the `has_value` function from something else) Thanks for the help!
thumbs
Pinkies
Pointers?
No, I like safe programming
Can I just rip the code from the Strength tarot card to increase the rank of a card or is there something special for it?
My goto strat for questions like this is to just try it and see what breaks
So having for i=1, do gives this:
you need a second value
h u h
so like for i = 1, 10 do would loop 10 times
you can add a third value to determine how i increments (w/o a third value its +1)
Well, that fixed that issue (Thanks).
And now begins the fun rabbit hole of debugging.
local card = card,
local suit_prefix = string.sub(card.base.suit, 1, 1)..'_'
local rank_suffix = card.base.id == 14 and 2 or math.min(card.base.id+1, 14)
if rank_suffix < 10 then rank_suffix = tostring(rank_suffix)
elseif rank_suffix == 10 then rank_suffix = 'T'
elseif rank_suffix == 11 then rank_suffix = 'J'
elseif rank_suffix == 12 then rank_suffix = 'Q'
elseif rank_suffix == 13 then rank_suffix = 'K'
elseif rank_suffix == 14 then rank_suffix = 'A'
end
card:set_base(G.P_CARDS[suit_prefix..rank_suffix])
return true end }))```
Those 2 dots are literally from the game's source code (line 41), so I got no clue
Anyone have an idea?
remove the ,
Which one is line 41?
it seems like its local card = card,
Yep, that was it because now it shows a new error
ĀÆ_(ć)_/ĀÆ
Legit copy-pasted Strength's source code and now I'm working backwards from there.
you're defining a local card by using local card as the definition
Should I move that line outside the calculate function?
vanilla does ranks differently than smods so it makes sense to look at smods.rank first
Thereās some more rogue commas
that + look at the code in /lovely/dump to see how lovely changes strength
Same code as the base game in /lovely/dump.
What lines have rogue commas?
Nevermind, found them and got rid of them.
So that's all good
you should probably look up how to add lua support to your editor so it tells you where the mistakes are in advance
Well, I have Lua installed on my VSCode
that's weird then, it usually marks everything red if you have even a single trailing comma
Ok, so I just moved the atlas code above the calculate and it fixed itself.
Now I'm able to launch into the game.
Testing time.
So I'm able to summon it.
No effect.
It's supposed to trigger on all non-scored cards.
Issue is: why is it just sitting there like a duck?
not even context is wrong
you're doing local card = card
which means you're trying to upgrade the joker itself
use context.other_card
you need to rename the local card into something else (it conflicts with card of calculate)
also btw the way smods handles strength: https://github.com/Steamopollys/Steamodded/blob/f8493ad3c82634864f6f9f04eb2e0f9881ad61ff/core/game_object.lua#L1715
Thanks for dropping the resources
"i have no idea what i'm looking at"
https://github.com/Steamopollys/Steamodded/blob/f8493ad3c82634864f6f9f04eb2e0f9881ad61ff/core/game_object.lua#L1744 this is the important part, the rest is just flipping cards and making noises
i got winrar
i even copy pasted balaro into my mods folder for easy acess
what do i convert it to?
or extract it to?
or what do i do ;-;
wdym
i previously didn't want to use winrar cuz it looked sketchy
i am trying to learn how to mod balatro my self
but i'd need to extract balatro into a zip iirc?
i just don't know if i need to mess with any settings
if you're trying to look at the source code, you just extract the executable as if it were a zip file
because that's all it is
https://github.com/Steamopollys/Steamodded/wiki this is another important resource
but do i just click ok then without messing with any settings?
also i already installed lovely and steamodded
yeah
mhm just pointing you to the docs
might be a really stupid question but i do need a name for my hand?
ive got a name inside the loc_txt, but the wiki doesnt explicitly say anything about a name
and im getting an error and wondering if thats why
oh wait, i can just open things-
nvm it works now , apparently the key i was using just isnt allowed ig
oh hey i did it- i got all textures and shaders straight out of the game- xD
funny
omfg
i can make my own talking joker-
:OOOO
what key were you using lmao
ooh the custom fonts >_>
hand_blackjack
apparently it didnt like that
whoever wrote this wiki stuff on poker hands im ngl you have probably written it well, but im way too stupid to understand it
any advice on avoiding creating ghost cards?
use events
uh what is the evaluate parameter for SMODS poker hand?
is it a function?
does anyone know of any mods that have these poker hands in them so i can have a look at them?
the example mod isnt enough unfortunately
just read down
so does it take a hand argument? tried doing #hand and it threw an error i think
lemme check again
six suits, bunco
bj hands too but I think the port's not fully finished?
it takes parts and hand
evaulate = function(parts, hand)
local ret = {}
for i = 1, #hand - 1 do
local next_highest = get_highest(hand)[1]
local rank = SMODS.Ranks[next_highest.base.value]
if #ret == 0 then
if rank.key == 'Ace' then
table.insert(ret, next_highest)
end
else
if (rank.key == '10' or rank.face) then
table.insert(ret, next_highest)
return {ret}
end
end
end
return {}
end```
at a glance would you be able to tell whats wrong w this?
other than the -1
"evaulate"
š
the fact that evaluate is misspelt?
get_highest returns a table containing a table containing the card
also I advise you don't modify hand
More bread testing
omn bread game
Prob gonna try to replace "use" to "eat" and maybe use SMODS Sound to add a crunch. Tho I'll prob way til calculate is enhanced for consumables
evaluate = function(parts, hand)
local ret = {}
local ace = false
local ten = false
for i = 1, #hand do
local rank = SMODS.Ranks[hand[i].base.value]
if not ace then
if rank.key == 'Ace' then
table.insert(ret, hand[i])
end
ace = true
end
if not ten then
if (rank.key == '10' or rank.face) then
table.insert(ret, hand[i])
ten = true
end
end
end
if ten and ace then return ret end
return {}
end```
got no idea what im doing š
out of interest, is the composite function in the example mod different from evaluate?
i would think so because its called smth else
but idk how it work if it is
??
SMODS.PokerHandPart{
key = 'blackjack',
func = function(hand)
for i = 1, #hand do
local rank = SMODS.Ranks[hand[i].base.value]
if not ace then
if rank.key == 'Ace' then
table.insert(ret, {hand[i]})
end
ace = true
end
if not ten then
if (rank.key == '10' or rank.face) then
table.insert(ret, {hand[i]})
ten = true
end
end
end
if ten and ace then return {ret} end
return {}
end,
}```
i give up w hands bruh
Is it possible add new boss blind with atlas properly without using Steamodded?
Double check that self.config has an entry for center
Indexing a table with a key it doesn't have gives nil
yeah I don't have a config at all
but it's optional so something isn't right
I should say that the code on the screenshot is from steamodded, pool.toml to be exact
also I can't get this crash consistently for some reason
Minecraft eating sound
this is so sad, can't figure out how to fix the lines from pixelating š¦
Someone had a similar issue⦠probably @wintry solar ?
Unless Iām misremembering
i figured out how to make this work
Iāve updated the text since then, but this is it @dim ice
I think you mean myst
I donāt think so
I donāt remember myst working on shaders
My next guess was @silent @edgy reef when they were adding dice to tooltips
Failure
But it couldāve been a third person too
the only thing I can find on google is trying to disable mipmap, but because jokers are all in 1 atlas, and textures are reused, it will disable it for everything
tho my suspicion it's the vertex shader, somehow
kk, i might make an exception and draw champions belt early
I think the issue is that the game is interpolating the color in-between those two colors
Someone else had that exact issue
the issue is also present without pixel smoothing enabled
ĀÆ_(ć)_/ĀÆ
I tested a lot of things trying to figure this out
I think the issue is because Balatro doesnāt use nearest neighbor
Still, have you tried making your squares bigger? So they overlap?
These squares
No
currently pixel size 10 is used
I had this problem
You are looking at a 10x10 square and averaging the color
But I want you to draw that color in a 11x11 square
Bigger than the original
So you end up with overlaps
that's not how shaders work
I tried that too
I tried loads of things and couldn't find a solution to the lines
I think it's just a consequence of the way love scales it's canvas
the only thing I could think of
Did you try drawing it smaller š¤
is this with the base layer not being drawn?
base layer has no effect
I mean some people have made pixelation shaders for love2D, so it canāt be impossible š¤
already tried
and it still draws the weird lines with pixel smoothing off?
yep
I dont see how it'd have any effect
I didn't get the lines with pixel smoothing off iirc
pixelation is easy
background shader has pixelation
it's when plane is moved then the lines appear
and because lines are always horizontal, I believe it's the vertex shader
but I dunno how
@zealous glen i may have a small issue, i cant really find the repentance shop door, which is needed because champion's belt appears only in shops
Ooh, are you making an Isaac mod?
yes (theres alot of art of it in fan-art)
ping just incase
Actually sick. I was thinking of doing this myself, glad someone else thought of it
The ping is required
seems like a funny joker: over pixelated
God I was JUST thinking of this too
Calling it the Ballad of Jimbo
I made like one card idea for a spindown dice where it would go based off the shop collection to go down a joker
Is there any way we can all collab on like ideas? š
btw curious. Wdym by the "shop door", like in game or as a sprite?
Dumb question, new to lua and still very novice at programming, can someone explain what the highlighted hud.nodes[1] etc is doing?
this works
but instead of removing, I needed to use linear
downside is that mipmap is applied to all atlases
the sprite, i couldnt find it anywhere
is there an easy way to edit this badge?
upscale it through Aseprite
thanks
also any way to change this badge without renaming the joker?
set_card_type_badge(self, card, badges)
if you own Isaac you can dump the sprites yourself using the modding tools
cool ty
didnt realise there wa s a function for it
i knew how to add to badges but not change
can i use that to change the jokers badge too?
apparently it breaks spectral card textures somehow š
yes, it replaces the rarity badge if you do that
ok nevermind it was a steamodded issue
cool ty
I'd have to start thinking of them. Feel like Sacred Heart and Godhead, stuff like that, should be Legendaries lol
HI CAN I STEAL THIS
i think it might be because its atlas has different dimensions?
I mean most quality 4 items would probably be legendaries
maybe
for some reason that thread was removed from my theads list
I am considering adding mipmap as a setting to steamodded
That's a lot of legendaries 𤯠probably should split Rare into Q3-4, and pick a few of the best Q4 items and make them legendaries
how do i make the colour change with the hand level?
finally finished it
Or... There could be new rarities Quality 1, Quality 2, Quality 3, and Quality 4
Some items I feel would be better as consumables too š¤
Like Spindown dice being a spectral fits
there are so many possibilities
we should do it real
And 0
the elusive quality 5 
you want to add color to the description?
you dont put it in loc vars
oh like the color of hand lvl changes when it lvls up?
yeah
you dont really need to make it accurate to the hand lvl color
Check BU-CB ā thereās a lot of examples in there
ty š
Np
wait, i thought it was a joker, im kinda dumb
Dude there could be unlock conditions where you have to win with certain decks or something 
I just realized that
G.localization.misc.v_text.ch_c_cm_no_overscoring = { "{C:attention}Blind{} score must not exceed {C:green}#1#%{}" }
for example
also, i actually have an interesting idea, you see the different borders i put on every item? those are representations of the item pool. when you buy an item, you actually have to buy a random item from an item pool
i wanna change the colour tho
That could be neat lowkey
yeah, {C:attention}Blind{} Changes the colour of the word "Blind" to the "attention" colour stored in G.C
sorry i mean like
yk how the planet cards
the colour of the level changes when you level them up
oh yes
not sure what i do with {V:1} here
update_hand_text({sound = 'button', volume = 0.7, pitch = 0.9, delay = 0}, {level=G.GAME.hands[hand].level})
have entire completion make pages to complete
there's some sort of function that maps the level to colour
I think that allows you to pass a colours arg in loc_vars?
i forgot what it is but check in the level_up_hand func
?
Don't you do the {C:color} thing?
yeah but it needs to be variable
.
i need to pass in a colour variable to that
but that will only ever be attention colour
hold on
no?
look at the end of it lol
{C:green}#1#%{}
you see how the lvl.x colour changes
the game does it this way
^
but thats not how to do it
i understand that i can do {C:red}red{} for red text
etc
but the colour of a hand level changes depending on level
so when it generates the ui box
from the localization file
it has '{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up', in it
where it passes a colour in for V
instead of just being {C:red}lvl{} and then the colour would only ever be red
no
š
the part before loc colors
loc colors just gets the default colors
like CHIPS and whatever
you need to send list of colors
so colours table goes inside vars
into vars.colours
i still dont know the syntax tho so i cant get it to work
well thats a step in the right direction
thank you stupid
np
no idea why its white tho š
oh yea
because it's background color
cool to know
I'm still trying to get this Joker effect to shuffle cards before a hand is scored. This is what I tried to do, using some code from Amber Acorn, but for some reason, it still only shuffles them after the hand is scored.
G.E_MANAGER:add_event(Event({ trigger = 'before', delay = 0.2, func = function()
G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 0.85);return true end }))
delay(0.15)
G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 1.15);return true end }))
delay(0.15)
G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 1);return true end }))
delay(0.5)
return true end }))
end```
if you add an event the events are done until after the round or smth like that
i had smth similar trying to add an event for a joker to dissappear
but it only went after the cards had scored even if the event was made before that
Is there a way to get the shuffle to happen before the hand?
having a bit of trouble making a spectral apply an edition to a card
use = function(self, card, area, copier)
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
local over = false
local edition = 'e_sneaky'
local sneaky_card = G.hand.highlighted[1]
sneaky_card:set_edition(edition, true)
card:juice_up(0.3, 0.5)
return true end }))
end,```
just chaned the key back to e_sneaky but that gives the same error
that assertion checks for the key starting with e_
so it sohuldn't raise the same error if it's e_sneaky (but shouldn't there be a mod prefix?)
Should be e_cere_sneaky, right?
ah right
i never know when i need mod prefixes, because sometimes it feels like i dont need to use them
i tried cere_e_sneaky but that didnt work lol
so i ruled out a problem with the prefix
but obv not
Unless you manually defined a prefix
works perfectly, thank you
That's a neat idea
i think its quite funny lol
you never need mod prefixes when you're passing a key or key-like string (i.e. something that refers to a different object's key, so atlas, shader, etc.) to a smods API constructor
would that prevent perma_debuff
it should
because i don't think bunco's fluorescent does
exceptions are things like requires on vouchers that are expected to also process other mods' objects
local blind_debuff_card_ref = Blind.debuff_card
function Blind:debuff_card(card, from_blind)
if card.edition and card.edition.type == 'cere_sh_sneaky' then
card.debuff = false
return
else
blind_debuff_card_ref(self, card, from_blind)
end
end```
this is the code for it lol
okay so how do i prevent a debuff prevention
this is good to know, thank you
asking for specifically one card
nuh uh
cere_sh_sneaky also looks wrong
oh yeah its not that anymore
oops
good spot
so when im making jokers, consumables etc
do i not need to add j_ or c_ at all
why did it do that
j_, c_
steamodded automatically does that?
yes
cool
how does stickers work, implementation wise
@shell timber i got a question about the github site, do i just add a pickture called "logo"? or do i need to change a configure somewhere in the index.html? or anywhere else for that matter
so scale of 1-10 how difficult would it be for a guy that has like one high school class of experience in java to make a mod
I mean it depends on the scope
depends on what u want to make
you know thats fair
LMAO
let's say like an average sized content mod
10 of everything
r u entirely new to coding?
nice cuz i am entirely new :)
nice
ooh u know what would be funny
i liked checkered deck the most as well as plasma :>
??
What is everything
Also I think 10 of everything is a lot
Like thatās about as many planets as there are
And half of tarots
how big of a scope would it be to make 52 custom hands
for each card being a high card
so u got like 7 of spades and u can level it up
I mean if you know how to code that should be very small
Iād recommend looking at High Card mod
so it exists already?
plasma is dope
No. Itās named after the anime https://discord.com/channels/1116389027176787968/1219505109613023252
Anyways the Homestuck mod allows you to level up ranks
Which is similar
oh hey that looks dope
ill check it for sure
Keep in mind itās technically outdated
i my self am working on a phew mod consepts and i want to actually mod them too when i get lua on my laptop
Steamodded 1.0 isnāt officially out but most people use it
I donāt think you need anything specific to start modding besides the actual game and a decent text editor for coding
yea, so lua
???
lua, the coding language?
nvm, i'll look at coding
later
once i get some actuall joker and things ready
If you have the game you donāt need anything else specific
a text editor is like where you do the coding, lua is just the language
so like
notepad is a text editor
notepad++ is a name ive seen thrown around but that was years ago
hmm i'll look into it tmr
Thereās also Sublime Text and VSCode
yeah i heard of those too
Or VSCodium if you don't want Microsoft snooping on you
and things already
I used Sublime Text for modding Balatro but recently I changed to VSCode
Personally I prefer to start with coding because: 1) itās easier; and 2) if I change my mind I didnāt waste time on an asset
i'll try vscode :)
https://vscodium.com/ in case you care
Free/Libre Open Source Software Binaries of VSCode
if i do not have use for the assets anymore i can always iguess give it to somebody else?
SublimeText might be easier for a beginner. VSCode has a lot of features but, like, that might be a bit much to start with
its fine
Although the file search feature of SublimeText isnāt as good as other text editors
so are there any like, tutorials?
so do most mods work by just editing the source code or what?
i could probably just LOOK at some
i'll just copy the code which adds a joker? change the values?
I highly recommend extracting the Balatro source code to see how everything works
i already have done that, got everything in a folder :)
+8 mult if played hand contains a pair
More along the lines of adding code ON TOP of the Balatro source code I think
Lovely patches change the source code
Steamodded
yeah i know i just wanted to do this with the fish mod i alr got on my computer
it's you...
hey is this license file u put in the fish folder important btw
In hindsight maybe not, but GitHub suggests adding one
Slapping a few things together to try and get file loading to work, to better differentiate stuff in our mod.
Error tho, and not sure what we're missing really
do you have a return statement at the end of your file?
U make it seem so easy š
Yeah we added one at the end of our Joker file, and that doesn't work
Unless you mean a return statement on like, the main file?
for some reason the error is being caused by your file not returning anything
is there an error message in the lovely console?
slapped in a senddebugmessage and discovered this
Something's wrong with the g diffuser the main.lua?
i mean tbh i just stole the code for the fish mod and then replaced "flush five" with "straight" then "fish" with "gay"
and you can make a ton
for every hand
so it was easy
Lol nice
now time to rename jokers
Maybe it's our file paths?
does anyone know how id go about changing the name of already existing jokers?
Do yourself a favor and get Steamodded
isnt that for like, running mods?
im under the impression that steammodded is for running mods
It also makes modding easier
you don't say...
like your mods wonāt get Thanos snapped if you update the game
And there are APIs that make doing stuff easier
sounds pretty good
so how do i access that
is it gonna be in the steammodded mod i alr have installed?
oh @zealous glen im not actually coding the mod in the source code if thats what you mean im just trying to find the stuff to replace text in there
Read the wiki
Also if you have Fish that serves as an example, although I donāt think itās updated to 1.0
no it works on 1.0
should at least
unless im in a gaslighting competition and the opponent is myself
i built the mod starting from the source code of fish so far, so i should be good to go
"the source code of the fish" being a solid 1 line of code
Does anyone have a general 'file loading' guide we could follow?
Trying to figure out what to return, what to have in a different file, etc.
We have never been happier to see +7 jokers added to 451
https://www.youtube.com/watch?v=z-JRdRXiNv4
Ok, so I've got this function that creates a custom context for when a Joker is destroyed. The problem is that it is in the start_dissolve function, so Jokers that don't use the dissolve animation will not call this custom context (Gros Michel, Ice Cream, Popcorn, etc...).
-- Add new context for destroying cards of any type (Used for Sacrificial Lamb)
local start_dissolve_ref = Card.start_dissolve
function Card:start_dissolve(dissolve_colours, silent, dissolve_time_fac, no_juice)
if self.getting_sliced then
for i=1, #G.jokers.cards do
G.jokers.cards[i]:calculate_joker({destroying_cards = true, destroyed_card = self})
end
end
start_dissolve_ref(self, dissolve_colours, silent, dissolve_time_fac, no_juice)
end
Another issue is that those Jokers do not count as getting_sliced, so I'm trying to figure out some way to register that action for those Jokers to call my custom context with calculate_joker. Any ideas on what I can do for this? Or a mod that implements a context like this?
I guess somehow a way to check in remove_from_deck that it isn't getting removed because it was sold
If I wanted to change how straights were calculated as a mod how would I overwrite the current straights function with steamodded?
hey anyone know what the problem is here? i have em in an assets folder. do they need to be named something specific?
heres what the folder looks like, theyre just in that assets folder
which i imagine is correct
@shell timber is there like a line of code i can touch to change the name into the name of the pickture that isn't messing with the background? :,)
nvm got it. add ur 1x and 2x everybody
1x and 2x?
every texture has to have a version of it in a different folder that's twice the size it seems
hmm
so for this spritesheet i had to upscale it
so you need it 2x but one is big
yes, this is so it looks crisp at high resolutions
i have to move the text closer to the middle tho its kinda hanging off
anyways for this, i feel like learning some html would be useful, and it would be a transferrable skill
the bulk of my knowledge with lua has come from looking at other mods
sure thing
good idea ;-;
flair pass
hmm nice
instead of being rare im thinking of making it an uncommon with a condition to be in pool so it only appears when the deck is already small or something like that
ok ok logo shows, just not in the right place?
how do I make a Joker's effect activate when a Booster Pack is opened?
What do those jokers do when they are being removed?
Check Hallucination
thanks
currently 40% of the deck (so 20 for standard deck), still unsure tbh
i tried 1/3rd but it felt like too much
I donāt know if the Joker should list its spawn condition
Maybe only in the collection
its only in the collection, ye
mosb synergy pog
just had a test run (changed the condition to be static 20 cards - so abandoned deck has easier time) and the buffed ult.magician (i changed it to be "sell any card" to swap) is really fun to play around
Can I spawn voucher outside of game screen?
Theoretically, yes, if you call the function without calling the UI
My task: display voucher redeem animation properly on boss blind start
But with this code voucher spawns on top center of screen
i am still working on getting the logo to show and be in the correct placement
Dude you have div closing but no div opening 
i got help from in a coding discord :>'
They call card:remove(), card:remove_from_deck(), but they don't have the getting_sliced attribute so my previous solution won't work for those functions
Hmmm, probably needs some targeted patches to add some sort of label to them in that case
@shell timber so uuh, i copied all your code, changed nothing but some picktures doesn't like to show (i've been trying for days doing little configurations), while inspecting the page i could only see j_joker while not being able to see the logo-bg
or sticker-bg
even tho github says it passed everything
do you know by any chance how to fix it? :)
wait
have you been deleting and replacing the files every time you want to change the website???
huh????
not really
i haven't kinda replaced files at all
this is the img folder rn
i did take you logo background to test if it would work
but i did use my own logo
rn, no
well then that would be the reason
look. the template is meant to be a bare bones thing which handles the joker display and background. that is all. everything else you have to do yourself
inspect element does not save your changes you have to actually edit the html
look. before you try modding the game or doing anything i would recommend having a basic understanding of programming concepts
like. what is a string. what is variable. what is a function
if you try to start doing things without knowing what is what you will get lost immediately
i know i will not edit in it i will try and copy things :)
but the problem rn
is that the logo-bg and logo-nobg aren't on the site? but they passed all the checks in github
github doesn't actually check your code or anything. it just puts the files on the server. the reason they aren't on the page is because they aren't referenced in anything
i did put this in the html in the same place you have it
<div class="logostuff">
<img src="assets/logo-bg.png" class="logobg">
<img src="assets/logo-nobg.png" class="logo">
</div>
okay. what i would recommend is setting up a local development environment so you dont have to keep reuploading your files to github every single time you want to see if your changes went through
hmm ok, got any tips for that?
apparently you already have a live server config file. use live server. it is probably good for this
look. what i would recommend is actually learning what you are doing instead of copy pasting magic words. go look up a guide for how to learn what html is, what css is, what anything is
ok
is the 2x version twice as large as the 1x version?
yeah
wait my exort is wrong
why didnt it 2x?!
WELL I GOT IT WORKING
LMAO
now its just gone
this is gonna be fun
also an upside of actually learning what you are doing is if you learn the programming concepts you can apply them to other things
whereas if you only learn the magic words that do things you're stuck in one environment
guys where are the hand_chips and mult variables stored?
for jokers?
i think its on game_lua line 368
I donāt remember what theyāre named exactly, but check out evaluate_play in functions/state_events.lua
They might just be hand_chips and mult tbh
Gm "developers" I kinda feel like some DebugPlus stuff, what should I do?
Could I use a lovely patch to add card:getting_sliced = true inside the scope where banana goes extinct, just before the remove_from_deck() call?
I believe that would work, yes
Cool. Now I've just got to learn how to do lovely patches
I don't think card:getting_sliced = true is valid lua 
me when I card:getting_sliced() == true
has anyone else been getting lag when anywhere with a bunch of cards (like the blind select screen with the deck)?
I've been trying to figure out what's causing it and I am at the point where I have no mods and its still happening
ok wait the mod I was using to measure peformance was casusing lag
this gets a bit harder than
ok but something was causing lag
I guess it'll remain a mystery
I wasn't thinking when I was typing, was in a rush. Meant card.getting_sliced lol
#1242974974701080617 message while that's true, to me steamodded is more of a platform for content mods
true, but even for DebugPlus I just added a super simple skeliton mod to add config and the toggle
oh yeah
maybe it would be good to make a lovely mod to add config pages to the settings like the spectral pack one that cryptid/tailsman does
ye that's what I was thinking
because right now
every non steamodded mod needs nativefs dependency
and then also separate config file and somehow fitting settings menu somewhere
I don't
I mean mods with configs
can't you use love.filesystem?
it's in the games config dir
also I'm working on a config
maybe, I kinda assumed it's harder to utilize as steamodded and some other mods mostly use nativefs for configs
I think you can just pass the function to render the config ui and do config yourself
would be much easier if you didnt have to do configs and localization yourself
ugh are we at the point now where steamodded is too universal with mods wanting its functionality without depending on it?
i think i should just quit while i am ahead š
truely an if SMODS then else end moment
yep
and no I'm not switching any of my lovely mods to steamodded unless they need them
yeah but also I've been kinda adding a little support
^
My philosophy currently is where at all possible, try to make it compatable for both steamodded and non steamodded.
well if mod has config file and settings, might as well use steamodded š but I get the idea
well, not really.
yes really
It's another dependency.
you're just adding something that is already implemented in steamodded
for configs
that's why I didn't feel like adding settings menu for vanilla in cartomancer
thats great
it's just too much effort
each to our own
I've only messed with it a bit but I don't think its much work to render the settings ui in the settings panel if SMODS is absent, otherweise in my SMODS config page
that's what im trying to do currently actually
have you got anywhere with it?
I haven't actually looked at how the game renders a settings tab
but I got SMODS to render a ui I told it to and me handle the config writing (I don't actually save it rn)
I mean more so with checking if SMODS is present or not.
oh just if SMODS then end
Yes but I mean more specifically something like
Mod = SMODS.current_mod
Except if you're injecting in as well, because it has to be compatable without steamodded
make a file for steamodded to load and then call a global function/ module to tell the rest of your lovely stuff smods is there
then it could be loaded first, before steamodded due to lovely, and it would say that steamodded is not present.
although my dev branch may use smods stuff for convience I haven't checked if it works without
but before its prompoted to master I will make srue everything works
rn I just don't have a config without smods
but Imma work on that
smods is loaded super early
like before the title screen which is where 90% of your code will run
but smods stores configs for you
not in my case
config is optional you can still get the config tab without steamodded handling your config
actually let me see if I can get cryptid to do it's config in it's mod tab real quick
what is the global func u are calling?
I use a module
function G.FUNCS.DP_config_callback(args)
print(require('debugplus-util').stringifyTable(args))
end
well in this case I assing to a global varibler cause I dont' acutally save config yet
this?
_RELEASE_MODE
cause thats about all mine does
but it would just be call your func instead of doign it yourself
yeah ofc
it's very early WIP
doesn't it already do that?
the spectral pack setting persists but just links to the smods config tab iirc