#💻・modding-dev
1 messages · Page 288 of 1
nope
There's also the bepis tutorial can you link that vic if you're on pc I'm on
clean install doesn't do it for me either, Wheat
How would i create a this similar to ortolabs index cards
as I said, not like that
that's not a method of adding badges in vanilla
there's just... a badge by default
the video that linked i was using before
I mean, it works completely as intended, covers all cases of removing and adding consumables, and the issue I'm having is unrelated to how i've done it
I wouldn't call it the Best solution, but it works very well and doesn't pose a problem
and stopped as soon as i got up to the coding bit, because it didnt even tell me where this bit hes coding in is that already has a template and all
the same way as everything else, you define it in the localization file
in the same place vanilla badge names are defined
so what's the key for that, then? It's not label or badge, so what
there are two of them
in the localization file, you set it as a label, yeah, but I'm not sure how that translated from doing localization in file
You need a localization file AFAIK
you can search the vanilla localization file to see the two places they need to be
@scarlet spire no, I'm wrong, it does do it in a clean install. I hadn't checked it out with turtlebean. That behaviour's either smods or vanilla, but it's not you.
It is inefficient and works outside of normal game logic though
indeed it is
It should fit the calculate pipeline
so even though it does exactly what it is supposed to with no issue, and poses no performance issues, it's still wrong because it doesn't fit the conventional method
It can pose performance issues with multiple copies of this effect or multiple consumeables
watching a tutorial and it goes from "youve made a sprite" to "ok now code in this" where is this??? where is this file located and why does it have a template already there??? please can sm1 help without just linking to eighty sources that do not help
and it doesn't necessarily work with other mods because it doesn't fit the conventions
you just create a text file and start writing
the text file goes into the mod's folder
also that tutorial looks like it's going to be outdated
when hes typing it pops up with stuff like this and mine doesnt?? like huh
-# Bump
what does that mean
if you're completely new to coding, I really advice checking out some short tutorials about them just so you're more clear on what comes from the IDE, and what's part of the game modding tutorial
could someone direct me to good info/documentation/examples for CardArea?
It isnt documented, but i would highly reccomend checking out the game code and N'('?)s Joyous spring mod
Sorry I don't think that exists. I'd say to read vanilla code and if you want to do something specific some specific mod might do something similar
thanks people
actually testing the performance of this, it has zero impact even if I have 50 of this joker going at once. it's just comparing and setting a value, you're overestimating how performance heavy this is
more consumables also shouldn't lag it because it's not individually processing them, just keeping track of how many there are
the base game tracks certain stats in the exact same way. I think it'll only start being an issue if your players love cryptid, performance-wise
the only performance drop I got was from the actual card renderer, because it also happens with 50 of any other joker
And again the Joker effect has no reason to not fit into the standard calculation pipeline
primarily, it functions exactly as I want it to and accounts for all edge cases without having to patch anything
forgot to reply to this, that's odd
should probably be reported, then?
anyone know how to prevent '+nil mult' on jokers when bought and when viewed in collection as such
yeah, definitely. I'm really curious what causes it, because I checked my own consumables that draw cards and add hand size, and that isn't affected by it, interestingly
where would that be done in?
loc_vars
ahh okay ty
okay so i cant do 'card.ability.extra.mult = 0' in loc_vars, im somewhat stumped
you need to do return { vars = { card.ability.extra.mult_gain, card.ability.extra.mult or 0 } }
or whatever your values are called
How do I control an UI element's position on screen?
Like, what's the key in node config? x =?
config = { offset = { x = 0, y = 0 } }
i might be rly dumb but i cant put a return in local vars ;-;
how does your code look
does anyone know how i could fix this?
omg
im such an idiot i forgor
kind of a simple question but im struggling to find the answer myself - how do i enhance a card? the card is being created with the Card function
looking at the screenshot i realize people might be very confused if they use my mod as a base for creating jokers lol
How do I utilise this so that jokers' description boxes don't go out of screen when mouse-hovered in collection?
Cuz I was expecting something that I could squeeze a math.min() into it.
card:set_ability('m_steel')
thanks!
no idea, i hook the align_h_popup function to do something like that
it changes the offset too so i guess like this
it still not working :c
not how you do it
you return the variable not assign it
me when i write how the code should be and people ignore me u.u
hey cna you tell me how exactly you made your joker graveyard so i can ignore it
why is this here 😭
cause you put it there, aiko
it's just a dictionary with the keys of the jokers that get destroyed
do i have to initialize the cardarea as the table is being returned
did u put it inside the node properly
theere we go
♥
Would this work? I just need it to not crashing into the ceiling.
I have a feeling that offset.y is not the top position.
i dont think so, its an offset so it doesnt correlate to screen position
you need to check self.T.y
So is the y coordinate of the top edge self.T.y + ret.offset.y?
Or is it the y coords at the center of the desc box?
what is the context for when another/any joker is triggered?
i think it's the top edges
self.T.y is the card tho, not the box
post_trigger
how do you remove editions from a card?
😭
I'm attempting to make a text box on the middle right of my screen, but (even though the code says "cm", it glitches out otherwise) it seems to only go to top left
hm this code isnt working, is im stupid?
Does anyone know how to remove editions from jokers and playing cards?
idk what type is, you probably want align and offset
and major = G.ROOM maybe
it's an optional feature it seems
expectation vs reality
wdym
lemme send the code n tell me what am i doing wrong
Emult is exponential mult right?
my follow up was going to be if talisman was installed
if context.before and context.scoring_name == "Hand of the Tin-Oak" and not context.blueprint then
card.ability.extra.Emult = card.ability.extra.Emult + card.ability.extra.Emult_gain
return {
message = '+^' .. '0.05',
card = card
}
end
if context.joker_main then
return {
Emult_mod = card.ability.extra.Emult,
message = localize { type = 'variable', key = 'a_powmult', vars = { card.ability.extra.Emult } },
message = '^' .. card.ability.extra.Emult,
colour = G.C.MULT
}
end
end```
If so you need Talisman, SMODS doesn’t support this natively.
i have talisman so its not that
does it not work at all or just some parts
the joker_main part works
card.ability.extra.Emult = card.ability.extra.Emult + card.ability.extra.Emult_gain
return {
message = '+^' .. '0.05',
card = card
}
end```
this doesnt
I tried this, but the box just slid off the screen
ohh right
ty
idk why it does that every time i send it to other people lol it works for me
huh, strange
you probably need a correct major
What's a major?
maybe G.ROOM_ATTACH
it's the object theyre attached to for position and animation
ohhhhhhhhh
is this not how i do it
okay so that works but it triggers for itself, would {and context.other_joker} work to have it only trigger for other jokers triggering
if that makes sense
Same effect unfortunately :(
context.other_card ~= card
in src code there are comments
Like for the jumbopixels
it also seems like align isn't doing anything
yeah it's probably not attached to anything so it can't align itself properly
idk what would work for the main menu
ohhhhhh, that would make sense,
How could I align it based on the total screen?
main menu seems to use room attach (this is for the game version text)
do arrays start at 0 in lua?
no, 1
ahh, apologies i come from vb
SMODS.add_card{set = "Planet"}
i mean most start at 0
would it be like this? context.scoring_name == 'ManoT' ?
probably needs the mod prefix
okei ty 🙂
It works!!! Thank you
do you have anything that explains the arguments for Sprite()? 
im using a CardArea to render some jokers in a ui. I don't want the jokers to be clickable/sellable/moveable, as it results in nil accesses leading to a crash (the ui is in the main menu). how do i accomplish this?
thanks!
how do I update the UIbox?
card.states.click.can = false
card.states.drag.can = false
maybe?
what do you need to update
asd
I'm planning on having text on it that switches every few seconds
you can use a ref_table and ref_value for text so it's tied to a variable inside a table
Oh! Alrighty! ^^ And it will just update when I change the ref_value?
yes
perfect, thanks so much!
Cool! ^^
Also, is there a way I can run something as soon as the run starts?
hook function Game:start_run
Oh! Ok! ^^ Thanks!
is there a way to get all the enhancements, editions, and seals from a playing card?
Could I have an example of how to hook a function? I forgot,
ohhhhh
thank you! ^^
for enhancements SMODS.get_enhancements, for edition i think it's just card.edition
for seals idk
gotcha tysm
Why does this trigger during the Intro?
G.E_MANAGER:add_event(Event({
blocking = false,
trigger = "condition",
ref_value = G.STATE == G.STATES.MAIN_MENU,
func = start_setup_run_puppet
}));
I thought it would trigger in main menu
so it woule be smods.get_enhancements(card) yeah?
yeah
is there something wrong here?
deathly ill
what do each of these return if its base enhancement/edition
ref_value should be a string to check in ref_table like ref_table[ref_value]
o
i think they return nil? not entirely sure on get_enhancements
so:
G.E_MANAGER:add_event(Event({
blocking = false,
trigger = "condition",
ref_table = G.STATE,
ref_value = G.STATES.MAIN_MENU,
func = start_setup_run_puppet
}));
no
then what?
how would one go about suppressing the animation and sound effect for a foil/holo/polychrome joker when it initially gets displayed?
--Function to return modifications from one card
function modifications_card(card)
enhancements = SMODS.get_enhancements(card)
editions = card.edition
return editions, enhancements
end
can you return multiple thungs from a function and access them by calling it like so
enhancement, editions = modifications_card(card)
G.E_MANAGER:add_event(Event({
blocking = false,
trigger = "condition",
ref_table = confition_table,
ref_value = "condition",
func = start_setup_run_puppet
}));
then in another part of the code you do
condition_table.condition = true
yes
wait, i cant do that since i dont even know when game state changes
What messages do you think this Joker should have?
how can i get a callback if the game state is main menu and then do a thing?
I was considering
if it finds no cards to draw, but I'm not sure that's fitting. I'm not even sure it should have a message in that case
But what should it say if it draws anything. Just "draw"?
How would I go about adding a config menu to my mod through the mod menu?
you can do 'immediate' instead and just let the event run infinitely until G.STATE == G.STATES.MAIN_MENU
'Reunion!'
okay guess thats what i gotta do then 🤷
that's me!

Cool art
i know right
daemontsun did a really good job with this, i'm so happy
eremel helped me with this one https://github.com/nh6574/JokerDisplay/blob/main/src/config_tab.lua
I was thinking something more neutral in case I reuse this kind of mechanic. I intended to have more though at the moment I removed most of them
Tour Guide of the Underworld was fired
Thanks, I wanna add a checkbox for custom music [=
😭
how would you make your own custom class?
!
what's wrong here 😭
what are you trying to do
solitaire
bump
what's your issue
i want to know if this code is wrong
are you defining the color somewhere?
because it isnt doing anything
i mean if it isnt doing anything then yea, something is wrong
Does nothing...?
If we knew what you were trying to do we could maybe deduce what's wrong
We cannot however divine it
its a event to flip cards when changing the enhancement
where's the rest of the code
okay, apparently trying to repeatedly queue events just explodes the whole game so uh
i tried making a delayed event but its just not working either
i just have this with the flip cards thing
function start_setup_run_puppet()
G.FUNCS.start_run(e, {stake = 1, seed = nil, challenge = nil});
end
G.E_MANAGER:add_event(Event({
blocking = false,
trigger = "after",
delay = 5,
func = start_setup_run_puppet
}));
Why you're using camelCase alongside with snake_case?
I must have implimented this incorrectly, It doesn't seem to change
this is an infinite loop
Screw variable naming conventions
you people use consistent cases
?
wait what
uh
how
i am stupid
events need to return true to end
oh...
I think it's more fair to say that
The Event queue doesn't remove the Event from the queue
Like, code consistency, you know?
config = { ref_table = your_table, ref_value = "value_inside_table" , colour = ..., scale = ... }
nah if you have time to make it consistent, then you arent using the time to make it the best..
its still not exiting?
im so confused
function start_setup_run_puppet()
G.FUNCS.start_run(e, {stake = 1, seed = nil, challenge = nil});
return true
end
G.E_MANAGER:add_event(Event({
blocking = false,
trigger = "after",
delay = 5,
func = start_setup_run_puppet
}));
It is consistent with the rules whispered by the fourth dimensional demon that lives in the back of my brain
bump :)
ohhhhhhhh thank you ^^
sound should be a variable you pass when setting the Edition
Depending on what you mean by animation, I think there's a variable too
how can i make a deck with only some specific ranks?
i see inside Card:start_materialize there's a call to self:juice_up. am i looking in the right spot?
not sure how i would go about avoiding that if so
wdym
sorry its still not starting the game i mean
why are you looking there
i wait 5 seconds and nothing happens
i dont know
where are you putting the event
uhhh just in the root of the file
----------------------------------------------
------------MOD CODE -------------------------
function start_setup_run_puppet()
G.FUNCS.start_run(e, {stake = 1, seed = nil, challenge = nil});
return true
end
G.E_MANAGER:add_event(Event({
blocking = false,
trigger = "after",
delay = 5,
func = start_setup_run_puppet
}));
----------------------------------------------
------------MOD CODE END----------------------
i think i see, im pretty sure i just pass false as the last argument to card:set_edition and it will suppress it
i dont think itll work like that, you probably need to hook something
im using the base game's set_edition
--Select 2 cards. Destroy the left, give its modifications to the right.
SMODS.Consumables {
set = 'Tarot',
key = 'spike',
--atlas = 'scadrial',
pos = { x = 5, y = 2 },
config = {
min_highlighted = 2,
max_highlighted = 2,
},
discovered = true,
unlocked = true,
can_use = function(self, card)
if #G.hand.highlighted ~= self.config.max_highlighted then
return false
end
return true
end,
use = function(self, card)
local rightmost = G.hand.highlighted[1]
for i=1, #G.hand.highlighted do if G.hand.highlighted[i].T.x > rightmost.T.x then rightmost = G.hand.highlighted[i] end end
for i=1, #G.hand.highlighted do
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
if G.hand.highlighted[i] ~= rightmost then
modify_card(G.hand.highlighted[i], rightmost)
end
return true end }))
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
card:start_dissolve()
return true end }))
end
end,
}
assuming my "modify_card" function is right, is this the right way to destroy a card?
used the code from hanged man
so do i just hook love.run or
is this not correct 😭
Looks ok
probably Game:main_menu or Game:splash_screen
hmm ok
thanks, just managed to locate it myself but i appreciate you showing me
do i need a role
you know what imma just move on to the next step
If you want to move all this stuff then yes, of not - probably okay without
here
Oh role not bond
ok here was the old function i was using
Did I do this correctly?
okay, so my mod needs to do two-way communication with some server. i could do http polling but tbh i kinda want to use websockets since its more immediate. this is insane but would it be feasible for me to just include a websocket lib with my mod and then do calls on it
no, ref_table and ref_value are for the G.UIT.T node
?
like, is there a way for me to have some .dll that my mod links at runtime and then calls ffi functions on
again insane but i dont want to shoehorn a polling system thats so laden with footguns
in the suit
im just trying to set it to the suit colour
hmm weird then
Any idea why my elseif statement here is never running? It doesnt need to run when valid_hand is true so idc about that situation
context.cardarea instead of G.cardarea
Ahh okay
I fixed that, but it doesn't change when I change the value
can i see the code
Still isnt running
ref_value has to be a string
This is the current code i have
It works!! ^^
maybe try context.after and context.main_eval instead?
yeah there is
bump
i'm creating an ace of spades for a UI using this call Card(cax + caw/2, cay, cw, ch, G.P_CARDS.S_A) but the card gets rendered with the "base" joker text on top of it. how do i make this call properly?
I'm confused, it seems like this should be putting each text item vertically, but it puts them right next to eachother
can someone help me please?
each text node needs to be inside a different row node
ahhhh, thank you ^^
that causes it to run before the cards begin scoring
that is always true of calculate, you need to put things in events if you dont want that
Then whats the point of context.after ?
the things you return in context.after are shown after the hand is scored, but everything you do in calculate before the return is done before like the rest of the scoring
How could I make a UIBox to appear above everything?
I just know it needs to be drawn after
`local icon_lc = SMODS.Atlas {
key = "icon_lc",
path = "icon_lc.png",
px = 18,
py = 18,
}
local icon_hc = SMODS.Atlas {
key = "icon_hc",
path = "icon_hc.png",
px = 18,
py = 18,
}` can I delete these and the pictures?
What do you think?
Charon
When you destroy a card, this Joker gains $2 of sell value
This Joker gives Chips equal to its sell value
ive tried looking at wiki and cant find anything
lmao
vlat
so close
the vertical cardarea is cool
bump
Galdur did it first smh my head
galdur is boomer stuff now we're all about balatro solitaire
I don't want these.
the worms
?
use = function(self, card)
local leftmost = G.hand.highlighted[0]
local rightmost = G.hand.highlighted[1]
for i=1, #G.hand.highlighted do if G.hand.highlighted[i].T.x > rightmost.T.x then rightmost = G.hand.highlighted[i] end end
for i=1, #G.hand.highlighted do
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
if G.hand.highlighted[i] ~= rightmost then
modify_card(G.hand.highlighted[i], rightmost)
end
return true end }))
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
leftmost:start_dissolve()
return true end }))
end
end,
line 30 is leftmost:start_dissolve()
what am i doing wrong here?
is there a reason a UIBox returned from get_UIE_by_ID would not be able to be removed? i'm getting attempt to index field 'object' (a nil value) but the actual UIBox that i get is able to be read out as a table so i know it's there
sprite_node = {n=G.UIT.C, config={minw=2,align = "cm",},nodes={{n=G.UIT.O, config={id='tracker_Small',maxh=0.5,object = sprite}}}}
local remove = G.HUD_blind_tracker:get_UIE_by_ID('tracker_Small')
remove:remove()
i can read remove but it errors when i try to remove:remove()
(cut out some of the setup there obv, but it does appear to be readable, just not removable. is that how i use remove()? is the ID in the right place)?
arrays start at 1
ahhhh
yeaaa... i probably shouldve realized that, it works now tho!
aiko you are actually insane
is something like this possible
it's possible, but it might require Effort
bruh no way
just tell me what to do
i think if you were to do something like this youd have to also account for controllers as they dont have the same “hover” system
there's not a pre-built system for this right now (at least, not that I know of) and I'm not about to build one for you to tell you how to do it yourself
how dare you not do my job for me 😢
😭
maybe you could hack it by adding an object that can be hovered over at those positions
🤣
i think i saw something that relates to hover events in game.lua , and you can also look at the UI lua file in balatro for that too
ui develiopment
Lars laughing at the insanity of their fellow modders
other than that i cant really give much more guidance because UI isnt my forte lmao
what can I say, I like seeing people go insane
new boss blind: just play solitaire idiot /j
lars go find a mirror while I find someone in need of help with a Paperback bug
this is literally what i was gonna do
Balatro is already solitaire though ;P
no worries, I'm already having issues with Sleeves modifying themselves because I made bad design decisions in the past
sorry I meant Klondike
literally making a new system rn for seals or “badges” in balatro and i kinda wanna make it like an api so other ppl can do it (but its legit just SMODS.Seal so idk unless i can somehow just make it way easier for people to make seals specifically for jokers)
would probably read better if it said "gains $2 sell value and 5 chips"?
honestly i like the dual purpose of this one, gives you extra scoring early game and gives you a boost in money later on
i just wish i knew how to make debug plus like allow me to apply seals to jokers with the debug command for them
It also gains Chips if it gains sell value in other ways
yeah I know
I agree it would read better but it would be less accurate
and also making these seals exclusive to jokers and a floating sprite somehow >_>
and I still think the card reads so bad it would be better to change it in the way I described
Oh are you suggesting a mechanical change?
huh, true 🤔
What do you think is bad about the wording
idk I don't like the "if A this card gains B; gives C based on B"
feels like you're making me do math for no reason haha
finally
That was the goal of the card
Also the card does the math for you
The original version was simpler since it was 1-to-1
yeah that's a lot easier already
That's helpful but my first thought is still "why"
how does ui work
I think you wouldn't like Skyscraper then
prolly not haha
but anyways if the issue is math then the issue isn't the wording
no I love that card
You do need to do a lot of math for it
hmm
maybe it's just because it feels like your card goes directly against thunk's design principles?
That is intentional though
I want to try out effects that scale with a card's own sell value
But without external sell value manipulation they don't make sense
and I don't want a lot of that
hence internal sell value manipulation
That's just alot of mods in general that go 'against thunks design'
Else he would've had all of these in the game
My first thought when I read the card was "why is this so unnecessarily complicated". Rereading it and thinking about it more explains why it's that way, but doesn't take away the original feeling that it could be reworked into something simpler
It's the type of card that's both set-up and pay-off, which kind of feels like it's a combo contained in one card
I could have just the sell value gain, and give another Joker both sell value gain and Chips bonus
I feel like the set-up here is destroying playing cards though
Do you mean how to use a colour besides the predefined ones in LOC_COLOURS?
Instead of {C:<colour-key>} you can use {V:<index>}, where index is the array index of a colour that you provide in loc_vars.colours
If you're using Steamodded, check here for how to define loc_vars -- in that example, {V:2} would be the colour HEX(card.ability.extra.colour_string)
nah the set up is gaining sell-value, the pay-off is chips based off of sell-value. The card destruction is more so the trigger. But if you separated the two effects into two different cards, you wouldn't make the set-up card the one that only destroys cards, you'd make it one that gains sell value. But I think the problem isn't the design, per se, it's that it's a design for an archetype of joker that the vanilla game doesn't have enough support for for this design to make sense without being its own enabled, I'd say
Have you read this guide?
yes
anyone know why SMODS.Consumeable would throw a nil value?
Aside of the fact the pay off is also the fact it has a larger sell value
How can the set up also be the payoff
If I'd come at it from card game design, I'd say that the sell value in that design also becomes an additional upside, rather than the core of the effect. Especially with it being a joker named Charon, I'd say the effect is probably meant to connect to the sell value the most, flavourwise, but in this case it's the middle-man (though I guess that might just be more on-flavour for this card). But the mechanical core is kind of just a side product for the eventual effect, which is that you gain chips for each card destroyed
Yes, that's is partly why I made it grant itself sell value. Partly because I was inspired by Bazaar items that both gain sell value and scale off that sell value gain.
For Balatro, I don't want to make "granting sell value" a big archetype because otherwise I'd need to rework the entire economy of the game, and that would make it both further from vanilla and possibly inconsistent with other mods.
so close
The main effect is indeed supposed to be the sell value gain. The Chips were a side-note since I both had been wanting this kind of Bazaar-inspired design, but also because destroying cards is rare enough that it seemed a bit too weak otherwise
I guess the word choice isn't perfect there, but in magic the gathering design, you can see a shift towards cards more and more often being their own enabled. This means that they have a scaling or triggered effect, and then also an effect that specifically creates the conditions to scale or trigger. In older sets, those are typically separated as 'archetype set-up' and 'archetype pay-off' cards
If each Hanged Man costs 4, you aren't making a profit out of this
I do think that's a bigger crime when the archetype exists. When there's a commander for a niche archetype, then I think it makes sense for it to be both set-up and payoff.
Like monored Food tokens for example
or if you want a real example, black-red Food tokens
Oh, neat. Do you have any examples of these bazaar items?
good enough i guess
In this case, I think the main design issue is just that your sell value aspect isn't positioned as the pay-off, but as a conversion, which feels less flavourful and can read a bit arbitrary. ("Why do I need to do math for this effect?"). I'm not opposed to anti-thunkian jokers that have two separate effects in mods, though, so I think there's space there. I think to me, it's flavour is already more apparent if instead of increasing its own sell value by 2, it increases all sell values by 1, even if it still scales chips. Just because that way it doesn't feel like the sell value is a conversion step with an upside, but like a separate effect that synergizes with its own other effect
Hi folks, I can manually set editions in the collection view using debug plug. Does anyone know what this container is called? I would like to apply my edition to all cards to see how it looks while I'm tuning shader logic
Here's a simple example
ctrl + q while govering over a card
Thanks! I am trying to do it procedurally!
OH ALL CARDS
also, just for the sake of pedantry, I think reversing the description of the effect, compared to your joker, also gives a better focus on which part of the ability matters, flavourwise
The CardAreas are in G.your_collection, [1], [2], and [3]
Perfect, that's exactly what I needed. I will share the snippet when I have it done
I think the important ability comes first
Also following the order of when they would apply causally
Yeah, that's true, it's just that in the Bazaar's case the order is a good illustrator of the flavour. But the order in this case wouldn't actually matter, effectswise, right, as one is an 'aura' and the other triggered?
I'm in agreement with Ice on possibly swapping the effects. I noticed it while scrolling through the bazaar wiki that all items have their effect written as "Does X equal to this item's value. When Y, this gains value"
Yes in terms of timing. But, again, the Chips are dependent on the sell value, so to me it makes more sense the Chips come later. Also, the sell value is more important, so it also comes first.
Chips scaling of the sell value is the core ability, though, so in order of feel, you'd put that first. And the text order wouldn't create confusion either
Man, this is the first time I feel like I'm actually at work while on discord, haha. This is like half of my conversations with clients 😋
I am trying to strike a balance between my own (MTG-influenced) wording sensibilities with vanilla Balatro's inconsistent templates. I am not above changing vanilla wording, though, and I am considering rephrasing sell value Jokers.
I need to find a satisfying template though
Personally I read the core value as the money
+5 chips per dollar feels like an added side piece instead of the sell value
I mean, I just disagree that the Chips scaling is the core ability. It's intended to be a minor bonus
the joker being together with other sell-value scaling jokers would probably help a good amount in it not feeling out-of-place to be honest
I might keep the Chips here for now but (re)move them to another design later
Then I'd just remove that part of the ability, tbf. It's also just a very negligible amount of chips, after all, if you're at the point of having a consistent destruction effect
I do think this Joker is too weak without them, and I don't want to give it large sell value gain
Yea +5 chips isn't much at all and if those +5 chips are making that much of a diff you aren't making it much further
If you have enough money for the chips to matter you can just get a better joker entirely
done.
lets goooo
Charon gets 1 or 2 coins per person after all, IIRC
I thought it was 1, but people were buried with 2, and Charon might do double river duty
with thicker deck
oh wait I'm confusing coins on the eyes with charon I think
The coins on the eyes were for Charon IIRC
if they are connected, he'd get 2 yeah
Charon's obol is an allusive term for the coin placed in or on the mouth[1] of a dead person before burial.
maybe it was in the mouth actually
Although archaeology shows that the myth reflects an actual custom, the placement of coins with the dead was neither pervasive nor confined to a single coin in the deceased's mouth.[3]
Charon is coin in the mouth mostly, coins on the eyes is a western European christian tradition that stems from it
Folk religion type christian tradition, but from a lot later at least
Charon's obol is an allusive term for the coin placed in or on the mouth of a dead person before burial. Greek and Latin literary sources specify the coin as an obol, and explain it as a payment or bribe for Charon, the ferryman who conveyed souls across the river that divided the world of the living from the world of the dead.
Contrary to popular etiology there is little evidence to connect the myth of Charon to the custom of placing a pair of coins on the eyes of the deceased, though the larger gold-foil coverings discussed above might include pieces shaped for the eyes. Pairs of coins are sometimes found in burials, including cremation urns; among the collections of the British Museum is an urn from Athens, ca. 300 BC, that contained cremated remains, two obols, and a terracotta figure of a mourning siren. Ancient Greek and Latin literary sources, however, mention a pair of coins only when a return trip is anticipated, as in the case of Psyche's catabasis, and never in regard to sealing the eyes.
would somone be nice enough to tell me why my code dosnt work :3
so yeah I got them confused
catabasis mentioned
there is no crash
Placing coins on the eyes I think also came from the practical use of it keeping eyes shut
ill send a ss of the problem in a sec
well its hard to send a ss but basicly the joker works but it vibrates when cards are scored
Thank you Victin!
If anyone else needs to do this,
function forceEditionCollectionView(s)
for _, jokerCard in ipairs(G.your_collection[1].cards) do
jokerCard:set_edition(s, true)
end
for _, jokerCard in ipairs(G.your_collection[2].cards) do
jokerCard:set_edition(s, true)
end
for _, jokerCard in ipairs(G.your_collection[3].cards) do
jokerCard:set_edition(s, true)
end
end
Then you can use it in the collection, just run eval forceEditionCollectionView('holo')
just don't return true
Something I think I've seen mods do is give a relevant Tarot when a card is bought
though you should probably have the joker creation be in an event (of which the end of the event needs to return true)
Which I think is cute but I don't like the design
ah that works
attempting to make my first consumeable, little lost here if someone wouldn't mind giving me some advice
Feels too much like doing something unrelated
well i dont know how to do that and the code works currently soo... dont fix what is barely working
Thunk's misspelling of consumeable strikes again
Consumeable over consumable
you can check the code for riff-raff if you want
Lars faster than me
Curse my slow mobile fingers
anyways thanks @tepid crow @hushed field @modern kindle for the feedback. I'll keep it in mind at some indeterminate point in the future when I come back to this
honorable mention to 'Caino' lol thanks
gluttenous
True, but instead of giving the answer I made a stupid joke lol
oops
wrong reply
Now we can all sit at the table and eat some cake
glutteous
what nil do change to change the random jokers rarity?
i think if you put nil, it just does the vanilla method of polling rarity (common has like a 70% chance, uncommons have like a 20%, and rares have a 10% iirc)
if you want it to be a specific vanilla rarity, you put a number between 1-3 (there's a parameter in the function specifically for making legendaries), and if you want it to be a modded rarity, you just put the key for that modded rarity
so if you wanted it to only be commons it would just be 1, if you wanted a modded rarity that had the key mod_epic you just put "mod_epic"
like this
yes iirc
k lemme test
I love this!
but also I would reccommend that you try using SMODS.add_card(t) or SMODS.create_card(t), as those make it much more clear on how to make a joker
Those emojis! Lol!
it in fact does not work
It is a yugioh reference. I am trying to give the cards also a sharp rectangular golden border, like the Maximum gold cards from the game
I gotta say that looks great visually @quartz ravine
I also just really like gold and black together
lets goooo
Thank you, I have been working on this one for...so long
btw this is just a nitpick but for the $2 part off your description i would use {C:money} or {C:gold} to make it look more like a vanilla description :3
Don't worry, I've decided I'll take credit so it's off your hands <3
(I am joking)
This is how the 0x does it in game
ease_dollars(-G.GAME.dollars, true)
0x?
ok
the ox boss blind
ahh ok
i think it's much more "safe" to use ease_dollars than to modify money directly, so using this solution is much better
yeah
technically you could modify the money variable directly but if there's a function to change money i would use it lmao
how can i retexture a joke with a sprite that has a higher resolution than the normal res? are there any guides anywhere on how to do this?
Does anyone understand how / why shaders don't apply to foreground objects in legendaries?
for some reason, my shaders do overwrite the foreground.
This must be something in send_vars for legendaries, I bet I don't handle it
my problem has been solved but it was buggy and then i fixed it with return true and now it shakes again with each played card but if i dont return true it breaks
oh god, save yourself, get out while you still can
How do I check if the player is currently in a specific booster pack outside of contexts?
I've tried G.STATE == G.STATES.[cardtype]_PACK and it isn't working
that was gonna be my suggestion
but it depends on the pack
which pack specifically?
Any of them, I'm making custom music, and I made a track for every base game pack rather than just default and celestial
So G.booster_pack_sparkles isn't really an option
It isn't playing the music
This is my current sound hierarchy
Everything plays properly except for the specific booster pack tracks
The default booster pack does work properly
have you tried printing out G.STATE?
ah that's SMODS' state for boosters
How can I get the proper state?
I think you can check SMODS.OPENED_BOOSTER to see the pack-type?
some sort of .config.center.key
I used this method and it worked, hell yeah
I love how the sounds play faster and faster! I have one Joker that's an easter egg Akuma reference, and he says 'METSU', well when he retriggers over and over and over, it becomes hilarious
How do I save a value between restarts? I don't want people to have to turn on my music every time they start the game
config files are your friend in that case
most mods with customizable configs can show you how they work
should be automatically saved/loaded if you use the default smods config method
hi doods, can I use take_ownership to modify a default joker? I made a goldish card and I want Gold Joker to also apply to them
the text of these are like umm
isn't that one of the main reasons take_ownership exists?
how do I fix this?
Hearts, Clubs, and Diamonds' text are weird
What method are you using to change their colors?
Are you using somebody else's mod to change the suits?
yeah. but it is just the cards in the deck.
I'm confused, are you coming here to try and fix the text colors on somebody else's mod?
they should be the color of the suits on the cards, right?
what one do you guys prefer
Yeah, but you should contact the developer of the mod for that
I like the second one, maybe add a light to dark gradient on them to make them more visually interesting?
sounds good
um... I forgot who made it...
Look up the name of the mod itself in #1209506514763522108 and you'll probably find the original poster
This is mostly a channel for people developing mods themselves
Steamo did? I think? I don't know.
Whoever it is, report the bug in their mod post
After blind defeat how can i change the next sceen to a different one
I don't remember the name.
examples-master?
Is the mod from the SMODS examples?
Is this it?
what should be in there?
You just downloaded all of the example mods?
All at once?
Those are meant to be references for mod developers
my deck was in there then I deleted it because it is in the mods folder
And those aren't the same skins from here
I don't know where you're getting these skins from
Okay so you are developing a mod
yeah.
Why did you say it was somebody else's mod and you didn't know who made it then?
the texts are the wrong colors, though
And you don't know where the colors of the suits are set?
colour = HEX("9734f0"), Is it this?
Look up 'Spades' in your mod file
Yes, that is your mod file
Have you looked at the SMODS documentation at all?
You should do that
https://github.com/Steamodded/smods/wiki
First name jumpscare.
How can i make my joker texture work?
I'm trying to get it onto the second joker i made but nothings working and its a blank image
Okay, look at the other suits in that file
What's your atlas code?
they are all the same hex code.
Then change that
do you need to put the hex code in the low contrast settings in addition to the high contrast ones?
atlas = 'Jokers',
pos = {
x = 0,
y = 0
},
i tried to change x and y to get it but i dont know what values i should even put in
everything i did was blank
Do you want a custom joker texture or one of the default ones?
I made a custom one
Did you make an atlas?
like this one?
SMODS.Atlas{
key = 'Jokers',
path = 'Jokers.png',
px = 71,
py = 95
}
I put the hex code in there and it works
Alright, in the joker you need to do yourmodprefix_Jokers for the atlas
And for x and y it's just the position in your atlas grid
So if your joker is in the 2nd column and 3rd row of your joker texture you'd put in x = 1, y = 2, because it starts at zero
For example this is my joker texture, if I wanted to get that 4 color one, I'd put in x = 2, y = 1
do you? i just put the atlas key in my joker's atlas = ... and it worked
my prefix is csmr
does the spades text and the spade color on the card, match?
Oh, nevermind
I just put the prefix for my mod also in the atlas name
You don't need the mod prefix, just name your atlas with a unique identifier
does it or not guys?
That's for you to decide, that's not really mod development anymore as much as it is design, which would work better in #⚙・modding-general
If i wanted to have a joker manipulate the weights of consumable cards, what would be the best way to go about that?
Or at least a good place to start/any known examples of mods doing this
compare
First one is cursed
And the second one triggers my OCD
@last sentinel Because it's not pixelated compared to Balatro's cards
You mean it's less pixelated? I can still see pixels clearly on the first one
gang how do I get this to show up as +1 hand size and not +1 joker slot
I think those are 2 different tooltip keys
lemme check steamodded
noice noice
trying my hand at making a new seal, thus needed a consumeable to have it useable (also first consumeable) game crashes upon using the spectral card and I'm not sure why
is there a way for me to change the base chips granted by a card?
I guess two parts to this question, how do i access the base chips of a card, and then how do i modify it
could try looking at hiker
context.other_card.ability.perma_bonus = context.other_card.ability.perma_bonus or 0
context.other_card.ability.perma_bonus = context.other_card.ability.perma_bonus + self.ability.extra
this is what hiker does
I'm guessing it's because you're referring to your wseal externally (SMODS doesn't know for sure which mod is running this code), so you'll need the full key of your seal?
what i want to do is x4 the base mult, im not sure how the code would change here
instead of + self.ability.extra it would be * card.ability.extra.bonus ? (assuming bonus is where i have the x4 factor)
is 'wseal' not the full key?
How do I define Blueprint behavior?
No, it's hidden and a bit confusing. You give your smods objects a key. To avoid key collisions, smods prepends the type and your mod prefix to it, and saves that as the real key (and a copy of your original key is stored at original_key).
The full key basically boils down to [type]_[mod-prefix]_[original-key], e.g. j_lars_jimbo for a joker (j) from a mod with prefix lars and original key of jimbo. See #💻・modding-dev message for some more examples.
any chance its as simple as 'S' when referring to a seal instead of 'j' for joker?
I'm actually not sure what the prefix for SMODS.Seal is, let me check that
for future reference where are you checking? I didn't see anything like that in the github for making a seal
good question
well I shall science in the meantime then
can i not make animated sprites by creating an ANIMATION_ATLAS and making that the sprite? 
it probably won't be in the docs, so I checked the source code (I ctrl+f'd src/game_object.lua for prefix) and found these lines of code https://github.com/Steamodded/smods/blob/main/src/game_object.lua#L71
The answer is they do not have one.
(it caused issues with taking ownership of vanilla seals).
Just the mod prefix, no class prefix
but yeah SMODS.Seal does not have a defined class_prefix so... what flowwey said
modprefix_wseal then, okay fingers crossed that works
yeah that sounds about right
holy hell everything works
I was fully expecting to have to work through the rest of the code if that fixed teh crashing lol
Thanks to you and your wrinkly brain
bump
I'm pretty sure you change the nominal.
wdym
The nominal is how many base chips it gives, its located at card.base.nominal
amazing i think this is exactly what im looking for
thank you
hmm
it didnt seem to work
this is what i want to do
i want the card to give x4 its base chips
so for example is the enhancement is on 5
then i want to give 20 chips (but not the original 5)
You would use context.other_card.base.nominal
let me try
do i need a different context?
Compared to Balatro's cards
Everything on a screen is pixelated
anyone know why this would give me 2 spectrals when I have 3 "oops all sixes" in my joker line?
trying to only get 1 lol
It's not a problem of chances, that function is running twice for some other reason
You should be doing create_card('Spectral', G.consumeables)
That too
what would that change?
I'm not sure.
looks like nothing changes when I add the G.consumeables to the create_card
What is the intention here?
for the joker to create 1 spectral card at end of round?
Or for each card held in hand to be able to create one
Oh wait, it's a seal
intention is 1 in 8 chance for it create 1 spectral if the card with the seal is held in hand at the end of round
blue seal but for spectrals and chance based to make it hoipefully a little more balanced
trying to manually animate a sprite with the event manager since setting the atlas_table in the SMODS.Atlas() to 'ANIMATION_ATLAS' isn't making it animate
but for whatever reason, it's causing a crash with a variable that i have checked exists at this stage of processing via ``print(tprint())`
kinda stuck
oh i'm a dumbass
wow
how did i not see that
and now it works
Not super familar with scripting
this seem like a simple enough design to try to do?
Try adding context.other_card == card in your condition
if that doesn't work try adding and context.playing_card_end_of_round and removing the not repetition check
I love undocumented stuff
Yeah this seems very doable
coolio
in addition to the context.other_card?
How does one draw a shader onto a deck?
that worked, thank you, any ideas why I was getting multiples (3 if I had omen globe) with the other method?
I think it was running that function on every card held in hand
I thought that as well and reduced hand size to 1 to test lol
did it change anything?
nope still filled my consumeables
I guess it's possible it was still running multiple times on your card
but i'm not too sure
What if you put it in the event manager?
that wouldn't have fixed it, that would've just made the consumables take longer to spawn
possible the spectral card put the seal on multiple times?
if i return false from an event function, how can i create a (controllable) delay between that function execution and the next one? since doing trigger = 'after', delay = seems to only apply to the first execution
delay() in the function also doesn't seem to work
screw it, i'll just make it even more scuffed
How could one draw a second seal on a card?
Is this a stupid idea or
yes
But is it funny
agree
Then im doing it
fair
Q. is the ideal reason for using a fuction for if its like creating a tag or somthing like that
bump
can u re send this with the line numbers
gimme a sec i need to read this
i think the problem is that on line 21 u have context.thingy
u might just needto do value 1 = valie 2 x value 3
with out context cause context is for somthing to happen but not for a value
i have to go for dinner now
context.other_card is the same as a playing card. It has playing card values.
im new to coding so i still dont exactly know what im talking about but im trying
any gtg brb yell at me later
but its not able to access that context
Try using self
okay one sec
What object is this?
enhancement
self.base.nominal
whoops didnt send line numbers again
here
it basically just cant find the base thing
not sure why
send a larger screen shot of the code
Did this give a crash?
no but it doesnt do anything
Try printing the nominal before and after changing it using card.base.nominal
okay one sec
interesting
so it does change it
but it does not score
so its changed for future use?
Try scoring it again.
yeah i did
it does score on next time
how do i make it score on the current hand
Just make the enhancement give the same amount of chips it should give.
it'll look inconsistent since im only upgrading it once, so for future scores it will automatically give it
function Card:get_nominal(mod)
local mult = 1
if mod == 'suit' then mult = 1000 end
if self.ability.effect == 'Stone Card' then mult = -1000 end
return self.base.nominal + self.base.suit_nominal*mult + (self.base.suit_nominal_original or 0)*0.0001*mult + self.base.face_nominal + 0.000001*self.unique_val
end
``` this is the code for getting the value
i suppose i could hook the function
i want to add a new cardarea, like the areas for jokers and consumables. i want to make a custom one of those. does anyone know of an example i could use for adding this? like another mod that has accomplished what im looking to do
Baladrone.
yea that sounds about right, i was using that one i just wanted to check if there was another one someone would suggest. but given how immediate that response was im going to assume baladrone is what im using here
Are there any mods that draw a seal like object on a card?
Is it possible to remove pixels from the sprite of a card using a shader?
I wanna make a sticker that makes it look like the card is torn and degraded, but still allow enhancements and editions to appear
does anyone have any material for me to learn about info queue
Well that looks pretty nice, finally figured out the implementing all the textures. Now to actually make some sprites.
Any thoughts or suggestions
Or what other mods and additional suits
The "SixSuits" textures are just like that so far just recoloured the suits and put some of the vanilla collabs as options in some of the modded ones
I haven't actually gotten around to doing the sprite work yet
So the star is from a different mod?
Yes
Ah, alrighty
Color wise, I think the yellow should be slightly darkened
Fully saturated yellow on white doesn't tend to read well
Stars and moons are from "SixSuits"
Fleurons and Halberds are from "Bunco"
That's true I should make it easier to see
So far more of a proof of concept to add some textures to a couple modded suits
I haven't seen any so I thought I might try to make some
Also the gradient for the crescents looks too dark at the bottom, I think making the bottom of the gradient the current color of the top of the gradient and making the top lighter would fix that
Notice that the black is darker than any shade of black in the base game
Good point
Here's a good guide for spritework for Balatro
https://discord.com/channels/1116389027176787968/1250386587691388989
I'm more looking for suggestions for things to actually put on the cards(character and crossover kind). The current textures are more placeholder than anything else.
btw all i had to do was change the context to before
and it did exactly what i wanted
lol
no reason to hook
hello chat 
@sturdy compass hi
i set these as all the ranks correctly right
Another Yu-Gi-Oh Jonkler has hit Maximus
When working on a Deck, how can I access current chips/mult to change them? Seems like the way that core-game Plasma accomplishes it doesnt port to SMODS well, or mayhaps im the fool
hand_chips and mult are two global variables that hold the current chip and mult values
Aiko I have no idea
ah, doesnt require the context then? (not context.hand_chips?)
nope
I think this commit for the card is funny
looks a bit chonky but that might just be me
how do i check if card is on certain card area when being dragged
It does look chonky lol
as in
i want to make it so that the card goes to a different area when you drag it to a different area
aiko you are doing some advanced bs so I don't know if anyone would have a clue LOL
😭
i think they should add mult to balatro
no stream tonight i have to work
development tomorrow? 
yep
no way
development yesterday
😭
aight.. man..
girl 💀
Is it still context.final_scoring_step for Decks?
If you want an effect that happens with the same timing as Plasma then yes
hmm alright
You can use literally any other context with Decks. They calculate all the same
thats what i had figured, I have a print statement right after that if and its never getting ran
What functionality are you after?
why is it nil?
me when loc_vars
Pretty much just a plasma deck clone but just a different math operation on the chips/mult. Just ran it again and it seems like my calculate function is just never being triggered
nevermind lol
Can you show your code?
how do i do that random rank thing mail in rebate does
i have a rng variable to generate a rank now i just dont know where to go througgh with it
not sending the rest of the calculate cause rn its just plasma's animation and not gonna post core game code. But yeah neither of those prints ever get called, played through a few antes on the deck and its there visually but not doing the calc
No i dont know why i have name both inside and outside of loc_txt lmao
Are you checking through G.playing_cards?
im currently going through card.lua to find mail in rebate
Do you have the Lua extension for VSC? If not, I highly recommend grabbing it because of how much it aids in debugging. There could be something missing somewhere that VSC isn't picking up without it
nah but ill go figure that out, would def save me a lot of time lmao. would that prevent calc from even running tho? I'd think syntax would prevent the deck from even be playable but it shows in game fine. happy to be wrong tho
You'll want this
like, installed?
Lua can be a little loosey goosey sometimes. It's probably not the case but better safe than sorry
Oh my god I'm so sorry I had the wrong thing copied
what
oh
That's what you want
yeah still never getting those print statements called
using "if context.blueprint" or "if not context.blueprint" in the calculate function
so i should make a config.lua and add that?
sorry im too dumb rn
No. You should be creating this function in your mod's main lua file
oh
This is the only important bit for what you are trying to do
I just noticed, why is your entire block wrapped in parenthesis?
Hm thats how it was on one of the other mods i was looking at. Just tested and no difference with or without it
That's a weird one, never seen that before. Interesting to know it works all the same
Loosey Goosey even
oh shiz
Oh?
Hmm, that's pretty recent. Not fully up to date but not to a point where it shouldn't be an issue I don't think
worth a shot to update tho
yeah still no dice
Thought so :/
hhi
I had this code working successfully in a challenge instead of a deck. I was running it with Back:trigger_effect in the challenge and it worked great (other than the fact that it nuked Plasma Deck 😬 ). But ideally i have it working in a deck
Ok I just had a closer look at the SMODS.Back docs, your if check should be if context.context == 'final_scoring_step' apparently
Or does it?
Ok I'm insanely confused
Yeah.... I had that initially and it wasnt working. Made a few other changes since then so worth another try
You did say calculate just straight up isn't being called right?
Unless i REALLY dont know what im doing then yeah. Neither of those print statements in my code are running. But, the deck exists and is playable in game(other than the fact that it does nothing interesting)
apply is only for changing the deck pre-game, and trigger_effect is depreciated yeah?
Yeah that is definitely right
omh hiii
hi aiko
🙅♀️ 🎲
am i insane
I'm desperately looking at the function definition itself to see if something's up but I truly cannot see anything wrong
yes
I spelled calculate right and everything
did not know boosters still had the 71x95 res.... learned that the hard way
added all the relics, the process wasnt hard but insanely boring 💔
Yeah you did. That's why I'm pulling my hair out in your place 😭
I appreciate the solidarity
context.context?
It's old depricated stuff apparently, dw about it
ok i just need to find where G.GAME.current_round.mail_card.rank is
cause the crash im getting now is saying is its nil for my joker
ah ic
and like.. the deck shows up in game with the name and loc_txt correctly... maybe ill put in a dummy apply function and see if that works
that is bizarre
oh that goes in main righht
Something tells me you are not doing things right I cannot lie
there shouldn't be a comma after 'test b'
maybe
Lua doesn't care about hanging commas
oh
hey, ill try anything
without the XMult part this doesnt even look like smt from balatro ngl 😭
theres some readable text on there i think you should change that
I'm just confused as to why you're trying to do stuff with the mail_card variable
im trying to reference rebate but thunk wanted to cosplay the easter bunny apparently so now im scouring fucking narnia for the relevant code
because im mmakingg a joker with a similar function to rebate
You don’t need to use mail. You can create your own variable
i am
to balatro