#💻・modding-dev
1 messages · Page 654 of 1
if you mean the fiasco between mayhem and pw, it's been resolved lredy
im assuming that its the same jen
fucking keybord
this shit won't let me type z or a
does this work?```lua
-- local pool = {}
-- for _,v in ipairs(G.P_CENTER_POOLS.Consumeables) do
-- if v.hidden and not v == "jen_omegaconsumable" then pool[#pool+1] = v.key end
-- end
-- local random_key = pseudorandom_element(pool, "random_rare_consumeable")
-- if random_key then SMODS.add_card{key = random_key} end
-- return {
-- message = "Har Har Har!",
-- sound = "busterb_gfreddygiggle",
-- colour = SMODS.Gradients["busterb_GoldenFreddyGradient"],
-- card = card
-- }
i mean it's still in comments but would it work
idk if it will work but it should probably be v.key ~= "c_jen_omegaconsumable" instead of not v == "jen_omegaconsumable
Struggling a lil bit here with Jokerforge (I'm very much a begginer, bear with me)
I'm trying to create a joker that has a 1 in 3 chance of creating a Negative Tarot Card and 1 in 10 chance of creating a Negative Spectral Card once a Tarot Card is used. However, I only want this joker to activate if the Tarot card used is itself NOT negative, meaning that these chances only happen if it's a normal Tarot card. The way it's set up now, though, makes it so Negative Tarot cards can generate more cards. I've tried messing with stuff a bunch in the jokerforge editor, but how can I basically tell it:
1 in 3 chance of creating a Negative Tarot Card and 1 in 10 chance of creating a Negative Spectral Card once a NON-NEGATIVE TAROT CARD is used
That’s how you blacklist a specific pool?
ah is it a pool
that's how you'd blacklist a specific one
Let me check
If there's no way to check for editions of consumables, you'll have to visit the Joker Forge discord and ask for this to be implemented
I think maybe there is a way, I'm just too much of a noob to figure out, lol. I just joined that server and asked it there though so we'll see
Joker Forge is still a wip, so maybe there just isn't. They're planning on implementing everything from the vanilla game, but it takes time
I don't have much programming experience and I just started messing with jokerforge a few hours ago so there's definitely a lot of stuff I don't know about yet, but if it doesn't have it I'll figure out a workaround
Welcome to the modding scene :)
Thanks! I'm already having fun
That's the important part <3
Ok just got confirmation that this is in fact not doable in Jokerforge
However I could export the joker from jokerforge and edit its lua script in a text editor to make that check functionality
How do I find out what this check would look like in scripting, though?
context.using_consumeable and (not context.consumeable.edition or not context.consumeable.edition.negative)
https://github.com/Steamodded/smods/wiki/Calculate-Functions#contextusing_consumeable
https://github.com/nh6574/VanillaRemade/wiki#how-do-i-get-if-a-card-has-a-specific-editionenhancementsealsticker
ok they are a consumable type
the idea was that you can spawn any consumable except if they're an omega consumable
I am losing my mind.
return { key = key, vars = {localize({key = self.config.voucher, set = 'Voucher', type = 'name_text'})}}
This works and gives me a voucher.
But when I try the exact same code for a different deck it doesn't work anymore. Is this even valid code for generating a voucher? I'm starting to think it isn't.
milk
idk```lua
if v.hidden and not v.set == "jen_omegaconsumable" then pool[#pool+1] = v.key end
do you write it like this?
Thank you... But now I have no idea how I am getting a voucher then. I straight up don't have any code for it at all then, and yet it's appearing. So, I dunno, but at least I can start looking elsewhere now.
Getting a crash when I open the collection page with the joker. What am i messing up?
whats the crash log?
this part doesnt affect the collection
I think it has something to do with me editing the script generated from jokerforge?
Running the mod generated from jokerforge without changing anything manually in the code works fine
Ok nevermind I must have messed something else up, doesn't crash anymore
Ayooo this worked now, thank you so much!!!
whats the internal value for the rounds number
do i write it like this```lua
if v.hidden and not v.set == "jen_omegaconsumable" then pool[#pool+1] = v.key end
local pool = {}
for _,v in ipairs(G.P_CENTER_POOLS.Consumeables) do
if v.hidden and not v.set == "jen_omegaconsumable" then pool[#pool+1] = v.key end
end
local random_key = pseudorandom_element(pool, "random_rare_consumeable")
if random_key then SMODS.add_card{key = random_key} end
or is it still wrong
how would I get an animated joker atlas to only play once instead of looping?
and if not possible can I delay an event function the exact number of frames to change the sprite position?
testing having the floating sprite large than the centre but i can't figure out how to move the pivot point to the correct point
i don't understand what's causing this error.
was it some change in the past half a year's worth of steammodded development? '-';
i released my mod to the public today and no-one's able to play it because of this and i don't understand this error in the slightest
and if i comment that out, it just moves onto the table declaration below.
these are standard table declarations
and if i comment all those out, it doesn't like an if statement that's looking at a boolean variable
what was changed????
was the entirety of lua massively updated while i wasn't paying attention???
...turns out i had an extra comma earlier
how do i level up a random hand
SMODS.PokerHands is a complete table of all available hands, hit it with a pseudorandom_element
@true jasper
thank you
what if it hurts it
apologies, give it a gentle tap with a pseudorandom_element
does anyone remember how to spawn jokers from collection via debugplus? i forgot
ok so i am crazy. doesn't work
help
nvm, my game was being screwy, it's fine

i'm just cursed today
PSA: do not work on balatro mods while heavily sleep deprived
I forget
can you use debugplus to print something? Like printing the current state of G.consumables?
eval
ah, sick
eval will basically just run whatever you put after it and print out stuff if it gets a string or table, but you can just use it like a print function
is there a way to get it to only be discovered hands
I'd hope there's a table of only visible hands in G.GAME somewhere, but I don't know off the top of my head
worst case you can make that table yourself first by looping through smods.pokerhands and checking the hand's visible value/function
Are there any guidelines as to how posts are worded and organised in modding, aside from the obvious? Trying to prepare for my first public mod upload, planning on keeping my more basic modding questions in that mod's thread and I'm trying to get most of it right on my first try
welcome back 
No strict guidelines, do whatever you think sounds good lol
Got it
local _poker_hands = {}
for k, v in pairs(G.GAME.hands) do
if v.visible then
_poker_hands[#_poker_hands+1] = k
end
end
local hand = pseudorandom_element(_poker_hands, "your_seed")```
No, it's if SMODS.is_poker_hand_visible(v.key) not if v.visible
how would I override the effect of an previous voucher without unredeeming the previous tier
.visible of poker hands also can be a function.
what am i doing wrong with this voucherlua redeem = function(self, card) local rarity_map = { busterb_Grandiose = 'busterb_Dreamy', busterb_Secret = 'busterb_Fantastic', Common = 'Rare', Uncommon = 'Rare', cry_cursed = 'cry_exotic', crp_abysmal = 'crp_mythic', unik_detrimental = 'unik_ancient', valk_supercursed = 'valk_exquisite', jen_junk = 'Rare', jen_omegatranscendent = 'cry_exotic', jen_omnipotent = 'cry_exotic', jen_transcendent = 'cry_exotic', jen_wondrous = 'cry_exotic', jen_ritualistic = 'cry_exotic', jen_miscellaneous = 'Rare' } local _, key = pseudorandom_element(SMODS.Rarities, "cogito").key key = rarity_map[key] or key local card = SMODS.add_card { set = "Joker", rarity = key, edition = 'e_negative' } create_shop_card_ui(card, "Joker", G.shop_jokers) card:set_cost() card:start_materialize() G.shop_jokers:emplace(card) end, calculate = function(self, card, context) if (context.reroll_shop or context.starting_shop) then local rarity_map = { busterb_Grandiose = 'busterb_Dreamy', busterb_Secret = 'busterb_Fantastic', Common = 'Rare', Uncommon = 'Rare', cry_cursed = 'cry_exotic', crp_abysmal = 'crp_mythic', unik_detrimental = 'unik_ancient', valk_supercursed = 'valk_exquisite', jen_junk = 'Rare', jen_omegatranscendent = 'cry_exotic', jen_omnipotent = 'cry_exotic', jen_transcendent = 'cry_exotic', jen_wondrous = 'cry_exotic', jen_ritualistic = 'cry_exotic', jen_miscellaneous = 'Rare' } local _, key = pseudorandom_element(SMODS.Rarities, "cogito").key key = rarity_map[key] or key local card = SMODS.add_card { set = "Joker", rarity = key, edition = 'e_negative' } create_shop_card_ui(card, "Joker", G.shop_jokers) card:set_cost() card:start_materialize() G.shop_jokers:emplace(card) end end,
wrote create_card instead of add_card
ok its not giving me non common or non uncommon jokers
removing .key works
Ruby Entropy
is it possible to strike out text in smods?
i don't think that currently exists
damn
it seems like it could be added, they added underline
guess i'm putting a pause on one of my jokers, that's fun
how would one use take_ownership on a Joker from a different mod? is it even possible?
i tried just using the ID of the Joker from the mod with it, but that didn't seem to work and would give errors
even running a check beforehand to see if the mod was loaded and then trying to take ownership didn't seem to work
Yes, the key would be j_modprefix_key
it's on the list of things to add at some point already!
when I try and do something like SMODS.Joker:take_ownership(j_modprefix_key), the debug console just says [W] [Joker] Cannot take ownership of j_modprefix_key: Does not exist.
checking if the mod is loaded beforehand yields the same results.
How do I add a "use" button to a joker?
removing the j_ yields the exact same warning message
bizarre
do a check right before the take ownership to see if G.P_CENTERS[item key] exists?
with or without the j_? I imagine with, but just to be sure
with
can you post how you have the code, it might be a different issue too
running that check causes the take_ownership part to not even run, or anything under that conditional for that matter
sample of the code!
not relevant but C:hex code doesn't work
i meant just like, print the result, not make the take ownership conditional on it
but the answer is the same, the item doesn't exist yet. odd
just to make sure the timing isn't super wack, try running a similar check on your own joker immediately after you load it
tell jen that, not me "^^
to take ownership of a modded object, you need to load after that mod
ah pwx was like really high prio right
i love bad practices
I mean personally at that point I would respect jen's wishes and not do crossmod
is it possible to delay taking ownership until after mods in general have loaded?
he doesnt even have an issue with crossmod though right
just with addons
well if he put prio that high then some problem he has lol
do you just want to change the text or the whole thing
you can just patch atp
i dont think theres even a reason for the prio being high
wdym?
you can lovely patch the mod's lua files
theoretically yes, if they're set up to be patched
like shader files are
... interesting
it entails running lovely.apply_patches on the string before processing it further
it's an addition of lovely 0.9.0
i see i think
lovely patches are kinda confusing
i've tried to use them before, but didn't get very far
...until i realized that the solution could be done with standard lua
patches are just lua you put in the middle of another code
lovely is a very powerful tool
ideally the name, description, and atlas, but nothing else
name and description can be done with a localization file but i think it needs to be loaded after jen's too
does the event manager exist yet at this stage of loading? maybe you could put it in an event (<- grasping at straws)
i think you can take ownership after load but idk if the localization gets processed without doing something else
i should probably also say that i am pretty new to lua as a language, so i apologize if i'm being unhelpful "^^
i think patching is probably easier
if i'm going to use patching to replace the atlas of it, where is it going to load that atlas?
surely not from the polterworx directory itself
hmm true
define your atlas in your earlier loading code, then replace the atlas in jen's code with yours (with prefix config set accordingly)
the define atlas i understand, but how exactly would i replace jen's atlas?
^
in jen's joker code, there's something like atlas = "jokers"
you would replace that with the name of your atlas, with the mod prefix, and also a line to define prefix config to not automatically add the mod prefix (since that would result in it trying to look for jen_yourmodprefix_youratlas, which doesn't exist)
i forget exactly how prefix config works, but it's in the smods docs
this would be what the lovely patch does
hmmm, okay
okay nevermind it's actually easy
Been playing around some, the button gets rendered above the card
did you do the drawstep part
vr addresses that
scroll down a bit :p
yeah
order is -30 like they said there
what about SMODS.draw_ignore_keys
hmm no idea
and ive done barely anything to the ui definition except changing w, h and offsets
that shouldnt affect it i dont think
tried changing the order to both -100000 and 100000, still rendered above both times
if you add a print to the drawstep what happens
my jokers are using the wrong sprites for some reason?
WAIT
SOMEONE WARNED ME ABOUT THIS EARLIER
any way to make localization a folder of nest lua files similar to nh's joyous spring
probably i should ask him first
@red flower how did you do that
copy nh's joyousspring
loc files are just lua
do you know what youre doing
that's just there for very new people
considering youre actively seeking it out
uh frankly not really for this kinda of stuff
it's not complicated it's just so people use standard localization first
that code just merges all loc files into 1
probably in a dumb way because im dumb
yeah a bit not completely out of the dark but its more asking if theres a way to make it modular so it won't possibly become one BIG file
if that makes sense
i dont understand what you mean
like being able to have a folder of en-us with stuff like joker.lua, back.lua, misc.lua
fair enough let me try doing that
My locfiles in loc_txt folder 
so they're sorted in the file explorer
shouldn't affect the localization order or anything
okay thanks
nh what's the second argument for the load_file meant to do
i figured out what that was, that's the id for post-launch file loading.
yeah loc files dont recognize what mod theyre from when loaded
Weird question, but I'm trying to hide decks similar to how the Challenge deck is hidden from the deck selection menu. How would I go about that? I've tried no_collection = true and omit = true not working as I want
how do i modify the shop price of every item, when doing something like a reroll
i'm not sure if context.reroll_shop runs before or after the new shop items are generated
but if it's after, you can just use that context to run through G.shop_jokers and adjust the cost there
i have a custom pool for Jokers, but i can't seem to select a rarity. this block of code is able to create common jokers. do i need to define rarity in my SMODS.ObjectType?
Got a problem that's stumped us in the JokerForge Discord; my mod correctly loads and doesn't crash, shows the custom title card, is listed in the mods menu, however no additions are shown, no cards, no jokers, nothing.
All the files are in the asset folders that they should be, and the mod doesn't crash the game at all.
Anyone else experienced this?
does your main file load your item files?
Yes I believe so
probably not the issue but your smods is old
I've tried many smods over the past few days to try and fix it
I can load Mika's modpack in perfectly fine
thats why i said probably not the issue
I've tried it alongside mods, and on it's own, still nothing
you should show the code
I just shut down for the night, but this will show the code in JokerForge if you import it
Could it be that the Lua is named differently to the JSON?
it shouldnt be an issue
Ah damn it
the contents of the json specifies what the main lua file's name is, and smods picks up any json it can find in the folder afaik
If anyone would like to load up the JF mod and try it, feel free.
I've tried on 2 devices now and got the same issue
it seems to work fine
if you had jokers theyre not exporting
but thats a jf issue
i dont see any in the jf website either
is "earn $3" a good descriptor
when
when played or something
i guess smods is wrong about it because i get nothing when playing or cashing out
it only works for playing cards as far as i see
Well damn
Gonna try a completely clean install of Balatro tomorrow and see if that gets it going
gold seal is also $3, so when scored seems fine to me
my localisation isnt working
so is earn $3 enough (i can make it work for both jokers and cards) or should it be something like "earn $3 when joker is scored" or something
its working for the decks but not for the jokers
oh wait its not working at all
HOW 😭
what the hell is going on
wait no fucking way i think the workspace screwed me over
ok nvm
hold on
this is my en-us.lua file
things arent working for some reason
ok thats weird, the decks work but everything else is broken
it works
everything other than decks seems to be outside descriptions
yeah it is
idk if this is discord or actually how it is but your whitespace formatting on the brackets is uh wack
i really recommend formatting your code and checking if folding descriptions hides all the things that should be inside it
all i left is a sound effect for it (ill work on consumables similar to wheel of fortune and hex later) but is the description easy to understand
folding descriptions hid everything but things r a little wack rn
im wondering if its bc of the unlocks thing
what's wack
modified it a little
well nothings really showing up except the Back
currently referencing this:
https://github.com/nh6574/VanillaRemade/blob/main/localization/en-us.lua
im very new to localisation
your indentation is kind of wack
but you now need to add another }, before Blinds = {
oke
then there'll be more work to do but i dunno what it is exactly
WACK definition: an odd, irrational, or unconventional person; wacko. See examples of wack used in a sentence.
dictionary and misc are also inside descriptions
I would recommend starting the file again and copypasting the stuff one by one where it needs to go
think of it like folders
also get an auto formatter
whats an autoformatter
vsc
then if you have the lua extension you can right click and then format document
oh wow
my first edition is complete for my mod rework but i am still not sure if "earn $3" is a good edition description
depends on the context in calculate
it's similar to foil, holo, and poly where the joker and card is scored
"Earn $3 when triggered" might be better
gold seal is explicitly "Earn $3 when this card is played and scores", but since editions can be on jokers condensing it to "when triggered" makes the most sense to me
2nd one, changing the size is just a bit offputting to me
how do i make a voucher have a soul sprite since idfk how to make a drawstep
make a drawstep :3
the soul in vanillaremade has one
okay
a lovely patch and prefix config change did end up working!!
(sorry for ping)
balatro wiki spotted
youre welcome larswijn
curious question is there a way to make a planet card that does something like for a pair do either +5 mult or +30 chips
yes
planets are consumables so they can run any code
and the new smods upgrade hands stuff lets you do individual modifications
any information on how to do that
probably the docs for the latest smods update
ok so i have a CTD issue that i'm trying to solve:
i have a consumable that turns a joker into another joker (via :set_ability("key")), of which those jokers are only accessible via that consumable and that's the intended way for them to be discovered. discovering a joker unlocked that way, then hovering over any card in the collection causes a CTD. subsequent launches of the game seem to randomly insta-CTD
how do i find out more about what's causing the CTD?
I have a feeling this might be a pool-related issue. How are you generating a key to set the ability?
i have a table that stores functions that are named with the key of the original joker (as the key in the table), that return a either table with various information, primarily for use in the loc_vars of the consumable to let the player know whether the consumable can be used on that selected joker (or for use in whatever specific bit i've come up with for that selection), or just straight up the final joker key as a string.
so that way i just look jokerKeyTable[jokerReference.config.center.key] and if it's not nil, disambiguate further before doing anything with it
then if there's a final joker key as a result, i put that in a local variable and do jokerReference:set_ability(targetKey) and that changes the joker to the final joker
messy? yes. flexible? yes. works? yes.
i don't get why that would be related to crashes of discovered items in collections
like, if i force discover one of the other jokers obtained this way via debugplus, there's no crash
debugplus does some wonly stuff with atlas on discover
does it maybe have to do with the atlas
well it shows fine in the collection, but hovering over any joker causes a crash
yes
check that they're not recursively adding each other
given that the only thing being added to the info_queue is a hardcoded table, i highly doubt it
The method of it being added might be the issue is what's being proposed here
ohhh
i don't know how to check. the CTD is on hovering over any joker in the collection on the same page as that unlocked joker, whether locked, undiscovered or discovered
if the problem was with how i was adding to an info_queue with that specific joker, why are other jokers causing the crash
do you use git
you can checkout commits until you find the one that doesn't have the problem
and then see what addition caused it
...well, i never tested potential issues with discovery after developing the consumable and the related jokers
i thought to and intended to, but just forgot
and someone found this CTD
so this has likely been an issue since i first implemented it
the problem is not when but what
unless you dont make regular commits in which case good luck
i haven't really changed this at all since implementation?
but are you sure it's that?
(i think ill hold off my question for now-)
thinking on using these names (art can be added later) for the spectral cards for adding laminated to a joker or playing card
there can be multiple conversations at the same time
admittedly i found it by looking up synomons to talisman 💔
well i'm sure it's not that and i'm confident it's not particularly related to it, either
o ok, i was wondering how to go about giving a card a temporary enchantment through the calculate function? (just something which lasts for a hand)
quantum enhancements
check the smods calculate wiki
mm, looking at it, its not quite what i want, im trying to make a joker which temporarily gives a random card in hand an enchant for the hand
that or im drastically misunderstanding context.check_enchantment
it does that
unless you want to give it an enhancement and then take it away which would be just giving the enhancement in context.before and taking it in context.after
wouldn't that cause problems if the joker is sold though-
you cant sell jokers during scoring
ah
the only problem with other jokers that add enhancements
but you can just make the effect something like add steel and if it's still steel then you remove it
maybe im misexplaining myself, i want the enchant to be there after the first hand is drawn, not once the hand is played
i'm stumped
but with that method, of removing it via the joker effect, it could cause issues if the joker is sold
use SMODS.current_mod.calculate
would anyone else be willing to look through my mod and help me figure out what's causing this CTD? 
mm this is my first time hearing about SMODS.current_mod.calculate, how is it different from calculate?
it's global
o? so it always runs?
yes
huh, neat
i added it :3
:o thanks n' :)
i tried making a minimum reproducible example but that doesn't reproduce the CTD
so i have no idea where the issue is if it's not something to do with set_ability
oh, somewhat unrelated question, does G.hand:unhighlight_all() unhighlight force selected cards?
maybe i should take this to support actually, that's new since i last talked in here
...well, no - this is something endemic to something i wrote, but i have no clue where the issue starts or ends. i only know what causes it.
i dont think the people browsing the channels are different enough to matter lol
which rarity is what index? is common 0 or 1?
common is 1
i'm trying everything i can think of here. i really wish i had a crash log
i mean, i guess i do? the player that found the CTD found a crash log saying there was a stack overflow at line 1105 in misc_functions, but
what i mean is that i wish i had a crash screen
My dad must be super duper loaded without telling me
He laminates things all the time
you could ask for their line in the dump
bump
okay figured it out by looking at vanilla remade i didnt need the can_use
the problem was card.config... doesn't exist
they say it's the start of that same copy_table func
ok that screenshot gives negative context
i mean in the localize
i don't think so, no
it says ERROR on the card
is set the first line?
looks like that
idk what the downside should be, any ideas?
and in game
try 'k_'.. set:lower()
oh yeah probably
the problem is probably that the game is copying an recursive table somewhere
there
fixed
also remove the labels thing i think
adds rental or smth idk
i decided to go with "destroys all other jokers" since that's what hex and ankh does, and i think it can be a strong edition with testing
yeah it work
also i rather not make anything rely on stickers as that means that it would only be work or make sense on certain stakes and higher
the last time i had a recursive table issue like this was with info_queue stuff i was doing - but it's not in the specific joker and if i comment out the code that calls the original culprit the CTD still happens. i really don't understand what's happening and i'm at my wit's end here
what's the mod again
cirno_tv & friends
can u link it
ok it's too long i will try to recreate it tomorrow
thank you
the second part of the text is more as a reference for me in the future when i start working on the art but idk if i want to commit to the "minor arcana" part or something
maybe hold on
nah
can anyone tell me why the following chunk of code enters the blind you just beat instead of the next one
SMODS.Keybind{
key = "Select blind",
key_pressed = binds.select_blind,
action = function(self)
if G.STATE == G.STATES.BLIND_SELECT then
G.FUNCS.select_blind(G.blind_select:get_UIE_by_ID("select_blind_button"))
end
end
}
how do i get a card to stop juicing at the end of round for example
juicing?
and secondly how do i grab the current mult
yes, juice_card_until()
ah
like with dna's jiggles
oh ok that makes sense
mult
ah; isn't chips something like current_chips or is it just chips as well
No, it's hand_chips
ah
I know SMODS.calculate_round_score() gets your total chips for the hand, but is it possible to change the total score of the hand instead of just getting it?
I’m unsure
Im trying to make a boss blind that halves your total score (of the hand) when activated
So the flint but after scoring rather than before?
hmm```lua
if context.before then
if SMODS.pseudorandom_probability(card, 'busterb_lucky_vigi', 1, card.ability.extra.luckychance, 'busterb_lucky_vigi') then
local faces = 0
for _, scored_card in ipairs(context.scoring_hand) do
if scored_card:is_face() then
faces = faces + 1
scored_card:set_seal("Gold", nil, true)
scored_card:set_ability("m_gold", nil, true)
G.E_MANAGER:add_event(Event({
func = function()
scored_card:juice_up()
return true
end
}))
play_sound("busterb_vigi")
end
end
end
end
if context.individual and context.cardarea == G.play and not context.blueprint then
if SMODS.has_enhancement(context.other_card, 'm_lucky') then
return {
x_chips = card.ability.extra.luckyxchips,
dollars = card.ability.extra.luckydollar,
sound = "busterb_gunshot"
}
end
end
end
Yes.
how does the flint's code work again?
I would refer to the flint code in vanilla remade and change the context to something like context.after
With magic 😏
i fixed it finally
i need someone to test this code
because i can't access my pc at the moment
common joker that might disable itself out of pure confusion.
key = 'misunderstood',
loc_txt = {
name = 'Misunderstood',
text = {
"{C:mult}+20{} Mult",
"{C:green}#1# in #2#{} chance to be",
"{C:red}disabled{} for the rest of",
"the round after each hand.",
"{C:inactive}(Status: #3#)"
}
},
config = { extra = { mult = 20, odds = 5, disabled = false } },
rarity = 1, -- Common
pos = { x = 0, y = 0 },
atlas = 'Joker',
cost = 4,
unlocked = true,
discovered = true,
blueprint_compat = true,
-- Variables for the card description
loc_vars = function(self, info_queue, card)
local status_text = card.ability.extra.disabled and "Confused..." or "Ready!"
return { vars = { (G.GAME.probabilities.normal or 1), card.ability.extra.odds, status_text } }
end,
calculate = function(self, card, context)
-- Trigger Mult only if not disabled
if context.joker_main and not card.ability.extra.disabled then
return {
mult_mod = card.ability.extra.mult,
message = localize { type = 'variable', key = 'a_mult', vars = { card.ability.extra.mult } }
}
end
-- Roll for the disability after the hand scores
if context.after and not card.ability.extra.disabled and not context.blueprint then
if pseudorandom('misunderstood') < G.GAME.probabilities.normal / card.ability.extra.odds then
card.ability.extra.disabled = true
return {
message = "Sorry!",
colour = G.C.RED
}
end
end
-- Reset at the end of the round
if context.end_of_round and not (context.individual or context.repetition) then
if card.ability.extra.disabled then
card.ability.extra.disabled = false
return {
message = "Back again!",
colour = G.C.GREEN
}
end
end
end
}```
here is the example model
a joker that have 1-5 chance to disable itself on every hand played. and when the round end it comes back to life
looked at it with fresh eyes, figured out the problem area
turns out it thinks its copying a recursive table despite this table not recursing?
i don't get it
i'll just use SMODS.shallow_copy() instead, that seems to fix it 
yay fix
the mod table on centers is recursive iirc

Any table with an object in it is recursive
i see 
why do you need to copy it anyway
doesn't answer my question 😭
i wanted to put that item in info_queue with the fake_card bool, so that's why i needed to copy it.
i see
how do people edit/change the ace on the title screen
annoying methods
but smods added a simpler method recently
Oh?
(one of the reasons I'm hoping they do a release soon)
you will need the dev version of smods
I know
cool
anything on editing the background color?
or does it still require hacky solution
i don't think smods added a thing for that yet
is there more to this
or is it just restricted to sets and the numbers
is it atleast possible to remove the ACE
my jokers are using the wrong sprites, does anyone know how to fix this?
how would i change the offset?
pos = {
x = 1,
y = 0
},
in smods.joker
for whatever joker has the wrong sprite
x is left and right y is up and down
for example second row 3rd joker would be x = 2 and y = 1
it be easier if u made a sprite sheet
alr imma do that thx
does it support changing the x/y coordinates
having it slightly offcenter is annoying lol
easily, just include remove_original = true in your return table (next to the card)
changing the position is probably doable by including a func entry, but idk how that would work
i guess last question is is it just restricted to 2 cards because been fiddling with it trying add another card but everything i try returns a nil value
looks so much better lol
does the function also remove everything
I guess all that's left for the main menu is getting more twitch theme'd colors
and updating the logo
since it was just couple random logos I found off google lol
Doesn't remove everything but the template command makes the first card negative and adds a random tarot
This is what removes the ACE tho
do you guys know how to get the current blind's multiplier?
G.GAME.blind.mult?
thx
I MESSED UP BADLY LOL THIS IS MEANT TO BE 20
average cryptid joker
no, just use context.modify_scoring_hand
returning remove_from_hand = true during that context will remove the currently-being-checked playing card from the scored hand
ah okay
ok im confused, i hooked SMODS.calculate_individual_effect to add my own return key, but when I make a joker return a table using that key, when i make SMODS.calculate_individual_effect print the key it recieves, it never prints the modded one? why does it never recieve my new key? am i hooking the wrong function?
You need to put the key into SMODS.calculation_keys
i see
oh wait also ive hooked this function before already, i should probably merge the hooks while im at it
so can i just do table.insert(SMODS.calculation_keys, "hodge_partial_balance")
is there a way i can share a variable between a blind's calculate and disable functions? saving it to self.config.extra.var instead of blind.config.extra.var in calculate won't do the thing, yes?
Yes.
cool
Yes, it would be blind.effect.variable
Yes, it would be G.GAME.blind
Yes.
neato
ok where am i meant to put the table.insert because just putting it in my main lua doesnt seem to be working?
put it in SMODS.other_calculation_keys
cool thx
hi im trying to make joker decrease prices of a pool of jokers in the shop, what function do i use to modify prices in the shop
No, you would hook Card:set_cost
alright then
Question about blind loc_vars, is it not possible to change the key used to get the loc text similar to how booster packs work (by removing the \_(number))?
it should be possible
How can I return a played card to hand ala beta blue seal behavior?
iirc it's a feature in the next smods version
👀
how would i check what pool a joker is in? ive tried this thus far
context.other_joker.config.center.pools == "ExamplePool"
if context.other_joker.config.center.pools and context.other_joker.config.center.pools['ExamplePool']
thanks!!
Why does this display "nil in nil chance" in the blind's desc in the collection? Works fine ingame
loc_vars = function(self)
local num, denom = SMODS.get_probability_vars(self, 1, 4, 'nancy_wrench')
return { vars = { num, denom } }
end,
You need collection_loc_vars
this didnt work. i double checked the pool name.
Code?
if context.other_joker and context.other_joker.config.center.pools and context.other_joker.config.center.pools['ExamplePool'] then
return {
cxmult = card.ability.extra.cxmult
}
end
end,```
rip formattign
It should be xmult not cxmult
How would you go about making a store have an exact copy of a joker (including edition and stickers)
can i replicate glass breaking for non glass card?
What part
the effect
If you mean the animation you can add shatters = true to the enhancement definition
hook SMODS.shatters
Well yeah why would you not be able to copy the glass card effect
oh the breaking effect
It is code
you just tell the code to destroy the card
ts vanillaremade moment
Isnt that for checking glass joker triggering (?)
I think it's for checking if a glass card has been destroyed specifically, it's unused though afaik
makes sense
so the effect for me was
XMult for each played cards, all cards other than this card is shattered
Getting close I guess
Text wrapping will be a bit of a challenge probably
anyone know why this isn't triggering the effect when the text pops up, and is instead doing it as soon as the round ends (its during round end context)
so i guess i can just call destroy card and then it will automatically shatters if i set shatters to true?
if you want it to actually shatter instead of dissolve you will need to hook
fair
you need to put the set_sprites in an event
this was before the probability stuff so people wanted a way to check if glass hit the probability
trying to make my copycat/blueprint enhancement work properly with debuffing boss blinds and i think something's wrong with my hooks
invisible pareidolia moment
Why not just copy the .debuff of the card to the right-
because the copycat cards were getting photograph'd despite not copying a face card
here's the hook
local is_face_hook = Card.get_id
function Card:is_face(from_boss)
-- Messy ass jank code
if self.config.center.key == "m_elle_copycat" then
local target = ellejokers.get_copycat_target(self)
if target then return is_face_hook(target,from_boss) end
end
return is_face_hook(self,from_boss)
end```
I don’t see how copying card.debuff would cause that 😭
nope
is_face_hook = Card.get_id ....
why wont this retrigger???
if context.retrigger_joker_check and not context.retrigger_joker then
if context.other_card and context.other_card.config.center.pools['Smallpox_Pool'] then
if context.other_card.config.center.rarity == 3 or context.other_card.config.center.rarity == "Rare" then
return {
message = "Again!",
repetitions = 1,
card = card,
xmult = card.ability.extra.rxmult,
sound = "smallpox_poxofthewild_pop",
}
end
if context.other_card.config.center.rarity == 4 or context.other_card.config.center.rarity == "Legendary" then
return {
message = "Again!",
repetitions = 1,
card = card,
xmult = card.ability.extra.lxmult,
sound = "smallpox_poxofthewild_pop",
}
end
end
end```
It should be if context.other_card:is_rarity('Rare') and if context.other_card:is_rarity('Legendary') also do you have retriggers enabled?
yes i do
and ill try that
no dice. heres the full calculate.
calculate = function(self, card, context)
if context.other_joker and context.other_joker.config.center.pools and context.other_joker.config.center.pools['Smallpox_Pool'] and (context.other_joker.config.center.rarity == 1 or context.other_joker.config.center.rarity == "Common") then
return {
xmult = card.ability.extra.cxmult
}
end
if context.other_joker and context.other_joker.config.center.pools and context.other_joker.config.center.pools['Smallpox_Pool'] and (context.other_joker.config.center.rarity == 2 or context.other_joker.config.center.rarity == "Uncommon") then
return {
xmult = card.ability.extra.uxmult
}
end
if context.retrigger_joker_check and not context.retrigger_joker then
if context.other_card and context.other_card.config.center.pools['Smallpox_Pool'] then
if context.other_card:is_rarity('Rare') then
return {
message = "Again!",
repetitions = 1,
card = card,
xmult = card.ability.extra.rxmult,
sound = "smallpox_poxofthewild_pop",
}
end
if context.other_card:is_rarity('Legendary') then
return {
message = "Again!",
repetitions = 1,
card = card,
xmult = card.ability.extra.lxmult,
sound = "smallpox_poxofthewild_pop",
}
end
end
end
end,```
tried this still no dice
if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= self then
does it enter the condition
what do you mean by that
ah this will crash too
its not crashing its just not retriggering
do you know if it gets past here
formatting error from pasting
its not
can i see your optional features code
--enable retrigger jokers
SMODS.current_mod.optional_features = {
retrigger_joker = true,
post_trigger = true,
}
does post trigger work on this joker
i dont know
im making a joker where their xmult is the ante your currently on divided by 2.5
(ante 1 is 1.4, ante 2 is 1.8, etc)
what rarity would this be?
id say probably about uncommon
how can I change the "YOU WIN" and "GAME OVER" text?
calculate = function(self, card, context)
if context.repetition then return end
if context.individual and context.cardarea == G.play then
local suit = G.GAME.current_round.suitwash.suit
if context.other_card:is_suit(suit) then
return { repetitions = card.ability.extra.wildrep }
end
end
end
this doesnt retrigger, what happened
It's context.repetition not context.individual for retriggering.
wdym?
so like
if context.repetition and not context.individual then return end
?
calculate = function(self, card, context)
if context.repetition and context.cardarea == G.play then
local suit = G.GAME.current_round.suitwash.suit
if context.other_card:is_suit(suit) then
return { repetitions = card.ability.extra.wildrep }
end
end
end
still cant get mine to retrigger
print("retrigger check passed")
if context.other_card and context.other_card.config.center.pools['Smallpox_Pool'] then
if context.other_card:is_rarity('Rare') then
return {
message = "Again!",
repetitions = 1,
card = card,
xmult = card.ability.extra.rxmult,
sound = "smallpox_poxofthewild_pop",
}
end
if context.other_card:is_rarity('Legendary') then
return {
message = "Again!",
repetitions = 1,
card = card,
xmult = card.ability.extra.lxmult,
sound = "smallpox_poxofthewild_pop",
}
end
end
end```
im not getting the print or anything
is there a better way to check that a deck is properly effecting rarity weight than just... spamming rerolls
how can i make these cards show the enhancement texture after being flipped over
Remove the , nil, true in the Card:set_ability call.
Has anyone managed to find a workaround to make cards count as more than one rank?
What the fuck you wrote a whole patch for that?!
How do you use it?
No, it was from All In Jest, but then they removed it, this is an improved and fixed version of it.
Ahlol
how do you use it
Yeah I’m wondering the same
Cos I wanna make a joker that makes Kings and Queens count as eachother
i added a lovely patch to incorpate a "don't repeat yourself" on the decks i am working on and now the metadata is considered a lovely mod is that normal, any way to switch it back?
No, it's not normal, if you have an error-free JSON file.
Apologies for my lack of lua knowledge (I did try and read) but what line is this function in? Actually is it possible to hook it?
Also I saw some stuff about SMODS.optional_features at the bottom, I’m wondering if that allows multirank to be toggleable for potato players
No, quantum ranks is not an optional feature yet, also what function are you talking about?
print('work')
return {
message = "Again!",
repetitions = 1,
card = card
}
end```
WHY DOESNT THIS WORK
AGH
I LITTERALLY STOLE THE CODE FROM MAXIMUS
Hold on. WHAT are you trying to do with this?
The function from the second link that I had to modify to check for my joker
i jsut want the joker to retrigger any jokers that are from the mod and are rare or higher rarity
When you click on the link it takes you to the correct line.
i tried to do it a more intelligent less jank way and actually check the rarity
but that didnt work
so i found this code in maximus
and added all the jokers to the correct pool for rare and legendary
thats what that code is doing
May I suggest looking at Baseball Card's code to look through all Jokers and check rarity?
thats where i started
if context.retrigger_joker_check and not context.retrigger_joker and context.other_card.config.center.mod == SMODS.Mods['modid'] and (context.other_card:is_rarity('Rare') or context.other_card:is_rarity('Legendary'))
Or... that.
thats not working
i think its because the joker also needs to do other things before and they are intefering somehow
i dont know why that would be the case
but
im losing it
ive been on this one joker since 2:30 today
its 10pm
(in fairness ive done a few things in between but ive still worked on this for a solid 5 hours)
heres the calculate again
if context.retrigger_joker_check and not context.retrigger_joker and context.other_card.config.center.mod == SMODS.Mods['smallpox'] and (context.other_card:is_rarity('Rare') or context.other_card:is_rarity('Legendary')) then
print('work')
return {
message = "Again!",
repetitions = 1,
card = card
}
end
if context.other_joker and context.other_joker.config.center.pools and context.other_joker.config.center.pools['Smallpox_Pool'] and (context.other_joker.config.center.rarity == 1 or context.other_joker.config.center.rarity == "Common") and not context.retrigger_joker_check then
return {
xmult = card.ability.extra.cxmult
}
end
if context.other_joker and context.other_joker.config.center.pools and context.other_joker.config.center.pools['Smallpox_Pool'] and (context.other_joker.config.center.rarity == 2 or context.other_joker.config.center.rarity == "Uncommon") and not context.retrigger_joker_check then
return {
xmult = card.ability.extra.uxmult
}
end
end,```
Have you tried printing SMODS.optional_features.retrigger_joker?
trying now
its printing nil??????
even though im setting it here?
--enable retrigger jokers
SMODS.current_mod.optional_features = {
retrigger_joker = true,
post_trigger = true,
}```
Are you sure that file is being loaded?
its the main file so yes
Try manually doing SMODS.optional_features.retrigger_joker = true
why are all the jokers retriggering regaurdless of rarity?
simple question: is x_chips in steamodded or added by talisman
It's added by SMODS
does that include the sound effect?
yeah
okay just checking considering i saw the sfx in talisman files specifically
it used to be a talisman only thing
i see
any way to make this work? when i try to make this, it seems to just have the chips in the round reset when any other chips effect triggers
...
if context.before then
return {
xchips = mult
}
end
this is literally all the effect is
context.initial_scoring_step
ah that makes more sense
i RARELY ever see that context lol
how do i access the number of rounds that the player has completed?
G.GAME.round
i should've assumed such 😭
does anyone know how to make the joker not play the hand
Cards not scoring or disallowing the hand entirely like a Boss Blind would?
disallowing the hand entirely like a bossblind yeah
context.debuff_hand
incoming pocket needle
hey, i've been trying to make some boss blinds but the royalty (1st) crash my game and the oxide (2nd) just does nothing :/ am i doing something wrong ?
the crash is telling you that card.get_id returns a number
you can't index a number
if you want the key it's in card.base.value
no it's the key of the rank the card has
oh yeah
for the second one there's no context.card in context.individual
👌
(or context.check)
also it's context.cardarea
oh just a woopla
i would really recommend looking at examples or the docs
i will
probably not the best, but if nothing else works u could set mult and chips to 0 after everything svkres
it is just context.debuff_hand
anyone have any guides on how to put in card textures without overriding the already excisting ones
what if there was a joker like bloodstone, but for other suits
plus the other gem jokers
like a spade version of rough gem
what if
what if
yeah that would be cool
how do you put items in a custom collection section
agreed
It's a great tool.but somethings just don't work
I made a joker with it that's supposed to increase chip mult for every bonus card played but it didn't work
And the code it spat out mentioned nothing about checking bonus enhancements
It just increases after every played hand
So be sure you check that it's actually spitting out what you're designing it to do
If there is a tool I wish that could be separated from joker forge it's how it makes it sprite sheets
Since that's all I use it for anymore lol
yeah fair enough
i mean its coded by one dude and its free
its ust a fun little thing
i think if youre serious about making jokers you'll have to learn to code a little
I'm cofindent there's a way to pick a random sound for an effect.
if you mean an api for it then no
afaik
you would need to list all the sounds and pick from them
So how would I randomly pick one?
whats the variable name of the edition pool, and can i rely on it being in order? making a joker that upgrades cards from base to foil to holo to poly to negative
G.P_CENTER_POOLS.Edition
two caveats: it includes e_base (no edition) as one of them and they are in order but modded editions will be in loading order
ok cool
e_base being there might actually be handy
and ill probably stop it from progressing past negative anyways because all my mods editions have detrimental aspects lol
apart from lenticular
lenticular the goat
what in the return table specifies the per argument used in play_sound for returned sounds
i know vol is done with volume but i genuinely have no idea what per is even short for
anyone know how I can grab a cards calculate function?
card.config.center.calculate?
well for modded objects at least
vanilla objects dont store a calculate function at all
and keep in mind that because its a function youre quite limited in what shenanigans you can do
is there a way to trigger their mid round effects or do I need to hard code if
what is "mid round effects"
pitch
im checking if they have a context.joker_main condition
pitch percent
are you doing something that means you cant calculate it
Im trying to have a playing card trigger a joker
using the method u stated above?
what method i stated above
.
how do I do it for vanilla then
directly calling calculate wont work regardless
since that wont parse the return table
I was just gonna return the return table for the context.individual part
theres probably some function that calculates an individual card and then does the return table stuff but i dont know what that would be
No, card:calculate_joker({cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = context.scoring_hand, scoring_name = context.scoring_name, poker_hands = context.poker_hands, joker_main = true})
thx
and this will return the return table?
or just do the effects
Yes.
When patching with .toml files, is it possible to disable patches via a config setting?
bet
thx
no, you would have to code the patch in a way to disable that code
one i just wrote for example
How possible would it be to allow poker hands to be affected by multiranks?
ah thx
Is there some line of code I can use to make the game instantly lose?
G.STATE = G.STATES.GAME_OVER; G.STATE_COMPLETE = false
this is meant to balance a card's Xchips and Xmult (e.g. X1.5 Mult would become X1.25 Chips and X1.25 Mult), though the math is not working out. cards with neither of the bonuses just get X-nan for both and idk whats causing it. too many maths
following it by hand with both base values being 1 doesnt seem to bring up any issues
G.GAME.current_round.hands_played == 2
ty goat
or maybe 1 i dont remember if it preadds the current hand
Have you tried printing every variable?
doing that rn
ill test 2 and see lol
okay everything is zero for some reason
ig i should just zero check
for the nonexistent values
or well
set them to 1 if zero?
yo chat how would i go about destroying the entire played hand?
cause now it just destroys like everything 😭
what does your current code look like
you should also check context.cardarea if youre using context.destroy_card
SMODS.Joker{
key = "junklake",
atlas = 'grasslanderJoker',
config = { extra = {dollars = 20, count = 0, threshold = 3, active = true}},
pos = { x = 1, y = 1 },
rarity = 1,
cost = 5,
blueprint_compat=false,
eternal_compat=true,
perishable_compat=true,
unlocked = true,
discovered = true,
effect=nil,
soul_pos=nil,
in_pool = function(self, args)
return false
end,
calculate = function(self, card, context)
if not context.blueprint then
if context.end_of_round and context.main_eval then
card.ability.extra.active = false
card.ability.extra.count = 0
end
if context.setting_blind then
card.ability.extra.active = true
card.ability.extra.count = 0
end
if context.discard then
if context.other_card:get_id() == G.GAME.current_round.grasslanders_junklake_card.id then
card.ability.extra.count = card.ability.extra.count + 1
end
end
if context.discard and context.other_card == context.full_hand[#context.full_hand] then
if card.ability.extra.count >= card.ability.extra.threshold then
local target_cards = {}
for _, v in ipairs(G.playing_cards) do
if v:get_id() == G.GAME.current_round.grasslanders_junklake_card.id then
target_cards[#target_cards + 1] = v
end
end
for _, v in ipairs(target_cards) do
G.E_MANAGER:add_event(Event({
func = function()
G.play:emplace(v)
return true
end
}))
end
return {
dollars = card.ability.extra.dollars,
func = function() -- This is for timing purposes, everything here runs after the message
G.E_MANAGER:add_event(Event({
func = function()
SMODS.destroy_cards(target_cards)
return true
end
}))
end
}
end
end
end
end,
loc_vars = function(self, info_queue, card)
local idol_card = G.GAME.current_round.grasslanders_junklake_card or { id = 1, rank = 'Ace', suit = 'Spades' }
return { vars = { card.ability.extra.dollars, localize(idol_card.rank, 'ranks'), card.ability.extra.count, card.ability.extra.threshold} }
end,
}
Anyone know the best way to fix this? What happens rn is in #1468810499759145063 message
You should use draw_card instead of CardArea:emplace
The problem is because you're not removing the card from the area before emplacing it.
Ah
Is there any documentation for this function? Also is it possible through that function to put played or discarded cards back to deck?
No, also no, you would hook G.FUNCS.draw_from_play_to_discard and do G.FUNCS.draw_from_discard_to_deck()
How do I add pool data to vanilla jokers?
like I wanna give a "Food" pool too all the food jokers
check how paperback does it
You make a SMODS.ObjectType with the key 'Food' and then you put cards = {j_gros_michel = true, j_ice_cream = true, j_cavendish = true, j_turtle_bean = true, j_diet_cola = true, j_popcorn = true, j_ramen = true, j_selzer = true, j_egg = true} in it.
is there a pool object?
ah
and this will make card.config.center.pools["Foo"] true?
No, it would make card.config.center.pools['Food'] true
thx lol
this guy discovered technology
I prefer this
the last thing is find some sort of unlock condition since all tier 2 vouchers has some sort of related condition
Have 5 uncommon jokers at once?
im looking at the unlock stuff for the jokers
maybe something similar to one of these
That’s why I suggested what I did
oh nvm it is already clickable
i will use this
i will see if i can add it as a formatting option
is there documentation on this? like the different options
here's my idea, but idk which formatting is better
Right one
but rn i can just leave it blank and come back to it no worries
local p_rarities = {1, 2, 3, etc}
local valid_rarities = {}
for _, value in ipairs(p_parities) do
valid_rarities[value] = true
end
--- in that if statement
if valid_rarities[v.rarity] ~= nil then
Do I write the local after local selectable_jokers?
You should be using Card:is_rarity
apparently crash on unlock animation for a joker
something to do with what i was doing to the multibox tooltip?
i'm just gonna implement a nil check to this for now for a release to patch it over while i wait for someone to get back to me and help me figure whatever's going on here
why are you whitelisting this many rarities anyway? feels like it would be better to invert it and check if the rarity isn't whatever rarities you want to exclude
anywhere
just make sure it doesn't conflict with anything
does anyone has a code that modifies the starting money, hand, and discards?
Are you making a deck
VanillaRemade
i don't think there's documentation, but you can search the vanilla code for check_for_unlock and find them that way
also, you can always run the function yourself if you want a custom unlock method
For animated jokers, is there a way to get the current frame a joker is on?
card.children.center.current_animation.current i think
Much like there is a card.children.center:set_sprite_pos, is there a card.children.center:set_pixel_size?
it doesn't seem like there is, but I need to do it for one of my Jokers
thank you
Is there something like a soul_atlas or smth
is there a good way to force a challenge to use a specific stake?
i want to replace win.ogg in Balatro.exe to my ogg file by smods , how can i do that?
hey does this work for consumables
and on that note is it just G.consumables
it's been a minute since ive modded balatro
No, you would do replace = 'win' in your SMODS.Sound
Yes, that should work for all cards.
hm. erroring out.
No, it's G.consumeables
thanks, that help me a lot
does anyone know how to add name & text to a joker without using loc_txt?
i wanna use external localization files (like to grab from localization/en.lua) but i don't know how do you do it normally
i just started doing this thing so expect sorta stupid questions and answers
thank a bunch
No, the file should be called en-us.lua
IS there any documentation for setting up the basis of a mod, e.g basic joker structure, challenges, decks etc etc
https://github.com/Steamodded/smods/wiki/Your-First-Mod
All the documentation is also on the right side of the page
nvm i figured it out it turend out that i messed up the joker key name somehow
what context would be the best to use for making a joker make a playing card do something as if it were an edition effect? like making holo playing cards also give foil's chips
You mean you want playing cards with Holographic to also count as Foil?
essentially yes, while this joker is owned
not essentially. thats exactly what i want to do
so yeah uhhh how would i make joker cause playing cards with an edition also count as other editions
In your specific case you would only need https://github.com/Somethingcom515/SealsOnJokers/blob/dev/bigfuncs.lua#L319-L371 and https://github.com/Somethingcom515/SealsOnJokers/blob/dev/lovely/others.toml#L318-L331 I think.
i assume for the get_quantum_editions function i can gut that and replace it with my own logic for when they should have them
Yes, it would be next(SMODS.find_card('j_modprefix_key')) and card.edition and card.edition.holo
hmm
woah what is the "times" argument in a lovely patch
if the patch targets more than one line then it does the first [times] lines
ohh i see

the plant on crack
baron mime go brrr
is there some reasonable way to implement sticker incompatibility?
Yes, modprefix_key_compat = false in the SMODS.Joker
for some reason my mod that adds challenges is causing every challenge (even vanilla ones) to load into a normal run in the previous deck instead, even though I haven't changed the way challenges work and all of my challenges have deck.type set to "Challenge Deck". I'm starting to suspect that it's because all of the challenges are being loaded from different files, but I figured I'd ask around to see if anyone else might know what the issue is
https://github.com/ProotTheFoxCodes/Trials-of-the-protogen
sorry, I meant between stickers, not for jokers
I was gonna start work on Balatro Quest (name for a mod idea I had) but idrk where to start
https://github.com/Steamodded/smods/wiki/
https://github.com/nh6574/VanillaRemade
-# unless you're asking abut something more specific?
The thing is that Balatro Quest is supposed to be something outside the scope of what most mod guides are, it's supposed to be a change to progression
You know those questbook Minecraft modpacks? The idea was to change joker and deck unlock conditions to follow a quest structure similar to those
That however involves defining what a quest is exactly, the UI necessary to show it on screen as its own menu, the matter of how do I write it to a persistency layer, how do I do the cryptid thing of spawning whole new savefiles, whether take_ownership is enough to change joker unlock conditions, etc
and I don't know which of these problems to attack first
take_ownership should be enough
also you can always read the repos that do the things you wanna do
In preparation of extending this to a larger modpack too, I also wanted to implement a joker bans system to make it easier to hunt for certain quest requirements
Where increase in ban limit is a quest reward in the first place
you can probably look at banner and see how they did the banning stuff
just quickly made a restructured duplicate of my mod, verified that its not because its loading from multiple files
from what i understand its like a level progression and not roguelike, something like pvz
It's more like, making Balatro more roguelite?
oh..
Idrk how to explain it beyond "Minecraft questbook modpacks"
ive never played that so..