#💻・modding-dev
1 messages · Page 543 of 1
the old snippet from mail-in rebate to reset the card?
now done
Seu pai is cooking off stage
why it gives this error though 😭
Exactly 😭
how am I supposed to discover the error that way 😭
function mutation_set_badges(self,card,badges)
print('called?')
local badges_to_create = {}
local badges_amount = {}
print("mutations:",card.mutations)
for i,v in ipairs(card.mutations) do
local badge = v.center.badge
if badges_amount[badge] == nil then badges_amount[badge] = 0 end
if not table.find(badges_to_create, badge) then
table.insert(badges_to_create, badge)
end
badges_amount[badge]=badges_amount[badge]+1
end
for i,v in ipairs(badges_to_create) do
local display_name = v.display_name
if badges_amount[v] >1 then
--display_name=display_name.." x"..badges_amount[v]
end
--[[local this_badge = create_badge(display_name,v.colour,v.text_colour,v.scale)
badges[#badges+1] = this_badge]]
end
end
there is v in there
but its not being concatenated
Just check for nil
the error says it's trying to concatenate when v is a function
I FIXED IT
IDK HOW
I just assumed it was happening because of back objects and it worked

now any deck has the atlas of red deck though
Idk whyyy
😭
someone help meee
OH WAIT NVM
ITS BECAUSE I AM PLAYING RED DECK
😭
should i place the code snippet in the loc_vars segment, then?
Has anyone experienced memory leak issues in their mod? I'm really lost man
is there a way to vary the weight of a booster pack depending on certain circumstances in the current run
other than like patching a bunch of shit
what i mean basically is that is this functionality built in
Oh
i love undocumented features
I implemented it myself as an idiot lol
N do you have any idea bout this?
you're really good at this hAHHAHA
Fk
I'll try disabling talisman just in case
I've been the last 2 days trying to fix this memory leaks problem with no success, im tired 🙁
yo if i have an event with a delay like 4 * G.SPEEDFACTOR
will it be guaranteed to delay for 4 seconds regardless of gamespeed
that sounds right but I dunno if G.SPEEDFACTOR is precisely the correct variable off the top of my head
yea it is
local Mutation = SMODS.Center:extend{
class_prefix="mutation",
discovered=false,
unlocked=true,
set = "Mutations",
config = {},
required_params = {
"key",
"weight",
},
pre_inject_class = function (self)
G.P_CENTER_POOLS[self.set] = {}
end,
inject = function (self)
if not self.unlocked and self.check_for_unlock then
if self:check_for_unlock() then
self.unlocked = true
end
end
SMODS.Center.inject(self)
end,
get_obj = function (self,key)
if key == nil then return nil end
return self.obj_table[key] or SMODS.Center:get_obj(key)
end,
}
SMODS.Brainrot.Mutation = Mutation
SMODS.Brainrot.Mutation{
key="Golden",
weight=1,
badge={
display_name="Golden",
colour=HEX("d9b831"),
text_colour=HEX("f3d763"),
scale=1.2,
},
loc_txt = {
["default"] = {
name = "Golden",
text = {
"#1#.x joker value's",
}
},
},
allowed_sets = {
["Joker"] = true,
},
config = {
extra = {
increase=1.5,
},
},
apply = function (self,mutation,card)
print("mutation:",mutation)
SMODS.increase_object_value(card,"*",mutation.ability.extra.increase)
end,
remove = function (self,mutation,card)
SMODS.increase_object_value(card,"/",mutation.ability.extra.increase)
end,
}
why that doesnt work
err odd question but can i dubuff tarot cards with SMODS.debuff_card
Should be able to just fine.
context.during_scoring?
i tried other things that didint work and it was 3am
my brain wasnt working well
There is a list of contexts on the wiki
i tried them and still nothing
Describe the intended effect.
Its because youre checking for other contexts in a check for context.debuff_hand
That arent called at the same time as context.debuff_hand
how do you get the list of all suits in the pool?
Hey salty ghosh, back to good old avatar? 
yup :3
SMODS.Suits
if you want a random one you can use pseudorandom_element on it and it respects in_pool
We are cooking so hard (playing daily sudoku)
awesome, thanks :D!
someone?
Is there a way that I can debug myself a booster pack
like make it appear?
yeah
you have the debugplus mod installed?
yeah
go to a shop, then in the collection hover the booster you want to spawn and press 3
ok thx
np
How does card rarity weights work
Im trying to figure out how common I should make my jokers
How can I debuff all cards that meet a certain criteria currently in deck for a joker?
should i put everything from if to end in the loc_vars section of my code?
How can I get the booster pack to have two card rarities
iterate over all of them in the card's add to deck function and debuff from there
are you adding a new rarity?
I have two custom rarities
In this case, you can roll for the rarity in the create_card function, and then pass only one along
I want both to be able to appear at the same time though
create_card is called for each individual card I think
But doesnt the park rarity need to be determined before the pack is opened
pack
bc right now it is only doing the trash cards
by randomly picking one of the two rarities in the create_card function, that random pick is made each time each individual card is created in the pack
yes this is pretty basic programming logic
get a random number from 1 to 4, only spawn a non-trash card if the number = 4. now there's a 25% chance to get a non-trash and a 75% chance to get a trash
👨🍳
This is what I did, and it just is not working for some reason
Is it bc of me trying to make a variable again
It was bc of me trying to make a variable again
I hath fixed it
add_to_deck = function(self, card, from_debuff)
SMODS.debuff_card(G.tarot_cards, true, "tarotdebuff")
end
```ok well this is obviously wrong
you probably have to define what is being debuffed
any thoughts on how to create a joker which triggers the joker to the right BEFORE cards are scored (i.e. context.before) . My first thought is to either call the jokers calculate function with a modified context where the it is prematurely set to joker.main, which does 90% of what I want but ends up triggering all jokers to the right. Copying/creating a context to pass to calculate (or SMODS.blueprint_effect) does nothing. I feel like im so close but am missing something
i also tried calling calculate with the modified context & immedietly restoring but that also ends up doing nothing)
The issue with joker_main as your test case is that it would only work for jokers that trigger in joker_main, which will definitely feel off to players
that's intended, i wouldn't want retrigger jokers triggering on an empty card
Cryptid has this joker implemented and the way it works is truly by just hardcoding what should happen in for every vanilla and modded jokers
BRUH
yes they literally add a new context.forcetrigger and add behavior for that context to every single vanilla and cryptid joker and you have to use context.forcetrigger if you want it to work with your own modded jokers too
need help. happens when i hover over my joker.
i did get a 'compatible' description working that just copied blueprint compat but I could go further (probably have to hard code) to limit it
Something else to keep in mind is that Balatro's jokers, and the entire modded ecosystem because of that, are not built to internally distinguish between separate parts of an effect. Only ever wanting to check joker_main is probably the safest, but you'd also need to be able to communicate that to the player. Otherwise you can run into the issue where there's multiple effects that trigger on the joker. Think of some scaling jokers, for example, where there's a difference between what scales a value up, and what scores the joker
I've looked into setting a similar system up and I truly don't think there's a way to do it that's both generically functional while also making sense to players somewhat intuitively
Modifying the context will pretty fundamentally alter how things get called and checked, yeah
there are also jokers that will prepare values in other contexts to use in joker main
can anybody help with this?
where do you create valid_ass_cards?
everything from if to end was written to me by the wonderful s
i placed it in loc_vars after all else failed
yes, but where do you create valid_ass_cards
the first line is where you crash
honestly i am very bad at modding so i apologise
values are reset here
honestly i just copied a lot of vanillaremade's mail-in rebate
well firstly, that's a local table so you cannot access it in your loc_vars function
secondly, you also need to make sure you run this function when you hover the joker for the first time
bump!
going to look for the context that allows it to trigger when the joker is hovered over for the first time, thank you eremel
Firstly G.tarot_cards doesn't exist, Secondly, SMODS.debuff_card takes a card, not a card area.
How would one prevent the player from pausing the game for a certain amount of time?
is there a way to modify the likelyhood a given joker spawns with an edition?
Still trying to figure this out, do I need to create a class to achieve this?
Hook G.FUNCS.options
Like the variable is being read in the file
But it doesn't work
Hold up
what exactly is your goal here
My goal is to "import" a data from another game to be used on the mod
Like a High score of the game being used as mult
For instance
I tried to make it read the file bit Smods doesn't support it
i know there's lua system functions to read the file
Did you try NFS.read?
yea that
Kinda
It isn't a txt file
I made a .Lua file where the player would have to put the variables
Kinda jank
if you're gonna have the player manually write out the variables, might as well just make it a txt file for them
This is the best I can do with my experience
Also wait
That's why I didn't do that
I don't know if this was implemented yet
i dunno if you're using european or american dates, but yea that was either 2 or 5 months ago. i don't think it's about it being implemented but just understood, the NFS stuff is unrelated to smods entirely
Really?
help me with this please (idk if you guys need more information to help me)
Also 2 months
Why do you have a function to check if a joker exists?
specific joker that plays music
Yes, but next(SMODS.find_card("j_modprefix_key")) should do the same thing.
oke, ill change every single jokerExists instance in my mod for that then
Checking this right know, it doesn't seems to be document anywhere
On the wiki
Yes, it's not a function that is related to Balatro at all.
And also in the internet
ok, i changed it
The first result is Google AI not providing any source
Search nativefs.read
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Check for nil
This?
Yes.
what would be the easiest way to split a string after a specific symbol shows up
like if i wanted it to split on the first _
into two strings
string.find([string here], "_") will return the position of the first _ in [string here] (1-indexed)
then string.sub([string here], 1, index) gets the substring from character 1 to character #index (inclusive) and string.sub([string here], index, -1) gets the substring from character #index to the end (inclusive)
so putting it all together:
local index = string.find("example_string", "_")
local string1 = string.sub("example_string", 1, index - 1)
local string2 = string.sub("example_string", index + 1, -1)
i changed the joker check thing for that but it crashes the game now
that gets string1 = "example" and string2 = "string"
the gifs are STILL BLOCKED
Code?
wdym
What does your code look like?
which one
i'll try and implement that tomorrow. goodnight and thanks for your help
Log?
Is the file at assets/sounds/music_tvtime.ogg?
yuh
random but isn't there a shortcut other than holding 'm' which restarts the game?
alt-f5
praise
local data = {}
for line in NFS.read("imported/game_data.txt") do
local key, value = string.match(line, "(.*)=(.*)")
if key and value then
data[key] = value
end
end
SMODS.Joker {
key = "golden",
atlas = 'Joker',
pos = { x = 7, y = 8 },
soul_pos = { x = 7, y = 9 },
blueprint_compat = false,
rarity = 4,
cost = 20,
config = { extra = { mult = data.hs or 1 }, },
loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = { key = "fnaf_WIP", set = "Other" }
info_queue[#info_queue + 1] = { key = "fnaf_sprite_WIP", set = "Other" }
return { vars = { card.ability.extra.mult or 1 } }
end,
calculate = function(self, card, context)
if context.joker_main then
local score = card.ability.extra.mult
if score > 10600 then
score = 10600
end
return {
mult = score
}
end
end
}
Like this them
I swear if this doesn't work I might get crazy
But I can't check right now
No, it would be for line in NFS.lines(SMODS.current_mod.path.."imported/game_data.txt")
is there a way to get backslashes in a string without lua complaining about invalid escape sequences
Have you tried putting 2?
2 what
2 \s.
\\ is an escape sequence that sends a single \ through to the actual string
when I used SMODS.current_mod_path to get the file path to my mod it used backslashes
but NFS.GetDirectoryItems accepts forward slashes
but yes forward slashes are easier
if I use both will it understand to do that
Ok thank God that this was just this error and the code is fine
I should probably just use the escape sequence so they're all the same type
ok, the error was goddamn stupid, it seems i accidentally deleted a music file that the mod was using because i thought it was unused, sorry for wasting your time
how do i check the specific boss blind the player is up against
G.GAME.blind.config.blind.key
i needed this too, thanks dud
blinds use bl as their object type prefix thingy so it'll be like "bl_manacle" for vanillas
goat behaviour
truely
final blinds also add final_ after the starting part and don't include the adjective (vedant leaf = bl_final_leaf)
mods may or may not respect this
at their discretion
so amber acorn would be final_acorn?
bl_final_acorn
perfect
local data = {}
for line in NFS.lines(SMODS.current_mod.path.."imported/game_data.txt") do
local key, value = string.match(line, "(.*)=(.*)")
if key and value then
data[key] = value
end
end
I assume that .path.. is the actual path
I just left there because I need to get the file path properly
Since I still need to rename the folder
SMODS.current_mod.path is the path to the folder that contains the current mod
.. is the concatenation function, it attaches the second string onto the end of the first
so it expects there to be a file at [mod folder]/imported/game_data.txt
I thought I'd ask here again: how would I forcefully add a card to the scoring hand (no matter the hand's current size) without changing the type of the scoring hand? (in context.before, preferably)
Can someone help me, please?
I want to create a mod that removes the vanilla jokers so that only the jokers from my mod appear.
I don't know where in pokermon this is
it's a config option
well figure it out
Vanilla remade
I've already given up on this
Thank
i can literally give you the code if you wait until the weekend lol
-# it hasn't even been 30 minutes...
how do i recreate umamusume on balatro
make the horse girls into jokers that randomly pin and unpin themselves and they can only give you their regular joker effects if they're in the leftmost joker slot at the time of calculation
What Meta said, mainly. You could also use the gacha system you made earlier for it :3
true
Love those ideas, will there be anything like the legacies?
what if theres a menu for legacies on the new run screen
🤔
at the end of run maybe you can choose one joker to be taken as a legacy, then its sparks will be randomized and added to a permanent storage
on entering a run you can choose 2 legacies which can affect your uma jokers
maybe inspiration can happen like, every 4 ante or so idk
Is inspiration randomized in game or is it a set thing? (I couldn't figure it out)
i think its set
so i think every 4 antes is actually a very nice timing
enough for 2 inspirations like in game, and just so happen to be when you are going to fight the showdown blind too
also i should probably code the jokers' effects in such a way that they can be given to other jokers too, actually
I'd love to see how this mod turns out, your previous works have all been amazing :3
aw thanks :3
Bump
hmm this changes the poker hand?
...
I didn't know that existed...
oof
oh wait, thats for splash effect, hm
idk where ive seen it but ive seen people adding card to G.play with :emplace in context.before before
have u tried that 🤔
I will rn
I'm trying to get localization for custom booster packs to work and it just won't, no matter what I do.
is that actually where you put booster localization
In Other? I'm 99% sure
mm one sec
Where are all cards in the deck stored?
mm looks correct if your mod prefix is mot, whats wrong?
should be correct if the Other is inside descriptions table
Sure is :\
G.playing_cards?
is it showing ERROR when you are in a pack
The packs have no name, description and yes it says ERROR
0 localization is loading
oh yeah @subtle merlin my idea was close, but the context is too late
you ideally want to add the card before this runs
-# *Addendum: G.deck for all cards currently in deck
I fixed it
o
Noted, when is that function called?
How would one have multiple music play at the same time?
hi mini
hi i have a question
exponentiation its exclusive of talisman?
or like i can make my own?
Yes.
You could. Or you could just become Talisman dependent
im doing a pretty unbalanced mod without logic behind
you can add exponential yourself, but its honestly preferred that you use talisman instead because ^ is very likely to get you above naneinf
somewhere here
penumbra?
alr, i'll try calling it in context.press_play
uhhhhhhhhhhhhhh no clue, maybe something related to modulate_sound(dt)?
No, I mean for example the boss blind theme and the main theme at the same time.
i thought about just using play_sound but that wont loop
mm im out
I'd like to debuff all spade cards if they have the given enhancement for this joker, but it crashes without an error, can anyone help?
calculate = function(self, card, context)
if G.playing_cards then
for k, v in ipairs(G.playing_cards) do
if SMODS.has_enhancement(v, "m_willatro_overgrown") and v:is_suit("Spades") then
SMODS.debuff_card(v, true, card)
else
SMODS.debuff_card(v, false, card)
end
end
end
end
source argument in SMODS.debuff_card should be a string, you are using card which is a table
Same thing
whats the code now
I tried that, but it sounded weird.
gulp
no clue, that seems to be how balatro is running music in the background, i kinda assumed you can make two run at the same time somehow with a function semi-identical to that
just replaced card in SMODS.debuff_card() with the string of the joker.
so it looks something like SMODS.debuff_card(v, true, "idfk")?
Yes
and is it actually the same crash as before
Never mind, it seems to only be strange when the pitch_mod is not 1
Yes, no crash without that code.
Yeah, no crash message.
You need a context check.
there seems to be an issue (well, two, but i want to fix this one first)
What context should I check? I'd like it to apply at all times.
maybe you shouldn't have it in calculate at all. put it in add_to_deck instead?
that wouldnt account for new cards, though
calculate = function(self, card, context)
if context.debuff_card and SMODS.has_enhancement(context.debuff_card, "m_willatro_overgrown") and context.debuff_card:is_suit("Spades") then
return {debuff = true}
end
end
(i should have mentioned this is a deck im adding this effect to)
(talking to bill cipher)
(oh)
calculate = function(self, card, context)
if G.playing_cards then
for k, v in ipairs(G.playing_cards) do
v.ability.debuff_sources = v.ability.debuff_sources or {}
if SMODS.has_enhancement(v, "m_willatro_overgrown") and v:is_suit("Spades") and not v.ability.debuff_sources[debuff_key] then
SMODS.debuff_card(v, true, debuff_key)
elseif v.ability.debuff_sources[debuff_key] then
SMODS.debuff_card(v, false, debuff_key)
end
end
end
end
oh nvm
didnt know you can use context.debuff_card for that too
My one downfall in balatro modding is not understanding all the contexts.
have u tried REMOVING the card from G.hand first
like,
local add_card = G.hand.cards[1]
G.hand:remove_card(add_card)
G.play:emplace(add_card)
sigh that was it, yep
Last question: how can I make the card added to hand score?
it doesnt score?
it seemed to be scoring just fine in the video with the flipping bug 🤔
yeah thats what im thinking too
nvm i prob could word that much better with a bit of help
quick question, how does one make a deck with a starting joker?
uuughh.. face in hands, I know this is probably a dumb question. but I am not a smart man and my attempts are getting me nowhere, whats the best way to have a joker add xmult for every queen currently in deck? sort of like steel joker maybe but yk. checking for rank instead of enhancement
jokers = {"j_modprefix_key"} in the config.
I'm on my phone so i don't have access to ide stuff or the names of locations but the basic idea is
update = function(self, card, other parameters idk)
local count = 0
for i,v in --[[the deck, i think it's G.playing_cards or something]] do
if v:get_id() == --[[ queen id number, 12 right?]] then
count = count + 1
end
end
card.ability.extra.xmult = count * card.ability.extra.xmultpercard
end
and then during the relevant joker calculation step return {xmult = card.ability.extra.xmult}
idk if it's the best way, but that's how I'd do it
i dont think you should use update here
use loc_vars for the description, and check how many queens you have in calculate when needed
-# and yeah, queen's id is 12
that sounds better yeah
thanku, ill try it in the morning
hushhhg.. I like. vaguely get how to get static normal effects down but anything that has a changeable variable gives me a headache
oh, also you'd be doing for i, v in ipairs(whatever table is the deck)
i still don't really get why for loops in lua need pairs or ipairs to iterate through tables but there you go
??
is this something wrong with the game or just a mod
i tried revalidating files but same issue
pls use _, v instead
that way gc can clean up memory
tbf i was copying bill's code
whatever you dont use, throw it away
thanks, im already doing that lol
i get the linter yelling at me all the time
selene is a godsend
??
the lua linter?
oh, this?
yeah but i dont use vscode tho
ic
idrk
yo! im trying to debuff tarot cards, and so far this is working. but its only debuffing cards that are held in the consumeable slot, tho thats completely understandable since thats what the code is doing. i was just wondering how i would get tarots to be debuffed in the shop and in packs
light mode is the bane of my existence
literally everyone says this every time leave me alone
i like light mode and i dont like dark mode
ok then why is your SMODS has yellow squiggly line
no SMODS lsp_def?
idk it alwats does that
ofc it does, the lsp has no idea what smods is
unfortunate
anyway is it a voucher or a joker or something you made?
joker
well i did the thing im supposed to like pointing it to the lovely dump and stuff and everything else works but it just squigglys smods for whatever reason
Use G.I.CARD instead of G.consumeables.cards
oh
actually why not just debuff tarot on use
functionally the same i think?
wel ill try G.I.CARD and see what happens
g.i.card causes what i like to call a crash
ok can we see the log
you LIAR!
Yes.
Code?
No.
what is the crash log
yeah dud
its indexing a nil field
use
if v.ability and v.ability.set and v.ability.set == "Tarot" then
invoke_skibidi_toilet()
end
replace invoke skibidi toilet with whatever you like
ah ok
like this
i will be devoking skibidi toilet
smods supposed to have autocomplete like that
i mean i use neovim which lets me use a locally installed lsp
so i can configure it but you can declare a .luarc.json
that has path to your lua library definitions
yeah i did that
but thats beside the point
hey it works!! thank you both
np, remember that everything is a table and field access is actually just a hashmap index
those are just words but i think i understand.
ok let me explain
no let me try first
so in lua there are only numbers, strings, function, and table (and pointers for ffi)
ok nevermind i was gonna be way off
table can be a function if its metatable has a __call function
so when you call a table its actually invoking the __call method
ok now you can study object oriented programming in lua or something
is this jerker balanced
Im new to Modding, why does this appear?
ok the mod 5 nights at balala is screwed
it's attempting to index a field of a nil value
depends what balance you're going for
cryptid
probably
that means?
uh, you have to create a table first
so
Five_Nights_at_Balatro = { ju_fuju = false }
insert that at the first of your mod files and ur good
thanks :D
np, good luck adding zzz to balatro later down the line
why does this error happen now? local joker_src = NFS.getDirectoryItems(SMODS.currentmod.path .. "jokers" )
SMODS.current_mod
thanks but saw it myself rn xd
Thank you
pro tips:
smods has a wiki page in their github repo
localthunk is online! hello thunk
It's trying to index the number of blinds defeated
How to count the number of a certain joker among jokers in slots?
-# Ortalab's function may not be passing arguments?
#SMODS.find_card('j_joker') to count all Jimbos held.
-# My "Tom Scott" Joker uses that.
thanks
I like to put my mods in a folder i call Mr Bones when they're unstable and buggy
I meant the card that gets added to hand
in which vanilla file I can find the "balance" function from the plasma deck?
I need to see it to see how it works and implement something similar for a joker
yes i know i already sent this but it's trying to index the number of blinds defeated
if i were to do card.ability["extra"] it would go to card.ability.extra right
yes
great
Did you override that value?
im not making any mods
what is the exact name of the function?
i tried with balance or plasma but it doesn't find it
i linked to the exact line
ah, now i see it, thx
you can just return balance = true from a joker to achieve the same effect
How do I check if a specific hand is played? Like a Full House
you have a mod that is broken and being silly
context.scoring_name == "Full House"
Thank you :3
oh, alright
except this joker I'm making doesn't do the "exact" balance calculation
basically this:
Removes 10% of total Chips,
the 10% is added to total Mult
raise it to ^2
download the cardsauce release
-# Oh dear-
what happens if I do card.ability["extra value"]
does it become card.ability.extra_value?
yup
convenient
I wanted to give a different message text that the balance function does with plasma deck.
But for some reason it crashes the game, how can I fix this?
no, it'd be card.ability.extra value but you can't reference that so you need to use card.ability['extra value'] afaik
oh
thats why we dont tend ot use spaces
bump
how do i get the rounds to make a Joker cooldown?
is there any way to prevent repetition from happening on a joker at the end of a round? i'm kinda stuck. i'm trying to make one that repeats itself adding +1 mult to the counter "card.ability.extra.rep" times (fyi this is done for comedic purposes, not for anything useful lol) and is supposed to add 1 to card.ability.extra.rep when a round is over... 🥲
add and context.main_eval to the last if condition
ah, so like this? if context.end_of_round and context.cardarea == G.jokers and context.main_eval then
will try that out
hrmm didn't seem to work 🤔
how do i fuckin fix this
bump
code please
anyone??
include the crash
you cant get impatient when youre missing key info 😭
is "fmod" referring to the function in math?
what if you also add not context.retrigger_joker?
alright so instead of doing the message like plasma deck does with its balance function instead it gives me this error:
can try
this is gonna become one hell of an if statement lol
what's your code
hi dilly
Hi n
that worked! tysm :D
oh ok i see, if the first screenshot is in your code that's wrong
doesnt plasma deck use attention_text?
that's an smods thing
🤔
bump 2
Hi bepis
hi dil
what do u mean by this
like, having the cooldown tick per round?
if so then if context.end_of_round and context.main_eval (i dont remember if this is necessary or not) then in calculate
so like, If the Joker gets activated, It cant be activated for 3 rounds as an example
so basically I copied the same functions of the balance effect and changed them to give a different effect, then in the 2nd screenshot there's the text part which... I don't know what's the problem:
Create a counter stored in the card that's decreased at the end of the round
And only let it trigger when it's at 0 for example, and reset the counter
instead of that second screenshot just return { message = "Relativity!" }
also i think you want mod_mult and mod_chips or it's not going to work properly in the next smods update
so I gotta substitute hand_chips and mult with mod_mult and mod_chips?
oooh I see
Small question: is there a way to make the message effect similar to the plasma deck?
Like it does with the big word "Balanced"?
cuz rn it gives the message like a normal joker does
thats why i said you gotta use attention_text..............
replace the return for card_eval_status_text(card, 'extra', nil, percent, nil, {message = "Relativity!", colour = {0.8, 0.45, 0.85, 1}})
i think
nope
i was looking at the wrong code lol
it's what bepis said
attention_text({scale = 1.4, text = "Relativity!", hold = 2, align = 'cm', offset = {x = 0,y = -2.7},major = G.play})
Is Xchips implemented in the new smods version? Or should I implement it myself? I'm tired of talisman so I'm not using it
it is
and emult?
no
emult doesnt make much sense without bignum tbh
xchips has been around for a while
Is for just one special card
Oh so in 711a is enabled?
you can implement your own emult if you really want to use it without talisman
yes
Nice
Yeah I'm wondering If I want to spend my time on that
for just one card
shouldnt be too hard, since its just one patch/hook to SMODS.calculate_individual_effect
just so you dont run into this: "Xchips" doesnt work as a key
so how do I use it?
xchips
key == 'x_chips' or key == 'xchips' or key == 'Xchip_mod' are checked for.
why is it Xchip_mod actually
Ill try it then
why isnt it xchips_mod....
hahahaa
and like, Xchip doesnt even exist, so??
half the keys on my kyboard re not working i hate this..
Probably just like Xmult_mod.
Same for me
they trigger more than one time sometimes
yeah true, but im p sure Xmult is actually a thing
is so annoying
its chip_mod
and singular chips is also, weird
I tried like this but it gives me this error:
I did have to grab all of such chip/mult keys a while ago for ActiveSync.
togabalatro.chipmultopswap = {
['chips'] = 'mult',
['h_chips'] = 'h_mult',
['chip_mod'] = 'mult_mod',
['mult'] = 'chips',
['h_mult'] = 'h_chips',
['mult_mod'] = 'chip_mod',
['x_chips'] = 'x_mult',
['xchips'] = 'xmult',
['Xchip_mod'] = 'Xmult_mod',
['x_mult'] = 'x_chips',
['xmult'] = 'xchips',
['Xmult'] = 'xchips',
['x_mult_mod'] = 'Xchip_mod',
['Xmult_mod'] = 'Xchip_mod',
...
can you screenshot the code i sent you
@red flower My memory leak problem was related to talisman. That's the reason I'm uninstalling it ahhahaha
Just in case anyone run in to this
Uninstalled talisman and had stable fps
do you see that mod_mult is a function
oh... so how can I call that function?
mult = mod_mult([your valu here])
value
alright
now it works!
thank you!
small another question: is there a context that makes the scripts of a joker trigger right after all the jokers give mult, chips or Xmult?
like after context.joker_main but not after the game does the Chips x Mult calculation
context.final_scoring_step?
oh hey, I think the counter UI also gets drawn on the back of cards, that ain't great
alright, I'll try this and see what happens
local old_calculate_individual_effect = SMODS.calculate_individual_effect
SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, from_edition)
local res = old_calculate_individual_effect(effect, scored_card, key, amount, from_edition)
if key == "Emult" and amount then
if effect.card and effect.card ~= scored_card then juice_card(effect.card) end
mult = mod_mult(mult ^ amount)
update_hand_text({ delay = 0 }, { chips = hand_chips, mult = mult })
if not effect.remove_default_message then
if key ~= 'Emult_mod' then
if effect.emult_message then
card_eval_status_text(
effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus,
'extra',
nil, percent, nil, effect.emult_message)
else
card_eval_status_text(
effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus,
'emult',
amount, percent)
end
end
end
return true
end
return res
end
I think I'm missing something. I'm trying to implement my own Emult
Doesn't really work right now
why does this not show the description and name In game?
descriptions = {
Joker = {
j_fnab_NightDelight = {
name = "Nightmares Delight",
text = {
{
"test"
}
},
},
},
},
misc = {
dictionary = {
}
}
}```
return{
descriptions = {
Joker = {
j_fnab_NightDelight = {
name = "Nightmares Delight",
text = {
"test"
},
},
},
},
misc = {
dictionary = {
}
}
}
like this, maybe?
should work
sadly it still doesnt work
but the name is being displayed?
how do I access the score the current hand will give before its added to the total chips and which context would be used? using context.final_scoring_step and context.cardarea = G.jokers is too early
Have you tried copying from Talisman?
hand_chips*mult
it works pretty well, thanks!
where would these be saved? couldn't find them in G.GAME.current_round atleast
They are global.
nope, both arent there
is the file called default.lua?
its called en-us.lua
this didn't work for me aswell and I couldn't be asked to find the problem, so I just named it default.lua
if you're not using english in-game the en-us localization won't show up
<@&1133519078540185692>
<@&1133519078540185692>
mods
at mods
thank you mods :3
thank you reporters :3
Thank you mods :D
I just fixed mine, It was shown as a .lua file on Visual Studio but in the mod folder it was a text file
Did you add "Emult" to SMODS.calculation_keys?
These are just the keys talisman used
3: i see
anybody know why my joker is hard crashing my game?
this is meant to copy the ability of the rightmst Joker if you have a spade held in hand, this used to work but i believe it broke after i updated SMODS
I don't even get a crash log or anything it just closes the game
idk if its the problem but the rightmost joker is G.jokers.cards[#G.jokers.cards]
calling :is_suit outside of a context check I think
it'll crash with quantum enhancements
is that because of calling it outside of a context check?
not really familar with how quantum enhancements work
yes, card:is_suit does a quantum enhancement calculation check, so you just infinitely loop and stack overflow
is there a documentation on the NFS.getdirectoryitems type stuff
I believe you can wrap the entire thing in
if not context.check_enhancement then
-- code here
end```
i'll try that thank you eremel
google love2d filesystem
oh is it just the love.filesystem stuff
this worked thank you
how come this code doesnt work:
calculate = function(self, card, context)
local other_joker = nil
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
other_joker = G.jokers.cards[i - 1]
end
end
return SMODS.blueprint_effect(card, other_joker, context)
end
yet this code does:
calculate = function(self, card, context)
local other_joker = nil
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
other_joker = G.jokers.cards[i + 1]
end
end
return SMODS.blueprint_effect(card, other_joker, context)
end
the difference is just G.jokers.cards[i - 1] or G.jokers.cards[i + 1]
neither of them should work because G.jokers.card doesn't exist
elaborate on "doesn't work"
also make sure you didn't also make the typo in your actual code
there's no typo in my actual code
what i mean by "doesn't work" is that it simply just doesn't copy the left joker
i'm basically just making blueprint to the left
blueprint uses G.jokers.cards[i + 1], this uses G.jokers.cards[i - 1], and changing the code to be G.jokers.cards[i + 1] makes it copy the joker to the right, but G.jokers.cards[i - 1] makes it copy nothing rather than the joker to the left
okay now i look insane because i'm going back and testing it again and it works

@frosty rampart Yeah, seeing this, I'm wondering if a lot of the stuff isn't hardcoded to the Sprite object in a way that would potentially need some refactoring for our hopeful implementation, haha
i've gotta dig into how shaders work some more, but my hope is that "texture_details" and "image_details" can handle a love2D "Quad", which is a surface you can draw a canvas to. i know how to get the UI to draw to the canvas and the canvas onto the quad, the missing piece is just getting the quad into the shader
or that the shader can take some alternate way to pass an image into it
I'm consistently surprised to learn that Love2D as an engine is a lot more barebones than I assumed, haha
here's the documentation if you're interested btw https://love2d.org/wiki/Main_Page
I think I'm just gonna crash the game on purpose a few times and see if I can trace down what things would be missing, and find a new place to dig from there
Oh like using another texture in a shader?, i've done that.
we're trying to shove UI into a shader
@frosty rampart I'm wondering if it's not possible to just port the draw_shader function to UIBox with only minimal changes, honestly
For what purpose? Could you not just make the UI on the cards with said shader?
I'm trying to see if they have any very relevant ways in which they differ but I think most of the stuff should work out
for ice's Counters, we're drawing text on top of a card
probably yea. on my end i feel like i keep digging through more layers and i can't find the bottom, i need to look at the dissolve shader code itself now lmao
drawing text atop a card would be a really handy tool in the design arsenal, and Meta and me both have objects that would really benefit from it, so we're trying to see how difficult it'd be to set up
What about layering?
But the manipulation and movement of cards is largely done by the dissolve shader, so the actual number on the counter is totally immune to those changes, which looks less than ideal
I'm not sure what you mean, so there's a chance that solves it and I'll sing some praise 😛
chat i might have just cooked a devious plan to print infinite content
I haven't messed around much with UI text specifically, i'll try messing with it a bit and see what you can do for it.
i cant wait for trance to absolutely destroy the counter ui btw
if i do if context.pseudorandom_result then without checking for either result type will that if statement run any time a probability gets rolled
the dissolve shader lets the cards skew as if they're rotating in the third dimension, this is pretty much the only/easiest way to do such a thing because balatro is in a 2D engine. all UI objects, including text, are drawn directly to the screen. it doesn't pass through a shader at all
I'm just gonna try and port the function to UIBox and see what crashes that will create, haha. I don't think the shader needs anything to inherently be a sprite
it should, yes
eureka
build your own jokers
or UIElement, I guess, not UIBox
goddammit why did it scale itself
local _card = SMODS.create_card(create_args)
_card:add_to_deck()
_card.can_sell_card = function(self, context)
return false
end
_card.calculate_joker = function(self, context)
if context.end_of_round then
self:start_dissolve({ HEX("57ecab") }, nil, 1.6)
self:remove_from_deck()
end
end
_card.can_calculate = function()
return true
end
G.jokers:emplace(_card)
Any reason this sets my jokers limit to -27 after a blind where is debuffed? xd
is this a joker?
calculate = function(self, card, context)
if context.setting_blind then
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = function()
G.GAME.joker_buffer = 0
for _ = 1, card.ability.extra.copies_number do
local create_args = {
set = 'Joker',
key = 'j_ina_Hattori',
edition = 'e_negative'
}
local _card = SMODS.create_card(create_args)
_card:add_to_deck()
_card.can_sell_card = function(self, context)
return false
end
_card.calculate_joker = function(self, context)
if context.end_of_round then
self:start_dissolve({ HEX("57ecab") }, nil, 1.6)
self:remove_from_deck()
end
end
_card.can_calculate = function()
return true
end
G.jokers:emplace(_card)
end
return true
end
}))
end
end,
It's a card that gets created from a joker and after the blind destroys
What did you base this code on? I don't know why you'd wanna override of a card
Because if I don't do this the card doesn't destroy on a blind if it is debuffed
What object is this calcualte for?
when I say card I mean joker
sorry
it's a joker that creates 2 basic negative copies of himself
yes but you're overwriting a fundamental function that you shouldn't be overwriting
I mean this works pretty well, I've used it other times with no problem
this is the only joker that seems to have some kind of problem
um
not encountering a problem doesn't mean it's not problematic design
so like why don't you just set those things in the joker that you're making tho
like in the Hattori joker
You also shouldn't be overwriting can_calculate, as that will definitely cause fundamental issues with other jokers, like dagger
This is the hattori joker
The simplest thing would be to hook can_calculate, not overwrite it, and just set a parameter that allows a card to still trigger if it's debuffed
Alternatively, you can patch in an additional context after setting_blind that includes ignore_debuff as parameter, and check for that
i think i dont have the mental capacity to explain everything wrong with this approach
or even actually understand it myself
pog
i got the scaling effect fixed
But I really recommend not usign this approach because it will create a very large number of edge cases that will create strange behaviour, and you'll not really be able to get coding help with such an unconventional approach, because it does take a while longer to parse and understand what's happening and what could be going wrong
i forgot lucky cards roll twice lmfao
I guess so, I just didn't know how to do this. Asked N before and told me that it wasn't that bad doing this
I'll try to reestructurate everything with hooks
boy i wonder if keywordifying scaling effects in this manner might have a payoff
I'd definitely trust N over me, that's for sure, haha
But it does make assessing what's happening a bit more difficult. In this case, I think you're overcomplicating it by overwriting functions, at least
yeah yeah I totally agree
I'd just create ajoker object for these objects, still, just so you can have more control over it. The way I'd do it is a can_calculate hook from there and just check if the joker has a 'always_ignore_debuff' quality that you set on it, or something like that
oh shit this is dev chat sorry for being spammy
I don’t think overwriting those functions for what is effectively a temporary joker is that bad, though it depends on when they’re created
In checking calculate_joker I did realize that I was confused for a moment over where things like calculate_seal are called from, haha
That's what I thought
They get created when setting blind
and destroyed at the end of the round
I really don't get why the -27 jokers size
Can you screenshot the full code for the joker it’s creating?
You mean this?
But can_calculate is used in enough timing frames that I think it can definitely create very odd behaviour, no? Though maybe I'm still in the old mindset of Victim's can_calculate which also checked for destruction target effects and such
I don’t think it needs the can calculate override, you’re right there
I'm really sorry for this mess lol
Oh, I think it'd be because end of round triggers for each card, and the event queue probably causes timing issues that makes the remove from deck effect remove a slot for every triggered instance
Oh btw, Eremel, just because I came across it today, but is the ignore_debuff context parameter just there in case people want to use it for a custom context, or is it used in any of the standard smods contexts?
no more -27 jokers limit yep
I do still advise you to just add a flag to the joker and hook can_calculate to check that flag, just because that means you can use it for other things as well, haha.
I know, I'll try to do that
But this quick patch is enough for people not to spam me about the bug anymore
xddd
I think in this case, your joker being Debuffed but gaining an edition would still make the edition triggered? Though my pitch doesn't resolve that either, I guess, hahaha
Can you link the mod btw? I'm interested now but I don't think I've seen you around talking about it before, haha
SMODS.Joker{
key = 'phantom',
loc_txt = {
name = 'Phantom Joker',
text = {
"This joker gains {X:mult,C:white}X0.5{}",
"for each used {C:spectral}Spectral{} Card",
"{C:inactive}(Currently {X:mult,C:white}X#2#{}{C:inactive} Mult{})",
"{C:inactive}(Concept by {}Destro{C:inactive}){}"
}
},
config = {extra = { xmult = 0.5, xmult_mod = 0.5 }},
rarity = 3,
atlas = 'kamisjokers',
pos = { x = 4, y = 2 },
cost = 6,
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.xmult, card.ability.extra.xmult_mod + (card.ability.extra.xmult_mod * (G.GAME.consumeable_usage_total and G.GAME.consumeable_usage_total.spectral or 1)) } }
end,
calculate = function(self, card, context)
if context.using_consumeable and not context.blueprint and context.consumeable.ability.set == "Spectral" then
return {
message = localize { type = 'variable', key = 'a_xmult', vars = { G.GAME.consumeable_usage_total.xmult_mod } },
}
end
if context.joker_main then
return {
xmult = card.ability.extra.xmult + card.ability.extra.xmult_mod
}
end
end,
}
any idea why this might be crashing?
It's in really early state tbh and no english translation right now
It's an Inazuma eleven mod mainly for the spanish community
I don't read anyway, no worries
Balatro players don't read
Oh man that triggered some really niche nostalgia not for the show but for the DS game, I think, hahaha
line 1136
It’s used for a few but I don’t remember which off the top of my head
Yeah, as long as your not hosting it on some 18+ site or anything called '$50 steam gift card', haha
I'll give it a look again, I might've missed the uses, then
Fk I think I can't then
Goated game tbh
Hey buddy ive got a gift card for you
My memory of it is corrupted by the ages, but I remember it being a lot of fun, hahahaha
Theorically, the last game of the saga was gonna release tomorrow. Sadly, 14 delays happened
Really funny story
so what did the new smods update
Wdym, there’s no new smods
function SMODS:save_run_state()
save_run()
return STR_PACK(G.culled_table)
end
function SMODS:load_run_state(saved_state, cb)
G.E_MANAGER:add_event(
Event({
trigger = "after",
delay = G.SETTINGS.GAMESPEED,
func = function()
G:delete_run()
G:start_run({
savetext = saved_state,
})
cb()
return true
end,
}),
"other"
)
end
why this happen with my function?
Credidt to cryptid btw
what's the nex mult mod thing then
@frosty rampart porting the draw shader functionality is definitely possible but I doubt it's the most efficient way, because it cascades down to other functions you'd need to port, haha. There's probably another way that would be less janky
oh you mean the dev build
yeah
wait for the release to be told what's changed or read the code/commits yourself
or be in my super secret modding chat
Is there any seed analyzer for modded balatro?
good to know! i think my plan is gonna be to just override whatever draw function i need to when the text UIElements' are created, that seems like the least intrusive way to do it
on the shader side i am neck deep in GLSL haha

I might use this issue to start reading up on it too, because shader knowledge is stuff I keep postponing, hahaha
will do
it might take a while but i'm literally gonna be learning GLSL in a class i'm taking this semester on computer graphics, so i have high hopes that we'll figure this out Eventually™
I think the problem and solution are probably entirely in the Balatro code, but GLSL is cool knowledge to have regardless. Be prepared for people begging you for info once you let on that you know how to make shaders, though, hahaha
I'm rooting through the shader side because I'm trying to understand how sprites format their image data when it goes to the shader, and the UI canvas is gonna need to be in the same format
but yea, it's gonna be great to understand shader stuff. might put together some sort of tutorial/template/documentation depending on what's possible
@spice wadi it was ambient noise of my switch controllers clacking about and a cat standing on my phone, hahaha
Nothing picked up I'm pretty sure
too late i pinpointed your location from the background noise
I would also love to know.... 5 months later :D
how to stop cards from colliding?
add_to_deck = function(self, card, from_debuff)
G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls + 1
calculate_reroll_cost(true)
end,
Doesn't this give a free reroll?
each shop I mean
define "colliding"
the moveable object cant move using velocity If theres two at the same position or If theres one in the next position

yeah i have no idea
I have this joker
I'm using the card object with the sprite for it to work and a custom update function
but If there's like 2 coins going to the same direction
they dont move at all
they just stay there
oh its like the yahimod joker
wait theres a joker like this already?
if theres a joker concept chances are it already was made
and is actually an ultrakill based aswell
s
this cant be good
is it possible at all to see what seal a card has when it's being played?? i'm trying to rack my head here by trying out all sorts of ways and i have no idea... i'm writing this for a seal in question where if it stays in hand it would copy whatever seals are available per card 🥲
that looks correct
if it is, then that's super weird since i checked to see if it works via sendInfoMessage and i get nothing 🥲
this is on the seal?
yeah it is
ah
the intended behaviour is that, if it's not played, it should copy every seal by the cards played
at least that's what i'm trying to do 🤔
How do i add a button to a joker? I know how to do it in the mod's config but it's different for jokers, right?
local last_use_and_sell_buttons = G.UIDEF.use_and_sell_buttons
G.UIDEF.use_and_sell_buttons = function(card)
local t = last_use_and_sell_buttons(card)
local custom_buttons = card.config.center.config.custom_buttons or {}
local function create_custom_button(b_t)
local button_text = b_t.text
local width = b_t.w or 0.05
local h = b_t.h or 0.3
if localize(button_text) ~= "ERROR" then button_text=localize(b_t.text) end
local custom_button = {n=G.UIT.C, config={align = "cr"}, nodes={
{n=G.UIT.C, config={ref_table = {this_card=card,id=b_t.id,}, align = "cr",maxw = 1.25, padding = 0.1, r=0.2, minw = 1.25, minh = (card.area and card.area.config.type == 'joker') and 0 or 1, hover = true, shadow = true, colour = b_t.colour or G.C.WHITE, one_press = false, button = 'custom_button'}, nodes={
{n=G.UIT.B, config = {w=width,h=h}},
{n=G.UIT.T, config={text = button_text,colour = b_t.text_colour or G.C.BLACK, scale = b_t.text_scale or 0.55, shadow = true}}
}}
}}
return custom_button
end
if card.area ~= G.pack_cards then
for i,v in ipairs(custom_buttons) do
local active = v.active
if type(active) == "function" then active = active(card, v) end
if active == nil then active = true end
if active then
local this_button = create_custom_button(v)
local spacing = {n=G.UIT.R, config={align = 'cl'},nodes={this_button},}
table.insert(t.nodes[1].nodes, spacing)
end
end
end
return t
end
take a look at this code for example
Okay, thank you
button is the function that gets called when its clicked
I take it that b_t is the custom_button's key?
ok so this works! ...kind of. it absolutely prints it a bunch of times so now i have to for "context.BLANK" hunting...
What are you looking to do
i'm trying to make a seal that copies every other seal's value in each played card in a hand
so if example if you played a Blue Seal, it would copy however many chips the Blue Seal would add to the coutner
maybe i'm bad at explaining lmaoo
say you had the seal in your hand-- if you choose to play a card that has a Blue Seal on it, the seal would copy that Blue Seal before letting the actual Blue Seal do it's thing
ultimately resulting in more chips
Blue seal doesn’t give chips 😭
wait it doesn't?? am i stupid
...
...curse you my brain 🥲
i sound like a maniac rn when a better example would've been a Gold Seal or something 😭
Wait, where would I put this to test it?
You sound like a clanker
anywhere then u would do config = {
custom_buttons = {
{
id = "wheat_collect",
text = "Collect",
text_colour = G.C.YELLOW,
colour = G.C.BLACK,
},
},
(On the joker you wanted to add the button to)
but remember that If you gonna use the code I sent you you'll need to define the custom_button function
Here's how I defined mine:
G.FUNCS.custom_button = function(e)
local this_card = e.config.ref_table.this_card
if this_card.highlighted then
local button_id = e.config.ref_table.id
SMODS.calculate_context{
card = this_card,
custom_button_pressed = true,
button_id = button_id,
}
end
end
what i MEANT to say is that it should copy any seal on any hand that you play
so if you played a Gold Seal, the seal i'm trying to implement would copy that and give you $3 dollars, and so on
And then it should pop up, when I click the joker?
yep
like this for example
And where do I add the G.FUNCS.custom_button thing?
you just do
G.FUNCS.custom_button = function(e)
local this_card = e.config.ref_table.this_card
if this_card.highlighted then
local button_id = e.config.ref_table.id
SMODS.calculate_context{
card = this_card,
custom_button_pressed = true,
button_id = button_id,
}
end
end
ngl can we actually get this added to SMODS
Would be good
I'mma try a pull request and hope they accept
But where do I put that? Into the joker's calculate? Into the joker itself?
trying to make a joker which blueprints the left joker and debuffs the right joker, which currently works but the problem is the right joker is not getting un-debuffed when two-faced is moved. how would i implement a way for it to remember which joker it debuffed so it could undebuff them
outside of anything
not inside joker calculate
or joker
and then to create the button you put
custom_buttons = {
{
id="<button_id>",
text="<button_text>",
text_colour=G.C.WHITE,(your text colour here)
colour=G.C.BLACK(same as above)
}
}
inside the joker config
here's an example (the dragon ball card is two-faced's temp art)
then to check when the button gets pressed you can do
if context.custom_button_pressed and context.button_id == "<button_id>" and context.card == card
assuming you defined this
and this
Like this?
yep
the id should actually be your button id
and the text too
custom_buttons is in the wrong position too
It's inside config
but the rest is right
Where does that go?
SMODS.Joker{
config={
custom_buttons={
{
id="button_id",
text="Button Text",
text_colour = G.C.WHITE,
colour = G.C.BLACK,
},
},
}
}
like this for example
the custom_buttons table goes inside config as you can see
then you define a new table inside custom_buttons for each button
But I have it there, do I not?
yep but It's outside config
it should be inside config
config = { extra = { },
this is how your config looks like
wait no
SORRY
you're right lmao
😭
I didn't notice
it is inside config
mb
tht was my fault
I didn't pay attention
should work
test it
Yeah, now it works. Thank you so much :D
np
bump
Bump
Maybe you could save it in config and undebuff it in remove_from_deck?
i want them to be undebuffed when the joker itself moves not when it's removed from deck
Interesting concept
Save the right jokers sort_id in the config, then find the card with that sort_id and undebuff it.
where would i hook (or patch) to disable xmult scoring under a specific condition?
does smods have a table of all the loaded jokers?
probably just SMODS.Jokers i think
thanks
banishing all mods that use discovered = true
SMODS.Joker:take_ownership( v ,
{ -- table of properties to change from the existing object
discovered = false
},
true -- silent | suppresses mod badge
)
end```
what is this for
it makes every joker in the game (including modded ones) undiscovered by default (not locked, but it won't display in the collection and it'll say "Not Discovered!" when it shows up in the shop until you buy it for the first time)
I want to
I want to find them naturally, it also lets me see what jokers I've actually played with
ah
hew, how can i change the main menu stuff like the logo or the card in the middle?
bonus reason, cards like this only show discovered jokers
if i want to localize the name of a enhancement for joker display, id do localize { type = 'name', set = 'Enhanced', key = 'm_stone' }, right? this somehow gives me a talisman attempt to compare table with number crash 💀
No, it’s because it’s would be name_text not name
can someone explain what the purpose of joker_retriggers.toml in smods is exactly
return nil, true
(retriggers require the joker to return something iirc)
i see
it's messing with ready to fly in paperback because faceless joker is a little jank, but since the return is important we might just have to take ownership of faceless joker to rewrite its calculate lmao
(ready to fly scales whenever an adjacent joker triggers; context.discard is one of the contexts where we have to check for if the joker is returning a message because yorick counts as "triggering" every time he tracks a discard, not just when he scales. but faceless joker uses ease_dollars and card_eval_status_text instead of just returning dollars like a sane modded joker would)
my game keeps crashing whenever I select a card and I'm not sure if its because of my mod
has anyone had this problem before
well what's the crash error message?
what mods do you have
I honestly don't know what kind of error could accomplish that, I'll assume you've tried selecting other cards as well
yeah
wait
I downloaded the most recent talisman version and it fixed it?? 😭
I was using this exact same version 15 minutes ago so I have no clue why it just stopped working
thanks for pointing that out I owe you one 🫡
np
ig
i was just curious why you were using dev talisman
but figured it was bc you were using a feature of dev talisman
idk I dont remember why I downloaded it
your mod works without talisman?
no it requires it
xd
I use Xchips and emult for a few jokers

