#đ»ă»modding-dev
1 messages · Page 102 of 1
kID NAMED JOKER
Its like one pixel off from Amiga Normal thanks for nothing
why is bro so mad it's literally custom
he couldnt handle a jonk
Its in the .exe
Open the .exe with 7zip, then its in the fonts folder
There are multiple
Its one of em
this isnt the joker font
there is no font
pretty sure it is?
i think the entire game uses that font
for most of it
The "JOKER" Text thats on alot of the Jokers
oh wait those work differently
oh yeah that's hand drawn
that isnt that font
i imagine it was hand drawn and copypasted
yeah I probably don't understand seals, this is ment to gain 10 chips if the card is played in a pair, but its kinda just doing nothing
anyone know how to change the global music pitch permanently for the rest of the run
pitch_mod?
surely you can do this with the love2d audio library
G.pitch_mod
probably
gfuel is going to change the pitch by 0.25 every time you get a new one
ended up just doing guess work for the N and the L, looks good enough
thats kinda funny actually
modulate_sound does this
comparison
it does it in isaac too
every time u get a new one the entire game gets faster and the music speeds up
that was the idea
gfuel also overlays an explosion on add_to_deck, use_consumable and all the cauculate contexts
Does this seem like its missing something? I feel like it needs something gold.
add shading to the wheel?
Like a shadow or something?
also make all the text capitalized and add exclamation marks to the end of the tex
ok this one's funny actually
bumping this rq
i like this one
i'm gonna move this to the jimbo chat but that's funny as hell
i have all of the screams btw
it isn't funny without the gfuel screams
and explosions
true this seems hilarous
it's so funny in isaac too
speaking of which i accidentally launched isaac instead of balatro
i could also change the game speed lmfao
i have another idea as well
oh?
let me get somethig one sec
it'd be funny if i overlayed the explosion effect on the score counter
version = "1.0.0"
dump_lua = true
priority = 0
[[patches]]
[patches.pattern]
target = "engine/moveable.lua"
pattern = "self.VT.x = self.VT.x + self.velocity.x"
position = "at"
payload = "self.VT.x = self.VT.x + (self.velocity.x * 6)"
match_indent = true
[[patches]]
[patches.pattern]
target = "engine/moveable.lua"
pattern = "self.VT.y = self.VT.y + self.velocity.y"
position = "at"
payload = "self.VT.y = self.VT.y + (self.velocity.y * 6)"
match_indent = true ```the funny patch
what does this one do
you can change the * 6 to a different number if you want
is this the game scale?
makes everything like shake
LMFAOOOO
its hard to describe
incredible
you can just add the config to the patch though
i'll save this somewhere
not by the player*
by gfuel
it needs to multiply for every gfuel you get
that doesn't really matter
just add some config value into the patch and modify it wherever you need to
if the number is too high bad stuff happens https://discordapp.com/channels/1116389027176787968/1233186615086813277/1312084827587215503
but this is also funy
it funny but iunno if it gfuel
its just something i have but havent found a use for
istg is G.PITCH_MOD not the global variable that has the global current pitch?
i'm like 95% sure that it is because it has something configurable for the gameover state that changes it
https://discordapp.com/channels/1116389027176787968/1233186615086813277/1312201743077216266 i dont know how to replicate this but this is awesome
oh that is pretty awesome
i think i need to patch modulate_sound actually bc i think it has a catch for if the pitch is too high
yea
Alr I'm doing that
what haped
Haped
naur i meant for like what it does

ok i'm goin gback to my desktop time to figure out how to change the global pitch mod dynamically for the funniesâąïž
And its only the visuals I dont even know how you're gonna handle the damage of the mama mega
It wont even be the same
probably just automatically clear a blind tbh
hahahahaha
did you dead god yet?
i'm going for infinity%
i did dead god on save 1
getting close to all hard checks on save 3 rn
ok i got the global pitch mod thing working
let's see if it actually does what i want
oops
it's only temporary apparently hahahahahahahahahaha
i gotta fix that
looks good! maybe try adding an outline like banana has? it's outlined in that balatro black, then a white outline too. makes it stand out against the background more
also if you posted these in fan art theres usually lots of other artists active to give feedback đ
only other thing i notice is maybe the symbols on the wheel could stand out more, maybe with a drop shadow or making the surrounding grey darker
time to figure out whether my shitty idea for changing the game pitch every time gfuel is added works
whyyyy
hmmm
i think i figured it out
still tryna figure this out
well I forgot commas I realized but I tried a working version of this before
I tried doing a G.E_MANAGER:add_event thing but that didnt work
i made it work but it has a recursive loop on pitch lfmaoooo
what kind of text editor is that
notepad++
god that brings back the memories
back when i was a small child and vs code didn't exist
np++ has dark themes right
ok yeah it does
but anyways I still don't know how seals work
yeah I understand I'm being annoying sorry about that /srs
real
today i have learned a valuable lesson: changing the global pitch sounded a lot easier in my head
of course, that isn't going to stop me
i could also like just
Did I cook here
alter the definitions of the songs actually
isnt it self.ability.extra instread of self.config.extra?
@frosty dock Small correction for group_key in the SMODS.Booster docs, it's not G.localization.misc.dictionary[k_booster_group'..group_key] that it draws from, it's either G.localization.misc.dictionary[self.group_key] or G.localization.misc.dictionary['k_booster_group_'..self.key] as the default
Also I think the default args for SMODS.Back docs are messed up
ok my bad, should have double checked that. I wasn't sure but decided just to run with it
my next mod is gonna be needy streamer overload i think actually
originally i was going to do something for my friend's card game that's like really cool
it's called railgrind (it's fucking insane)
it's like a jsr card game
anyway i still might do that but i want to add drugs to the game
wavy cap
no
actually maybe hang on
i still need to know what event triggers when a joker is added to the cards
add_to_deck
that triggers when it's in collection for some reason
well actually
now that i'm thinking about it
that might not matter for what i'm doing
check for card.area == G.jokers
it does?
yea
i think what cg recommended should work tho
unfortunately
it does not
đ
it should
there's a context for buying cards, unfortunately there's other ways to obtain a joker
you should use set_ability btw
context.card = card ?
Where are you doing this
add_to_deck doesn't trigger when you reenter a run
add_to_deck is a function you define in the object, itâs not part of calculate
yeah i know
it should be as simple as just
set_ability = function(self, card)
if card.area == G.jokers then
--blah blah
end
end
Well then it depends on what youâre trying to do for what you should use
I changed it to be an enhancement but I'm still having issues, its not doing anything
i just need something to trigger once a run is either re-entered and the joker is in the hand or when it is added to the hand
hm
pretty sure this is what set_ability does
lemme check
it didn't work with the debugplus stuff
add_to_deck = function(self, card, from_debuff)
play_sound("what_balls")
end
on Jokers does actually trigger when re-entering a run.
oh strange
keep in mind that also triggers when something is undebuffed
i don't even think it matters tbh if it does do what i was thinking it might
so you have to check from_debuff
Which is why I have if not from_debuff and togabalatro.config.SFXWhenAdding and G.STAGE == G.STAGES.RUN and not G.screenwipe then ...
that's add_to_deck
wait yes it would
you're really bad at reading today
istg
what's the from_debuff again
whether it's being called after the card is undebuffed
as opposed to obtained or loaded
Exiting a run will also make a sound play with remove_from_deck in similiar example.
tbf these code blocks are super low contrast on mobile
just realized it doesn't even matter actually how i'm doing this
lol
i can remove that block
it's almost time to write out the effects
wait actually how do i make sure that it only plays when it's added to my hand actually and not on reload in this case i was thinking of
just realized it DOES need to play a seperate from the other logic i was running
still doing nothing
Enhancements donât return
ah
still does nothing
enhancements don't get before context calculate, right?
I donât think so, no
god dammit
I believe they just get individual and repetitions
guess I have to make this a seal again if I even can
I don't understand seals
does seal not get context.before either
what am i missing
this sucks
Yeah functionally the same
but I do want this to upgrade the card before it is scored
can I not do context.scoring hand?
if so what i'm doing rn is literally impossible
Should be possible, Iâm pretty sure Iâve seen mods add scoring seals before
I'm trying to make a consumable card type that gives cards a seal that upgrades a card if the sealed card was played in a particular hand
Your goal is for the card to go hiking by 10 chips every time it scores right?
I kinda want it to be before the cards are scored
Which you should be able to do
how
I havenât made any custom seals but I assume you just have the card be upgraded before the scoring return
Add an extra card eval display before the scoring to signify the upgrade
Probably gonna be in whatever the individual context is for seals
I don't know how to do that whatsoever
Have you looked at the vanilla seals?
In your local steam files
Oh probably part of card
I havenât looked at seals specifically but Iâd assume theyâre part of the cardâs personal evaluation function
Iâd look rn but Iâm not at my computer
Can I just overwrite
G.FUNCS.evaluate_play = function(e)
by defining it again in my main.lua?
You can, but the real question is should you?
I need to add an if
where though
for a joker I added, similarly to "splash"
what does it do
what is it you're trying to accomplish?
I originally made it work by editing the source code but im using smods now
generally it's bad practice to completely overwrite functions
using lovely patches is preferred, though iirc steamodded itself has an override on that function, would have to keep that in mind
making a seal, this causes a crash, I guess it cannot detect the card it is on, but idk how to do that
the "fuck" print was debug stuff dont worry about it
context.card?
you see the problem is tht you cussed
These are the only changes I made to that function
utils.unscore_cards(G.play.cards, scoring_hand)
for i=1, #G.play.cards do
scoring_hand[i] = G.play.cards[i]
end
end```
and
``` if not scoring_hand[i].unscored then
highlight_card(scoring_hand[i],(i-0.999)/(#scoring_hand-0.998),'down')
else
scoring_hand[i].unscored = false
end```
the game doesnt like that
there's a card arg in the calculate function
so
ah I see
hiker does that and I thought I needed to use that aswell
hiker isn't a seal
did you mean to say that to me
no
im talking about this
the game doesnt like cuss words
so hes in the timeout corner of balatro
dw ill change the code to say frick
Do you think this should be played hand or scoring cards?
Just patch them in otherwise you will break every single other mod
ah so smods would override my override?
you would overwrite steamodded's override
Smods doesnât override evaluate play anyway
in fact it crashes ;-;
But it does do a lot of patching into it
do you mean editing the source code again?
I might have confused it for a different function then, not at my pc
the + is redundant in the description, gain means add
I mean using a lovely patch to insert your code
i know this seems really cocky but this gfuel card is going to be the single funniest card ever modded into balatro
i can feel it
I'll have to check how that works, thanks
what are some ways to make jokers only spawn if the player has a vanilla joker? i get how gros michel or cavendish do it, but for jokers that dont have a check involved đ€š
wym
just use in_pool?
is it on the documentation? never used it before đ
got it workin! not super ideal as I want it to activate before the hand is scored, but I'm ok with this
only issue is that idk how to get that message to appear and it does not score the bonus chips after adding them
oh shit, ty
so does that make that joker only spawn if you have no jokers?
that "card = card" and "message = {whatever}" is doing nothing
ah
i assume you think it works because it worked when you returned it in joker calculations, but its different
might i recommend the term "Extra Scored Cards" for "otherwise unscored cards"
second question, how can i check for a specific joker using #G.jokers.cards? is it something like #G.jokers.cards == âJoker Nameâ?
I learned about smods later đ
if you want a message to appear use card_eval_status_text
ex.
card_eval_status_text(card, 'extra', nil, nil, nil, {message = localize('k_upgrade_ex')})
ah
#G.jokers.cards is the number of cards you have
for index,value in ipairs(G.jokers.cards) do
if value.key == "j_splash" then
---do stuff
end
end
G.jokers.cards is a table
# is used to find the size of a table thatâs number indexed
someone forgot about discord formatting
ty ty
yeah if you do #G.jokers it returns the length of G.jokers, aka how many jokers you have
-# is that how stencil checks how many jokers are there?
-# probably not
erm
you mean #G.jokers.cards
G.jokers is the cardarea
đ€
oh yeah and
if you're searching for a modded joker
you need to include the mod prefix for that mod in the joker key here
or just search for the joker name
This is bad advice
i know
i was gonna call it the beta method I just think searching by key is better
In fact bad probably isnât a strong enough word
anyway yeah you put the mod prefix after j_ so it'd be like j_cry_jolly_joker for a cryptid thing since cry is their prefix
and i recently learned if a mod doesn't have a prefix, the prefix is automatically assigned as the first 4 letters of its name/ID
isn't that wacky josuke
now you're gonna learn this is no longer the case with json metadata files
Does it just refuse mods with no prefix?
yeah it's required
m
oooooh
im gonna presume even if its your own jokers, right?
yes
then why do people put j_jimbo when giving an example /genq
the j_ part is a class/type prefix
because thats a joker's prefix
it's just how the vanilla jokers are set up
jokers, consumables, vouchers, etc. are all stored in the same vanilla table
so they have different prefixes
vouchers are v_
same with why we have mod prefixes
steamodded is set up in a way where a lot of this prefixing stays hidden from you
say you create an atlas with some key
internally, your mod prefix gets added to that
oh yeah i know about that, i do love that feature
when you specify the atlas to some object, it's also added there
its so nice
updated
Balanced?
Are there any guides with where to start for modding Balatro? I'm new to this sort of thing and don't really know where to start/what tools I'll need
i really want someone to make a deck/mode or whatever that's like the artifact of command from ror2
sound isnt registering, as trying to play it causes a crash where it instead tries to play resources/sounds/Iblock.ogg from the game's files (which doesnt exist) instead
Ah I just saw the guides in forums so nvm
would using lovely.toml be appropriate for this case?
bump
Calling with mod prefix?
Is there a way to make a joker inhereit blueprint but make the direction left instead of right?
So i can make redprint (The reverse version of blueprint)
oh my god
please do something more interesting with reverse blueprint
don't just invert the damn color
what's a blueprint for? building a building, the opposite naturally is a building that was already built so instead of having an effect that copies things because that's what a blueprint does you give it a building like effect and call it Joker Incorporated and it's a massive building
that's way more interesting than inverting the color
and direction
I dont really need a complicated joker right now. I just need one that can go left.
brainstorm
wouldnt the opposite be destroying a building
that is another way of interpreting it
team fortress 2:
also
there's no situation where a blueprint that goes left is better than one that goes right
unless you have two pinned jokers and the one you want to copy is not the leftmost in which case that's your fault for getting two pinned jokers
its not really suppose to be better. its just another option for the player.
blueprint is already the best joker in the game
it does not need "another option"
damn powerscalers eating my cards and shit
you're not supposed to eat those
if we're talking modded then yea there is
anything that acts on the leftmost joker (e.g. gemini) would make it worthwhile
is it not just better to copy gemini
depends
if you need immediate econ and youre doubling an econ joker then youd want to double the econ joker not the gemini
we're comparing blueprint and a left-facing blueprint not a left facing blueprint and brainstorm ?
brainstorm is already a left facing blueprint with a restriction
that makes it more interesting and defined from blueprint
There would also need to be enough jokers that would want you to copy left and middle because fully left jokers would just use brainstorm to ever justify adding âbrainstorm but leftâ
If one joker is able to synergize it would still be pointless because one is not enough.
its only actual use is being able to get both blueprint and left blueprint at the same time without showman
how does this art look?
how do you give xmult and xchips for a joker
i was looking through stuff, and the thing i tried wasn't working so i'm wondering if there's something built into steamodded
actually scrap the first part
i just need xchips
I've had a similiar run-in for my Start Menu joker which has both XChips and XMult.
ios there not just Xchip_mod
nope
zamn
I dont think theres a Xchip_mod. I just used a formula for calculating Xchips then add that with chip_mod.
you can mark talisman as a dependency and use its xchips
is chip_mod just a variable
i'm lazy
the chip_mod will probably work better for what i need anyway
Using Talisman as dependency here. đ
is chip_mod a global variable
oh
riiight
actually this doesn't exactly matter to me if it isn't the exact thing
You can use this kind of formla for simulating an Xchip_mod:
local Xchips_mod = (hand_chips * card.ability.extra.Xchips) - hand_chips
You can define the multiplier in your config or just replace card.ability.extra.Xclips with whatever number you want.
oh wait that's so smart
that's pretty much what i was doing but the - hand_chips makes sense lol
ok let's see if i got what i wanted here for this
can i do a silent calculate
i don't want. box
nvm i'll deal
ROBLOX
yeah
THIS'LL BE SO COOL
oh god
it does not look good with the booster pack shader
also this is the consumable those packs are for
lmao you should put the block tales cards in
these are specifically based on roblox gears
also the block tales cards are not the correct size
i love how i make the background here
could probably modify the block tales cards to make them the right size đ€
add the mod prefix maybe?
i have achieved divine comedy
how can you make a second type of seal?
that stacks with seals and enhancements but not itself?
That would require a bit of work (lovely injection) but yes you can definitely add a new card enhancement type that doesn't stack with another
The problem can be boiled down to adding an indicator to the card (such as card.ability.my_special_card_buff).
Then just checking for it when doing it's effect (calculation, drawing, stack prevention, etc.).
There's technically a bit more than this (like tracking discovery) but that's the jist.
...actually, how difficult would it be to add the extra _mods introduced by Talisman to SMODS.eval_this? 
hey guys check out my new card
only ppl who play isaac get it lol
i don't get it
there's an isaac item that does basically exactly this but in isaac mechanics and i brought it into balatro
here one second
Showcase of the G FUEL! item in The Binding of Isaac Repentance.
Item wiki page: https://bindingofisaacrebirth.fandom.com/wiki/G FUEL!
Join my Discord: https://discord.gg/FypTtsshgB
Follow me on Twitter: https://twitter.com/IsaacGuruYT
Support me on Patreon: https://www.patreon.com/IsaacGuru
#thebindingofisaac #tboi #repentance
wtf they loop the main theme over it
you can't appreciate that yes, the game's music does multiply by like
0.25 every time you pick one up
So it just makes everything feel faster?
no
it makes everything faster
it literally makes everything faster
and then gives insane stat buffs
so just speeds up the game then gives a buff?
no the buffs are different every time
Yeah i'm not getting it, even after watching the video
for the first 7, it has a specific set of buffs to apply, and then after that, it picks randomly from those 7 to apply a random temporary buff to chips
mine i mean
in the game though everyone just likes it because it's REALLY fucking funny to hear him scream gfuel every floor
ive like never played tboi, so what does gfuel do in game
Anyone knows why this doesn't compile?
...why the wrap of the Joker creation in a function?
tbfh I'm copy and pasting code a lot to help with the mod. I'll prob ask the other coders working in this mod, they'd prob know why. Thanks for taking a look tho
basically this
very cool
what is this modifier? G.GAME.modifiers.flipped_cards
does it mean the card is face up or face down?
i wish there was more documentation for this game.
draw(self, card, layer)
i saw this code in the center api, what does this do exactly?
It allows you to control sprite drawing onto a card directly (such as moving a custom soul sprite or drawing a shader).
okay
whty is making a config so difficult
a config for what
ah you're streaming in cryptid discord you've figured it out haven't you
how do it make this not say error in my consumable pack
I know it's using localization but idk how to do that
Hey all, I'm looking for some feedback on these deck ideas. What item do you think Sloth should start with? Do these seem fair (The pros and cons are equal/closely equal)?
-- Deck Ideas:
-- - Pride Deck: Start with Money Seed and Director's Cut vouchers. Pride Joker has a 1/4 chance of doing one of the following:
-- 1) X0.75 Chips
-- 2) X0.75 Mult
-- 3) X2 Chips and Mult
-- - Sloth Deck: Start with [something here]. When a hand is played, Sloth Joker has a chance of not scoring that hand.
-- This chance starts at 1/100, but increases by 5 with each consecutive scored hand.
There's no way this monkey brain strategy works
okay now the game just doesn't
lol
Maybe make the Sloth Joker scaling
Scaling how? What do you think should scale?
where is isac guy đ
they would be estatic to know im making pertro
also idea, blind increases based on the rarity of the joker being upgraded
like common -> uncommon is like 10% increase
rare -> legendary is 100% increase
???
this guys balatromaxing
hes playing 1e308 balatro at one time!!
i wonder if it's possible to like. have cosmetics for the backs of the decks
wdym?
so
say you wanna do a red deck run
but you like the design of
say
the zodiac deck
and you want to use that card back as a cosmetic
huh.
i wonderif there's a way to turn off the sleeve effect...
how do you make a dictionary again?
is there a wiki page on the
enhancement_gate property for seals? I tried looking at the github page maybe I missed it somewhere
or if that even is a thing. I wanted a joker that would only be available if you had sealed cards
Odd Question: Is there a way for me to treat a suit like another suit?
Like how there's smeared joker
V simple custom boss blind
maybe Sloth Joker scales with the chance the hand doesnt score
presumably youd want to override the card:is_suit() method
since that handles smeared joker esque stuff i believe
Maybe. I thought maybe it gets X2 Mult when it doesnt score, then slowly decreases by X0.1 mult each time a hand successfully scores. Im not sure if it should cap at X2 or go higher.
So what do i do that in terms of an enhancement in SMODS?
:idk: sorry i havent touched enhancement stuff
it's usually an inside joke
yeah its usually an inside joke
do blinds have some variable you can freely modify like cards have the ability table? blind i want to do requires me to track something somehow
like if i write :politician: unless you're in this one community you won't know it's for sarcasm
afaik hands_sub and discards_sub are free, other names will need to be added to the save() and load() functions
ic
who @ me
@everyone me sorry
nobody apparently
@weary jungle btw if ur talking about me my pronouns are she/her
tyyy
Trying to figure this out still
figure out what
Welp, after playing around, I MAY have to make this a lovely patch
if im not mistaken could you not just dod like
function old_is_suit = Card.is_suit
function Card:is_suit(suit, bypass, flush)
if (your code here which changes if its suit or not) then
return true
end
return old_is_suit(suit, bypass, flush)
end```
in the enhancement or as a separate section of code?
as a seperate section of code
local old_is_suit = Card.is_suit
function Card:is_suit(suit, bypass, flush)
if self.ability.effect == "Heart Card" and self.base.suit ~= "Hearts" then
return self.base.suit == suit or suit == "Hearts"
end
return old_is_suit(self, suit, bypass, flush)
end```
Tried something like you said, i think something's off
off how
idk it just won't count as a heart
if you put print(self.ability.effect == "Heart Card") while thing is a heart card does it print true? ive had issues with "self" being weird before when doing stuff like this
you could probably also change the return self.base.suit == suit or suit == "Hearts" to return true and the if self.ability.effect == "Heart Card" and self.base.suit ~= "Hearts" then to like if self.ability.effect == "Heart Card" and suit == "Hearts" then, this isnt as prevalent as an issue but im concerned that its going to override other is_suit stuff unnecessarily if you have it how it currently is
But if suit == "Hearts", wouldn't it check to see if the suit originally is a Heart?
im not sure what you mean, the "suit == "Hearts"" bit would check to make sure that the thingsi t asking for is a hearts, itll check anything thats originally the case (like hearts being hearts, stone cards being no suits) in return old_is_suit
and you do not have to but in this snippet you sent me i think you unnecesarily are
well, youre checking that its not originally a heart (with self.base.suit ~= hearts) so that you can return that it is a heart later which i think is redundant
well yeah
The point of the enhancement if it's another suit then it counts as a heart
So maybe i should check if it's the other 3 suits
if you have the enhancement on a card that is originally a heart does it count as a heart
i'm gonna be real, idk how to even check that with the print
Because every time i play a card, nothing happens
and i'm like 90% certain i destroyed my code because i'm stupid to press save before i open balatro
does nothing come out of the print? SMOD might override the is_suit method
i hope it doesnt but
I've been trying to look at how Familiar does it on their end to no avail
by the looks of things that doesnt change what classifies a suit as what i think?
i just tried by the way, im not sure what i did to change to make it work or whats different but
local old_is_suit = Card.is_suit
function Card:is_suit(suit, bypass, flush)
if self.ability.effect == "Lucky Card" and suit == "Hearts" then
return true
end
return old_is_suit(self, suit, bypass, flush)
end
``` makes it work **on lucky cards**, so change the name around from lucky card to heart card ig
i feel like it might be an issue with how youre checking for your enhancement since the changes i made functionally shouldnt have affected anything, but im just guessing
you might need to change the name your checking for to like prefix_key since i know the name stuff is different for modded content
I have another thing that checks for card.config.center_key, could try something like that
out of sheer curiosity from a i like hearing about other mods perspective does the heart card enhancement do anything else other than make cards count as hearts
Nope, it just counts as hearts in scoring
function Card:is_suit(suit, bypass, flush)
if self.config.center_key == "m_SCB_heart_enhance" and suit == "Hearts" then
return true
end
return old_is_suit(self, suit, bypass, flush)
end```
It works now
thanks btw
np
gotta check if it works in scoring on something like bloodstone
or lusty joker
The enhancement is 1/4 btw, I'll have an enhancement for each suit
it does btw
I may have compatibility stuff, and curious what would happen if it's smeared
i assume these enhancements are like something that doesnt appear normally coz youd think youd rather have wild cards in most scenarios
oh actually i guess this has the up on wild cards coz its less likely to get disabled by boss blinds
tbh, they're just gonna be like any other enhancement
may make it the same amount as their "Turn to suit" versions
ic
Interesting
Maybe I should have it so that it triggers twice for base hearts w/ enhancement? idk
this is an incredibly silly idea but itd be interesting if it was like
you could put it on a card as a seperate thing to an enhancement
i might just be wild cards biggest hater coz id rather have most other enhancements but itd be sort of cool to have an enhanced card which counts as two suits
maybe a little strong but ÂŻ_(ă)_/ÂŻ
if I make a parts of a joker texture transparent or low opacity will it be 'see through' in game?
can you see through glass cards?
Yeah
GGGGG FUEEEEEL
hey chat
how can I make my joker sprite work like a legendary joker
I have both sprites seperated on my sprite sheet but I dunno the code
yeah
of course
Throw in a soul_pos just like pos for the floating sprite.
Something not work, or what?
Seems like it, double check that you have .png in the path, your image is saved as a .png rather than any other format, that it's in assets>1x and 2x, and those aren't misspelled.
oh shit
I forgor the x2
lmao
thanks
yeah it works now
lmao
:3
@dim ice
yippee!
how ironic

