#💻・modding-dev
1 messages · Page 271 of 1
and nobody's getting paid to document everything 😛
a lot of features seem to be added in PRs that arent yet documented properly
dope thanks
yeah my first guess was to 'copy' from other mods or the source code as well, cheers yall :3
the source code is also immensely useful
not sure if ur familiar with lua or lua modding but you can hook functions that exist in the game and modify them
In LUA, it is a very important concept to understand that everything is a variable and all variables may be edited in runtime. This includes functions. With modding other peoples' LUA files, like Klei's basegame code, you may find yourself wanting to run your code before or after the original fun...
ive never done anything in lua other than this and i only started this 2 weeks ago
Lua's in that strange spot where I feel like if you feel comfortable as a programmer, but haven't touched a language like it, you're going to be making a lot of mistakes again, accidentally, haha
its quite easy
that was my experience
especially because my only experience with lua is roblox lmao
Interesting.
well ive been translating a lot of concepts i know from other languages into this so hopefully i havent screwed anything up
ive made some cool stuff on there but its not like using lua for modding
All of my game coding experience is in C#/c++ and renpy (Python VN engine) Lua is new to me
N, the rumour is that you're the designer behind Tearlaments and Zoodiacs, tho
i love both of them so yes
It's mostly that the indexing is different, typing isn't hard set, hooking is a thing. Not difficult to learn, but things you're gonna stumble up against when you assume it'll work like C, haha
Yeah, I’m definitely trying to utilize examples more than my regular programming knowledge base.
the bulk of my experience is in godot's gdscript and p5.js
i think if the modding api was fully documented magically our lives would be a lot easier
I think some of the docs are ok, but if you don’t understand how things work already they’re not super helpful
the lsp definitions are a lot more complete
i mean to say
theres a lot of stuff that isnt documented very well
like new PRs are done all the time afaik
and they dont come with documentation
I will say, after looking at plantain I was able to pretty quickly get a joker into the game (using no assets, so it’s just a description)
This is vouching for using all the resources available rather than just documentation
i think jokers are better documented
Jokers are probably the best documented yeah.
it was hell to make my sticker work properly (especially because I designed it at twice the size of a regular sticker)
so the issue i had was it was twice as big as a regular sticker
id reccommend always having this on hand https://www.lua.org/manual/5.4/
infinitely useful
and i ended up having to hook 3 drawing related functions to get it to render properly
that and the steamodded wiki
The other types of cards aren’t, and adding new card types/seals isn’t easy either.
like i was able to scale it down easily
i would use this one for balatro https://www.lua.org/manual/5.1/
good morning chat
oh huh
isnt that a problem with vanilla rather than steamodded
good to know
Ah, the joys of programming
yea but im venting anyways
i mean documenting vanilla is a whole other project
yea no no
documentation not being there for this was okay
but like i think having more documentation for draw functions could be nice for example
ofc again i totally get why stuff isnt documented but it would be nice
i think flowey is doing lsp for vanilla stuff but idk how far is that yet
chat how hard would it be to make an individually weighted rarity system
im going to try
also N as youre a ui fella i ahve a question for you
shoot
i can make the infoqueue change left to right if theres not enough space in the joker area, but i cant seem to make it give a shit when its in the shop
is there some way i could make it when in shop default at the bottom, but then move left/right like i have it set?
i keep getting this error when trying to dissolve a card
Oops! The game crashed:
[SMODS Perkolator "main.lua"]:56: attempt to index local 'card' (a nil value)
i keep getting this error
SMODS.Joker{
key = 'Perkmentia',
loc_txt = {
name = 'Perkmentia',
text = {
"at the ",
"destroy a random {C:attention}Consumable{}",
"replace it with a random {C:dark_edition}Negative{} Consumable"
}
},
calculate = function (self,card,context)
if context.ending_shop then
local des_con = true
if des_con then
G.E_MANAGER:add_event(Event({
func = function()
local card = pseudorandom_element(G.consumeables.cards, pseudoseed('Perkmentia'))
card:start_dissolve()
end
}))
des_con = false
end
end
end
}
the joker in question
you're not storing anything in the local
Ah, yeah
is it crashing when you don't have any items?
yeah
add a check
its also destroying more items then it should
ending shop is probably called multiple times
why tho
you would need context.main_eval for that one, i think
-# or was it just context.cardarea == G.jokers?
i don't know, i haven't looked at the code. I assume for different cardareas?
i will assume it runs for cardarea G.consumeables too
but also, is des_con necessary?
so im guessing i need it to check if this is the first time the shop end context is closed
nah just check the cardarea, I reckon
i'm forgetting if i have jokers that trigger at that time, lm check what I did, if I did anything
well it destroys both cards then crashes
yah, because it's probably triggering more than twice, and the third time there's no card
my other joker uses the same context but only triggers once
you want to add the nil check regardless
also perhaps it could be worth using a localization file over loc_txt
this isnt an issue obviously
at the
but its nice imo
hmm no I don't check for cardarea
i want to add all of my jokers before i do that
alr
hook align_h_popup and check if the area is the shop probably
i have it so it shows at the bottom when they're in my own card area but you could change it to G.shop_jokers
i recommend doing it sooner than later, im 55 in and now making a localization file is so daunting
i think it might be harder to move everything over but that still works
thanks!
-# JOYOUSSPRING IN THE RESCUE 🗣️
unasked advice, so feel free to ignore it, and that's the wrong way around 😛
you want to set up localization before you have a lot of text
ye fs, i just personally found it a lot easier once i made my localization file so i want to spread the word
i agree
not after, because it's very little effort when it comes to upkeep, and a lot of effort to transfer to one
when i fiish this one i will do that
otherwise you have to move all the text to a file after yea
fs fs
my mod has a lot of text, so i can back up that claim
better to have your joker work before worrying about how the description works
I can't see why it'd trigger multiple times, though, I'm curious. If you add a print statement to that function, what does it show in the logs?
@manic rune :3
:3 hello
What's gonna be better, make my config have submenus with buttons at the top, or have each category be an entire pop-up itself?
it still destroys both cards
managing diferent windows is hard, I'd recommend tabs
odd
tabs it is. and UI is hard regardless 😛
i nver added that null check
-# please add the check
how do
if card then
if card then
card:start_dissolve()
end
replace your singular line card:start_dissolve() with that
So uh... does anyone know UI wizardy to help me this do... stuff..?
Like how do I get it to change idk, variables, call functions, anything I can read later?
cool now it just destroys a consumable and then freezes
you give it a ref_table and ref_value like with the toggle
does socks and buskin affect held in hand stuff
I don't know fuck I am meant to pass.
now i understand why i see return true in everything lol
ref_table = FG.config, ref_value = "special_version"
it should
wait why isn't this shit saving hold on a sec
what is key_append in create_card
ah
where is the read the docs gif
how do i change a sound's time
the play button, I reckon
like, i want to make a sound start at 0:50 instead
what if its already being played though?
like, as the replacement for the boss blind's theme
i have no clue, i haven't touched sound yet. I should only make annoying jokes when I can also actually answer the questions, haha
what does this meannnn
centers are basically all objects. You're calling center.[anything] somewhere, but that center doesn't have anything inside of it
negative ghost rider, make all jokes
SMODS.Joker{
key = 'Perkmentia',
loc_txt = {
name = 'Perkmentia',
text = {
"at the ",
"destroy a random {C:attention}Consumable{}",
"replace it with a random {C:dark_edition}Negative{} Consumable"
}
},
calculate = function (self,card,context)
if context.ending_shop and context.main_eval then
local card = pseudorandom_element(G.consumeables.cards, pseudoseed('Perkmentia'))
if card then
G.E_MANAGER:add_event(Event({
func = function()
card:start_dissolve()
local consumable_types = {'Tarot','Spectral','Planet'}
card = create_card(pseudorandom_element(consumable_types, pseudoseed('Perkmentia')),G.consumeables,nil,nil,nil,nil,'Perkmentia')
card:add_to_deck()
G.consumeables:emplace(card)
return true
end
}))
end
end
end
}
in this case, you're passing things through to a basic function, but you're not passing through correctly
do you have the full error report?
oh i assume you're creating issues by using card as your local variable
never use card as a local inside of a calculate function
ah
because card is already one of the arguments of the func
so this is better?
that's unrelated to this crash, though, btw
SMODS.Joker{
key = 'Perkmentia',
loc_txt = {
name = 'Perkmentia',
text = {
"at the ",
"destroy a random {C:attention}Consumable{}",
"replace it with a random {C:dark_edition}Negative{} Consumable"
}
},
calculate = function (self,card,context)
if context.ending_shop and context.main_eval then
local card = pseudorandom_element(G.consumeables.cards, pseudoseed('Perkmentia'))
if card then
G.E_MANAGER:add_event(Event({
func = function()
card:start_dissolve()
local consumable_types = {'Tarot','Spectral','Planet'}
local consumeable = create_card(pseudorandom_element(consumable_types, pseudoseed('Perkmentia')),G.consumeables,nil,nil,nil,nil,'Perkmentia')
consumeable:add_to_deck()
G.consumeables:emplace(card)
return true
end
}))
end
end
end
}
but I suspect you're having an issue with create_card function
please use SMODS.create_card
N, have you messed around with sliders?
nope
i would if knew how
is there documentaion for this
add_card does the emplacing for you too
It’s basically the same as the vanilla function but it takes a table of values instead of the long line of variables and nils
cool
The main point of it is so you don’t have to do the nils lol
sliders are confounding, just gonna put the idea of a slider as a node on hold, and make a clock indicator for jokers with timers on them
I've been completely forgetting what a stupid language lua is and writing ```lua
for i = 0, #array do
local item = array[i]
end
when array indices start from 1 and not 0 
@red flower hi bestie both bepis and i tried breaking it down for how you hooked and we have no clue how to do so lmfao
sowwe :3
the align thing?
yes
but also, bump:
i think the more precise question here would be: how do i change the time of an already playing sound
i want this sound specifically to skip to a part
you could do the lazy way and just, cut the sound file and treat it as a new sound and then play the cut sound
is this what you need?
local card_align_h_popup = Card.align_h_popup
function Card:align_h_popup()
local ret = card_align_h_popup(self)
local focused_ui = self.children.focused_ui and true or false
if self.area and self.area == G.shop_jokers then -- add a check for your specific card too
ret.offset.x = 0
ret.offset.y = focused_ui and 0.12 or 0.1
ret.type = 'bm'
end
return ret
end
it isnt emplacing
Use add_card
...you know, i actually thought about that too
but surely its not the only way
let me take a gander
Same syntax but it emplaces instead
oops its shop_jokers
I feel so dumb when I make an indicator by just layering two UIs atop each other but at this point I'm sure base Balatro actually just doesn't have a way to put a uit element atop a sprite
now i need art
yall, is this balanced
Gg
what was the localization thing for making the text smaller?
but this is very new to me
Nah you’ve gotta start somewhere
{s:0.5}?
thanks
Doesn’t necessarily have to be 0.5 btw
obviously
I find anything lower than 0.85 too small in descriptions
ye 0.5 is a bit small
true
damn i always use 0.8
eh, i think it could be. deckfixing kinda crazy tho
its a showdown boss blind's passive
i think you should prioritize actually winning the blind instead of fixing your deck
💔
ughh literally every single calculate function i have for my edition isnt triggering at the right time
deck fixing in a boss blind 💔
the boss has 3 phases too, sooooo
destroy too many cards and you wont have any left to win the other phases
:3
im just gonna. comment it all out and start from scratch i think
is there a nice way to make hands not score?
yes there's a new context for that
context.debuff_hand
-# fu-
I see
but say I was making a challenge
wanna see something funny
my goat is washed
that one is for splash effects
wha
was i ever a 🐐 😭
hook calculate_context :3
:3
see this? for some reason the code i have only happens at the same time as my message if i put it in an event
dont even ask me how i figured that out
Does @here in a thread only ping people who follow it?
before the change would show up instantly when the hand was played, and the message showed up after scoring
people who follow it and are online, I believe
only with the event did both happen at the end of scoring
kid named return { func }
So @ everyone in a thread pings the followers
damn
i tried a lot of things
is there a way to store how many times a particular poker hand is played?
all the calculates are run before all the animations so it makes sense
why does having it in an event change anything
because the event gets put in the queue and it's ran after all the other events
ohhh
is ante 1 possible
i think you should add a perishable jimbo
but i quite like the idea of this
With no jokes a high card with 4 aces and a king is 65x1
yes
70x1
thats a four of a kind though
lmao
so it wont score
would it just be like, the hand doesnt score at all, or that every hand counts as high card
btw high card is going to start at a higher level 😭
I figured it would count as high card
oh ok
mmm you should say that in the challenge desc
I just started writing it 😭
I'm still trying to figure out hooking calculate_context for this
hello astra
long time no see
Yo
you COULD just have it start with 2 plutos
also true
or like i said, perishable jimbo
which i think a very temporary bonus is a lot more interesting than two immediate plutos
because then it isnt much of a challenge
just wait until making a splash II drops
you simply must be joking
you must be joker
How so?
You could do a nondetructive patch into the area of game.lua that handles challenge modifiers and add logic for a new one
no i was dumb, i tried return{mult = -5} in blind's context.after
i dont think ur supposed to do that, i changed the context to context.final_scoring_step :3
no example for changing hands in the docs 
although it makes sense, since that's pretty specific
ayo my shit ain't updating.
@red flower UI wizard guy.
😭
what the fuck have i done
wow
yes

