#đ»ă»modding-dev
1 messages · Page 289 of 1
the apply never runs either?? yeesh

but this does??
maybe im using the wrong type of comma or something, slipped a zero instead of an o.
gotta be something dumb but i have no hair left to pull out over this
surely not
test A
if ive known that shit existed in the first place oh my god
sorry for sounding like a chimp with a laptop rn
i give up
sounding like a chimp with a laptop defines my existence off late tbh
i could create wonders with python but lua....
for some reason it reads the joker itself as nil
show the code?
this is in main (straight up just copied from the castle mod)
the game is pretending this doesnt exist apparently
Try putting ret.current_round.jokermostwanted = {} before you define the rank.
The castle example defines it in one variable from current_round
Also why are you using is_rank?
cause i cant find rebate to base it off
You should be using get_id()
how could I use custom text colours? e.g. {C:mult} but as a custom hex colour?
GOD i love packs
No, you would set G.GAME.current_round.jokermostwanted.id to target_card.base.id then check if context.other_card:get_id() == G.GAME.current_round.jokermostwanted.id
hmm idk i think using â â â ââ â â â â â â packs can ruin early econ... :/
cool that brought back the crash lol
What's the crash?
holy shit Pack Reverie
Which line is that?
return {vars = {center.ability.extra.mult_gain, center.ability.extra.mult, localize(G.GAME.current_round.jokermostwanted.rank, 'ranks')}}
wait it just fixed itself what
now im back to the rank just being nil
Where is mail_card defined here?
idk actually
but i changed it back to the actual joker id
is there any tutorials for creating new consumable cards (e.g. sprctrals and tarots)?
its G.GAME.current_round.jokermostwanted.rank = jokermostwanted.base.value now
still nil when it was mail_card tho
STEAMODDED 1.0.0
A tutorial on how to make a Modded Consumable!
Hope y'all like it!
https://www.youtube.com/watch?v=Zp-4U5TlbxY&lc=Ugzcg04r-IbJO-nCbUZ4AaABAg -- PREVIOUS VIDEO
https://github.com/art-muncher/Example-Mod -- EXAMPLE MOD
https://github.com/Steamopollys/Steamodded -- ST...
yeah this one line is the last problem area remainingg
why is it so far to the right
đ
oh yeah they have that
so close đ
what is the code to be able to destroy a joker and create one?
But why do they have fake cards đ
okay...
ok so the issue with this is that the way everyone does this is by multiplying the width by some value
which is fine if just one mod does it but it ends up scaling horribly
where does castle pull the base suit?
why does this only draw one card
Idk maybe itâs due to event timing?
It doesnât detect the âcorrectâ amount of space?
not mario this is your conscience speaking⊠you want to make a SMODS PR⊠and send Victin $100âŠ
I would suspect itâs thunkâs style to only assign the Castle variable or Castle exists
And honestly I think itâs justifiable
So if youâre trying to use the vanilla variable maybe it just doesnât exist
Again,
Check out Castle in the example mods
What is the problem then?
okay for the record I'm pretty sure the card limit was set to 1 so it didn't do anything more
Maybe your loc_vars are wrong
Card limit?
maybe idk
i guess I'm setting default to 52
How do I create a random tarot card?
Try printing the rank to see if itâs correct, then double check your code defining the rank to make sure itâs correct
Maybe print there too
You can use SMODS.add_card
awesomesauce
ok it is the base value fucking up for some reason
did you add game object variable
yes
SMODS.Consumable {
set = 'Tarot',
key = 'thug',
--atlas = 'scadrial',
pos = { x = 6, y = 2 },
config = {
min_highlighted = 1,
max_highlighted = 2
},
discovered = true,
unlocked = true,
loc_vars = function(self, info_queue, card)
return {
vars = {
card.ability.max_highlighted
}
},
can_use = function(self, card)
if #G.hand.highlighted < card.ability.max_highlighted or #G.hand.highlighted > card.ability.min_highlighted then
return false
end
return true
end,
use = function(self, card)
for k, v in ipairs(G.hand.highlighted) do
v:set_ability(G.P_CENTERS.m_csmr_pewterdrag, nil, true)
end,
}
what is my error in this code? the importing of this file into my mod fails
--Thug: Enhances 2 cards to Pewter Drag Cards
this is what its trying to do
its sjust looking at me like its judging me for my mistake
so uh guys? I'm trying to make a consumable that will generate a 'special' joker (special is a custom rarity i defined) but I can't get it to generate, I copied the code from riff raff and modified it a lil but it still doesn't work, any ideas?
I'd suggest copying from Soul instead
ahh okay ty I'll try that!
I had a look and the code seems very similar so I'm not too sure what I'm doing wrong:/
As I said Iâm pretty sure you need a table
where the sigma do i put the table đđ
How does one draw a image on a card?
as in how to make a sprite for a card?
cards are usually 71 pixels wide and 95 pixels tall i believe
No, i'm trying to put a second seal on a card I have everything except the sprite.
i'm pretty sure seals also use the atlas system tho
It's joover 
fuck this shit
This draws a seal where it usually would be, but I want to have a seal be down by about 29 pixels.
Did you implement vertical card area, or just place cards manually by coords?
vertical card area
No way
oh yeah isn't that the one time local thunk is used in the entire codebase
why is it fucked up
this is the 'Enhancers' atlas from base game, you could consider just making a new atlas with whichever seals you want placed where they need to be
i made debuff seal lmao
that would probably not have very good compatibility with mods though but it's a start
I have already done that.
does vol in SMODS.sound work
yes
what's that between challenge and anaglyph
Draw shader has an input to move the sprite
no clue, probably an unused sprite
Or you can make the sprite itself be positioned differently
Which one is that?
the ones that transform the x and y coordinates
does this seem fair
hermit but 1 in 4 chance to get stoned? seems good to me
(also don't need to have money to get 20 bucks so it could save your econ)
(also great concept i laffed)
I want to make a "sub-mod" ie a mod that relies on another mod to work, how do I do that?
first of all you add the mod to the dependencies on your mod's json file
and then just make your mod
profit
:3
I tried showing just the second seal it looked like this, this is a gold seal.
Code for reference.
cool!
the fabled ghost seal
is anyone here familiar with malverk
so uh, here's a dumb idea i had yesterday, anyone familiar with roffle loreâąïž wanna help out? :3
Progress.
how do i update the definition of a UIBox?
i'm removing a sprite and wanting to shrink the size of the grouping box to fit around the sprites that are there
needs to be a bit lower i think...
i'm using config.object:remove to remove the sprite, but i want to edit the UIBox's definition
this is what it should look like when the other sprites are removed, but nothing i've done to change the UIBox's definition seems to go through
How do I fix this issue where the bottom seal thinks it's still where it usually would be.
who tryna collab https://discord.com/channels/1116389027176787968/1357325052542062653
this is based on the simpsons right
sweet
dude that's my favorite episode from season 20 of the boondocks!
what's the concept of those consumables? I love their look
I wasnt really going for a specific look
But for some reason i associated gold with chance
where would the dependencies be? using this as a reference?
And the actual consumable art is just obscure references from internet media
And i base the ability/function on the actual bit from said media
add a new field like this
(inside dependencies you just place whatever mods your mod depends on)
ah, so there's not equivalent consumables that are like 'drama' or 'tragedy'?
and that would be the ID?
as in in the dependencies I write in the ID of the mod?
i WAS going to do that
But i think itd hinder my creativity in terms of making consumables
Since im basing everything on pre existing media
i recommend you check out the template here https://github.com/Steamodded/smods/wiki/Mod-Metadata
probably explains it better than i ever could
okay cool thanks!
I mean, I'm probably biased considering my mod has each joker be a movie reference, and each new consumable is a type of food, but I do think it can be really helpful, creativity-wise, to have a theme to adhere to. Both in making things feel consistent, and helping figure out how to approach new effects
morning folks
Is it possible to put a sprite from an atlas on a card like a seal?
Yes. What are you trying to do?
I'm trying to put a second seal on a card. I only need the image of the seal on the card.
I'm not entirely sure as to how it'll work on the set_sprite end of it all, but I'd recommend seeing how stickers do it. The only thing you'll wanna do is shift the seal down, probably
I tried that and this happened
It only visually moves.
is that not exactly what you want?
oh what do you mean moves?
It still thinks its where it usually would be.
oh yeah, you'd have to see how the movement is applied and offset what it sees as the centre of the sprite
it's 'moving correctly', but you have to remember that while the only non-transparent part of the sprite is the seal, the seal sprite itself is the same size as a card
I'd have assumed seals wouldn't move on their own, and just be a child sprite of the main card object, but I guess that's not the case
how would you check the rarity of a joker? e.g. in the context of [G.jokers.cards[i]]
G.jokers.cards[i].config.center.rarity
tyyy
How would I offset the centre?
I'm not sure, you'll have to dig a bit more into how the sprites are set up. Sorry I can't be a better help there
Could this be it?
that'll be the sprite's placement. I'm not sure how balatro handles the centre for its sprite movement, though
you need to set the major to be the card
That way it automatically tracks the card correctly
How do I do that?
Yessss
something like this
set_sprites = function(self, card, front)
if self.discovered or card.bypass_discovery_center then
card.children.floating_sprite_vic_belt = Sprite(card.T.x, card.T.y, card.T.w, card.T.h,
G.ASSET_ATLAS[card.config.center.atlas], {
x = 0,
y = 2
})
card.children.floating_sprite_vic_belt.role.draw_major = card
card.children.floating_sprite_vic_belt.states.hover.can = false
card.children.floating_sprite_vic_belt.states.click.can = false
end
end
Where do I put this?
I have this concept of Grass cards, which are like a stone card that start at +0 chips. However they level up when held in your hand
Currently it's an enhancement but I am playing with this idea of it also enforcing a custom edition, so I can pass that accrued +chips to the shader. The idea is they will start brown and get greener and more vibrant as they are held longer
you can set up shaders on the enhancement itself, no?
Oh I see ty! So- When do I use not context.blueprint? Isnât the blueprint only going to use the code in the if context.blueprint part?
I have heard this is possible @hushed field , but I couldn't figure it out. I do know how to get this working using an edition though.
You put not context.blueprint when you don't want a blueprint doing something. And yes.
Oh okay! Ty!
Nice parappa the rapper profile pic!
Depends on what you're doing
meh
this is weird! For some reason this is retriggering held cards after the round is over
if context.cardarea == G.play and context.repetition and context.other_card and context.other_card.ability and context.other_card.ability.name == "Grass Card" and not context.after then
return {
message = localize('k_again_ex'),
repetitions = card.ability.extra,
card = card
}
--context.individual and context.cardarea == G.hand and not context.after
elseif context.individual and context.cardarea == G.hand and context.other_card.ability and context.other_card.ability.name == 'Grass Card' and not context.after then
sendInfoMessage("1849, new method for held grass", self.key)
return {
message = localize('k_again_ex'),
repetitions = card.ability.extra,
card = heldCard
}
elseif context.joker_main and context.repetition and not context.after then
sendInfoMessage(" checking for held grass", self.key)
for _, heldCard in ipairs(G.hand.cards) do
local cardAbility = heldCard.ability.name or "nil"
if cardAbility == "Grass Card" then
sendInfoMessage(heldCard.base.id .. " has ability of " .. cardAbility)
return {
message = localize('k_again_ex'),
repetitions = card.ability.extra,
card = heldCard
}
end
end
end
I thought my and not context.after would keep me from firing in that case
I was wrong, it was logic in the Grass Card edition itself that was doing this đ, not this joker
I'm pretty sure it is tracking the card but since the draw_shader is moving it down it is not correct.
you would just append "and not context.blueprint" anywhere in your context for a trigger you don't want to be copied by blueprint, such as a scaling ability like runner
Ahh ok ok ty
I've moved Sprites before and it worked for me
this is also how the game moves soul sprites
or all sprites really
I'm pretty sure I'm already setting the major.
Does SMODS.Jokers contain every joker, or just ones added by mods?
the major needs to be the card not the sprite
nor the center
usually in SMODS, self is the Center
This looks a bit ehh
self is the card because self.extraseal is the seal. This is in a DrawStep
good enough
not sure if this is quite the right channel to ask this but,
has anyone done an exhaustive search for seeds similar to the all 10 of spades erratic seed?
How would I put the atlas on the card?
im far past normal calculate contexts
more complicated context checks for my effects
i see
also i make like 100 cards at a time so i need helper functions or i die
Also the seal does not persist if I exit and come back.
An exhaustive search of all roughly (36^9 - 1)/35 seeds? Wonder how long that would take to compute
that's a lot of seeds
not even naneinf
so true
might take a bit but you could find like a solid 0.001% of em
rahhhh github public
you'd also need to define a threshold for what deck you think is "interesting" to store the seeds, because there's no way you're storing every single one of those decks
how make card area
i mean like. how do minecraft seed hunters do it
bedrock
also, I think this means there are significantly fewer seeds than there are theoretically possible combinations for the erratic deck?
wait shit wrong end
whag
that's how you find coords based on the seed not vice versa
yes i am aware. the 10 of spades one comes from a bug in the prng, right?
yup
and the order of magnitude isn't even close
well to be fair some of them are repeats
it's not 52^52
yeah you have to factor out permutations, but even still
it's still greater than 52! iirc
yes yes, big number
it might be, I haven't looked into it that deeply
is it actually a bug or did there just so happen to be a seed where you get all 10 of spades i never knew that
like wacky uncommon stuff happens all the time when you have access to this many seeds its not unfathomably although it definitely looks like a bug
there's actually several dozen 10 of spades seeds
probably a bug then
its definitely a possibility that you just get lucky enough to get a seed like that naturally but when theres multiple occurences of something that common its probably a bug
is it a bug per se or a quirk of the prng itself
wait sorry there's just 2 iirc
I didn't realize there was more than one 10 of spades decks
there's 2 famous ones*
yeah
one is the first one the other just has like
oops, all holos
so you see people running either the first one or oops all holos all 10 of spades
but there's quite a decent more that start of 10 of spades
im pretty sure some seeds fuck up booster packs to be all 10 of spades too
balatro really likes 10 of spades
if only it was the Ace instead
fjeirbrndkdi i used Back.trigger_effect and console said itâs deprecated but when i switch to calculate it literally doesnt do anything
idk i modded a joker in just so i can play ten of spades seeds with ridiculous output
realizing I haven't updated my smods in a few weeks, should probably do that now
if you're already playing exploited seeded then you can also cheat by doing this /j
finally, a synergy for xChips Jokers
Is there a way to retrigger a joker without returning?
Whats a good compromise when the text isnt symmetric
Its off by 1 pixel and its making me mad
cry and accept it
just like the rest of us
you can either have symmetric text, or consistent font sizes, but not both
or Soda Can
I like ur pfp!!!
Do we have access to the lua for the base jokers?
the entire source code is accessible
Huh. Maybe I missed it, but I couldn't it
have you played with mods before? In that case, you can see the patched code in the lovely folder
I have played with mods before. I was assuming it was within the game files
Open the main executable as an archive. đ
the lovely dump is the source code patched with smods, which if you're interested in making your own mod is often slightly more useful to look at. The main source code is accessible if you own the game on steam and enter the executable as an archive
I see. If the lovely dump has it, it'll be easier for me to just look at that
the lovely dump will have more accurate line numbers for errors too
Bump
Your loc_vars is missing an end also do you not have the lua extension?
No it throws a bunch of errors when I use it (not syntax errors)
Just doesnât recognize my SMODS
And itâs just really annoying
Thank you, canât believe I missed that lol
Put SMODS in your workspace.
Does the folder have to be called SMODS or can it be Steammodded
Cause I have it in my workspace
Try calling it smods
thanks! i made it myself
Let me check
hey guys how would i distinguish if a playing card is added from a standard pack or not
didnt fix it
Is it the card.lua file where the jokers are?
game defines a lot of specific cards
G.P_CENTERS is where a lot of definitions will be
but in terms of actual calculations im unsure
The reason why I'm asking is because I would like to see how Bootstraps is coded
any ideas why my game crashes on boot? i am certain it is this consumable because it started crashing after I changed a couple things in it (i cant remeber what i changed tbh :( )
Your text isn't a table, in loc_txt
The calculations are all over. Best thing to do is to look for a joker's name, and see where it is used
Wait how do you control how often your custom rarity shows up in the shop
Okay so my can_use works as intended! but on use my game will crash with this error :/, can anyone suggest any fixes?
Is there a reasonable way to make a blue seal either not (attempt to) make anything or make it give a specific card? I have a hand type with no associated planet card (playing this Joker-related hand automatically wins the blind so there is no scaling it up) and having a blue seal crashes the game trying to make the non-existing planet. I'd happily give a pluto if needed, otherwise just preventing it from trying works too.
setting [default_weight] in a rarity class controls that, dont quote me but i believe common has a 0.7 weight (70% chance of every joker being a common) i THINK
actually, looks like our issues are similar @placid star. Maybe try making sure the joker was created before calling add_to_deck with it?
wait how do you check it was created sorry?
@runic pecan i think you need to add pools to your code, im new so dont quote me but I'd give it a try!
Huh, I thought pools was optional.
it might be, but thats the only thing i can think for for that error :/
card.lua, since "apparently" they're a type of card.
reimplemented in smods
Where
not a clue let me look rq
trying to find it at the moment. It looks like for your code it might be something like
if card and card.config.card and #card.config.card > 0 then
card:add_to_deck()
G.jokers:emplace(card)
end```
hm ill give it a try and get back to you!
G.jokers
yall know how to fix the "attempt to index field "other_card' (a nil value]" issue
idk im dumb
It there a context for when a consumable is created
still getting an error sadly :/
There is context.card_added that triggers for all non-playing cards. You can check the set of context.card to see what type it is
hm. So that tells me it's from the call to create_card itself. Is 'jjok_special' your card's proper id?
this is the entire code of my card after i changed the key to awake, im ngl i thought that part was for what you want to generate
It is, I'm asking is the card you want to create actually refered to as jjok_special?
ohhh, no the rarity is... ill try it with the key of a specific card tho
Yeah, you're creating a specific card with create_card
you likely need the joker and your mod's signifiers. assuming your mod's is jjok, try 'j_jjok_yuta'
@placid star custom joker keys should follow the format j_[mod prefix]_[key]. For example, one of my jokers with a mod prefix âmxmsâ looks like j_mxms_chef
This isnât how it should be defined when making the Joker, but how it should be used
holy shit tysm guys the prefix worked!
can i generate a random joker of a custom rarity with create_card or do i need to use another function?
You should try SMODS.add_card instead. Itâs a lot cleaner, does more for you, and has more options
oh yeah, isnt that the one that doesnt need the emplace and add_to_deck?
By âdoes more for youâ I mean it creates the card, adds it to your deck, and emplaces it all in one fell swoop
ah yeah thats the one i thought it was! okay thats now been implemented, but can I generate a random joker from either a pool or custom rarity? if that makes sense
who knows anything about adding sprites to the title screen/main menu? in particular, i have an idea for something between the main menu buttons that occasionally and briefly pops out from them before returning, for a small bit
Thatâs where the âmore functionalityâ of the function I mentioned comes into play. You can specify rarity with add_card
Iâm fairly certain you can do pools too, Iâm just less educated on that. I know one of my cards does it I just forget how
ah, so for custom rarity generation you would do rarity = '[prefix]_[rarity_key]'?
Yep!
I think
Not too sure how rarity keys are indexed so you may have to do some experimenting
I would assume that is correct tho
okay! thank you so much! you've been such a good help i cant thank you enough <3
Any time
Ig thatâs what months of doing this gets ya: decent knowledge on how to help others lol
What's the var for the set of the card
I believe itâs [card object].ability.set
omg so ive tried it with add_card and create_card, with emplace and add_to_deck yet they both crash with that error
yet when its only create_card, it draws the joker on screen, makes it draggable but it doesnt function as a joker
created cards aren't placed in a card area!
you'll wanna do that yourself still, using :emplace
but when i emplace it, my game crashes, same with add_card
this still doesn't use the proper key, no?
This is a shot in the dark but try giving the local card variable a different name
Call it like ânew_cardâ or smthn
Also, never use a local named card in your calculate function. It won't majorly break anything, most of the time, but it'll often create some confusion or bugs when you're testing and fixing things
shouldn't create_card() and add_card() just have a single table argument
same thing happens :/
Same crash log?
yep excact same
yeah put your arguments for create_card() in a single table i think that's what it wants
I just looked at the definition of your use function and that doesnât look set up quite right. The variables should be (self, card, area, copier). Itâs another shot in the dark but itâs good to fix that
No thatâs only for SMODS.create_card
oooh yeah youre right nvm me
same error :/
Thought so. At the very least it reduces further confusion
i could update and link the github if that would help?
Nah you donât have to
I would like to see an updated version of the code and the crash log again tho
here ya go
G.jokers:emplace instead maybe?
yeah i think this is what the error is referring to
Iâve gtg for a time unfortunately but if it still isnât solved by the time I come back Iâll jump back into the fray lol
u the goat fr tho tysm <33
U got it
if u have some time later I'd love for you to be the first tester of my mod đ„ș
I think I will in a couple of hours
sounds good!
Thaaaats what that is
SMODS.Joker{
key= "perkeoTemplate",
calculate = function (self,card,context)
if context.card_added and context.card.edition == 'e_negative' and context.card.ability.set =='consumeables' then
return {
message = "test",
colour = G.C.MULT
}
end
end
}
so this should trigger when a negative consumable is made?
right
context.card.ability.consumeable for the consumable check iirc
the set will be something like Tarot, Planet etc.
actually obj:func(...) is just syntactic sugar for obj.func(obj, ...), there's no real this/self
what in the
it's all fake
These patches don't seem to work anymore, would you happen to have updated versions or know what smods version these were made for?
I've since updated my own and had to address a few patch changes, lemme look
...weird, trying to delete all playing cards but of one rank is only deleting half of the deck...
for i = 1, #G.playing_cards do
if G.playing_cards[i] and G.playing_cards[i].base.id ~= 3 then G.playing_cards[i]:remove() end
end
every time you delete a card, the indexes shift
Thanks, I was pulling my hair out with the built in card_added context and that patch would've been my saving grace lol
anyone know the function for deleting a joker?
<@&1133519078540185692>
Thanks mods
Here are my current ones, and I'm right now I'm on Steamodded 1.0.0~BETA-0330a
Not much has changed about them, so it's possible you might just be encountering a bug, but I can confirm that they both work
Thanks đ
Gonna steal all ur patches winter
If they aren't working, I can guide you through it 
Also go ahead, but some are really specific and janky, like my quantum edition patch
That's okay I've decided your mod is my mod which means it's my quantum edition patch now
Ah fuck
đ
Also winter i will probably desire your assistance soon
I am out and about currently though
You got it!!
My entire life is a lie
is there any documentation for shaders
can context.destroy_card be used to destroy jokers?
Nope, destroy card only iterates over cards
I'm not sure if there currently is an smods context for joker destruction
hm so what would be used to destroy a joker?
So I'm running on smod 1.0.0~beta-0323b right now (I can't find 0330a on the github releases) and it doesn't seem like the joker_created context works at all, and looking at the startup logs the only thing I can see that might be causing this is the following warning:
WARN - [â„] Ignoring excess matches```
That's an SMODS issue, since it's coming from an SMODS patch
Let me see the code you're using for the context
The :start_dissolve() function, though you'll wanna use a can_calculate() in the check, to see if it's not already being destroyed, or being manipulated in an other way. I'd check a lovely dump for the way ceremonial Dagger does it!
ty ill take a look at that!
if context.joker_created and not context.blueprint then
print("card added")
print((context.card_added and context.card ~= card))
print((context.buying_card and context.card == card))
end
I dont' even have proper code rn cuz I just wanna make sure the context works as I need it to
the other two prints are holdovers from what I had previously lol
but yea the print("card added") does not proc whatsoever be it from shop buy or debug generation
Okay, let me give it a spin
@hushed field ive seen a pseudorandom function used before but im not too sure how to use it and I can't find it on the wiki... can u maybe point me in the right direction?
Looks like it works to me. Are those print statements wrappers for SMODS SendDebugMessage or something else?
regular print statments, I didn't even know smods had debug messages lol
That's probably why you aren't seeing anything
I don't think they work as expected
But for your purposes, here's a video demo. I used that exact condition on my Sexy Joker, and you can see my use of Wraith results in output
Let me try it, but in my case I've been just using the normal print statements and it's been working for everything else including my other lovely custom context so I just assumed they'd work here too
Oh, well, normal prints work too
Yea the debugmessages don't work either
pseudorandom creates a number between 0 and 1. You give a seed to it so that it's consistent with your current game's seed. To see if a chance happens, you compare it with your current chance, turned into a number between 0 and 1. If the random number is smaller than your chance, the effect happens. When you write that down, it becomes (depending on the implementation)
if pseudorandom("uniqueseed") < G.GAME.probabilities.normal / card.ability.extra.chance then
G.GAME.probabilities.normal is always 1, unless a joker changes the odds (in vanilla, that's only Oops). So, let's say you have a joker with a chance of 4, it'll default to 1/4. In numbers, it'll look like this
if pseudorandom("uniqueseed") < 0.25 then
so you can see, if the random number generator creates a 0.3, it's bigger and the event will not happen. If it creates a 0.111111 it will happen.
If you want a chance on your joker that's for example 3 in 16, then you wanna add an additional variable to your joker and multiply that, resulting in
if pseudorandom("uniqueseed") < G.GAME.probabilities.normal *card.ability.extra.current_chance / card.ability.extra.total_chance then
Do keep in mind that the names I'm setting for the variables here, in card.ability.extra, are just random, you can use whatever you want.
Basically I just want to be able to detect when a joker is added so that I can check for a synergy thing, I was able to successfully implement the intended functionality for the shop buy using the buying_card context but that doesn't account for the judgement generation. Meanwhile card_added does, but that context for some reason occurs before it actually adds the joker to the jokers array, which means I can't affect the newly added card using that context. So I went digging and found your patch which from what I've seen should hopefully bypass that issue since it directly hooks into the emplacing process
No I mean what's the full code around it
Are you using it correctly in calculate?
If you send me the full file I'd be happy to debug
i actually got it on my own which i am super proud of but I'll keep all that in mind since that's for maybe triggering an effect but i wanted to kill a random legendary joker!
in this case, you'd wanna use pseudorandom_element, haha, but this would also work, yeah!
ohh, should i switch it to element from what i have?
how do we feel about this sprite? also, how would i go about making a custom text colour? kinda like how theres C:mult, could i make my own one?
Sorry had to take care of something, would you want me to just send you the lua file or the entire mod so you can see what things are being referenced?
Just the Lua file is fine I think!!
Here you are, thanks! I gotta head out to pick up a friend rn so I'll check back in later, just drop me some replies if you have questions. Thanks again! đ
Yeah, sorry it didn't end up a simple drag and drop!!
how do I change the scale of a card
Hello. Question: How do you pass parameters with this thing?
@iron mantle I tested your The Thing card, and it works as expected!
I didn't also implement the custom rarities, but it does hit the first block and use the joker_created context just fine
anyone know where the value for a cards position in its cardarea is stored? like if its the first card in my hand where can i find the value of 1 for that?
should be in card.rank
Confusingly named, I know
assuming it also has a cardarea, ofc
But the align_cards function sets that value when it sorts the cardarea table
Where rank is necessarily the position in the array, k in ipairs
are you saying that the rank value isnt always accurate to its position?
it should always be accurate up to the last frame
ok thats good
align_cards is called every frame, sorts them based on transform position, and then sets rank equal to their current index position
Unless some weird stuff happens, it should give you accurate info
does anyone know where/what the vanila soul key is? i need to take ownership of it but i cant find it in card.lua :/
guys where are loc_vars for planet cards
Itâs in game.lua
ahh ty
What do you mean?
like the reference for all of these
does anyone know if this will increase the chance of getting a soul in any given arcana?
It should.
okay i havent seen it so far in any arcana but i got it from the first spectral i opened...
In the base game files?
yes
Should be in card.lua
how can i randomly pick a whole integer within a set range using pseudorandom()
the way chance is done for everything in the game seems to entirely rely on real numbers
am i able to just truncate
...i guess i could do from element and do it that way but it feels bleh
pseudorandom(âseedâ, min, max)
oh, seed takes any kind of string? what does pseudoseed() do, then? 
I'm honestly not sure but I use it as an extra layer of randomness lol
my intuition was that it makes the randomness dependant on the run seed
Also hi I'm back
anyone know how to make that kinda soul 'animation' on another spectral card?
this is so stupid
since when you do a seeded run, if you hit R, it restarts with the same seed, so the same pseudorandom() events will have the same outcome
You need to add on a soul_pos attribute to your card. It takes a position (just like pos) from the atlas you have set for your card and does the animation with the targeted texture
Basically it's all handled internally as long as you have that defined
i have a soul_pos already but i dont have the little animation thingy...
Oh like the jiggle animation?
yeah that one!
lemme take a dive into that rq
the one that makes it look like something is trying to break out đ€€
aw tysm
i got no damn clue what the fuck is going on\
My guess is all cards aren't checked for what side is up on restart?
card.facing = 'back'
card.sprite_facing = 'back'
Huh, I'm oddly not really finding anything
aw thats a shame, ty for looking tho!
The only thing that I could find that looks like what you might want is this
SMODS.DrawStep {
key = 'soul',
order = 50,
func = function(self)
if self.ability.name == 'The Soul' and (self.config.center.discovered or self.bypass_discovery_center) then
local scale_mod = 0.05 + 0.05*math.sin(1.8*G.TIMERS.REAL) + 0.07*math.sin((G.TIMERS.REAL - math.floor(G.TIMERS.REAL))*math.pi*14)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^3
local rotate_mod = 0.1*math.sin(1.219*G.TIMERS.REAL) + 0.07*math.sin((G.TIMERS.REAL)*math.pi*5)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^2
G.shared_soul.role.draw_major = self
G.shared_soul:draw_shader('dissolve',0, nil, nil, self.children.center,scale_mod, rotate_mod,nil, 0.1 + 0.03*math.sin(1.8*G.TIMERS.REAL),nil, 0.6)
G.shared_soul:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod)
end
end,
conditions = { vortex = false, facing = 'front' },
}
And I have no idea what to make of it đ
WHY IS THERE EXPONENTS
different beating phase
ill play around with it, see what happens, i have no idea where it would even go in my code tho lmao
I updated my mod! We're up to 30 Jokers and 17 Blinds! https://discord.com/channels/1116389027176787968/1343670935122870342
I think you'd just have to put this somewhere in your mod's main file (or the card's file assuming you have them separated)
would self.ability.name for the above code be awake?
it would be 'c_jjok_awake'
ah okay, ill play around with the DrawStep you found and let you know!

what's a good way to test my jokers without constantly holding r and hoping for a specific shop?
Do you have debugplus?
yes
In collections, hover over the card and press ctrl + 3 to spawn it in your hand

i broke my glasses
damb
ty
np
Does anyone know why this is happening?
SMODS.Atlas {
key = "roffers",
path = "Jokers.png",
px = 71,
py = 95,
}
-- load common util funcs
assert(SMODS.load_file("globals.lua"))()
-- load all individual jokers
local subdir = "cards"
local cards = NFS.getDirectoryItems(SMODS.current_mod.path .. subdir)
for _, filename in pairs(cards) do
assert(SMODS.load_file(subdir .. "/" .. filename))()
end
F
SMODS provides a function to load files
You donât need NFS
ah, i didnt know
Youâre using it
i just used neatojokers as a base lol
on a scale of 1-10, how difficult do yall think making a wild card for numbered cards would be?
whats the function?
2-10s count as all numbered ranks
11
SMODS.load_file
@sturdy compass can i screen share to you in dm? the result is just so funny
Yeah I'm free lol
yeah, thing is NFS is useful for getting all files in a directory, which is what she's using
Figured bc you would have to implement functionality to all jokers within the game that use a numbered card, then as well played hands, then as well the modded jokers
But really itâs not hard if you just want it to work with vanilla and no mods and be incompatible
help
Weâre making a big enough mod tbh that we donât care too much about incompatibility yet with other mods but I hope to fork functionality to other popular mods such as paperback and bunco
what the fuck
This project has like about 300~ planned jokers so itâs a full on expansion
jesus christ aiko youre making solitaire???
I was wondering if anyone here has any experience with creating multi-line text inputs? I'm looking for something that works like a HTML textarea tag
so it would seem
I think the best way to make it compatible would be with a SMODS PR but the biggest setback on the feature from SMODSâ side has always been Straight calculation
yes. yes they are.
Are you talking about Balatro
what the hell is a cards/.DS_Store
đ
Ya
You need row nodes in a column node
macos moment
yeahh...
guess you have to check if the filename isn't that
Has anyone here transformed consumables into other consumables?
Or does anyone knows a mod that does it?
i know how to turn jokers into other jokers, i feel like itd be the same thing since everything uses keys
Cheers, I'll look into that - do you know if someone has already done something similar already to use as a reference?
wait i am using that? so what am i supposed to replace with that
i legit copied the neato jokers code idk whats wrong here :?
HELP??????
theyre like little worms
how do i change a joker's description text depending on a variable's value?
my best guess is you need to filter the files because it's finding some system file and it doesn't know what to do with it
you make the variable "#1#" and then list it under the config extra
Put #1# and input a value through loc_vars
not what i meant
then what did you mean
i mean that's how you change text in a card description
you can pass a string of text as the variable
it doesnt do that with neato tho :?
no idea
mac is weird idk
might as well just check for that .DS_Store file and skip it
Maybe the UI guide on the wiki
i meant my thing says
whats the code for that
"If {C:attention}first hand{} of round",
"has {C:attention}#1#{} card, destroy it",
"and gain {X:mult,C:white}X#2#{} Mult",
"{C:inactive}(Currently {X:mult,C:white}X#3#{C:inactive} Mult)"
}```and i wanna make it change if it has more than 1 card
You do what they said
ok
something like if filename ~= '.DS_Store' then
Or you use main_end
i know, i'm adding support for the glitched effect from cryptid
so it can change the value to a different amount of cards
My recommendation depends on the specific text youâd change
Cryptid also has support for automatic English plurals I think
how
any idea why this is not adding a voucher?
bc it still says 2.6 card
Idk ask @mellow sable
it should be automatic if it's in the ability table
ability table?
?????????????
the invisible cards
SMODS.Joker{
key= "perkeo_template",
calculate = function (self,card,context)
if context.card_added and context.card.edition == 'e_negative' and context.card.ability.consumeables then
print("triggered")
return {
message = "test",
colour = G.C.MULT
}
end
end
}
so im trying to make it detect when a negaive consumeable is created
like here
i feel like im doing somthing wierd
yea it is
GLOP!!!!
bump

its not working
whats the problem? this looks like it should work
gimme a sec
we are back to square one
is it crashing again?
yea
2.6 card
oh in the code you can round it using math.floor(variable+0.5)
if the card isn't exactly 1 i wanna change it to has #1# cards, destroy them
hi im trying to make my first enhancement and the 2.5x mult part is working correctly, but the destroying itself when not in the hand is not. could someone help me out with it?
that's not what i'm trying to do?????????
OH
sorry youre kinda
presenting things in a really confusing way
how
@vale lake yo pierre, you wanna come out here?!
i don't want it to be immutable????
i just want the description to change so it stays grammatically accurate
yeah delirium gave me a patch that does basically this, i dont know where it is but they know how to dynamically change loc_txt
i know
you could create a new variable field and if cards == 1 pass 'card' else pass 'cards'
Nickname API or the Ijiraq code?
nickname api
that only works for unmodded Jokers
i give up
ah
i'll just reword it so it doesn't use a number for the card amount
so like not this
you can also use loc keys with this
if that's the issue
elle, youre trying to check what the #1# variable is and then if its not 1 it says cards instead of card right?
wait is the issue trying to make "1 cards" become "1 card"?
no
2 card -> 2 cards
the issue is i wanna reword not just that but also change the end to and gain {X:mult,C:white}X#2#{} mult each
but, again, i give up
has a single card
now i don't need to make it a variable that can be glitched
i mean you could've also done another var field where if card == 1 you pass '' and otherwise pass 'each'
alright well
bump
so you got the exact same crash when you tried filtering the files like i said?
because then i am also completely stumped with this
yeah
i can try just copying the code on my end and seeing if i get the same issue
although i'm on windows
alright ill undo it and send it as a zip
anyone know why the calculate function in a custom deck wouldn't be calling? print statement immediately after the definition and it never runs. deck shows up fine in game though
Speaking of calculate functions, Does anyone know how to do two, like say you add multiplier and than you balance it out
beautiful
cinema
huge
so i tried putting it into a mod that i knew worked and changing the atlas and it doesnt work, so i think that means the joker itself is fucked. Does anyone know why?
does pseudorandom() always return a real number or does it return a whole integer in this case?
??????????????
Iâm pretty sure If the min and max are whole numbers then it should be a whole number.
hey do you know why i might be having my problem?
What a heck, how did you manage break facing in a first place?
is there a way to check the card area so i can move it somewhere
can i just use collide
check what
maybe check the mod that implements mobile drag into pc
yo thoughts
w joker
j joker*
j_joker

it is named joker
that's his deadname
ah i see
bump
yea there u go thx
Is the card's key "Template"?
Ah then you're missing a mod key on the localization
If Perkeo is your mod key, remove that from the card's key
LMAO
they mods key is _Perkolator
then the localization key would be j_Perkolator_Perkeo_Template
there we go
so ive got it increasing mult when neg consumeabels are added
now i need it to actually score
Glad it worked 
I love accidentally specifying my tag as a deck
abundance tag deck
abigboy tag
okay i'm a bit confused, how does the context.type system for tags work? is there a list of these?
There's no list, but all the tags in the code are pretty limited in where they're set up. You can search all for them, and see which tag contexts exist
Wow this is cool!
How do people do this?
its just a vscode extension
ah wait it doesn't seem too complicated to add your own tag contexts
I am playtesting an idea, I have some jokers that heavily reward hands that are based on the total value of your cards. For instance, this joker
I added a new hand, it requires your hand be a multiple of 13. Anyway I was wondering...if this too hard?
if its not a hidden hand probably not
i have a hand and a card for blackjack values
It is a hidden hand
has anyone implemented a planet card for their own custom hand?
i have yea, whats your query regarding em?
Does anyone have an example of a mod successfully using a calculate function in their custom deck that was made after trigger_effect was depreciated? I'm having a hard time finding one
I have a question for you modder people. Is there any way to make a joker modify cards as soon as they're added to the deck. I'm trying to make a mod and want a joker that converts all cards added to the deck to a suit. So far I basically have a joker set up to just give a â€ïž message whenever a card is added.
One of my upcoming decks has a calculate function... you just add it in and use.
i give up for today
the answer to this, I think, is if there's acontext.playing_card_added, then there should also be a context.cards you can access
if you look in card.lua for what Hologram does
this is the code for vulcanoid
Developments will be resumed tomorrow?
tried using context.cards but couldn't get it to work. I'm not too familiar with lua so I probably just need to tinker a little and familiarize myself more.
Every single day I regret first learning programming with a case-insensitive language
And just kinda figure it out
later today
You are going super fast ,I am sorry but I can't even tell what is happening.
Actually I figured it out đ
wonderful job =]
if you havent figured it out you can also make the cards not show up until theyve revealed the hand
vulcanoid gives +2 mult to pair, working as intended
mercury give +30 chips to pair for some reason???
i use vulcanoid twice to give +4 mult to pair, working as intended
mercury gives +45 chips and -1 mult somehow
potentially something like
if context.cards then
for k, v in pairs(context.cards) do
v:change_suit(suit_name)
how do i add colours?
Actually I was wrong đŠ
I keep getting crashes related to unable to find colors, when I mouse over this card. Do planets do something odd related to reporting colors?
object_type = "Consumable",
set = "Planet",
name = "Meteor",
key = "Meteor",
pos = { x = 1, y = 1 },
config = { hand_types = { "Cosmo Canyon" } },
loc_txt = {
name = "Cosmo Canyon",
text = {
"{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up",
"{C:attention}#2#",
"{C:mult}+#3#{} Mult and",
"{C:chips}+#4#{} chips",
},
},
cost = 4,
atlas = "FoxModMisc",
order = 3,
can_use = function(self, card)
return true
end,
loc_vars = function(self, info_queue, center)
return {
vars = {
"Cosmo Canyon",
G.GAME.hands["Fox_cosmocanyon"].level
},
}
end,```
That was kinda similar to what I was trying but not exactly. I was trying to use part of Midas' code to do that which was similar but also obviously not.
I'll try it. Thank you!
what I wrote is basically just a modified version of the Hologram code
Do these look Or ?
i will say mine seems to work fine
loc_txt = {
name = "Flush Six Ascendant",
text = {
"Level {C:attention}#1#{}",
"Levels up the Flush Six hand",
"{C:red}+#2#{} Mult and",
"{C:blue}+#3#{} Chips"
}
},
so maybe its your use of mult instead of red
as a ref point
Flush Six!?!
ascendant?
You are really cooking. By the way, I love your art
consider the following: Flush N, for any number of playable cards
placeholder name until my freaking artist makes the cards properly and then we assign it a thematic name
Actually I meant to compliment your consumables, they look amazing
without an artist you get the bottom stuff lmao
I'm frankly baffled this doesn't work
artists? yea right, more like
fartists
or something
"rules for thee and not for me"
and neither does this, wtf why does the most basic of things not work
Hey I tried doing handdrawn art and then making it into pixel art. Did not go well.
Frankly I recommend everyone to just marry an amazing multi-format artist
Sweet, thank you for the good example! Now mine works!
The top of the can could use some manual fix-up to clarify some missing pixel detail, and the curve of the can base is a little blocky on the left side, but i really dig the effect you're going for
i stopped before even the slightest notion of drawing myself since this is my best work;
no problem!
don't tell me a cosmo canyon is specifically a 5, 3, and 5
It is any hand that is divisble by thirteen. I have a jonkler that retriggers cards for that hand when played. Guess who it is?
Hey @modern kindle , how do you make the planet card actually level up the linked hand? Do you need to reference your hand with the prefix?
config = {hand_type = 'hand_name'},
yep there it is
RedXIII retriggers each card in a played Cosmo Canyon. If you do decide to stack your deck towards the hand, especially with gold tag cards...it goes well
config = { hand_type = "dilatro_flush_six_hand" },
as example, dilatro is my prefix
oooohh, you do have to use your Mod prefix. In my case it should be 'fox_cosmocanyon'
probably use :get_id() instead
I did
base.id doesn't work, get_id() doesn't work, base.value doesn't work
did u try without the pseudorandom?
what is card.base.value
refering to how many chips the card gives i think
using two Oops' with testing because I'm also testing another chance card
that also doesn't work
Ok here's where I'm at rn lol
weird
Don't mind the scribble on the one part, that's just because I put my full legal name as who the mod was by lmao
wait does context.cards not actually contain card objects
Idk
I guess it doesn't
Full name being Madd Max 3: Beyond Thunderdome of course
what on earth does context.cards do then
I know hologram only cares about how many are added not the actual kinds of cards themselves
did u try without the base.value part?
just tried this again, yeah still doesn't work
hi bepis
yes
It's a boolean because you're using pairs, but the table doesn't have keys. Try ipairs
hi dilly
I tried ipairs
slap a print(context.cards) in there instead of the loop
Does this look any better?
What was the issue, in that case?
context.cards might just be a boolean vector with a length of the number of cards added
speaking of that other chance Joker that doesn't work
I'm not seeing any damn Spectral cards
how do i make custom C: colours?
Would you mind sharing one entire working planet card? I have discovered a million ways to make the game crash so far lol
Just ran it again as ipairs. Scribbling out full legal name as we speak lol
sure thing, one second
Huh, I guess cards passes on bools. It's a new context so I haven't used it before, I'm not sure how it's set up
No wait, I think I'm confusing contexts
Oh, yeah, it explicitly calls this out on the wiki
{
cardarea = G.jokers, -- G.hand, (G.deck and G.discard optionally enabled)
playing_card_added = true,
cards = cards -- the cards being added (sometimes is true when used from vanilla items)
}```
it shouldnt ever pass a boolean anyymore
inside loc_txt do
{V:1}
and then inside loc_vars()
return { vars = { colours = { color } } }
that's one way to do it at least
So does context.card not give the actual card that was added?
Am I understanding correctly or nah
what loc_txt?
i'm not doing it inside a specific joker
where do you want to call the color then?
Just wanted to share that @modern kindle is a total boss and helped me out. Now my RedXIII joker can be happy
so I did
This, doesn't, work, either
I am losing my fuckign miiiiiind
nvmd i got it from looking through discord search
loc_colour('red')
G.ARGS.LOC_COLOURS['elle'] = HEX('FF53A9')```
The base looks better, though the missing pixels in the curve around the rim at the top still make it obvious that it's a downscaled sprite. Try making a consistent ellipse around the top, then try recolouring that ellipse to give the impression of lighting
^
Don't add to G.ARGS.LOC_COLOURS, use {V:} like Skyward is saying
If you're in an environment where the text is being parsed for style modifier codes, then it'll also check loc_vars.colours too, and that way gives you more freedom and avoids cluttering up the contents of LOC_COLOURS
where are you doing this?
this is a joker right
yes
is it the only mod ur running rn
I am TWEAKING you cannot tell me THIS doesn't work
aside from DebugPlus and a card skin, yes
and what does this function get called by?
why the đ§ą reacts đ
SMODS objects only add their own loc_vars wrapper around the pre-existing game text parsing functions.
If your text containing style modifiers is displaying properly, then there's a matching loc_vars table
jokers
ok idk at this point, wats ur smods ver
it is displaying correctly yea
I feel like you couldn't have given less context with this if you'd tried
question, does calculate() natively by vanilla, support a way of doing xchips via the returned table?
that's all the context though.
that code's not inside any other class or function
SMODS.Joker{
key= "Perkeo_Template",
config = { extra = { Xmult = 0, Xmult_mod = 1.5 } },
loc_vars = function(self,info_queue,card)
return { vars = { card.ability.extra.xmult} }
end,
calculate = function (self,card,context)
if context.card_added and context.card.ability.consumeable and context.card.edition and not context.blueprint then
if context.card.edition.type == 'negative' then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.Xmult_mod
return {
message = "test",
colour = G.C.MULT
}
end
end
if context.individual and context.cardarea == G.play then
return {
message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.Xmult } },
Xmult_mod = card.ability.extra.Xmult
}
end
end
}
how is the function getting called inside jokers though
did u try making a new run
does it work now
is this something you really needed to create a function for in the first place?
Ha ha!
No
Yep, use {V:1} and provide the colour within vars.colours in the Joker's loc_vars function
i'm doing the same thing in multiple jokers, not just this one
i don't wanna have to add to loc_vars on every joker
you should add loc_vars on every joker
i said add to
how many jokers are we talking here
key = 'catgirl',
loc_txt = {
name = "Catgirl",
text = {
"Scored {C:attention}3s{} have a {C:green}#3# in #1#{}",
"chance to score {C:mult}+30{} Mult, and a",
"{C:green}#3# in #2#{} chance to earn {C:money}$30{}"
}
},
rarity = 2,
discovered = true,
cost = 8,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = true,
atlas = "jokers2",
pos = { x = 4, y = 1 },
config = { extra = { multOdds = 3, munOdds = 9 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.multOdds, card.ability.extra.munOdds, (G.GAME.probabilities.normal or 1) } }
end,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
local multHit = 0
local moneyHit = 0
if (pseudoseed("catgirl") < G.GAME.probabilities.normal / card.ability.extra.multOdds) then
multHit = 1
end
if (pseudoseed("catgirl") < G.GAME.probabilities.normal / card.ability.extra.munOdds) then
moneyHit = 1
end
if context.other_card:get_id() == 3 then
return {
mult = 30 * multHit,
dollars = 30 * moneyHit
}
end
end
end
}```
I genuinely can't see what I'm doing wrong, stripping this down to the base of "if 3, add mult" isn't working either and I can't bash my head forever
seems useful enough to me, though it also could've been a variable like
local cap = '{C:elle,s:0.7,E:1}'
...
loc_txt = {
name = ...,
text = {
"line1",
cap .. "caption"
}
}
...
but a function seems more futureproof tbh
a var does make sense yea i'll do that
you could also just find/replace if something changes in the future
If you insist on adding your own custom colour to G.ARGS.LOC_COLOURS, at least give it a more unique name than "elle" to reduce the risk of collisions. Maybe include your modprefix and add _caption at the end
ok
SMODS does add the colours of all custom Consumable types, Rarities and Suits to LOC_COLOURS, so it's not unprecedented - it's just not a standard approach, and {V:} is the more common solution
I almost suggested adding a dummy consumable type to add the color
Sure, but I don't see why you wouldn't just use a function for it
Anyone who knows what they're doing would be appreciated, cuz I'm completely lost on what's going wrong because this feels like such a simple one to code yet it just doesn't work, at all
bump
it would be helpful to know what the expected behavior is
oh wait yeah I see that now
works for me? đ€
I???????
Doesn't for me!! Can I see the code?
smods version?
just updated to the latest
or possibly conflicting mods
no other gameplay mods
it's basically your code copy-pasted and slightly edited to allow it to run on my machine
SMODS.Joker{
key = 'catgirl',
loc_txt = {
name = "Catgirl",
text = {
"Scored {C:attention}3s{} have a {C:green}#3# in #1#{}",
"chance to score {C:mult}+30{} Mult, and a",
"{C:green}#3# in #2#{} chance to earn {C:money}$30{}"
}
},
rarity = 2,
discovered = true,
cost = 8,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = true,
pos = { x = 4, y = 1 },
config = { extra = { multOdds = 3, munOdds = 9 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.multOdds, card.ability.extra.munOdds, (G.GAME.probabilities.normal or 1) } }
end,
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
local multHit = 0
local moneyHit = 0
if (pseudoseed("catgirl") < G.GAME.probabilities.normal / card.ability.extra.multOdds) then
multHit = 1
end
if (pseudoseed("catgirl") < G.GAME.probabilities.normal / card.ability.extra.munOdds) then
moneyHit = 1
end
if context.other_card:get_id() == 3 then
return {
mult = 30,
dollars = 30
}
end
end
end
}
anyone? can i just like return xchips in the return table of calculate()and that will work? 
that's?????
so
my code does work
but not for me
specifically
you guide others to the treasure you cannot possess
disable all other mods (including debugplus), verify your files through steam, and make sure you're editing the right file would be my first 3 suggestions
so I adjusted mine to take out the * multHit and etc that this is also missing
still nothing!
how the heck does the dynmic descriptions work
My money's on the third one