hey
chat
can I make it so that
the background is different
based on a stat
so that the background changes from where I got the item
It's completely possible, but you might want to try modding a few other items and take a few smaller steps before trying to jump straight into that.
yeah its for later
but just knowing its possible changes the way we are making the mod
so
thanks
so not like that
:3
lul
ah
Hello
[patches.pattern]
target = "functions/state_events.lua"
pattern = '''
for i=1, #scoring_hand do
--Highlight all the cards used in scoring and play a sound indicating highlight
highlight_card(scoring_hand[i],(i-0.999)/5,'up')
end
delay(0.2)
'''
position = "after"
payload = '''
if next(find_joker("Splish Splosh")) then
print("next is splishsplosh")
utils.unscore_cards(G.play.cards, scoring_hand)
print("should have unscored hands")
for i=1, #G.play.cards do
scoring_hand[i] = G.play.cards[i]
end
end
'''
match_indent = true```
I've made this lovely.toml to update the G.evaluate function
And altho this is added before mods are even loaded, the code is run after a hand is played so it should work no?
It doesn't find my Joker even if I have it equipped
```next(find_joker("Splish Splosh"))```
did I write something incorrectly
you shouldn't use find_joker, use SMODS.find_card with the key instead
hey @frosty dock
can u help me pretty please
:3
actually I just need to know
if that's somthing I can make later
add a button here
yeah, totally possible. But UI isn't the easiest to deal with starting out
Back to overthinking... but this time, pondering the Talisman Lovely patches and their "reproduction" in Steamodded itself. 
j_prefix_[etc] correct?
j_modprefix_key.
yeah that, ty
Backwards slashes prevent *formatting* from _happening_.
@frosty dock Do you think Talisman's extra operations on chips and mult could be feasibly integrated into SMODS.eval_this() using similiar additions that its' Lovely patches do? Just curious. đ€
yeah totally
talisman could patch that in
or rather hook, because load patches are broken in lovely still
...the answer might've been much simpler than expected. đ
the Joker is temporary, threw something up to test this.
that worked, thanks
another thing. I've added this function to my utils
utils.unscore_cards(G.play.cards, scoring_hand)
but it leads to a crash when I play my hand (it doesn't find the function)
do I need to patch the function directly too for this to work?
i don't know how you're even defining that function?
utils
function unscore_cards(play_cards, scoring_hand)
-- Loop through play_cards
for _, card in ipairs(play_cards) do
-- If the card is not in scoring_hand, mark it as unscored
if not contains(scoring_hand, card) then
card.unscored = true
end
end
end
return utils```
main
```utils = dofile(SMODS.current_mod.path .. "/MyJokers-utils.lua")```
...you've defined a global function not as part of the returned table. Maybe function utils.unscore_cards?
interested in adding a new modification for playing cards, how would that work?
https://github.com/Steamopollys/Steamodded/wiki/SMODS.Enhancement-[wip]
Start here, maybe?
yippe 
sorry, not an enhancement, but a new type of modification
that could be combined with an enhancement, edition, and seal
imo it'd be easiest to use stickers for that
not sure if that fits what you need?
Yeah, that's what I was thinking, and then if that doesn't work, it'd be getting into SMODS.GameObject:extend for a new type of object, right? Or does SMODS.ObjectType work similarly? It's new to me, haven't really looked at it.
more likely GameObject, but that doesn't give you the integration of whatever modification you're adding, so you'd probably have to patch all sorts of places for initializing card values, drawing textures etc.
Stickers can already overlap with each other, unlike those other three, so stickers are probably the ideal way to go for it no matter what, if the aim is just to be able to kind of function as an enhancement that doesn't clash with other enhancements.
i only want one of this type to be allowed at a time
kind of like how seals clash with each other
also ideally it would have its own collection tab/sub-menu/whatever
So something like the "Rigged" status from Cryptid's Code Cards.
no, that's a sticker
I didn't say exactly like it, but I got what you meant.
I think you're in for a rough time either way, the two ways I can see going about it is either one, piggybacking off of stickers, and adding some weird lovely patches to make certain stickers check for each other, and also try to figure out the collection,
Or, make a new object type from scratch, and you'll have to scour the base game code for a ton of lovely patches and basically 90% mirror whatever code you can find on seals or enhancements or whatever.
i mean you can make stickers incompatible with each other / replace each other
Is replacing stickers with other stickers a feature? Never knew, neat. Still leaves the collection issue to solve, but that would've been an issue in any case anyways.
ah, whatever
i don't need it that bad
@frosty dock Saw #đ»ă»modding-dev message yet? Sorry for all these pings, kinda got excited pulling that off.
you can do it by having the apply function remove the other sticker
yep, great stuff
Brilliant solution which feels like it should be so obvious after seeing it.
All it took is replacement of the function with just a couple of extra lines from the lovely.toml of Talisman.
how do i check for the player using a specific deck?
Im getting rly confused tryna do this, i just wanna make the suit textures into the ones i made with a steammodded mod, im a lil stupid, sorry to bother but would anyone be able to help with this?
you mean replace existing suits or create a new suit?
just replacing the textures
I have this, and i dont wanna just, inject it into the exe
basically
check out #1284376286789111940 or #1300851004186820690
Seems mobile game esque
nah this is just the negative ranks from dndg
Ok
They just look kinda like if those weird voodoo mobile games ever were a card game
Idk why
these both seem fairly daughting at a glace, writing the lua is the thing im not sure about
would you recommend one over the other?
Malverk doesnât handle suit teztures
Lite it is then 
How can I create a random negative joker in this scenario?
calculate = function(self,card,context)
if context.setting_blind then
local new_card = create_card('Joker', G.jokers, nil,nil,nil,nil,'j_joker')
new_card:add_to_deck()
G.jokers:emplace(new_card)
end
end,
new_card:set_edition({negative = true}, true)
And how can I pull a random joker?
remove 'j_joker' from your call
context.before doesn't work for enhancements?
Is there a good documentation besides the steammodded one on github?
do examples count?
referencing the balatro source or other mods's source is often helpful
because steammodded has example mods
Hell yea
with debug plus can you spawn a joker in a shop or just your hand?
there's the preorder mod that lets you pick jokers in the shop afaik
db+ does not let you do that no
:3
i just woek up lol
Can I give a new blind a single new image or do I have to use the ANIMATION_ATLAS thing? Tried a normal atlas for it and it's ignored
what does set_ranks() do
What do we think?
looks kinda weird whats its name and ability
very stern
Sergeant, creates a random negative card for each blind, perishes after 3-5 rounds
does balatro run on a ui library or does it literally just use the whole love.mousepressed and then checking if itâs within the boundary of the element
Localthunk made his own UI library basically
it just runs on Love2D
do u know what module itâs in
are there any tutorials or documents that would guide you through how to mod balatro? Iâve never modded a game before and I havenât done anything with lua in ages (and when I did it was roblox LOL)
matters what bootstrap (think thatâs the right word) that u want to use
I donât know what that means đ
itâs basically what modding library u want to use
ah okay
each one has documentation but to get a good reference u should look at projects
thereâs files like card.lua, uibox.lua, text.lua in the game source
yeah I usually learn better by example than anything
a lot of those are moreso library files
fire thanks
yeah me personally iâm just writing from source and recompilingâŠ. would not recommend
thereâs a lot of random limits
for modding frameworks i would look into Lovely or Steamodded⊠ones a modding framework and ones more of an injector⊠itâs up to preference
those are the most popular
idk the percents but i would say so
the documentation is pretty decent and thereâs more projects to reference
neat
when im able Iâll check that out
Iâve been coming up with some joker ideas and wanted to implement them and see how they fare but I wasnât sure where to start with the actual modding part of the process lol
thanks for the help :D
learning basic lua may be the best start
some people are different
100% of modern mods use lovely, the vast majority of which use steamodded
it's perfectly fine to not use steamodded if you don't necessarily need it but with a few special exemptions you should always use steamodded
Where can I find the source for the base game's jokers?
and if you're just adding basic jokers, lua knowledge isn't necessarily needed but it helps a lot
in game.lua
under P_CENTERS
the behavior of the vanilla jokers is hardcoded into the calculation functions though
it definitely is yeah
So how can I check the amount of jokers I have?
i'd be happy to help, and yeah steammodded is the one that most people use and that most people can help with
im still learning stuff myself but i think i've got the basic stuff down
#G.jokers.cards
yeah i was going to say just check the length of the array
but idk if he was talking about in hand or in total
total number of jokers in the game total or currently equipped jokers
thatâs what i meant
idk ui mod
wait wait wait balatro doesnât use _G
^
but all the balatro related stuff is under _G.G
bro did NOT follow the basic naming rules
i mean who cares ig when u sell 5 million copies in a month
i mean.. there really aren't any
u should describe the basic use of a variable in the name đ
it does a very good job at that
like i wouldnât say local x for calculating the sum you would say local sum
when you see G.foo you know it's obviously something global
guess thatâs true
meh when you're a solo developer and not planning on having anyone else peering at your code it doesn't really matter
itâs just weird cause u would have to do local G = _G.G
mod support has never and probably will never be a thunk thing
he expected no players to even buy it
technically? the performance increase you'd get from this is so incredibly tiny
I would make it local thunk
oh wait do u not have to đ
name every temporary local variable âthunkâ or âmâ
are global vars not array calls đ
in normal lua _G is indexed as a backup incase a matching local variable isn't found
and upvalue names are retained
Like 80% of local variables in Extra Credit are just thunk lmao
which lets you do that
Iâll add some m next time I can
i get why luau doesn't do that because it's more efficient
can we get Egg to pin this? I think itâs very important practice for new modders to know of /j
so thatâs why the .__index meta func exists đ
naming the variables the wrong thing will make people think the mod is for a different game
__index has nothing to do with this
local indexing is handled in C, and __index only comes into play if you set it in _G
.__index acts as a backup index if the func canât be found in the metatable
oh that makes sense⊠the more u know
thanks for explaining that
that makes more sense
8 yearsâŠ
if local indexing happened in lua space everything would be like 10 times slower or something ridiculous
high level language moment ...
happens to the best of us
how are you gonna cope with not being able to task.wait()
lol
i was using love right and tried to use task.wait()

and task.yield()
forced to handle coroutine stuff yourself.. the horrors
wait is there not coroutine.create
well i guess it's not really coroutines in luau
i thought there was
"luau"
naw you have coroutines i mean waits
but i forgot that's not exactly coroutines because everything's in separate environments or w/e
lua u
loo a you
useless ass feature btw... i have used a coroutine ONCE
Does lua have switch statements?
no it isnât âčïž
multithreading without the multiple threads part yawn yawn BOOOOORING
love2d does have multithreading
thankfully
calculate = function(self,card,context)
local x = 1
if context.joker_main then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].ability.set == 'Joker' then x = x + 0.5 end
end
return {
card = card,
Xmult_mod = x * card.ability.extra.Xmult,
message = 'X' .. card.ability.extra.Xmult,
colour = G.C.MULT
}
end
end,
Its returning a x0 mult
coroutines are sorta useful outside of what they're claimed to be useful for in lua docs
why are you checking whether cards guaranteed to be jokers are jokers
tracking multiple events⊠especially in like luau for like example quests where u have multiple players all being threaded on different yk.. threads.. and all having to call from different events
Its what is in the code for the abstract joker
moment
