#💻・modding-dev
1 messages · Page 578 of 1
SMODS.current_mod.optional_features = function()
return {
retrigger_joker = true,
}
end
kty
ha funny
after my patches it sets the number to value at G.GAME.SSS or to 10 if that one is nil
[manifest]
version = "0.1.0"
priority = 0
[[patches]]
[patches.pattern]
target = 'functions/UI_definitions.lua'
pattern = '''
function create_UIBox_blind_select()
'''
position = "after"
payload = '''
local boss_reroll_cost = G.GAME.SSS or 10
'''
match_indent = true
[[patches]]
[patches.pattern]
target = 'functions/UI_definitions.lua'
pattern = '''
UIBox_button({label = {localize('b_reroll_boss'), localize('$')..'10'}, button = "reroll_boss", func = 'reroll_boss_button'}) or nil
'''
position = "at"
payload = '''
UIBox_button({label = {localize('b_reroll_boss'), localize('$')..tostring(boss_reroll_cost)}, button = "reroll_boss", func = 'reroll_boss_button'}) or nil
'''
match_indent = true
So what does all this do exactly?
The first patch finds the line
function create_UIBox_blind_select()
as marked by the pattern (to search for)
position tells it to add the payload (new line) after the found line
The new line gets added there and it's indent is matched to the surrounding code thanks to match_indent = true
set the uibox for boss rerolling to display a variable instead of the passive 10 string
The second one patch finds the line specified in pattern, position tells it to replace the line with the payload
What does remove_from_deck do?
basically
It is called when the card is destroyed or sold.
after setting up this patch you can modify G.GAME.SSS to change the display
the variable is specified as local in the first patch
its only ui tho doesn't actually change the function
-# i'd recommend changing the variable name to something normal
he already has the logic
as far as i know
oh mb
So this would do what?
G.GAME.discount_percent = 0
for _, v in pairs(G.I.CARD) do
if v.set_cost then v:set_cost() end
end
end```
It would make everything normal cost when the card is destroyed or sold.
Got it, thank you
doesnt lua convert numbers to strings by itself
wanted to make sure
Perfect, I'll slap all that into a file for patching later on.
fair
better safe than sorry
eval G.GAME.SSS = "my buthoel"
Why won't is summon the hanging chad army Lua if context.setting_blind then for i = 1, 10 do local new_card = create_card('Hanging Chad', G.Jokers, nil,nil,nil,nil, 'J_joker') new_card:add_to_deck() G.jokers:emplace(new_card) end end end
And all I need to do is change the G.GAME.SSS variable with logic?
i think it's supposed to be j_hanging_chad
Oh definitely.
yeah
it worked if I did Joker which just spawns a jimbo army
SMODS.add_card({key = 'j_hanging_chad'})
it'll update when you first render the blind select after each shop btw
ok
my first ever lovely patch 🥹
awesome
bump
on another note
🐱
itd better make an obnoxious miau sound every time it scores
is there a good video online on how to make a config tab in steammodded
wait
waiting
steamodded wiki
actually vr wiki
:clueless:
better to just copy someone else's
you need to add a bracket for the node after Jokebox.create_uibox_button
bruh
and replace whatever is necessary
I read it and I don't understand it which is why i'm searching for a video
there are no videos on modding balatro
tutorial hell mindset
just to save you time
there is one
singular
That One Guy made That One Video but it's super outdated now
old and not relevant
NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
even if videos starting coming out, UI stuff would be at the bottom of the priority list probably
can somebody tell me what I'm doing wrong? it just gives spectral cards constantly
you could totally write copyable config code in there though
you're missing a context check
and just have people copy paste it
https://github.com/nh6574/JokerDisplay/blob/main/src/config_tab.lua here's JokerDisplay's config tab
when do you want the joker to trigger
that's kinda what i was planning with vremade but haven't gotten around to it :3
oh shit
I'm going to make an API mod to make config tabs easier :clueless:
that wouldnt require an API mod tbh
yes ik
i added tabs to my config and i had to do something stupid to recalculate it
why does this not work?
card.name doesn't exist.
wait are you making the "same" joker as me
fuck
Also remove and context.retrigger_joker
is there an alternative
yeah basically but recalculating the whole overlay makes it break for a second and looks ugly
no it doesn't?
ohhh
I recalulate my UI in curator right after it spawns and it works fine
i recalculate other UIs and it looks fine yes
you might need to recalculate the config tab, then the overlay
just realized the implementation is bad
is there a way to get a joker's english localized name
one
three
five
seven
eight
nine
ten
queen
ace
holy shit
yeah but i didnt wanna get the config tab
just use the key
the key won't work
localize({type = 'name_text', key = key, set = 'Joker'})
me when jokers are technically cards
it could find the letter G inside the mod prefix the joker comes from
isnt this the jokers localized name in whatever language you're playing in
yes
i guess 90% of people use english anyways
yes but you dont have to play balatro in english
thats not going to cause problems
what do i set as name_text
'name_text'
just that?
Yes.
is there a way to just go down each joker instead of doing this ```Lua
return {
["setting_1"] = {
["option_1"] = 'joker',
["option_2"] = 'greedy joker',
["option_3"] = 'lusty joker'
["option_4"] = 'wrathful joker',
["option_5"] = 'gluttonous joker',
["option_6"] = 'jolly joker',
["option_7"] = 'zany joker',
}
}```
It's context.other_card
local config = {setting_1 = {}}
local option = 0
for k, v in pairs(G.P_CENTERS) do
if v.set == "Joker" then
option = option + 1
config.setting_1.['option_'..option] = v.key
end
end
return config
Code?
jokertotrigger.config.center_key
It's card.config.center.key
what type of node is the one where you choose left or right and it will switch between options?
is there a way to change which boss you're against during a boss blind
I really want to mod Balatro (make my own mod), as in I want to make my own Jokers, decks, and other stuff for Balatro. How do I do that?
as someome who started yesterday do you know the basics asin what lua is?
how would I make the slider node work. Lua SMODS.current_mod.config_tab = function() return {n = G.UIT.ROOT, config = { -- config values here, see 'Building a UI' page }, nodes = { {n = G.UIT.S, config = {align = "cm", padding = 0.1}, nodes = { {n = G.UIT.S, config = {text = "Hello, world!", colour = G.C.UI.TEXT_LIGHT, scale = 0.5}} }} }} end
No one knows. Use create_slider instead
nope
well first of you need an IDE
how does that work?
i personally use VS code and i havent been having any issues with it so far
should I do n = create_slider()
what ide should i use (and i want a free one because i'm a cheapskate)
haha i feel you, as far as iam aware vs code works just fine
I mean, what LSP should I use
whats an LSP lol
everything is in that link
it doesn't specify an lsp that i should use (or maybe i wasn't reading it correctly)
Language Server Protocol
basically autocomplete
+error detection ig
oh i dont use any lol
?
i boot up the game and if it doesnt work it doesnt work
dam i really wasn't paying attention sorry
with lsp errors still happen
maybe i should also get on that lol
you can't tell me this isn't nice
true i just kinda forgot about it lmao
random :)
im debating between these two abilities, and i want some thoughts:
Spawn between 1 and 5 Negative Jokers
Randomize the values of a selected card, joker or consumable.
Just type definition is not enough. Usage of things can be very... unintuitive
pseudorandom moment
im making a consumable pack all about lua keywords :)
lua 😨
for
local fans when var comes in
for will probably be:
Gives you an extra life.
for i = 1, #1# do
#1# is how many lives you have
let appeared.
[NO VARIABLE DEFINITION] stands menacingly.
ERROR in action number 1
of Step Event0 for object obj_fuck_everyone:
Variable obj_fuck_everyone.fuck_everyone(104147, -2147483648) not set before reading it.
at gml_Object_fuck_everyone_Step_0 (line 1) - fuck_everyone()
that would be option cycle
use a create_option_cycle funtion
should I keep this ```Lua
local config = {setting_1 = {}}
local option = 0
for k, v in pairs(G.P_CENTERS) do
if v.set == "Joker" then
option = option + 1
config.setting_1['option_'..option] = v.key
end
end
local current_option_index = 1
local function get_current_option()
local keys = {}
for k, v in pairs(config.setting_1) do table.insert(keys, v) end
return keys[current_option_index]
end
how can i prevent a played hand from being scored in a blind
in the psychic kind of way that it just says not allowed
return {
n = G.UIT.ROOT,
config = {align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.05},
nodes = {
{n = G.UIT.R, config = {align = "cm", padding = 0.1}, nodes = {
{n = G.UIT.T, config = {text = "Joker Selector", scale = 0.7, colour = G.C.UI.TEXT_LIGHT}}
}},
{n = G.UIT.R, config = {align = "cm", padding = 0.1}, nodes = {
{n = G.UIT.C, config = {button = "joker_left", padding = 0.05}, nodes = {
{n = G.UIT.T, config = {text = "<", scale = 0.7, colour = G.C.UI.TEXT_LIGHT}}
}},
{n = G.UIT.C, config = {align = "cm", padding = 0.05}, nodes = {
{n = G.UIT.T, config = {ref_table = config.setting_1, ref_value = get_current_option(), scale = 0.7, colour = G.C.UI.TEXT_LIGHT}}
}},
{n = G.UIT.C, config = {button = "joker_right", padding = 0.05}, nodes = {
{n = G.UIT.T, config = {text = ">", scale = 0.7, colour = G.C.UI.TEXT_LIGHT}}
}}
}}
}
}
end
local keys = {}
for k, v in pairs(config.setting_1) do table.insert(keys, v) end
current_option_index = current_option_index - 1
if current_option_index < 1 then current_option_index = #keys end
local text_node = e.parent.nodes[2].nodes[1].nodes[1]
text_node.config.ref_value = keys[current_option_index]
e.parent.UIBox:recalculate()
end
G.FUNCS.joker_right = function(e)
local keys = {}
for k, v in pairs(config.setting_1) do table.insert(keys, v) end
current_option_index = current_option_index + 1
if current_option_index > #keys then current_option_index = 1 end
local text_node = e.parent.nodes[2].nodes[1].nodes[1]
text_node.config.ref_value = keys[current_option_index]
e.parent.UIBox:recalculate()
end```
if context.debuff_hand then return {debuff = true} end
oh ok ty
That's the create option cycle function
There's a list of functions like this in the UI guide
how can i set the blind's current score
I read it and don't understand any of it
why are you making a custom ui tab if you dont understand any of it
its like. really easy to just make a simple config for your purposes
how can i code in lua i dont understand if statements
i was cracking a joke
oh
anyways jokes aside the documentation is already there
people are just gonna tell you the same thing as in the documentation if not worse in here
i guess
and it's not their fault most of the time
G.GAME.chips = number
how do I check if a joker is perishable and/or rental
just like SMODS:is_eternal() but SMODS:is_rental() does not exist
I check if it returns nil I suppose?
wdym
just check if card.ability["eternal"] is true
and rental and whatever sticker you want
It can only be nil or true so just doing if card.ability.rental then is enough yea 👍
No, it could be a table.
What
what
what
quantum stickers 😭
That's not SMODS rental code
Yes, it's in SMODS.Sticker
Not sure why you'd set rental/perish to a table
is it possible to do a while loop for the entire duration of a blind
because i did this and it just froze the game
Yes, but if it was taken ownership of and gave it a config it would be a table.
Why would anyone do that? 😭
You never set blind.executing to false or nil
mweheheheheheh
changed it up a bit, but now it executes only once
No, hook Game:update
No, outside the blind.
is there any way to do variable colours inside a uibox
I tried colours = G.C.BLUE and <condition> or G.C.RED and it crashed when opening the UI with "attempt to index colours (a boolean value)" so that didnt work
I tried colours = function() where the function checks the condition and returns G.C.BLUE or G.C.RED and that crashed when opening the UI with "attempt to compare number with nil" even though my print statements said all the checks passed perfectly fine
smthing like this? im doing it in a separate lua file
remember to load the separate lua file if you havent already
good
Yes.
smthing like this?
No, it would be if G.GAME and G.GAME.blind and G.GAME.blind.config.blind.key == 'bl_modprefix_key' and not G.GAME.blind.disabled and dt >= 0.5
local ret = gamehook(self, dt)
just curios hwo do i make a joker scaling like runner but with a different hand?
search for "Runner"
Code?
np
No, it's and dt >= 0.5
is there something that must have it to be like that?
no wait
deltatime can be larger than requested
i forgot
still crashes tho
and same error
btw is this formatting still accurate because the jokers i have already made are formatted very differently
wdym by formatting
what formatting
idk if formatting is the right word but like the order of the lines
the order in which you put the joker parameters doesnt matter
oh ok
than that answers my question thx
also vanillaremade is usually kept updated quite well so most things should be accurate
vanilla remade is peak ngl
still, anyone know the solution to this hook crashing the game?
okay so i think everything on this works as planned
the only issue i have now is that i dont know how to display it currently
like what chips mult and Xmult it has currently
What's at line 6 of hooks.lua and line 176 of blinds.lua on your mod
so, to make the display work
you have to place
oh
yeah the effect works (except for Xmult but ill get to that) it just doesnt display it
thats like the point of the function
do you have your loc_vars set up correctly
you need to return a table that has the values you want
and then in the description
put #(index)#
and the game
this is what loc_vars looks like rn
will replace it automatically
put #1# in the description and it would become the chips
Why do you have so many similar values
chips and mult work just fine from my testing
wdym?
in your description, you can use #1# for the first returned value, #2# for the second, #3# for the third, etc
Chips, chip_mod, mult, mult_mod, etc
Are those all set
i assume its the scaling and total for all the values
Making sure it's intentional cos idk how complex the card it is
so like " currently #1# chips #2# mult #3# Xmult"
uh
every highcard
the card gains +2 chips +1 mult and X1,1 mult
no wait
X0,1 mutl
#1#, #3# and #5# because thats their position in the loc_vars return
also currently it goes on any hand that contains high card
i think another issue im gonna have is that
not every hand that is high card
yeah
And you'd use 2, 4, and 6 to show the scaling amounts
you would have to replace next(context.poker_hands['High Card']) with context.scoring_name == 'High Card'
scoring_name being the key of the played hand
Small thing but did you mispell MULT as MULR for the colour
Also this indentation is a little messy, doesn't break anything but fixing it makes code easier to read
whats indentation exactly?
maybe ive heard it but im learning programming in my native langauge
its like where the lines start
so sometimes i dont know the exact term
ohh yeah
The spaces before the lines
you can do right click -> format document
and then it does automatic indentation
or alt shift F, that also works
Did not know that but that makes sense
actual life saver of a command
okay so now the issue is why doesnt Xmult work
display and everything else works
this is all the return things
there are functions related to scaling now right
maybe the issue is just that the xmult is going before
If so those should probably be added
no no i just made a typo i think
okay so changing this made the entire thing stop scaling
if context.before and not context.blueprint and context.scoring_name['High Card'] then
its currently like this
context.scoring_name == "High Card"
if context.before and not context.blueprint and context.scoring_name == 'High Card' then
like this?
yeah
now it doesnt crash anymore but it doesnt work either
only thing i see is that the key is always nil
huh? theres inflation in this game
for more search balatro inflation
yeah its for the challenge
if you just want to make everything more expensive yeah
wait no I cant cuz I need it to be a multiplier
.
does anyone know the solution?
i figured out this time
what was wrong I had no idea

how to make my joker update it probability when an oops is present like in vanilla?
Look at how cards with probabilities work in VanillaRemade
use variables (displayed in localization as #1#)
what's the way to detect the flame effect ? Tried to use
G.ARGS.chip_flames.real_intensity < 0.000001
but apparently chips_flames is Nil
how can i check when a joker is added
if context.card_added and context.card.ability.set == "Joker"
G.ARGS.score_intensity.flames?
how can I get all owned cards instead of looping through G.jokers.cards and G.consumeables.cards?
No, that's the only way.
bump
ok thanks
How do I return a message, without using return{}?
card_eval_status_text
i think there's another way (people keep correcting me by bringing it up)
you can loop through all cards that exist at all with G.I.CARD which just contains every card that exists, but for specifically owned cards you just have to loop through the specific areas with owned cards
but card_eval_status_text will work
SMODS.calculate_effect({message = localize('k_upgrade_ex')}, card)
so your dont have like a whole bunch of nil, nil, nil, nil shit
Got it
Is there a way to get all card areas with SMODS api?
Can I also change how long a message stays?
thanks !
blind doesnt work + context.after triggers too early
put the code inside context.after into an event and enable blockable = true to make it wait?
I have tried a bunch of other stuff but I can't get my text to update the probability so quick question does dynatext string need to be a table or it could just be a normal string?
like this?
not quite
I am trying to get my joker to update its probability in its description when an oops is present
whats wrong
bump
G.E_MANAGER:add_event(Event({
blockable = true,
blocking = true,
func = function()
---your code goes here
return true
end
}))
use SMODS.get_probability_vars for that in loc_vars
it works now, but the chip number doesnt increase
score req
ok you're missing some extra lines then
add G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
that makes the text update
does this update the text in loc_text automatically?
ohhhh
it will if you do it correctly yeah
ty
ok I will try it out
bump2
no
it changes based on the game speed and hand scoring time
is there a joker in vanilla balatro that empowers if you get a specific other joker?
peaksona 3 guild tag spotted?
ive been wanting to leave that server for ages but they keep complaining about people who join just for the tag (me)
lol
and I would feel like shit leaving it just to go to the p4 one that I didn't know about until now
Hey so, trying to make a boss blind that double whenever the flames effects appear but it doesn't work at all
set_blind = function(self, card)
if G.ARGS.score_intensity.flames >= 0.000001 then
G.GAME.blind.chips = G.GAME.blind.chips * 2
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
end
end```
any idea how i could make it work ? and is there evena way for the score to show itself scalling to it ?
don't do code blocks like this
oh there you go
you figured it out
yeah forgot an extra `
the flame effects appear if the current hand score is above the requirement
anyway I'm asking because I want to make 2 jokers that get enhanced effects If you have the other one
you could check that
if next(SMODS.find_card("joker_key")) then
only returns true if you have the joker
just put the joker's key in joker_key
it'll be j_modprefix_jokerkey
yes
you can
chained down by a Birthday Party
ill forgive you if you play jokebox
How would I return a table of strings through the loc_vars that changes in length depending on the index that got picked?
had to pull out my inner joker for that one
whats jokebox?
a what in the what
oh
what are you trying to do
bumping this just in case..
Canteloupe if it was in Ortolab
it would be at least 20% funnier if it had a fake png background
I have a joker that chooses a random riddle that I want to show in their description. It picks from CSTORM.riddles which has riddles in them in different lengths. For example: { question = { "I have billions of eyes,", "yet I live in darkness.", "I have millions of ears,", "yet only four lobes.", "I have no muscle,", "yet I rule two hemispheres.", "What am I?" }, answer = "Human Brain" }, { question = "What gets wet while drying?", answer = "A Towel" }, How would I make it show the strings in the description every time with the right amount of lines?
I was thinking about doing a for loop but don't know what that would do
I mean you can certainly do that
but it'd be a brute force method that would leave a million blank lines in your joker
Oh
you give me very bad ideas
and I like it
That's why I'm asking here xD
you will like jokebox a lot
well with my new satanic abilities
I'd recommend putting UI boxes inside your joker description
whats UI boxes?
user interface boxes
making menus show up
you can do it inside jokers (blueprint does it with the Compatible box)
i dont think the mango needs that specifically does it?
oh mb twin
you give me another bad idea
that would be funny
and i can get why you wouldnt wanna do them
But what would I do to make the lines show up right?
And scary
in terms of ease of implementation to effectiveness
also you should totally put a persona Reference in ur mod @stiff locust
lol
i say at least five because I'll make more at some point idk
tell me my goat junpei is one🙏 🙏
just make the riddles go over two lines each
and make the lines longer
it'll look kinda ugly with the wider description boxes but it shouldn't be too bad
you can scale down the text if it's too large anyway
Do you have an example code I could analyze for the UI Box in description stuff?
True
do you watch raxdflipnote
From time to time, why?
did you see the one about The Glasses That Expose Your Eyes To The Unmatched Power Of The Sun
Not that I remember
oh
you are definitely better off doing them over 2 lines with the #1# and #2# thingies though
check vanillaremade blueprint for its funny ui box
Got it
@stiff locust have you played persona 2 Innocent sin?
i have only played persona 4 golden and persona 4 arena ultimax
too bad it's dead as all hell
true
but I got a really great idea relating to persona 2
you should play it twin trust
the gameplay really isn't that bad trust (ive wanted to kms at least 20 times)
lol why not?
I do the same thing like 50 times over in 1 session just to get to the 1 fun part
which is a boss
and then teddie steals the spotlight from rise's dungeon like
fuck off
I like persona more for the social link and stories
p4 animation was peak
all my homies hate teddie
p4 golden animation was also peak but lesser so
but if you like good stories persona 2 and 3 are very recommended
i cant sit through another jrpg im sorry
☹️
tbf Ive only played persona games
I'm no expert on the genre in general
OKay i would like to know but how do you check the score of the hand played ?
calculate = function(self, card)
if G.GAME.chips > G.GAME.blind.chips then
G.GAME.blind.chips = G.GAME.blind.chips * 2
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
end
end```
wanted to change so instead if the hand scored is equal to the chips requirement it would double but actually it doubles any time the score is reached lmao
have you read up on how calculate functions work? because this is not it, you're missing context checks
II should give it a read then, i did before but not for blinds directly
I'll txt u when I'm home to play it
if context.final_scoring_step > G.GAME.blind.chips```
tried to use context final scoring but context checks doesn't seem to work in boss blinds
ah oops
all 6s
what are Adjacent Hands
it's a cryptid thing
hands above and below the hand in the run info menu
loop through G.GAME.hands
betmma vouchers has this as a voucher
oh, is that sorted in order?
betmma?
I think so
some mods about game Balatro. Use Steamodded (https://github.com/Steamopollys/Steamodded) to load them. - betmma/my_balatro_mods
betmma's code is kinda
annoying though
but the gravity voucher set does this
lol
just really wanted to like, see how i could check the score of the current played hand, G.Chips doesn't work since it only count the total score
is there a difference between the two
G.GAME.blind.chips (and not G.Chips my bad) is from what i get the total chips you scored in your blind, but what i search is the score just your hand is going to do
theres probably some function for it
because of the scoring parameters stuff
idk what its called though
i see your specific goal is to check if the played hand would have beaten the blind in one shot (i.e. the score catches on fire). there's a dedicated variable for that in latest smods
OH NICE ! at first i was trying to use the fire effect as a check but didn't wroked out, so probbly will use that one instead,
basically if SMODS.last_hand_oneshot is true then the condition you're looking for is true
whats the code for the food self destruct animation again? for some reason vanillaremade changed it to the generic SMODS.destroy_cards dissolve animation so i cant use that anymore
calculate = function(self, card)
if SMODS.last_hand_oneshot then
G.GAME.blind.chips = G.GAME.blind.chips * 2
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
end
end```
i think this should work in that case
isn't that a whole G.Event or something ?
well you still need a context check, it should be if context.after and SMODS.last_hand_oneshot i think
you can go and look at past versions of the file, github is very helpful in that regard
ah alright thanks, though idk if it works cuz apparently context wasn't working the boss blind somehow ? i'll try it though
context should work normally in boss blinds, your issue was because you were using it wrong
just search the vanilla files lol
i'll share the full code hold on
Question regarding SMODS.DeckSkin
Is it possible to have it so it uses two atlases and have each replace specific cards for the deckskin?
Like for a deckskin which replaces the joker, king, and queen but instead of using the default deckskin it uses a custom one?
i know what your issue is already
your calculate doesn't have context in the brackets
for the function arguments
SMODS.Blind {
name = "boss_strong_eye",
key = "boss_strongeyes",
--atlas = "pseudoblinds",
mult = 1,
pos = { y = 0 },
dollars = 5,
loc_txt = {
name = 'Strong Eyes',
text = {
'Chips requirement double if your hand score the requirement or more',
},
},
boss = { min = 1, max = 2 },
boss_colour = HEX('521844'),
calculate = function(self, card)
if context.after and SMODS.last_hand_oneshot then
G.GAME.blind.chips = G.GAME.blind.chips * 2
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
end
end
}```
what's the cardarea for cards in the shop?
why is miles edgeworth there
that's me
thanks it works now !
your smods documentation is
o u t d a t e d
presents vanillaremade like a boss
ngl the vanilla remade is probably the most handy thing for mod effects
-# I know that damn well since i rely on this a shit ton to code some of my jokers
Summoning Circle demo
it don't matter how many times i make these true they're always false
How would I save a create_option_cycle
they come true in files im asserting (i made those true for test but they are false!)
isn't it math.random(1,100)
thats the same
yeah
...
can be relatable to game's save mechanic?
How do I make a new line in this? Right now it shows them next to each other
{
n = G.UIT.C,
config = { align = "bm", minh = 0.4 },
nodes = {
{
n = G.UIT.C,
config = { ref_table = card, align = "m", colour = G.C.GREY, r = 0.05, padding = 0.06 },
nodes = {
{ n = G.UIT.T, config = { text = ' ' .. (Riddle or localize('chipstorm_none')) .. ' ', colour = G.C.UI.TEXT_LIGHT, scale = 0.32 * 0.8 } },
{ n = G.UIT.T, config = { text = ' ' .. (Riddle or localize('chipstorm_none')) .. ' ', colour = G.C.UI.TEXT_LIGHT, scale = 0.32 * 0.8 } },
}
}
}
}
}```
-# I hate UI, too scary
relatable
you can try \n
Where?
try it in the quotes here { n = G.UIT.T, config = { text = ' ' .. (Riddle or localize('chipstorm_none'))
at text = '\n' ..
the bottom one
That worked but also not really
bruh
try making the top node G.UIT.R instead maybe
Now I don't know where the other one went
on vacation
uhhh fuck
try putting the second piece of text in its own G.UIT.C
instead of having them both in the same
That worked!
nice
its like
text that can change while it already exists
like the E:whatever formatting options or like misprint description use it
<@&1133519078540185692>
i cant believe the real mmist or best would say thuis
thanks moderator!
Thanks mods
Could I make it automatically add rows depending on how big a variable is? Like, instead of always adding
n = G.UIT.R,
config = { ref_table = card, align = "m", colour = G.C.GREY, r = 0.05, padding = 0.06 },
nodes = {
{ n = G.UIT.T, config = { text = ' ' .. (Riddle or localize('chipstorm_none')) .. ' ', colour = G.C.UI.TEXT_LIGHT, scale = 0.32 * 0.8 } },
}
},``` myself, it would add 4 if the variable is 4, 6 if it is seven and so on?
set the ref_table and ref_value to smth in your mod's config
Nevermind, got it
How do I have it in the second textbox though instead of the first?
In the one that says riddle instead of the top one?
ok I have 2 questions
1- what is an h_mult, h_chips, etc(saw it in the debug mod using the value command)
2- how to check for a specific char in jokers description
h_mult and h_chips is for unconditional held in hand mult/chips on enhancements
ok and for 2?
oh ok thanks anyways
bump
hey yall im trying to recreate 8ball but slightly different and when i run the code it says this "get_probability_var" is a nil value,
Have you looked at vanilla remade ?
yes i used that to build mine
yeah its get_probability_vars (plural)
local numerator, denominator = SMODS.get_probability_vars(card, 1, card.ability.extra.odds, 'vremade_8ball')
this is currently what the entire line of code looks like
that should be correct
thats what im thinking
Is this the new probability stuff ?
yes
I liked pseudorandom more
is the colour scheme for the voucher good (will do the art later)
what about it was better
its just more limited
the old way
whats smods version
most of this is copied straight from 8-ball i havent made many changes yet bcs i wanted it to work first
where do i check that?
title screen
as well yes
one sec
oh
i havent updated smods in awhile on this laptop lol
im assuming 1.0.0 beta is not the most recent version XD
0827c
i choose the green because of uncommon and the red for the second red because of rare
oh yeah you REALLY need to update lol
Ancient smods
i remember wanting to try pokermon when it first came out
havent touched it since on this laptop lmao
What about your lovely version
where do i see that?
crash screen and uhhhhhhhh
The console
oh or there
lmao
0.8.0 is the latest
Ancient lovely
that might be why another thingy i tried earlier didnt work
Update to windows 11 while you’re at it
top 10 smart by me
i wish i couldnt
but this laptop came with it preinstalled
:(
binbows
Surely you have the latest balatro update
1.0.1o is the latest yeah
1.1 in 2026
yeah
1.1 better be good
im hopeful that its good
considering hes delaying it
i trust thunk to cook with it
a man wont work on an update for so long and still delay it if it isnt cinema
🙏
even if it wasn't the best update, let thunk take his time. the fact he is willing to even update the game is honestly a good sign, as some folks would just take the money and run
wdym wasnt?
is bro from the future 😭
How do i check if rank is a Jack, Queen, or King? (I want them individually not just face cards)
no, lovely is in the balatro.exe folder
i have to delete version.dll right?
bcs thats lovely
With id
itll just prompt you to replace it
get_id() == 11 12 13 respectively
it doesnt matter
card:get_id() == 11
or 12 or 13
we can't guarantee anything nor should we expect too much.
oh i mean
wasnt implies the update is already out
true that but i still am excited
Okay thanks. I just wanted to make sure get id was 11-13 or j, q,k
and its good to be excited
Trying to use my code for Pelters from Parallel Updates to make Blaze
lol doing that instantly fixed the bug i was having
Well a modified version of blaze
I feel like this is too easy to do so I decided JUST 1 of each
making a mod filled with inside jokes between myself and my friends. gonna implement a legendary joker that's just Vile from MegaMan X (adds a permenant *1 mult for every time you mess up [failing wheel of fortune, triggering boss blind effects, etc])
YOO hell yeah Mega Man X rep
(btw that would be busted as hell b/c lucky cards and cavendish exists)
yea that's why i made it legendary
now for the tricky part: actually coding it in-game
oh i did that with one of my jokers it's not too bad
the first thing I learned to code was a joker that adds 1% of the blind's requirement for every scored ace in a hand, so I sorta figured it out
calculate = function(self, card, context)
if context.pseudorandom_result then
if not context.result then
return {
message = "Message goes here",
colour = G.C.FILTER,
func = function()
-- change goes here
end
}
end
end
end
you'd have to add the xmult thing after this though
as for why the getting stronger for every time you mess up in a run, it's because Vile is a recurring boss in a friend's dnd campaign, and he keeps rage baiting the party (perfectly in-character tho)
lol awesome
does someone happen to have that github page that explains how to do the correct color scheme for descriptions?
thank yo utwin
https://github.com/wingedcatgirl/MintysSillyMod/blob/next/hands/handful.lua why are some of my rocks not scoring when i play handsful of rocks?
i'm returning a list of all played rocks, right? and i know they're part of the hand because if i deselect them it's not a handful of rocks anymore
what crash
game crashes after applying a seal
No like what error message does it show?
Oh dear, my meddling has had consequences beyond my understanding
Also whenever I discard a card it stays in my hand but counts as discarded so it's flipped and uninteractable
This is what I get for messing around in the event manager
doesnt the boss small blind crash the game when you beat it
saved by the ghost of mr bones
Mr. Ghoul
the ghost of christmas past
I'm trying to implement custom small and big blinds but there's a few places in the code I gotta change so that it doesn't check for specifically small and big blind, but hooking those functions is pretty tricky
Especially cause I'm getting weird stuff like this instead of crashes
steal from ortalab
I'm kinda having fun figuring it out myself though, I'm learning a lot about lua this way haha
yeah fair
jimbo will not stop spawning even when i have jimbo what in the world could be trying to spawn here im so confused
how...
did you make a rarity or comsumable type
oh yes that is probably causing it
that woul dexpla ina lot ohmy god
god damn yo ustupid rarities i made for vanity purposes blehhh
ime home now
Is there a way to count the times played of a certain card (like every 10th played 2)?
use a variable in the joker as a counter
see VanillaRemade Yorick for similar behavior, it won't help with detecting played 2s but it does show how the counter works
On it thanks!
I plan on making this draw 2 additional cards at the start of a blind (2 playing cards of random ranks, suits, editions, and seals). What rarity should it be?
Rare
Is there a table with all playing cards?
all cards in a run or all prototypes or what
In a run I guess? Trying to destroy all but one random card in apply for a challenge.
G.playing_cards
hmm, I suppose that doesn't exist when the apply function for a challenge runs then? Because I'm getting a table expected, got nil crash when I use that.
how can i check if a card has an enhancement at all
you should just use G.deck for apply since thats the only place with playing cards at the start of a run
i have a card that generates tarot cards (like 8-ball) but when i have multiple of the same joker proc at the same time it gives
this error
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 and G.GAME.dollar_buffer == (G.GAME.dollar_buffer or 0) + card.ability.extra.dollars
this is currently what the line looks like
dollar also isnt working when it was before but im gonna fix that later
is the line exactly that?
yes
because and returns a true/false if both sides exist
wait if you discard do you draw up to the normal limit
use a semicolon to do multiple things on a single line
could you give an example?
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1; G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + card.ability.extra.dollars what your code would look like with that
it should
since first you has == which returns true/false
rather than setting the value
oh it does work
another relating issue how do i make it not generate a card if i dont have consumable room?
"and" doesn't do multiple things, it checks if the things on the left and the right are both true
At least from what I understand
#G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit
how can i get a card's enhancement (like lucky card, or stone card)?
and is the base version "c_base"?
SMODS.has_enhancement(card, key)
beat me to it
SMODS.get_enhancements(card)
returns a table because quantum enhancements exist
🥀
you can alternatively just check card.config.center.key
oh ok ty
but using the function is probably better
where am i supposed to drop that?
i put it in my function that adds the card itself but it doesnt work
am i supposed to do it at the start of the calculation?
if statement
if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
ill just do two tables and ax anything that appears in the extra stuff
this good?
wait shit the pairs
now?
oh
i did this and now it stops generating at 1 slot
that second part i removed is not true
did you remember to set G.GAME.consumeable_buffer back to 0 in the creation event
i did not
thats probably it then
now im generating more than 2 again
whats the code look like?
you should increase the consumabe buffer after the check for space
also currently the dollar buffer only gets reset if you have space
so inbetween then and return on row 142 i should add consumeable_buffer +1?
yeah thats something i also thought of
although theres a deeper issue with dollar
i cant see the line numbers but i assume so
bcs it didnt work even before trying to add this must have room
yeah because
you arent actually giving the money anywhere
you should add dollars = card.ability.extra.dollars to the return
how can i remove a seal
why does this not work?
i tried removing the comma and replacing it with ; and both didnt work
How do you check if or what challenge you're on?
ah like that
okay so i added it like this but now it stops generating at 1 again
oh nvm
figured it out
oh ok
its the +1 that somehow flash stepped back
now the money
gulp
when i try to change the message and colour on it i get this
wait i might have fixed it myself
i have
okay so now why doesnt money work
i added the thing you said to add in the return
whats the return look like
if thats it i might just do things to myself
😭
well
are all of them supposed to be the same
is there a parameter to identify the area in which cards are created in context.create_card? i want to identify moments jokers are created by other cards like judgement/invisible joker, but not when they're created for the shop/booster pack
edit: whoops turns out i needed context.card_added for what i wanted, triggers when a card is added to the cards you own
what did you call the variable in the config
dollars
then you do card.ability.extra.dollars
okay so it is just one letter thats missing
absolute peak
it doesnt work if i dont have space tho
well
because you have the dollars in the space check
uhhh
hold on
before the check for space add the following
another thingy is it possible to include the money at the same moment as the tarot
bcs i want it to have one like " whoosh" proc bcs now it does +2 money and then woosh