#💻・modding-dev
1 messages · Page 230 of 1
wouldnt work, there are two prints in this calc func and one of them triggers if the contexts are correct
which it doesnt
print context.other_card above the context.other_card if statement?
im not sure you are reading my messages, there is already a print there that isnt working
adding another wouldnt help
Is anyone else getting a smods crash when trying to activate sixth sense? (no other mods installed, just smods & lovely)
is "reading enhancements" print working?
as i said previously, neither of them are working
which means only the contexts could be wrong
you can also change the size of the entire string
which also accounts for the uhh, {} thingies of the keywords
you can see how it adds the s:0.5 to {C:white}
am i insane for getting this to actually work :3
bump
btw the {} right before another thing is unessicary
anything in {} resets all values
some people told me that a few days ago, but i already added it in so it would be more of a hassle to remove that now 💔
btw can it work on strings like {C:inactive}( Hello World! how are you)?
but i think it should still work, nevertheless
Oh thats sick as fuck
i didnt consider about making it work for strings with the {} stuff already, since it would require a lot more checks
but you can also add those instead:
- ["C"] = "inactive": tells the function to color the whole string to inactive
- ["override_keywords"]: overrides all "C:" part of the keywords to inactive
its C, sorry for the typo :3
it would be as simple as fidning the previous string with {}'s and no spaces and using that as your ending string
if your already looping the string its probably not that difficult
@manic rune You've worked with quantum enhancements before, right? can i see a snippet of what their implementation looks like?
hi guys
im back!
so
good news and bad news
good news is i fixed the crash
bad news is my code now generates infinite events and forces the game to a complete halt
so uh, if i use the current function with your string, it would be:
{C:inactive}( {C:white}Hello World!{} how are you)
the problem here is that how are you) would be left uncolored, so if i want it to keep the consistency, it would need to be {C:inactive} how are you)
nvm i missed a return true
yes I know thats why you find the previous one
oh, so uh, you want the code to find the {C:inactive} at the beginning of the string, and put that before the how are you) (and basically every part which isnt colored)?
theres already vars in my function which allows you to change the C,X,s,... of the entire string
so i dont think its necessary
i think ill just
re create the lucky card code
and then set the lucky card trigger bool for other_card to true
so it looks like its actually a lucky card
quick question for anyone smarter than me
(by default, it colors the +/X(x) Mult/Chips part)
how do you use particles(self)
but you can also change the color of those as well
this tells the code to change their C,X,s,... to what are set in the function even when they already have them, so in this case while normally it should be {C:mult}+5{}, since i set global C to "inactive", it is changed to {C:inactive}+5{}
you can see how X:mult is untouched, because i didnt declare global X
hey all! i am in need of beginner mod creation resources and can't find much outside of some nondescript reddit posts. if some of y'all could link me some resources for creating my own stuff, it would be much appreciated!!!
this is not how you scale a soul sprite
how do you do it
I want the floaty soul to be the same size as the card
how do i make this work with Canio?
return {remove = true}
there already is a remove = true did i put it in the wrong spot
does anyone know this? please help
nope wont work
ough
why do ih ave to keep finding bugs this is annoying
Yo question I made a new consumable type "Spell" and created a custom card, however it seems the game (or steammodded) loads it twice. Anyone would know why ?
SMODS.ConsumableType {
key = 'Spell',
collection_rows = { 5, 6 },
primary_colour = G.C.SET.Tarot,
secondary_colour = G.C.SECONDARY_SET.Tarot,
inject_card = function(self, center)
SMODS.ObjectType.inject_card(self, center)
SMODS.insert_pool(G.P_CENTER_POOLS['Spell'], center)
end,
delete_card = function(self, center)
SMODS.ObjectType.delete_card(self, center)
SMODS.remove_pool(G.P_CENTER_POOLS['Spell'], center.key)
end,
loc_txt = {},
}
(i did make sure files were loaded once)
chat help how do i resize a soul
magic
Just set the major
two jokers
Also: G.Game.chip is the current blind chip amount correct ? or after calculations ?
im doing it like this and it's not working
Try setting the major instead
stupid question, what's a major?
im not a programmer most of the time
Sprite.role.draw_major
Thunk wrote the documentation in Moveable.lua
If you set the major to the card
ok this is very funny
It should copy its transforms
Although now that I look into it
You aren’t creating the Sprite manually, are you?
Then the major should already be the card
Maybe it needs to be updated
With set_sprites?
Yeah I thought you were manually creating the soul sprite
no wait
Maybe this, but
forgot this part
I think that you are changing the size the wrong way
Try let me see
There’s a size transform
Since you’re scaling the card up by the same amount
You can just use it
I think it should be something like VT.scale = 1.2
Yes. Question answered.
record response time, solved a whole thing instantly
Lol.
What is it

