#π»γ»modding-dev
1 messages Β· Page 571 of 1
info_queue[#"Info"_queue+1] = G.P_CENTERS.tag_ethereal nothing appears
tags arent centers
also why is it [#1116390750314307698](/guild/1116389027176787968/channel/1116390750314307698/)_queue+1
WHAT THE FUCK
it should be info_queue[#info_queue+1] = G.P_TAGS.tag_ethereal
starnge, my discord shows [#1116390750314307698_queue+1] but the code appending is right
Discord being discord ig
yeah because for some reason discord decided it should be a channel link
depsite this server not having a channel called #1116390750314307698 π
Discord is weird
I'm making a joker that turns into another joker, is there a way to make it keep the editions when it transforms? Because right now I'm just using add card and destroying itself so not sure how to make it work like that
does that really work?
preserves everything but changes it from the joker it was to the joker it should be
I see
normally used for like enhancing playing cards most of the time but it works with any card
thx
what is getCard here. is that like a mistake or is the function just funny like that
Im am playing a discontinued mod, that have a spelling mistake, for colour. I have a hard time figuring out where i need to change the mistake. Can someone help me get in the right direction?
you can use ctrl+shift+f in vscode to search in the entire workspace
or since its almanac you dont really need to since its all 1 file for some fucking reason
i mean ultimately i would recommend you just stop using mods that are discontinued
the balatro modding scene is quite harsh to mods that do not keep up and well ,,, almanac isnt exactly known for it's extreme high maintainence
i mean its not in jen.lua
I was under the impression that it was in jen.lua. Where else could it be?
No, that's how it's spelled.
the crashlog tells you precisely where the error happened
the main issue is usually it doesn't actually go wrong there, it just becomes enough of a problem that it crashes at that location
it is either in jen.lua or the toml file for it i'd imagine
Okay it might be a bit more obscure than i anticipated. I have found this from the mods discrod.
what might be causing this crash?
if SMODS.calculate_round_score() > 0 then
oh it might be Talisman
lemme disable that
Yes, you need to update it.
how can I make a function for a voucher that makes all booster packs in the shop cost 1$ less?
I've seen how clearance sale does but it does it with a percentage and goes through all the elements in the shop (which is not what I want)
Hook Card:set_cost()
ok so I already did that and put on a check for if the self.ability.set == "Booster" but I'm not sure what should I put inside the check
self.cost = self.cost - 1
hold up, I just noticed it still doesn't work
Hello everyone
Move the hook out of the voucher.
Also you need to run the old function first.
Also you need to do for k, v in pairs(G.I.CARD) do v:set_cost() end in an event.
Also you should be using SMODS.change_booster_limit
aight so to make movable numbers i just need to edit DynaText it hink
p sure that isnt used for JUST numbers tho
that event should be inside the hook function right?
No, it would be in redeem
aight
That would cause an infinite loop.
Who can help with one proplem?
When I open the pack, I get a crash. I suspect that the map from sixsuit is causing the crash. And since I forked it, I need to figure out if this is true.
Anybody have
ideas?
question: how can I make SMODS.change_booster_limit not increase the limit of booster packs every time I enter in a shop?
No, SMODS.change_booster_limit(card.ability.extra.booster_size)
aight
This, joker from sixsuit, his convert into moon suit
But i dont understand whats wrong
hi, im looking into doing stuff using SMODS.Achievement, but where would i find the achievement list in game?
https://github.com/Steamodded/smods/wiki/SMODS.Achievement
ive never done balatro modding before
it's in the mod's menu
once it adds achievements
do you know of any mods which add achievements?
i checked cryptid but i dont think theirs are implemented
like theres the achievement.lua file
oh wait i see it, i just didnt check the right place lol
does anyone know why this hook isn't doing anything?
wait i'm dumb
i'm setting cost instead of sell_cost
am i missing a part of documentation or something?
im looking at the example mods for steamodded
SMODS.Keybind{
key = 'broke',
key_pressed = 'p',
held_keys = {'lctrl'}, -- other key(s) that need to be held
action = function(self)
G.GAME.dollars = 1
sendInfoMessage("money set to 1", "CustomKeybinds")
end,
}
that G.GAME.dollars, i keep seeing other stuff with G. at the start, is there anywhere i can find all of them?
nvmd still not working
are you calling set_cost on the card
also the sell value is card.sell_cost
i noticed that last bit at least
you can find some here
https://github.com/BakersDozenBagels/Smods-Wiki/blob/g-documentation/G.md
but there isn't much documentation of things outside of smods, you might want to look at the code for the game instead
ah ok, thank you
i havent used much lua so im sort of learning it as i make this
so how much of the main games code id understand is limited but ill make it work lol
i also recommend this if you haven't seen it https://github.com/nh6574/VanillaRemade/wiki
weird, seems like it should work if it's being called
gonna run a few more tests
found it
self.ability.extra.mult * self.ability.extra.value returns 0
i think it's bc it's being called before value gets set
making a joker rn which destroys itself after a while and turns into a different joker. how do i keep track of the enhancements and make sure the new joker spawns with the same ones?
that return im pretty sure doesnt work
so ignore that
don't do that
can't u just set_ability?
do card:set_ability("other key")
tho u may need to do a few more things to update the cost and stuff
wdym exactly
what i sent
well yeah but what will that do? is it replacing the whole destroying and spawning code?
yea it turns one joker into another
yes, it changes the card into the other card keeping everything
the biggest problem with keeping track of enhancements outside of that is that stickers are a pain
yeah
ok, so ive tried making an achievement, but it doesnt fire? do i need to have anything extra or would just having this be enough?
SMODS.Achievement {
key = "10dollar",
loc_txt = {
name = "$10",
description = {"Get $10"}
},
bypass_all_unlocked = false,
unlock_condition = function(self, args)
if G.GAME.dollars == 10 then
return true
end
end
}
like that is my entire .lua file
how do i add joker enhancements through debugplus again?
You mean editions?
CTRL + Q
thank you
how can i detect if a hand has only 2 suits?
does a card being legendary automatically lock it to soul's pool
yes
How hard would it be to implement quantum jokers
wdym
hmm sounds hard , youd need to figure out what abilities to merge
and how would you name them?
like quantum enhancements?
how would you handle joker config values though
the main problem would be when the jokers read from the same config value
That was my first concern
quite a few jokers store mult in .ability.extra, for example
i think sdm was doing something like that
sdm has a version that works, yeah
π€
you can also reference pinkprint in ortalab, that's sort of similar
did i miss something during my 1 day of inactive π
pink panther
Yeah you missed nothing actually
You could iterate over context.scoring_hand or context.full_hand (if you're in joker_main for example)
And I believe there was a :is_suit() thing
Hey look what I'm cooking for UI enjoyers
a ruler??
Exactly!
cinema.png
I it okay if I'll make mod config accessible only via debguplus console?
Since it's only dev tool...
alr
You should make DebugPlusPlusPlus
btw does scoring hand mean that the card is scored?
Not interested in such complex task
and if its not scoring hand then does that mean its checking if its not scored?
context.scoring_hand is the scored cards yes
i sea
ok wait i think i found an interesting solution to get a number of unique suits in scored hand
and i have no idea if it works or is there a better way
isnt it just grabbing from card.base.suit and some basic comparison
π€
if context.joker_main then
local suits = {}
for _, playing_card in ipairs(context.scoring_hand) do
suits[playing_card.base.suit] = true
end
print(suits)
end
thatd work yeah
how do you make a deck force every card to have an edition?
How to make calculation for joker which give a each played card a random enhance?
this won't work with wild cards
damn it
you would need to keep track of those separately and assign them to new suits after
I have a question regarding a deck effect I am trying to make. I want to create a deck where cards that get discarded trigger their end of round effect (for example gold cards would give money on discard)
I am overriding the discard_cards_from_highlighted method to call the smods calculate_end_of_round_effects method for the highlighted hands. However, the effects don't seem to trigger.
local ref_discard_cards_from_highlighted = G.FUNCS.discard_cards_from_highlighted
function G.FUNCS.discard_cards_from_highlighted(e, hook)
local r_val = ref_discard_cards_from_highlighted(e, hook)
if G.GAME.starting_params.yorickdeck then
local hi_list = { cards = {} }
for i = 1, #G.hand.highlighted do
table.insert(hi_list.cards, G.hand.highlighted[i])
end
SMODS.calculate_end_of_round_effects({ cardarea = hi_list, end_of_round = true }) --iterates through cardarea.cards, which is why I don't use G.hand.highlighted directly
end
return r_val
end```
One thing worth noting is that the method works correctly if I use G.hand as the cardarea instead of creating it from G.hand.highlighted, but the issue is that it triggers cards that aren't being discarded as well (which I don't want). What difference is there between the cards in G.hand.highlighted and G.hand.cards that could cause the different behavior?
Or is there a potentially better method to do what I am trying?
the cards specifically check for G.hand
does SMODS.scale_card work with talisman?
does it rotate?
how do I get a playing card's chip value
i know about extra_bonus but i also want to get the base chips
and also change them if possible
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
I'll do this rotateable
Maybe even display more than one at the same
And maybe even anchor them
Not sure
Rn working on this
do you mean retrigger it
did you solve this
No, I mean rescore, and no.
Like retrigger retriggers
card:get_chip_bonus
jokers don't "score"
is this for its base chip value
that's for the total
the base is probably in that function too it should be the nominal i think
I wanna change the base chip value of the cards
to 0 to remove it i'm making a card that absorbs chips
so base.nominal then right
well that function would obtain the base chip value maybe i havent checked yet
but would it be safe to use that to change it
A new utility mod called rulers just dropped??
In progress
Obvious continuation
No
bummer
π₯Ί
Now - yes
Can you change the color
I just wanted the horizontal one π€£
Yes
Can you make a toggle to make it spin like a propeller

Or make a chorma-style toggle (like a color changing thing)
I can but... why?
Funny
Will rename to rulers_dir
Makes more sense
what's the scale?
1 pixel
Maybe should make scale aswell
If you mean between lines, want to make them configurable too
rn you see 1, 0.5 and 0.1 for big, medium, small respectively
(in game size units)
ermm
How's your config looking?
yeah was just wondering if it actually represented in game units
That's the whole point
How would I make it, so that a locked description changes after a specific consumable gets used?
ouff
Hmmm what are you cooking good looking ?
For ui ?
okay what the fuck?
Sounds like a great tool
stop hiding 
Syntax error probably
did you make sure to restart the run or recreate the joker card after adding config values?
they're stored in the card on creation and saved in the run file, so if you add a value mid-run, it'll still use the old saved config table
how do i reference a specific joker?
Never develop commands before, so
j_modprefix_jokerkey
How to make calculation for joker which give a each played card a random enhance?
bump
β
Holy sh, this works!
uhhh whys the sound not playinggggg
is prefix case sensitive?
It should be the same as your modprefix
use locked_loc_vars to have it use a different key after the consumable is used
Defined in metadata
yes
So I would write all the text in locked_loc_vars and just put it into unlock with #1#?
no, just return a different key
What? Can you give me an example, please?
you can return key = "string" in loc_vars to make the object use a different key from your localization file (it will use the key you returned instead)
hey chat i'm struggling with math again
how can i make a sound play when xmult is applied?
add sound = <sound key> to the return
thatll replace the default sound
Return sound=soundkey
Sounds are defined with SMODS.Sound
You can find more on that in the wiki
So I would do the following and then just return the key for them?
name = "{C:cstorm_astro}Aries",
text = {
{
"{C:attention}Saves you if the blind requirement",
"is not met at the {C:attention}cost of a random joker"
},
{
"{s:0.8,C:inactive} No Jokers, no saving"
}
},
unlock = {
"Find the corresponding {C:attention}hint card",
"to know how to unlock this card",
},
},
c_cstorm_aries_hint = {
name = "{C:cstorm_astro}Aries",
text = {
{
"{C:attention}Saves you if the blind requirement",
"is not met at the {C:attention}cost of a random joker"
},
{
"{s:0.8,C:inactive} No Jokers, no saving"
}
},
unlock = {
"Text bla bla bla",
},
},```
yeah
Okay, gonna try that
if you want to make the hint stay permanently after youve used the consumable on the save youd probably have to do some extra shenanigans to store it in the save file
That's actually so damn good
today I learned balatro sorts cards by ranks by using the base nominal value
what,,,,,,,,,,,, how..
Do you know how I would do that?
Β―_(γ)_/Β―
but it's doing that
i can tell because it moves all the ones with 0 nominal to the right
which is cool to have
where do i put this?
Wait, how do I even know when a specific consumable got used? OwO
check for it in context.using_consumable in the global mod calculate
And how would I make the if statement in locked_loc_vars know that then? By using G.GAME?
how would I bring all the discarded cards back into the deck
G.GAME is tied to run saves, you would have to store it outside of there
How?
wdym how
π
How/where specifically do I store it then? I've never stored anything outside of a run save, iirc
also is there a way to shuffle the deck
literally anywhere
as long as you can actually access the variable then nothing matters
Wait, as a global?
yes
Okay, sorry. I'm stupid
what else would you store it as π
i mean you could also store it in G i guess
how change vanilla rarity rates. i forgor
Is this good explanation?
whats the difference between -s and the big value of -st?
where's the | Enable Helicopter Mode
makes sense
are you actually developing one of those mods? if not, then consider reading the message in the crash log
fork, not dev
I know when it crashes, but I don't understand why.
so you know the crash is actually caused by the fork
looks like some sort of bad loc_vars function
I made -s to be actual size
the booster_choice_mod or whatever a thing yet or did i just make that up
why are my text input boxes aligned to the left when i put align = cr?
(this is in SMODS.current_mod.config_tab btw)
local config_nodes =
{n=G.UIT.ROOT, config = {align = "cm", colour = G.C.L_BLACK, minw = 4, minh = 4}, nodes = {
{n = G.UIT.C, config = {align = "cm"}, nodes = {}}
}}
config_nodes.nodes[1].nodes[1] = create_text_input{
prompt_text = "...",
max_length = 12,
all_caps = true,
ref_table = SMODS.current_mod.config,
ref_value = "up_keybind",
align = "cr",
callback = function()
SMODS.current_mod.config.up_keybind = SMODS.current_mod.config.up_keybind:lower()
SMODS.save_mod_config(SMODS.current_mod)
end
}
-- It's just this four more times...
return config_nodes
Then I see(in pack or somewhere) Appears Moon?
what?
Moon?
It is joker from sixsuits
ok no this isn't working
chat i need help moving all the cards from g.discard to g.deck
Yes, Then it taro Appears
moon_suit.key is not a thing there
you need to put just the actual key as a string
There
does SMODS.Suit actually return the table it was given?
can you call G.FUNCS.draw_from_discard_to_deck()?
because if not that does nothing
you can do that???
how do I make it do that for all the cards in the discard
does it do that on its own
it does that on its own
that's awesome
Sixsuits works normaly.
Except this moment
Anyone know how to save something into the save file?
did you
read what i said
about what youre doing not working unless SMODS.Suit returns the table it was given
This taro works normaly
where is star_suit defined?
it's not doing it for all the cards
it's doing it for some of them? but it's leaving some of them behind
it makes sense that it would be leaving the cards in the played hand that trigger the effect
but idk why it's not bringing back the other cards
for some reason it always leaves like 10 cards
what fi i just call the function twice
Just a moment
ohh my god
bump
it's not leaving cards behind
the cards are held in your hand
i'm so fucking stupid
i replace everywhere
background colour should be in the vars table
loading
do i need a prefix for achievement localization
what are the variables that change the options/choices in booster packs called again?i thought they got added at some point but i forgot their names
ach_modprefix_key
ty
Maybe I just send I code?
they're in the last release notes im pretty sure
not being able to link to headings in discussions is dumb
what function would I hook to set the value of everything
is it safe to do this with card:set_cost()
bump2
check yggdrasil they do it
save into G.PROFILES[G.SETTINGS.profile]
bepis have you beaten the getting_sliced allegations
@slim ferry
What do you say?
im still studying
i will push a PR to fix that later
idk it looks fine
I thought about rewriting the code and dividing it into files, but I don't have enough knowledge yet
Watch it explode
I need to debug somehow
use debugplus
press tab
And nothing....
hold it
??????
Your file uses the header function(self, card) for loc_vars, which is outdated. It should be function(self, info_queue, card) instead.
does anyone have any idea what's wrong with this lovely patch
try
pattern = '''
G.FUNCS.cash_out = function(e)
'''
also crashed
I repalce all function(self, card) on function(self, info_queue, card)
wait
huh
What's going on with this mod.....
how do you get the round score
What?
like the score you need to get?
I don't think I understood, but what do you mean?
yup ofc
How do I use that?
anything saved in there will save for the entire profile
"Star?"
Normaly
"Moon?"
no
-___-
So I do G.PROFILES[G.SETTINGS.profile].something = true and then I can do if G.PROFILES[G.SETTINGS.profile].something == true then ...?
yes
How to fix it..............
how do i make a deck force everything to have an edition?
loook at cryptid
i was hoping to avoid looking at cryptid's code but alr
i think cryptid hooks create_card
yea
I have a consumable that can only be used once before removing itself from the pool. How do I make a booster pack remove itself out of the pool, if there are no consumables left for it to pick?
Count the size of the consumable pool in the boosters in pool function
why does my mod cause this???
How do I get the consumable pool again?
Use get current pool for your consumable type
hello???
ive posted this problem before and literally no one responded
this seems like you used the wrong sound key
or something
elaborate?
like
is there a function
that plays or defines sounds
so i can see manually which one it is
are you trying to play your own sound or one from the game?
you will find docs here https://github.com/Steamodded/smods/wiki/SMODS.Sound
thank you
i dunno, i dont remember, i havent touched the mod in a month
well, we can't help if you dont know your own mod lol
yeah i know, thanks for pointing out what i need to search out for
:)
and i found out the source of the problem, it works now
tysm
@N im not the best at github, is this all you added to implement global mod calculate? https://github.com/Steamodded/smods/pull/847/commits/8b7d4b0d0f99a4eff26bdbc9b9c0621bf5171171
yes
noted
im back on trying to implement back stickers fully
i think this is all i need
Gl
hmm i think for stickers you dont want these deck-like calculates
well its a "sticker" but really its just a permanent run alteration
ah ok
how tf does context.destroy_card work it keeps doing some weird stuff
so i think if i replace object = mod with object = MaxBoiSM.Backstickers[key] and change the surrounding logic itll work just fine :clueless:
que the 4 hour rabbit hole i fall into again
having it alone only triggers the scored cards, adding context.full_hand triggers every single card in the drawn hand? like what
use context.cardarea == 'unscored'
Why does this result in the error "attempt to concatenate local '_type' (a nil value)"
self.config.consumablesLeft = self.config.consumablesLeft + 1
print(self.config.consumablesLeft)
end```
youre missing the quotes around cstorm_astro_hints
also get_current_pool returns "UNAVAILABLE" for the keys that are not in the pool
well thats just the unscored ones, i want the whole played hand
and also if the pool is empty it will always have the default
scored and unscored
(context.cardarea == G.play or context.cardarea == 'unscored')
aight
What do you mean?
get_current_pool returns a list of keys
if its not in the pool the key becomes that
its not removed
If I need to store data for tracking with how many custom cards the player wins with, should I use G.PROFILES[G.SETTINGS.profile].career_stats?
What would I do instead then?
check if the key is not unavailable to count
Would this work?
if card ~= "UNAVAILABLE" then
consumablesLeft = consumablesLeft + 1
end
print(consumablesLeft)
end```
i think so
did anyone figure out how to make the scoring_parameter and scoring_calculation bits work?
Wait, you just said that, my bad
i cant seem to get a third parameter to show up
i dont think anhy of my lovely patches for mods are working
i dont see any of them in dump
whats causing the smods lovely patches to not have been acted upon
the end of the 0827 release notes has a full example of adding a third scoring parameter "juice", just copy that
the formula is just chips x mult x juice, but i can walk you through setting up a different formula if you want it
why are my text input boxes aligned to the left when i put align = cr?
(this is in SMODS.current_mod.config_tab btw)
local config_nodes =
{n=G.UIT.ROOT, config = {align = "cm", colour = G.C.L_BLACK, minw = 4, minh = 4}, nodes = {
{n = G.UIT.C, config = {align = "cm"}, nodes = {}}
}}
-- option cycle code goes here...
config_nodes.nodes[1].nodes[2] = create_text_input{
prompt_text = "...",
max_length = 12,
all_caps = true,
ref_table = SMODS.current_mod.config,
ref_value = "up_keybind",
align = "cr",
callback = function()
SMODS.current_mod.config.up_keybind = SMODS.current_mod.config.up_keybind:lower()
SMODS.save_mod_config(SMODS.current_mod)
end
}
-- the same snippet four more times...
return config_nodes
thing is, i did, and it didnt work for me, as soon as i launched balatro using the example code, i only saw chips and mult, also other question, how can i add different symbols individually such as how you did it in your example?
you need to actually switch to the scoring calculation, if you want it to show up for the whole game then you should hook Game.start_run like this
(to be clear, "expo" is the mod prefix, and "ecalc" is the key of the scoring calculation i defined)
so that was not explained in the discussion where the update was announced?
or was it and i must've missed it
yea that was the one thing not shown in the example, although it was still documented earlier in the release notes
i already checked and none of the patches appear
only the ones i made to the actual game
yes expo is the prefix for my mod, ecalc is the key for the scoring calculation
yes, running SMODS.set_scoring_calculation("modprefix_calckey") in a Game.start_run hook will replace the scoring calculation with your custom one for the entire run
wait multiple text inputs just doesnt work HOORAY
btw, i was also asking how could i individually configure the different symbols within the gui, since in the discussion it suggests that the symbol applies in between chips and mult only
since from the example, all i got from this was SMODS.GUI.operator(scale * 0.75)
I don't think you should be using SMODS.current_mod in a callback function
Aka everything that runs after the main file was loaded
yeah im not i just replaced it because i thought itd be more readable i didnt think about that
the SMODS.GUI.operator function is unfortunately hardcoded to create an "X"
to add custom text, it's a bit of complicated UI code. i've gotta run to class soon so i can't go in-depth about it, but long story short reference the original code for SMODS.GUI.operator(), replace the function call with the code that that function call normally runs in the scoring calc's replace_ui, and then you can replace the "X" with the text you want
i might see what i can do, but it does feel a bit sad that you need to add custom text to add onto the hardcoded X, i dont really need to edit Chips X Mult, but i was planning to do Chips X Mult ^ Power
if you look up at my example video that's pretty much exactly what i did lmao (although i assume since you don't have parentheses the Power only applies to Mult?)
yea, i am just planning to do Chips X Mult ^ Power
kinda like Chips X (Mult ^ Power)
yea ok that's what i said
lemme write out the replace_ui for you
replace_ui = function(self)
local scale = 0.3
return
{n=G.UIT.R, config={align = "cm", minh = 1, padding = 0.1}, nodes={
{n=G.UIT.C, config={align = 'cm', id = 'hand_chips'}, nodes = {
SMODS.GUI.score_container({
type = 'chips',
text = 'chip_text',
align = 'cr',
w = 1.1,
scale = scale
})
}},
SMODS.GUI.operator(scale*0.75),
{n=G.UIT.C, config={align = 'cm', id = 'hand_mult'}, nodes = {
SMODS.GUI.score_container({
type = 'mult',
align = 'cm',
w = 1.1,
scale = scale
})
}},
-- this is the custom ^ text
-- modify the scale or colour attributes if it looks off
{n=G.UIT.C, config={align = 'cm', id = 'hand_operator_container' }, nodes = {
{ n=G.UIT.T, config={text = '^', lang = G.LANGUAGES['en-us'], scale = scale*1.5, colour = G.C.UI_MULT, shadow = true}}
}},
-- this is no longer the custom ^ text
{n=G.UIT.C, config={align = 'cm', id = 'hand_modprefix_juice'}, nodes = {
SMODS.GUI.score_container({
type = 'modprefix_juice',
align = 'cl',
w = 1.1,
scale = scale
})
}},
}}
end
also obviously replace the juice stuff with your actual scoring parameter
thanks
anyone know why this isnt working? still scores like non-splash despite the table containing that key
How do i make it so a booster pack allows a hand of cards like an arcana pack?
like
you want it to have playing cards in it?
wait no not a standard pack
an arcana pack
like how it draws cards from your deck to use tarot card's effects
read the documentation
https://github.com/Steamodded/smods/wiki/SMODS.Booster
ok thank you!
can i make a deck give mult like a joker?
thats a new thing isnt it
the docs are kinda unclear about what contexts work
one last time, why doesnt stuff like these even get patched in, i read vanillaremade and it told me to make it like this
where's your times
wait, im supposed to add that?
i forgot to add it on another patch and it still worked
theres one with times and it still doesnt function.
yes

most contexts work except for like joker_main
you're probably on a diff priority?
this is the main issue that doesnt even function
So I wanna make a lovely patch on the code for the pre-existing stakes and to give one of them a win ante, where would I find that
what does the code for debuffs look like? If anyone knows
Stakes are in game.lua
looking at the base game files hereβ¦
try 2031
lovely/dump>>>
theyre patching
Ehhh fair then
G.STATE_COMPLETE = false?
But some code could be replaced by smods
you probably want to take_ownership
that too
I'm trying to avoid using smods as much as possible really (i struggle with take_ownership)
but they modify here
ok so lemme test this out then
this is in Game:start_run btw
if self.GAME.stake >= 3 then self.GAME.modifiers.scaling = 5 end
This is my test to see if it works
I can't tell if this is different
I don't think it is?
the lovely dump says it is different tho
An easy way to see would be by checking it with and without your changes
What ante is this
How would I make a joker have a chance to trigger its original effect instead of it always being guaranteed? I know i'd have to hook into Card:calculate_joker but from there I don't exactly know where to go
it could be that increasing it beyond 3 doesn't actually do anything, but idk how the scaling system works exactly
House in ante 2 for me is 1600 so
what is 2dp
i think so? at least when it's below 10; i'm pretty sure it'll switch to displaying 1dp between 10 and 100, and then it won't display decimal points at all above 100
(it should still calculate at 2dp under the hood even above 100)
I was on the wrong stake lmao
Ugh, this is gonna be a pain to take ownership of literally EVERY stake from Blue -> Gold
if I wanted a joker to check if a specific other joker was immediately to the left or right of it after the end of a shop, how would I do that?
i already know it involves context.ending_shop
check blueprint code in vanillaremade for how to get the joker immediately to the right, it should be fairly easy to adjust that for immediately to the left as well
alright
see but like
in what manner
I suppose planet cards break the illusion a bit lol
To take ownership of a stake, I would do
modifiers = function()
[Modifiers here]
end,
)```
right?
SMODS.Stake at the start, but otherwise yes
I want to structure my edition similarly to how debuff works but with tweaks
I just copied from the wiki, mb
also i think if you take ownership of blue, it should apply to everything above it (because purple applies blue, orange applies purple, and gold applies orange). at least test that before you go through with taking ownership of everything up to gold
is this the part of blueprint's code that detects the joker to the right?
if card.area and card.area == G.jokers then
local other_joker
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then other_joker = G.jokers.cards[i + 1] end
end
I think i got it?
well it changed
it just made it crash with "Self" instead of G like i should've done
4 discards, so far so good...
correct
hi
is 1000 right for scaling 3?
yes
so i + 1 would be the joker to the right?
yea
hardcoding to 3 seems not quite right
i think it won't work well with effects on top of it
before you do that, do something else (like -3 discards or something lmao) and check to see if it applies on higher stakes
in any cardarea, position n is the card in the nth position from the left side of the cardarea (e.g. brainstorm would target G.jokers.cards[1])
ok lemme try
I put minus 3 discards to test
for hex color codes, do i have to put it in a ['(colorcodehere)'] table?
uranium stake: -3 discards -4 hands
smods does this: G.GAME.modifiers.scaling = (G.GAME.modifiers.scaling or 1) + 1 to increment the scaling
ok the -3 works on blue stake
(stake application order is not consistent)
yay, glad you don't have to take ownership of a bunch of stakes
i do...*
o...
I have to move the effects down one after all lol
dang
you can just do that in a loop though if you're just moving everything down
so what i'm trying to do is get Necrozma (a joker) to check if Solgaleo or Lunala (two other jokers) are immediately to its left or right at the end of a shop
.
-# i just realized im missing context, this is in relation of rarities
idr how to do that sadly, so manually it is
shouldn't be that hard, lemme show you
the HEX function takes a string of the hex code as input
again if anyone knows, how exactly do debuffs prevent cards from scoring?
so i can just leave it as
badge_colour = FF4A44
I plan to move everything from purple to gold down one level (so it's now blue to orange) and then give a new effect to gold
local stakes = {'blue','purple','orange','gold'}
for i=1,#stakes-1 do
SMODS.Stake:take_ownership(stakes[i], {
modifiers = SMODS.Stakes['stake_'..stakes[i+1]].modifiers
}, true)
end
oops, there
But what will happen to gold since i have the a stake beyond it?
right now, nothing
i just need to make a new one specifically for gold then?
you'd take ownership of it separately for the new effect
as it's not an existing one
I feel bad for whoever decided to do Travel deck on new Gold
local my_pos
for i = 1, #G.jokers.cards do --find own position
if G.jokers.cards[i] == card then
my_pos = i
break
end
end
local left = G.jokers.cards[my_pos-1] --left joker
local right = G.jokers.cards[my_pos+1] --right joker
if left and left.config.center.key == "<key>" then --check for the specific joker on the left
--code here
end
if right and right.config.center.key == "<key>" then --check for the specific joker on the right
--code here
end
``` my attempt at it (unless you figured it out yourself already)
for rarities, the default weight thing should equal 1 right? and if it doesn't the other rarities lower in chance in comparison?
Got a problem
Whenever I do the take ownership of gold stake, it gives orange the new gold stake ability
take gold stake out of the loop and just take ownership of it separately
oh lemme try that
and yea don't take ownership of gold until after the loop
last thing i want is to delete rentals and make people go to ante 12
Ok it works there
and that works
Travel deck players when they ACTUALLY have to get to Ante 12
I got a bunch I still need to do with it, but the plus side is that the blind size is 0.8X the size
that's huge for early game
mhm, that's the idea. it's to reference how travel decks of cards are overall smaller
but also since traveling place to place is long that's why it's more antes to win
It does need some rewording now that I'm doing more with win antes than just the deck
a...?
So normally it'll be Ante 10 to win, but with Gold or Platinum Stake, it's now Ante 12
it needs to be badge_colour = HEX('FF4A44')
ah
what's the context for when another joker is removed from your deck through any means (sold, destroyed etc.)?
Nah bro I'm about to go to work ty tho
context.selling_card and context.card.ability.set == "Joker" for selling, i know destroying another joker is context.joker_type_destroyed but i forget what the other_card equivalent for it is
fuck
It seems to also just be context.card.
ok can someone help i cant figure out which context im meant to be using to make my deck give +4 mult. when i do context.before the mult gets immediately reset when playing cards start scoring, context.joker_main obviously doesnt work, idk what to do
use context.initial_scoring_step for the start of scoring
also context.joker_main should workj
it goes over every single area but the deck would calc last which kinda sucks
^ score gets reset to the base poker hand value after context.before because space joker might level up the hand, so it needs to reset it to the new values
apply = function(self)
card.debuffed = true
end,
calculate = function(self)
if SMODS.pseudorandom_probability(card, 'death_proc', 1, 2) then
card.debuffed = false
card:set_edition(nil, nil, true, true)
end
end,
How would i make my edition's calculate trigger even if the card is debuffed
calculation ignoring debuffed cards is bypassed when context.ignore_debuff is set
for contexts included in smods, this only happens for context.debuff_card
Do you happen to know if I can override planet cards to include the power bonus (and perhaps edit the anim) in the description or is it off limits
including the power bonus should be possible, although i haven't done that myself yet
editing the animation should also be possible, but through a different route than taking ownership of the individual planets, and i also haven't done that yet
but i'll look into it
i might have to reference potassium
Since it looks a bit odd as during the animation, it looks as it it's only editing Chips and mult if it were two parameters only, and the desc only contains chips and mult values
does the animation at least properly align with the new positions of the chips and mult boxes?
No as far as I can tell, it behaves as if it isnt following the new design, but the effect works after the anim
ok, that's what i thought
What is this power bonus?
new scoring parameter
Custom parameter
Ah I see
I want to make planet tooltips automatically add new parameters at some point
would be very cool
You could also consider making the animations align a bit with the new parameters
Since its a bit off right now, only showing it add to chips and mult, but up to you
Yes that would be part of it
How do I set the sprite for locked things and how do I make them unlock under specific conditions?
Btw are you planning to make the hand type values in Run Info configurable?
what hand type values in run info
as far as i know most things are already configurable
mmm nevermind lol, i thought card.debuffed was it but it turns out that was just some faulty code that i left somewhere else preventing jokers from scoring. I still have no idea how debuffs prevent jokers from scoring
You know when you look at run info and find the hand types
Like for the amt of time you used them or their chips/mult values
i mean you can already just change those right
or do you mean like for scoring parameters
I'm not sure
The scoring parameters are fine as far as I know
Like the hand types in the run info menu
Just suggesting that it could prob be made to account for custom parameters maybe in a newer smods update idk
That menu is already awfully laid out, I wouldnβt want to try and squeeze more things in there tbh
bump
Fair, but maybe there is a possibility that the menu could be reworked in a way, similar to the new and refined mod menu
Maybe it could use scrolling to fit in extra space
(As in the hand types can be laid out wider and maybe a bit taller)
You mean set up an unlock condition? Like beat deck at X stake or something?
is jokerforge compatible with talisman & how do i find documentation/resources to make something talisman compatible
looking to try and create a mod (for the first time) that's compatible with cryptid (and i could also maybe use cryptlib?)
i need a good point of reference
i assume joker forge is compatible with talisman by default since it can use talisman-exclusive features
and i dont think joker forge has cryptlib stuff rn
well outside of ^chips/mult because cryptlib also has that
Yes
You can do that by adding check_for_unlock = function(self, args) to your Joker/Tarot/etc
Like this one check_for_unlock = function(self, args) return args.type == 'win_deck' and get_deck_win_stake('b_anaglyph') > 7 end
It checks if you won a deck and has the gold stake with anaglyph deck
Okay, can I put anything in there or only specific things?
Unfortunately I was the guy making it compatible
so it'd work with cryptid?
i'm assuming yes so that's cool
Half of the stuff crashed with talisman when ^ mult was added
There are specific parameters by default, but you can patch in new parameters if you need something more specific
also if youre using joker forge code as a point of reference for actual code then my personal advice is to just not because joker forge code is very messy
Like, I want it to be unlocked, when it is spawned by my specific conditions
For things more advanced than +10 chips I agree
Conditions get SUPER messy
I was planning on using cryptposting/cryptid as a point of reference but I don't really know how to code in that yet
cryptid code is EXTREMELY messy from what ive seen
if you need an actual code reference use vanillaremade
A good point of reference is VanillaRemade if you didn't check that out
is that one compatible
Also it's wiki is very helpful
Worry about compat later imo
#fuck_talisman
Kinda like how the vanilla legendary's do it but not by using a consumable like the soul. My consumables spawn when 2 specific planet cards are used after each other. Would I need to patch that or is that possible already?
lol i just wanna make sure it works alongside cryptid so i can play it with my other mods
it doesnt, though when compat would be needed it has code comments there to see the wiki note about talisman
can info_queue just take a table of name and description directly instead of a center or localization key?
I think that's handled by it being a legendary. I don't remember if it's locked or undiscovered tho
asking once again because I am starting to become a tiny bit desparate, how do debuffs prevent a joker from scoring 
you want to make something on a card score even though that card is debuffed, right? i'd recommend referencing the Blockbuster Counters API, iirc one of the counters debuffs the card its on for as long as the counter exists and it needs to do what you want to do in order to still be able to tick down
welll not exactly, I am making an edition specifically for a boss blind that i am making. The premise is that the card's abilities won't trigger unless you hit a 1 in 2 chance
oh i see
i think making it an edition is going down the wrong path tbh (unless you want the boss blind to apply the edition to random cards, in which case i still think just making the blind do it directly makes more sense)
if you do want it to be the boss blind itself doing this to all your jokers, i'd just make it go in context.post_trigger, roll the 1 in 2 chance, and if it fails, do context.other_ret = {} or something of that nature
I made it an edition since I didn't know better, and yeah the boss is supposed to pick out a card randomly (one which doesnt have that specific edition) and give it that specific edition whenever you play a hand. That part works but it does feel quite scuffed
The problem is that I'm talking about a consumable, not a joker... Should've mentioned that earlier, sorry
hmm... I could try this actually
yea i think design wise it makes more sense for the blind just to be "all jokers have a 1 in 2 chance not to trigger"
if you do want to keep it as an edition though, i think you can just add an additional check to see if the post_trigger is on the joker that the edition is applied to
consumables can still have check_for_unlock
bump
or at least
something that isnt an object or localization key at all
would help
now that I think about it you are probably right
What do I need to make it unlock when it got spawned?
something like this I assume?
i believe so, yes
make sure you have the post_trigger optional feature on too
(also if you want it to be "1 in 2 chance not to trigger" then you should actually just make it for if the roll succeeds, so that oops all 6s properly makes it a 2 in 2 chance not to trigger and fucks you over
)
i will say i'm not entirely sure if doing context.other_ret = {} is correct, but try it and if it crashes then it should probably be context.other_ret.jokers = {} instead
i'm not sure, sorry
i forgot to enable post trigger, i just did it so i'll see if everything works
and yeah i fixed the chance

actually you can probably just directly call unlock_card(card) from the code for when you spawn the card
(the argument to unlock_card has to be the center i think, not a card object)
weird, the jokers are firing as usual
hm
I always forget what the difference between center and card is...
i'll try context.other_ret.jokers = {}
yeah that worked i think
holy hell
yeah it worked
card object is an individual instance of that card, you can have multiple of them
center is the prototype that represents all instances of the card
if you have a card object, you can get the center with card.config.center
@frosty rampart thank you so much 
happy to help
if i knew i would've tried helping already :<
actually i should ask while i'm at it, can I draw a shader over the jokers if this blind is active? This was also why I used the edition
actually ill just try doing shit with the info_queue for now
better late than never 
So for example j_modprefix_key.config.center? Or literally card.config.center?
yes
how would I do that
if you have the key to the card, you can do G.P_CENTERS.j_modprefix_key instead. literally card.config.center is useful if you have the card and it could potentially be one of many cards
actually this is a consumable right
Yes
it would be c_modprefix_key
Oh, right
use a drawstep to identify when the blind is active and then draw your shader
anyway you should do P_LOCKED, not P_CENTERS, and check if it exists before unlocking the card (P_LOCKED is a table that only contains locked centers, they're removed when they're unlocked)
alrighty
Okay, so I do unlock_card(G.P_LOCKED.c_modprefix_key)?
after checking that G.P_LOCKED.c_modprefix_key exists, yes
and do all this alongside the code that spawns your card, not in the card's check_for_unlock function
https://github.com/EremelMods/Ortalab/blob/498cbebaa0226853b76a8d2475717ad393fa5682/objects/jokers/kopi.lua#L62 this is a drawstep for a shader as an example
bump.,,,,,,,,,
does anyone know how I would go about making a joker that has a chance to turn any scored card into a negative card?
not afaik
why
idk i want to just dynamically generate a single box of tag names instead of tooltip soup
if possible
look at midas mask but use set_edition instead of set_ability, also negative playing cards are really broken
hii
Alright thank you!
How do I assign a Joker to use Cryptid's Epic rarity? So it has the same rates.
do you mean cryptid crossmod/dependency actually using the epic rarity, or just a new rarity that has the same rate as Epic in cryptid?
Is this wrong? Because it doesn't work...
unlock_card(G.P_LOCKED.c_cstorm_aries)
end```
just check if it exists, not if it's equal to true
if G.P_LOCKED.c_cstorm_aries then
Okay
crossmod dependency will work
rarity = "cry_epic"
make sure to either make cryptid a dependency for your mod, or to check that cryptid exists before defining the joker
SMODS.DrawStep {
key = "ghostly_eff",
order = 20,
func = function(card)
if G.GAME.blind and G.GAME.blind.config.blind.key == "bl_tdec_death" then
if card.sprite_facing == 'front' and (card.config.center.discovered or card.bypass_discovery_center) then
card.children.center:draw_shader('voucher', nil, card.ARGS.send_to_shader)
end
end
end
}
I'd imagine it's something like this but not too sure
Still doesn't seem to work...
idk then
Wait, the print doesn't get output...
print("Scorpio!")
unlock_card(G.P_LOCKED.c_cstorm_scorpio)
end```
oh shit i just realized
G.P_LOCKED is an ordered list, not a dictionary. so G.P_LOCKED.c_cstorm_scorpio never exists
my fault
just check if not G.P_CENTERS.c_cstorm_scorpio.unlocked then instead
(this assumes that the consumable is actually locked. if it's just undiscovered, replace "unlocked" with "discovered")
And what do I put into unlock_card()?
G.P_CENTERS.c_cstorm_scorpio
I don't know why it has no sprite but it works :D
Thank you :3
Anyone got an idea why it has a sprite after going to the main menu and then continuing the run?
my lovely patches arent working.
the ones that are for smods just.. dont
no errors or nothing
i have the headers like
@frosty rampart sorry for being a bother, I wanted to ask how would I exclude a singular joker from the effect that you helped me with earlier?
if it's one specific joker, you can probably just hardcode it. check if context.other_card is the joker you want to exclude, and only try to disable the trigger if it's not that joker
are you unlocking the card before or after you spawn it?
yeah i might just skip crossmodding alltogether at this point
Tried both and it's invisible for both
its not happening
How would I make a card not appear in the collection?
but be able to appear in a run
like a secret card
like genuinely, i have to toml patch the function
how are you checking if it's happening?
yet if these tomls dont work i cant do anything
read the documentation
https://github.com/Steamodded/smods/wiki/API-Documentation#common-parameters
ohhh
not sure then, sorry
i cant find anything in the logs about why its failing
what do you think
I should set it to a function that returns true
cuz having it set as functions would give more control over it
I think
long shot but it might be a casing issue
<@&1133519078540185692>
inconsistently with the actual file names, the file paths kino sends to smods to be loaded with capitalized "Items", which should be kept as the buffer name
which I assume is case sensitive on lovely's side of things
is there a way to get the SPECIFIC booster currently opened instead of just the kind?
SMODS.OPENED_BOOSTER.config.center.key
okay
yeah it is literally just a single joker, in fact you use it to reach the boss
yea definitely hardcode it
trying rn but i'm most definitely doing somethingvery wrong
for the audio format are mp3's allowed
is there a way to have a playing card apply an effect only when it's in hand that's not just using update cause that seems inefficient
allowed but not reccomended
what audio format is recommended then
ogg
let's crack out audacity then
does context.joker_type_destroyed not check for itself? i wanted to check if one specific joker is destroyed and do some stuff
what's the effect
increasing consumable slots
from a playing card whilst it's held in hand?
yep
that seems exceptionally niche in it's use
i'm dumb what do i do for the prefix (have it set as wgs)
alternatively i could just figure out how to make it so playing cards cant have that edition, like negative
reference dichrome in paperback, it disables itself from appearing on playing cards I think
(although it still has an effect when it's on playing cards in case other mods fuck around and somehow get it to happen anyway)
torturous boss blind but hey it works !1!!!11!
it has a secret effect on playing cards? well i gotta know now
i'll figure out how to hardcode thi s when i wake up good night gang
they said it has to appear on playing cards, i'll just use update
doesn't seem like it does anything π
is there a way to do like a pseudorandomn and have it like 'k_teddy' .. x and 'teddy' .. x
oh it's not in the latest release I think, but in the beta it should give an extra hand or discard when the card is drawn
You can, yeah... though I use math.random for mine 'cause it involves sounds instead.
togabalatro.plus95rndsfx = function()
return 'toga_win95pluscmd'..math.random(1, 12)
end
bump
you want the regular chip message to not show up at all?
im fucking stupid, i can just use add_to_deck and remove_from_deck
you probably need to hook or patch something for that
Isn't there an attribute to removing the default message
Remove_Default_Message I believe
yes but it won't work in this case because the card is not giving the chips
they want to remove the playing card's chips
the base ones
Not the additional ones?
playing card's chip message, doesn't have to be the actual chips itself
just the message
If you want to remove the message, there is an attribute that I'm not sure if I'm correct, but is called Remove_Default_Message
It removes messages such as chips/mult gain I believe
lowercase but yes
Yea my bad lol
So almost every attribute and function is normally written lowercase?
yeah
Alright
classes are CamelCase
Imo it just seems a bit redundant to use two types of case (prob cus I normally just stick to one and its now a personal preference)
everything in lua is a table so it makes sense to differentiate
Fair
oh wow how convenient i literally need this right about now
Well don't make the mistake of writing it camel case with that like I did π
this?
yeah
Yea it looks fine
i dont think it will work tho
ngl they should change that to removedefaultmessage=true instead
Huh?
camel case L
it doesnt yeah
why
makes it harder to read
Can't be asked to type _ π
Also what does context.other_card add to the if statement exactly?
that way you practice writing backwards while coding
yeah i dont think there's an easy way to do this. idk where in calculation does it make sense to patch something
(nothing)
so you get better at coding cuz u can write backwards
Is he trying to simply get rid of the chip message for a card?
yes
I don't really have much knowledge on card context since I use jokers as the main source, but I'm not really sure what context.other_card adds here
actually a cool idea for pseudo-noitacsufbo
I'm not sure however
context.other_card is each individual playing card played
help it does this every time i press play hand (using divvy's preview, fantom's preview doesn't work)
Im pretty sure context.individual is used for jokers to play their effects on cards
do i need to update my smods or something for remove_default_message = true to work?
no, a joker can't get rid of the playing card's chip message
remove_default_message is used if you want to get rid of the message your joker is giving the card but in this case you have none
What I meant is that context.individual doesnt seem to belong here
ah
can you explain the intent?
i want to do the opposite
get rid of the message showing the number of chips the card scored and keep the message my joker is showing