#💻・modding-dev
1 messages · Page 341 of 1
I just wanna know how to recolor sprites ;~;
I mean just have the edition applied in add_to_hand?
not an edition
tbf sometimes a patch is more compatible than a hook in a particularly fragile spot
a default shader like hologram
oh brain
or invis
yeah I know what you mean
brainfard
a null edition with the same properties as the base edition would be a hacky way
but there's likely much better
yeah but that'd make an entry in the collection as well
also why do that when patch
you can surpress those
that I know
i think a drawstep can do the same thing as a null edition
but for sll I know that's a patch
yeah it's almost certainly the right tool for the job
or i think you can overwrite smods drawsteps, idk if they do one for the vanilla jokers
You wouldn't need to override for this.
keep in mind that even Blueprint mod uses very few lovely patches for all the magic it does
and I don't think they're related to core functionality
and it was made before drawstep iirc?
If it doesn't need to be in a specific order you can just hook after Card:draw.
balatro should be a text based game i hate graphics
Balatro on a terminal interface would be fire.
it would actually
I mean... an in-terminal ascii version of balatro sounds like a fun project, or even actually text based
but the gameplay loop would suck in actual text
imo
and then it'd almost make sense to do it in Bash, lol
somewhat related to the conversation
I plan on using that mod to automate lovely regression testing (at some point)
(I'm obsessed with Bash being an actual programming language for some reason)
yep, you just need to be judicious in your usage of patches.
Balashtro
Bashatro
Balalash
this can be true, though it's the specifics of the usuage that matter most in either case for these specific spots
whos good at decks here
im good at dragon link
like if i wanted to make a deck start with a a blueprint
hello pfp change
not me cross-compiling my mod via posix shell https://github.com/BakersDozenBagels/BalatroBakery/blob/main/.github/workflows/create_lite_version.yaml
just do SMODS.add_card inside an event
apply = function()
G.E_MANAGER:add_event(Event({
func = function()
end
}))
end
in here yeah
yeah
key="j_blueprint", edition="editionkey"
amazing thank you
do y'all have any complaints about lovely? bad workflows, bad patch logic, etc.
complaints are appreciated because it keeps the ego down
(and it also gives the next release more direction)
oh hello john lovely himself
how do i check what vouchers the players have?
I don't think I'm enough of a power user to have complaints
other than mac patches not working properly:p
is that the creator of lovely.
yeahhh this was a nightmare to fix
it's done though and will be included in the next release
i think a little more overdepth on patches would be cool on the wiki but besides that everything is "lovely" bro.
you should make it so when the lovely engine fails it bricks your pc tho
keeps you fresh
awake
The documentation is real bad, especially for advanced features
yeah
agreed
to put it lightly
i dont know if you can add table.find but if you could that would be amazing
it's not even real documentation haha, just a "look at what you can do"
who wants to code: 🙋♂️🙋♂️🙋♂️
who wants to write docs:
but then the readme is outdated haha
my kind of documentation
"here bro heres my magna opus"
"youl get the hang of it"
iirc is this not a lua 5.2 feature? this would become available if we switch everyone over to luajit2
we discussed patching here recently and i didn't get it
now i get it but would still appreciate for payload to accept a file path
idk i just know it doesnt exist
yeeeeeeeeeeah I want to do a proper documentation pass when I'm done with our move
also if someone could answer this this would be amazing
I've got this on the backburner 👍
i think they're in G.vouchers
it's a bit awkward since we need to ascertain if a payload is a path so we can raise an appropriate error if the file can't be found
oh, and json support
also would it be possible to just remove a voucher from spawning in the shop
The semantics on count could be better; sometimes I'd like to specify a min and max instead, or perhaps not run a patch at all if the count is wrong.
Also it would be nice to be able to programmatically inspect which patches were applied
okay so this might have immediatly spawned in 100+ blueprints in an inf loop
and immediatly blue screened balatro?
return true for the event to end
check how cryptid does its delete code card
and whats the key for both clearance sale and liquidation?
I have a question. I know Lovely was created for Love2d in general, not just Balatro. Are there any other communities using it regularly that you know of?
toml and yaml are yucky too me, and i work with javascript and that obviously has native support for only JSON
i have a funny mod idea: cards that were unable to spawn (for example, if you're full on consumables and use a high priestess), they instead spawn in the background and taunt you for the remainder of the run
it was initially made for Balatro but it has generic support for love2d games.
that's not funny that's scary
how is it scary 😭
err I'm not sure. people have been playing around with using Lovely and other games but I haven't heard anything in a while. Maybe Mari0?
@red flower works perfectly thanks for the quick help
min/max would be nice for specificity. we've chatted internally about something like this before and it always came down to a "useful but not that important", but I can take another look for you.
thank you i have never made a deck before
agreed. I need to do a huge expansion of the runtime to better handle querying metadata from the lua side
can't you search the name in the localization files
tbh with how similar these are kinda are, I get why you'd only wanna work with one
lol
ill look fo rthose
i mean, that was an example, it wouild applies to all attempts to spawn anything in a filled cardarea, such as jokers (i.e. full on jokers, have riff-raff, start blind.)
i cant find them 😔
ah yeah, I'm planning on reimplementing nativefs entirely within lovely
native code
it's the only way we can reliably get gamepass support to work
yeah, but also i think it should be easy to support json, with a json to toml converter - but then again, i could also just convert locally
ngl they all remind me of css, I was fairly familar with it at one point taking an intro to web design class
they're in game.lua
@gaunt thistle one more wild suggestion (in case this isn't possible yet): multiple targets or patterns/regexes for targets to patch multiple files at once
tyty
I have a couple ideas on how this would be useful but it's probably not a very high priority feature
but it's not a bad idea
if people are interested in having target regex then I'll implement it, otherwise it'll remain low prior
this would also begone with fuse filesystem jank
probably at least
fuse is macos, right?
and a proper path string type would be nice too
gg implimented clearance sale + liquidation with aqua stake (this is liquidation, 50% -> 25%)
oh yeah, i did want a negative lookbehind at one point which i had to implement in a really dumb way
lookaround in general would be very nice
heres all of the current stakes
I wonder if Balatro on Linux was native, you'd have similar issues supporting it as on mac
I mean... probably not? MacOS is just weird
oh, i wanted to ask that as well: which regex engine is in the background here? i'm used to js regex so would also use lookarounds all the time
rust regex i guess?
iirc the rust regex engine that we're using doesn't have negative lookbehinds
but it's been a while since I've looked at it
yeah, the rust crate doesn't support it
...but it lacks several features that are not known how to implement efficiently. This includes, but is not limited to, look-around and backreferences...
it's specifically the regex-cursor crate
lookbehinds would definitely slow things down though
lookbehinds?
whatever the word is
i think the current state of balatro modding can live with a bit more loading time lol (if that affects only loading at the start)
with lookbehinds you can check if something is before your match, but not include it in your match...same with lookaheads and the negative versions
I'm trying to make a pirate joker but something that looks even more pirate than the one in the game, I want to make it like a legendary joker and that his power has to do with the player's economy. Do you think it's a good sprite? It's the first one I make and I would like feedback to improve it 😄
i like it, the hat looks a bit pointy/straight tho
m_glass
make the teeth a bit teethier? a more prominent greedy smile would POP
perf thanks
ready
hat some less pointy and more teeths
How do I track rounds? Like Invisible Joker
I just increment a counter in end_of_round
nice, but what i meant with the hat is that could be like rounded inwards instead of straight edges, but maybe that's just me
but i also like the shading there
does anybody know why when i try to loop over G.hand.cards i get nil values?
i call G.hand just after checkin context.hand_drawn
if context.hand_drawn then
for _, v in ipairs(G.hand.cards) do
available_ranks[v.get_id()] = available_ranks[v.get_id()] + 1
end
In order to place cards in my custom card area, I'd have to hook card:emplace right?
v:get_id
i hate lua 
why i think that makes sense
i know i'm a lua noob and it probably makes sense but i've seen several places where . and : are okay and here it's suddenly not?
How do I make the rainbow text typically used for editions?
it's just syntax sugar to pass self because you can't specify which functions are static functions
Also, I tried rainbow, that didn't work
I know how the color command works also
Yes
looked at how diet cola triggers on sell and now i have something like this
G.C.EDITION or G.C.DARK_EDITION probably
Is dark edition for negatives?
dark_edition is used for editions in all text iirc
I'm pretty sure negatives are the context I always see it in, but I may be mistaken
damn i copied the lovely dump to my phone but not the loc files
What is the difference between the two?
one is rainbow-y the other is dark rainbow-y : )
if someone want the sprite, dm me. i dont know much of coding so i cant put it in game lmao
I mean, do you not wanna post it here becaause your worried people will use it in their mods without your permission?
anyone know what this means
search your code for "b." and see what comes up that might be relevant
Now give them scurvy
idk, i would like it if they give me credit or sum
i wouldn't mind
i don't know too much about coding so if someone wants to put it in a mod i would like it
in which parts?
one of the cards in the cardarea is nil for some reason when it's trying to sort them
do you know what might have caused?
Yes
its that one voucer delting joker
it does that every time it is used a seciond time
yeah ofc, I was just wondering why you didn't post it here
maybe it's not deleting the voucher properly the first time so that's why it crashes when it tries to do so the second time
but yeah people are good about giving credit and asking before using art typically, and if not then they get held accountable
in my experience
yeah i was using the event manager wrong
me with another contexts question: what happens if another joker or thing retriggers my jokers? basically, i need to initialize some variables and with your guys help i did that in context.before && context.main_eval, but i also want to reset them for the next time, which should be straight forward with context.after or something - but i feel like that only works if the joker is only triggered once, right?
i know there is context.other_joker but i feel like that's something different
someone knows how to make a legendary joker? maybe could help me or code the joker 😄
I think main_eval should cover retrigger but if not I think the explicit check is context.retrigger/context.retrigger_joker
ah at the very bottom of the docs
i don't know if it's my english but i still don't quite understand that sentence lol
"are called with again" what
i hope the new calculation docs eremel is working on are better lol
but thanks for pointing out retrigger, i'll look how other mods are using it
I have never tested my mod with retriggers enabled so everything might be broken for not checking properly lol
oh star rail does something smart, they just reset the values right before initializing them, that might not solve the problem but is still less convoluted than using context.after
It means the functions is called another time but with a modified context
but does it run through the exact same context loop?
Wdym context loop?
the main scoring loop
first its before, then main_scoring, and so on until after...when a joker retriggers, will it go through all those stages again?
I'm not sure exactly but I think any retirggers are just called again right after the first time
basically will this be true on normal trigger AND retrigger: context.before && context.main_eval?
Idk
sorry my questions are garbage
Try it and see
yeah
The text still isn't the rainbow color for some reason
That's not correct
How do I do it then?
lowercase i think
Actually the dark_edition part is probably lowercase
Also you don't need two {{ (I didn't even know the game was okay with that)
oh so
I'm making a mod for my friend who introduce me Balatro
as a thanks for the new addiction
basically it's a joker of him, who is a combination of Scholar + Gluttonous
When a Clubs card is scored, you gain +24 Multi and +69 Chips
however
context.individual, is_suit()
is there a way to kill previous attention_texts ?
? like the message?
yeah
yes, that part i got it
I couldn't make two messages appear one after the other after triggering
like +69 Chips and then +24 Mult
return {
chips = 69,
extra = {mult = 24}
}
that should do the order iirc
what are you having trouble with, exactly? detecting suits or returning?
if they're not scoring on the cards then use context.individual
only the messages
then try this
oh right comma too
i put this like:
message =
return {chips = 69,
extra = {mult = 24}
}
?
no just return normally
no message, chips and mult will automatically give the messages
ohh
if you want to change the messages they auto give then you use message = 'Custom Ding'
otherwise just ignore it
are you using chips_mod instead of chips?
yes
don't
anyone know how ican change the values of jokers by x1.5
as far as i can tell i look in card.ability
or in some cases card.ability.extra
but ik some of the jokers are hard coded
Is there any way to, within the individual context, cause returned extra chips to be summed with the base chips in the same way they are for bonus cards?
Rather than pinged separately?
I made a whole function for advanced manipulation of joker values
Same!!
oh joy
You basically just have to iterate recursively through the card's config/ability table
Ill send it:
yeah i figured as much
i was already thinking about making a function lol
--- If no parameters but a table are provided, the function returns a deep copy of all non-object values
--- @param table table A table to modify.
--- @param mod number | nil A modifier value (such as 0.5 or 2). Default is 1
--- @param reset_table table | nil Table to reset directly comparable values from based on comparator
--- @param compare string | nil A comparator to determine when to reset ('pos', 'neg', or 'dif', default is 'neg')
--- @return table # A modified copy of the given table
function RecursiveTableMod(table, mod, reset_table, compare)
local val_type = type(table)
local mod_copy = nil
if val_type ~= 'table' then
-- modify number values
if val_type == 'number' and (not reset_table or type(reset_table) == 'number') then
-- default value
mod_copy = table * (mod or 1)
if not compare then
compare = 'neg'
end
-- reset if a reset table is provided
if reset_table and ((compare == 'neg' and table < reset_table)
or (compare == 'pos' and table > reset_table)
or (compare == 'dif' and table ~= reset_table)) then
mod_copy = reset_table
end
return mod_copy
end
-- weird scenarios with a table mismatch
return table
end
-- recursive to arbitrary depth
mod_copy = {}
for k, v in next, table, nil do
if (k == 'order' and type(v) == 'number') or (type(v) == 'table' and v.is and (v:is(Card) or v:is(Cardarea))) then
-- don't copy certain values
mod_copy[k] = v
else
if mod and mod ~= 1 and type(v) == 'number' and (k == 'x_mult' or k == 'Xmult' or k == 'x_chips' or k == 'Xchips') then
if v == 1 then
mod_copy[k] = math.max(0, RecursiveTableMod(0, mod, reset_table and reset_table[k] or nil, compare))
else
mod_copy[k] = math.max(0, RecursiveTableMod(v - 1, mod, reset_table and reset_table[k] or nil, compare))
end
else
mod_copy[k] = RecursiveTableMod(v, mod, reset_table and reset_table[k] or nil, compare)
end
end
end
return mod_copy
end```
Can’t figure it out. Does someone here do commissions for mods??
may i use this?
one last question: Do I need to do something to my code so that my Joker can appear in the shop and Buffon Packs?
Mine is very configurable, you can choose the exact operation you want to do, the table you want to iterate over, vars to exclude (at certain vaules and in general), vars to only go over if contains certain letters, and rounding.
This has a bit of extra functionality I originally added for something I did with Dilly, but just call it, give it a numerical mod, it'll multipy all values on a table given to it (like card.ability or card.ability.extra)
And yeah sure
How so?
im gonna leave learning dynatext for tomorrow cause my brain hurts
Main Channel (Rare) - 1 in 25 chance to multiply a value in all owned Jokers by x1.5 when playing a hand. (Wait, he has a main channel?) [see below for explanation]
avoiding chances is gonna be really difficult, because not every vanilla joker mathematically implements them the same way
While in most cases this won't work for all jokers i think the function i made will be a good fit, i used it too multiple all joker values by two, change chips to mult value, and swap chips and mult values.
id rather make my own
But almost all of that besides changing the localization stuff is easy
there are a couple things ill need to kidnap because of them being hardcoded
like dagger
does anyone know how to make a joker play a sound when it is being sold? this doesn't work
bump! any help is greatly appreciated
also it's formatted like this so i can pick a random sound between these three
.
The instances of the 'self' variable that you're using need to be replaced with 'card'
yes but how would i fix it
.
that's a completely separate thing
In the context of the SMODS calculate function, self refers to the center, not the card instance
yeah changing self to card just doesn't crash the game
the juice still doesn't work
the function is_suit() might not exist
it does ive used it before
to be clear: the joker works, it is just the juice up that isnt
It's highly likely that there's an ambiguous reference between the local v variable inside the eval function and the one used by the ipairs iteration
Name it something else
the naming convention isn't the issue, it doesnt work no matter what you name it
Can you explan what the joker is intended to do?
i just want the joker to juice up while a spade is in hand
the joker's ability works
it is just the juice that crashes it
I'm guessing my best bet is start with the things I can scale easily then do the hard coded ones
Juice until is wierd
I've had my own issues with it
i want to post the glorbshit gif so badly because my jokers are not getting retriggered 😭 😭
So like... the main issue with it is that you're giving a bunch of unique juice_until evaluations for each individual spade, and the condition is asking to wait until that specific card is no longer a spade. It doesn't replace the existing evaluations with the state of your current hand, it just adds atop them
so apparently jokers with SMODS.calculate_effect aren't getting retriggered? 😭
So the best bet would be to make a value on the joker that is a Boolean that decides if it should juice that is set to true if there is a spade?
Yeah
Because unless you change the suit of one of those cards, those juice_until evaluations will never change, and they'll conflict with each other
And if one of those cards is destroyed, the reference to the card also breaks
Then putting the juice until in the main calculate function and not the if
Depends on what you want
I'll consider it
if they don't return anything, they don't get retriggered
you can also return nil, true if you don't want an effect but do want to indicate the joker triggered
oh that's a good hint, thanks
does selling a joker trigger its remove_from_deck?
Yes
does that mean i can have it play a sound through there or no
Probably yeah
sickkk
wait would i use playsound or return sound
wait no returning ssound if for calculate disregard me
if my joker soul is in the second row and first column what would be the pose? im kinda slow lmaoao
Such start from 0.
Can someone help me figure out what went wrong with my get_current_pool?
This is the crash I get. It tries to make a playing card with a seal on it and does this instead
The crash log also has my mod list
for some reason my game isnt letting me see my consumable in shop anyone know?
I think it's something with Familiar and another mod likely, after reformatting the file so it's readable I think the orig part that would handle polling seals is being skipped because of the elseif v.set == 'Familiar_Planets' then.
And since seals have no default it just rolls with Joker
How do I move cards from one area to another? Like from G.hand to G.deck by using a card
yep, Familiar is tonight's lucky winner. Deleted it and same pack works fine
yes, for well over 12 hours I haven't restarted the run
just left it there for testing
@unkempt thicket (also why are there 2 of you? are you one of those peeps that has a mobile and desktop account seperately?)
It was Familiar that broke my Hearty Spades... and it is Familiar that broke the Seal generation in my booster pack. 🐴
to be fair, I think it just flat out broke seal generation
can someone help me with my code in dm?
https://github.com/RattlingSnow353/Familiar/commit/aa2e422ec4eb6285a4540eef1c4ffba24728d93f
yeah that was just changed right when my issues started
Anyone know how to load new image files/assets using lovely? (not steamodded)
I'm trying to do love.filesystem.read(texture_path) in an injected function but I don't think the image file is actually contained within the patch so it can't find it
Making a joker that gains X1 mult if played hand is pair of aces, built it based off of superposition and runner, but I get an error when selecting a card saying poker_hands is a nil value, anyone want to point out my stupidity?
local aces = 0
--always score
if context.joker_main then
return{
Xmult_mod = card.ability.extra.Xmult,
message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.Xmult } }
}
end
--check for aces in hand
for i = 1, #context.scoring_hand do
if context.scoring_hand[i]:get_id() == 14 then aces = aces + 1
end
end
--check for pair and aces and upgrade joker
if aces >= 1 and next(context.poker_hands['Pair']) and context.before and not context.brainstorm then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.Xmult_gain
return{
message = "Upgraded!",
colour = G.C.MULT,
card = card
}
end
end```
was a fix for another incompatibility I was having
actualy, it's not too let, lemme test something
Does anyone know how unlock conditions work? I want to start giving my jokers some
@edgy reef @unkempt thicket just as I suspected, putting familiar back in but taking all-in-jest out also fixes it
they're really fighting over than patch space
wait fuck me I'm an idiot
I made that change to my modpack folder, not my mods folder
my game crashes trying to spawn in my card
anyone know why?
my key is just their name so would it be no "c_ mills_ "
yeah nevermind, it really is just familiar
whoops
I mean probably an interaction still, but not with all-in-jest
Looking for help.
i wouldn't ask if i hadn't tried basically everything the last two hours; any idea what this could be?
this happens when trying to retrigger my joker with another random joker
specifically with Blue Yourself from Neato Jokers
but also happened with another retrigger joker from toga
what is the proper way to set debuffs? it seems theres like at least three different ways to do it, and I wanna know which is the suggested way
i need help, my legendary joker only use one pos, i put soul pos but it doesnt load the joker, when i delete the soul pos my joker appears
nvm i'm dumb
also in follow up to this, whats the best way to have them to stop being debuffed when the custom ability isn't in effect anymore?
rn i'm just calling card:set_debuff(true) and marking a variable so it knows that I debuffed it, and then disable it manually later if it is debuffed and has that variable, but that would prevent other mechanics from debuffing it as well while its already debuffed, so theres likely a better way
Hey modding chat I dont even know if this will get anywhere but following the convo on #🍌・thunk-chat , I see a ton of people like jiggle ideas and stuff, how easy is it to grab the function to make existing jokers jiggle? Might check out if I make a fidget mod or something
like, its ungodly how many "Hey couldnt this joker jiggle when X situation happens?" Thunk got in the last 5 minutes so I figure there ought to be a little nieche to carve out with mods that just enhance how tactile the game feels and are more for fidgeting
:juice_up()
So I'm putting cards held in hand into deck, the problem is that if a card is highlightened it stays highlightened. And when I try to unhighlight_all it just crashes 😭
cards refers to the array of cards in the area, not the cardarea itself
you're looking for G.deck:unhighlight_all() here
nvm i got it
That doesn't unhighlight them tho
For the 'removing_playing_cards' context, is there a way to have the behaviors from the return table occur after the relevant cards are destroyed rather than before?
Or would I have to make a unique context for that?
i patched SMODS.create_card (see bottom) in order to replace one card with another upon card creation, but when i do so it does... this. the card is created as intended (soully on the right), but then the original card is just loosely there. what's the problem with my patch?
(also, those particles around the card are permanently there for... some reason)
Nvm I just did it another way. It results in a little visual bug it works functionally sooooo whatevs
entirely my fault cuz i'm dumb, don't worry
🫠
nevermind, got it! had to patch the original create_card function
Does anyone know why do these get darkened?
the game's shaders naturally darken almost all colors, check out https://discord.com/channels/1116389027176787968/1250386587691388989 if you want a little guide on the game's used colors (essentially, the black used in-game is lighter than actual black)
also check out this if you want your art to look like in game while designing
Oh damn that's cool
why is the key "Red" in my joker pool (and crashing the game because there's no center for it) I'm gonna cry
question, whats this
id assume that's for hologram etc.
hm
i see
what do i need to do to give the card an edition and a seal too?
i tried reading the function's code but i barely understood anything im gonna be honest
Why are there two colors assigned to a consumable type? I thought badges are one-colored
-# what do "front" and "center" mean 😭
Try putting it in a variable and editioning it and sealing it?
mm i will try,one sec
doesnt seem to be it
oh wait
was i supposed to patch here?
uh
how do i direct the target to this
never tried patching smods before
target = '=[SMODS _ "src/utils.lua"]' ? #💻・modding-dev message
Try removing all the tabs?
Try looking in the lovely dump.
Confused on how to spawn a card from a modded set with SMODS.add_card
Or SMODS.create_card
that works now
Code?
Specifically how the key should look
Of the ConsumableType?
Of how your trying to create it.
SMODS.add_card { key = "tune_b1999_mel1" }
Current attempt
Not much more
balatro 1999??
that is an odd looking key
Yup
fire
Because I don't understand what I'm doing
Like with a vanilla type i think it would be like t_b1999_mel1 (?)
There is no vanilla thing that has a key like that
That's a consumable
what is your mod id and card's key
you want to do c_(mod_prefix)_(key) then
can I get an SFX vibe check
It's a little in your face imo
Yeah that's it thanksss I don't think I'll have any more brainfarts (today)
dont worry, i had a lot of brainfarts today too, i feel bad for people helping me 😭
fr
how do i let another card/joker know when this enhancement creates a card?
this looks cool what mod are you making
a skill tree mod that saves for the entire profile
currently im working on a section that buffs spectral cards, gold seal and purple seal
If spectral didn't have negative effects, then these would be the best cards
Look at how Lucky Cat and lucky_trigger works.
ty
Can you get around that by function hooking?
its easy
but
im mostly concerned about the fact i cant change its description by changing a var like tarot cards
so i would have to override the card's localization, which i kinda tried to avoid
😭
thats annoying
one
I see how do other cards handle it? Because they're dynamic it's not handled in the "text" table?
they have something like #1# instead of 1, which changes depending on a variable
I had an idea to create a balatro mod around the binding of isaac but its already been done... so now i gotta think of another idea... 😄
How are ya going to get around it then. Any ideas?
How do I create my own mod?
[1349064230825103441](#1349064230825103441 message) This should link to a channel guide in this discord.
@haughty wraith
^^
too much trouble, im probably just gonna leave the description untouched
https://gyazo.com/67423c9812e9d4950cd90b82efd47f5f it works though
Yeah looks weird but uhh idk a better way to link it
Ahh there we go
@haughty wraith
It works but I'd imagine a user would forget very quickly after a break, if they return and see that Aura states it can only alter one card
np
there we go
Nice! How did you fix it?
made my own localization for the card :p
its sadly the only way to fix this, and mods which add new localization to Aura too will probably override my changes
making it back to "1 selected card" again, but it shouldnt change anything gameplay-wise, so
How do you give a Joker when you have another Joker in your hand?
Joker in your hand?
You need to give more context if you're already talking about a custom part of your mod
If there is a certain joker in the joker slot then give another joker
they've been asking this same question for over a day straight
they want to be given ready to use code
and don't seem to understand attempts to help them
I see fair enough
finishing touches on da tag
Even still the amount of context here is very lacking? Do you want the joker to give a joker when:
It's sold? A blind starts? The round ends? etc. Either way I think your answer will be in the steamodded wiki documentation here https://github.com/Steamodded/smods/wiki/SMODS.Joker
it was originally 2x but shit that got strong fast
Not I want to, when 3 certain jokers are in hand, a 4th Joker appears
That tag looks great. However the center cross looks misaligned at the top? Although might be wrong as the tag is rather small in that image
oh hold on
you might be correct as hell
I also think you've gone one level too deep on the bottom side aswell 
Your shape
Original
@vocal cedar
I tried it like this, it doesn't work
You need to check if #SMODS.find_card("j_fut_lila") > 0 then
idk where to set the trigger from
If I have {key = "j_lila"} in SMODS.joker, where do I need to add the prefix?
everyone is adding xchips 😭
Remove the j_ from the key when defining the joker.
You should be putting it on card not self
That's because it's the source code.
self is actually the card over there.
I'm new to Lua and struggling a bit with my first joker. Could anyone point me in the right direction in terms of counting cards of a specific rank in the scoring hand?
if context.individual and context.cardarea then
local cardarea = G.play
local count = 0
for _,card in pairs(cardarea) do
if card:get_id() == 7 then
count = count + 1
end
end
Ah, thank you
Not working
You need to check #SMODS.find_card("j_fut_lila") > 0
how would you go around flipping the played cards one at a time and only flip them face up if all the cards are flipped down for a short amount of time
I tried that, too
??
Sometimes I forget which node should be G.UIT.R and which node should be G.UIT.C, and then something like this will happen:
how do i make a planet card?
Someone tell me already how to do a check on the jokers in the hand and if they are there then give another joker
Bro maybe people here don't have the answer. Check the documentation...
SMODS.Consumable Documentation
You basically make a consumable and then specefy it as a planet
i figured it out dw
ok nice
cards that get enhanced during context.before dont score their enhancements?
How do I stack them vertically?
They probably don't want to, since it's not a complicated action, I can't understand it just because I'm new to it
It should be, considering Midas Mask - Golden Ticket combo.
i think you cant have a G.UIT.C inside a G.UIT.C, N' explained that to me before
you need to do G.UIT.C -> G.UIT.R -> G.UIT.C
or something 🤔
Let me try that rq
yeah it wouldnt make sense to double uit.c
It worked. ty
are those all handled in context.before?
yeah
Did you put them in Event?
weird
That would make them do enhancing after scoring calculation.
oh
is there a good wiki reference for all the hidden configs for random shit?
like here for example
max_highlighted is a predefined variable that you set for specrals or tarots right,
but i dont really see its documentation anywhere
i feel like i just keep seeing stuff like this all throughout smods
If something is not in the documentation, most often, it's because it's a vanilla thing.
GOD DAMN THE FUCKING SUN
anyone remembers from the top of their head how to check if a card has an enhancement or not?
next(SMODS.get_enhancements(card))
thank
Any Idea how I'd change the chances of just lucky cards
Like this yeh
I would recommend just having them in the localization file rather than making the UI manually
I mean, is there not a built in credits tab in the balatro mods section?
the SMODS one?
that one is harder to edit because it's for smods credits not for individual mods
No the individual mods one
no, you need to add it yourself
you can have them in the mod description if you don't want a different tab
i just linked to u 😦
Oh mb
ive seen repeated jokers appear in my shop / on creation despite no showman being present, is it a known bug or would my mod be causing this?
(was trying to see if polls and enhancement gates were working)
Did you spawn it with DebugPlus?
i spawned all jokers manually and turned them negative with debugplus, not creating showman, and then spawned jokers through judgement
wdym by manually?
pressing 3, then ctrl Q
If you spawn a joker with DebugPlus it doesn't get removed from the pool.
there are some vanilla bugs related to that but i don't think that's related to your issue
how could i test if my poll false and enhancement gates are working well?
eval SMODS.add_card{key="joker_key"} in the dp console
oh no, that will always spawn. I understand what you mean now
I don't think there's an easy way to test if something doesn't spawn properly
you can try banning all other items with the Banner mod?
what is it?
how do i set chips/mult, instead of adding to/multiplying it?
hand_chips = number or mult = number I think?
ty
You’d need to update the text too, so I think it would be cleaner to use chip_mod in your return (or remove_default_message = true) and have a custom message
Yeah add the difference
how do i get the amount of chips/mult?
hand_chips and mult
No.
Those are globals for the current chips and mult.
is this joker any good? (chances are independent)
posting this here again cuz i'm shadowbanned in #⚙・modding-general
shadowbanned?
i'm joking but 90% just ignore me and it's aiko memes i don't understand lol
ah ok
i'm no expert on balancing but
i do love the rotating polyhedrons you've made
haha thanks
This seems alright
i somehow think constantly it's a net negative joker but i don't think it is unless you have a weird other joker or consumables that caps hands or something
why am i making a mod based on multiple rolls when i'm too stupid to understand independent probabilities 😭
drew this from scratch... does server deem it at least bearable?
i have touched pixel art
exatly one time before this
and it was to make a different spectral card lol
Graveyard: Convert your entire hand into Stone Cards, then apply Iridescent to a random playing card, or Joker
i gotta know how many times bro has emoted
iridescent is your x2 chips edition right?
Somethingcom thinks a lot
he does lol
80% chance it applies irid to a joker, 20% to a playing card
i might just make it 100% joker tbh
the art's maybe a bit hard to read, also it seem the lower pixel line of the drawing inside hasn't he white border
and then leave the irid to a card for a lucky aura or standard pull
i like the idea of a graveyard spectral card, but i'd just make it destroy a bunch of cards and give 1 extra pemanent discard
Since about 8 days ago.
i think im gonna make the hand and the grave a soul, make it seperate
might improve vis
a bit odd for the lower chance to be on the less powerful effect, usually balatro does the reverse
like aura is like 50% foil 35% holo and 15% poly iirc
i feel like irid cards are significantly stronger than irid jokers
cause death dna cryptid and boom
could help probs
making aura have 50 foil 35 holo 10 poly 5 irid
If there was a reverse splash joker where all cards are unscored, is there a situation where that would be useful?
they're not as jokers can add flat chips, thus multiplying chips on played cards is a burden
so you play a hand and.... nothing scores
Your jokers still do.
oh i see
i dont think that would be usefull unless your going for the cryptid green seal thing no?
there we are
lets see lets see
Question for a joker i'm working on, which set hands to 1, the thing i use G.GAME.current_round.hands_left but it doesnt seem to take into acc the added hands from burglar; since it's only done though ease_hands_played
anyone would know some kind of a solution?
+1 for bus
well the thing is, editions on jokers are reliable because they'll always be there, but that means the joker edition can't be anything else (unless you either sell it or otherwise have some other way of removing it)
editions on cards have the advantage of not taking up an edition on a joker but not being reliable as you have to have it in your hand to use it. it's not useful if it's never drawn. imo the rough equivalence for applying an edition randomly across the choice of either the joker or hand cardareas would be 1 random joker or 2 random cards in hand
OR
...the edition is stronger on the card than on the joker 
that's an interesting idea. having a condition where editions on cards are twice the value as they would be on a joker
now you've got me ideating
i think im just gonna make it the "hex" of irid lol so it only hits jokers
o
so heres something i cooked up a while ago
negative playing card rework
Negative Playing cards act COMPLETELY different from their joker cousins
Besides giving you +1 hand size when drawn, they ALWAYS score (like if splash joker was here) and have a 1 in 2 chance to retrigger
Also, Death, Cryptid, and DNA cannot copy the negative
only the seals and enhancements of the card
maybe not the retrigger
so this discourages you from just making a brillion negative red seal kings
maybe now, havent played with wm that much yest
not*
yeah, other than the retrigger part, with the caveat that you just can't replicate negative playing cards in any way, that feels surprisingly balanced
i got this dude right
currently him and standard packs are the only way to get the negatives in your hand
when you could copy the edition with death and cryptid shit got really stupid really fast cause mime and baron would actually start drooling over those negatives with gold and steel
it was either that, or nerf mime and baron to not be able to work with negative kings, and negative steel and golds respectively
i see. see, i have plans for joker functionality that makes specific cards negative. and this is a specific form of a forms-based joker which changes forms based on the first played hand, like cardsauce's slay the spire joker, but based on hand type rather than first card suit, this being straight flush
and i liked the "cant copy negative enditions over on playing cards"
heres what i would warn you about
be super carefull with negative playing cards
they
yeah
have NO downside lol
they're weird
i think your idea gels really well with what i want to do
you can clog tf outta your deck with them and its fine
bro feel free to steal it
yeah, i just think they should be hard to get
or better yet when i do the lovely patch ill send you my code
give me the day
basically
Negative Playing cards always score
Negative playing cards when Copied, or Deathed, do not transfer the negative edition to the copies
ill have that done by tonight probs lol
not awful actually
perhaps making colors of the front and back a bit more different, either in values or in hue
but does look more readable
hmm good idea
i think the biggest reason why i like this idea for negative playing cards is that it brings their acquisition closer to how negative jokers are, at least in vanilla - like every ability that duplicates a joker never allows it to create another negative joker
if that makes sense
yeah thats what im going for
ankh and invis
they no likey
negative has always been the super odd "ooh shiny" ass edition
bc its just so different from the other vanilla editions
literally does jack shit for scoring
but so good
bc jorker slot
@daring fern this you?
last question, if you have a localization file in your mod folder how do you tell the game to use it instead of the base games localization
like i have an edited copy of en.loc in my mod older
that's determined by file structure and naming
that does the "mr fantsastic" lol
oh i cant just completly overwrite the normal one?
bump, it interacts also poorly with needle, since both burglar and needle dont touch the hands_left but only ease 😔
hold on
so
you want it to overwrite burgular?
i can drop the code if it helps
no, rather execute in order i'd guess
so needle by the way is POORLY coded by thunk, keep this in mind
basically
needle doesnt set hands to 1
same for burglar
its gonna be a nightmare anyway
there are other options such as SMODS.process_loc_text() but this is the usually easiest, most reliable and most mod-compatible way to consistently get exactly what you want
basically has to be */localizations/[the localisation name].lua
and the filename has to be either default.lua or the name of an existing localisation language (either in vanilla or one you add such as via SMODS.Language()), such as en-US.lua
if context.setting_blind and not context.blueprint then
local lost = G.GAME.current_round.hands_left - 1
print(lost)
G.E_MANAGER:add_event(Event({func = function()
ease_hands_played(-lost)
card.ability.extra.xmult = card.ability.extra.xmult + (card.ability.extra.xmultmod * lost)
card_eval_status_text(card, 'extra', nil, nil, nil, {message = 'All in!'})
return true end }))
end
if context.joker_main then
return{
xmult = card.ability.extra.xmult
}
end
if context.end_of_round then
card.ability.extra.xmult = 1
end```
steamodded wiki has good documentation on it https://github.com/Steamodded/smods/wiki/Localization
so if i drop an en-us into my localization it will overwrite the base games?
ooh
first of all cool ass idea lol
second of all thats going to be a nightmare to code with the vouchers the way you have it i think
😔
let me move this into my vscode rq
we love smods here
it overwrites any existing items and adds any new ones. but to my understanding it never removes anything
vouchers or troubadour goes on the variable i modify though so no issue
it's rly just needle and burglar
Bump
show me your code?
and also perhaps your atlas
so your localisation file only needs to include changes or additions you want to make and it will process them accordingly
i don't think you need to add an event there
ease_hands_played already does
let me try smth hold on
hmm, I think the only reason it's like that is for balancing those specific things, which is why mods not having that restirction in some cases can still fit just as well. Ofc playing cards are their own thing, I just don't really buy little situational balancing things like that as things with conceptual weight to be matched against
though from skipping the convo, it likely has a lot of practical balanving advantages in this case
ive blindly re-used the structure for burglar's modification of discards
how are you structuring your joker? what is your joker code
i havent been coding for long so im not rly familiar with what structure or method or else is for
i didn't know burglar did it that way, but looking sat the code you are right
what does this do rn if u have burglar?
o wait, i think i know the issue
it sets hands to 1, then burglar takes effect
thus, easing 3 additional hands up to 4
put lost inside the event
and for needle, on red deck for instance, it eases me -3 hands down to -2 hands
ok
trying lost in event
yeah, because you are calculating the amount of hands to lose before the event takes place
stellar news, you can just straight throw whatever the FUCK you want in localization and it just DOES it thats AWESOME
ugh
thank you john smods
yep
ok doesnt bug with needle anymore, although it still gives me 4 hands with burglar
its like burglar will always take effect after my joker for some reason
How do I define what the blueprint joker does to my own?
it does it for you, you can overwrite it if needed but it should work fine by itself
blueprint is coded to just "turn into" the joker its copying
so
you dont really gotta do anything
would there be a way to (ugly) detect specifically if there is a burglar on one of the left spots to my joker and jokers copying this burglar?
unless you SPECIFICALLY need it to not copy (like a scaling joker)
i think it may be because ease_hands_played also makes an event
so it's delayed two times
if your joker scales its a good idea to overwrite it with context.blueprint and make sure it only copies the scoring part
isn't there a way to change event priorities?
context.jokers[0] i thinl
like adding a delay to my owns calculation
thats UGLLYY but it should work perhaps
again
It says I need to define it?
i'm not super versed in events
ok will look into it
but you can delay them i think
No offense, I’m gonna trust the documentation before you
bro alright lmfao
context.jokers doesn't exist and even if it did it would be context.jokers[1]
why do i even bother
oh im crossing wires
you only need to define it if you want it to exclude some effects
otherwise it's automatic
dude
documentation is misleading,
like i literally just said, blueprint and brainstorm copy your jokers code to a t
if you dont WANT them to you have to define your jokers behavior
say you make a gros michel joker, if blueprint was copying it exatly, then your blueprint might literally go extinct, so we do a blueprint context override to make it so blueprint only copies the +15 mult
oh look other people are also saying its automatic
which is achived with a statement kinda like
No.
the documentation is a bit misleading
python coded
It's the setting it to false that doesn't work automatically
For some reason
No.
It's not context.blueprint if you want to disable it, elsewise it is nothing.
I can't fathom a reason why you'd want it to say incompatible but still interact in act way with bp
War has broken out in the modding dev
no you can use context.blueprint to help you define the functions
not really
they mean if you want it to do something only if copied i think
I mean, it was a joke.
So I don't get why that wasn't programmed to do something automatically
heres what i mean @worthy stirrup
I mean I know it's just flipping a switch that already exists in the base game and is only cosmetic at least I presume that's why it is how it is
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.4,
func = function()
local lost = G.GAME.current_round.hands_left - 1
print(lost)
ease_hands_played(-lost)
card.ability.extra.xmult = card.ability.extra.xmult + (card.ability.extra.xmultmod * lost)
card_eval_status_text(card, 'extra', nil, nil, nil, {message = 'All in!'})
return true end }))```
you can see i check to make sure its not context.blueprint and then do the "do i kill the banana"
the delay doesnt seem to change
why is there war in modding dev
i guess burglar always worked on needle bcs the execution of blind must be before the one of jokers on setting_blind, but the interaction joker - joker is weird
when isnt there
Now I have become death… destroyer of modding dev.
trying to post the 1984
you came in here and asked a question, got an answer, and went "i dont think so" well yeah
this shit is NOT ba sing se
someone mention a certain town square
To be fair this place is usually the blind leading he blind
So skepticism is warranted
ok so general pointers about blueprint
blueprint_compatis for the VISUAL INDICATOR for blueprintable cards. thunk coded it like that, so smods will make it stay like thatcontext.blueprintis a boolean that returns true IF the card is being copied BY a blueprint. to make a card not be copied in any way shape or form you could add anotstatement
Well, the documentation said otherwise, so why would I believe you
I mean... that's not a good mindset either, far from it
The bourgeoisie (Thunk) made it so
I’m aware, but like, I think the documentation would be somewhat correct
if the documentation jumped off a bridge would you too
Yea
The documentation is ambiguous and has many shortcomings
fuck

the documentation is correct, just ambiguous
the DOCUMENTATION IS correct you are READING it wrong because the socumentation IS MEIDGLWALEADING
It is somewhat correct. The thing that isn't automatic oil turning blueprint campatibility off
JKLFAJFAK;JL F;JLHF

yeah, it's 100% correct
I came at a bad time I think 😭
im about to GET ambiguous
what are any of you even saying, the documentation says this:
i don't know how this isn't clear
ITS AUTOMATIC tho
It says I need to define it, I was asking how to define it
this is the 4th documentation discussion i have seen this week
They thought it was the other way around
and it looks like its saying we gotta define it
That it was off by default
And I was told it does it by it self
BEHAVIOR
Mrfreese
Bruh
BE
HAV
IOR
^
:3
yes
Is the default behavior nothing or a full copy? That's the question
full copt
Your honor, you wasn’t even there
okay
for THE LAST TIME
its literally using the exact same calculare
I know the answer
the problem here is what you consider as defining behavior
blueprint copies by default, the behavior comes from you defining when it shouldn't copy
This was for the class
Oh wow! I had no idea blueprint_compat doesn't control whether a card works with blueprint. I need to go verify this, it's shocking to me!
i will slaughter you
Blueprint is coded in the game to DEEP COPY THE JOKER ITS LOOKING AT
if a joker is being copied by blueprint context.blueprint = TRUE so you can put da IF statements in so your BLUEPRINT doesnt EXPLODE or DIE
don't be mean lol
nah hold on hes cooking
I just got here! I guess folks have been having some spirited discussion?
This is a yelling match now
it seems
@quartz ravine but how do i define my jokers blueprint behavior
:(

if blueprint then there will be context.blueprint
literally thats it
what about brainstorm
listen folks violence is never the answer
that uses the exact same system
I think it calls that context still
Same deal