newcard.scale = 1.32
doesn't seem to work
Do you know how to use particles(self)
Not newcard.scale
Something like
newcard.….VT.scale
lemme try that
Idk what’s “…”
yes i was wondering that
Not really. I know some other functions like the one that pops up messages and explodes use particles
I see
You’ll want to change the sprite’s scale
Idk if the card has a scale
Cards inherit from Moveable
So probably yes
Another question: do you know how to make Jimbo's textbox disappear
Because I figured out how to make it appear
@minor magnet actually cards have Card.T.scale maybe try that instead of VT?
Like for a Card Character?
Or for a Joker?
that did the trick, thank you Victin!!!!
my goat
Card_Character, yes
ok i cant figure this out at all, miight just have to give up on fixing this for now
idk why removing a random card at the start of blind and having it work with canio is so hard
I think there’s a CardCharacter:remove_speech_bubble()
got it
im making a mod to make balatro a lot harder, but i cant seem to get this line of code to work: "G.GAME.modifiers.scaling = (G.GAME.modifiers.scaling or 1) + 20"
I can't get the booster pack particles to disappear
you can use DebugPlus's eval/watch commands to run code quickly
Jokers for the Women Suit.
why discord
What are you doing 🤔
Discord Servers are a common place for lesbian polycules
i am so gonna use this for my descriptions :3
Trying to get the particles that booster pack cards produce to disappear or not appear at all
especially since most of them look like this
{}{s:0.7} annoys me
how are you creating them
i mean, you could always just use string.gsub() to delete all {} ❤️
They're created automatically
Then what did you do for them to stop disappearing 🤔
how do i add a soul onto a consumable
im pretty sure gateway from jen's almanac does that
A thats cryptid and
B i treid it no work
i need some help
i am trying to make a six card hand consisting of a 4oak and a pair (essentially, a bigger full house)
my current goal is to evaluate this by checking for a 4oak, and also a full house by making a new PokerHandPart for it
the only problem is i dont know how to do that without using other parts, which is a problem because parts cant take other parts in their function for some reason
does anyone have any idea what i should do?
NOTHING ???? ?
Actually would this work for a consumable to add chips/mult in blind
config = {
chips = 300, mult = 3
},
@zealous glen you know what's even weirder
regular packs don't generate particles like that.
hey all, looking for some advice once again. is there any known way for a joker to check which deck you are playing?
You don't need the inject and delete function, maybe that's why?
Im taking the maid dress, no backsies
oops
what the hell
i love coming here to search 'probability' and discord goes 'yeah we'll show you all the messages that include the word 'probably''
Actually maybe thats why
i say probably a lot sorry
i figured out how to do my pack shit
the yugiohdisplay guy!!!!
but i still need a little help
SMODS.insert_pool(G.P_CENTER_POOLS[self.key], center) is already performed on ObjectType injection, so you're adding the consumable twice.
That's cool
Hi :)
Oh so I can remove insert/delete
tell me and I'll see if i can be of help
yea
I thought they were necessary
I ran into this very issue and still haven't fixed it
I have a similar issues with a three oak pair
I can either use the parts and it returns full house or smth, or if I don't it'll only score the 4oak or one of the two 3oaks
Do you know why the cards in my pack generate weird particles?
mhm
Planet cards make blue particles
Now to figure out unusual consumable effects
honestly no idea, I've noticed that too
I think I saw a solution to that before but i don't remember
maybe it has to do with the pack type
for the card?
yeah
maybe i could hook the function that creates cards or something
but how would i check the pack type
skip_materialize is a field in SMODS.create_card
oh
i got it
also how do i make jimbo disappear without having him just. pop out of existance
i tried Card_Character:move() to move him offscreen but no matter what I set the arg to it did nothing
I tried 1
8
100000
And nothing
After female suit is fully implemented with jokers, tarots, blinds, etc., do I work on the Witchcraft-themed features next for my mod? Or do I work on the Hell themed features?
someone please help me change blind scaling, my code doesnt works
G.GAME.modifiers.scaling = (G.GAME.modifiers.scaling or 1) + 4
try changing .alignment.offset.x in an event, that's how I move other objects and jimbo should have that too
LMFAOO
will noone help me :(
Would it be possible to schedule an event that would trigger when hand is evaluated ? I dont really wanna resort to lovely hooks just yet
did nothing
I set Jimbo.alignment.offset.x to -5 and it didn't do anything
btw i changed Card_Character to Jimbo
I'll try just Card_Character
womp womp
its been 3 minutes chill
whats the full context for this code
whats alignment
im just trying to change values in the game, but nothing i use works
the thing N told me to change
Card_Character.alignment.offset.x
Some more important questions
A) How do you stop the player from selecting a card in a Booster Pack?
and B) Is it possible to have different types of cards each go to their correct location?
How should I go about increasing the amount of money rewarded by gold cards?
how would i make a joker that adds hands or discards, like drunkard, juggler or troubador?
look at what they do
There's a helpful example available here:
Please, check it out! @solid surge
Yes this is possible, you can use a table to specify where each card type should go if you turn on selecting cards
Do you have an answer for A? It's kind of my main concern
I have no idea what you mean by A
How do you stop the player from selecting a card in a Booster Pack?
I set up a bunch of events to happen when a player opens a Booster Pack, but the player can just ignore them and pick a card anyway without letting them finish.
hooks is likely your best option since you want to intervene in the booster selection process
I'd need to know what func is called when selecting a card from a pack
Or whatever function allows you to select a card from a pack
Also, can I get an example of how such a table could be structured? Thanks in advance ^_^
Trying to make a seal that copies the card when scored (removes the seal from the copy.) What would I put in context.mainscoring if statement?
nvm i figured it out
self:juice_up doesnt exist
I dont think self is usable in event context
I figured it out but for future reference when should i use self vs card
you should use card pretty much all the time
self also isnt card; its whatever the parent class is
(where the function body is)
so it might not be the same as card
I think i understand
i am trying to make a joker that gets more mult based on how many consumables you've used (not balanced i know but its for practice) and i am very stuck. would anyone be up to help me?
im using the resources provided for me and im at a roadblock
what are you stuck on
that's what im trying to figure out
it... looks like i am doing things right but i do not know
it should be working. I think
can you show me the code?
here is fine
key = 'Jokers', --atlas key
path = 'Jokers.png', --atlas' path in (yourMod)/assets/1x or (yourMod)/assets/2x
px = 71, --width of one card
py = 95 -- height of one card
}
SMODS.Joker{
key = 'blank', --joker key
loc_txt = { -- local text
name = 'Blank Joker',
text = {
'{X:mult,C:white}X#0.1#{} Mult for each',
'{C:attention}consumable{} used this run'
}
},
--[[unlock = {
'Be {C:legendary}cool{}',
}]]
atlas = 'Jokers', --atlas' key
rarity = 3, --rarity: 1 = Common, 2 = Uncommon, 3 = Rare, 4 = Legendary
--soul_pos = { x = 0, y = 0 },
cost = 8, --cost
unlocked = true, --where it is unlocked or not: if true,
discovered = true, --whether or not it starts discovered
blueprint_compat = true, --can it be blueprinted/brainstormed/other
eternal_compat = true, --can it be eternal
perishable_compat = false, --can it be perishable
pos = {x = 0, y = 0}, --position in atlas, starts at 0, scales by the atlas' card size (px and py): {x = 1, y = 0} would mean the sprite is 71 pixels to the right
function Card:generate_UIBox_ability_table()
elseif self.ability.name == 'Blank Joker' then loc_vars = {self.ability.extra, self.ability.x_mult}
end
function Card:calculate_joker(context)
if self.ability.name == 'Blank Joker' and not context.blueprint then
self.ability.x_mult = self.ability.x_mult + self.ability.extra
G.E_MANAGER:add_event(Event({
func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = 'X' .. localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}}); return true
end}))
return
end
}
some of this is template stuff that i should prooobably get rid of
uh yeah you don't put those functions there
i recommend looking at this https://github.com/Steamodded/examples/blob/master/Mods/ExampleJokersMod/ModdedVanilla.lua
i am
well, look at it more carefully lol
yeah, that tells you how to structure your joker
then in calculate there's a context for using consumables you will find here https://github.com/Steamodded/smods/wiki/calculate_functions
is there a shop rate for specific consumable cards like how theres weight = for the packs?
How would I go about creating a pareidolia-esque effect?
@red flower i did it :3
-# you can add keywords and what color/size/stuff you want them to be in the function now
amazing
how does context.remove_playing_cards and context.playing_card_added tell how many cards have been added/removed?
its peak
Question: how do you create random jokers regardless of rarity? I took the code for riff-raff and I replaced the rarity param with nil, but my testing only made commons. I could randomly generate a number between 0 and 3, but then jokers of modded rarities wouldn't be capable of showing up
nvm just got 2 uncommons
I need to patch two lines in Balatro. However, those two lines are present at two places in the same file, same function, and I need to patch out the second one... nothing differentiates them. Is there a way I could do it with patches.regex ? Although I dont have a good idea of how regex could help... patches.pattern will simply pick the first instance which needs to be left alone
Hi! Does anyone know how to make a joker copy itself when choosing a bind in the code?
You could probably look at perkeo's code, dupe it but execute it on context.setting_blind
oh this is REALLY clever
Thank you so much
youre welcome ! just adjust it so the target is itself
Ok so question, how do I make it reference itself? Do I put in G. and then its ID?
well the cool thing is that when your joker's calculate function is called, the card argument is literally itself
managed to fix this the very crude way too
Ok ok I think I understand it now I got a little more insight in how this works thank you very much
I'm trying to make a joker that destroys EVERY joker at the end of the boss blind. How do I target EVERY joker?
use for loop through G.jokers.cards
Got my consumable to work how I wanted it, now I need to make it so theres more time between my effect and cards applying, and also some text popping on screen or something...
and also the chip and mult are added all at once... should I just add delay() calls ?
probably
works just fine, but I forgiot the animation, so now it's death jumpscare
(talking about the same issue i was having earlier) my joker... still is not working. im trying to make it have +0.1x mult for each consumable used this run. my code should be going (for real this time i copied 99% of it from the examples given) and it still crashes. is anyone able to help if i send over code?
how do you destroy a card?
theres a vanilla joker that does what you want to implement
this is for a joker that destroys a random card at end of round so I don't think I can just return { remove = true }
yep, constellation. i tried copying it over but it does not work
also that is for planet cards only and not all consumables
constellation isn't retroactive is the thing
where does one find vanilla implementations?
that too
oh wait was it that thing about extracting the .exe with 7z or smtn
yep that got better
you can open the .exe with 7z and open the .luas to copy stuff
And yes, you'd have to set up a game tracker if you want it to record it retroactively
I did that for a joker for mine
which scales for certain consumables used this run
im trying to use code from runner and constellation and the guides
its... interesting
Constellation just uses the using_consumable context, checks if it's a planet, and then scales
yea
So if you want it to scale with every consumable, you'd just remove the check for the consumable's set
im trying to use the scaling from runner with the using_consumable context from constellation
yeah
that's what i thought
but its not workin :(
crash on startup is probably just a compiler syntax error
likely
winter when is ur awesome mod releasing, ive seen some of the stuff ur doin and it looks neat
always post code
crash on startup means wrong syntax somewhere
I've completed about 55 of the 90 jokers in the 1.0 release!! No specific timeframe, I'm just gettin there as we get art done
How do you always make a joker have the eternal sticker like Cube from Cryptid? I looked at the code for Cube and it mentions nothing about any stickers
SMODS.Atlas{
key = 'Jokers',
path = 'Jokers.png',
px = 71,
py = 95
}
SMODS.Joker{
key = 'blank',
loc_txt = {
name = 'Blank Joker',
text = {
'{X:mult,C:white}X#0.1#{} Mult for each',
'{C:attention}consumable{} used this run',
'{C:inactive}(Currently {X:mult,C:white}X#0.1#{C:inactive} Mult)'
}
},
atlas = 'Jokers',
config = { extra = { xmult = 1, xmult_gain = 0.1 } },
rarity = 3,
cost = 8,
unlocked = true,
discovered = true,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = false,
pos = {x = 0, y = 0},
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.x_mult, card.ability.extra.x_mult_gain } }
end,
calculate = function(self, card, context)
if context.joker_main then
return {
xmult_mod = card.ability.extra.xmult,
message = localize { type = 'variable', key = 'a_xmult', vars = { card.ability.extra.x_mult } }
}
end
if context.using_consumeable then
cardarea = G.jokers,
using_consumeable = true,
consumeable = card,
area = G.consumeables,
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.x_mult_gain
return {
message = 'Upgraded!',
colour = G.C.MULT,
card = card
}
end
end
}
Speaking of, cool shader effect on the left middle joker there. Trying to animate action lines
sick, i look forward to seeing its release
more power to you!
It's this
cardarea = G.jokers,
using_consumeable = true,
consumeable = card,
area = G.consumeables,
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.x_mult_gain
return {
message = 'Upgraded!',
colour = G.C.MULT,
card = card
} ``
thought so
You copied the entire reference table for the consumable context
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.x_mult_gain
return {
message = 'Upgraded!',
colour = G.C.MULT,
card = card
}```
btw if card isnt referenced for a message, does it display like in the middle of the screen or something ?
the lines for cardarea, using_consumable, consumable, and area are what are passed into context
hm
Meaning you're given them, and you can access them via context.[whatever]
The reason why it's crashing is because of the commas specifically
ah
You don't use commas unless you're setting values in a table
Give it a try
mkay!
no more crash, but it definitely isn't right
this means your variable for mult is nil, not 0 in your config
Both your values are slightly incorrect when you access them in loc_vars
Id ahve a variable for your text and another one to track the xmult
change those to x_mult and x_mult_gain
You have the extra underscore the other two places you use them
AH
Out of curiosity Dilly, what have you seen so far that's interested you?
Oh, first of all
In your loc_text statement, you're accessing #0.1# multiple times
The first should be #2# (to get the second value in the loc vars table), the second should be #1#
hm
What you're passing in between the hashes is the index of the value in the table
i see
I am trying to use SMODS.https and asyncRequest but any time I add any options I get a Non-existant thread id error. Without options it works fine but any options breaks it for me. Has anyone else experienced this and know what I'm doing wrong?
so far most impressive for me was that pack revealer you have
Yeah!! That was fun and a little aggravating to work on
i can imagine, i get my head busted up about things too and i havent done things as neat as that yet
Did you see the emulator?
i dont think so, mind showin me?
bruh wtf
(Ignore the screen clipping at the top, the CRT shader is a little difficult to work with)
oh shit yea i DID see that
i actually wanted to use you as a reference in doing similar, but doing a different game such as snake or something
how you figured this out baffles me
now can it run doom
Believe me I did not write the emulator
That's way above my pay grade
For something like snake..... honestly I'd just program the snake game myself and then render it out to an image
oh are you just hooking in the emulator?
wait you embedded an entire NES emulator into your mod for this?
Yeah
oh sick
LOL
LuaNES by Nico Abram
that's amazing
that is sick
The joker boots the emulator, accesses input, draws to the screen, and then checks some ram locations to determine when you've won/lost. Fundamentally I didn't do anything Abt the NES hardware, I just used Balatro as the input and output devices
(well, I did alter the palette so it's more pastel to fit balatro's art style)
regarding the public release of your mod, as i dont know luaNES at all
are you able to just publicly release with it in your mod? im unsure licensing wise what they allow so just wanted to make sure they didnt get big mad at you
Okay so, objectively
The NES, yes. Definitely legal, and I have the license info for it in the source code
The fact that I currently have the roms themselves in the source code......................................
yea that was another thing i was gonna mention
you could have it look for the roms after install and have people just manually put their own in, this way you arent at fault
and instead if it doesnt detect a rom itll just run some other default game you wont need to worry about
this is the right way
So like if you ask me, legal precedent against roms online is bullshit, big advocate for piracy due the failure of corporations to preserve games
i totally agree, but unfortunately big corpo will not care
For the sake of any personal ramifications, obviously it's a free project, for a free game
And yeah I've thought about just asking the player to put the roms in a side folder themselves
Which would be an easy solution
The joker works without the roms anyway, it's both a regular joker and you play the embedded game to win a free joker
If I want a UI node to be drawn throughout the entire run where do I put this into?
So I could just have the joker function with the playable game if it has the game file, otherwise it's just a regular joker anyway
ah thats fair yea
i figured if you wanted to duplicate (albeit lessen) the experience you could just make a lesser game yourself to fall back for
but if it still works then that saves you a whole lot of hassle
I probably won't, since it's a specific reference. The three games in the emulator (Donkey Kong, Dragon's Lair, and TMNT Arcade) are from the JoJo fic that it's based on
ah icic
Though I could have some alternate freeware game, it'd kinda lessen it versus just not having it
Regardless I'll figure the best course of action when I release it 
i believe in you, youre doing fantastic
Now ough, I wish the vanilla particle system was better
ive really been procrastinating getting into shaders
i want to but man, thats a whole load of effort
You can't have particles in global transform space, only locally relative to the parent, which is harder
I might have to use the Love2D one since there's a proprietary reduced one in Balatro itself, it doesn't use the Love one
Oh yeah and if you want to get into shaders, STEAL
Steal code so much
I don't innately understand a lot of graphics math, at least not on the top of my head, but stolen code is a good starting point to figure it out
Which is how I've made most shader things work so far
Also having used Unity ShaderGraph before, since the visual element helped me conceptualize what kinda things are going on with the values
yea thats how i intiially learned how to make my jokers was just delving and stealing from the examples, then i started mixing and matching
i hadnt messed with lua for like, 6 or so years cause i did it alot for gmod back in like 2014 onwards
this is my first Lua project, I worked professionally with Typescript for a few years which is similarish
So it wasn't too hard to transfer into, but there's still quirks I haven't quite figured out
i mean hey, i think youre doin great thus far
now for the emulator you just have to run balatro within balatro and youll have peaked
If somebody's made a Balatro port for NES lmao I'll do it
lmfao
I saw a DS port
yea i saw that too, also saw the guy whos making it into a physical game
is irl balatro technically hitting the "no talking of ports" rule
Hihi
cuz if so that'd be funny
im not sure its possible with the limited memory and color limitations
but hey
i am willing to be proven wrong
The finished content for 1.0 for this mod is gonna be
- 90 jokers
- 30 Stands (new consumable type)
- 4-5 Spectrals
- Reskinned Tarot Cards
- 6? Vouchers?
- And then some challenges and achievements and that idk
honestly im not sure, but its cool as hell to watch
should add some blinds frankly
We have a bunch of blind concepts and we're reskinning the boss blinds, but I don't recall if we decided on adding the new blinds. Probably?
anyway chat, is there like a flag i set or a way to make it so that a joker can always appear multiple times
as if you have showman
but you know, even if you dont have showman
Yep, allow_duplicates = true in the joker definition
huge
Thinking about taking a break from the custom suit and working on something else.
sometimes breaks are necessary
when i was trying to figure out a joker for awhile i came back to it like 3 times before it was just about perfect
error with variable that has never been mentioned in this discord server award
Someone convinced me to add this as a win quote 😔
wait that's a method
going into
what
pardon
chat what does SMODS.https allow you to do
connect your balatro to the interwebs
Okay so the issue is that, for some reason, your G.GAME table is nil, or empty
Because prep_stage is a property on the Game table
oh I'm silly I was hooking something that looks like Game:function and I forgot to feed it self
tehepero
Okay yeah, so self is nil in that case
you mean you don't want your joker to connect to a web api
Syntactically, if you access a function with a period, you have to manually pass self. If you use a colon, self is implicitly passed as the first argument
bro virus joker in balatro that just fakes sending your ip address
yeah I forgot that I had to manually feed it self in this case
guys i really wanna add more jokers but the problem is i wanna make an addon instead of just adding them to my mod outright
quick question, how did you achieve this positioning ? im assuming this isnt a win state
Positioning?
yea
when making the text bubble you can speciffy the positon iirc
lots of uses for plugging balatro to the internet
but that position is the default for the win screen
hm i see
????? what does this mean
And yeah this is me winning the game
oh lmao
okay I got something rendering that's a start
new cardarea ?
resource meter
omg Mana in Balatro
high key might have to start thinking about that if i wanna do a true paper mario game
gd reference
OH
i get it
Hey lads
How do i get the key of a random element from SMODS.Suits?
im doing a pseudorandom_element() on SMODS.Suits and i need to get the key for change_base(), but just doing pseudorandom_element() on SMODS.Suits returns a table and pseudorandom_element().key seems to return nil, or at least its empty when i try to print it
thatd be crazy
but also really funny
sure
Im not sure if you can loop over SMODS.Suits anymore
But id go the monkey way and generate a random index between 1 and suits length, and just index the suits table this way
uh
this very same effect works on the deck, but not the sleeve
the sleeve refuses to destroy 2s 💀
so i just choose a random number x between 1 and #SMODS.Suits and replace the pseudorandom_element() with SMODS.Suits[x]
is what youre saying
thats what i would do
i see ill give that a shot then
(mostly cause i dont know any better)
would SMODS.Suits[x] return the key or do i have to add .key at the end for that
add .key
alrighty
Suits[x] would give the object
SMODS.Suits[pseudorandom('seed', 1, #SMODS.Suits)].key is giving me "attempt to index a nil value"
this means SMODS.Suits is not what youre looking for
oh
i just need a table with all suits
including potentially modded ones
to choose a random entry from
Smods registers modded suits into the same place vanilla ones are
Id look into balatro’s code to where its storing the vanilla suits
maybe
its weird though
ive seen SMODS.Suits given in this channel before so im not sure why its not working for me
Hmm, do I work on Runes next? I really want to but. Idk how hard it'd be.
whats runes about
oh really
did that like just come out or something then
because it was like last week apparently that it was last in this channel
A type of sticker that gives unique effects when played with other runes.
Do it
Besides you dont know if somethings hard until youre knee deep into it
lemme look
True enough
SMODS.Suits does seem to exist because i can print() the table just fine
i just need to extract the key of SMODS.Suits[x] somehow
SMODS.Suit seems to be a table
yeee
bumping this, anyone know why my joker's size is messed up?
I think Suits is kept for compatibility with 0.9.8 mods, thats it
So i use this instead of SMODS.Suits?
SMODS.Suit.obj_table[pseudorandom('seed', 1, #SMODS.Suit.obj_table)] sadly seems to return nil
Nah, all main classes are expected to have both obj_buffer and obj_table.
Which SMODS.Suit is
Think you could guide on suits ?
man this was way easier to do with ranks
It should be exactly the same as ranks
well pseudorandom_element(SMODS.Suits, pseudoseed('seed')).key returns nil
There's literally an example of getting random suits in the example mods.
damn
currently looking for it
i assume its in castle2 somewhere?
Yes, I believe it's in the hook beneath it
hm it seems thats different
it just pulls the suit of a random card in deck
which is not what im looking for
Better example is the take_ownership of all the spectrals that add playing cards
Which would be these parts
I've had a similiar thing... but I used the regular dimensions for the atlas and made sure that the "top left" of the "card" matched the usual "top left" of the default Joker template in the sheet.
https://github.com/TheOneGoofAli/TOGAPackBalatro/blob/01a4a1b3947b0c6541ea4d345fa795f6eddc4a43/togastuff.lua#L1272
https://github.com/TheOneGoofAli/TOGAPackBalatro/blob/main/assets/1x/togajokersother.png
ooooh does it have to be card_key instead of key?
for the Ranks it was just pseudorandom_element(SMODS.Ranks, pseudoseed('seed')).key
not key
Yea
card_key is the card key (which is applied onto cards), key is the SMODS.Suit object key (used for other things iirc).
ah wait no this just returns something like 'H'
which is not what i need because im feeding it into change_base()
for that i'd need to get 'Hearts' instead of 'H'
Looking at Sigil that is what it does
key just returned nil when i tried though
ill give it a shot
sigil has the suits hardcoded
no this
oh that
Yeah consideing that SMODS objects are always required to have key I'm wondering if something else is amiss.
hmm nvm it does work
ooookay i just switched it back to key and it started working wtf
SMODS.Suits.key is no longer returning nil
and i dont know why
but i guess ill take it
were you using SMODS.Suit instead of SMODS.Suits
nope
hey guys
i need help with something
i tried adding a consumable but it crashes on startup
i could swear on my life the code is the same
but i guess its not somehow
it says "attempt to get length of local 'pool' (a nil value)"
does anyone know what i did wrong?
did you assign a custom set ?
yes
create a custom ConsumableType for that set
highly unlikely but i guess its the only way
did you make sure to load the file for your type ?
I have DynaText objects that refer to a variable and I am calling update on them but the text doesn't seem to update?
is the key for the type and the key for the set the same?
no its not
ok
Do I need to call anything else to get them to actually rerender?
so where do i put the set key in the ConsumableType
axtually yes
https://github.com/XLuma/Balatro-Dofus/tree/master/src I made this earlier you can take a look
grrr
I have a custom consumable with a custom ConsumableType Spell
and ofc make sure youre loding all the file with smods.load_file
new issue: when i try to enter the collection page, this happens
SMODS.ConsumableType{
key = "JimboCards",
primary_colour = "FD5F55",
secondary_colour = "009CFD",
default = "c_cherrysmod_jimbjoke",
loc_txt = {
name = "Jimbo Card",
collection = "Jimbo Cards",
undiscovered = {
name = "Not Discovered",
text = {
"Find this card",
"inside a Jimbo Pack"
}
},
collection_rows = {5,5},
shop_rate = 0
}
}
SMODS.Consumable{
key = "jimbjoke",
set = "JimboCards",
loc_txt = {
name = "Joke",
text = {
"Does nothing.",
"",
"Sorry!"
}
},
atlas = "jimboatlas",
pos = {x = 0, y = 0},
cost = 1,
pools = {
["cherrysmod_JimboCards"] = true
}
}```
whats the default key for
i feel like collection_rows and shop_rate are not in the correct spot
same issue ?
not really, maybe the loc_txt for your consumableType is wrong ?
no its perfectly fine
the pools for your consumable is not necessary
smods will automatically create a pool for your consumabletype and put anything that has set = yourtype in there
if one would want to try and make a joker where would they start?
ive looked at a video for making one and they way they jumped into their lua was very confusing
obligatory kitten jumpscare https://github.com/Steamodded/smods/wiki/Your-First-Mod
The examples repo from smods, the smods wiki, and other mods source code
ah! thank you both!
SMODS.ConsumableType{
key = "JimboCards",
primary_colour = "FD5F55",
secondary_colour = "009CFD",
collection_rows = {5, 5, 5, 5},
loc_txt = {
name = 'Jimbo Card',
collection = 'Jimbo',
undiscovered = {
name = "Not Discovered",
text = {
"Find this card",
"inside a Jimbo Pack"
}
}
}
}
SMODS.Consumable{
key = "jimbjoke",
set = "JimboCards",
loc_txt = {
name = "Joke",
text = {
"Does nothing.",
"{}",
"Sorry!"
}
},
atlas = "jimboatlas",
pos = {x = 0, y = 0},
cost = 1
}```
pls help idk whats wrong with this 
show main.lua
all of it ??????
just so you know
my mod only has one lua file
and its main.lua
oh no
i am
do you got a github ?
yeah
nope
i also had one lua file
until someone told me i should do something about it
luckily they told me really early when i had only like 3 jokers
yes
question to chat real quiuck
i would say make sure the consumable type is at the very top of the file ??
if i want to do an effect kinda like basebaqll card where it triggers based on what other jokers you have
Not at computer so I cant debug
that'd be context.other_joker right
yes
ok
i think at least
and like if i want to check for a specific joker they player might be holding
g.jokers
how do i get the name of a joker
like g.jokers[i].name == nameiwantedtocompare or something
buty like actually correct
yeah something like that
Try putting your hex codes in a HEX() wrapper
like so
that might be it
didnt catch my eye
but it did complain about a nil value for numbers
im assuming i can compare like
g.jokers[i].key
that'd get the key of the joker right?
holy fuck
or
LMAO
that worked
GG
unfortuinately you now lose 1 hand size
hm
then how would i go about actually getting a name or key out of them
or like vanilla jokers
do they have keys
or do they just use names
wait
hm
okay chat question
i wanted to make a joker that gets stronger the more duplicates of it you have
and i can make it check for its own key
but i've just now realised and thinking about what to do if it's being copied by blueprint/brainstorm
do i count it as a duplicate and therefore it gets buffed?
I think blueprint should apply whatever effect it gives but to not count it as a duplicate
or will the blueprint just copy the mult but not the self buffing ability
ok
good because i have no fucking idea how to code it so that it counts blueprint as a dupe
whew
Hey, does anyone know how I would go about checking if a card has no enhancements, seals, or editions?
I'm trying to make a joker that scores mult on cards without any of that
hi so im having issues getting my fuckin text to display
it all says nil and ERROR
ok i fixed the nils
but i still have the errors
im trying to reference the entry for polychrome
is it this?
SMODS.Consumable{
key = "jimbpoly",
set = "JimboCards",
loc_txt = {
name = "Polychromifier",
text = {
"Makes one",
"of your Jokers",
"{C:attention}Polychrome{}"
}
},
loc_vars = function(self, info_queue, card)
info_queue[#info_queue+1] = {set = "v_dictionary", key = "ml_polychrome_desc"}
end,
atlas = "jimboatlas",
pos = {x = 2, y = 0},
cost = 10
}```
like that?
dumbest looking hook I've written so far
What does your code look like now?
SMODS.Consumable{
key = "jimbpoly",
set = "JimboCards",
loc_txt = {
name = "Polychromifier",
text = {
"Makes one",
"of your Jokers",
"{C:attention}Polychrome{}"
}
},
loc_vars = function(self, info_queue, card)
info_queue[#info_queue+1] = {set = "Edition", key = "e_polychrome"}
end,
atlas = "jimboatlas",
pos = {x = 2, y = 0},
cost = 10
}```
Try using G.P_CENTERS.e_polychrome instead of the table
Yes
what
this?
yea
thanku
i havent gotten to custom comsumables yet
im still babey
question about other joker
if im grabbing the name of them it'd be other_card.ability.name right
should i learn html
just to make a website that can render the color of {C:mult}+5{} Mult
animated jokers are stupid fun (thanks to @manic rune for the script for this!)
...oh, its actually more of a proof of concept, i made it during my first week of modding so it isnt the polished ver im satisfied with yet, but nice :D
i mean, if it works it works lol. i wouldn't have figured it out on my own so still, thanks for posting that lol
mhm, good to know it helped someone ❤️
cha hepl
goal : for each Monke card held including itself , gain +5 mult
problem : it's not counting any Monke, not even itself
i have one similar to this! is it a scenario where if you had, for example, 3 jokers of this kind, the total mult would be 3 * (mult)?
oh, also
wait nevermind
it probably works
so 1 monke is 5 mult x 1 copies x applied 1 times = 5 mult
2 monke is 5 mult x 2 copies x applied 2 times = 20 mult
3 monke is 5 mult x 3 copies x applied 3 times = 45 mult
it's a square increase
because ape together strong
who doesnt love using already existing concepts
Not me
Don't Mind If I Do from Maximus is literally just Vampire but seals instead of enhancements 
i added the ape together stronk to Monke because if it was just its other effect i'd be meh
which is that held Gros Michel and Cavendish also gives x3 mult
because monke bonan
oog oog
moke
anyway yeah why doesnt it count itself or toher monke
im sure it's some syntax thing
💔
im very saddened you ignored me :(
i have this snippet for giving money based on how many of a joker there are, but you should be able to adapt it however you like (just use a calculate function, change the key used in SMODS.find_card, and adjust variables however you like)
calc_dollar_bonus = function(self, card)
if #SMODS.find_card('j_yacbm_antenna') <= 1 then
return card.ability.extra.money
else
local bonus = (card.ability.extra.money + (card.ability.extra.extra * (#SMODS.find_card('j_yacbm_antenna') - 1)))
if bonus > 0 then return bonus end
end
end
oh god formatting is messed up
but also, you can use #SMODS.find_card like trif suggested, i think it works the same
though i kinda like using .config.center.key more, gives me more control over my code :3
im assuming find_card is just the loop i made but as a function
yeah SMODS.find_card is just slightly easier and i think has a couple more capabilities, not sure though
basically yeah
this is such an useful function :3
You check via card key rather than card name (which mods stopped adding to their cards because it basically did nothing substantial).
Also goes over more CardAreas
ah, makes sense
still 0 mult :dismay:
show code now
if something doesnt work, send it to #💻・modding-dev ❤️
there will always be someone to fix it
it's literally the same thing but the j_HangedMan_ and also chenged to centre
except for when it's late 💔
Balatro Modding Service™️
screenshot code pls
yeah that seems correct
doesnt give +mult
also make sure your mod prefix is the same as that one there, i've had issues when using the wrong capitalization for my prefix lol
yeah it's HangedMan
and if all else fail, add print() everywhere and see where it doesnt run properly :3
the opposite of Cryptid
Most mentally stable balatro modder
i normalized the use of ":3" around here
most straight balatro modder
❤️

I might have a slight edge
i don't debug i just get mad at my computer and angrily search functions in this discord
edge? how long
Bruh
:3
lusty joker ☹️
I'm removing your privilege to send any further message than that in this channel.
yeah uh
hmm
add print() everywhere then
strange
weird
what do i print
maybe put "card.ability.extra.cumulativeMult = 0" at context.after instead?
add some prints here
it can be anything
would it be funny if card.ability.extra.baseMult was 0 all along
its hangedman
the id get normalised to lowercase
this is why printing is helpful, as you can see
I’d honestly recommend changing your mod id to something shorter like hm just for your own sanity
lol i just made this mistake earlier
^
i kept mine at "hsr"
hm
theres no way im having "balatrostarrail" as my mod prefix lmfao
The id for Maximus is mxms
put j_YACBM_ instead of j_yacbm_ and was very annoyed

im pouring cola on you.
bltrostrrl 🔥
modders together strong
what the fuck 🔥
oog oog
Get that AI bullshit out of my goddamn server what on earth
Your server? 
the opposite of my goat is washed
its not that deep man 😭
my goat is soiled
Clearly not my server but like yeah no fuck that shit
wet, even
it's one ai image 😭 i doubt bepis even generated that
i took it from my friend's group, thought it was funny :3
Listen man, I think everyone here can agree AI is kinda shite, but throwing a fit about one image is pretty extreme bruv
i don't support ai "art" by any means but a single picture isn't that big of a deal
I do a bit of digital arting and I wholeheartedly believe AI is a waste of an excessive amount of resources.
I vibe with it for the funni on RARE occasions tho so this one is just a "haha fuck that 😂" not a "what the actual hell is wrong with you, convert your left card into your right card you idiot"
It was slightly funni
Didn't mean to be a dick about it
ah alright, it seemed like you were a LOT more mad lol
i love weird ass ai images, they have a certain vibe to them that ordinary art pieces cant replicate (no offense)
like, you know that one picture with godzilla and his big ahh ass? 😭
mhm
i love ai art as memes
but im against them as an actual form of art
-# are you writing an essay 😭
Example: AI Joker.
It changes every round and is often entirely unhelpful.
Example: AI generated card (Dungeons and Degenerate Gamblers)
Assigns a random value and makes a copy in the opponent's played cards (inherently dangerous and unhelpful)
That's the correct applications of AI.
Insulting AI.
No I'm just on mobile because I haven't switched to my steam deck yet.
oh, i see
Though I have an acceptably high typing speed on mobile as well...
the art should definitely include hands with 6.5 fingers too ❤️
Yep
would it be funny if there was a whole trope of jokers making fun of ai artists
-# i personally think it can be controversial
like, that joker + an AI Artist joker will generate money but reduce your mult and chips because the quality is so ass 💔
+$15 but *.25 chips and mult as final scoring step
thats the spirit
AI Joker
Every round, your selection limit is random (between 1 card and 8 cards, skewed towards being lower)
(because Four Fingers, but the fingers are horribly deformed by AI)
I also like the NFT card idea from D&DG
It's a card that loses value every time it scores
why wouldnt you sell it immediately if thats the case tho
Making it skewed sounds like number spaghetti 😭
D&DG works differently. It's blackjack but roguelike/dungeon crawl. You can't get rid of it until you get to a certain event that lets you get rid of cards.
And if you get unlucky at some point, you might end up with an NFT in your deck.
In a way.
:3 cool
This doesn't have to do with modding development.
How hard is it to start making a Joker?
gros michel
sock and bussin
two pairs

