#💻・modding-dev
1 messages · Page 362 of 1
that's what happens when you modify the center
so, what you can do is change it to the defaults when a run ends
maybe i can set it to default when its sold
also how should i do this one
how do i detect when a run ends or when a new run is started
I think I'm getting a hand of this "shader" thing :333 hehehe
lava jokers
(this was all made by editing negative, but still, lol)
awww, they removed the coolest part of it from the picture, lol
SMODS.GameObject is not a center and SMODS.Center is?
it's transparent :3
dude

🤔 so SMODS.Center allows more objects to be made under that type, while SMODS.GameObject is just a literal object?
-# does that even make sense
and i still
cant get this freaking badge done
ghhhh
Is there a way to sort jokers by if they give chips, mult or xmult?
SMODS.Center is a SMODS.GameObject but SMODS.GameObject is not a SMODS.Center
no. This is not a simple problem. I kinda was working on it (plus a few more properties) but it's stale
like - what is this??? ðŸ˜
i thought changing rarity would work
but it doesnt work at all
Does anybody have a premade list of every vanilla joker but in order of chips, mult, xmult?
and i tried looking everywhere for a place that documents how to change that badge, couldnt find one either
GameObject does this stuff
https://github.com/Steamodded/smods/blob/main/src/game_object.lua#L9-L274
Center does this stuff
https://github.com/Steamodded/smods/blob/main/src/game_object.lua#L1016-L1098
Is this a custom consumable?
its a uhh center
How did you define it?
I imagine that that is the same as the consumable type
try setting a name in your localization
idk
what is this?
localization
whats the problem?
no the type of the thing
they are making a custom center and theres a localization issue
ahh
decscriptions
Hi all, good evening, me once again
Would anyone be able to tell me whether Lovely can be used to change Smodded's own files? In the same patch patterning you'd use for Balatro's code
is where the rest of the center are
yes
=[SMODS _ "file"] as the target
you can patch p much all files, actually, even files from other mods
Oh so I'd use this instead:?
if you want more help for finding patrch names, you can add --dump-all to the command line flags and the lovely log will show all buffer names
still in the string, and a = at the beginning
'=[SMODS _ "src/game_object.lua"]'
Sorry, that makes more sense
Thank you all! I'll give it a shot
yeaaah idk, im not sure if thats even the place the badge is supposed to read from
try putting name under just YggMaterial
like this, right?
Try it and see
Sorry... I must be missing something
The patch snippet works if I paste it directly inside game_object.lua, but isn't working as a .toml inside my own mod
But it should work with this pattern, right?
You need the =
Gah, my bad
I missed that twice
All working now
But this is clear indication I should go sleep
Thank you all for the help
adding name crashes
i was uncertain that its actually because of the name so did a bit of testing just to be sure
though, the fact that it crashes does mean something is reading it 🤔
is that a rarity?
it doesnt crash when this is a table, but doesnt really do anything to the badge so i guess this is not what i need
hm
actually cant u modify set_card_type_badge in the material declaration
but also it should take k_YggMaterial as the badge key if you don't change it
i couldnt find a badge being added by default
cardsleeves uses extend on centers to do them, but it doesnt seem to get a badge added
‎
But I had a joker that did the same thing but it was manual and it was in an event and it worked fine?
this looks like its directly during scoring steps so it's a lot more wack
yeah dunmo, mine is just added there, for some reason
i tried this one, didnt seem to do anything actually, so i guess i will use that function and hope for the best
made another shader here, seems to not like gradients for some reason tho, lmao
what is it about gluttonous joker that makes him an outlyier in every shader I try to make, lmao
You are just a shader machine huh
if i have a .lua file that contains SMODS.Atlas for every atlas, are they global for any other .lua files to read in the folder?
Yes.
SMODS things are global across all mods I think.
alr cool
I think I fixed this by sorting the effects table by what the jokers return.
not entirely sure if its the best place to ask but i was wondering if its possible to like, make a joker that makes it so cards other than the first played/scored one still count as the first played/scored? i tried looking at stuff like how hanging chad works or pareidolia to see if i could kinda make sense of jokers that have smth to do with "first played card" or making all cards count as something else but i got very lost
that sounds like a cryptid's joker if im not wrong
actually, nvm, they make the hands always count as "last played hand" so not really the same
personally, i think its possible but really hard (you would need to patch other mods' code), since they usually check G.play.cards[1] and you cant really modify that
ohhhhh i see thank u lots and yeah i also was wondering if i was misremembering a cryptid one lol but thanks ^^
What if somehow you sorted that table before the next card scores?
theoretically possible, but its likely that will cause bugs in some code 🤔
Thanks to your comment and this [Joyous Spring](#💻・modding-dev message) snippet, the code works now!
else -- polychrome 2s
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = function()
for i = #G.shop_jokers.cards,1,-1 do
local c = G.shop_jokers:remove_card(G.shop_jokers.cards[i])
c:start_dissolve()
c = nil
end
for i = 1, G.GAME.shop.joker_max - #G.shop_jokers.cards do
-- local new_shop_card = create_card_for_shop(G.shop_jokers)
-- local new_shop_card = SMODS.create_card({
-- key = 'c_base',
-- area = G.shop_jokers
-- })
local new_shop_card = create_playing_card({
front = pseudorandom_element({G.P_CARDS.S_2,G.P_CARDS.H_2,G.P_CARDS.D_2,G.P_CARDS.C_2},pseudorandom('zohnathan')),
center = G.P_CENTERS.c_base
}, G.shop_jokers, true, true, nil, true)
SMODS.change_base(new_shop_card, nil, '2')
new_shop_card:set_edition('e_polychrome')
new_shop_card.cost = 2
create_shop_card_ui(new_shop_card, 'Joker', G.shop_jokers)
new_shop_card.states.visible = false
G.shop_jokers:emplace(new_shop_card)
new_shop_card:start_materialize()
-- new_shop_card:juice_up()
end
return true
end
}))
end
Will upload video in a bit, once OBS loads.
...Almost. It's adding to the deck twice, it seems?
gay lv 1
Hm... something weird is happening specifically in the shop, where the cards show up multiple times in the deck view.
During blinds they show up with the appropriate numberr of copies
create_playing_card already adds a copy of the card to the G.playing_cards global
buying it adds another copy
use SMODS.create_card instead, with type = "Base"
Ah, the table.insert(G.playing_cards, card) line
Mkay
Running the following code gave the pictured result.
for i = 1, G.GAME.shop.joker_max - #G.shop_jokers.cards do
-- local new_shop_card = create_card_for_shop(G.shop_jokers)
local new_shop_card = SMODS.create_card({
key = 'c_base'
})
-- local new_shop_card = create_playing_card({
-- front = pseudorandom_element({G.P_CARDS.S_2,G.P_CARDS.H_2,G.P_CARDS.D_2,G.P_CARDS.C_2},pseudorandom('zohnathan')),
-- center = G.P_CENTERS.c_base
-- }, G.shop_jokers, true, true, nil, true)
SMODS.change_base(new_shop_card, nil, '2')
new_shop_card:set_edition('e_polychrome')
new_shop_card.cost = 2
create_shop_card_ui(new_shop_card, 'Joker', G.shop_jokers)
new_shop_card.states.visible = false
G.shop_jokers:emplace(new_shop_card)
new_shop_card:start_materialize()
-- new_shop_card:juice_up()
end
It didn't add it to the deck, at least.
Using type = "Base" alone causes the following crash.
Reading Balatro's source code for create_card solved the problem, yay
Hm... is there a way to make SMODS.create_card truly random, rather than based on a seed? There's no spot to place pseudorandom(os.time()), like with pseudorandom_element.
Oh wait, could just use SMODS.change_base, figure out where all suits are stored including custom ones, then pass that into the function as a parameter
Gotta install a mod that adds funny bases
Uhhhh
copying from temperance here, will the G.jokers.cards[i].ability.set work fine here?
I mean... if it accepts a numerical seed it also accepts a function that returns a number?
A return is equivalent to an identity
Afaik
SMODS.create_card doesn't have anywhere to accept a numerical seed
It uses string seeds it seems?
I didn't look before
You could go a multistep route
Uh... where does it use a string seed? Perhaps Axy isn't reading the code properly and missed it.
Idk what kay_append's description means. I'm probably the one reading it wrong
Yeah I am
Though I still don't understand it
It isn't what I thought I'm 99% sure
Hm
Can't you just poll everything?
Editions are pollable too
Even though it doesn't say for some reason?
And as for rank and suit, you can do what you said with psudorandon elements
am i missing something here?
im using basically the same code as another joker and it works fine
i keep forgetting how spammy polls are tbh
your loc vars should be returning two values
oh DUH
holy shit
people say mistakes make you human im the most human person in the world
untrue
We only need random suit, the rest should be polychrome and 2, with no other stickers or the like. The original idea had a random choice between Club/Diamond/Heart/Spade, but that won't extend to modded suits. An attempt to run
local potato = pseudorandom_element(SMODS.Suits, pseudorandom(os.time())).card_key
SMODS.change_base(new_shop_card, potato, '2')
``` caused cards with random ranks to appear instead of random suits, somehow.
fals
the most human person is John Humanity
-# why do you use pseudorandom(os.time()), btw?
i see
Dun worry, other cards in the mod are based on a seed since they're more reasonable
couldve just used math.random, but i guess that works too 🤔
...is that loaded into Lua by default or something
It's a very by the books way of getting an advancing seed
mhm
:o
The time thing is I meen
true
So just pseudorandom(math.random()), or?
‎
you need to define something in math.random(a,b), it returns a random whole number from a to b, pretty much the same as pseudorandom(seed,a,b) except its always random
Mhm
but your current approach is honestly fine, too, so theres no need to change it lol
Ouh
-# unless someone finds out a way to manipulate time then idk
xD
he's real
Cheating in mods is not a concern
yeah but its funny to think that someone might go so far as to manipulate time to get the desired outcome :p
Debugplus already exists, lol
Yeah that is funny
Debugplus isn't cheating if you are testing your mod stuff.
yeah ofc, but it can be used as such, not that there's a real competition to cheat in
just like gamesharks were never real cheating
it's 'playing with your toys wrong'
which is valid
you can only really cheat in online games or tourneys
Hmmm...
Doing a two-step process with SMODS.change_base causes the rank and suit to not change. Does it not change the card in-place?
looks up the function
It seems to change it in-place
are you making a card or changing it?
Is there a way to make the func run when it should instead of when it wants to?
Changing it
for i = 1, G.GAME.shop.joker_max - #G.shop_jokers.cards do
-- local new_shop_card = create_card_for_shop(G.shop_jokers)
local new_shop_card = SMODS.create_card({
set = "Base",
no_edition = true,
edition = 'e_polychrome',
bypass_discovery_center = true,
discover = true,
skip_materialize = true
})
-- local new_shop_card = create_playing_card({
-- front = pseudorandom_element({G.P_CARDS.S_2,G.P_CARDS.H_2,G.P_CARDS.D_2,G.P_CARDS.C_2},pseudorandom('zohnathan')),
-- center = G.P_CENTERS.c_base
-- }, G.shop_jokers, true, true, nil, true)
local potato = pseudorandom_element(SMODS.Suits, pseudorandom(os.time())).card_key
sendDebugMessage(tprint({potato, type(potato)}))
SMODS.change_base(new_shop_card, potato, 2)
-- new_shop_card:set_edition('e_polychrome')
new_shop_card.cost = 2
create_shop_card_ui(new_shop_card, 'Joker', G.shop_jokers)
new_shop_card.states.visible = false
G.shop_jokers:emplace(new_shop_card)
new_shop_card:start_materialize(nil, true)
-- new_shop_card:juice_up()
end
Ignore the commented out lines, but the rest of it is the code being executed
is new_shop_card defined?
huh? just putthe the thing in the suit section of create_card?
oh ncm
nvm
it doesn't have one?
wait i think it's because create_card is supposed to be not for plahying cards
there's an undocumented create_playing_card I think
So what Axy was using earlier
But that function emplaces in the deck without a parameter to change that
Unless Axy wanted to patch that function to add a parameter that does so
Heck it, Axy will just call Card() directly and pass in the appropriate parameters
Didn't work, as expected ^^;
‎
i dont think so, since func runs like every frame or something
Would it be necessary to add a mod prefix or something on keys of custom contexts? (in case for mod conflicts)
-# am i wrong ðŸ˜
Then why does the effect and sprite change happen at different times?
depends on whether the context's name is very unique or not
events, i think?
Then how do I make the sprite change happen when it should?
I currently have these six.
i dont have much context here, so i dunno what to say - can you show me the code? 🤔
mmm i would def suggest adding a prefix then
@manic rune
Oh, and this one. I haven't update this one with SMODS.calculate_context.
The code now looks like this:
The big table is just so the order is most efficient.
mmmmmmm
does func run after or before things like return {mult = 5}?
my theory is this, but im not sure 🤔
wait fuck
its sprite, not spirte
iaofmoam
do suits have centers?
if not where is the suit pool stored?
the one that's loaded on boot, not the in-run one
or is there not one at all?
The reason it's only some jokers is because most jokers don't work. (Because there is something wrong with the sprite?)
yes i'm aware this question is "are suits cards" but that wouldn't shock me with balatro
@brisk rose Fixed it! Just needed to use .key instead of .card_key!
ayyy nice
SMODS.Suits?
yeah, because well... the normal suits live there too
smods reimplements them all as SMODS suits
yeeeaah damn, a feature like this is bound to have bugs lol
I get this error with yorick:
newQuad?
huh
love.[] ,methods are actually kinda nice and modders should use them more
random aside
true in some scenarios
we tend to only look up the lus docs when love has really nice docs and is more specialized for well... working with love games
lol
Like what
here's where I het cauhht talking out of my ass
i use love.graphics.draw for unregistered hypercam 2 but most of the time the methods that balala uses are better
ngl I have messed with the love.graphics routines, but as notmario said, in most cases balatro and smods have that covered
but in general there's a lot of stuff there
i don't think you should use them over game methods unless there's a reason, but yes over built in lua functions, if it makes sense to
I mean yeah the graphical interface is the only example I could think of
Does anyone know what may be causing this issue?
Although Balatro and SMODS have hooks for the Love methods so
I imagine any delays are due to Event timing
https://love2d.org/wiki/love.filesystem
Another one is love.filesystem for doing iterative fole loading for mods
seems to provide nice helper functions
and if you want to handle input, i think love functions are the only option besides smods.keybind
What’s the difference between Love and Lua loading files?
there's more options?
like more methods that can tell you shit about your directory
just look at the page, lol
maybe i'm full of shit
very possible
No I don’t think I will
Animation get!
How do I add an image to the config tab?
‎
ur only giving it 5 arguments?
also according to this you can just remove the getDimensions call
oh that's in source code, lol
then idk, getDimensions should never return nothin
seems like the atlas image is missing or borked
The thing I'm confused about is this doesn't happen with most vanilla jokers and modded jokers, I know it's broken with yorick though.
btw how do you even get there, what are you trying to do with yorick? i've scrolled up a bit and tried to understand the context but i'm lost...animated seals?
I was working on the every joker, then I thought of something more effectient(ish).
so it changes joker on every trigger?
this might be a reach but i also experienced a somewhat weird crash when some mod was transforming planets to black holes, while the planet had no floating_sprite but black hole did...feels similar
i think current smods/vanilla don't like it when swapping out centers (with different sprite stuff) in place, but then again i'm not that experienced with this stuff yet
It seems to work fine with trib though 🤔
is it possible to use consumeable_usage_total on a specific card by calling it G.GAME.consumeable_usage_total and G.GAME.consumeable_usage_total.c_neptune or 0 for example?
i seem to always have 0 printed when i use that
No.
so how could i store the number of a specific planet or tarot card used, it is not at all anywhere in the game?
You would have to store it manually I think.
with a hook?
Probably, yes.
okay, thank you !
I know the game tracks Tarots and Planets used
Planet tracking even includes different Planets
But I’m not sure if that includes individual numbers
I’m pretty sure they’re stored somewhere
how do i give the player a joker again if it has enough room?
in base game there's no joker doing that so is a bit tricky for me and my knowledge to find, i think imma do a hook
if (#G.jokers.cards + G.GAME.joker_buffer) < G.jokers.config.card_limit then
SMODS.add_card({set = "Joker"})
end
It's xchips not chips
Also chips_mod doesn't exist either.
Because you’re passing the wrong variables
Because the variables you pass don’t exist
so should i just change it into xchips and elapsed_round?
Yes.
like this?
No.
okay i dont understand anymore
vars = {card.ability.extra.xchips, card.ability.extra.elapsed_round}
Yes.
Yes, you need to change the description to #1# and #2#
Cryptid has a function for that exact purpose.
That is the exact same problem.
i mean the 1st one doesnt work even though it should
Lua is case sensitive.
vars = {card.ability.extra.Xmult, card.ability.extra.odds, G.GAME.probabilities.normal or 1}
they also need G.GAME.probabilities.normal
Yes, but 1 was not a variable.
why or 1?
#2# in #3# instead on 1 in #2#
Collection.
If G.GAME.probabilities.normal isn't a truthy value, the or 1 is used instead.
‎
how do i check the current score so far while calculating joker
hand_chips for chips and mult for mult.
so like G.GAME.hand_chips or something
would you have an idea where they'd be stored? i'm blocked on the hook </3
No, It's just hand_chips and mult
I would have said so elsewise.
are they like global variables
Yes.
oh ic
i want this joker to turn into cavendish after the 1 in 3 chance hits
but this doesnt work
you should probably use card:set_ability
instead of?
SMODS.add_card
this is how i did it in prism for one joker
Instead of removing and adding cards, directly transform the Joker into Cavendish with :set_ability.
{ key = 'j_cavendish' }
imagine cavendish mod tho
where do i put that?
though it would be nice to have two lol
Potassium?
maybe? i havent played it yet :p
SMODS.add_card{ key = 'j_cavendish' }
It's localize('k_nope_ex')
Also why is extinct backwards?
and how do i make a custom message?
because this user is pretty much cavendish backwards
message = "message"
alright
{n = G.UIT.O, config = { w = 1, h = 1, object = AnimatedSprite(128, 128, 128, 128, G.ANIMATION_ATLAS['toga_TOGAExperiment'], { x = 0, y = 0 }) } },
Huh, that doesn't produce an animated image in the UI...
okay thats a really weird bug, when i have my joker slots full it just doesnt give cavendish and it doesnt clear the slot
so the game thinks theres still cards there even though there arent
It's because your checking for that?
fair
but even if i have multiple it doesnt give any
like if i have 5 it should give 4 cavendish but it doesnt
oh and it just doesnt apply the mult
If your joker slots are full nothing with happen because your checking for it?
well then how do i make it calculate it again
so that if i have 5 of them it gives me 4 because after the first one gets destroyed you have an extra slot
etc etc
like, you have 5
1 gets destroyed, so you have 1 free slot
so then you have room for 1 more, and then 1 gets destroyed again
and you get a free slot
etc
btw right now it replaces the joker with crumbledish, and i want it to keep it
how do i make it give crumbledish but also not get destroyed
I guess the G.UIT.O doesn't accept AnimatedSprite as an object... or it's putting it somewhere I am not expecting?
but how do i make it not replace the card?
AnimatedSprite is definitely an object
but it's extremely wonky
Found... had W and H too large. Can't speed it up, though, can I...
think it's a hardcoded 10fps
G.ANIMATION_FPS is 10, yeah.
‎
It does
Blinds use them
how do i create a new card area? and can i make it so that only certain type of cards go there?
Any card can go to any card area
consumables cant go in joker area can they?
they can
not normally but with mods yes
i c
hell, you can insert any "card" in there afaik
i suppose you define the area a card goes to upon creating?
yes
okay back to original question, how do i create another area
#1343670935122870342 check their code :3
tysm <3
its in the zodiac patch
but how do i make this not replace my joker?
right now it replaces it with cavendish, i just want it to add cavendish
would but it's too long
its fine
this is the best i could do
remove these
how do i make it so it sends the top message when it succeeds the 1 in 3 chance and has room for another joker, and the bottom one if it doesnt hit the chance or you dont have any space
oh also, how do i make a tarot card that creates one of the few select jokers?
like, in a pool
i don't know how to create a pool or if that's even a thing ngl
make a string and update the value when those conditions happen cause you already check for the 1 in 3 and the no space condition
sorry what is this
depends on how nice you want to do it, you could just make an array with all your jokers and pick a random number and take that index if you want a quick & easy way to do it
ooo gotcha ty
remember to credit victin btw
ofc

what should i put instead of card.ability?
SMOS.has_enhancement(card, "m_key")
ok, but what about 'card.ability.mult = '? what do i change there?
'cause right now, the function only changes the value on tarots and not cards
idk what you're trying to do
well, this is a function to change edition values that i want to slap enhancements into
‎
how do i make it so it does -15 mult but for example if i have 8 mult it just does -8 instead
so that it doesnt break
mult = math.max(card.ability.extra.mult, -mult)
maybe
you want me to replace card.ability.mult and others with it, right
that was for cebee, idk how to solve your thing
i would take_ownership instead
i see
oh wait i uh.. fixed the bug i had earlier somehow
could you explain that a bit further?
or could i just set mult to 1 if its less than 1?
it gets the maximum between -15 and negative the current mult and subtracts that
so if -mult > -15 (like -8 > -15) then it uses that
math
but like, where would i put that?
in the return
like this?
i went into mult debt 😔
well it works, right now it just stops the others from activating, is it possible to make them still activate but just give 0 mult?
dont you go into debt cause mult is never defined here? you'd need to get the mult from the score but idk how to do that
like the mult variable in math.max
you need to add the message yourself then because smods automatically removes it if it's 0
how do i do that?
oh wait i didnt read haha mb
you can either check if the mult you're going to give is 0 and use message in the return or use mult_mod instead of mult and add the message yourself like vanilla does
Is this fixable?
which is easier?
wait, how do i check mult again?
it's not this haha
is it literally just mult?
nope
what is it then?
You mean current mult score?
change the message to the same thing as the mult_mod
you also need to localize it if you want the mult text
like just this?
no
oh, how do i do that again?
the same thing after the =
i dont remember, check how vanilla does it
something something localize{type='variable'...
honestly i have no idea where to look
card.lua?
message = localize{type = 'variable', key = 'a_mult', vars = { ... } }
the number
so like this?
yes, you're missing a } there tho
Is there a pattern between these jokers that I'm not seeing?:
are you positive its only these jokers consistently?
change "a_mult" for "a_mult_minus"
No, there is probably more, but those are just the ones I've got right now.
But yes, these always crash when their sprite is supposed to show.
and you might need -(math.max...) too
yeah it does say --3 mult now
how are you getting the sprites?
hiya! how can i cap the score to the blind requirement - 1?
look at cryptids code
i have
the tax blind
this is terrible advice
it uses its own thing
fuck
~~i mean you can just use that and make your mod have cryptid as a requirement ~~
not even
how do i make it not say --3 mult now?
my Joker needs to cap the score to the requirement - 1 if the hand isn't the final hand
do what i said in the message you're replying to lol
so just message = localize{type = 'variable', key = 'a_mult_minus', vars = { (math.max(card.ability.extra.mult, -mult + 1)) - (math.max)} ?
oh okay
i wanted to make a new sound for -mult and -xmult, how do i make it not play the original sound and play the other version instead?
sound = "sound key" iirc
enhancement_gate = 'm_lucky' is this supported for SMODS currently to prevent a joker from spawning unless an enhancement is present?
in SMODS.Joker
it should work afaik
.enhancement_gate is a vanilla thing, so, should work with its' or modded enhancements.
gotchha ty guys
why doesnt this work?
you forgot your mod prefix
it might need the mods prefix
how do i put evolution on the left side
wide
can anyone help with this problem? it doesnt look like a mod is causing this problem. also can someone tell me what mod uses the "secret rare" shader
yeah i really have no idea why it doesnt work, it should
align = "cl"?
didnt work
but how do i make it not crash when it attempts to play the sound?
oh its fickel fox
where does the key live on a created card object?
apparently fickel fox is calling a variable that doesnt exist
or actually better yet, where does a created card objet's Sprite object live in relation to it?
like I presume there's a ref to the Sprite object on the card object, what is it?
what's the code
SMODS.current_mod.config_tab = function()
return {
n = G.UIT.ROOT,
config = {align = "cl", padding = 0.0, emboss = 0.05, r = 0.1, colour = G.C.BLACK},
nodes = {
{
n = G.UIT.R,
config = {align = "cm", minh = 1},
nodes = {
{
n = G.UIT.T,
config = {text = localize("k_csmr_config_restart"), colour = G.C.RED, scale = 0.5}
}
}
},
{
n = G.UIT.R,
nodes = {
{
n = G.UIT.C,
nodes = {
create_toggle {
label = localize("k_csmr_config_evolution"),
ref_table = config,
ref_value = "evolution_enabled"
},
}
},
}
}
}
}
end
?
i just copied the code i used last time to play a sound but it doesnt work anymore, could anyone help?
I mean the sprite that draws itself and can use methods from engine/Sprite. That one doesn't seem to be it, I tried it
try adding it to the row node
i keep getting this error
like so?
yeah does it work
Do you have a losemult.ogg in your assets/sounds? What about the modprefix?
haha
i think if its just one toggle it defaults to right of screen?
seems weird
last time i didnt need the modprefix, and yeah, i do
and i did try this, but that didnt work either
no idea i just tweak everything until it works, ui is still sorcery to me
very valid tbh, i think ill leave it like this for now
tysm anyway <3
also do you prefer N' or nh6574 for credit?
no need for credit lol but both are fine
nah youve helped a ton on other stuff too
honestly no idea if this is even the correct way to put in the prefix
sound = 'mod_sfxname'

still doesnt work
sound =
oops
forgot the equal sign silly goose
i do be a silly goose at times
how would i make the game treat a card as if it was the first scored card without changing the visible order?
i had to patch for that
You may be able to get away with swapping the order of elements in the scoring_hand array?
But maybe not
i mean the use case for me was making every card count as first scored so
that's what i'm trying to do too lol
does that file actually exist
yeah
cause this seems like an issue of the file not having the same name as the one specified or not existing
it should exist
whats the exact filename
finally getting somewhere fixing the eiditon renderer in the card exporter
i made this function and then patched chad and photo to use this function
what are you making?
losexmult.ogg
idk
oh uh, oops
IT's elbe's code code originally, and strmnn is the one actually doing the refactoring project, but I thought I'd try to fo this part
theyre .wav files
lol
It's existed for a while, just doesn't work with current smods, strmnn got it working, but this edition rendering being ass is something it's had all along
This is how it used to look (Website is for a very old version of my modpack)
lemme output everything including mod stuff for a better comparison
for the new one
i have a joker that's changing card ranks in context.before, but they're still scoring chips for their old ranks, is there a way to fix this or should i just move it to context.after?
What’s that
why doesnt this work anymore? it should trigger but it doesnt
You need to change the ranks outside of an Event
ah yeah
ugh thats gonna screw up the animation
a solution could be to just set base.id i guess??
and then set the whole thing in the animation
elbe's card exporter, https://gaycoonie.github.io/Coonies-Mod-Pack/ you can see what it can do on the website for a really old version of my modpack
strmnn is refactoring it because well... it didn't work anymore anyway
but the edition shit has always been broken
and I'm trying to fix it
black shadows are on black text.. eww
Yes you need to do something like Midas Mask
Oh it's nice to see elbe's list being updated
it's... slightly better than it was
I'm planning to make a joker which have a similar effect to the Smeared Joker(treating two or more suits as the same suit). Is this possible without messing with the is_suit function or it's inevitable to be hardcoded into the function?
local function output_rendered_image(card)
local file_path = output_root .. "images/" .. card.config.center.key:gsub("?", "_") .. ".png"
local w = 71 * G.SETTINGS.GRAPHICS.texture_scaling
local h = 95 * G.SETTINGS.GRAPHICS.texture_scaling
local canvas = love.graphics.newCanvas(w, h, { type = '2d', readable = true })
love.graphics.push()
local oldCanvas = love.graphics.getCanvas()
love.graphics.setCanvas(canvas)
local shader = love.graphics.setShader()
if card.edition and card.edition.type and G.SHADERS[card.edition.type] then
shader = G.SHADERS[card.edition.type]
else
if card.edition then
local edition_key = card.edition.key
if edition_key and SMODS.Centers[edition_key] and G.SHADERS[SMODS.Centers[edition_key].shader] then
shader = G.SHADERS[SMODS.Centers[edition_key].shader]
end
end
end
local exportsprite = card.children.center
if shader then
exportsprite.ARGS.send_to_shader = exportsprite.ARGS.send_to_shader or {}
local _draw_major = exportsprite.role.draw_major or exportsprite
exportsprite.ARGS.prep_shader = exportsprite.ARGS.prep_shader or {}
exportsprite.ARGS.prep_shader.cursor_pos = exportsprite.ARGS.prep_shader.cursor_pos or {}
exportsprite.ARGS.prep_shader.cursor_pos[1] = _draw_major.tilt_var and _draw_major.tilt_var.mx*G.CANV_SCALE or G.CONTROLLER.cursor_position.x*G.CANV_SCALE
exportsprite.ARGS.prep_shader.cursor_pos[2] = _draw_major.tilt_var and _draw_major.tilt_var.my*G.CANV_SCALE or G.CONTROLLER.cursor_position.y*G.CANV_SCALE
shader:send('screen_scale', G.TILESCALE*G.TILESIZE*(_draw_major.mouse_damping or 1)*G.CANV_SCALE)
shader:send('hovering',((_shadow_height and not tilt_shadow) or _no_tilt) and 0 or (_draw_major.hover_tilt or 0)*(tilt_shadow or 1))
shader:send("dissolve",math.abs(_draw_major.dissolve or 0))
shader:send("time",123.33412*(_draw_major.ID/1.14212 or 12.5123152)%3000)
shader:send("texture_details",exportsprite:get_pos_pixel())
shader:send("image_details",exportsprite:get_image_dims())
shader:send("burn_colour_1",_draw_major.dissolve_colours and _draw_major.dissolve_colours[1] or G.C.CLEAR)
shader:send("burn_colour_2",_draw_major.dissolve_colours and _draw_major.dissolve_colours[2] or G.C.CLEAR)
shader:send("shadow",(not not _shadow_height))
end
love.graphics.setShader(shader)
love.graphics.draw(
card.children.center.atlas.image,
card.children.center.sprite,
0,0,0,2,2
)
love.graphics.setCanvas(oldCanvas)
shader = love.graphics.setShader()
love.graphics.setShader()
love.graphics.pop()
if love.filesystem.getInfo(file_path) then
love.filesystem.remove(file_path)
end
canvas:newImageData():encode('png', file_path)
end
return output_rendered_image
here's the current code for this part of it. I'm the one who added all the shader:send stuff, which is what finally helped, after all night of nothing making an appreciable difference
if shader then
exportsprite.ARGS.send_to_shader = exportsprite.ARGS.send_to_shader or {}
local _draw_major = exportsprite.role.draw_major or exportsprite
exportsprite.ARGS.prep_shader = exportsprite.ARGS.prep_shader or {}
exportsprite.ARGS.prep_shader.cursor_pos = exportsprite.ARGS.prep_shader.cursor_pos or {}
exportsprite.ARGS.prep_shader.cursor_pos[1] = _draw_major.tilt_var and _draw_major.tilt_var.mx*G.CANV_SCALE or G.CONTROLLER.cursor_position.x*G.CANV_SCALE
exportsprite.ARGS.prep_shader.cursor_pos[2] = _draw_major.tilt_var and _draw_major.tilt_var.my*G.CANV_SCALE or G.CONTROLLER.cursor_position.y*G.CANV_SCALE
shader:send('screen_scale', G.TILESCALE*G.TILESIZE*(_draw_major.mouse_damping or 1)*G.CANV_SCALE)
shader:send('hovering',((_shadow_height and not tilt_shadow) or _no_tilt) and 0 or (_draw_major.hover_tilt or 0)*(tilt_shadow or 1))
shader:send("dissolve",math.abs(_draw_major.dissolve or 0))
shader:send("time",123.33412*(_draw_major.ID/1.14212 or 12.5123152)%3000)
shader:send("texture_details",exportsprite:get_pos_pixel())
shader:send("image_details",exportsprite:get_image_dims())
shader:send("burn_colour_1",_draw_major.dissolve_colours and _draw_major.dissolve_colours[1] or G.C.CLEAR)
shader:send("burn_colour_2",_draw_major.dissolve_colours and _draw_major.dissolve_colours[2] or G.C.CLEAR)
shader:send("shadow",(not not _shadow_height))
end```
This whole block is all ~~stoled from the balatro source code by~~ me
You need to hook or patch Card.is_suit
does doing that make my mod conflicts with other mods?
this joker just doesnt trigger anymore, how do i fix that?
all i did was add the sound
ayyy, that halped a lot
idk what's wrong with negative though
If you do it right, no
Maybe it’s only applying one shader
local function output_rendered_image(card)
local file_path = output_root .. "images/" .. card.config.center.key:gsub("?", "_") .. ".png"
local w = 71 * G.SETTINGS.GRAPHICS.texture_scaling
local h = 95 * G.SETTINGS.GRAPHICS.texture_scaling
local canvas = love.graphics.newCanvas(w, h, { type = '2d', readable = true })
love.graphics.push()
local oldCanvas = love.graphics.getCanvas()
love.graphics.setCanvas(canvas)
oldshader = love.graphics.getShader()
love.graphics.draw(
card.children.center.atlas.image,
card.children.center.sprite,
0,0,0,2,2
)
local shader = love.graphics.setShader()
if card.edition and card.edition.type and G.SHADERS[card.edition.type] then
shader = G.SHADERS[card.edition.type]
else
if card.edition then
local edition_key = card.edition.key
if edition_key and SMODS.Centers[edition_key] and G.SHADERS[SMODS.Centers[edition_key].shader] then
shader = G.SHADERS[SMODS.Centers[edition_key].shader]
end
end
end
local exportsprite = card.children.center
if shader then
exportsprite.ARGS.send_to_shader = exportsprite.ARGS.send_to_shader or {}
local _draw_major = exportsprite.role.draw_major or exportsprite
exportsprite.ARGS.prep_shader = exportsprite.ARGS.prep_shader or {}
exportsprite.ARGS.prep_shader.cursor_pos = exportsprite.ARGS.prep_shader.cursor_pos or {}
exportsprite.ARGS.prep_shader.cursor_pos[1] = _draw_major.tilt_var and _draw_major.tilt_var.mx*G.CANV_SCALE or G.CONTROLLER.cursor_position.x*G.CANV_SCALE
exportsprite.ARGS.prep_shader.cursor_pos[2] = _draw_major.tilt_var and _draw_major.tilt_var.my*G.CANV_SCALE or G.CONTROLLER.cursor_position.y*G.CANV_SCALE
shader:send('screen_scale', G.TILESCALE*G.TILESIZE*(_draw_major.mouse_damping or 1)*G.CANV_SCALE)
shader:send('hovering',((_shadow_height and not tilt_shadow) or _no_tilt) and 0 or (_draw_major.hover_tilt or 0)*(tilt_shadow or 1))
shader:send("dissolve",math.abs(_draw_major.dissolve or 0))
shader:send("time",123.33412*(_draw_major.ID/1.14212 or 12.5123152)%3000)
shader:send("texture_details",exportsprite:get_pos_pixel())
shader:send("image_details",exportsprite:get_image_dims())
shader:send("burn_colour_1",_draw_major.dissolve_colours and _draw_major.dissolve_colours[1] or G.C.CLEAR)
shader:send("burn_colour_2",_draw_major.dissolve_colours and _draw_major.dissolve_colours[2] or G.C.CLEAR)
shader:send("shadow",(not not _shadow_height))
end
love.graphics.setShader(shader)
love.graphics.draw(
card.children.center.atlas.image,
card.children.center.sprite,
0,0,0,2,2
)
love.graphics.setCanvas(oldCanvas)
love.graphics.setShader(oldshader)
shader = love.graphics.setShader()
love.graphics.setShader()
love.graphics.pop()
if love.filesystem.getInfo(file_path) then
love.filesystem.remove(file_path)
end
canvas:newImageData():encode('png', file_path)
end
return output_rendered_image
updated code
oh shit you're right
I don't even know how to make it do multipple for one edition, like I get how I'd do it, but not where they're stored
negative is a special case I guess
does anyone know why this doesnt trigger anymore? all i did was add the sound
lemme look how all the mod editions look now
the shine shader wouldn't make much difference I don think
nevermind it works now
I know how to add the shine, not why it's defaulting to just the shine though
(it's just another shader change and love.graphics.draw call)
AFAIK the game always applies at least 2 shaders
is that defaulting to just the shine?
It’s just that you don’t care about the other shader
I think that’s what stops it from looking like blackface but maybe it’s built into Negative
it looks like its just not applying negative properly to me
I don't recall the shine doing any colour changing stuff
about half editions are making a lot of progress
is there a better way to do this? it works now but it doesnt play the sound
here's the rest
and it doesnt give an error, it just doesnt play
Oh I had something similar to gold rare
well i have no clue how close that is to how it actually looks
Also I think Dichrome might be incorrect to how Paperback has it
so a few questions
- the wiki isnt really clear on this, but what do i put in the
loc_txtparameter if i have localization files? - do i need to have a different
returnfor each object in the localization file or can i group it all into one?
They put a shine shader on top
unfortunately there's no way I know to programatically grab all the shaders used, in which order, and with what sent to the shader
this might be as good as it gets, which is a hell of a lot better than it was
which is this (older mods shown)
You can leave loc_txt empty
And only one return ever makes sense
hey @zealous glen sorry for the tag but something from your mod is crashing my game
context: i changed the global variable for alpha version to see the extra card area
and then deleted the mod after
but now everytime i try to start a run
i get this crash
Can you send a screenshot
by leaving it empty should it just look like loc_txt,
or loc_txt =,
Neither
Just don’t put it
Oh jeez I've been wondering about the same thing!!!
CAN ANYONE HELP WITH THIS PLEASE??
wait
ah ok
i figured out the problem
it was because it was an old run
that existed before the mod was deleted
sorry for the tag victin
great mod and art btw
🥺 thank you
how do i check if played hand is a winning hand (the one that ends the blind)
What are you trying to do
upgrade the winning hand
if you end the blind with a pair, the pair gets upgraded and so on
You can do that after the hand scores
Just refer to the variable used by Blue Seal
At an end of round timing
aight, thanks
do i even need 2 of these for 2 sounds?
i tried to add them together but that wouldnt work
for some reason the sound in one of my jokers wont play but the other will
(negativexmult.ogg wont play)
does this look good (its on gdocs which is why it looks like that)
wait, realized what doesnt look right, fixed that
can anyone help me?
Sorry I haven’t modded sounds into the game
Text should be a table
yeah i fixed that part
can you take a screenshot of your sounds folder rq
just the folder with the .ogg files
a patch seems kinda excessive for something that can be implemented in 8 lines ngl
damn
could you send the code for the joker thats supposed to play the negativexmult sound (sorry if this is a bit excessive i just wanna see what might be going wrong)
it looks like you're calling for the key of bananalatro_negativemult. first thing is you're calling negativemult and not negativexmult, second is wouldnt you need to have the prefix in the original key for the sound to read it properly (or am i just wrong abt that part)
yeah i tried that as a test, but having it as bananalatro_negativexmult doesnt do anything either
...how do I bring these closer to the edge...
have you played the .ogg file on its own in your computer to make sure it actually has sound
yep
maybe try calling for just negativexmult?
still nothing
damn
actually just out of curiosity, whats with the three dots in the first function and why isnt it in the second
yeah i did remove that, doesnt do anything
ah
just indicates that there's whitespace there
and.. now the other one doesnt work either
probably just gonna leave the sounds for now
what am i missing? this destroys the card but leaves behind like a phantom card that does nothing but take up space
im pretty sure blinds dont have a calculate function
they do
they do???
i didnt know blinds had a calculate function, wiki doesnt mention it on the smods.blind page
should work then i think
it's pretty new
it's a relatively new function
ah ok, good to know at least
if an atlas doesnt have multiple rows, do i still need to include y = 0 in the pos =
is there a context for when a joker triggers? not like what baseball card does, specifically when a joker triggers
curious about this too but gonna piggyback it
is there a way to have the context of specific jokers triggering? (like say i wanted a joker to have an effect trigger off of +mult jokers triggering)
can someone check if blind calc is bugged ðŸ˜
You Are An Idiot:
+3 Chips, Create a Negative Copy of this Joker at end of round
idea that @woven stratus had that i really like
i will say all copies should sell for $0
but this is really good with abstract joker bc it blows up exponentially
All copies sell for 1 chip
lol
1 -> 2 -> 4 -> 8 -> 16 -> 32 -> ... -> 2^n
Is it really
3 mult and 3 chips
It's like an planet hand level up, slightly worse tho
you have one joker
then two
then four
then eight
then sixteen
etc
Oh it's like that, ok then
update smods
hiya! still trying to get these two Jokers to work -w-
The Apparition retriggers all played and unscored cards, whereas Will-o'-the-wisp gives the XMult of Ghost cards when they're played and unscored
they currently don't do anything
does anyone know why?
Do you have the unscored cardarea feature enabled? Afaik it's something that must be manually enabled but I don't remember how
mhmhm
SMODS.current_mod.optional_features = { cardareas = { unscored = true } }
other things that use unscoring cards, like Knowledge of the College and Silver Deck, work
am i stupid why is my talisman patch not working
made a joker making my mod suits also treated as vanilla suits, and the first thing it does is making my mod-suit-only deck be able to get debuffed by a vanilla boss.
g r e a t
hmm weird. so this works:
if context.individual and context.cardarea == "unscored" and context.other_card:get_id() == 14 then
return { xmult = card.ability.extra.given_xmult }
end```
but not this:
if context.repetition and context.cardarea == "unscored" then
return {
message = localize("k_again_ex"),
repetitions = 1
}
end```
or this:
if context.individual and context.cardarea == "unscored" and context.other_card.ability.name == "Ghost Card" then
return { xmult = context.other_card.ability.config.h_x_mult }
end```
i know there's a way to alter the game's music, but is there a way to change the music for only one specific stake? like rn i'm using SMODS.Sound but is there a way i could register that only when using a custom stake?
still isnt working with both of those changes
ive tried messing with the priority but neither -1 or 1 seem to change anything
Don't forget to call your mom's or say thanks to your wive's today!
oh. oh talisman just adds all of talisman.lua into main.lua
i see
why the fuck does it do that
Can someone help me find out why so many jimbos are appearing in the shop?
let me send the releveant code instead of all of it
1s
how do i make this so that 2's and 10's both work as each other? like i have this and they count as the same card for like five of a kinds and stuff but if i try to play a straight that doesn't work
--binary joker functions
function Card:get_id()
-- Check if this card is a Stone card (hidden identity)
if self.config and self.config.center == G.P_CENTERS.m_stone then
return -math.random(100, 1000000)
end
-- Check if the 'Binary Joker' is present
local bin_card = next(SMODS.find_card('j_punch_bin'))
-- If not present, return the normal ID
if not bin_card then
return self.base.id
end
-- If Binary Joker is present, force 2 and 10 to be treated as the same
if self.base.id == 2 or self.base.id == 10 then
return 10 and 2
end
-- Default return
return self.base.id
end
-- Define the Joker with its properties
SMODS.Joker {
key = 'bin',
loc_txt = {
name = '01101010 01101111 01101011 01100101 01110010', -- Binary name
text = {
"{X:punch_code_backg,C:punch_code_text}2s{}{X:punch_code_backg,C:punch_code_text}and{X:punch_code_backg,C:punch_code_text}10s{}{X:punch_code_backg,C:punch_code_text}are{X:punch_code_backg,C:punch_code_text}considered{X:punch_code_backg,C:punch_code_text}the{X:punch_code_backg,C:punch_code_text}same{X:punch_code_backg,C:punch_code_text}rank"
}
},
rarity = 1,
cost = 5,
atlas = 'Jokers',
pos = { x = 3, y = 2 },
blueprint_compat = true
}
idk what I'm doing lmaooo 😠how do I make this shader work w balatro lol
here's the original for refrence
try working off the flipped/ionized shaders in the example smods to get started
bump
does the "prefix" defined in the .json file get automatically applied to any keys made?
bump
omg, messing w shadertoy is so fun, I could spend hours just messing w the numbers on some of these
Now this looks cool. I blended negative with polychrome and then drop the saturation of the channels down to get this cool effect
^ sorry wanted to ask this again
im trying to make a joker that only triggers if no other jokers triggered that round
Yeah post triggers are a thing
or sorry. that hand
how do i make my code not keep spawning Jimbos?
prettyyyyy
ok thanks
is there documentation for that anywhere
ok so now why isnt this patch working
ditto
does anyone know how to access the save folder after installing mods? (I've tried %AppData%/Balatro/Mods)
as in?
Good morning, all
I'm facing a tooltip ERROR, as shown in the image
This is probably a very simple mistake, but would anyone know where I have to set it up to work?
This is to make a unique Rank
Otherwise it works just fine
okay, i'm new to tarot cards, how should i go about making one?
https://github.com/Steamodded/smods/wiki/SMODS.Consumable
Would the consumable object be enough?
Tarot cards fall under SMODS.Consumable under set = 'Tarot',
Does anyone see why this recursively adds thousands of jokers?
apply = function(self)
G.E_MANAGER:add_event(Event({
func = function()
if G.jokers then
-- SMODS.add_card({ key = "j_hiker", edition = "e_Fox_secretRare" })
local jokers = getFoxJokers()
print ("found " .. #jokers)
for index = 1, #jokers, 1 do
local thisJoker = jokers[index]
print ("Adding joker index " .. index .. " who is " .. thisJoker)
local percent = 0.85 + (index - 0.999) / (#jokers - 0.998) * 0.3
delay(0.3)
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = percent,
func = function()
local edition = poll_with_custom_editions()
SMODS.add_card({ key = thisJoker, edition = edition })
end
}))
end
-- for index, thisJoker in ipairs(jokers) do
-- end
return true
end
end,
the function getFoxJokers checks G.P.Centers and gets the list of jokers from my mod. It has 41 members
okay, i have this
how do i make it give a random joker from a select pool of cards?
SMODS.add_card({set = "NameOfYourPool"})
Does it get stuck adding the last joker of the set?
exactly!
https://github.com/Steamodded/smods/wiki/SMODS.Consumable
https://github.com/SDM0/SDM_0-s-Stuff/blob/35e92b86c01961fd04bdb5406dc237f1790a7bc8/data/pools.lua#L24
I have other decks which do start you with two or three jokers around a theme. This one is the grand unlock for unlocking both the legendaries and maxing them out, so it's meant to be a funny victory lap
seems to be an infinite loop
I tried the same logic but I don't know why it doesn't process just a single time
Does anyone know how to give your card custom sticker positions and sizes? like Wee and Square Joker
How would I go about getting something to happen when the blind is selected?
the context for that is context.setting_blind
Maybe use a draw function? Not sure if it lets you move it
I did try that but it didn't seem to do anything when it was inside the calculate function, which I assume is the incorrect place to put it
Can you show your code?
yeah i looked at those, but they barely give me enough explanation
i've never made a tarot card before
I wonder if VanillaRemade has consumables
Just as a tryout, if you set it to break on index 41, does that stop the loop?
Darn it doesn't
would this work?
basically in a SMODS.Consumable object, you can put a function called use(self,card,area,copier) which is called when you press the USE button on a consumable, it works kinda like calculate
alright
It could work with calculate but it's unecessary
Another thing
If you want your consumable to be used under specific conditions, add a can_use(self,card) function
okay
Every useful functions can be found in the API methods of the link I sent you
do i just replace calculate = function(self, card, context) with use(self,card,area,copier)
Yes
me when no work
use = function(self...
Interesting!
@fair frost
so how do i make a pool?
I sent you a link showing one I made for myself
Show me what you've done so far
I'm just trying to get it to output some text just as a test.
Oh you can't return a print
I had it outside the return before and i still got nothing
Try
return {
message = "Blind selected"
}
(I'm not sure if the message has to be a string or a table, try both)
like this?
question here, I find it hard to keep going in and out of game, is there an easy way to simply reset the shaders while in game for quick edits?
Should look like this
cards = {
["j_gros_michel"] = true,
["j_cavendish"] = true,
}
Hmm that didn't do anything, not sure what you mean by putting it in a table
Like message = {"Blind selected"}
okay well this breaks
blue java and red dacca are jokers? If so they're missing the j_modprefix_ at the beginning
yeah i made them
DebugPlus has a keybing to reload Atlases, but I'm not sure if it reloads shaders
Still nothing 
Is the event call getting re-added infinitely? That is so odd
It was! I think the event manager adding the event was retriggering the apply(...if G.jokers catch over and over
still breaks, do i need to put my modprefix here too?
I changed it to not use eventManager and it works fine
Good solution lol
hmm, I'll try this, thanku!
Pools don't require it, how exactly does it break? Do you have a crash log?
I would be surprised if setting_blind didn't work on Seals...
i did check line 237 but thats.. the desciption
I forgot to say before. Turns out it is this, but the whole G.jokers.cards[1].children.center table
wait this is on a seal?
Yup
not sure what you were expecting, cards arent drawn until after the blind has begun
oh
I'm not sure what's wrong with your pool
Ok then I need another way of making something happen when the blind is selected
Test it without your modded jokers
ugh I've been trying to make my own mod and two hours in I can't figure out why my joker isn't working
how do i do that without deleting code?
pretty sure that's not really all that possible, although you can make it happen when it's drawn
which is effectively the same thing
setting blind should work on seals

eremel knows better than i do but im not really sure how that works
isnt the card still in the deck, how would the game calculate it
do i need weights for each item in the pool?
Maybe a work around would be to get it at the round end instead
just turn on deck calc
is that an smods optional feature like joker retrigger and quantum enhancements?
yes
Hi, is it here i can ask for help on balatro modding error?
I mean just remove the modded entries in cards in your pool
Why does this joker do nothing?
Intended affect is adding +1 perma mult to scored 2s, 3s, 4s, and 5s
Does that mean if the card is in the deck, with deck calc off, it can't do anything?
Because that's kind of a problem for my idea
What exactly are you trying to do
For context I'm making an LGBTQ themed mod. Certain seals (Genderfluid in this case) will be changing their gender every round
What's "missing michel" ?
another joker in the mod
Show your pool code
I told you to remove the modded entries from cards
Just keep gros michel and cavendish for now
i see
@dull sage go to your mod's main lua file and add SMODS.current_mod.optional_features = {cardareas = {deck = true}} to the top
actually let me make it more readable
SMODS.current_mod.optional_features ={
cardareas = {
deck = true
}
}
what should i try now? it still doesnt work..
Copy paste the whole crash log with just gros michel and cavendish
Added it but I'm still getting nothing... maybe this just isn't possible?
Not exactly, the card isnt currently shown so it cant really have events associated to it but you can affect it
I changed the message to a print to see it in the console instead but still nothing
Try this instead
cards = {},
inject = function(self)
SMODS.ObjectType.inject(self)
self:inject_card(G.P_CENTERS.j_gros_michel)
self:inject_card(G.P_CENTERS.j_cavendish)
end,
show me what you're doing to print to console
Pretty sure this crash is unrelated.
It's trying to inject c_bananalatro_fruit into a pool that doesn't exist.
Which iirc is usually an issue with the ConsumableType and/or consumable set.
I have a print at the top of my file and that works when the game loads. And I've had prints in the calculate function before
Oh yea I didn't notice the consumable doesn't have a set
huh?
did you reload the game after introducing the optional features?
i do always reload the game yes
