#💻・modding-dev
1 messages · Page 91 of 1
it didn't work
ok got it to work, just needed to check if context.other_joker was the card the gem is attached to
local str = "Splish Splash"
local tstr = ""
for i, v in string.gmatch(str, "*") do
tstr = tstr.."{C:goldcolor"..tostring(i%5+1)..v.."{}"
end
something like this
😭
I don’t think you can do this in a loc txt though
how do i put that on the joker
odd
no clue I don't make jokers
Though I’ve never tried throw in a variable in loc txt, I don’t think it’d work
isn't that
literally what we do with loc_vars
can't i just put this in the loc_vars and do it with that system
i dont think thats good
No, loc vars doesn’t parse colours
return { colours = {} }
on skib
ok its bouncy, but fast
relatable?
ok
erm i think i should ignore being upgraded by blueprint
how do i slow down the movement
Sorry to bring this back, I'm looking through the Aura code and it looks like the animation needs to be the size of a card (142x190) is that true? is there anyway to make the animation larger than that? The animation I have is ~160x180
you could always just increase game speed and decrease dt by the inverse of that increase
oh wait
that would do nothing

i think only moving every other frame
but then it wouldnt be smooth
its also spazing out
(funny)
where do i download cryptid
let me experiment in like an hour
i need help please
^
ok nice
Odd question: How do I omit a deck from being loaded using SMODS.Back?
idk, I think smods objects are only loaded after every mod has loaded so you can just remove it if your mod has a higher priority
I'm trying to make a challenge deck back
I'm not using the default one and it's not a texture pack
I'm adding a deck that I'm gonna use for challenges. I don't want it to appear as a selectable deck
how do i do it?
b_challenge= {name = "Challenge Deck", stake = 1, unlocked = true,order = 16, pos = {x=0,y=4}, set = "Back", config = {}, omit = true},
I saw this code and tried to import it into the the smods with no luck (the omit = true part)
and the smods.back doesn't say anything about it
Does that help?
it helps i just don't know the solution
oh
Good luck
I don't think steamodded has any support for that no
If you want to create a challenge, try using SMODS.Challenge
I know that. I'm making a deck for it
they want a specific deck art for challenges
mhm
but there's no way to specify a deck art without having an actual corresponding deck
(as far as I can tell)
Is there a list of things you can take over with SMODS:take_ownership somewhere that I'm missing? I'm trying to change and animate Soul's floating bit but all I keep getting is replacing the card back, I currently use: SMODS.Consumable:take_ownership('c_soul', {atlas = 'c_soul', soul_pos = { x = 0, y = 0}, prefix_config = { key = false } }, true)
yeah, in balatro, there's a secret deck
it crashes if you tried to load it
It has a thing saying "omit = true" in the code
If you try it in your smods the it's no dice
yeah steamodded just has no support for omit
weird, just changing soul_pos should probably work 🤔
i think an isaac d4/missingno joker that changes all of your jokers randomly each hand would be interesting (minus the joker itself obv)
i might pursue it who knows
Now that im on my main pc, i can show what this actually looked like
This is my full lua file atm:
SMODS.Atlas {
key = 'c_soul',
path = 'c_soul_extra.png',
px = 71,
py = 95
}
SMODS.Consumable:take_ownership('c_soul', {atlas = 'c_soul', soul_pos = { x = 0, y = 0}, prefix_config = { key = false } }, true)
``` Am I missing something or?
nice recording hahaha
I'm not sure but does your mod badge appear on the soul when doing this?
now this should work
Mod badge? Currently the file is just a negative filter over the default soul image for testing, and its still replacing the card and not the top part
The mod badge shows up in the mod menu and is enabled
like when you get a copy of the soul, it should have a badge on it's info box for your mod
how do i make this slower
oh idk, let me find an early soul seed
the collection would be fine too
oh no then, isn't that what the silent part of the takeOwnership call is though?
its a good debugging step, let me make that not silent
What are you doing to get this?
actually if you change the key to soul does that work?
"bad argument #1 to 'ipairs' (table expected, got nil)
Maybe its not in SMODS.Consumable? The default location of the soul floaty thingy is in the Enhancement image
SMODS.Consumable:take_ownership('soul', {atlas = 'c_soul', soul_pos = { x = 0, y = 0}, prefix_config = { key = false } }, false)
``` Just to make sure this is what you meant, I changed the first argument from `c_soul` to `soul`
yeah that's what I meant
I just tested myself and with ```lua
SMODS.Consumable:take_ownership('soul', { }, false)
Ok I removed the prefix_config, now I get a launch
Yeah I get this still
I think the background missing is expected cause it's using a pos your sprite sheet doesn't have
so should the x and y be 1?
yeah try that
although actually I set it to a smaller sprite and it seems to still be rendering the soul under mine
1s for x and y didn't work
(these are the two sprites it was using)
what does your sprite sheet look like?
ok yeah soul_pos = {x = 1, y = 1}, pos = {x = 1, y = 2} should work I think
and I'm trying this:
SMODS.Consumable:take_ownership('soul', {atlas = 'soul', pos = { x = 0, y = 1}, soul_pos = { x = 0, y = 0} }, false)
ok that worked, kinda, one sec
yeah the original soul underneath it?
Yeah I can still see the original soul under it animating around
yeah I saw that
not sure what's going on
@frosty dock would probably know better
Soul must have some other key that it uses?
Is there just a list of the keys somewhere or can I get it via debug statement somehow?
I suspect it's probaly hard coded somewhere
the soul card doesn't even define a soul_pos
I'm trying to change the soul thing on the soul card, I'm able to get it to change to a new sprite, but the original one is still there beneath
Yeah
it's G.shared_soul or something
can SMODS disable rendering it when overwritten?
so the key would be
SMODS.Consumable:take_ownership('shared_soul', {atlas = 'soul', pos = { x = 0, y = 1} }, false)
``` or something like that?
no
yeah I found G.shared_soul
you just have to change or reassign to G.shared_soul
Probably an if check here would work from SMODS side
steamodded should maybe normalize that to behave like other soul sprites
but yeah SMODS should normalize it
also the soul_pos souls behave different than the shared_soul
Where are you finding that source code?
you can unzip the exe
Oh duh
also partial modified sources are availble in Mods/lovely/dump (just files edited by lovely, and their edited source)
there's also lovely dumps which show the code after patches
Ok so what would I overwrite the G.shared_soul with? Would I do
G.shared_soul = SMODS.Atlas { ... }
``` Like how would I create the object to overwrite
uhhhhhh
maybe try G.shared_soul = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["yourprefix_soul"], {x = 1, y = 1})
That gives me an "attempt to index field 'atlas' (a nil value)" error
probably the atlas key is wrong
hey folks
trying to implement unlocking mechanics and achievements properly so i'm learning how that stuff works
Cardsauce has two legendary jokers and I wanna implement the same vanilla logic for their locked_loc_vars where the description says ???? if you havent discovered the soul card yet but i cant figure out how to implement that
you guys know how to do that?
probably the atlas key is wrong
you need to have unlocked = false as property of the joker, and the way the base game does it is by having a localization entry with unlock = { "text" } (you can see this implemented in the base game localization files)
not sure if there's a better method
yeah I know that but i'm referring to the dynamic aspect of the Legendary jokers
the description only shows if you have discovered the Soul card
and if you dont it says "????"
oh neat, I didn't even know it did that
yeah its cool and I wanna keep that
but when I searched for instances of '?' in the code notepad++ couldnt find anything
you're probably gonna have to dig into the base game code for that 😅
i dug a bit
couldnt find it
all i found was where the code sets it to the left description if its locked
and if its unlocked then it does the else statement to give it its normal effect description
didnt see any other check
try searching for joker_locked_legendary
i did that
oh wait
effect = "Unlocker" is in c_soul
seems like a solid lead
nope dead end
that probably is just there so it can unlock the legendaries anyway
probably this
yeah thats the
wait
i thought the else statment was for generating the normal effect description but im not so sure now
Hey, i've been having trouble getting a modded effect that's essentially canio (+30 chips whenever a card is destroyed, starts at +30), but it hasn't been working quite right. A lot of the code is taken from vanilla canio
local cards = 1
for k, v in ipairs(context.glass_shattered) do
cards = cards + 1
end
if cards > 0 then
G.E_MANAGER:add_event(Event({
func = function()
G.E_MANAGER:add_event(Event({
func = function()
card.ability.extra.current_chips = card.ability.extra.current_chips + cards * card.ability.extra.chips_per_destroy
return true
end
}))
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_chips', vars = {card.ability.extra.current_chips + cards*card.ability.extra.chips_per_destroy}}})
return true
end
}))
end
```
local cards = 1
for k, v in ipairs(context.removed) do
cards = cards + 1
end
if cards > 0 then
G.E_MANAGER:add_event(Event({
func = function()
G.E_MANAGER:add_event(Event({
func = function()
card.ability.extra.current_chips = card.ability.extra.current_chips + cards * card.ability.extra.chips_per_destroy
return true
end
}))
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_chips', vars = {card.ability.extra.current_chips + cards*card.ability.extra.chips_per_destroy}}})
return true
end
}))
end
```
return {
message = localize{type='variable',key='a_chips',vars={card.ability.extra.current_chips}},
chip_mod = card.ability.extra.current_chips
}
end
end```
Yeah here are the question marks
possibly was treating it as regex
hm ok
or just a wildcard syntax
is there any examples of modded jokers that use the generate_ui for dynamic descriptions like this so I can reference how they do this
i've tried messing with it before and got some jank results
uhhhhhhh idk
need more for what's not working
For example, when two cards are destroyed with hanged man, it gets the buff 3 times
RNJoker from Cryptid, but it's very complex
that's a lot of code
ok im not exactly sure now if the proper description is every actually shown in the collection menu at all, it doesnt show when you discover The Soul
i think that might just be there for the unlock pop up
Oh MathIsFun, I'm still trying to get the animated jokers working but I'm getting a crash talking about a nil atlas value when I try to add my joker. I've given up on Soul cause its so weird, but I just wanted to get the animation to work as a proof of concept now. Trying to get the hologram to use this spritesheet (I've separated the backing but its easier to send one file) named j_hologram.png and j_hologram_extra.png, in the aura.lua file I changed:
j_hologram = { frames_per_row = 1, frames = 1, start_frame = 0, extra = { frames_per_row = 8, frames = 8, fps = 10, start_frame = 0 } },
``` but get this error:
engine/sprite.lua:11: attempt to index field 'atlas' (a nil value)
how would you go about adding a custom card with custom texture scaling? i'm looking through cryptid and it looks great but it also seems optimized for a LOT of cards, and i just need one
:p
Try to see which card is doubling the buff and with which context
You can copy those patches for just one of the cards that’s similar to yours
oh nvm
no nvm i got it
i was misreading it lol
ok sorry for asking probably stupid questions, how do i actually register the new card to like. exist and have a description with smods
or is it something i have to callback to the original game for
nevermind
ok but how does ordering work? is it important
do i need to place things at a specific position
it's ordered the same as the order you declared them in
gotcha
i'm just gonna set it to 1 and hope for the best
is there any debug way to just. make it appear in my hand
okii
should custom jokers be in collection...
i feel like really stupid rn, lua is sorta new to me? it isn't that new, i've done isaac modding before and i have been doing python/js/c#/c++ for like 10 yrs, i just like. augh
okokok, it probably does NOT help that i have not attached like. any code
local jokers = {
"j_gros_michel",
"j_egg",
"j_ice_cream",
"j_cavendish",
"j_turtle_bean",
"j_diet_cola",
"j_popcorn",
"j_ramen",
"j_selzer",
}
SMODS.Atlas({
key = "atlasone",
path = "atlasone.png",
px = 71,
py = 95,
}):register()
local missingjoker = {
object_type = "Joker",
key = "missing_no",
pos = { x = 0, y = 0 },
rarity = 2,
cost = 5,
atlas = "atlasone",
order = 1,
blueprint_compat = false,
eternal_compat = true,
perishable_compat = false
}
jokers[#jokers + 1] = "j_missingno_missing_no"
this is like the whole thing rn, i just based it off of what i saw in cryptid
if you add jokers via steamodded's SMODS.Joker then it will be in the collections
wait what
oh hm
how do i do that 😭
SMODS.Joker({
…..
})
there's an example_mods folder in steamodded's files, go in it and find the vanilla recode mod
idr what it's called
i literally keep forgetting about that
Cryptid uses object_type to determine what to call it with later, because it has an advanced loading system
Yeah those examples are much better than Cryptid for starting out imo
iunno, this joker is gonna be pretty complicated
i literally am going to have it change every joker but itself in hand on each round
ok i got the example code
is it spindown dice by any chance
no but that's a REALLY good idea
i should do that next
it's missing no
i was stuck between the actual missing no texture from pokemon, or the one from isaac, or making my own
i landed on making my own
i found something that corrupts jpg files in interesting ways and edited together a lot of the glitches that i thought were interesting onto the base joker
i think it ended up looking cool
supposedly the code will work now
oh hey it worked
wow that was shockingly easy
missprint be like
misprinting the misprint
missprint is designed to be a glicted aestetic, but moreso a card that was printed wrong instead of a sprite that was corrupted
yeah
i thought about making it work like actual missing no and take random parts of every joker sprite every time it triggers
worth mentioning i have 0 clue how to make it callback to something every time a round happens
also @crisp coral since you're into the isaac stuff i'm doing, i'll let you decide, should it be every hand, round, or ante
i guess ante would make more sense if we're making it true to isaac like how it is every floor
i'm thinking about making it eternal too to make the consequences similar to isaac as well
i should make a tmtrainer
that'd be really interesting i think
round 
oki
nah, ante
yeah that's what i was thinking honestly
it feels more appropriate
should i override the existing ante code and just make it check if missingno is there and then trigger missingno?
that feels like the simplest way to do this
unless if i can embed it into the joker definition
i'm trying to make a card that destroy 2 cards and enhance 2 others, but it crashes when i use it
it tells me something is nil, but i don't know what
here's the code for the card:
use = function(self)
local destroyed_cards = {}
destroyed_cards[#destroyed_cards+1] = pseudorandom_element(G.hand.highlighted, pseudoseed('random_destroy'))
for i=1, #G.hand.highlighted do
local percent = 1.15 - (i-0.999)/(#G.hand.highlighted-0.998)*0.3
event({trigger = 'after', delay = 0.15, func = function()
G.hand.highlighted[i]:flip(); play_sound('card1', percent); G.hand.highlighted[i]:juice_up(0.3, 0.3);
return true end })
end
delay(0.2)
for i=self.config.toDestroy, 1, -1 do
event({trigger = 'after', delay = 0.1, func = function()
destroyed_cards[i]:start_dissolve(nil, i ~= self.config.toDestroy); -- this is the line where it crashes
return true end })
end
local cen_pool = getEnhancements()
for i=1, #G.hand.highlighted do
event({trigger = 'after', delay = 0.1, func = function()
G.hand.highlighted[i]:set_ability(pseudorandom_element(cen_pool, pseudoseed('spe_card')), true);
return true end })
end
for i=1, #G.hand.highlighted do
local percent = 0.85 + ( i - 0.999 ) / ( #G.hand.highlighted - 0.998 ) * 0.3
event({trigger = 'after', delay = 0.15, func = function()
G.hand.highlighted[i]:flip(); play_sound('tarot2', percent, 0.6); G.hand.highlighted[i]:juice_up(0.3, 0.3);
return true end })
end
event({trigger = 'after', delay = 0.2, func = function()
G.hand:unhighlight_all();
return true end })
delay(0.5)
end
ok imma open up a thing in #1209506514763522108
if context.blind.boss and context.end_of_round then
(code)
end
``` would this work for what i'm trying to do, do you think?
i'm reading through the original game code and i got most of the stuff set up, i'm just trying to figure out how to make it trigger at the end of the round
oh wait
i can check golden joker maybe?
hmmm
yeah this seems like the best way...?
ohhhhh
wait it's just in the. calculate\
i'm so stupid
ok ok ok
this is 100% the easy part, the hard part will be when i have to figure out how to make it um. randomize all of the jokers
the callback definitely works
i'm getting a weird error that says "for limit must be a number" tho
sounds like you have a for loop whos loop constraint isn't an integer
i didn't have a for loop
i think i figured it out
huh
maybe i need to actually. activate something
?
calculate = function(self, card, context)
if context.end_of_round then -- and context.blind.boss <- set after i make sure that this works for what i want it to
-- this should randomize the jokers!
play_sound("missingno_static", 1, 1)
return {
message = 'Change!',
colour = G.C.CHIPS,
card = card
}
end
end
``` this is the calculate code rn
i'm not sure why this doesn't work
i'm not having it do anything to any cards, so i'm not sure if that's probably the issue...?
huh
ok now it does nothing
lol
i need to fix it again
sigh
yeah iunno now it just doesn't do anything
iunno man I'm also just guessing
How would one create a joker of a specific key?
smods.create_card I believe
the code doesn't actually do anything yet other than play a sound, which is what i'm assuming the issue mighht be
check the example_mods folder
there are a few for that in there i thnk
I keep forgetting that smods has utility functions
I always check the base game first lol
imma go check out gros michel, it seems to do what i am trying
i'm thinking it might be the play_sound for whatever reason
in any case, this should hypothetically work now
that's really funny
a negative version of missingno just spawned in a shop lol
oh huh it actually worked
oh cool ok iunno what i did but it works now
So I'm trying to use smods create_card, but I get told that the t is null
SMODS.create_card(G.P_CENTERS["j_hel_grunch"])
Am I getting the joker correctly?
I've checked and they key matches up correctly
right, I probably should've told you how to use it
here's the source code https://github.com/Steamopollys/Steamodded/blob/main/core/utils.lua#L312
here's a quick example #💻・modding-dev message,
and you can use github search for some more examples https://github.com/search?q=smods.create_card&type=code
Ah I see, thanks!
this is a very fun challenge ngl
i haven't had this much programming in a hot sec
ok now i just need to get an array of every single joker in the game currently
should be easy, surely
i like how i have to kinda think outside the box here because there was no code in the original game to just straight-up change the current joker entirely to something else that i know of
interesting, my code actually worked
what the hell haha
how would you go about just straight up changing every single joker to, let's just say, egg
i have it removing the jokers in my hand that aren't missing no and then replacing them with j_egg but there has to be a more optimized way to just like. actually replace them
actually, there may be a joker that replaces itself later on, i can't think of anything though...
yeah no i'm stumped here
i think i got something maybe
yea it kinda works
hmm
i'm so goddamn stupid
me when i forget about judgement
me too fam
can judgement spawn rare jokers (?)
anyoe know a good example of SMODS.RARITIES
should be able to yes
kk
do i need to add the create_card to an event queue? i think it spawns it like. several times
sounds more like a context issue
ion think so, it's in a loop
the context worked fine
if context.end_of_round and not context.repetition and not context.game_over and not context.blueprint then -- and context.blind.boss <- set after i make sure that this works for what i want it to
-- this should randomize the jokers!
play_sound("missingno_static", 1, 0.25)
OriginalJoker = card;
local jokers = {}
for i=1, #G.jokers.cards do
if G.jokers.cards[i] ~= card then
jokers[#jokers+1] = G.jokers.cards[i]
end
end
local joker_count = #jokers
-- is this what's making the weird sound...?
--G.GAME.joker_buffer = G.GAME.joker_buffer + joker_count
if joker_count > 0 then
for i=1, joker_count do
jokers[i]:remove()
-- i'm thinking the 1 is the quality and we're just picking randomly, since I couldn't figure out where else we'd randomly get it from :p
-- 1/4 chance for the false to be true and for jud to be soul?
is_soul = love.math.random(0,4) == 4
local c = create_card('Joker', G.jokers, is_soul, nil, nil, nil, nil, is_soul and 'sou' or 'jud')
c:add_to_deck()
G.jokers:emplace(c)
c:start_materialize()
--G.GAME.joker_buffer = 0
end
return {
message = "Changed " .. #jokers .. " jokers!"
}
end
return {
message = "Nothing To Change!"
}
end
``` this is the code rn
it works, surprisingly
i'm going to change the soul chances to be much lower though lol
iunno, i just hear multiple sounds when it does this and the event queue jumps by like 20-30
i only hear multiple sounds when it's a special edition though
adding the event thing was worse sobs
it just MIGHT be broken alright
MAYBE
no clue why this is running it twice i'm ngl
maybe it's because it's getting removed from the table?
i was looking it up and apparently lua is just weird about that
seeing if setting a variable for the card instead of calling the table directly helps
um. no it just gave me one of every joker in the game
i just thought of probably a much easier way to do this
How is extra not existing in the last line? I feel like I've done this before
config = { extra = { has_triggered = false} },
rarity = 2,
atlas = 'a_circus',
pos = { x = 1, y = 1 },
cost = 5,
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.has_triggered } }
end,
calculate = function(self, card, context)
if context.joker_main and #context.scoring_hand == 5 then
if not card.ability.extra.has_triggered then
is it self.ability?
its not self.ability
help 😭
card is undefined in loc_vars so it would error
the weirdest part is that these cards don't even exist technically
if i reload the game they disappear and the right cards stay
???
is there some method i need to call to clear all inactive cards?
i have an idea
i'm just. using a counter
How do you make a joker not show up in the shop?
hopefully this works
you'd probably have to override the existing methods for shop rendering
ok i have determined it is calling this WAY too many times
oh yep no i fucked the code up lol
functional counter:
damn this language is buttcheeks istg
it's just. not breaking out of the loop
lol
ok ok ok, why IS it running like 8 extra times
it breaks out of the for loop and then just like. keeps going for some reason?
is it easy or not to add a new spectral card?
if context.end_of_round and not context.repetition and not context.game_over and not context.blueprint then this runs 8 extra times for some reason
anyone have any thoughts on um. why that might happen and how i could fix it
i've narrowed it down to like. this specific line being the issue btw
do i need to replace return with eval_status or something
huh
no clue why this is happening
i made this work with the dumbest fucking solution i could think of
If I add a joker, can I see if it was actually bought full-price?
Does anyone know where/how to directly access the Atlas? I'm still trying to modify the G.shared_soul property and want to set its Atlas to something I added to SMOD's Atlas:
SMODS.Atlas {
key = "soul",
path = "soul.png",
px = 71,
py = 95
}
G.shared_soul = Sprite(0, 0, G.CARD_W, G.CARD_H, [ATLAS_GO_HERE], {x = 0, y = 0})
``` I've tried `G.ASSET_ATLAS["soul"]` but that gives me an error about indexing atlas (a nil value)
atlas = "soul", pos = { x = 0, y = 0 }
That would work if I was using the SMOD command, but I'm using Balatro's Sprite function
SMOD/Balatro handle the Soul card differently than other cards. You can modify the consumable soul and give it a soul_pos but the defaul soul animation will still be there and playing underneath whatever you give it, we had a discussion about it earlier today
when making a sheet for jokers, should I start by making them one buy one and then putting onto a bigger sheet or make the sheet and put them on there
Basically my question is where does SMODs actually store the Atlases it creates, I can't seem to find it on their github, but I probably just haven't looked hard enough
OHHHH MY GOD IT WORKS
what works
my thing
... sorta
i need to keep messing with it
i made working isaac missingno in balatro pretty much
i just need to um. fully get rid of the original jokers i'm replacing
which is a fun challenge
Does anyone know how to properly make a Sprite call work? Or if there's a better way to reset the G.shared_soul object
ok since this isn't exactly working for me, how can i insert a new card at a specific index in my jokers
it sorta works but i can't sell them
i can't sell these for whatevber reason\
also they're drawn over everything else which prevents me from selling my joker
I think to get any further I'm gonna need someone who knows SteamModded better and knows where it actually stores the sprites, I can't understand what I'm reading in the github and my playing around in the dark with the Debug statements is getting me nowhere
ITS ALIVE
GRTJKHSJKLDFHSDJKL
example hand 1 (first image)
example hand 2, after blind completed (second image)
Nice!
this could be the most complicated thing i've ever added to a game
i don't think boss blinds are as much fun as i thought they would for changing it up, i think it's gonna have to be every ante
Does anyone know how to make an enhancement not show up naturally (the weight value doesn't actually impact packs, or anything, it's never used by smods)
not sure for enhacements but I know other things can do an in_pool function and just return false
is it possible to ban editions in challenges
any advise on how to modify a save file to remove a joker that is crashing the game?
This worked! Before, I had had just set in_pool to false, but changing it to a function worked
you can try using https://balatro.shorty.systems
I can navigate the tool I think but I don't really understand how to remove a specific joker from
an onggoing save
you'll have to do it manually from the JSON
aaaaaaaaaaa
you probably want some kind of tool to help with handling the JSON but you should be able to find it in cardAreas > Jokers > cards iirc
i've had this issue since the start of my mod.. the stickers i have don't want to have a label
you are seriously overestimating me haha not sure how to open the save
is there a good way to make a joker card base?
this is my problem
is this your mod or someone else's
how do I use create_card for jokers of my custom rarity? using it for a booster pack
like the idea of the things in the steammodded folder, but my problem is what to do for making the joker graphic
oops fixed (i had misc inside descriptions)
ah
like showing the joker graphic or designing a joker
either way
the joker in here is very straight-forward
just kinda copy how i made my joker graphic and u should be good
If you want a base to design other Jokers on top of the Joker joker has a very simple art to remove, make this selection and press delete and you basically have a clean slate
this too ^^
but if you need help with spritesheets n stuff, my mod has a pretty simple one for you to slap this one on top of
I feel dumb, I didn't think about doing that, and yeah this is going to be the first major mod project ever, my last thing was just to make custom face cards before we had DeckSkins
still don't understand how to make a custom moving color
i've tried a bunch of stuff but it's always either the same color as the joker UI, or white
that makes me think i'm defining the color wrong
i can't figure out what cryptid does to make its colors move
ooh they hook a color function for it
okay hold on
holy shit I managed to change the color
i had to hook loc_colours to actually define the color
that's why it wasn't working
on a sprite sheet, how far apart do the jokers need to be?
check the main game's sprite atlass
alternatively tho
1 pixel gap between each joker iirc
thanks
yee!
istg i saw something about this like 2 days ago
i think you'd do it in set_ability? idk
set_ability runs once when the joker is first created, includes when it's in the shop and in packs
look at cryptid's cube, it's always eternal
been trying to make this sticker work for Jokers for the past hour with no luck 😭 am i doing something wrong
using talisman for the x chips
how would i add a ui element to a card like what the fool has?
i'm sure i could do it using lovely patches but is there a way to with SMODS alone?
you'll need to override and use your own card ui with card.generate_ui(self, info_queue, card, desc_nodes, specific_vars, full_UI_table)
append the ui nodes to desc_nodes
actually it's also supported by loc_vars through returning a UI element as main_end field (though using generate_ui gives full control)
why can you unlock cards but not lock them wtf.....
unlocked = false?
cause unlocked = false is the default state of the card, not the current state
the jokers you've unlocked are stored in your profile (you could probably manually edit the save to re-lock something (i don't know why you need to do that though))
Because the player deserves to suffer?
delete system32
i don't know why you're stopping at the scale of balatro
Ofc ofc. Let’s enter mugen levels of modding fuckery
1 JOKER TO MIDNIGHT.
evil sob
make it 99,999 in 100,000 to not destroy all 
lmao why not
would be too overpowered with oopsall6s
No it wouldn’t
it would be 199,998 in 100,000 to not destroy
Thinking about today’s isaac item/boss/mechanic i want to recreate
One of the setup steps I was sent to start modding included "extracting Balatro [Lua] files", is there a specific tool to do that? I've got all the DLLs from the game folder open in Windows Explorer atm
you can run 7zip on the exe
mayvbe just changing the extension to .zip might work
it's not nessicary but handy
It worked off the bat, tysm!
Dancing Isaac
I already was planning on specialist at some point
Maybe a specialist item that makes legendary cards show up in shops that had the isaac specialist dance in it
That actually would be crazy
Woohoo
Does it restart with the same seed?
yes
lol
find a seed with an early soul and this joker, farm legendaries
Now do clicker
For what reason
From thunk or you
me
Skill issue tbh
Why are there three decks next to each other?
what is the colors used on the different joker text boxes for the stuff like chips and tarrots?
Like the colored text?
yeah
You can check the localization folders for the color codes. tarot is like this {C:tarot}Tarot{} card and chips is like this {C:chips}+50{} Chips
The codes just go into a string like this
do you need the attention part?
C:attention is just another color code
thanks
It's the orangish-yellow color
thx
Why is this happening :(
Oh wait nvm
do you even need the galdur dependency?
Nah my issue was capitalization
My whole mod is based around adding decks so it's really more of a convience. I also wanna do b-side type stuff later on and having a consistent UI is helpful.
dont add a dependency if you dont have to
especially not with the current dependency system
I mean it's easier for development to only do one way and then once finished then make it work with both
yeah but if they're just adding decks you dont require galdur
^
oh
sure, it's nice, but it's not what the dependency system is for
Fair, I'll probably end up only adding it as a dependency if the UI changes are too much of a hassle to keep up with both versions.
what UI stuff are you adding?
I wanna add b-side decks, and I wanna do an animation for the switching of decks. I haven't fully worked it out in my head yet so I'll definitely first have to see how hard it is to do first.
If I wanted to keep specific tags from appearing until Ante 4 what would I need to do? I'm not sure where to even start trying to do that.
I would start by looking at the source code for where tags are randomly chosen
am tying to figure out how to tell the game to add chips when an enhanced card is played
oh?
eval_card is the relevant function iirc
<3
Kind of weird that tags use .requires. Are any tags even locked behind a discovery?
some yes
I don't even think the collection shows it though
Five tags also have a hidden unlock requirement: for the Rare tag you need to have discovered Blueprint, and for the Negative, Foil, Holographic and Polychrome Tags you need to have discovered their respective editions.
Huh, that’s kinda strange for the rare tag
can y'all help me out here? i've been trying for a while now but i'm having trouble figuring this out, it's throwing an error here. any thoughts?
SMODS.Joker {
name = 'Black Friday',
key = 'j_bla',
atlas = 'blajokeratl',
rarity = 3,
cost = 8,
unlocked = true,
discovered = true,
blueprint_compat = true,
config = {extra = 25},
loc_txt = {
name = 'Black Friday',
text = {
"{C:attention}+2{} card slots available in shop",
"when you have less than {C:money}$25{}"}
},
calculate = function(self, card, context)
if G.GAME.DOLLARS < self.ability.extra then
if context.end_of_round then
G.E_MANAGER:add_event(Event({
func = function ()
change_shop_size(2)
return true end
}))
end
end
end
}
what is the error?
self doesn't have an ability. Probably want card.ability.extra
oopsie!
okay, i'll try that :>
okay, now it's not throwing out an error per se, but it's definitely not... doing the intended thing
cardsplosion
It's G.GAME.dollars
yeah, fixed
still doesn't really work though
is there like a thing to get it to trigger once that i'm not doing properly?
If this is the first turn where you have under $25 I'm confused how it's happened, but it looks like the +2 shop size is triggered after every round.
I think the logic you're after is
ROUND ENDS
if G.GAME.dollars < 25 then
change_shop_size(2)
[set a flag to use later]
end
BLIND SELECTED
if flag then
change_shop_size(-2)
[unset flag]
end```
Yeah that's the only thing I would think of
(I assume you can add new flags in the globals object) (Is Lua even object-oriented I'm used to C/C++?)
this might be a lovely patch thing
cause though that would work you could jsut sell the joker before selecting the blind and then your +2 doesn't go away
hmm this effect is kidna weird as a conditional joker
this feel like credit card or oops where it modifes a value outside it's thing
and if it was just that you could use the add to deck and rermove from deck effects to modify it
but it doesn't really work when conditional
I guess you could just store something in your ability for is active and then when remove_from_deck or the blind selected calcualte are called then reset it
i might just scrap the idea tbh 😭
i was thinking while playing isaac
i think an r key joker would actually be crazy
sell it to return to ante 1 with all of your jokers and hand
my goal is kinda gonna be to make one new isaac mod thing a day
SOBS
it's not the same
i did do missing no though which was so technical i almost got a migraine from it
table shifting in lua is no fucking joke
i still don't like how unoptimized + unbalanced it is
btw, while you're here, how can i make it immediately eternal when it shows up in-hand
or like. explicitly show up in shops as eternal even in non-eternal stakes
that's my idea of how to balance something this ridiculously op
uhhhhh you might need a lovely patch
fug
I know cryptid does it with cube
lovely is generally more powerful
how can i make it eternal though
also since SMODS depends on it you can rely on it being there
i tried card:make_eternal() but it threw an error
I swear theres a method for it but in my code I just do _card.ability.eternal = true
actually
yeah wait how would u implement it
because i don't need it to spawn eternal as long as it becomes eternal on the first hand
i'd put it right here
you could add it to add_to_deck
whuh
oh?
stick eternal = true into config
SMODS.Joker { config={} } or something else
i don't have a config on this joker since it doesn't add any mult
yeah that
ahhhh
I belive config is what ability is set to by default
ok i tried that
you might still want to do it in add to deck in case something decides to remove it
@mellow sable why doesn't cube do this?
i need to check the shop tho
it worked!
this mod is so interesting honestly
i'm considering whether i should lock in the changed jokers as well?
what do you think
do you think that missingno penalty should be no-sell for all jokers after it rerolls them
because as you said, i can set that in add_to_deck :p
idk what missingno does
oh!
Where is the code for flipping a card object and changing it's base. I wanna do something similar but with the back of the card instead.
o
i'd throw a video in here
actually
give me like
3 minutes
ignore the fact that all of them are negative i made a mod that does that lol
actually it probably helps to show it without
hopefully this gives an idea!
There a mod that let's you resart the game by ctrl+r?
you don't need a mod for that
just hold down r for 5 seconds
I mean like the whole game
wdym
Like how you can restart the game from the error screen
I think hold m
this shit is annoying to constantly relaunch from steam 😅
SMODS adds a keybind
Never knew that
no thats balatro itself
yeah it's thunk's fault for my pain
#blamethunk
#thunkisoverparty
i guess this joke is less funny because twitter is deader than the strippers in my garage but i'm making it anyway
truely a
moment
I suspect this isn't even intended behaviour but jsut a silly side effect of balatro's design
to be fair, the way that missingno works was 100% not implemented into balatro and was a pain in the ass to figure out how to functionally pull off
which did abuse some of the stuff that existed to make itself work
wait I think my SMODS keybind patch isn't matching
ok I was right hold m was it, but since my patch failed it didn't work
it's a cryptid patch
why are cryptid patches breaking everything
Didn’t you know? Late November is when it was prophesied that Cryptid’s patches would start failing
nah I’m just joking, lmk if there’s anything on my end to make the patches less incompatible
as written in the scrolls
I mean moving at patches to a later priority would probably help a bit (wouldn't have helped in the case earlier though cause it was a funnt patch). I just proposed in the lovely discord that maybe we run at patches later for the same priority we'll see what methrul thinks
probably if anything big mods like SMODS and cryptid should get better at watching for patchs failing and making sure they aren't breaking patches
SMODS should also maube move it's priority a little earlier just so it's more likely to inject and people arent relying on patching with or withut smods depending on how lovely feels that day
We also should properly move to 0.6.0
yeah
It’s been WIP for like a month lol
I wonder how many 0.6.0 patch issues would be solved if SMODS just changed it's priority
I wonder how many new issues it would cause too
maybe I should go through all my patch issues rn and make some pr's
We should also think about re-organizing the patch files, 38 files for lovely patches feels a bit too many.
Especially for the few that share names
idk if it's to many
naviagting a massive patch file isn't nice
I've been thinking about splitting DebugPlus's patches and I only have 21
Cryptid has 251 patches
SMODS has 488
Right now I have 21 patches that fail to load
oh 23 misscounted
how do you have 23 failed patches 😭
I think combined from all those mods
23/809 is only like 3% of my patches
oh actually math I broke the keybinds, you just broke the hold m keybind
is it me or does debugplus's config not save
it saves but it doesn't load
well it didn't I fixed it today
but you'll have to remake it cause the config format was changed
cryptid wanted to be the only m around
you know if we had wildcard targets in lovely talisman could just patch every number to use to_big
I found a cryptid patch that might've never matched
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = "{card_limit = _size, type = 'consumeable', highlight_limit = 1}"
position = "at"
payload = "{card_limit = math.max(1,_size), type = 'consumeable', highlight_limit = 1}"
match_indent = true``` seems every instance of your thing ends with a )
I guess possible
changed it
So to create a new sprite for G.shared_soul I need an Atlas, the game itself does that via self.ASSET_ATLAS, but when I try to access that in my lua file G.ASSET_ATLAS is nil (sendDebugMessage(tostring(G.ASSET_ATLAS)) returns and prints nil) How would I access this properly?
when is your code running?
Also I'm thinking you might just be able to store your atlas from when you create it and then set it
Uhh I'm not sure I guess, its just in a folder at %appdata%\Balatro\Mods\MyMod
Uhh those are .toml files right? No this is a .lua file
This is the line from game.lua:
self.shared_soul = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], self.P_CENTERS.soul.pos)
Doing this no longer crashes but I still am not modifying the shared_soul
local soulAtlas = SMODS.Atlas {
key = "soul",
path = "c_soul_extra.png",
px = 71,
py = 95
}
G.shared_soul = Sprite(0, 0, G.CARD_W, G.CARD_H, soulAtlas, { x = 0, y = 0 } )
that should modify the soul
Yeah, it should be red if it worked, but still the default
also I think x= 0, y = 0 won';t work
just checked and G.ASSET_ATLAS does exist, at least at the title screen
actually
I wonder if the shared soul is being loaded after your mod
Thats my only thought at this point, is there a way to make it load later?
you could hook or patch some function that is only called later
Would that look like this (taken from Aura)
local upd = Game.update
function Game:update(dt)
upd(self, dt)
-- their code
end
so quick question, this code below executes several times at the end of round and i dont know why.
if context.end_of_round and not context.game_over and not context.repetition and G.GAME.blind.boss and not context.blueprint then
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.2,
func = function()
G.GAME.interest_cap = G.GAME.interest_cap + card.ability.extra.interInc
card_eval_status_text(context.blueprint_card or card, 'extra', nil, nil, nil, {message = "Upgrade!"})
return true end}))
end
like, i see upgrade message pop up several times and the interest cap goes up several times while i only want it to execute once
hmmm
someone else was also having some weird behvaiour with end of round effects too earlier
wonder if there is some kind of bug
yeah, one some of my other jokers i just used a bool to stop it
but i wanted to know if i was doing something wrong
and thats why it was happening
I'm not too familar with why that's happening
Wilson think I could do this
local start = Game.start_up
function Game.start_up
start(self)
local soulAtlas = --my code here
end
What's the dif between P_CENTER_POOLS and P_CENTERS?
Ok went through my patch conflicts. Ignored the talisman ones cause I didn't want to read talisman patches and figure out who was touching random numbers
This is telling me that its expecting a ( near start, there is tho
I just deleted 250mb worth of lovely logs
function Game.start_up()
Thats a lot of logs
oh ffs, thank you
Hmm, now I'm getting startup yelling about a self being nil...
Its not getting its args properly
Fixed the nil self (it was because I had () on the local variable) However, its still not working, but I know why! its not running my startup function, or at least my debug statement isn't getting printed
local start = Game.start_up
function Game.start_up(self)
start(self)
local soulAtlas = SMODS.Atlas {
key = "soul",
path = "c_soul_extra.png",
px = 71,
py = 95
}
G.shared_soul = Sprite(0, 0, G.CARD_W, G.CARD_H, soulAtlas, { x = 0, y = 0 } )
sendDebugMessage("In startup")
end
sendDebugMessage("Not in startup")
``` Not sure why its not running my startup function
ok im gonna FOCUS now.
sidabling cryptid.. its getting serios
oh this is all fps based....
some stuff is working, others not... oopsies
anyone know how to get the name of a highlighted joker?
I had something a while back I'll see if I can find it
Whats the keybind to restart with SMODS?
hold m
Ah, I tried ctrl + r, holding ctrl r, and the same for just R
ok, things are bouncy, but something is wrong with anything besides the menus, but only specific menus
Its working!!!
G.localization.descriptions.Joker[card.config.center_key].name
oh wait I messed up edited
G.localization.descriptions[card.config.center.set][card.config.center_key].name also works for more types of cards
trying to hook the consumable usage from the fool and its not working
[[patches]]
[patches.pattern]
target = "functions/misc_functions.lua"
pattern = '''
if card.config.center.set == 'Tarot' or card.config.center.set == 'Planet' then
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = function()
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = function()
G.GAME.last_tarot_planet = card.config.center_key
return true
end
}))
return true
end
}))
'''
position = "after"
payload = '''
else
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = function()
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = function()
G.GAME.yart_last_other = card.config.center_key
return true
end
}))
return true
end
}))
'''
match_indent = true
pattern matches don't work with mutiple lines in the pattern
checking the dump indicates that the patch applied successfully
really?
yup
lovely patches are so awesome!
hallucination but bigger
what is bro doing 😭
also pro tip shift + /
yea but it feels like im a steriotypicle hacke
Is shift + / supposed to do something?
party!!!
Very followable gameplay!
add this to the next cryptid patch
hides the console preview
ah
i should figure out what the hell this function does before i do wierd things with it
@gaunt thistle since when?
what is dt
oh
what would the card be in this situation? Im doing this inside a can_use on consume. would it be G.jokers.highlitghted?
¯_(ツ)_/¯
if its an update method its almost certainly delta time, but it could be context specific
you could be doing integrals in balatro who knows
technically? not wrong
dt is always short for deltatime imo
now i have to figure out why my code works on some things but not others
basically the time in-between frames
ik

yay!!!! patches!!!!
(self.role.wh_bond == 'Strong' and (self.velocity.x * 8)) or (self.velocity.x * 2) am i dumb?
isnt that how that works??
am trying to figure out how to make this joker check to see if a enhanced card is played and then ad chips if one is played
Check for card.ability.name ~= "Default Base".
so that is the check for enhanced? but after how do I make it add the chips?
You return chips = card.ability.extra.chips.
and I need to give my joker the ability to give the extra chips?
Define such under the config part, yeah.
would it be chips = 50 for adding 50 chips
Yeah.
awesome
is that ~ or -
~
thanks
ok, after further testing incantation seems to be causing the issue
incantation overrides the same function
also for whatever reason listing the mod conflict in the header doesn't do anything
am getting a weird error saying there is an unexpected symbol near my ending }, but all there is if the 'end' for my function and the comment of the code end
can you show the whole context?
like the section of the code?
yeah
``SMODS.Joker{
key = 'bendWill',
loc_txt = {
name = 'Bend Will',
text = {
'{C:chips}+50{} if a enhanced',
'card is played'
}
},
atlas = 'Jokers',
pos = {x = 0, y = 0},
cost = 2,
blueprint_compat = true,
config = {
extra = {
chips = 50
}
},
calculate = function(self,card,context)
if card.ability.name ~= "Default Base" then
return {
card = card,
chips = card.ability.extra.chips,
message = '+' .. card.ability.extra.chips,
colour = G.C.CHIPS
}
end
}
------------MOD CODE END----------------------``
count your brackets, ,s, and ends carefully, you're probably missing one
missing an end in calculate
where should it be going?
after the return
thank you
and I just tried using it, it was giving chips on discard and when I went to play a hind it crashed with the info of main.lua:1794: functions/state_events.lua:1099: 'for' limit must be a number
you also need to check for the correct context
???
DigitalDetective is right
I suggest you take a look at https://github.com/Steamopollys/Steamodded/wiki and https://github.com/Steamopollys/Steamodded/blob/main/example_mods/Mods/ExampleJokersMod/ModdedVanilla.lua
it should disable your mod
the calculate and context parts are confusing me
this differentiates cards which trigger in different contexts (onyx agate, which triggers during card scoring; vs sly joker, which triggers during joker scoring; vs hallucination, which triggers when a booster pack is opened)
it does not
What table does SMOD put custom deck keys in? I've tried pulling from G.P_CENTERS but it's key isn't there.
heres the mod header btw
--- STEAMODDED HEADER
--- MOD_NAME: Yet Another Reversed Tarot mod
--- MOD_ID: YART
--- MOD_AUTHOR: [DigitalDetective47]
--- MOD_DESCRIPTION: A Balatro mod that adds reversed tarot cards to the game
--- CONFLICTS: [incantation]
--- DISPLAY_NAME: YART
--- BADGE_COLOR: A782D1
--- PREFIX: yart
hmm the example doesn't have a version
yeah exactly
sort of works (have to say >=0.0.0) but it still says it has conflicts even when incantation is disabled
I am just lost on how the coding of it works
reference code for other mods
was trying but it I am struggling to understand how I need to do the calculate and context parts for my joker
huh, weird, the version number does actually seem required
oh the id pattern match is (.-)[<>] (match any character zero or more times, followed by either < or >)
wait that's been broken for 6 months
???
lmao yeah
pc restarted too fast to see which one and I honestly can't be bothered finding the crash log
I've only ever seen the Löve bsod
never had my balatro crash my entire windows before 🙃
am looking at these examples and it is making feel a little lost on what I need to have it check
Removing that does actually crash btw. Has to do something with other mods creating objects. I dunno, didn't look much further into it
calculate can get called hundreds of times in a single scoring hand, for calculating what to do when scoring cards, iterating cards in hand, an end of round effect, etc
context has properties that describe the current calculation context (makes sense, right?), so you'll need to check the context before doing almost anything, see the ExampleJokersMod
so for the case of what I am trying to do, the context would be checking if the card is enhanced?
no, that's not a context
that's not a when
the context you're looking for is probably "on card scored"?
so with the context of on card scored, I then check to see if it was enhanced and it it was then give chips
yeah!
I suggest you look at the walkie talkie example, it should have similar context
Actually, hold on, I might've misinterpreted. Does it give +50 chips every time an enhanced card is scored, or does it give +50 chips if the scoring hand includes an enhanced card?
so for every enhanced card right?
yeah that is played, also have been editing what the text is going to say for the joker
sure
you can read more about that here https://github.com/Steamopollys/Steamodded/wiki/Calculation-Context-Guide
this page is a bit confusing
I know 😩
but what I am guessing is that the context.individual tells to check the stuff of a chard played
that's just how steamodded handles conflicts, for some reason
if the conflicting mod is installed at all, your mod won't load. even if the other mod is disabled
you have to remove the other mod entirely
Huh, you're right. That also feels like something that should probably be fixed 🤔
i feel like a behavior like that has to have been intentional
... but i have no idea what the benefit is lol. i consider it a bug
so far for the effect of the joker I have gotten
calculate = function(self,card,context) if context.individual and context.cardarea == G.play then if context.other_card: end
Quickly checking the source code it says "block load even if the conflict is also blocked", presumably if 2 mods both conflict each other? But it doesn't account for disabled mods at all
so with what I have for the calculate part so far, what do I need to do to check for any edition
...didn't I already mention the check for that? 😛
oh so I do that here
if card.ability.name ~= "Default Base" then
...
end
thank you
this is what I ended up with but an getting an error saying ' '}' expected [to close '{' at line 17 (the line where I started for making this joker)] near calculate
key = 'bendWill',
loc_txt = {
name = 'Bend Will',
text = {
'{C:chips}+#50#{} when a enhanced',
'card scores'
}
},
rarity = 1,
atlas = 'Jokers',
pos = {x = 0, y = 0},
cost = 3,
blueprint_compat = true,
config = {
extra = {
chips = 50
}
},
loc_vars = function(self, info_queue, card)
return {
vars = {card.ability.extra.chips}
}
end
calculate = function(self,card,context)
if context.individual and context.cardarea == G.play then
if card.ability.name ~= "Default Base" then
return{
chips = card.ability.extra.chips,
card = context.other_card
}
end
end
end
}```
more sprites :3
so Im attempting to get into modding and to test my jokers out Id like to make a custom challenge and put them in there
How do I add a custom challenge to my mod?
well there is a debug mod that allows you to give yourself the joker to test
hm
I do want to check that out but Im also planning on making custom challenges in the future
ok
Do you know how to implement custom challenges?
I personlly don't, but there are some awesome peeps in here that will be able to help
🤝 Windows Classic theme.
trying to make a gradient color the way cryptid does it, but it's crashing here and i can't understand why
the error log says it's crashing because "Tsunami" is a nil value
the red underline and error warning are also there in cryptid's code for this, but it doesn't crash for cryptid and it makes no sense to me
i would've posted in their server abt this but i didn't know where to put it
...Cryptid is a global that's set by MODID, no?
but my mod ID is tsunami, so why doesn't this work for me
oh god is it case sensitive
no the ID on mine is capitalised
Cryptid initializes its global with Cryptid = {} beforehand
oh is it that easy
i did try searching for the word cryptid in the files and then i realised
that's gonna be really slow to look through
oh my god it was that easy
well it's not crashing? but the color isn't working
progress i suppose
i'm guessing i did another thing wrong but i don't know what
the update loop is working it's just not updating the colors?
well i don't really know what it's doing to the color it's just making it look like that
tsun is my mod prefix
holy shit wait hang on
it's doing something
it's
the wrong color but I figured it out
it's just going through all the colors
the colors I put in at the start don't matter
yippee
purdy
Hello, I try to learn modding on Balatro. How you test cards, an easy way exist for spawn joker, taro, playing card... like a console ? What is our workflow for test ?
I use https://github.com/xioxin/BalatroMods/blob/main/Mods/UltraHand.lua to spawn Jokers, tarot cards and so on.
DebugPlus is just this but better
¯_(ツ)_/¯
also looks like this one only works for jokers and consumables, you cant do anything with any other object you're working on