oh god
looks normal enough
What in the fresh hell
trying to update FG.config.special_version_value.
balllabalalatrrrorrro
where can i download this it seems like good QoL
ok
then change the ref_value, the problem is that youre putting them in tables
i really hate this stupid ass vanilla bug ass shit
cursed and evil
create_option_cycle{
current_option = FG.config.special_version.selected_n or 1,
options = FG.config.special_version.options,
ref_table = {
FG.config
},
ref_value = {
"special_version_active"
},
w = 4
},
I am so fucking clueless
Shit it has to change: FG.config.special_version_active.
look, basically my hook adds an extra parameter that it checks to see if it should use my modified version
spot the difference
but in the vanilla code, in draw_from, they include an extra parameter which is true
even tho the actual function doesnt have that extra parameter normally
but since i now added it
omfg
does that make sense?
when the guy you are talking to is fucking blind
this is my solution (i added a parameter called meh i dont use at all)
and then the actual parameter
mayball?
either make an issue on their repo or suggest it in their discord

its kind of a bug but not really
you will only encounter this if u hook it the way i did
i cant remember the name 😭
then make it a feature request or PR it yourself
what the fuck are you hooking
99% sure it is RGBA ranging from 0 to 1
did you hook ui box
i just hooked prep_draw
this function has 4 arguments
my hook has a fifth that is a boolean
but the vanilla code in sprite.draw_from includes an extra variable
see
then make it a sixth argument?
i don't think dealing with vanilla jank is an smods issue
fair enough
i think its okay
i know even if smods would address this, its such a minor thing it would be at the bottom of the priority list
oh forgot to answer this
every hand counts as high card
I just need to figure out how to make that work 😭
oh that sounds like a different effect then, you probably need to change the evaluate functions
This whole time I thought I was rendering the 0 atop the ufo sprite, but no, it's underneath it, the beam is just so transparent that it doesn't matter
car
😭 my shit isn't working idk why at this point
yeah I'm pretty sure that's the way
carbs
car. If I get this working, and I end up adding more car jokers, I'll update that clock to be a spedometer
google it and brain:dissolve()
I just don't know how to do it 😭
gaem sdeep
I mean the actual logic, not hooking the function
no, that joker gives 120 chips at the start of the blind, and lowers it by 1/60th every second, so that shows the amount of chips you're gonna get
oh
-# hm
my mod does seem quite unbalanced in terms of scaling compared to you guys'
maybe except joyousspring
bepis
good morning
IT'S MIDNIGHT
:3
my mod might need talisman compat if i dont start balancing it lol
putting this on hold, holy shit it's tanking my frame rate, haha
I'm going to create the anti-talisman
istg i ran ur mod with talisman before 😭
to_small incoming
i did but i never test so idk if theres something broken
probably not
i think its broken with cryptid
true
i love terraria
9999
another question: if there's a way to tell if you're in a challenge
a mod where you have an starting amount of chips and you need to beat ante 8 without going over it in total score
using G.GAME.modifiers
oh yeah
G.GAME.challenge?
This gameplay is ass: session terminated
also true
-# (i do miss my home tho)
I do need to reuse this specific modifier tho
is there a keybind to reload shaders as there is to reload atlases?
you can use debugpkus to watch shader code
How do you guys balance your mods?
playtest your mod
Like yes but how do you know if you're just a god gamer or it's too easy
true!
go on your guts feelings
orrr let others playtest your mod too
true
turns out my mod makes us all god gamers
it's just built different
If i end up buying the same jokers over and over again, too strong, if I never use a joker outside of testing purposes, probably too weak
evaluate_ref = SMODS.PokerHand.evaluate
function SMODS.PokerHand.evaluate(parts, hand)
if G.GAME.modifiers.only_high_card == true then
return { parts._highest }
end
return evaluate_ref(parts, hand)
end
to no one's surprise, this didn't work
although this would just only make the first card score anyway, not actually change the hand type
testing editions on playing cards is so annoying cause cycling through them always cycles past negative which adds a new card to the hand and moves them all
ive been doing a lot of playtesting and balance shifts on my mod in the past week or so, its different for me bc my mod only adds decks and no jokers, but the biggest thing im thinking about for balance is how many different ways a player could strategize a run around the thing that im adding
oh this is the wrong function lmao
I'm making a custom deck, the idea was to expand on Ace in the Hole.
You begin the game with 4 cards of a random rank (same rank on all 4 suits), and after each round you get the mega card pack so you can build out your deck. Optionally, you get a spectral card on boss defeat
The thing is, it's fairly easy to start farming 5 of a kinds or 5 flush. And even when cards are debuffed, you can generally power through it with a high enough base level
I was thinking a few things:
1.- Increase the required chips, like with the plasma deck
2.- Make it so your hand doesn't score if there's more than 2 debuffed cards
3.- Decreasing base chip and mult for all hands?
4.- Just plain disable 5 of a kind-related hands or make it turn your money to 0 if used (in case of emergency?) and only be usable with >1 $?
ooh ok ok
OH SHIT HOW ARE YOU MANAGING DECKS? The docs say it's deprecated so I'm a bit worried I'm doing it wrong
im using the deprecated trigger effect thing for some stuff and its working fine
deprecated doesnt mean it doesnt work. it just means theres a newer, better thing that can be used to the same effect in most scenarios, and thats what the devs are gonna support more instead of the old method
yah I know, but I didn't see any alternatives. Granted, I was making the mod on breaks at work and then at 1 am so I might have just missed something
oh yea i havent had enough time to invest into this to learn how to do things properly either
n i c e
ive realized this is moving the entirety of the text, not just specifically the info queue im trying to move
ur deck idea is similar in concept to one of mine but with completely different implementation
how many decks do you have? What are the rulesets on yours? I'm interested, I haven't seen (nor looked for, if I'm being fully honest) much deck mos
interesting!
ohhh i get it now
thats a bit harder, I have to look up how to do it for my mod too lol
ah gotcha gotcha, i was fuckin with it since you sent it to me, and i ws like "this is not working' and then set a huge value and saw it mvoes all text lmfao
cause i was expecting solely the info queue to move tot he bottom
it works
Nice, I'mma take a look, maybe playing with ante progress might be good as well
thats something i did too
if ur starting people off with a free 4 of a kind anyway u definitely want to lean into 5 of a kind strategies instead of lean out of them
nvm I'm clueless
My main "goal" was to have a "unique" deck in the sense that you get to build it out. But beggining with a free 4 of a kind does make the "optimal" solution to just go for 5 flushes or 5 of a kinds and I feel like it's defeating the purpose
But I didn't see a way of being able to trigger the card packs before the first round begins ):
What do you have so far
u could do something like
start with 6 tags that give mega standard packs and 0 cards in deck
It's working, but it's too easy. I'm trying to balance it out
You begin with 4 cards of the same (by default random, but you can pick any in the config screen) rank on all 4 suits. After every shop, you get to open a mega standard pack
forcing the player to skip the first blind but triggering the start of deck building that way
idk how starting with tags would work from a code perspective thats not something ive ever tried to implement
okay now it works
people should plug their mods more actively, because i have no clue what people are working on if they don't tell me 😛 I'm gonna check your decks out Freeze, they seem fun
You should define a calculate function within your back definition
nice
I have no idea what that means, I just modified the code from Ace in the Hole and prayed it worked (I've used Lua like thrice)
i think i've successfully implemented the Parasite edition and its accompanying power card Symbiosis?
Oh
But I am intereted on knowing what it means
ayyy i appreciate it
Send your current back definition
theres good documentation on calculate functions in the smods wiki
I'm on phone so be patient with me wtiting code lol
the calculate function is what is used to make joker logic work. With it being functional for backs, they can basically do whatever jokers can do now, with the same code set up
It's a bit different according to the wiki
h u h
send your code
Where you call SMODS.Back
the SMODS.Back function that has all the stuff for ur deck in it
how do i make it so a button exits you out of the config screen? I'm trying to make a reset config button and i want it to either update the values in real time or for the player to automatically be booted out so the UI has a chance to laod in the new values
local old_apply = Back.apply_to_run
function Back.apply_to_run(self)
old_apply(self)
if self.effect and self.effect.config and self.effect.config.card_rank ~= nil then
setup_all_of_one_deck()
end
end
local Backtrigger_effectref_aces = Back.trigger_effect
function Back.trigger_effect(self, args)
if self.name == "All_of_One" and args.context == "eval" and G.GAME.round then
G.E_MANAGER:add_event(Event({
func = (function()
add_tag(Tag("tag_standard"))
return true
end)
}))
if G.GAME.blind.boss and SMODS.Mods.AllOfOne.config.boss_spectral_loot then
G.E_MANAGER:add_event(Event({
func = (function()
add_tag(Tag("tag_ethereal"))
return true
end)
}))
end
end
return Backtrigger_effectref_aces(self, args)
end
that's everything with Back in it
is there a way to make something happen when a challenge is started? kinda like how decks have an apply function
you're not calling SMODS.Back anywhere there
everything is done in start_run
back to my old nemesis
I just need to level up high card a few times when the run starts
I considered just using an orbital tag but apparently that's not a great idea
Idk my guy
I’d once again suggest patching into the area that challenge modifiers are applied in
why are you hooking the back functions 😭
no smods?
idk man I just started off from another mod 😭
you should read the docs 
Time to start again with SMODS now
it was a 10 minute adventure that's been lasting for the past 2 days I didn't expect to like it so much
It’s be as simple as adding another else if to the chain with the new logic within the block so it’d be pretty nondestructive
thats how i feel too LMAO
chat am i cooking
I see
i havent hyperfixated on something as much as balatro modding in literal years
heres a deck example https://github.com/Steamodded/examples/blob/master/Mods/LabyrinthDeck.lua
https://github.com/Steamodded/examples/blob/master/Mods/DeckOf4s.lua
first wordle, now math? balatro is becoming puzzle game confirmed
LETS GO GAMBLING!!! (trying to unlock my new card """naturally""")
but the level_up_hand function doesn't make the hand name show up + keeps the level and flames up
me just tryingt to adding difficulty to the game:
i made my own to fix that

Just copy what space joker does for example
space joker just returns level_up = true 😭
believe me, I try to solve problems on my own first
My bad I meant a planet card being used
oh nice
thank you n
it is believed that over time, every creature will evolve into a crab. Similarly, every balatro mod will slowly optimize to become JoyousSpring
I will but I should really be working right now and even though developing is my job I do have a deadline today so I will now silence this siren call before I get fired
i mean i just copied what planet cards do
cardcinisation
same!!
my mod is halfway to becoming joyousspring but for hsr 💔
damn i forgot to change the atlas pos so i didnt get a cool texture reveal
true 😔
has John Aure Smods made any progress with the animated cards recently, i am very eager to add my glitch card
this chat is a beautiful mixture of students that should be studying, and employees secretly developing balatro mods on their boss's dime haha
real
so true
holy shit something like this was exactly what i was looking for
i am graduating in 2 weeks and have 2 massive projects due in a few days
but balatro comes first
for what
can we make a big billboard advertising JoyousSpring in honor of his contributions
leveling up hands
congrats on graduating from idk vtubing I guess
i was just about to put up a question here
if you're doing it inside calculate then use { level_up = true }
How do you check if you have a specific joker?
yes pls
I'm working on a balatro mod in the off-time of my job, generally, but I think judging by some of the things I'm working on, you'd guess I'm 13 🙂
no, no 13 would be watching that many movies
this is...beautiful
I'd you're 13 if I were rating how cool you are out of 10
Windowkill fan spotted. You. should I add the windowkill bosses as blinds and the characters as jokers.
paperback has this, gimme a second
🪟 🔫
hit game by torcado
im killing the window
what's torcado
Wait...... You're right
twinstick shooter, shoot the edge of the window and it expands
you can check for their key by accessing it through config.center.key, and comparing it with the joker's key
chat
what the fuck?
Lamda Calculus
This parody song is actually called "Numbers" like Drowning Pool's "Bodies" but no one calls it that. They just call it "I can only count to four" by Psychostick. I'm sure people called Bodies "Let the bodies hit the floor" all the time. JJJreact #psychostick #songparody
Listen to Psychostick:
Spotify: https://open.spotify.com/artist/2kfVqdz3lJ...
lamda calculus in aikos shenanigans would actually go hard af
if next(SMODS.find_card("j_yourprefix_yourjoker")) then
-- thing u want the code to do if the player has a specific joker
end
mathlatro
so just balatro
whats stopping you from just doing 930
nothing
yea
you will just lose for free
why
if you are not within a threshold of the value
do number cards not count together
you will lose
OHHH
Oh that's easier than a loop
I'll try it
ah fuck, I didn't index the database numbers for the joker art I made
im thinking within 1%
1% too difficult for earlier antes, too easy for later antes?
could make it dynamic
within 10
ayyyyy
symbiosis card is real
not sure how i feel about the small icon and big image being the same but i can change it later
i love how we have
CHAOS
IMMORTALITY
UMBRAKINESIS
and the most powerful esoteric aspect of reality
S I Z E
wait is level_up_hand recursive?
wdym
i couldn't come up with a cool name for size
lol
ive been there
it calls itself within the function?
level_up_hand is the base game function, JoyousSpring.level_up_hand is my function
ahhh gotcha
if anyone can come up with a cool name for the "size" power id be happy to hear it
shapeshifting doesnt seem accurate enough
lol
what does it do
makes the card Big
Gigantism
(takes 2 slots, doubled values)
e x p a n d
both good names
LMAO EASIEST GAME EVER
Even Grandma's love would would very well lol but i think its too big
since you get "fatter" at your grandma's
Dimension?
that seems like cheating
is this the same ren that invented asbestos
fluttershy?
aiko adding Minecraft command cards to Balatro
yes
debuffing flush five hands with this one
my parnter wanted to change mathcing pfps so we changed matching pfps
oh god power
we have a confession, get them
add tetration. do it you coward.
cute :3
*gets ren
the challenge now works as expected
Idk much about the Muppets but people make good funny Muppet parodies
is this homestuck
get them in here
they give between -5 and +35 mult whenever a Diamond triggers
I like that the Muppets are canon to SCP
why is that their effect
tax evasion
lmao
Jumbo
omg Jumbo
I also like SCP-4481: A Casualty of the Single Worst Astronautical Disaster In History
Jumbo Jimbo
and unrelated to SCP, there's the Muppet Cypher and the video where Grover goes on a quest to kill god
I've rewatched all theatrical muppet movies over the last year, Victin, they're generally all good, give them a watch
Im trying to upgrade a poker hand every 8th time it is played
here is my calculate function
calculate = function(self, card, context)
if context.after and context.cardarea == G.play then
local hand_type = context.poker_hand
if hand_type and card.ability.extra.played_hands[hand_type] ~= nil then
card.ability.extra.played_hands[hand_type] = card.ability.extra.played_hands[hand_type] + 1
if card.ability.extra.played_hands[hand_type] % card.ability.extra.hands == 0 then
return {
level_up = true,
message = localize('k_level_up_ex')
}
end
end
end
end
this is my config:
config = {
extra = {
hands = 8,
played_hands = {
high_card = 0,
pair = 0,
two_pair = 0,
three_of_a_kind = 0,
straight = 0,
flush = 0,
full_house = 0,
four_of_a_kind = 0,
straight_flush = 0,
royal_flush = 0,
five_of_a_kind = 0,
flush_house = 0,
flush_five = 0
}
}
},
what am i doing incorrectly
hands store the number of times they've been played already, so you don't need to store it in the joker
oh thank god
usually level ups are calculated in context.before
have you watched the movie where Kermit kills n*z*s
context.scoring_name instead of poker_hand
not a week goes by where "we're doing a sequel" doesn't pop into my head at some point
what if the hand is played for the 8th time during a turn, i would have to update it after correct?
I think I watched the movie with Walter and that's about it
its so damn catchy
pretty sure the played hands counter increases the moment you press Play Hand
i see okay perfect then
also the names of the hands are written like "High Card" not "high_card"
ahh gotcha
as it turns out i dont have to store them altogether so shouldnt be an issue
how do i access this variable?
lm check
however Supernova does
https://github.com/icyethics/Kino/blob/main/items/Jokers/beetlejuice_1988.lua this joker checks for every 3rd hand instead of the 8th, but otherwise should work basically like yours
when is Aiko adding Cookie Monster https://youtu.be/lYIRO97dhII?si=pFblohfsu10Kcl8C
Kermit and Joey are singing the alphabet when Joey sneaks in an extra letter that sounds a lot like Cookie Monster.
--
If you're watching videos with your preschooler and would like to do so in a safe, child-friendly environment, please join us at http://www.sesamestreet.org
Sesame Street is a production of Sesame Workshop, a nonprofit educa...
wow thank you so much
thats perfect
c is for cookie thats good enough for me
n am i cooking
ccc ccc cccc ccccc cccc?
the goal is to have every potential joker idea in kino so that if someone asks 'how do I do this?' I can just send them a random joker
ok now ive finished symbiosis i really should work on adding some jokers, the whole reason i've held the mod's release back... however.. i can't just leave the power cards on 7, that's not nicely divisible into rows...
implement everything known to man in balatro
"how to make a joker play doom in balatro"
actually
hello I'm new to balatro modding how do I make a joker that pays for my mortgage
can we have 0/0 creating a black hole spectral card please :3
this reminds me of some educational math NES games i played recently
it would be funny if 0/0 was a instant lose imo
with a crash effect like cryptid
you'd wanna steal the jojo's mod implementation for the joker that makes you play donkey kong, ofc
you get black hole enhancement from rendoms final offer
so u have to make sure ur expression doesnt evaluate to 0/0
I like that the 9s have a bar under them so that if I add an effect that rotates cards people will know what number it is
told you it was my hater arc
they won't be able to tell L and I apart though
i need to add an upside down card edition
this is a thing???????
it would fit perfectly with Big
@chrome widget
shove their soul into an arcade cabinet
lemon demon reference????? or smth i dont actually listen to him
ah they've already shared the updated version
Correct yes I've done this
ren has been punished for their asbestos crimes
finally we can rest in peace knowing their soul is imprisoned inside an arcade cabinet
what's the difference between that and eternal?
Get trapped inside Cabinet Man woosh
calculate = function(self, card, context)
if context.before and context.cardarea == G.play then
local hand_type = context.scoring_name
if G.GAME.hands[context.scoring_name].played % card.ability.extra.hands then
return {
level_up = true,
message = localize('k_level_up_ex')
}
end
end
end
now this should work?
i suppose i dont need the variable anymore
yeah. I don't think you even need to store the hand_type local
if it doesn't work, lmk, I'm probably not reading it thoroughly haha
awesome thank you so much! let me test it out now
how have you punished me exactly
i am still fine
soul in arcade cabinet
you dont need to own an arcade cabinet
i sold my soul to get good at programming. i think i got scammed
one will be provided
Regardless, running doom depends particularly on whether or not someone's already implemented a DOS game emulator in Lua, since I'm not really up to writing one myself
no a soul dummy
nice to table you
┬─┬ノ( º _ ºノ)
hello dilly
hi vic
why's your pfp freaking out
Hi dilly!!
get unflipped
mine?
hii dilly of dilatro fame
yes
i feel so popular rn
doesnt work, i updated function to 2 hands for testing purposes
idk my pfp vibin
@rugged pier do you want to level up a hand?
yes
you can return {level_up = true}
does the message trigger?
eeeeeeeeeeee5
and SMODS automatically levels up the hand
calculate = function(self, card, context)
if context.before and context.cardarea == G.play then
if G.GAME.hands[context.scoring_name].played % card.ability.extra.hands then
return {
level_up = true,
message = localize('k_level_up_ex')
}
end
end
end
``` this is my implementation
nope
go 2 schleep bepis
You don’t need the area check
gngn
oh, wait perhaps try without the message
what do you guys think of the idea of a joker that destroys the highest card of any played straight and reduces the blind by 10%? totally not a hamilton reference i am totally not a hamilton fan trust me guys
good night bepsis
oh?
gn victin :D
okay let me try
And context.before is only called once per joker iirc
why would i remove message, isnt this how space joker has it
oh god yeah, cardarea, i'm clearly tired enough to no longer focus haha
yeah, no you're right, haha, I'm confusing things!
no worries, i apprecitate your help :)
okay testing now
You don’t need the message
i dont?
i see
I haven’t been actively working on mods for a few weeks so my memory is bit hazy
But generally, and “default” messages are auto applied for you
SMODS does handle things a lot differently from vanilla at this point, so looking at the source code is handy, but it might not give you the correct answer
lets goo
gotcha
Levelling up might be one that doesn’t though, I don’t remember
Look at my awful ampersand son. He has every disease
does he have homesick
okay i found a new problem with my implementation, i need to upgrade poker hand every 8th time but should only start counting from when the joker is owned
any ideas?
You need to store them as you originally were planning
It is time consuming, but you could go through all the smod toml files and replace stuff in the source code
But you can have the table be dynamically created
how so
there has to be a better way
Okay it's not that bad but I still hate it y'know
you can use the string as a key, so your table doesn't have to be populated when you make it. Setting a table as so hands = {} will allow you to do card.ability.extra.hands[context.scoring_name] = card.ability.extra.hands[context.scoring_name] and card.ability.extra.hands[context.scoring_name] + 1 or 1 or maybe even a more efficient notation
table[context.scoring_name] = (table[context.scoring_name] or 0) + 1
this is super useful, thank you
how do i make the game error on purpose
beautiful
i love this community
will report back
real af
are my shenanigans going to far?
it seems super interesting
It should do some awesome full-screen shader and THEN crash
i like it
lowkey it would be cool to do something like cryptids crash code card
normally i dont like when mods feel like a completely different game from the base game but this is such a cool concept that i love it anyway
i am not forcing this deck upon anyone
i am, everyone go play it or else
i added ur mod to my game with like 12 other mods and hit a boss blind that was a word puzzle on a deck that wasnt the letter deck and i couldnt beat it
lol
did you buy them vouchers
i wish i remembered better how it happened
wait what
math deck
???
did i say i was joking?
i have neither of the vouchers ur mod adds discovered @tall wharf
so i assume i didnt buy them
config = {
extra = {
hands = 8,
played_hands = {}
}
},
loc_vars = function(self, info_queue, card)
return {
vars = {
card.ability.extra.hands,
}
}
end,
calculate = function(self, card, context)
if context.before then
card.ability.played_hands[context.scoring_name] = (card.ability.played_hands[context.scoring_name] or 0) + 1
if card.ability.played_hands[context.scoring_name] % card.ability.extra.hands == 0 then
return {
level_up = true,
}
end
end
end
implementing this caused my main file to stop recognizing my joker file 😭
@hushed field @wintry solar
card.ability.played_hands[context.scoring_name]d <--- d
oh my god
I think you actually need the message here too 😅
Level up seems to not auto add the message
Woooooo dragona joestar my transfem queen!!!!!!!
that fixed it, thank you!
ah gotcha
let me try
broke the game upon playing a high card
card.ability.extra.played_hands
this is the current implementation
You probably need to respawn the card too
hm? wdym
doesnt my implementation dynamically populate that table
there's no table in ability, it's in ability.extra
oh shoot
yes
it works now, thank you!
time to break everything by implementing a new rarity system
anyone know how to do the titlescreen thing where you replace the cards
you need to modify G.title_top
how do
How can you check for something's suit without using the is_suit() function?
self.base.suit?
yes
i would look at how other mods do it like cryptid or aikoyori's one
i mean... is_suit is the only right way because it accounts for stone cards and stuff
you probably should stick to it
at least try to stick to it
If you call is_suit() within a check_enhancements context, the game crashes due to infinite loop, because the modded is_suit checks for quantum wild cards
I suppose I could literally disable quantum enhancements and turn it back on lmao
the hackiness of quantum enhancements is why I've opted out of using them, honestly
oh and yeah guys, has anybody ever encountered this issue? (the card stuff appears on top of stone cards)
it works :)))
it's because when stone cards have their enhancement removed by vampire, they will start showing their rank. However, animation wise, their center hasn't changed. I'm sad to say I don't know the exact solve for this
so is this just in vanilla balatro
i haven't played without smods installed in a long while, I'd have to check
oh yeah that is not caused by my joker. thank you for the help you saved me a lot of sanity
you should add this in loc_vars, no?
Nope, localization files exists
oh yeah i forgor
yea, but its a custom sticker so idk how info_queue is gonna work with that
i mean it worked before and i lost half my project including localization
descriptions.Other["sticker_key"] = { name = "Sticker", text = { "My sticker" } }
so i assume i fucked something up now
oops
Show me how yiu init sticker
you want the whole code?
you key for sticker should be <mod_prefix>_<sticker_key>
lmao wtf
yes
i mean
heres whats weird
is it clearly is correct since the misc label shows up
only the popout description is an error
wtf.....
well...
\
where would i pass it to?
At least you should try
worth a. shot
This works in my mod at least
really?
So I stopped a glass card from being destroyed..... how would I put it back into the discard
Its just stuck in the middle of the screen
I'm not surprised
me neither
how do i call localisations out of a localisation file
i had to remake my localizations
you dont
G.localization is current localization used
you just need to make a loc_vars
So G.localization.descriptions.Other.tagger.name
if u need to get it do that
or use localize
