#💻・modding-dev
1 messages · Page 126 of 1
how would one check if a card is a specific suit?
if card:is_suit() == "Hearts" then iirc
thanks
what do you need it to do?
destroy every extra scored card
you have the extra flag, yeah?
and count how many are destroyed
yeah i've got the extra scored card stuff all sorted
it's just destroying the cards that I can't get
it just needs to return something in the return table and it'll destroy the card
Guys, is it possible to make a lovely patch for a steamodded .lua file?
I'm trying to add Xchip and Emult from Talisman to SMODS.eval_this()
what
how does it know which card to destroy or when though??
so something like lua if context.destroying_card.is_extra then return { message = 'Destroy!' } end
context.destroying_card is each card in the scoring hand
it iterates over the whole hand
how can I remove both edition and enhanchment from a copy of a card I just made?
copy_card has strip_edition for the former but not the latter
how would I count how many cards it destroys
you can remove them by setting the edition/enhancement to nil can't you
no i'm suggesting that
so like card.enhancement = nil?
just increment a value in your joker before the return
okay
card:set_ability(G.P_CENTERS.c_base) should do the trick iirc
oops missed the center 🤦
I was about to say i got an error
This is the code
G.E_MANAGER:add_event(Event({
func = function()
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
local _card = copy_card(copycard, nil, nil, G.playing_card, true)
assert(SMODS.change_base(_card, nil, cs_utils.get_next_rank_value(_card)))
_card:set_ability(G.P_CENTERS.c_base)
_card:add_to_deck()
G.deck.config.card_limit = G.deck.config.card_limit + 1
table.insert(G.playing_cards, _card)
G.hand:emplace(_card)
_card.states.visible = nil
_card:start_materialize()
return true
end
}))```
Should be correct?
hey guys how do i make like my own deck skin? is there some sort of guide
Theres a good framework mod for that called DeckSkinsLite: https://github.com/Kekulism/DeckSkinsLite
ty!
I remember discussing it with other people here and I think lazy DFS would be a reasonable way to do it
but it was in the context of arbitrary graphs for modded ranks
There's a template included in Steamodded that you can just rewrite the names and put your texture
in the folder
to make a texture mod
imma use the deckskinslite thing
swag
as you prefer
yeah uh
card_is_splashed(context.destroying_card) caused a stack overflow crash
uhh
yeah cause card_is_splashed also iterates over the whole hand so
yeah that's a lot of
hmm
can you show both blocks of code?
function card_is_splashed(card)
local _,_,_,scoring_hand,_ = G.FUNCS.get_poker_hand_info(G.play.cards)
for _, scored_card in ipairs(scoring_hand) do
if scored_card == card then
return false
end
end
return true
end
i think its just cause card_is_splashed checks the target card against every card, checking that against every card makes too many calculations?
i think I can work around it
just put card.splashed = true before that return true
then you only need to call this function once
average of 13ish rounds for negative ... does this suck?
(uses the usual weights for everything but never starts with negative in the shop because i figured it'd be really boring if that happened)
maybe a card.splashed = false before the return false too
Does anyone know what variable I can check to see if you are currently on the main menu
like the scene or stage value or whatevrr
I think it's pretty decent, it's basically a guaranteed wheel of fortune for a joker slot (similar to e.g. diet cola)
i am now getting attempt to index value destroying_card (a nil value) crash when trying to do if context.destroying_card.unscored == true then
can you ss the crash?
do you check if context.destroying_card first?
wwwait i think i figured it out
if so then that's a little weird... otherwise, context.destroying_card will usually be nil (e.g. when calculate is called for card in hand effects, or like anything else)
could i get some help with this?
How can i spawn a random joker? like, a random joker that can be anything from common to rare
while im here, ill also ask, how can you check the number of cards in the played hand?
here's how judgement does it (there's probably a more SMODS-y way of doing it):
local card = create_card('Joker', G.jokers, false, nil, nil, nil, nil, 'jud')
i think it would be #context.full_hand including nonscoring cards or #context.scoring_hand for only scoring cards (this is assuming you're talking about inside calculate of course)
outside of calculate you could maybe use #G.play.cards (includes nonscoring cards)
thanks
and thanks
wow! this seems nicer than nil, nil, nil, nil
Is it possible to make it so that the Blind's sprite changes midgame?
why is the return function just returning nil
card.ability.extra.deck is set correctly, I just want it to return what's in the array
how are you checking it?
checking what
that it's nil
because it doesn't do anything in game
I assume if it was something it would either crash or ya know actually work lol
I don't think returning like that does anything
oh wait does this not explain the return
It works using if statements just checking each deck but I want to be able to add stuff to this array to make it easier
I'm just trying to get it to work, the effect is just some basic give mult/chips thing
it's a global variable and also its defined after the calculate so it can be empty, and its being redefined every calculate call
It wasn't in the calculate call but it kept crashing so I moved it out
Should I put it in set_ability
I mena you probabl just put it in your joekr config
yeah
that makes a lot more sense doesn't it
nvm, it doesn't work
because it calls other extra variables
if I have more than 4 suits, how do I prevent the custom suits from spawning cards in a new run (Start with the vanilla 52)?
(sorry for this picture, my internet is wacky)
Mista four hand, is that really "funny"!?
where's the perkeo code i can't find it
check card.lua line 2562
ohh my god i've been looking at the lovely dump version of card.lua this whole time
no wonder i can't find shit in here
odd, im looking at the dump and its there
im using VScode and searching card.lua in the lovely dump. If you press ctrl+f in VScode it lets you search for code. Im not sure what you're using for code editing though
When did SMODS.DeckSkin get added?? Now I can make skin mods independant of DeckSkinsLite.
anyone think this card is too powerful for an uncommon/too powerful in general?
Rare at least
Yes
think it should be debuffed or change of rarity?
This was close to thunk's suggestion
Thoughts
i thought that music was on my end
@viscid bough
#1170898696796373022 message
about what? the music? ;P
the config poping up
hmmm, i guess maybe ill make it like 3x and rare to balance it out and differentiate
and how it fits
what do you mean?
i think its pretty nice
new animation?
Like it's a tab but it opens a new menu. Does that make sense/is there anything I should change?
oh also is there a better name I could give the misc tab
I don't really understand the difference
in intuitive terms
Consider that I will put X44.5 for the same condition on a (equivalently) Epic in my mod I think you're fine
I guess it's weird that the old tabs vanish
not every mod is cryptid
Every mod is Cryptid when you have Cryptid installed
My current custom mod for me is WONKY
2 questions:
how can you copy the ability of a random joker that you have?
how can you copy the ability of a random joker that you do or dont have?
you should just be able to call the calculate function on the joker reference (take at look at blueprint). For one you don't have, I would probably make a new card and then just do the same on it
Sorry mate, doesn't work. Didn't add any values to my Enhancements, and no "Charged!" message either when I tried to play a hand without it
calculate = function(self, card, context)
if context.main_scoring and context.cardarea == G.play then
local charged = card.ability.extra.stored_chips > 0
local chips_bonus = 0
local mult_bonus = 0
for _, handCard in ipairs(G.hand.cards) do
if handCard ~= card then
chips_bonus = chips_bonus + math.floor(handCard:get_id() * 1.2)
mult_bonus = mult_bonus + 5
end
end
if chips_bonus > 0 and not charged then
card.ability.extra.stored_chips = chips_bonus
card.ability.extra.stored_mult = mult_bonus
return{
message = "Charged!",
sound = "fm_jolt",
colour = G.C.BLUE
}
end
end
...
What is the context attribute for "entering shop"?
there isn't
I made one by hooking into the cash out button
Cash out button
Yeah it should work
Thanks
And what variable do I use to hook that up?
how to quick-redeem vouchers? If there's over 100 vouchers, it will take ages!
if anyone can improve this I'll be very happy https://github.com/Aikoyori/Balatro-Aikoyoris-Shenanigans/blob/9939bd7ce02c79046abbacb61ef3e04a1bf0ac16/modules/pokerhands.lua#L93
You just call calculate_joker like the base game does, with the provided context you want to use
how to quick-redeem vouchers? If there's over 100 vouchers that are redeeming, it will take ages!
And what context links to the cash out button?
There isn't one. You create that yourself
how do I check the name of the current blind
how can i make a joker that doesnt show up in the shop or booster packs or judgment, can i just use like rairity 99 or something?
i want a joker to only show up when another joker creates it
Hey guys, newbie to balatro modding (and most modding in general here). Trying to learn how to make some basic joker mods, but idk the contexts used in calculation or most of the variables used in the game. I tried to check the definition of the base game jokers for an idea but couldn't find where in the code it does the calculation parts for each joker. I could just be dumb and/or blind, but could someone help point me in the right direction for where to learn this all? Whether that be looking through a specific file or a guide or something. I'd appreciate literally any help lol
I think all of them are grouped together by their context
So if you scroll up a bit you can find it
maybe look at steamodded example mods might help
where's that example mods folder?
So if you go to like Bloodstone it'll be grouped together with the other 3 suit jokers and also other jokers that are under context.individual then if context card area ==G.play
Like photograph and 8 ball, which all search for specific cards played
https://github.com/Aikoyori/Balatro-Aikoyoris-Shenanigans also feel free to look at my code
if that helps
All the discard related jokers being grouped together in the discard confext
why are you doing it by suit?
so that you can have multiple flushes
sorry
straights
my bad
I don't get it
seems too specific
I think you could instead have an algorithm for a set of cards
then compute it for a subset of the hand that is a specific suit
Although that would require more iteration
I just don't see it as "better" since I don't see it being used often
Question: Is there any restriction on the size of a texture atlas in either dimension?
if it's too wide then it'll just squash it until it fits in the standard space
I assume the standard space is the same size as the Balatro texture atlas'?
except the soul_pos part seems to not have a size limit beyond the size of the atlas(?)
here i accidentally put in the wrong name it's not a flush but you get the idea
i've been trying to make a card with an unusually large soul_pos for like an hour now and i can't get it to work
is there a way to put the soul_pos for a joker on a different atlas to the base of the joker i could really use that right now
28 pages
I didn't even know Lua had goto
Cursed idea a calculate_joker rest api
a what
So I'm not sure what's the computational complexity of what you're doing but I feel like there's a better way to do it still
I dunno about the multi-suit straights because I don't really understand it
there definitely is
but in my mind the algorithm would work like this
have a table indexed by rank whose values are tables of cards of that rank
You heard me
I heard "sdgnvjsdf" that's not anything that makes sense to me
call that table T. For each key in that table, check if T.SMODS.Rank.next() recursively
in a depth-first way that stops as soon as it finds a Straight
you could also memoize the depth just in case you have overlapping calculations
then you can show an example by just returning any element of the subtables
Wekl its known I can't spell
how about javascript api for steamodded
anyone know how I could make my joker gain chips when a planet card is used? Is there a context for that? I literally have everything but that bit functioning (i think)
Didnt see any example like that on the steammodded example page
Technically possible but I don't have the expertise and it would be super cursed and probably slower
is it more cursed than calculate_joker REST API
Hard to say
What about Constellation code?
The joker rest api could be written in js
no no actually how about we make balatro ui api using react
I tried looking for it in the game files but didn't see the calculate portion of it? I checked most if not all of the files and only found something in game.lua which doesn't include what I need
React.
actually angular
If you do hate yourself https://github.com/jsdotlua/react-lua
My main issue with modding so far as a newbie is idk where the actually important part of the base joker code is even though I looked (I may be blind lol)
tbh me too
all i could find was
j_constellation= {order = 55, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = 'Constellation', pos = {x = 9, y = 10}, set = 'Joker', config = {extra = 0.1, Xmult = 1}},
chat i might have contracted the worst disease known to mankind
being a web developer
why am i even talking about react
uh
i would dig in the game source deeper
but like where, thats my issue lol
again I'm probably blind
i would start by finding the joker ability name in the entire source code
but like, I'm pretty sure i control+f'd most of the files
Card.lua
I'm sure I checked there but maybe it's named differently or something, I'll look again
elseif context.using_consumeable then
if self.ability.name == 'Constellation' and not context.blueprint and context.consumeable.ability.set == 'Planet' then
self.ability.x_mult = self.ability.x_mult + self.ability.extra
G.E_MANAGER:add_event(Event({
func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}}); return true
end}))
return
end
goddangit I was literally just blind
I'm sorry for being incompetent y'all 😭
I swear I looked but I probably fatfingered when searching lmao
well appreciate the help regardless, now I know exactly where to look so I won't have to ask as many stupid questions going forward 😂
@tall wharf I wrote some pseudo-code for Straight computation with DFS
nice
I can't DM you so
ah
can anybody in here tap into the modding chat and give me a hand? not experienced with this stuff
you could break or return inside the DFS depending on where it is called, but if you want to find multiple Straights maybe you don't want to do that
chat how do I check the name of the current blind
somewhere in G.GAME.blind
After struggling for 1.5 hours I still don't know how to "hooking into the cash out button".
local foo_ref = foo
foo = function(args)
local foo_val = foo(args)
…
end
except buttons are usually in a table so foo is more like G.TABLE.KEY
And calculate_joker did not appear in G.FUNC.cash_out code
Yeah, when you create the hook, you loop through each joker and call calculate joker
I think I need to read Hooking(programming) on wikipedia first brb
in basic terms you insert your code where there already is code to read things from it or change it
that's what i understand anyway
when you hook at least when hooking a function in balatro
you change the name of the original function so that the game calls your version of the function instead
which now lets you execute whatever code you want to, where that function would normally be run
and then at the end, you run the actual function properly so nothing is disrupted
i assume the name comes from like, hooking a fish and letting it go
the fish still goes about its life as normal, you just grabbed it for a moment and took a look at it and put it back in the water
anyone know how i can make a joker that doesnt show up in the shop or booster packs or judgment, can i just use like rairity 99 or something?
i want a joker to only show up when another joker creates it
I'm trying to make a joker where there's a 50/50 chance that it'll X mult when either spades or diamonds are scored but this code just does nothing
can anyone help?
context.cardare -> context.cardarea
do be careful, i am pretty sure this gets changed with localisations
if this is what you want, nice
i wouldn't think so ... looking at the source code it seems like the game checks blind.name against the english names to decide what to do
same as jokers, consumables, etc etc
oh thanks thunk
yeah half the logic is like this
then no that DOESN'T get changed with loc
you have to pull it out of the loc table yourself if you want it localised
seems like to get the localized name you'd use
localize{type = 'name_text', key = blind.key, set = 'Blind'}
i might be stupid
Hey guys is it possible to have unlockable things that aren't normally unlockable like consumables or challenges
you can also just grab it out of the loc table like so: G.localization.descriptions.Blind[blind.id].name
Or rather how hard is it
challenges are normally unlockable
big fan of the "which joker is this? let's use 70 elseif statements to figure out what it's supposed to do" style of programming personally
i'm working on a challenge pack, you can just define a function unlocked(self) --> bool on your challenge object
if it's true you're unlocked
Oh sweet
And you define an unlock condition for it or is the same as all the other ones?
just curious, do you also have to beat all but 5 of the challenges before as well, or is it unlocked as soon as the custom condition is met regardless of ordering within the list?
it's unlocked regardless
ah neat
Okay mb gang that was obvious in hindsight
also does the unlock condition display in a nice place
here's how i use it in my mod:
-- eternal_egg_2.lua
unlocked = function(self)
return G.PROFILES[G.SETTINGS.profile].challenge_progress.completed['c_nsc_eternal_egg_1']
end
no, my mod will eventually overhaul the challenge screen to provide nice conditions
it just says locked by default
what's the difference between eternal egg 1 and eternal egg 2
eternal egg 2 is a harder variant
same base idea but with some twists to make it a bit more interesting
it'll be part of the "b-sides" which are going to have their own separate selection menu
neat
Oh I'm also doing b sides but of decks instead
my mod's entire concept is playing around with the game's existing challenge system and taking it places it doesn't normally go
Mine is pretty much just taking every decks gimmick and pushing it to the extreme by having entire new game mechanics for specific decks
my personal favourite challenge so far is "Escort Mission"
4 joker slots, one of them is taken up by a regular base edition jimbo
but the challenge rules have the stipulation that "Selling or destroying Joker increases all future blinds"
(and not by a small amount either, it's an extra 70% to score)
What's the b-side of the glass challenge
there isn't one, so far i haven't made B-sides of any vanilla challenges because my goal is to have 20 completely original challenges (B-sides not included), bringing the total from vanilla up to 40
can be harder, can just be different
can be fusing mechanics from two challenges together
that said now you have given me the idea to remix some challenges from vanilla
I actually made one for the deck mod as an unlock
--Slow Burn--
Start with 5 hands and 4 discards
Even antes permanently remove 1 discard
Odd antes(after 1) permanently remove 1 hand
ok so fun issue popping up now via SMODS
This is how it's supposed to look with the new font for the language pack Rainglish
but it's not changing the numbers
if you notice on the left for the panel, the numbers are the default
in order to make it look like this, i have to use the custom language AND the Trance .ttf file added
I'm updating my code to be compatible with the latest Steamodded version, but I'm at an impasse
I have an Enhancement that's supposed to reset any stored values in it once it's played with this:
card.ability.extra.stored_chips = 0
card.ability.extra.stored_mult = 0
But now that effect is removed, where am I supposed to put it?
if context.cardarea == G.play and context.main_scoring then
if card.ability.extra.stored_chips > 0 or card.ability.extra.stored_mult > 0 then
card_eval_status_text(card, 'extra', nil, nil, nil, {
message = "Jolted!",
sound = "fm_jolt",
colour = G.C.BLUE
})
return{
chips = card.ability.extra.stored_chips,
mult = card.ability.extra.stored_mult
}
end
end
I've been warned that a return function is where the code ends, anything past it will make the game crash
question, is there a way to rescale text on vanilla ui
trying to make a joker that gives $8 dollars at end of round and then decreases, is there a way to make the reward decrease after youve gotten the money?
woo i made a custom bg i am going nowhere places
ease_background_colour
Cheers
anyone know what the arguments are for create_playing_card()? I'm trying to make a joker that adds and enhanced 7 to deck when a certain condition is met but I can't really understand how the function is used in the base game
places i would never go
set_blind = function(self, reset, silent)
ease_background_colour{new_colour = G.C.BLACK, contrast = 1}
ease_hands_played(15)
ease_discard(15)
G.hand:change_size(5)
Hmmm I want to change the colour of a Finisher Boss Blind, it works at first, but when all the cards have been dealt, the background changes back
Hard to see on mobile but this looks like your doing all your calculations when you play it, then returning the charged message, not any scoring stuff. What effect are you seeing when you play with the enhancement?
Ah no it's fine I managed to figure it out
But I got another issue in the Steamodded thread
Can you screenshot? Hard to read on mobile
In a sec
may have accidentally discovered that you can change the colour of almost anything in the game with ease_colour 😭
Help it keeps saying "unexpected symbol near '='" when it's just a number
ITS JUST A NUMBER
So I got an Enhancement that's causing my game to instantly exit with no crash logs nor error messages. It's supposed to increase in rank if you play hands without it, but the game crashes when I select a random card
First image is for checking if any hands are played and then incrementing its rank, the second is resetting it back to normal after scoring it
Try moving that first block inside the context check
HELP ME
teto where code
Like this?
check the brackets
Remove one of the red brackets
remove 1 bracket at line 5
it says the problem is occuring at line 7
No, after the then
[SMODS RReferences "main.lua"]:23: Error processing file 'data/jokers/claimh.lua' for mod with ID 'RReferences': [SMODS RReferences "data/jokers/claimh.lua"]:3: '}' expected (to close '{' at line 1) near 'config'
it was working before
idfk how I broke it
I only changed "name" to "key"
comma after the key
Yep, it works now, thanks!
and now its giving me a different error
[SMODS RReferences "main.lua"]:23: Error processing file 'data/jokers/claimh.lua' for mod with ID 'RReferences': [SMODS RReferences "data/jokers/claimh.lua"]:8: unexpected symbol near '='
AND ITS JUST A NUMBER
NOT A RANDOM SYMBOL
GRHHHGH
Oh right before you go @wintry solar , another thing
A little nitpick, it has some pacing issues
if context.cardarea == G.play and context.main_scoring then
.... suit resetting code ....
card_eval_status_text(card, 'extra', nil, nil, nil, {message = "Reset!"})
end
This is the second part of the Enhancement where it resets back to its original rank. When it gets played, the rank instantly resets visually. Then it displays the "Reset!" message and then scores its chips.
How do I make it so that it scores first, then plays the "Reset!" message and actually reset the rank at the same time?
God help me
do you still have 2 of these
no
show current code
You forgot a }
add one } back at line 11
FINALLY IT WORKS
if bracket is red then its missing its pair
if you have {, you will need an equal amount of }
Put the code for the reset in a function that you send in the return table with func = function() —code here end
That should work
i would suggest people who want to make custom jokers n stuff to read about basics of computer programming if they don't know anything about programming
but alas
nothing just just suggesting people to dive head in
My computer science degree didn't prepare me for Lua
😭😭😭😭😭
i don't even have a degree yet
comsci too
it's ok everything will become JavaScript
I took two seperate introductory programming classes in college and I still feel like a total beginner when I try to code mods
Though that might just be because it was over 5 years ago, lol
No. You are forced to learn C++ and object oriented programming
and I'd done no coding since
I do think the fact that I can't really remember python or c++ help me have no expectations for Lua
everything must inherit Object
right at home
C++ why don't you use print like the rest of the normal programming languages
question: how am i even going to start with adding particles to my booster packs bg 😭
the only help i have is this and i dont even know what to do with it
You can see how SMODS reimplements vanilla booster particles in the src/game_object.lua file.
Hmmm
Just suddenly got curious about the capital G and which folder its source code is hiding in.
game.lua
Damn
It's just right there the whole time
I've been thinking about adding twenty stickers
wtf
i have some gameplay idea in mind
i have a joker that is basically Hiker, but adds bonus mult instead of bonus chips. unfortunately, the card UI does not display this.
my current idea to do this is to add the needed UI text to loc_vars so that when the UI updates, generate_card_ui picks this up and succesfully displays the bonus mult. (see image)
so my question is: how would i add the needed loc_vars text to the vanilla playing card ui? i'm looking at using the SMODS.Object:take_ownership() function but i'm unsure which SMODS.Object to use
A dumb way I immediately think up is to make a new card object that fits your requirement and replace the old ones like a race of shapeshifting imposters taking over the deck.
oh actually, i could just make it into an enhancement and save myself a ton of headaches 🤣
intentional game design
it is funny to come back months later and see people reinventing the wheel so to speak lmao
Sorry, i have a question
How to change the G.GAME.probabilities.normal to other value (other than 1)? I want to have joker with "3 in 4 chance" or something
to be clear, this would be just in the code itself and not under any SMODS.objects{} ?
so something like:
local generate_UIBox_ability_table_ref = Card.generate_UIBox_ability_table
function Card:generate_UIBox_ability_table()
--the rest of the code
end
SMODS.Joker{
something something
}
uhhhh i think i did that with mostly lovely
i recall doing some rather ambitious things when smods 1.0 was On The Horizon
custom sound is crazy
you would just use 3*G.GAME.probabilities.normal
if you change the value, it will affect all probabilities
tbh I doubt the code from like April would hold up to what steamodded now is, but doesn't seem like a terrible idea to still add into smods
aight, tysm
i mean its mostly just patching Card functions iirc
the localization would be the difference i guess
but i know what you mean tho, the custom centers for minor arcana and stuff dont work right anymore and i have no idea why @_@;;;
If I added a new context for a Joker, would SMODS read it?
this doesn't work how can i get the names of the other jokers instead of just jimbo
-- Get all Joker names
local joker_names = {}
for i = 1, num_jokers do
table.insert(joker_names, G.jokers.cards[i].name)
end
-- Randomly select one Joker to say something
local joker_name = joker_names[math.random(#joker_names)] or "Jimbo"
SMODS.eval_this(card, {message = (joker_name .. " says hi"), colour = G.C.BLUE})
want to make it randomly say something about one of the other jokers (provided you have any)
after removing the oddities SMODS object, now the cards don't output any UI at all
oh my did you manage to find oddityapi somewhere
nope, i just copy pasted this into my mod code, then removed the or SMODS.Oddities[key] in the first if condition , and converted the function Card:generate_UIBox_ability_table() into a hook (based from the tutorial i saw) and prayed that it worked
#💻・modding-dev message
this is what i mean
imma try and look into it more once i get back to coding this in a few
did you wayback machine my code
because if so, lol lmao etc
looks like thats not even smods 1.0
Yup, and i am not ashamed 😅
Thanks, i’ll definitely need it lmao
which reminds me aure did you ever add subtitles
the implementation i had is broken on new smods and im too dumb now to fix them lmao
i forgot about subtitles lmao
i think i should make a mod that exists
yes
I yanked the code from a different mod, but I want to make it give +7 mult on trigger. What do I need to change to have it work right?
(Also, that or statement should work, yes?)
You are not adding mult though? Its going to be x7 instead of +7
Or im dumb
What did you change
Here's what it looks like now
I tried taking data from an example Gros Michel
Can you send the full error code?
Cryptid server's helping right now
Alrighty
I think I need some secondary opinion and inputs.
OK so this joker I'm developing
makes every shop item
either become free or price in twice.
The current problem is that
I can't make it effect on initial items and booster packs without a bug that
makes on-shelf items doubled up prices again after
you open a booster pack and come back to the shop.
An alternate solution I'm hesitating to take is
to only calculate the chance
the moment you buy anything in the shop,
and either tax or refund you 100%
of the cost after the purchase.
The reason I'm hesitating is that
this operation, even though effects equivalently,
doesn't exactly match the description I prepared for it.
Should I keep fixing the bug
or just take the second approach?
wtf is that formatting
its majestic on mobile lemme tell ya
i think you could put a property in each shop card that keeps track of if you already modified the price
ngl i thought line wrapping was a feature on mobile too
I tried that in the earlier version
That looks so cool
hook to create_shop_item?
it is im being sarcasm . jpeg
:todd:
the problem is what if, for some reason, a player decides to have two of this joker
either buy a second one, Ankh on it, or blueprint/brainstorm
maimai
what's the issue? you'd be putting the property on that specific card, not all copies of it
can you add the tpaz cats :plead
nvm that
there are base game cards that have no effects when duped
What property?
The goal is to effect the price of every single shop item individually
so shrug
i misunderstood your previous message
if you want to change the price multiple times if you have multiple copies of the joker, that would have to be accounted for
in which case, this?
What if there really are some idiot wanting to risk with quadrupled price?
It'd be very difficult for me to reject their gambling-addictive desire
WE'RE BACK
(My Trance mod was messing it all up.)
AND IT WASN'T MY MOD
I'M NOT BAD AT CODING
AND MY CODE IS WORKING FIRST TRY?????
W
It's to help myself troubleshoot my grammar but forgot to put them back together, in case anyone still want to know why.
Nice
Feedback:
What should the rarity of a joker that gives +7 for each scored 7 or Ace be?
uncommon, similar to Fibonacci
+7 mult I assume?
Yes
then yes
I mean it covers less number than fibbo with less mult too, common sounds better but I wouldnt be surprised if it was uncommon too
true
Fair enough.
Hang on, how do I get a variable to show? I need to update my +7 when it's affected by Gemini or other jokers like that
show your code
All I needed was the #1#
also that font is sick, how did you set it
(it is not a good font for programming imo)
it's m6x11plus in VSCode
I thought it was familiar
Sometimes it sucks, but funny Balatro font
what would I have to use to do a random range (e.g. 3 - 5)
I know pseudorandom generates between 0 and 1 but Is there an eqivalent for other ranges?
if you give pseudorandom two more arguments min, max it'll generate an integer in that range
how to quick-redeem vouchers? If there's over 100 vouchers that are redeeming, it will take ages!
is there a SMODS function to remove any seal from a card
i wonder...
could you use an image for the background...
Before VS After
Is there a way to make it so that the blind icon changes midgame?
no, but there's way to remove seal
card = (your card)
card.seal = nil
this also works
_card:set_seal(nil, nil, true)
but this method is more direct and can't be hooked by any mod
fair enough
I yanked a piece of code from smod example runner.
I know G.C.CHIPS is blue, but I need yellow,
so which one of G.C. is it?
Is it g.c.money, g.c.dollar, or something else?
It'd be just a crash
how does one keep up with all this
is it yet advisable to dev against new calc or wait for smods team to smooth it out first
how do i prevent calling card.start_dissolve when the consumable has unbreakable sticker on?
We wait
(probably, idk)
generally you should update your mods to work with better calc asap
aight what kind of thing needs updating
honestly its possible my mod is fine tbh i dont do too many weird calculation stuff
playtest ig
im gonnnaaaa im not home yet :)))))))))) freezing on a bus
What’s this about an update?
it might be worth checking out whatever commit updated cryptid to new calc and just see what they had to fix
so true
how do i prevent calling card.start_dissolve when the consumable has unbreakable sticker on?
steamodded breaking change made a lot of content mods not work
Oh RIP
oh is cryptid on new calc now
my famous content mod [REDACTED] might need some TLC
also hi it's me again
hello splash woman
cryptid is still on old calc i believe
well that sucks
I just woke up so apologies if this is a dumb question but. Is there like a guide on how to make a Balatro mod
yes there is
Where
i don't remember
I also just woke up
lol
it's somewhere in the forum posts
someone made a video tutorial for it
how do i prevent calling card.start_dissolve when the consumable has unbreakable sticker on?
check for card.ability.eternal
it dosen't care whenever card.ability.eternal is on
ik
i'm saying you should check for it in your code
i'm gonna find the code where it uses the use_consumeable and hook them
well the code isn't easy code to hook on
it uses local variable called dont_dissolve and not even hooking the code will make the card invicible
wait no
don't tell me you're thinking an eternal consumable will never be used up
i have to use lovely overrides to put dont_dissolve inbetween code
ive been trying to add a custom edition to a card using a consumeable for the past 10 minutes
(im also sending the edition code incase theres anything wrong over there)
can_use = function(self,card)
if G and G.hand then
if #G.hand.highlighted ~= 0 and #G.hand.highlighted <= card.ability.extra.cards then
return true
end
end
return false
end,
use = function(self,card,area,copier)
for i = 1, #G.hand.highlighted do
Card:set_edition(ascened, true, true)
end
end
}
SMODS.Edition{
key = "ascened",
shader = false,
loc_txt = {
name = "Ascended",
label = "Ascended",
text = { "God's hand will guide you" },
},
config = {
chips = 150,
mult = 15
},
in_shop = false,
badge_colour = G.C.WHITE
}
oh why is the card not returning to consumable cardarea
[manifest]
version = "1.0.0"
dump_lua = true
priority = -10
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = "e.config.ref_table:use_consumeable(area)"
position = "after"
payload = '''--intercepting the code would be fun, this is first time to use lovely overrides
if card.ability.unbreakable then
dont_dissolve = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.2,
func = function()
card:add_to_deck()
G.consumeables:emplace(card)
return true
end,
}))
end'''
match_indent = true
look up
is better calc backwards compatible with old-calc
like can i write code for better calc to give support and still use my mod in old-calc
wait my mod probably already has better calc code considering im taking things from the new wiki
though old example mods so
it makes the game softlock
No probably not
The wiki also isn’t updated to better calc afaik
Have you tried your code on new calc?
no i havent
Unless it has enhancements or editions, or plays with score calculation or eval_card, it should just work
ok
but i mean in the future i prob will make an edition
Then might as well make the switch sooner than later
go back
You can use SMODS.calculate_effect instead
the thing is that i use other mods and other people use other mods that are broken with the new version
if i wanted to use my mod (if i did switch) then id need to find a port for or uninstall all of my other mods
id rather just wait until the new version is more adopted
@wintry solar the juice timing for other_joker and other_consumeable looks wrong
how do i make consumable add cash after using?
Baseball Card juices correctly, so idk
oh nvm thats why LMAO
anyone help?
for context i was using card = context.other_joker
Im trying to use the cryptid mod but when selecting a deck, one specific one (unsure of the name) causes a crash
i love that font ur using
give it to me
whats the name of the font 🔫
04b03
ok then?
?
weird font name but ig it exists lmao
?
i think it says typhoon deck
this is like some kind of hex code lmao
ease_dollars
I have no idea why it crashes, im only using the mods it gave plus more speed
oh yea, im also using Joker Display
try turning off all other mods
okay give me a 1s to try it
i dont know how to use it
that seemed to work but i also just enabled everything under the mod settings
ease_dollars(amountOfMoneyToAdd)
you know how to make a consumable right?
okay, when i open the "Antimatter Deck" the game crashes, im only using Cryptid and Tailsman
im trying to make it so a joker creates another joker, but for some reason it creates that joker and then also fills up a joker slot with an empty space, so it goes from 1/5 jokers to 3/5 jokers while only actually having 2 jokers. ive tried using code from Riff Raff, Judgment, and even Cryptidmod but i cant get it to work right. can anyone help?
if context.first_hand_drawn
and #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit
-- and not context.retrigger_joker
and not context.blueprint
then
if #G.jokers.cards < G.jokers.config.card_limit then --probably redundant
G.E_MANAGER:add_event(Event({
func = function()
-- for i = 1, jokers_to_create do
local new_card = SMODS.add_card({
set = 'Joker',
area = G.jokers,
key = 'j_joker'
})
card:add_to_deck()
G.jokers:emplace(card)
G.GAME.joker_buffer = 0
-- end
return true
end}))
end
end
messy code is messy
you don't need to add_to_deck or emplace when using add_card
it does it for you, so it's being done twice
that was it, awesome thank you
also is it possible to make a joker that doesnt show up in any way except when a joker creates it?
the workaround is this
[manifest]
version = "1.0.0"
dump_lua = true
priority = -10
#intercepting the code would be fun, this is first time to use lovely overrides
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = "e.config.ref_table:use_consumeable(area)"
position = "after"
payload = '''if card.ability.unbreakable then
card2 = copy_card(card, nil, nil, area)
card2:add_to_deck()
area:emplace(card2)
card.ability.unbreakable = nil
end'''
match_indent = true
why are you using a priority of -10 btw
I need some help.
How would I make a joker gain mult depending on the number of chips a card would score when it is destroyed?
wait other_consumeable is a thing?
dang
didnt know
Idk the specific functions you’d use (trying to learn how to make mods for this game period) but I imagine you’d store the card’s chip value, add the value to mult, and then destroy the card
what is the list that holds all cards in hand? even if its above handsize?
dang i am out of the loop
whats better calc....
everything has a calculate
basically
probably
like one of my consumables uses a calculate
dang
might not do anything serious to my mod so
you have to update things now!!! hahahahaha
what is the context for a card being destroyed?
yea
check canio probably
or via hanged man, doesn't really matter
I've seen 2 updates for Balatro today, 100KB and 200KB. What's happening?
canio is kinda eh, since its calls a context that just.. doesnt exist
caino*
yea, I looked into its code and found that too
potato shomato

thunk moment
so, is there any other context I could use?
i tried it myself and couldnt find it
man
mhm
-# what does += do
shorthand way to add stuff, methinks(?)
some other variants are *=, /=, -= and so on
It's giving out the mult, but not the chips. What's the fix?
cant use the same return, you'd want SMODS.eval_this
Use better calc
But that’s not the problem
Remove the two inner curly brackets in the config line
Still not giving the chips out.
better calc made it so you only need one return?
Where do I get BetterCalc
Yes and no messages unless you want a custom message
And now to spring the question because i believe it is appropriate (it is not)
-# I want to make a mod. Where do i start? (Is it any help that I've used Love before, specifically Kristal, a deltarune engine)
I use VSCode
smods folder should have some example mods
And I have a .lua file explaining some coding parts
that
Thankies
But none that I saw discussed chips
Thanks (Line 298)
im trying to have a joker create a customly added joker with SMODS.add_card, and the actual creation code works, like with j_egg, but when i input a custom key, i get this error
can anyone help?
local new_card = SMODS.add_card({
set = 'Joker',
area = G.jokers,
key = 'j_bird',
no_edition = true
})
maybe i need to put somewhere that j_bird is part of the Joker set? im not very knowledgeable
or make a new set?
Whenever i open the "Antimatter Deck" the game crashes, ive switched to the old counting system, im using Cryptid, and Tailsman. Any way i could fix this?
I have no idea what is causing it
Hey guys, I'm trying to make a joker to do stuff per held queen in hand, and while the calculate works in general, it also re-triggers when the blind is won.
My calculate for the joker is:
calculate = function(self,context)
if context.individual and context.cardarea ~= G.play and not context.other_card.debuff then
if context.other_card:get_id() == 12 then
return {
x_mult = self.ability.extra.x_mult,
mult = self.ability.extra.mult,
chips = self.ability.extra.chips,
card = self
}
end
end
end,
Using better calc?
-# also why use self
is there a way I can grab the key of the current blind
I did figure out how to grab the name but that'll make it break if you're on another language
how does madness do it?
it doesn't grab the key of the blind
G.GAME.blind.config.blind.key
it just goes "and not context.boss_blind" or whatever the boss blind context is
I think?
I think that’s the shortest reference
currently struggling to make a joker that does something upon clicking "cash out", is that possible?
why on cashout instead of end_of_round
just make it decrease when you exit the shop
yea but then its like, you buy it and it immediately loses a dollar
increase starting $ by 1 to compensate
okay yea like thats functionally the same but it doesnt feel good
When patching, is there a way to replace all ocurrences of a specific string in the target file but not replace the entire line the string is on?
i was able to add a custom context for after your end of round reward is calculated so it works, but it still looks kinda fucky cause it displays the "-$1" before the results screen
id rather have it be upon entering the shop
If you're already adding a custom context for that, is there a reason not to just create a custom context for entering the shop?
thats what i wanna do im just dumb and cant find where to put it in the code
Not dumb, the codebase is a mess and everything is put in a weird place
you can use regex instead of a pattern
if context.end_of_round and not context.blueprint and context.main_scoring then should normally trigger like if context.end_of_round and not context.blueprint and not context.repetition and not context.individual then, right?
if so, then it isn't working right
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = "G.deck:shuffle('cashout'..G.GAME.round_resets.ante)"
position = "after"
payload = '''
for i = 1, #G.jokers.cards do
G.jokers.cards[i]:calculate_joker({cash_out_something_something = true})
end
'''
match_indent = true
this is where i put it when trying to do that
bumping this pls
need mod prefix
how do I check if only 1 card is in hand?
this doesn't seem to work:
if G.GAME.current_round.hands_played == 0 and #context.full_hand == 1 then
j_bird is not a key
it should be j_[mod prefix]_bird
should be just
if #context.full_hand == 1 then
right?
how is this a nil value i dont understand
did you start a new run
no
nope, that crashes the game and says that the length of that field is nil
i used a savestate
its good practice to start a new run everytime as sometimes things, like Jokers, dont get updated with the new code correctly.
new run
this seems to be working tysm 👍
uigh
need help with this
awesome that was it thanks guys, for some reason i thought the prefix stuff was always automatic
any ideas on why full_hand is nil?
do you have a context check?
could be that it's being calculated outside of playing a hand
what exactly do you mean with this?
for context, it is being checked in a custom jokers calculate function
is there a way to quickly remove all cards in a deck or do I need to just iterate through it?
did someone delete their message about how to make the joker shake with a message during a custom context cause i need that back
can i see the full calculate function?
calculate = function(self,card,context)
if context.joker_main then
end
print(#context.full_hand)
if G.GAME.current_round.hands_played == 0 and #context.full_hand == 1 then
print('hi')
G.E_MANAGER:add_event(Event({
func = function()
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
local _card = copy_card(context.full_hand[1], nil, nil, G.playing_card)
_card:set_edition({negative = true}, true)
_card:add_to_deck()
G.deck.config.card_limit = G.deck.config.card_limit + 1
table.insert(G.playing_cards, _card)
return true
end}))
end
end
that's not a custom context, that will run on every context with context.full_hand
oh
so how would I check if only 1 card is in the played hand?
This seems to only remove half of the deck of cards (26), instead of every card in the deck. why?
for _, card in ipairs(G.playing_cards) do
card:remove()
end
like this?
#context.scoring_hand == 1
no
nevermind, this also returns nil
(do keep in mind this is my first time making a custom joker)
what would it be then?
do a while loop instead, this will skip a key whenever you remove a card
context.joker_main and #context.full_hand == 1
programming tip: never modify the object you're iterating over
how would I delete each card in the loop then? I doubt nesting a for loop inside would work well.
alright, that works
thanks
while loop, or iterate by key backwards
while #G.playing_cards ~= 0 do
G.playing_cards[1]:remove()
end
Trying to test a mod post calc, what would I need to to do change this lovely patch to be fixed for bettercalc?
create_consumable("Spectral", nil, nil, nil)
ret.effect = true
end```
does anyone have a joker image that they use during testing?
(like a joker that says "test" or something)
I'm using a blank tarot card lmao
that should have placeholder free use cards
thanks!
another weird issue,
this is the code I have, which should create a negative copy of the played card if first hand has only 1 card, and add it to the deck, which it does all correctly:
calculate = function(self,card,context)
if context.joker_main and G.GAME.current_round.hands_played == 0 and #context.full_hand == 1 then
G.E_MANAGER:add_event(Event({
func = function()
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
local _card = copy_card(context.full_hand[1], nil, nil, G.playing_card)
_card:set_edition({negative = true}, true)
_card:add_to_deck()
G.deck.config.card_limit = G.deck.config.card_limit + 1
table.insert(G.playing_cards, _card)
return true
end}))
end
end
However as seen in the screenshot the card stays on screen for some reason?
gonna keep bumping this
If i wanted to add a modded playing card using SMODS.create_card would the key be something like prefix_<card_key>_<rank>?
hi i'm really new to modding, i was wondering how one could edit how much money a deck gives you by default (similar to the yellow card)?
a lot of example code i've found don't seem to have that option
Yellow deck has dollars = 10 in its config. I belive setting that for you deck would have the same effect. something like:
config = { dollars = 15 },
thank you! i'll try it out
this is how i added a message under my joker when it activates, is there a better way of doing this? it feels kinda hacky but it does work deez nuts is probably a placeholder
if context.pl_cash_out then
card.ability.extra.money = card.ability.extra.money - card.ability.extra.money_loss
card_eval_status_text(context.blueprint_card or card, 'extra', nil, nil, nil, {message = 'deez nuts', colour = G.C.MONEY})
end
end```
Would it be possible to change the names of the suits in the entire game? Like if you want to change them to the names in a tarot deck (= wands, swords, cups & disks instead of clubs, spades, hearts, diamonds.) I'd like to maybe change all the playing card textures to tarot cards, but not if I can't easily change the names.
I think this was the way to do it, there’s a different suggested way with the new version of Steamodded
i tried to do it steamoddeds way but i was either missing something or steamodded doesnt like custom contexts
does anyone know what the 'extra' part means
It's just a subtable with the ability table where values related to joker abilities tend to go
Well, that’s because the custom context probably doesn’t have the code that automatically generates the popup
I think the fields in ability are meant to remain consistent, but you can go buckwild and put whatever new fields you want in extra
ahh okay
I think it’s calculate_effect
Custom contexts in better calc are easy to add
Oh or do you mean the string 'extra' that you're passing to card_eval_status_text?
yes this
How so
yeah idk what that is
i just copied it from state_events but i prefer to know what my code is actually doing
lmao okay well if it works it works
You can read vanilla to find out
But I think it’s the type of popup
If you want smods to automatically handle the results, just do SMODS.calculate_context({context table here pls})
whats a context table
how hard would it be to make this kind of effect in balatro https://i.sstatic.net/pIe10.gif, where a card can have a special background in its art
embed fail

Why don’t you ask Jen
how would you add a playing card using SMODS.create_card? i tried using H_2 as the key, but it crashes with center as a nil value.
I'm having the same issue lmao
Needs a G.deck:emplace(_card)
ah
ah
What would I have in my vs workspace to keep my globals defined?
exactly
(ex: localize)
Let me know
I put the Balatro source code there and nothing
Balatro source code or lovely dumps should get most of it
I want an Enhancement with this effect; I need to figure out the specifics but it needs at least a custom shader
The source code didn’t do anything
damn, some advanced stuff (ive been modding for 5 days)
how do i change if a consumable appears in the shop or not? like i want it to appear when i have the right joker in hand
What would the set in SMODS.create_card be for playing cards?
in_pool
working on overhauling the deckskin api myself, got the cards changing depending on the skin working, but this animation that happens when the cards get emplaced is bugging me. dont want them to fly in from the top left for no reason. anyone know how to disable that? I tried just inserting the cards with table.insert but the same thing happened
-# also dont worry the default option wont show every card like it does in this gif, i just havent gotten to implementing the list for specifying which cards to only show in the preview
I like it tho
Also I have a feature working which I think could be part of the API
Random DeckSkin
i mean its kind of a cool effect but its like wrong, every card that i remember coming in from a side of a screen comes in from the top right iirc
Maybe see how Galdur does Stake chips
or how it does the deck stacking
true
anyway victin if you'd like to help with this i would love some help
There’s only two things missing, a visual feature and an in-game UI to select the set from which textures are pulled from
especially if you're familiar with how to properly commit to smods
Maybe on the weekend. What are you missing?
I sent a PR for the DeckSkin Template
i put together a google doc outlining all the plans i wanted to add
In the Example Mods
fork steamodded, then make a branch on your fork for whatever you want to do, then open a pull request to merge your branch into the main steamodded repository
yeah i get that but moreso i was talking about like
idk if theres like etiquette for how to code in smods
is there
idk
it still appears in the shop
did you read the wiki entry on in_pool for how to use it
commenting your code helps for reviews but they generally get removed before they're merged, other than that try not to define any globals outside of the smods table unless you have to
if there's any problems with your code they'll be sorted when the code is reviewed
i don't think there's any other "etiquette"
is the key or area or something wrong? It keeps crashing with center as nil. Isnt it prefix_<card_key>_rank for a modded playing card?
for _, rank in ipairs({ '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A' }) do
SMODS.create_card({
key = 'waterSuit'..water_suit.card_key..'_'..rank,
area = G.playing_cards
})
end
i have a couple globals i defined, i made the customize deck cardarea a global so i could change the cards it has from the change_collab function. also made another global to communicate with that same thing that just act as a reference for the amount of ranks that could be displayed in the menu
i tried to make the globals very uniquely named so they wouldnt conflict with any future stuff
I simply deticate my life to reading the modding section of the balatro discord
You can store global inside a table
Like the SMODS table
ah yeah that is a table isnt it, i'll do that
anyway lemme tell ya what ive done so far victin
globals for cardareas are fine as long as they're inside G (or SMODS). you could probably just store the second thing in the cardarea object from what it seems
I'm trying to make a new function inside my joker, does anyone know why it's just not
(also worth mentioning that defining things in global space is a problem for more reasons than conflicts, it comes with a minor speed penalty for every access, which adds up if you put something in G for example which is accessed a shit ton)
can you include all the relevant code
wouldnt it then be better to not have the cardarea be stored in G or SMODS, since it only gets called in the customize deck menu?
you're trying to define it inside a table
it's convention to store cardareas in G, even though it's slightly slower
yeah
I just started my fork today but so far i added the 'ranks' posStyle which is a solution for people trying to load in unconventional spritesheet layouts like aces and face cards. It uses the required ranks option as reference for how the spritesheet is ordered and loads the cards accordingly. Made that the default setting for posStyle since imo it comes with the least amount of possible glitches or kinks.
I also made it so that default option gets loaded in the pipeline as well, that will come into play later when i start working on the expanded color schemes options.
Heres the google doc i made to outline all the features/changes i wanna add:
https://docs.google.com/document/d/1-t73xFBSDzXCaG9kqAjgRrBUMtVL7woRX9OEBSZF_KQ/edit?tab=t.0
the main thing i'm concened about is the features that have to do with dynamically changing assets, like the colors or the suit icons in full deck. last time i did it it was janky and bad and it's why i wanna make sure im doing the proper smods coding etiquette
what would be the replacement to card:set_ability in Steamodded?
i also wanna make sure it doesnt conflict with Malverk if possible
if there is one
when I add a copy of a card to the deck, it has the red card back instead of the right one (blue, in this case)
is there any way to fix this?
How are you making that card?
call card:add_to_deck() after you create it iirc?
im not sure what sets the back sprite
calculate = function(self, card, context)
if context.joker_main then
local hand_size = #context.scoring_hand
local _card = copy_card(context.scoring_hand[hand_size],
nil, nil, G.playing_card)
_card:set_edition()
_card:set_seal()
_card:add_to_deck()
G.deck.config.card_limit = G.deck.config.card_limit + 1
G.deck:emplace(_card)
table.insert(G.playing_cards, _card)
end
end
?
Theres a property on the card that specifies the back pos. Gimmie a minute and I can pull up my code to copy a card
G.playing_cards is the table of the actual cards in the deck
G.playing_card is something else
function copy_card(other, new_card, card_scale, playing_card, strip_edition)
why does copilot keep thinking pseudorandom_element returns the index 😕
picking X unique cards is pain
how do i use this?
because copilot is stupid
you should get used to that
Bug or someth?
I put the Example Seal mod to my Mods folder, and checking in collections, the info box shows nothing?
Nothing was changed to the folder or files, it was literally a drag & drop. Everything I have installed is the latest version.
example mods often don't work yeah
Dang
that's nuts lmao
they worked at one point but they aren't maintained so
Maaaaaaan
it is what it is
if i were to port my mod, how would i get info on better calc
the wiki is for old, and example mods as you say arent maintained so
I see
what do you have that's broken
hmm this looks a lot like my code to copy
so now the real question is does mine do this?
not sure but someone tested and said there was a compat issue
are there any examples of creating playing cards using SMODS.create_card? I cant find anything for it.
I do know dna used to do this but was fixed
but idk if somethign in dna was changed or internally
okay well the first step to making your code work with something is testing your code with it
ye i should prob do that
later tho
no mine works fine
the secret set_back function that localthunk is hiding from us
im kidding
hmm looking at the save it seems like it was changed from each card storing it's back pos
whats the method to make a shallow copy of a table
table.unpack is crashing for me
or i'm blind
idk i just defined it myself
😭 I had to define my own contains as well smh Lua
table.unpack doesn't exist in 5.1
speaking of
deepfind got obliterated by some commit recently
lol
I tried stitching two of my Jokers together and I got lost
maybe for the best
Anybody able to help me figure out this Joker right quick?


