#💻・modding-dev
1 messages · Page 157 of 1
most likely talisman then
wasn't debugplus originally a lovely mod?
It still is
ya so the answer is easy
well talisman might be used more
What afterwards?
i try this and hasn't really worked out, get a crash, and the desc of the card even shows as Retrigger this card nil additional times instead of 1 so i don't know what's up with that
😭
no one else uses lovely so probably nothing
handy is lovely only right?
so then the cardarea, setting_blind, and blind are there on a different TIMING? like the most obvious timing there is the context, being it's when the blind starts. what i dont get are how to use the objects in the context/timing table. like, can you explain what you mean by using context.blind to access the blind?
just started with modding yesterday so i also may be stupid
theres that saturn mod thats lovely only
I've made a couple other lovely only mods noone uses
Same
what does lovely itself count as?
it's probably the most downloaded in whatever category it's in
it's a library injected mod
an affront to god
which means its probably competing with stuff like bepinx or whatever
idk if it's because i'm trying to make the retrigger be as an edition that makes it need to be different
i was gonna say it's probably like bepinx
I'd assume it would either count as a library or a modding framework.
Our mods are too underground 😭
I have a modifed version of the smods crash handler to work without smods
Same
wait really?
no they're all the same timing, think of each 'context' as an envelope of information. When you start a new blind it sends this envelope to each calculate function of items that you have, where the envelop contains three other envelopes, one called setting_blind, one called cardarea and one called blind. Your function looks at the outer envelope and decides if it wants to do anything with whats inside
👍
Just a coy of SMODS version
It may not look like it but I do in fact keep Flower Pot updated and tracking crashes without this is a pain
oh yeah I frogot I ported some of the changes for the smods one to not crash without smods
so it could be loaded earlier
so then does that mean in the outer envelope i should put the blinds the joker would work with, and then like assign those blinds inside of an inner envelope?
so
OH
OHHHH
the stuff that it says it's equal to in the docs is jsut that
what it is/represents?
yes
first mod I've seen that patches love2d
very cool
true (I could just module patch main preload=true)
or maybe conf
and then anything i put inside of the context uses cardarea, etc as the representative? like i wont have to type out G.jokers i can just write context.cardarea
you;d use context.cardarea but you wouldn't often need to reference the cardarea specifically
As I said before, that's mostly useful to differentiate between being played and held for playing cards
but, for example, if you needed to check which blind was being set, you could reference context.blind and find the properties within that
so something like if context.blind == [some blind property here]
then i set the reset variable to true if the thing wasnt triggered and that triggers the reset
so you could do if context.blind.boss then to only work on boss blinds, for example
ohhh ok ok
you can use == but you'd need to specify the property on context.blind too
boss would ignore small and big blinds
right
you'd want something like context.blind.config.blind.key
so let me see here
if context.end_of_round then
if context.blind.config.blind.key == context.blind.boss then
end
end
id set it up like this so it triggers at the end of the round?
wait i forgot the
there's no context.blind in end_of_round
you'd replace it with G.GAME.blind here
or in any context that isn't setting_blind
is there a way to check if a card is showing its front? i tried a bunch of stuff but only stone cards work with this implementation
like this?
do i have to manually stop each jokers individually if it has something to do with suits or ranks
i'm getting this error when trying to make an edition that retriggers the card not sure what i'm doing wrong on this
calculate = function(self, card, context)
return {
message = localize('k_again_ex'),
repetitions = 1,
}
end
yes but I don't think that comparison makes sense
you'd use the key part to check for a specific blind
ohhhhhhhhhhhhhhhhhhhhhh
can i put a variable there? or will i have to like do each boss blind separately
you need a context check
which context check? joker_main?
what are you trying to check for?
just needed to remove config from replace_base_card 😶
am i just missing something, i thought it would be context like so
calculate = function(self, card, context)
if context.joker_main then
return {
message = localize('k_again_ex'),
repetitions = 1,
card = self
}
end
end
but this one isn't retriggering it either
the joker is supposed to gain chips each time a played hand triggers the boss blind, but if you ever complete a boss blind without triggering the effect at least once it resets the joker's chips. i'm trying to check for certain blinds because obviously certain blinds wont work with this so i need to be able to filter them out of the joker's check
Where would I begin with making a custom stake
I'd set up something like
local blind_keys = {
bl_wheel = true,
bl_serpent = true,
-- etc.
}
if blind_keys[G.GAME.blind.config.blind.key] then
-- it's one of the specified blinds
else
-- it's a different one
end
the other way is to just chain equality checks with or but that's unreadable
inside whatever other context check you need it in
you want context.retrigger_joker_check iirc
how do you destroy a joker?
i've tried using that one and it uses the one initial proc still
calculate = function(self, card, context)
if context.retrigger_joker_check then
return {
message = localize('k_again_ex'),
repetitions = 1,
card = self
}
end
end
sorry if i'm being stupid just started yesterday
oh have you enabled retriggers?
how would i go about doing that because not as far as i know
is verdant leaf under bl_leaf?
is this just to be added in the config
i dont know but this is the code of sock and busking which does a similar thing so maybe you can just copy that and change the context.other_card to self
key = 'sock_and_buskin2',
loc_txt = {
name = 'Sock and Buskin',
text = {
"Retrigger all",
"played {C:attention}face{} cards"
}
},
config = { extra = { repetitions = 1 } },
rarity = 2,
atlas = 'ModdedVanilla',
pos = { x = 4, y = 0 },
cost = 6,
calculate = function(self, card, context)
-- Checks that the current cardarea is G.play, or the cards that have been played, then checks to see if it's time to check for repetition.
-- The "not context.repetition_only" is there to keep it separate from seals.
if context.cardarea == G.play and context.repetition and not context.repetition_only then
-- context.other_card is something that's used when either context.individual or context.repetition is true
-- It is each card 1 by 1, but in other cases, you'd need to iterate over the scoring hand to check which cards are there.
if context.other_card:is_face() then
return {
message = 'Again!',
repetitions = card.ability.extra.repetitions,
-- The card the repetitions are applying to is context.other_card
card = context.other_card
}
end
end
end
}```
under repetitions iirc
hey, sorry if this is a dumb question as I'm not the best dev around and just got into balatro modding today, but is there a function or API call to just prevent scoring from happening ? (for example when you play a card that is debuffed or trigger a blind boss that prevent you from scoring points)
nvm got it
where would i go to report a steamodded bug? i think i found an issue with how it implements negative playing cards that should probably be fixed
what's the issue
gonna test it a bit more before i actually report it but i believe you get a permanent hand size increase if you turn a negative card into a negative card, via death
you definitely get a permanent hand size increase from Something. i encountered this during a run, and that's my best guess for what the cause was
sorry again @wintry solar where would i put this in the edition
i tried checking through s+b i couldn't get it to work
yes happened to me also, i thought it was an ortalab issue because every time i copied negative cards using the leo zodiac it happened
I dont see where it's gone on the wiki
sorry to bother you but could I make use of your exodia code in my mod (another exodia how innovative, lol)
ohhh right = for assignment
yee if you are comparing then its ==
anyone know what are we using since eval_this is deprecated?
calculate_effect
k thanks
thanks man appreciate it
oh quick one has it changed how we access the name of the joker now away from center.key because its crashing thinking center is nil @cerulean rose
Anyone willing to help me out with this quick one? What's the easiest way to check if the G.jokers.cardsarray changes size (i.e. adding or removing a joker) - it feels like the answer is super easy and i'm being plum stupid
could you not use the purchase / sell contexts?
your copy of forbidden_part_added is missing parameters
sure but sell doesn't include destruction and purchase doesn't include random generation
or does it?
it doesn't
no didn't think so
oh shit right
How would one do it under ANY circumstance
ah i must have messed up the copy paste
i feel like storing the array size and then comparing is something but that is fixed to only when calculate can be called right?
for example, taking a joker from a buffoon pack
you can do the one that is called every frame
that doesn't trigger calculate?
i think its just update?
oh fug
i forgot about that one
as in a context? or is it a whole 'nother function block
so how do i make a texture pack exactly
function block
ah and dt i assume is delta time
yeah
like how often it updates
well so if you want to seperate it from frames dt is difference between frames
so if you want to do it for example each second
Executes every frame.
but for you yeah each frame seems good
1 second
so balatro running at 60fps esentially has dt default value at (1/60)
dt is the time that the current frame took
oh right
hmm what's the practical use for that arg then?
just a debug/speed thing?
to count real time
oh ok
G.TIMERS.REAL
is there a way to create custom colors to be used in the mod?
yes
Just need more exact "contexts" to collect. 🐶
ill prob just make it malverk ig
How can I make a joker set the chips/mult to a value? I want to make a joker that moves part of the chips to mult
I have a Joker that "swaps" the values of the two around, but you could adapt it to what you need exactly.
ok thanks
...great!
Lilim have you been figuring things out?
regarding what?
With the weird event queue issues you were having.
yes! thanks to a bit of help we diagnosed the problem and i managed to come up with a solution for it
yay!!! that's great
this is needlessly complicated, just return swap = true
¯_(ツ)_/¯
...oddly enough, works well enough. Though I should probably swap to G.STATE comparisons.
I was smoking something wild earlier gonna blame it on it being late, yeah if you wanted to wait a set amount of time you would just add up the dt between updates then when it hit your value do something
when we use add_joker to give a joker at the stat of a run, what do we put as the string for the joker? I thought it would be the key for the joker, but that doesnt seem to be the case...
trying to give myself one of my own custom jokers
Make sure you prefix your key with j_PREFIX where prefix is the mod prefix you outlined
So like j_mymod_myjoker
is the prefix set in the steammodded header?
Yeah
You can take ownership of an existing joker and change it https://github.com/Steamodded/smods/wiki/API-Documentation#taking-ownership
i have returned much later with a dilemma
why isnt this working at all? it isn't even printing
if context.debuffed_hand then
if G.GAME.blind.triggered then
card.ability.extra.chips = card.ability.extra.chips + card.ability.extra.chip_gain
ScoreReset = false
return {
message = 'Silver!',
colour = G.C.CHIPS,
card = card
}
end
end
if context.end_of_round then
local blind_keys = {
bl_window = true,
bl_head = true,
bl_club = true,
bl_goad = true,
bl_plant = true,
bl_tooth = true,
bl_pillar = true,
bl_flint = true,
bl_eye = true,
bl_mouth = true,
bl_psychic = true,
bl_arm = true,
bl_ox = true,
bl_final_leaf = true
}
if blind_keys[G.GAME.blind.config.blind.key] then
if ScoreReset then
print(ScoreReset)
return {
message = 'Oops!',
card = card
}
end
else
print(ScoreReset)
return {
message = 'Greedy!',
card = card
}
end
ScoreReset = false
end
end
}
Wouldn't sendDebugMessage() be better to use than print?
I'm not entirely sure though
nah print is ifne
Okay, then I defintely was having a function not run when I tried it. I wasn't entirely sure if print would output to the console or if love hijacks the print command.
well if print is fine ill leave it
but it still just wont give chips
let alone reset it
you don't ahve anything here to give chips
Maybe you're function isn't being called.
at the top
oh you mean gain chips
yessorry
I don't think you need the triggered check
because debuffed_hand will only be called when it is triggered
oh my god yoiure right
fixed stuff up gonna see if it works now
actually wait what about the prints
why dont those show up in anything?
hey, it seems that for some reason I never manage to execute any code in context.main_scoring , it is actually supposed to trigger when playing a hand, right ? (and also, does it work in a deck/SMODS.back ?)
Also, I've been wondering how to flag the played hand as debuffed ? I know that G.GAME.blind.debuff_hand() exist but it doesn't seem to work, or I misunderstood it's usage (seems to exist to return true if the current hand is debuffed) anyway, any help is greatly appreciated
are you looking to trigger cards one by one
nah not really, it's just that my deck's gimmick is that I can only play one hand type and any other one should be debuffed , so I guess not
What's the difference between context.after and not context.before?
{
message = "+2",
colour = G.C.yellow,
card = joker
}``` how do I make the joker shake and display the message, this currently has the message above the card, and no shake
do you guys consider selling an Egg to be "consuming" a food joker?
...it did not
context.before is before a hand scores (see: Space Joker). context.after is specifically after a hand scores (see: almost all Xmult jokers).
not context.before will also proc things like shops or opening boosters
really liking the trans-flag UI changes. But how does it affect the Plasma Deck?
good question
where did the frames go
lag
Wow, a pocket 7
better
i think i should add custom sleeves for my mod
real?
does anyone know how i can fix this?
huh
have you never seen.. the letter fridge magnets?
i have but how would that look on a sleeve
so just a fridge?
ah ok
i already have deck design
wait did you mean
card sleeves
i thought you meant like the deck sleeve
like each card has its own sleeve?
no like
i already have the deck back texture designed
so then what do you mean by sleeve?
or do you literally mean you havent added it yet
card sleeves is the name of a mod that allows you to combine two decks' powers, by applying a sleeve based on one deck to another deck
Is there documentation on the Balatro -> Lovely -> SMODS -> MOD Lifecycle? I'm wondering when our code gets injected and when certain things are ran.
anyway
if anyone wants to do cross mod content feel free to tell me
fuck it im making people spell pokemon names
my understanding is:
- lovely directly applies its code to the source code. In this manner, it's a complete rewrite/replacement of Balatro
- SMODS is additional framework that makes doing certain things easier, based on changes within lovely's rewrite. In this sense, it is a library (or "gem", as Ruby calls them) that your mod depends on.
Alright that much I was figuring. I was wondering how overriding methods in your code worked and what not. I've downloaded quite a few mods to see how things were being done, and other than the fact quite a few of them used 0.98 SMODS code, which made learning how to use the version 1 a little painful. I don't fully understand why we're not using lovely to just patch the code instead of overwriting certain methods. I'm not sure if it was bad practice or bad for the system, etc.
so... how do i make a list of colours to use?
with how the game is scoring things left to right, is it possible for me to have the scoring iterate left to right, then retrigger them in right to left?
so i guess i am not original huh
I'm trying to make a joker that triggers for a random suit each round like castle and ancient joker
I have code for it that's heavily copied off of ancient joker and it works but I don't want it to use ancient joker's randomization
however when I try to make the suit var its own variable it crashes and says it's a nil value
i'd say before everything is scored add all events to the queue
all i wish for in this world is to say 'if card then reverse please thank u end'
alas, i must add events
hi chat, how do i go about making a joker that retriggers other jokers? i tried copying some code from a joker that retriggers played cards but it doesnt work (does nothing), heres what ive got atm
calculate = function(self, card, context)
--[[ doesn't work, bruh
if context.repetition and context.joker_main then
return {
repetitions = card.ability.extra.repetitions,
message = localize('k_again_ex'),
card = card
}
end
]]```
i also tried pasting in some code from another mod but that just made it crash sadly
joker repetitions need to be enabled in your mod, for one thing
how do i go about doing that
SMODS.current_mod.optional_features = function()
return {
retrigger_joker = true
}
end
it also happens in context.retrigger_joker_check, not context.repetition
ah this would probably explain the nil value crashes
i just put this somewhere in my lua file i presume
do you like this art
graphic design is my passion
Anyone have any ideas as to why, when i split a lua file of multiple new challenges into seperate lua files for each challenge, now only one of them shows up in the menu?
It has that certain je ne sais quoi
The main file has to call other .lua files to load.
ahh duhdoy
SMODS.load_file("file.lua")()
ah geez…your hearts are debuffed
you can still get heart cards from standard packs
I'm working on custom boss blinds
ok ive made this (and enabled joker reps) but it still doesnt do anything, am i still missing something
calculate = function(self, card, context)
if context.joker_main and context.retrigger_joker_check and context.other_card ~= card then
return {
repetitions = card.ability.extra.repetitions,
message = localize('k_again_ex'),
card = card
}
end
end```
at least it doesnt crash though which is a good sign
this is gonna be so fun when it's done
look forward to people playing it
you can already try a beta version if you want
noted noted
i mean it's late now so my brain isnt functional enough for balatro but
ill keep it in mind
G.play.cards accounts for both played but unscored and scored cards right?
😭
2/4
why are you adding a new suit
because it's for a specific deck
I'm removing the other ones that are in balatro in that deck
Stillll seem to be having the same issue...
SMODS.load_file("Copycat.lua")()
SMODS.load_file("Golden_Bite.lua")()
SMODS.load_file("Mod_Madness.lua")()
SMODS.load_file("Stargazer.lua")()
SMODS.load_file("Cost_of_Business.lua")()
SMODS.load_file("Wild_Side.lua")()
SMODS.init_localization()
end
and then i removed the smods.init.etr from the other lua files... still just Copycat that shows up in the challenges list
well ain't that a bit annoying
If you had them @ replied before, why do it again? lol
as it happens its your mod im currently dissecting to try and make this work, any ideas on why card.ability.extra.retriggers in if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= card then if card.ability.extra.retriggers < 1 then card.ability.extra.retriggers = 1 end return { message = localize('k_again_ex'), repetitions = card.ability.extra.repetitions, card = card, } end would be nil?
at least thats what i think the crash log is saying ("attempt to compare nil with number")
how would i make a joker destroy a random card
i know how to destroy a selected card but not a random one
I'm not sure why you are using that within the init function? Just outside of it?
On which exact line is it crashing for ye?
Random where?
so i want to have it when the round starts destroy 1 random card in hand and gain 5 mult
(I assume Ali means whether you want it to be a random card from the played hand, from the deck, etc.)
Well, you can pick a random card currently held by local rndcard = pseudorandom_element(G.hand.cards, pseudoseed('optionalseedhere'))... then rndcard:start_dissolve(). Though, at beginning of a round... that's context.first_hand_drawn.
ok so i had it mostly right i think
i had context.full_hand instead of G.hand.cards and it did not like that
What about wrapping that card destruction in an event?
nop
Does it crash right after selecting the blind or when the hand is fully drawn?
right after selecting the blind
it seems the issue is that its trying to remove a card before the card even exists
EWWWWWW
sorry late reply, mb
this line
if card.ability.extra.retriggers < 1 then card.ability.extra.retriggers = 1 end
I was able to get somethings working... until I wasn't. Working on "sacrificing" cards. I have the methods hooked up but the buttons are behind the card. How should I go apart fixing it?
What's your config part of the Joker definition?
Why not try to kill a card from the deck then?
config = { extra = {repetitions = 1 } },
what the FUCK that is cursed
That'd explain it. The check is for config = { extra = { retriggers = 1 } }.
😭
ok so
uh
i got it to remove a card but for some reason it removes a card EVERY FRAME and crashes when it hits 0
what?
cursed
aah that would make sense wouldnt it
i thought it was a separate thing from like the context
ill give that a shot thanks lad
wait
i see the problem
i forgot the return statement
ok now it should work i think
basically i just looked at how Certificate adds a card and reinterpreted it for card removal instead
IT WORKS
is this deltarune reference
ok im still getting the same crash
calculate = function(self, card, context)
if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= card then
if card.ability.extra.retriggers < 1 then card.ability.extra.retriggers = 1 end
return {
message = localize('k_again_ex'),
repetitions = card.ability.extra.retriggers,
card = card,
}
end
end```
its still trying to compare nil with number
Is there a console so i can test out my mods?
DebugPlus
Thanks
yea debugplus
Respawn the Joker.
ah well whaddya know
it actually works now
balatro modding is weird i guess
thanks for the help
wait, what is the premise here? That every card has a letter on it, and that you can score points by spelling words?
yes
it's basically Scrabble
do you have a dictionary built into your mod?
yes
i can add any words I want to it
yoo that'd be sick
enabling letters by default
wooo
my mod should be compatible with cryptid
i tried to make my patches to be not invasive as possible
man i love being creative
Where can I find Jimbo's particles?
they are defined in card_character.lua I belive
Wonder if I could slap it on one of my playing cards
Found this
Can Editions or Enhancements take in draw = function(self, card, layer)
would this be the way to have a probability that could increase based off of odds_mult?
cool thx
Why does mobile modding us forbidden?
so a couple things
a. that joker that spawns is supposed to always be negative, what gives
b. the spawn looks a little fucked up?
any ideas?
(for context, i have this line always setting the second joker to negative)
I really like how the Antimatter Joker somewhat resembles Jimbo
One frame.
hello! i have a question, as usual
when a card has an event attached to it, is there a way for that event to call for another card to do something, or are events exclusively tied to the card they come from?
You should be able to call other cards.
where is the documentation about take_ownership? I'm trying to take control of Ramen to fix the bug I found (and I did leave a comment in #1237805810533531650 about it), but when I write the calculate function it keeps telling me things do not exist when they work perfectly fine for jokers I flat out created.
great! what is the way to do it?
If event is spawned from calculate of a Joker and what not and context.other_card exists, you can reference it.
how would i specify the card that i want to be used in the event?
(also assuming that context.other_card is used in the same place that card: would be?)
As long as it points to a valid card from where the event is added, a local variable within the event or outside of it could reference the desired card. If context is available to the event at time of addition, when context.other_card becomes a valid card reference, that can be used too.
sorry, im a little slow so i want to make sure i understand everything, so at the very start of the event, i define another card
As long as you're not overriding the original reference.
the original reference?
Is this for destruction of a card or something?
i want to try to add speech boxes to a second card, then the card is destroyed, yes
So the "source" card and the "target" card.
yeah! what i want to happen is
ive coded the "source" card to stop the event queue and play a series of speech boxes
when all those speech boxes are over, i want the "target" card to also play a set of speech bubbles before destroying itself
As long as you provide the "pointer" to the respective cards when creating said events, be it a local of something or context.other_card or w/e, you should be fine.
how would i go about using a local or context.other_card? apologies for making you explain everything
calculate = function(self, card, context)
-- card, context.other_card is valid here.
local sourcecard, targetcard = card, context.other_card
-- sourcecard and targetcard are also valid after this point, referencing the original card and context.other_card respectively
end,
right, so would this then call for the "Erlking" card?
There can be duplicates of that Joker, keep that in mind.
oh shit yeah
You can iterate over the held Jokers to find the exact one you need by iterating over G.jokers.cards and then storing the desired Joker "card" into a variable elsewhere, like an another local, but before the "event" code.
local sourcecard -- defining this as nil for now.
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.key == 'j_jcbb_erlking' then sourcecard = G.jokers.cards[i] end
-- other conditions can be added to the IF bit above, but if all of them pass, we set the earlier defined 'blank' variable to the Joker we found.
end
and sourcecard would be the card that im putting all the events in, so 'j_jcbb_heathcliff'
More of "referencing" the cards in said events. The same iteration could be done for finding the exact j_jcbb_heathcliff Joker card, but you should use a different local for it.
right, so that the whole event only happens once instead of applying to, in theory, every single copy of heathcliff you have, yeah?
To the exact pair of Erlking and Heathcliff Jokers, respectively.
yeah! yeah thats perfect
I barely use events myself anyway, but what Lua knowledge I do have tells me that it should happen like so. 🦐
Figured the bug out, apparently the sizing was wrong, UI Modding is kinda hard :/
oh gosh
is it bad i read this as hatsune as in miku
Lmao, I have an obsession with Cthulhu Mythos lmao. I can see how the blurry screenshot makes it sorta look like that at a glance
ah, one more question, you said i need to provide a "pointer", how exactly is that done in an event?
card, context.other_card are pointers. So is sourcecard in the other example when it is set to a Joker.
ah, cause i tried this but it doesnt seem to be working, so i think im doing something wrong here
You're not showing the full "context" of where the event is created.
oh sorry, do you need to see the full code?
Best to show the full context, yeah.
righto, here you go https://hastebin.skyra.pw/suxomecoci.pgsql
Which Joker is this being called from?
I guess I am testing UI in config now
Heathcliff
...not that I can really do much beyond this point, I barely know much about event ordering and such. 🫠
thats fine, no need to push yourself! i greatly appreciate the help youve given me up until this point
draw = function(self, card, layer)
local voidParticles = {}
for i = 1, 2 do
voidParticles[i] = Particles(1, 1, 0, 0, {
timer = 0.05,
scale = 0.3 * i,
initialize = true,
lifespan = 1,
speed = 4 * i,
attach = self,
padding = -1,
colours = {G.C.WHITE, lighten(G.C.PURPLE, 0.1)},
fill = true,
})
end
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function ()
for i = 1, #voidParticles do
voidParticles[i].fade_alpha = 0
voidParticles[i]:fade(0.3, 1)
end
return true
end
}))
end
Trying to make a particle effect emitting from a special Edition, but attach = self is giving me issues, the error is attempt to index field "major" (a nil value)
Omitting it will just make the card itself and the particles spawn on the top left corner of the screen, any insights?
how would I get a joker to make an exact copy of itself
I'd imagine just look at what Invisible Joker does and go from there
If you want an exact copy, you should check invis joker like OW said, especially copy_card
finally finished my first joker with art! Im not the best when it comes to art lol
The attach is where the particles spawn, attached to a specific center. So attach would be the card’s center
I managed to figure it out but there are too many particles, what parameters are there to:
- reduce the frequency to be as sparse as Jimbo's particles
- move the particles behind the card
- properly clean up particles so that it doesn't lag the game over time
This is my current iteration:
draw = function(self, card, layer)
local voidParticles = {}
for i = 1, 2 do
local particle = Particles(card.T.x, card.T.y, card.T.w, card.T.h, {
timer = 0.3,
scale = 0.3,
initialize = true,
lifespan = 2,
speed = 1.2,
attach = card,
padding = -1,
colours = {G.C.WHITE, lighten(G.C.PURPLE, 0.1)},
fill = true,
max = 10
})
voidParticles[i] = particle
end
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function ()
for i = 1, #voidParticles do
voidParticles[i].fade_alpha = 0
voidParticles[i]:fade(0.3, 1)
end
return true
end
}))
end
since you put it in the draw function it’s making new particles every frame
I’d recommend making particles once when the card is given the edition, but I’m not sure if the game would remove them at some point
I see
Oh and it's uber delayed as well, it seems like there's a limit on how long these particles can be emitted before disappearing entirely
I wonder how Jimbo's particles did it ^
by doing it once and leaving it
I see
Hang on lemme figure it out
That kinda makes sense because if I switch the Edition with the particles away, the particles will still remain
You have to remove particles as well iirc
I'm using this
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function ()
for i = 1, #voidParticles do
voidParticles[i].fade_alpha = 0
voidParticles[i]:fade(0.3, 1)
end
return true
end
}))
But not sure if it's actually removing particles in the backend
And also wouldn't that mean that particles would be rendered differently between viewing it in Collections vs obtaining it through Booster Packs
particles automatically remove themself when their scale goes below 0
but the particle spawner itself never goes away i dont think
unless you call remove on it
Do you have any other examples of your work using particles aside from the fire dragon explosion, maybe something like a continuous particle effect
i have this to make a card look like its bleeding, it is continuous but i remove them myself after a couple seconds
its in the update function and it makes 1 particle spawner
i havent tested if it works properly with anything other than being the in the hand
update function
since its part of an enhancement
Alright I'll give it a go
probably not the best implementation but i dont think balatro has a start function like unity does
Is the removal defined anywhere?
the card that made the card bleed runs fade then remove on the card's particles
alrighty then
Hmm doesn't seem to render any particles in the holding hand, but does so in collections (although it does keep ramping up)
you have to set card.config.particles to something or else it will keep making them
you could set it to true after all the particles are made
cool shader
Ayy cheers but it's a bit shite
The pattern doesn't move when rotating the card, only the shininess
Also it just seems to fade out over time to become a flat purple
config = {
particles = false,
},
....
update = function(self, card, layer)
if not self.config.particles then
voidParticles = {}
for i = 1, 2 do
voidParticles[i] = Particles(0, 0, 0, 0, {
timer = 0.015,
max = 1,
scale = 0.3 * i,
initialize = true,
lifespan = 1,
speed = 1 * i,
attach = card,
padding = -1,
colours = {G.C.WHITE, lighten(G.C.PURPLE, 0.1)},
fill = true,
})
voidParticles[i].fade_alpha = 0
voidParticles[i]:fade(0.3, 1)
end
self.config.particles = true
end
end
Like this? If so, the particles aren't spawning at all, not in collections nor in hand (although it is spawned with the debug tool instead of legitimately obtaining it)
i think max = 1 would only make 1 particle spawn
also, running fade will permanently make the particles invisible
How do you set a joker to bounce in alert like DNA, trading card, or an invisible joker that's ready to sell?
Is that code handled in the ui files?
juice_card_until(card, eval, true)
you'd use juice_card_until
where eval is a function that when it returns true, it stops juicing the card
Oh hey it worked!
But a small nitpick, how do you set the particles to be at the back of the card
And a couple more problems
- It doesn't render when it's in the holding hand, regardless of how I obtained this Edition
- It does render in Collections, but only the first time I opened it, after that the particles stop rendering, I assume that it's because I flipped the particles to true and then left it there without resetting it
@wintry brook Any insights on the first two issues?
Thanks!
WHY THE FUCK IS THERE 2 SAME JOKERS
checking if the card is visible before making the particles should work, probably destroy the particles when the card isnt visible too
What's the context for checking whether the card is visible or not
z-ordering stuff isnt native to love2d i remember, so im not sure how to put it behind the card
card.states.visible
im not sure how exactly it works so it may be finnicky but it seems to do the trick for the most part
gotcha
But oof kinda a shame that we can't configure z-ordering, I wonder how they rendered Jimbo to place the particles behind him
My theory is that it rendered the particles first before the actual Jimbo card
ive been trying to figure that out myself, i think the game just makes sprites in order of when they should be rendered. so stuff in the back first then stuff on top later
i know there is a drawhash, but i feel like we may be over complicating things if we edit the draw hash manually lol
how do I delay an event?
What I want to do is have my joker destroy itself, then RNG either destroy one of your other jokers to clone itself back into existence with double the old xMult, or buff another joker. I'm currently working on the first scenario, and right now, the clone appears even before the original joker destroys itself.
I don’t think jimbos particles are attached to the jumbo card
There’s like a dummy object behind it from what I can tell
its basically just the order things get rendered in. its how most love2d projects do z layering
change the delay
Good lord if that's the case
I don't really look forward to figuring out how to parent a dummy object anywhere I want the particles to be
At least that’s how I understand what you screenshot
Also using a particle boolean is also kinda iffy, once it's set to true, any other times of seeing that card with particles again, the particles won't render
Like if I open my Collections on the first startup, sure it will render, but any other time like opening it up the second time or more, or subsequently going into gameplay to get the card, the particles don't spawn
All I have currently hmm
it works for me because if the particles ever get destroyed, self.config.particles gets set to nil
but since you have multiple sets of particles you may need to do that a little differently
Hopped off my laptop for the day so I won't be able to make changes for now but
So it might be easier if I use 1 type of particle instead?
i set the variable itself to the particles, which means if the particles are ever destroyed or whatever they're attached to is destroyed, the variable sets itself to nil
wtf how do i
Mmm I'll try it out later, thanks
i just check if particles exist and put the particles in the update func
dont attach particles to config 😭 attach it to children
that sounds wrong
😭
true, my original reasoning was hoping that the particles would go away if you gave it a new ability but i realize that doesnt work
So config.particles is a no go?
Aight
just :remove the particles when you're done with them
card.children.center:draw_shader('tint', 0, card.ARGS.send_to_shader)
i might've fucked up
SMODS.Shader{
key = "tint",
path = "tint.fs",
}
the what 😭
why is it 1.0.0b-DEVELOPMENT
😭 idk maybe it's the debug mod
Saturn moment????
anyhow idk if i loaded the shader correctly
i am not drawing from edition
i am drawing from card:draw
shrug
im trying to make it so if a king or queen is destroyed then it creates a copy of itself but i seem to be running into a crash here, am i dong something particularly wrong? edit; im stoopid, forgor mod prefix 💀
testing extreme conditions
according to our legally binding contract, the entire smods organization is now mine because aure pinged me
what will you do with this newfound power
when did I sign that 🤔
I got my first joker working 💜 💜
til
not acting like my legal name isn't public information
😭
your shader code is wrong with this error
at least it's not trying to index nil
the index nil was because you missed your mod prefix off the shader name
💥
Once you're done with fixing it I want to see your shader lmao
i just need a tint shader so i can have wordle letter fx
If im using load_file to navigate into a folder is it just SMODS.load_file('folder/file.lua')() yes it is
If I wanted to add another tab here, after challenges, how could I do so?
I want to add a new game mode, but I don't really like how VitualizedMultiplayer mod did it
how do we get rid o0f a joker, like the banans that expire? im trying start_dissolve, but it keeps crashing
Hey guys I would like to get into modding the game, where can I find documentation?
ty
you can probably use the take ownership function and then remove the joker like that
Im trying to make one of mine expire, but when it goes to remove the joker it crashes
I dont need to take ownersdhip, just used the bananas as an example
figured it out, I was trying card.start_dissolve(nil, true) but its supposed to be card:start_dissolve(nil,true)
ohh i see
yeah you can also do card.start_dissolve(self, nil, true)
the : just puts self for you
update = function(self, card, layer)
if card.states.visible and not card.children.particles then
voidParticles = {}
for i = 1, 3 do
voidParticles[i] = Particles(1, 1, 0, 0, {
timer = 0.03,
scale = 0.3,
speed = 1.2,
lifespan = 2,
attach = card,
colours = {G.C.PURPLE, lighten(G.C.PURPLE, 0.15), darken(G.C.PURPLE, 0.2)},
fill = true
})
end
end
end
So is it like this? config is currently empty
uhhh no
Ogh
why do you want 3 sets of particles anyway
3 colours
update = function(self, card, layer)
if card.states.visible and not card.children.particles then
card.children.particles = Particles(1, 1, 0, 0, {
timer = 0.03,
scale = 0.3,
speed = 1.2,
lifespan = 2,
attach = card,
colours = {G.C.PURPLE, lighten(G.C.PURPLE, 0.15), darken(G.C.PURPLE, 0.2)},
fill = true
})
end
end
At least, it's how Gnar Gooba did it
colours already lets you use multiple colors
Hmmm it is nicely rendered in Collections, but not in gameplay
But granted, the Edition was spawned using the debug mod
oh god wtf
if you do eval dp.hovered.states.visible what does it say
oh my god fuck off
You need to add tint somewhere in your vec4 effect function, even if it's useless
Here's how I did mine:
float energy = pow(void_pattern + waves, 2.0) * voidwalker.x;
Replace voidwalker with your shader's name
It also doesn't appear in shops either
man i just want to tint card green when the letter is correct 😭
Ogh
and :remove in on_remove
Where do I put those? Are they a part of the Particles function
no, SMODS.Edition
hi aure's cat
Like this?
i believe so
yahoo
How crazy can I go with particles
and now:
- copy that to
on_load - change
particlesto another unique variable name incase multiple mods use it
fuck around and find out
Does it have uhhh
gonna need about 1k more particles on screen man
Particle spread direction
This effect spreads out in all directions, but what if I want to make one that's just like a waterfall
idts
Aw
How much hell would I get myself into if I were to look into the roots of particle movement rendering
is there a way to make the gtame play a custom sound when it plays the other joker effects, like when it shakes? have it setu how I thought it would work, but it plays the sound right when the cards are played instead, but the joker shakes at the expected time
i'd advise against it
Man
if you're on newcalc, you can return sound with the sound key in your joker return
id love to do a similar effect, if it's fine with you would i be able to peruse your code for this in full? :3?
The swirl or the particles
the particles
SMODS.Edition({
key = "voidwalker",
shader = "voidwalker",
loc_txt = {
name = "Voidwalker",
label = "Voidwalker",
text = {
"Nothing yet!"
}
},
disable_shadow = false,
disable_base_shader = false,
on_apply = function(card)
card.children.particles_voidwalker = Particles(1, 1, 0, 0, {
timer = 0.03,
scale = 0.3,
speed = 1.2,
lifespan = 2,
attach = card,
colours = {G.C.PURPLE, lighten(G.C.PURPLE, 0.15), darken(G.C.PURPLE, 0.2)},
fill = true
})
end,
on_load = function(card)
card.children.particles_voidwalker = Particles(1, 1, 0, 0, {
timer = 0.03,
scale = 0.3,
speed = 1.2,
lifespan = 2,
attach = card,
colours = {G.C.PURPLE, lighten(G.C.PURPLE, 0.15), darken(G.C.PURPLE, 0.2)},
fill = true
})
end,
on_remove = function(card)
card.children.particles_voidwalker:remove()
end,
discovered = true,
unlocked = true,
config = {},
in_shop = true,
weight = 3,
apply_to_float = true,
loc_vars = function(self)
return { vars = {} }
end
})
bet
Replace voidwalker with your own particle name, just to be safe so that it doesn't conflict with other mods
I think you can slap it on any card type, Jokers, Enhancements, Editions, etc
yea thats what i was thinkin
particles are super fun to mess* around with
this looks expansible
I only wish for proper particle direction
they just kinda aimlessly drift by default right
yeeeeeer
But also another one that I wish it has is z-ordering
oh yeah its forced on top eh
fuck the shader
Rn the particles render on top of the card instead of beneath it, the way to mitigate it is probably through a very convoluted way
im doing this
@crisp coral Sorry for the repeated pings but
Do you mayhaps have any insights on z-ordering or are we fucked
nay
:(
all cards in deck is G.deck.cards right?
ye i think
damn maybe ive fucked up my blind in_pool
how do i add condition to the ui nodes
is it even possible without patching the whole thing out
depends on what you mean by deck
Hang on, the draw function for Editions, what's the layer parameter for? In the game's source code, there are layers for the card itself and the card's shadow, maybe I can somehow... cram the particles in between them?
G.deck has only the cards in your deck pile, that's the ones you haven't drawn yet
ahh
G.playing_cards is a list of all cards in your full deck
you can patch in ternaries like condition and case1 or case2
why does jimbo look so funny with this effect
Grape jimbo
is it possible to select a joker to copy?
as like a tarot ability
instead of being random
I think changing which part of G.I the particles go in would affect the z ordering
It’s hard coded right now but could easily be adjusted to take a variable too
Where do I find this G.I
grimbo
This bit in particular
I believe you could change it to a different one and it would be layered differently
So I need to find a way to change G.I.MOVEABLE? Is it an int? Or something?
Just patch this line in particular to be something like table.insert(config.layer or G.I.MOVEABLE, self)
Then in the particle definition you should be able to do layer = G.I.whateverthekeyisIdontremember
Maybe NODE?
Patching adds lines of code doesn't it, how do I replace a line with a patch
No idea what that is
Set the type of patch to at rather than before/after
is there an smod equivalent to copy_card? @frosty dock
Can I put eval_card(G.jokers.cards[i], {cardarea = G.jokers, remove_playing_cards = true, removed = {context.other_card,}}) after context.other_card:start_dissolve(nil, true) in my joker's calculate function in order to tell other jokers "Hey, I just destroyed this card, um, in case anyone wants to know." since "Played cards that did not score" isn't a case vanilla game has prepared to add into context.removed?
no, should there be?
Wanted to make a joker card that can just copy another
thats a key
Like this?
is stock copy_card lacking any needed functionality?
what's the key for doing copy card
cause I doubt it's just copy_card(set = G.jokers.cards, key_append = 'randomteleport')
doesn't copy_card take a card as input?
No your pattern is the line you want to replace
Oh I keep forgetting that it's not after
if G.STATE == G.STATES.SMODS_BOOSTER_OPENED then
play_sound('timpani')
copy_card(set = G.jokers.cards, key_append = 'randomteleport')```
That’s not how to use copy card
And as for layer = G.I.whateverthekeyisIdontremember, where do I put it around here? ^
@wintry solar
what is the proper way
The key is voidwalker for the Edition, fm_voidwalker with prefix
you're using that like it's similar to SMODS.add_card
it just takes a card as input
like G.jokers.cards[1]
G.I.NODE I think
or pseudorandom_element(G.jokers.cards, pseudoseed('bleh'))
You can also add a 2nd card to copy it on to if needed
so I would basically have to rip this line from the vanilla game and rework it?
local card = copy_card(chosen_joker, nil, nil, nil, chosen_joker.edition and chosen_joker.edition.negative)
card:start_materialize()
card:add_to_deck()
if card.edition and card.edition.negative then
card:set_edition(nil, true)
end
G.jokers:emplace(card)
return true end }))```
Guhh I'm still very confused
Where do I put this G.I.NODE, the patch or my Edition with the particles
Oh, where 😂 it’s in the particle table
that's just because the same expects blinds to have a name for some reason, so smods autofills name with the key
it's not generally true that this is the key
Can you write out a snippet of code to point where you are talkin about I'm having trouble comprehending 😭
G.GAME.blind.config.blind.key
I need a little help here in having my custom collection tab show a card type I created
But in image 3 I'm unsure about what to put in the red rectangles (I took the code from smods override which defaults to the first picture)
Does anyone happen to have any suggestion
Here
why are you using SMODS.Center like that
Ooooooooooh
It was originally Tag(), I was trying something but that didnt work
Also can't use use the smods collection util thingy for this
Just cram in G.I.NODE like this?
wait nvm
if this is like tags, that's different
I don’t think they’re like tags from memory
The original
I'm confused why it'd be based on the tag collection function then
Because you said I could make use of these 🥹
Tag collection UI is the odd one out
everything else (except blinds obviously) is standardized
Custom objects are standardalized?
Mine is neither a Joker nor a Consumable
Hmm particles are still appearing on top of the card, am I doing anything wrong?
Probably not, it probably just doesn’t work
Aw
No diggity
the util doesn't care
it just needs to be a center
Basically what im trying to do is adding a new tab in here (done) and show the custom card type I made
not even that, it just needs to be able to be put on a card
create_UIBox_your_collection_jokers = function()
return SMODS.card_collection_UIBox(G.P_CENTER_POOLS.Joker, {5,5,5}, {
no_materialize = true,
modify_card = function(card, center) card.sticker = get_joker_win_sticker(center) end,
h_mod = 0.95,
})
end
for instance this is the code for the joker collection
if G.STATE == G.STATES.SMODS_BOOSTER_OPENED then
copy_card(G.jokers.cards, nil, nil, nil, 'randomteleport')
card:start_materialize()
card:add_to_deck()
G.jokers:emplace(card)
elseif G.STATE == G.STATES.PLAY_TAROT then
copy_card(G.jokers.cards, nil, nil, nil, 'randomteleport')
card:start_materialize()
card:add_to_deck()
G.jokers:emplace(card)```
you're still using it like create_card
so... I've been overcomplicating things
what part about "it takes a card as argument" is so confusing to you?
yes
local _card = copy_card(G.jokers.cards[1]) (with materializing, emplacing etc.) copies the leftmost joker for example
oh wait I think i see what ur saying now
I can't break it down further, really
I think I managed to almost figure it out? But it just duplicated my particles, BUT there are some that appeared behind the card
Any insights on how I should proceed? @wintry solar
Hmmm, would have to delve deeper into how they’re drawn
let me do a recap a sec
So I can remove this part and make it an ObjectType instead
And then for each individual alignment I do SMODS.Center?
Said duplication: some particles have a second copy trailing behind it
It’ll be drawing them twice now
no I'm just talking about the collection
I'm saying you can use the util on anything that can belong to a card
Yeah I just need to find a way to remove the top layer of particles
whether it be a conventional center or not
since particles' draw is automatically called by nodes engine, create a copy of its draw function for used in Card:draw and make draw nil?
😭
lmao this broke the game but in a funny way
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = """ {n=G.UIT.R, config={align = "cm",padding = 0.15}, nodes={"""
position = "at"
payload = """
{n=G.UIT.R, config={align = "cm",padding = 0.15}, nodes = (G.GAME.current_round.advanced_blind) and THOUGHT_BOSS_BLIND or {
"""
overwrite = true
match_indent = true
THOUGHT_BOSS_BLIND = {
n = G.UIT.B, config = {
w = 2,
h = 0.6,
padding = 0.1,
}
}
I have a joker card I can just drag where ever I want to
add the materializing and emplacing stuff
I'm confused here, what do you want me to make nil, Card:draw or Particles:draw?
Oh gotcha
guess i'm still missing something but this is kinda funny
if G.STATE == G.STATES.SMODS_BOOSTER_OPENED then
local _card = copy_card(G.jokers.cards[1])
card:start_materialize()
G.jokers:emplace(card)
elseif G.STATE == G.STATES.PLAY_TAROT then
local _card = copy_card(G.jokers.cards[1])
card:start_materialize()
G.jokers:emplace(card)
end```
why do you have two conditionals like that?
I've left only this part, but which definition do I need to call
why card and not _card...?
Oh yeah, Eremel, can I DM you for a spot of help on figuring out the particle system
We're real close to a solution
yeah sure
So uh... bump? Is this how it works?
what context are you destroying cards in?
@frosty dock do I need a create card fuction as well?
you need to use _card not card
Made it work but I'm having that issue of undiscovered text and sprite, does this happen to be standardalized as well?
context.after
ah finally
Holy molly that's a beeg number
can you not use context.discard and let it handle destruction for you?
too small :(
I believe I have stated that the cards I want my joker to destroy are the cards that was played but didn't score.
okay? and that stops you from using the standard way because?
Because players played those cards instead of, you know, discarded them.
And vanilla method only allow me to destroy scored cards.
Did a search through chat history but couldn't find a clear answer.
I decided to try my hand at learning lua, and I love Balatro, so modding it seemd like a good way to learn.
I'm new to SMODS, and while the documentation on github is fairly comprehensive, it's unclear how to do what I want.
TL;DR: How do I detect when a blind is skipped, and when a boss is defeated?
no, but your subsequent calls are on card and not _card
if context.skip_blind then
and if context.end_of_round and not context.game_over then
https://github.com/Steamodded/smods/wiki/Guide-‐-Joker-Calculation
slight correction for the second one
Ah, must have missed that. Thank you 👍
context.end_of_round and context.game_over == false
game_over is nil most of the time, so this makes for a unique context while not game_over doesn't
Alternatively use main_eval if you don't care about the value of game_over
aure how can I handle the undiscovered status?
i'm fairly certain main_eval doesnt work
Awesome! Thanks. Wasn't expecting such a quick and concise answer. Possibly the friendliest modding chat I've ever been in 😄
by not doing whatever weird thing you're doing with is_discovered and doing it the same way vanilla centers do?
I've found cardsleeve doing this
my card type should never be "locked" but only undiscovered (so I switched it to check for discovered instead)
but with the locked property
that's to retroactively handle unlock all
which steamodded should soon handle automatically
but per se this check should be correct no?
yes, but the card will only take the discovered state on the center into account when making the sprite
oh my god im so stupid, i forgot to set it to the "other" queue so it was getting blocked, this works actually so thank you so much LOL
when I make the actual center I set discovered to false, and the check in the screenshot is only for counting the tally
removing it breaks the counting completely
I suppose it has to be something with my Center type not having its own undiscovered sprite?
But it has the floating circle so im a bit confused
"pos = { x = 2, y = 3}"
This means x = 2(px)
And y = 3(py)
Yes?
its the position in the spritesheet
Yeah i mean like
Okay like in cryptid code for the reeboot code card it says
Pos = ( x = 2, y = 0)
And he defined px as 71 and py as 95
yeah
oh wait
pos = { x = 2, y = 3} means x = 3(px) and y = 4(py)
so, have you tried making one?
I copied it from vanilla's undiscovered sprite, but I'm not sure where to tell it it should set that sprite instead
SMODS.UndiscoveredSprite:
does this not apply for custom center
x=0,y=1 is the one below that, etc
would have to check, maybe it only applies to consumable types given it's on that page
mr John s mods why is my ui not being updated after i changed a variable
x=2,y=0 is the third sprite in the top row
do i need to recalculate the ui
you need to recalculate or use something more dynamic, i.e. using object nodes
makes sense
Is somewhere a place where I can read about difference between old-calc and better-calc?
I see thanks
anyone have any idea how to set add_joker edition to only negative or polychrome??
https://github.com/Steamodded/smods/discussions/372
I know of this one
i feel my mental health improving already
(i went up and am getting food after hours of staring at the code all day)
If I wanted to give that undiscovered sprite to all of my cards of that center, which key would I need to give?
-# its likely I misunderstood this too
the set did not work
I probably need to give the center a custom type to use this
key = 'Alignment' doesn't work?
So if i have px ad 64 and py as 94
x = 1 and y = 0 would have the (x = 65, y = 0) to (x = 129, y = 94) as the area where the sprite is yes?
Just making sure
no
alright
they keep appearing with their discovered sprite plus that floating circle
spritesheet is like this. the icon with the lock is {0,0}
{0, 1} would be the one right below
and so on
2 pixel space between each card
it doesn't update the text 🥲
for Jokers, at least
So when I'm defining px and py am i setting it as the bottom right corner of the card or do i include one pixel of space for each axis
Final question
have 1 pixel of dead space around the card
so the atlas is 71x95 but the card is 69x93
this is to prevent pixel bleeding^
Hey newbie here, I made a quick joker that I am trying to get to just show up in the collections and Im not sure what ive done wrong. this is what i currently have
its in the correct mods location, should balatro/steamodded auto recognize it
this doesnt work either :l
Final question
you're missing some "quotation marks"
and the atlas path should include the file extension
'palps_card.png' for example
RIP
Hi, is there any way to debuff the played hand easily ? if so , in what context should I put it in and how exactly do I call it ?
your key for your joker and path for your atlas are not strings
oh i didn't see john smods msg
how do I make a joker twitch without giving a message
card:juice_up()
Okay so since my first card is 62 by 92 my atlas would be 64 by 94
or you could also use https://github.com/Steamodded/smods/wiki/calculate_functions depending on your problem
Okay so lets say i wanted a card to give you one legendary joker
Nvm scapping the idea
oh simple, just use The Hanged Man
Is there a way to make a custom deck start with a specific joker?
Welp i cant even get the mod to load
Id imagine you can just do v:set_debuff within context.poker_hands no?
So if a hand contains a hand type it's debuffed
If you want specific cards to cause others in the scored hand to be debuffed you can call their ids and make anything but the ids debuffed
whose mod
mine
you should play 8 wildcards
this is all i need for now yes?
I didn't even know there was a context.poker_hands to be fair, I started modding yesterday, thanks for the help btw ! I'll try it right now
also what exactly am i supposed to have in lovely.toml
I'm only about 3 days in myself!
Godspeed to you
I've only been making jokers and got about 18 of em so far haha
I thought G.P_SEALS.Purple would work... 🤔
damn you're fast man , I'll try doing some jokers aswell after I've finished my deck ! (I wonder if I can even do what I want to do in SMODS.back ?)
I just obsess over silly things and this caught my interest
I'm very much still a wee baby compared to some of the people here, but it's been a fun journey
If you have some questions regarding jokers later on feel free to dm :)
how do you check if there is spaces in joker area?
literally same here, started yesterday and I think I've got about 12hours of modding in the last 2 days lmao
well 10 of those 12 are trying to understand what I'm doing but it's fun
well thanks a lot, I'll definitely come by
How could I make my own stake that only adds rental jokers
it should 🤔
Is this latest smods build?
that's the only thing I can think of too ^
You had to do funny things to get seal info queues before a recent change
yeah works perfectly fine on 1326a
so, on the stakes wiki, theres this. If i want to only use the Black Stake and Gold stake, would i list these under applied_stakes
applied_stakes: An array of keys of stakes that should also be applied when this stake is active. This is evaluated recursively to include all stakes applied by applied stakes, so you usually don't need to specify multiple stakes here.
Gold stake will apply all the other stakes
decks support all (almost all?) the same contexts jokers do if that's what you're wondering about
i know, but i only want the effects of gold stake without the others
yeah that's what I'm wondering about ! thanks
thing is , for example, context.main_scoring doesn't seem to work
check out e.g. riff-raff's code
yea i figured it out but thanks
Is there anyway to even do this
Is this for a custom stake?
You’ll probably just have to make them your own stakes effect then
making sure this is all correct
is that a localization file?
I guess that's the reason.
yeah some of them won't match perfect, main_scoring might joker only
okay, if i want to only have it use White Stake as the applied_stakesm what do i feed it, because if im reading it correctly, it seems to give gold/the highest stake
Why do you need it to apply white stake?
im assuming it applies everything if not fed anything, no?
