#💻・modding-dev
1 messages · Page 103 of 1
yeah, lmao
tbf i'd do the same
you can just do #G.jokers.cards * 0.5 *card.ability.extra.Xmult
unsure why this wouldn't be happening asynchronously
im gonna presume no, but is there anyway to tell if a player has their playing cards set to be a collab icon and not the normal icons?
wouldn't? would? im not even sure
i haven't done luau stuff in ages
way out of my depth
what’s the question
new fluorescent shader for Bunco 👀
nice
if async is the question it’s a yesn’t
coroutines are synced to the main thread from what i know
in luau
lua it’s different
Now it's just giving X1
hold up
and card.ability.extra.Xmult is 1 right
yes, but that might be just for the message actually
Fixed the message bug, but the description says that it has xnil
send locvars
text = {
'{C:mult}+X#0.75#{} Mult for',
'each {C:attention}Joker{} card',
'{C:inactive}(Currently {C:red}x#2#{C:inactive} Mult)'
},
Thats the mult amount
ayo
that looks sick
nono that is for an index for the table returned from loc_vars
you don't have an 0.75 index (i mean you can but don't do that)
all
#1# is for the first thing in loc_vars, #2# for the second, etc etc
you won't believe me
no way
the 🟣

as a non colorblind they should improve the cs anticheat
skill issue
would that not be in base text (i literally have no idea) cause {} is the wrapper for variables so wtf would “# #” be
cause # would be length if written like code
so where can I put in the locvars?
just change the 0.75 in the text to 1
and i imagine you've handled locvars correctly
but you haven't posted it yet so i can't know for sure
How do I make them? I'm new to lua
hm
wait wait wait i haven’t had to do this because i’ve just been using .. but is there no like f string functionality to do like Cash: {cash}
ok backticks show up as formatted code on discord
imagine backticks there
you can find them in the example joker mods in steammodded, i would send mine but im currently in the middle of osmething
Ok found them, thanks
I think they implied the `formatting`.
np
ah yeah
^
oh and yeah generally with this you use string.format, balatro does it differently because idfk
and string.format uses % or smth
yea
Anyone know how to get the V:1 part of this to work (or what it is) in my mod's i18n file? (e.g. from Ancient Joker)
text={
"Each played card with",
"{V:1}#2#{} suit gives",
},
I'm getting aaa string: "attempt to index field 'colours' (a nil value)"
Ooh maybe it's that i'm using plural
For the suit
Where in the source code would I find a specific joker's functionality? Specifically looking for the Marble Joker
card.lua, starting from line 2580
Am I blind? I thought I checked there
Ty
Is there an easy way or some example of how to override this function well? I tried overriding the calcluate_joker function but now I'm getting double triggers, one of mine and the vanilla one
this is probably going to be similar to "how make joker spawn when x joker is y", but how would i make a joker only spawn if the player has another joker discovered?
i want a joker to only appear in shop when the player has blueprint and stencil discovered, but no idea how to do it code-wise 😭
now trying to override the calculate_joker function I'm getting an error about null context
if you only need to add some lines of code to the function, you can patch it with lovely
I used Pokermon's lovely.toml as a reference
that needs a color returned in loc_vars.colours
it's a variable color basically
Aha I thought that might have been a global thing that somehow wasnt accessible in the mod context, but it looks like it's defined on the joker itself
will it automatically run a lovely.toml or do I have to tell steammodded that it exists somehow
if you have lovely it will be injected before the game loads
gotcha
Is there a voucher equivelant for SMODS.create_card?
Hmm do you know where to define these colors? I'm trying this but getting the same error :[
SMODS.Joker:take_ownership('ancient', {
loc_vars = function (self, info_queue, card)
return {
key = "j_dogmod_ancient_t" .. card.ability.extra.tier,
vars = {card.ability.extra.x_mult, G.GAME.current_round.ancient_card.suit, DogMod.globals.ancientUpgradedSuit},
colours = {G.C.SUITS['Hearts']}
}
end,
})
and
['j_dogmod_ancient_t1'] = {
["name"] = "Ancient Joker",
["text"]={
"Each played card with",
"{V:1}#2#{} suit gives",
"{X:mult,C:white} X#1# {} Mult when scored,",
"{s:0.8}suit changes at end of round",
},
},
Crashes when I add the V:1 thing :[
whats the difference between g,playing_cards and g.deck
make it the unlock condition
(good luck figuring out how to implement an unlock condition, because i don't know how to do that)
sorry, inside vars
vars = {..., colours = {...} }
Do these seem reasonable? Should it be rarier like a 1 in 8?
Forgot to add the commas after chips and mult. Its three differet things, not 2.
Sweet thanks
How do you make a joker debuff the hand, like some boss blinds?
how would one get the hand played and current info / chips / mult in the score ticker? i'm trying to get something that upgrades a hand during a played hand to go back to the ticker for the hand played. it's confusing but
any help?
debugplus can summon vouchers into the voucher shop area, that's all i know though. i dont think they can be automatically redeemed
i also know cryptid implements functionality for buying multiple vouchers at a time
I already found a solution using
config = { vouchers = {
'voucher_name'
},
},
yeah redeemed deck
ah
"how do i x like y does"
check y
that sounded a bit rude mb
but
check how those boss blinds do it
I did, and I found Blind:debuff_hand(cards, hand, handname, check), but Im using a joker, not a Blind.
ah
figured it out :>
Assuming that is is a joker like "if x condition true, debuff hand" then it's just 1: checking if the joker exists, 2: checking if x condition is true and 3: returning the value required to indicate the hand is debuffed (return true I think?).
i doubt there's a context for that
You wouldn't need a context.
?
Just hook with if SMODS.find_joker("j_joker")
i think you might be misunderstanding the problem?
oh?
they're trying to find a way to make a joker debuff the hand
not a blind that debuffs the hand if a joker is present
...This would be how you do that though?
one sec
How would you hook it?
i wonder if that's even called for small/big blinds
same way you would any other method
local old = oldFunc.path
function oldFunc:path(one, two)
--code
old(self, one, two)
end
variable names don't matter
local blind_debuff_hand_ref = Blind.debuff_hand
function Blind:debuff_hand(cards, hand, handname, check)
if #SMODS.find_card("j_joker") > 0 then --does our joker exist?
-- do check for if condition is true (see how blinds do this for reference)
-- return true if hand should be debuffed
-- don't return if not
end
--above checks failed, do normal hand debuff check
return blind_debuff_ref(self, cards, hand, handname, check)
end
Something like this
true
Does anyone know how to access current deck data?
might be issues if the joker in question is debuffed or sold or if that function isn't called for small/big blinds
G.playing_cards
SMODS.find_card handles ignoring debuffed jokers already so that's chill
Other stuff also needs correctly checked
Seems better than what im doing: Debuffing each card in hand and setting hand_chips and mult to 0
i forget just print(inspectDepth(G.GAME, nil, -5))
For context, I want to be able to check if the current back has the remove_faces config set to true
(and then copy the output into notepad or whatever and search for "back")
push
calculate = function(self, card, context)
if context.destroying_card and not context.blueprint then
for k, v in ipairs(G.play.cards) do
if v.debuff then -- working but ugly!
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.3,
func = function()
G.deck:remove_card(v)
v:start_dissolve(nil, false)
v:remove()
v = nil
return true
end
}))
end
end
end
end
trying to use this code to destroy every scored debuffed card, its working just fine but the card simply disappears with no animation, is there anything i can do about that?
you're already using context.destroying_card, you're just not using it correctly
context.destroying_card is passed as a card and iterates over the hand cards
you just return true to destroy a card
when i returned true it would just destroy the entire hand despite only one card being debuffed
you need to do the check on context.destroying_card
but i could have just used it incorrectly then as well
you don't need to iterate over the played cards yourself
literally just return context.destroying_card.debuff
Is there a way to get a config value of a joker card after you have gotten the card using something like SMODS.find_card('j_joker_here')? Would I be able to retrieve a config entry such as:
config = { extra = {
var = 2,
}},
would it be something like:
local fCard = SMODS.find_card('j_mod_joker')
if fCard.ability.extra.var then
...
end
the game just crashed 💀
im struggling to think of decently unique mechanics for ro-balatro
ive thought of places, which are unsellable and unusable consumables that provide a passive effect and destroy themself after a certain amount of rounds
but im struggling to see how they are different form jokers
add child exploitation
and then ive thought about having "studs" as a card enhancement based on the roblox clans
no, that would be it returning a Card
eg redcliff, overseer, korblox
the prized idea
local cards = SMODS.find_card('j_joker')
local card = cards[1]
if card and card.ability.extra.var then
end
but how would i make a way for there to be joker synergy with them without being too specific and unusable if the pools are diluted?
lol a place called condo game and it makes you instantly lose
so tru
also how are these different from seals
Showdown Blind - Condo Game
Instantly lose game if your last played roblox game is not made for kids
lol
but i still need to figure out what things i can do now that ive finished the 12 gears and the packs for them
im hesitant to make jokers because of... last time
the robalatro jokers were absolutely awful lol
I'm trying to press the cash out button with a mod, but it's just not working
if G.STATE == G.STATES.ROUND_EVAL and UIBox.UIRoot then
local _cash_out_button = UIBox:get_UIE_by_ID('cash_out_button', UIBox.UIRoot)
if _cash_out_button and _cash_out_button.config and _cash_out_button.config.button and _cash_out_button.states.click.can then
G.FUNCS[_cash_out_button.config.button](_cash_out_button)
nextCommand()
end
end
end
Is there any way of loading multiple toml patch files? My lovely.toml is getting a bit crowded
yes, any *.toml file from a lovely folder inside your mod also gets applied
How would I get this to work when hooking into a function like so? It crashes with config as a nil value.
local blind_debuff_hand_ref = Blind.debuff_hand
function Blind:debuff_hand(cards, hand, handname, check)
local jCards = SMODS.find_card('j_7dd_sloth')
if #jCards > 0 then
local slothJoker = jCards[1]
if slothJoker and slothJoker.ability.extra.triggerDebuff then
return true
end
end
return blind_debuff_hand_ref(cards, hand, handname, check)
end
You need to pass self with blind_debuff_hand_ref
there's no config here?
oh right, arguments
didn't see that, whoops
imma leave
So like local blind_debuff_hand_ref = Blind.debuff_hand(self)?
return blind_debuff_hand_ref(self, cards, hand, handname, check)
Blind:debuff_hand(...) is short for Blind.debuff_hand(self, ...)
Ah that makes sense. It works now, thank you.
Bump
Im getting an error with the following. It seems to stem from the stickers field. Is it the eternal part?
function joker_add(jKey)
if type(jKey) == 'string' then
local j = SMODS.create_card({
key = jKey,
stickers = {
'eternal'
}
})
j:add_to_deck()
G.jokers:emplace(j)
end
end
That still didn't get fixed?
Are stickers broken rn?
Applying stickers with SMODS.create_card that have should_apply set to false break
Is there a way to circumvent that or do i just need to use add_joker until its fixed?
You can apply the sticker manually.
if SMODS.Stickers["eternal"]:should_apply(card, area, true) then
SMODS.Stickers["eternal"]:apply(card, true)
end
Do i replace card with my joker card (j in this case) or leave all that default? I tried both ways and both ways crashed.
yes
Pass G.jokers as area
wait I'm dumb lmao
Just do the apply line
should_apply doesn't really work (localthunk code is scuffed on this)
For making a thread on #1209506514763522108 , is it fine to link to the Mod's source code if its on a different platform like GitHub or is that against the rules?
I started my own thread with just a .zip of the mod... then made the GitHub later.
I already have both ready, I just want to make sure linking to GitHub isnt against the rules
Github is 100% recommended.
It's preferred to having a .zip, since you can actually go and look through the code before deciding to download a random .zip file off of the internet.
Makes sense
are there any examples on how to make a config for your mod?
config.lua is the easier part... then there's the HUD build-up which is a bit scary. You could look into mine for a "basic" one, I suppose?
it only happens in a run when I hover over the Joker or play a straight because I'm just using the Runner 2 code rn
Show loc_vars in full.
I believe you have to refer to self.config if you want to refer to the values in the config (in place of card.ability)
but do take that with a grain of salt since I've only ever made consumables
alright it doesn't crash anymore but the mult isn't applied
did you adjust this part with the aforementioned change?
no like it says the xmult is xnil
like the variable is still keeping track in the description
it's just not doing anything
hm, can you show the entirety of this function? I'm new to this joker stuff but hopefully I can still help
oh wait, no it is working just the text pop up is broken
that's reassuring
oh just case sensitive
before I program each individual boss as a check, is there a way to check if a boss blind was gonna debuff your hand but isn't because of disabling boss effects
completely unrelated to everything but why do we have a mutual friend
IDK
why is this triggering this
it isn't
post the full error and the full log
ill take a look
oh wait
same thing
im dumb
tired
you're returning soemthing that's not valid for that context, you need to pass repetitions in the return if you return something
triggered should be a boolean
oh it's set to nil at the start of a blind
would that be causing it
wait yeah totally
naw
if statements check for whether something is falsy or not
falsy meaning nil or false
anything else works fine
yeah
also why did you just completely ignore what i said .
cough
Idk what you're saying
pretty sure the context was asking for retriggers and you returned something so it used ret.repetitions in a for loop when you didn't provide it which caused a crash
so either you're not providing a repetitions value when you should or you're providing a return when you shouldn't
post full calculate function ideally
you'll probably need to use SMODS.eval_this since you're returning twice. and the thing you're doing wrong is placing that bottom block of code outside of the context check
eval_this documentation is here
sleeping now but i don't believe you should have any more troubles
alright
How will this effect steamodded?
depends what the content is, i don't exactly foresee major refactoring so shouldn't be too huge to compensate for
It was a joke lmao
Thanks for the /gen answer tho
Well there goes any suspense, I thought it would have nothing
inb4 steamodded 1.0 comes out the day before
drops a major content update
me waiting for steamodded 1.0
does anyone know why my joker isn't reseting when I quit, like he just keeps his xmult
Not unless you post some code
I was also trying to make him animate for each discard like delayed gratification but I couldn't figure it out
You should be changing card.ability.extra.xmult not self.config.extra.xmult
I had it as card.ability but someone told me to change it
here
it made it not crash so
set it back to card.ability and then show me if it crashes
also yeah that fixed that issue
that makes sense
For future reference, in this context self refers the object constructor and not the individual joker instance itself. card is what refers to the individual instance
yee
I realize that, it's why they never ran into any problems with it when dealing with custom consumables
do you know how to make it like not do an animation every frame and wait for the previous one to finish
because I keep trying to make it do a shake for each extra discard but it just doesn't wanna
Use the event queue
ight
How do I check if a card is a specific rank?
I know for suits there's card:is_suit
but is there an equivalent for ranks?
can somone tell me how to fix this
there are multile things wrong
- a single card just floats there
- i want th car to be created and the text apear in between the Nopes
3.WHY IS IT ERROR
Please somone help me i dont want to have to poast this like 70 times before someone helps
ur code vry hard to read,,
idk hopw to fix that
i can send screenshots
u can do ```lua at the start of ur message to make the code ins ide the code blockj have prety colors
print("meow")
i think the single card floating there is bcs the order that its happening
i think the context.before happens before the cards get swiped away
but i had to send a text document because i reached my characher limit
i got that fixed just need t fix the test happening way after
could u drag and drop the file with the code in it ?
doint like copy + paste contents upload the ifle from like file explorer o r sommehting
like to me this is ilegible i canot read it at all
an the other text u uploaded doent have ful code
but i think reason it hapen to quick is cause u dont hav a delay paremmetert in side the G.E_MANAGER:add_event so i think the everything happen at all once
but hard to be sure without full code
?
might have to download it
no ooo dont copy + paste the coded u ned top osave to file and thnen upload file to here
?
wait nvem im got it yea i had to download
the file is indented, discord just removes the whitespace
ok so in these add_event fieled i think u should add the delay paaramteter like dis
and then same for nope text
i like prety sure that should slwo it down
if not that u can try using delay(float) method in sice the functions
You can put trigger = ‘after’ in there too
Am I cooking?
So 2X?
alr
or
this joker loses x2 per empty joker slots
so like
its 10x at default
and each joker space not filled makes it lose 2x
that way negatives dont impact it
But this is a legendary card
imo I think I will keep the 1.5x mult
yeah
all the legendaries eitehr don't supply an immediate effect or require prior setup
the caino, Yorick and Perkio in question :
perko is a slow burn
yorick requires having to discard which takes time?
sames goes for canio
well, alr
I should make a mod
that downgrades chicot to rare
called "all my homies hate chicot"

how do i replace assets with steamodded again
i only know the vanilla way of just putting shit into resources dir
docs are pretty confusing
we do not need more xmult legendaries
no Xchips functionality in SMODS means that i cant halve chips, right? raisedcateyebrow~2
-# without adding Xchips to my mod
Actually... why not just subtract the half as chips?
i'd have to grab the current amount of chips currently going to be scored
-# i feel like thats easily doable, i just dont know how 😭
chip_mod = -hand_chips/2?
Should be that.
I just went the lazy route of requiring Talisman as dependency personally. 😂
nvm found it i had to set an Atlas and replace the existing key
fair enough, i just dislike depending on other mods as a mod maker, its just a me thing
it does make life easier though 😭
#💻・modding-dev message Though, in process, I also overwrote SMODS.eval_this() to support the extra types.
cursed
btw anyone know a way to quickly sort a lua file that returns a table, i just need to quickly sort the l10n keys for the game
😨
balatro malware real™️
anyway thai balatro is real
i hate unlooped fonts but I needed a bitmap font to fit in with the rest of the game
Scary, yeah. But the original parts are still there, I just added a bunch more conditions and operations from the lovely.toml of Talisman.
Hello, I am quite new at modding balatro (and anything really, since Balatro is literally the first game I ever attempt to mod). I was wondering if one could create a deck with a starting joker just like decks with starting consumibles.
-# Also, I am not 100% certain this is the right channel, so please, give me a slight bit of leniency, thanks you.
how might i make a lovely patch to remove the sell and use buttons for a certain consumable set?
sike figured it out
this is the right channel, and yes you can do it; for example, more fluff does it with its gros michel deck
Also, I have the bare minimum knowledge to understand a third of balatro's code, so I may not be able to understand 60% of any given solution, sorry about that.
lemme check...
is this the magic line™️?
-# sorry, I am really dumb.
not exactly, that just sets a flag
the magic line is later; search for that flag name and you'll find it
the code that actually does the thing starts by checking whether that flag is currently true
that's the code that does it, yeah
the fact that it's inside a function that starts
local old_back_apply_to_run = Back.apply_to_run
function Back.apply_to_run(self)
old_back_apply_to_run(self)
is important, though: this makes the code happen at the end of the vanilla function that applies things depending on your selected deck
Do you need the first and third line, tho?
From the looks of it it just patches another variable or something..?
-# Forgive me for being dumb. I expect to learn stuff as I go, mainly asking questions here.
all three lines, yes
the first line saves the vanilla function into old_back_apply_to_run
the second line replaces the vanilla function with morefluff's function
and the third line starts morefluff's function by running the entire saved vanilla function
that's a good way to start learning things, yes
That's what I have been doing the past few days and hours.
I found a folder in the mod loader github with examples for jokers and decks.
I have copied and modified some stuff.
*also TRIED to understand balatro's source code.
Went better than expected, knowing I have the bare minimum knowledge to do print "Hello, World!" without making my computer implode.
I wonder what all these parameters are for.
you can find that in the balatro source code by looking for something like function create_card(
The function (I think) isn't defined in the mod, so I am guessing it is using the game thing?
(you can get the balatro source code by unzipping the exe file like a zip)
That's what I did.
I was left with a like a dozen files and a couple of folders.
I have checked some of them...
it does help to have an environment that can search several files all at once
i've been using visual studio code for that
So far what I have gotten is translation keys, which I use for colored text, internal joker names and , consumables = {'c_fool', 'c_fool'}, ante_scaling = 0}.
(for testing porpuses only, obviously)
I use that.
I know how to open files and folders and that's about it.
Found the function. Trying to make sense of it...
most of these can be omitted
The good news, the function executes, I think
The bad news: it crashes.
if you want to provide the arguments as a table (so you don't have to fill in unprovided args with nil), use SMODS.create_card
you need to supply your prefix
jogla_test_mod
how should it look?
So I have an example I can replicate later.
(sorry for me being dumb af)
if your key is "joker1" and your mod prefix is "jog" you'd supply "jog_joker1" to create_card
either that or just the default joker prefix
i honestly forget
@mellow sable can you fact check me on this
your prefix shouldn't be that long
how do you set your mod prefix again
you need j_ as well right?
it's in the header
I am learning.
or is it automatically determined
both?
I'll shorten it later.
or just j_key
j_cry_jimball
i sure do love prefixing
in the old header format, the default prefix is the first four letters of your mod id
in the new metadata format, there is no default prefix and you have to specify something
Why shouldn't the name be long?
because it's annoying to type, mainly
solely because it's inconvenient
ah
you'll be typing it a lot
yep
it would get really annoying for conflicts if your mod id somehow has the same 4 letters as some other mod
see if that works
Let's see if it works...
yes, yes it would
I expected to get crushed or something because I am dumb af and I probably don't meet the minimum required knowledge to do proper coding
wahoo, it worked!
it's a json file and it's documented in the wiki somewhere for sure
Yes, only for testing
nice
naw dw it's fine to ask about anything here even if you dunno what you're talking about at all
but youre doing good
Now I have a way to test my jokers and shit.
Don't mind the absurdity of the joker.
It is just for testing and stuff.
that's very
honestly, being a master at Lua isn't even that helpful, being able to look at other people's similar work and being able to ask for help when you need it are much more important
a programmer's two best friends
the balatro modding experience
5% looking and 1% understanding what the fuck a piece of code does.
(third best friend is, of course, ctrl+f)
At least I managed to find how to paint text.
so true
Something that really annoys me of this function is the fact that you need a conditional for every single joker you want to spawn.
-# can't wait to ask about adding textures and sprites, but today is not the day because I am no artist.
spoiler it's SMODS.Atlas
where does the game overlay the seal sprite onto the card?
i cant seem to find where it does it
G.shared_seal in Card:draw()
is there a dump of the l10n keys for steamodded somewhere
localization
google is just sayin something about localization, is that what you're talking about? because if so
gotcha
I know I can extract they keys for the base game
but what about the mod manager
I'd like to add l10n for steamodded for my language pack
98%
picking #1306498554419875870 back up after years about a month and i want to be able to adjust the values of the spectrum hands at the beginning of the run if spectra are "easy"
right now i can't figure out how to edit the values at all
i think SMODS.PokerHand is only evaluated when booting the game and not rechecked on a new run
and my attempts to hook the vanilla run-start code have only resulted in crashes
stuff gets copied to G.GAME at start of run because it would be bad to mess with prototype objects
I think it's G.GAME.hands?
yeah it is, i just realized i forgot the friggin. mod prefix.
okay! this seems to be working entirely as intended for the moment
does anyone see any problems i could be missing with this:
local GameStartRef = Game.start_run
function Game:start_run(args)
GameStartRef(self, args)
if easy_spectra() and not args.savetext then
G.GAME.hands["spectrum_Spectrum"].visible = true
G.GAME.hands["spectrum_Spectrum"].mult = 3
G.GAME.hands["spectrum_Spectrum"].chips = 20
G.GAME.hands["spectrum_Spectrum"].l_mult = 3
G.GAME.hands["spectrum_Spectrum"].l_chips = 15
G.GAME.hands["spectrum_Straight Spectrum"].visible = true
G.GAME.hands["spectrum_Straight Spectrum"].mult = 6
G.GAME.hands["spectrum_Straight Spectrum"].chips = 60
G.GAME.hands["spectrum_Straight Spectrum"].l_mult = 2
G.GAME.hands["spectrum_Straight Spectrum"].l_chips = 35
G.GAME.hands["spectrum_Spectrum House"].visible = true
G.GAME.hands["spectrum_Spectrum House"].mult = 7
G.GAME.hands["spectrum_Spectrum House"].chips = 80
G.GAME.hands["spectrum_Spectrum House"].l_mult = 4
G.GAME.hands["spectrum_Spectrum House"].l_chips = 35
G.GAME.hands["spectrum_Spectrum Five"].visible = true
G.GAME.hands["spectrum_Spectrum Five"].mult = 14
G.GAME.hands["spectrum_Spectrum Five"].chips = 120
G.GAME.hands["spectrum_Spectrum Five"].l_mult = 3
G.GAME.hands["spectrum_Spectrum Five"].l_chips = 40
end
end
lgtm
M? Also, what mod is that custom new run screen from?
- Murphy-based deck
- #1270516504470880357
Current Status of the Balatro Mod Manager:
- Steamodded with lovely is nearly finished
special deck 👀
amogus deck
cards scored have a 1 in 2 chance to destroy another card played
Is there a way to override a vanilla joker's texture through a mod?
The baby amogi looks so cute
is there a context for the total amount of chips scored in a blind
Take ownership of it iirc
Oh well
Actually
Um
Lovely patch? I think
Let me check
Then I would just override its atlas and pos?
Wait no vanilla only has 1 joker atlas
I think so?
I don’t know how it works but I’m pretty sure that’s what it does
yeah you can take ownership and just change the atlas and pos
You can use Malverk too
...for animating cards, do I need to manually update pos every frame or, in the atlas specification, use ANIMATION_ATLAS when specifying one for the given card?
inb4 it actually drops next week so there's guaranteed more than one day between it and the gameplay update
not me still adding features despite my self-imposed feature freeze
you mean animating like Aura mod does?
docs are actually close to complete now, which is nice
we need to drop it before 2025 or else our versioning system breaks
me when i 1.0.1~ALPHA-0101a
(my version parser doesn't support 4th level version numbering)
true
Me when ALPHA-1232a
Sounds like a new feature to me
1301a
Somewhat, yeah.
me when I BETA-0027a because we drop it early
me when no more SMODS versions
actually though all we really need are docs on challenges and deck skins and maybe mod functions (but that one could come later tbh)
i should maybe mark that as stale for now
i think we're set in terms of features?
I mean we were supposed to feature freeze a while back
I'm much more worried about what else we need to break
true
but I think we've at least ironed out all the inconsistencies
I'm not aware of any major bugs either, besides #302 which is just a cosmetic bug
@frosty dock Could you tell me, where steamodded actually looks for the mods to load? I need the lua code for BMM
Do we want to fix enhancement calculation?
whatever lovely gives it as the mod directory
They work differently to everything else in that they don’t have a return
what's wrong with it again?
You just have to directly modify the return table
Where exactly?
require("lovely").mod_dir iirc
usually (on windows) this is %AppData%/Balatro/Mods, but can be changed arbitrarily
I see
it looks up to 3 deep
im still waiting on this #1315304310707327017 message
This is how lovely gets it https://github.com/ethangreen-dev/lovely-injector/blob/master/crates/lovely-core/src/lib.rs#L65
you just need it merged into steamodded?
i fear it will break the game because of the possibility that it is badly coded
Yeah I already figured this, but I see no changes when used on Steamodded
wdym?
supported thru language api
yeh i saw
git gud then
seems reasonable
am I wrong in thinking that would be non-breaking because existing usage without return will still work as normal?
can i change the language inline btw?
¯_(ツ)_/¯
without localization
what if we just wnet and promoeted the current build to 1.0.0 stable
that would be funny
is it stable though
depends on your definition of stable
Won't crash
probably not
api stable
probably ish
won't delete your save
yes
wait so how do i change the font inline using language
i want to change my joker descriptions to use a different font
i remember when steamodded would mess up your vanilla profile if you even accidentally had it active when launching
Can I make a new language that is en-us but has comic sans as the font?
you can change en-us' font to comic sans
i'm not sure what the behavior of creating a language with a vanilla key would be
undefined beahviour nice
but you could do it at most once
could i make a language that just uses the keys frfom a different language
i think that's not the purpose of a language api
it could probably be rewritten to support this by not checking the lang key directly
but it would be a funny of the language api
it's fine was just thinking
as long as it still sends the effects table through the calculate, yeah
sobs
you can't. it's unsupported
lemme see how much work it would be to add that
Lovely patching go brrrrrrrrrrrrr
😔
me: this thing's so simple, it'll only take 5 minutes
steamodded: haha noooope
i don't even care
i'm doing it lol
🙏
i wasn't even referring to that
i meant this
oh
wait can i do what i wanted then
😭
wait no i can't wilson said no to me lol
oh erll
no, you'd have to like add a font argument somewhere in the card ui generation process
yea
and take it quite deep down
adding additional {thing:}{}'s could be intresting
card_focus_ui
even as an api for mods to add their owen
I just wanted to mention that mod in case you didn't know about it
how does that one do it?
kid named owen:
i found it
info_tip_from_rows
you can change the font in the node by changing this font = G.LANGUAGES['en-us'].font
i'm assuming that it would include the steamodded languages, yes?
yes
ok so i just need to use my key (which is wrenbind_teammeat) for the language and it'll get the font?
yeah
that sounds right
cool
okay it seems like we can't just change G.SETTINGS.language because the game won't know the difference on load
Btw, if you guys want to know, how much code it around takes per commit for the Balatro Mod Manger, here ya go
👀
omw to add G.SETTINGS.real_language
did i do this wrong?
nvm
nope nevermind
yeah
weird
this is like 1:1 from the wiki
what's on line 42
self i reckon
oh self.TILESIZE
oh nbm
A cool thing about BMM is that, the mods run in an isolated environment, which means, you can still launch the game from steam without Steamodded and lovely being loaded automatically for example
yeah change that to G.TILESIZE
ok
Perhaps one of you persons that know how to code (because I am very new to this) could help me get names of stuff and what not?
(i am new to moding balatro or anything, so please forgive me)
(ping for reply, btw)
wdym
Like, the names for adding and removing Xmult
And probably the "event" names for discarding and selecting a blind.
That's probably what I need right now.
you can (and should) look at base game jokers for this
take green joker for discarding, for example
hm
I tried.
The structure is quite different.
Is there a context for the very beginning; and the very end, of a (boss) blind?
yes
for the joker, contexts, take this https://github.com/Steamopollys/Steamodded/wiki/Guide-‐-Joker-Calculation
Like, the extra thing mods use to "do stuff" is quite different in the vanilla ones.
I think I am looking at the right thing...
card.lua, search for context.
That's score calculation, not beginning/end of blind
scroll down
are you looking for what _mod you need for Xmult?
I can copy and paste code and put it behind another if statement
huh?
can i send an error im getting when loading up the game here?
I think so.
for your joker it should be context.setting_blind and context.discard
find green jokers code, change any self to card, then we can work from there
(ctrl + f "green joker", you'll find it)
im getting this error: Error
Syntax error: functions/state_events.lua:219: unexpected symbol near '}'
Traceback
[love "callbacks.lua"]:228: in function 'handler'
[C]: at 0x7ff99a1c2fa0
[C]: in function 'require'
main.lua:18: in main chunk
[C]: in function 'require'
[C]: in function 'xpcall'
[C]: in function 'xpcall'
what does it mean?
?
Probably a type
-# are you in card.lua?
typo
how do i fix it?
found a
Read through your file and look for stuff like }a or something.
Any code editor should highlight it for you.
some sort of install error, what did you try and install?
a lot of mods and lovely and steammodded
found this
there you are
did you donwload steamodded from source?
yes
-# actually, you want all of green jokers code except the first one you found
Trying to make sense of it.
hm
thats the code that checks if you discard, and when you do you lose mult
actually can you set the font type when adding a new language with steamodded
https://github.com/Steamopollys/Steamodded/wiki/SMODS.Sound
Is there something like play_sound for SMODS?
Or is it only with
return Cryptid_config.Cryptid.exotic_music and cry_has_exotic()
end,```
yes
recently added feature
Now I have to still look for Xmult
as in bold italics and stuff
if you give it a bold font or whatever, sure
I know you can set custom typeface, I meant the style
not sure if or how the game supports that tbh
all you'd need to do is to change the mult_mod in green jokers return function to Xmult_mod
you can use play_sound with your added sounds, just make sure to add the mod prefix
ah
what if the font is variable or comes with other styles alongside regular
you should also change all the card.ability.extra.mult to card.ability.extra.Xmult
@rough furnace here's your meme feature
nvm fixed it but i think something is wrong with the mod math blinds
Guess we copying and pasting.
idk tho im not a coder
SMODS.Language {
key = 'en3',
loc_key = 'en-us',
label = 'English?',
font = 6,
}
nice
some of these look old, try removing everything except steamodded
Love the feature freeze
thanks (:
yeah i know you can set typefaces like that I meant the font styles as in italic/bold/regular whatever
that wasn't in response to you
-# I am quite amazed by the fact that I did get an answer and it wasn't just go figure yourself, tbh
there hasn't been one, it's just on paper (or rather on the issues page)
yeah fair
anyways this was actually really simple to add
-# i despise when people do that, especially since im still a noob so
-# "just go find x" is not the best advice
i just made G.SETTINGS.language take the loc_key and keep the actual key in G.SETTINGS.real_language
-# this is why chatgpt is popular the way it is today, some people are simply just too illiterate to comprehend complex documentation
-# very unfortunate
no apparent issues with it either, might just push it up because why not
i don't think it's super useful but who cares
wonder if it would make sense to rework it as a default key so we can use it to patch on top of other languages without overriding them
You perform operations on the Xmult variable itself in .setting_blind and .discard.
-# LLMs are still cool if you feed it the proper source text and let it summarize it for someone dumb so it's kind of ok
probably but that's way more work than the lazy thing i did
true
That was for me?
ye.
i always document my software with instructions and the reasons for doing it
-# i dislike any and all forms of AI, it could be useful but with the people who currently own it and how its used? fuck no
Oh, and for specifically triggering once after a Boss Blind, have if context.end_of_round and not context.repetition and not context.individual and G.GAME.blind.boss then.
like, Copy X to Y because Z looks for it in Y
tbf it probably isn't that bad
I document weird things but not most things
Isn't that what I am doing
or Replace version.dll so Windows will preload the library before running the game at runtime
fine i'll do it
You're not supposed to return on these.
I want it to trigger at the start of a blind.
ah
like, you don't actually need to replace a file to load the lovely injector or do any kinds of editing
Then have the first context be .setting_blind, oops.
all you have to do is open up process hacker or something and preload the library in memory
this?
UNIX/Linux lets you do that which is pretty cool
LD_PRELOAD is a godsend
instead of replacing a file you just inject it with the environment variable
return only with context.joker_main. The other ones just have the operations.
-# theres a context for after a boss blind, right
perfection
(idk, there should be one, for like golden joker and what not)
thats just context.after, i presume if there isnt, its just if context.after and [boss blind check]
I have if context.end_of_round and not (context.individual or context.repetition or context.blueprint) and G.GAME.blind.boss then for rework of Control Panel.
Oh, and for Aura's animated jokers... that's a touch too complicated for me. Though, if I can still directly manage the pos of the particular Joker without affecting other copies of it myself, that seems like a decent option too.
Why does the upgrade not show up?
...again, you should not return there.
huh
Call card_eval_status_text(card, 'extra', nil, nil, nil, {message = "insert message here"}) for making the message pop up.
kid named SMODS.eval_this:
Or that. 🌚
Then how do I do?
So I can do halfway decent mods.
-# or something
this way
Here.
The new thing.
It displays the downgrade thing even if it can't downgrade more, but idk.
...remove the return {} entirely.
Move the card_eval_status_text right under the if you have there.
this?
Have the card_eval_status_text be right next to the operation.
context.discard can return stuff by the way
Remove Xmult_mod = as well.
return {
message = "Downgraded",
card = card,
colour = G.C.MULT
}```
(for context.discard)
from context.setting_blind?
Is this easier?
ah ok nvm
this is a real thing now, at least it's not as useless
(you can't derive from an already derived language and no, i won't bother with that)
This is when I ask why it works this way.
Playing the card requires you to return something but selecting a blind or discarding does not?
nothing actually requires you to return anything
me on my way to derive from a languah that dervies from me
it's just that thunk never needed this functionality for certain contexts so he just didn't add it
huh?
there's no better explanation i can give
me when that's actually fine
both will have localization strings for the union of the keys they provide, with the one that's selected taking priority on the intersection
non-specified draws from english
I assume a given Joker can't have its' own unique pos on an Atlas with other copies of it currently held?
Why does this have a return thing, tho?
because that functionality is used in the base game
it can't if you change the pos on the center, but it can if you change the Sprite at card.children.center directly
sprites have a function to change pos iirc
wow this has been a great use of my time, we're still missing two full API docs
i thiiink i did it for the custom text
at least one of them basically isn't an API at all, which still means I have to document the type of challenge objects
we'll see
what's the actual difference between context.joker_main (SMODS thing) and context.individual?
well my logic works, i just have to figure out how to make it do what i want
joker_main isn't an SMODS thing at all
it's just the vanilla context for the main joker calculation
context.individual is for card-specific things, like XMult on a specific card played.
(vanilla code just doesn't mention it specifically, it's implied in a huge if-elseif tower
context.individual is called for each card of a card area and used mostly for jokers that do something when a card is scored
IN CELEBRATION OF OVER $18,000 IN THE INVITATIONAL, AND A THANK YOU TO EVERYONE. PART 1/3 JOKERS
The first Joker being the long overdue@jaunty ore Joker: ```Murphy's Law
1 in 5 chance to create a Glass Red Seal Ace of Hearts ELSE Create a blank card.
1 in 1000 chance to gain $18,405 at end of round```
Part 2 will be the Doc himself, and Part 3 will be the winner: Roffle
ecin
I see, like Walkie Talkie, Lusty joker etc then
(what does a blank card do)
Do I need to define a Sprite-specific Atlas or can I just use the already defined ones for Jokers? And is it card.children.center.Sprite.pos, then?
nothing
azaming
language fonts don't work lmfao
welp
gotta get the mod directory
good thing cryptid has referencable code
let's see...
does the "?" imply that in fact it does something
ah no, card.children.center is a Sprite object (base game class). it already has the atlas, though you could also change the sprite this way
changing the pos looks like card.children.center:set_sprite_pos(pos)
where pos is of course a pos table with x and y coords
That's a secret

Got new problem: It re-triggers for each discarded card.
Which is something I don't want to happen.
Do you know if the issue with applying stickers with SMODS.create_card that have should_apply set to false (such as eternal) crashing are fixed?
me when i know i'm about to crash the game (silly)
sigh this is going to be a lot harder than i wanted it to be
i wasn't aware of that being an issue tbh
so i don't think so
smods.language is so fuckedx up lmfao
why
perhaps context.pre_discard 🤔
only burnt joker uses it
Btw, I'm taking suggestions for what Roffle and Dr. Spectred's jokers can do
Perfect - using math.random on card-stored x and y values (got 2x2 atlas, oops) and calling the function you sent constantly.
i take what's wanted is something like this
other places handle vanilla stickers separately, but this should just apply them
...does give me a potential thought of a roulette-like Joker that will act as a blank slot until a Tarot card is used to roll for a Joker to turn into.
mmmm
if this doesn't have any other issues i missed, it's fixed now
Yup, ty
You guys like this joker? And do you think anything else could be touched up on?
Oh cool, I came to see if a mod index existed because I was considering making a mod manager (Dimserene's is too niche for my tastes). Seems like @hidden timber has one cooking though
Yessirr, about 1,5 weeks in on the project
yeah the screenshots looked great
thanks
so folks
how would I go about adding Jokers to this site
now that Cardsauce 1.0 is released i'd like to get those up there
m
m
im ngl i was too lazy to patch for this
idk what to put for the text on here
theres a 9/10 chance this wont be used anyways 
might be too long, but "no oops all bloodstone"? that's what I call Bloodstone + Oops! All 6s at least
no misprint abuse
no BaronMime