#đŸ’»ăƒ»modding-dev

1 messages · Page 560 of 1

cursive gazelle
#

I think this requires patches

twilit tundra
#

yeppp i think im gonna put that one off till later too

cursive gazelle
#

If you check four fingers the code is just an SMODS function

twilit tundra
#

the hard part in my head is keeping track of what cards you have and haven’t played

#

that part seems a lot harder than making it a straight flush

cursive gazelle
#

For loop thro the hands played and if it’s played more than one time it’s been played before

twilit tundra
#

wait i can??

#

how 👀

cursive gazelle
#

And check for scoring cards table size

twilit tundra
#

through the cards played you mean?

cursive gazelle
#

If it’s 5 then it’s a 5 card hand that hasn’t been played before

cursive gazelle
twilit tundra
#

it checks for the cards played, not the hands played

#

its not

#

its like hiker

#

its checking for the individual card

cursive gazelle
#

Oh

#

Cards played

red flower
#

the cards store how many times they have been played iirc

#

so it's not very hard

twilit tundra
#

wait they already store that?

#

i thought it was just for the current ante for the pillar

red flower
#

im pretty sure

cursive gazelle
twilit tundra
#

or is the storage permanent

cursive gazelle
#

Local thunk knew all along

red flower
#

even if they dont it wouldn't be hard to implement

#

i think it's card.base.times_played

split creek
#

Trying to make a consumable that can only select a specific suit, what am I doing wrong?

        for key, value in pairs(G.hand.highlighted) do
            if value.suit ~= G.C.SUITS.Clubs then
                return false
            end
        end
        return #G.hand.highlighted <= 2
    end,```
red flower
#

value:is_suit("Clubs") or value.base.suit == "Clubs"

warm umbra
#

how do i set the amount of chips

#

while the hand is being calculated

winter flower
#

how do i make it so that a blind appears after defeating a specific blind

#

(i know in_pool exists but i cant for the life of me figure out why it wont spawn)

frigid cargo
#

Im tryna make an enhancement where if 3 of the same enhancement is played, then the played hand is upgraded, the problem is it upgrade the played hand per enhancement even though i only want it to activate once, how can i do this?

warm umbra
rocky plaza
warm umbra
#

im using G.GAME.chips = 0

#

oh wait i think i know why

urban wasp
#

why does this crash upon the voucher appearing at all

...
    update = function(self, card, dt)
        for i = 1, #G.jokers.cards do -- <- line 392
            local joker = G.jokers.cards[i]
            if joker.config and joker.config.center and joker.config.center.pools and joker.config.center.pools.Bulgoe then
                card.ability.extra.bulgoes = card.ability.extra.bulgoes + 1
            end
        end
    end,
...
#

full code

SMODS.Voucher {
    key = "rabbulgoe_hole",
    name = "Rabbulgoe Hole",
    atlas = "crp_placeholder",
    pos = { x = 5, y = 2 },
    config = { extra = { bulgoes = 0 } },
    requires = { "v_crp_bulgadicioe" },
    loc_vars = function(self, info_queue, card)
        info_queue[#info_queue + 1] = G.P_CENTERS.j_crp_bulgoe
        return { vars = {  } }
    end,
    update = function(self, card, dt)
        for i = 1, #G.jokers.cards do
            local joker = G.jokers.cards[i]
            if joker.config and joker.config.center and joker.config.center.pools and joker.config.center.pools.Bulgoe then
                card.ability.extra.bulgoes = card.ability.extra.bulgoes + 1
            end
        end
    end,
    calculate = function(self, card, context)
        G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls + (lenient_bignum(card.ability.extra.bulgoes) * lenient_bignum(card.ability.extra.bulgoes))
    end,
    crp_credits = {
        idea = { "Gudusername" },
        code = { "Rainstar" }
    }
}
warm umbra
gilded goblet
#

Why did you shape it like that

rocky plaza
warm umbra
gilded goblet
#

Try the global chips

warm umbra
warm umbra
#

chips = 0

gilded goblet
#

Yeah exactly

#

Or maybe it's uhh

#

Hold on

urban wasp
#

hand_chips

gilded goblet
#

hand_chips yeah

#

Ty

warm umbra
gilded goblet
#

Then mult is just mult

#

I think? I don't remember

warm umbra
urban wasp
#

no in the collection

#

which is weird because it was working earlier

rocky plaza
urban wasp
#

oh fair just like a nil check

rocky plaza
#

yeah

warm umbra
rocky plaza
daring fern
frigid cargo
rocky plaza
#

ooohhhhhh

#

hmm maybe have a flag to check if its the first astral card scored then do the upgrade

split creek
#

why is value.base.nominal returning a boolean value?

        for key, value in pairs(G.hand.highlighted) do
            if not value.base.nominal <= card.ability.extra.max_rank then
                return false
            end
        end```
red flower
#

because you're negating it

split creek
#

oh i did a lua oopsie

near heart
#

how can i get the rarity of a held joker?

split creek
#

one pair of parenthesis and lua is happy again

red flower
pastel kernel
#

How does gateway destroy all jokers

red flower
#

idk but you can destroy all jokers by doing SMODS.destroy_cards(G.jokers.cards)

pastel kernel
#

Cryptid has a special gimmick where certain items can overflow even when the limit is reached. I wanna copy that effect but idk how.

quick shore
#

@digital valve this person pinged you 4 months ago

pastel kernel
red flower
#

yeah

pastel kernel
obtuse wraith
#

Do any of your mods have this issue or is it just a smods glitch?

cursive gazelle
obtuse wraith
feral tree
#

is it possible to have a joker destroy itself without making any noise?

pastel kernel
#
can_use = function(self, card)
        return G.jokers and #G.jokers.cards < G.jokers.config.card_limit
    end,

if i remove

and #G.jokers.cards < G.jokers.config.card_limit

can it still spawn the joker?

cursive gazelle
#

Yes

charred widget
#

Hey there! Just wanted a little tweak to this joker here. Rayquaza gains 0.1x mult for every stone card played. How can I show the current mult in the joker's description?

cursive gazelle
#

Return the value in loc_vars

#

And use #2# as an example to display it

#

Can i see a screenshot(i’m on phone )

charred widget
cursive gazelle
charred widget
cursive gazelle
#

I understand

#

Can you find the config and loc_vars ?

charred widget
#

i can find config but i don't see loc_vars

cursive gazelle
#

Make a loc_vars then and return said variables

#

You can find examples in any joker

#

In vanilla remade

charred widget
#

ok i'll take a look at that

cursive gazelle
#

Return variables by order
And place #1# in loc_txt do display first variable

#

#2# for second

#

And so on

#

Said variables are

#

Card.ability.extra.Something

#

In your config you can find all the (something )

dreamy lodge
#

Can jokers interact with a blinds chip requirement? If so how do

cursive gazelle
#

What do you want to do exactly

charred widget
dreamy lodge
#

like half it for example

twilit tundra
#

hey where are the smod docs i wanna see everything that context has as fields or functions

cursive gazelle
#
local current_score = G.GAME.chips
local current_requirements = G.GAME.blind.chips```
cursive gazelle
#

or this will crash

#
local is_in_blind = G.GAME.blind.in_blind```
#

This is how to check

#

Ofc you want to change the direct variables not the local ones because that won’t do anything

dreamy lodge
#

do you just replace local with direct

pastel kernel
#

I FUCKING HATE THIS CONSUMABLE THAT KEEPS CRASHING

SMODS.Consumable {
    key = 'fantasy',
    set = 'Spectral',
    atlas = "atlas_Fantasy",
    pos = { x = 0, y = 0 },
    soul_pos = { x = 0, y = 2, new = { x = 0, y = 1} },
    soul_rate = 0.1,
    can_repeat_soul = true,
    soul_set = 'Spectral',
    loc_txt = {
        name = "Fantasy",
        text = {"Creates a random {V:1,E:2}Grandiose{} joker", "{s:0.8,C:inactive}Destroys all held jokers, also needs room :({}"}
    },
loc_vars = function(self, info_queue, card)
        return { vars = { colours = {SMODS.Gradients["busterb_grand"]} } }
    end,
    use = function(self, card, area, copier)
        SMODS.destroy_cards(G.jokers.cards)
        G.E_MANAGER:add_event(Event({
            trigger = 'after',
            delay = 0.4,
            func = function()
                play_sound('timpani')
                SMODS.add_card({ set = 'Joker', rarity = "busterb_Grandiose" })
                card:juice_up(0.3, 0.5)
                return true
            end
        }))
        delay(0.6)
    end,
    can_use = function(self, card)
        return G.jokers and #G.jokers.cards < G.jokers.config.card_limit
    end,
    draw = function(self, card, layer)
        if (layer == 'card' or layer == 'both') and card.sprite_facing == 'front' then
            card.children.center:draw_shader('booster', nil, card.ARGS.send_to_shader)
        end
    end
}
cursive gazelle
#

G.blind.chips=G.blind.chips+50

#

Increases req by 50 chips

dreamy lodge
#

I see

cursive gazelle
#

This has a lot of your questions answered

#

Please read it

dreamy lodge
#

what part

cursive gazelle
dreamy lodge
#

thats a lot of reading

cursive gazelle
#

Put tiktok on the side

dreamy lodge
#

I dont use tiktok

cursive gazelle
#

At least refer to it when you want something

#

😭

dreamy lodge
cursive gazelle
#

Great !

twilit tundra
pastel kernel
cursive gazelle
cursive gazelle
twilit tundra
cursive gazelle
#

There are couple of contexts in vanilla remade and smods docs

#

Everything you need actually

#

Some contexts can be skipped or replaced with flags

twilit tundra
pastel kernel
charred widget
#

@cursive gazelle hey just wanted to follow up on the thing i was working on

#

am i at least getting somewhere

cursive gazelle
#

Somewhere yes

#

Please don’t modify your variables in loc_vars

#

Tho

#

Just return card.ability.extra.xmultvar

#

And place #1# somewhere in your description

charred widget
#

question

cursive gazelle
#

And it will be replaced with it

charred widget
#

how will the game know that #1# is card.ability.extra.xmultvar

cursive gazelle
#

If you return (5,card.ability.extra.xmultvar)

#

Then #1# will be 5 and #2# will be the mult value

pastel kernel
cursive gazelle
charred widget
#

alright imma see how it works

cursive gazelle
#

I hope i helped

#

Does your joker work btw ?

pastel kernel
#

src/utils.lua:2531: attempt to index a a nil value

cursive gazelle
#

nil checks again

charred widget
#

probably just a syntax error i could fix very quickly

cursive gazelle
#

Missing

#

,

charred widget
#

yeah that checks out

cursive gazelle
#

You have to take an account for that

#

And nil check it

pastel kernel
cursive gazelle
#

Or just spawns one

pastel kernel
#

Spawns one

#

It should work like gateway

#

Removes all held jokers then spawns a new one

#

New one of a high rarity

cursive gazelle
#

What rarity

#

Custom ?

#

Or legendary

pastel kernel
#

Custom

cursive gazelle
#

I mean i can give you the code 😭 it’s not that hard man

#

You can figure it out

pastel kernel
#

I just copied the code of another spectral card I made, used the thing for destroying all jokers, then ran it

cursive gazelle
#

It doesn’t destroy all jokers tho

pastel kernel
#

Wdym

cursive gazelle
#

Istg i hate coding in note app

#

😭

#
SMODS.Consumable {
    key = 'something',
    set = 'Spectral',
    pos = { x = 0, y = 5 },
    use = function(self, card, area, copier)
        local deletable_jokers = {}
        for _, joker in pairs(G.jokers.cards) do
            if not SMODS.is_eternal(joker, card) then deletable_jokers[#deletable_jokers + 1] = joker end
        end
        local _first_dissolve = nil
        G.E_MANAGER:add_event(Event({
            trigger = 'before',
            delay = 0.75,
            func = function()
                for _, joker in pairs(deletable_jokers) do
                
                    joker:start_dissolve(nil, _first_dissolve)
                    _first_dissolve = true
                    
                end
                return true
            end
        }))
        G.E_MANAGER:add_event(Event({
            trigger = 'before',
            delay = 0.4,
            -- use smods.add_card here 
            end
        }))
    end,
    can_use = function(self, card)
        return G.jokers 
    end

    draw = function(self, card, layer)
        -- This is for the Spectral shader. You don't need this with `set = "Spectral"`
        -- Also look into SMODS.DrawStep if you make multiple cards that need the same shader
        if (layer == 'card' or layer == 'both') and card.sprite_facing == 'front' then
            card.children.center:draw_shader('booster', nil, card.ARGS.send_to_shader)
        end
    end
}```
#

@pastel kernel

twilit tundra
#
        if context.evaluate_poker_hand then
            if #context.full_hand < 5 then
                return {}
            end
            local is_unplayed = true
            for _, card in ipairs(context.full_hand) do
                if card.base.times_played > 0 then is_unplayed = false end
            end
            if is_unplayed then return { replace_scoring_name = "Straight Flush" } end
        end
    end```
hmm this is uh. kinda working?
lmao not really though
its uh
only replacing the hand *before* you play it, once it actually gets scored it swaps the hand back to what it actually is
#

how do i get it to actually... be a straight flush

pastel kernel
cursive gazelle
#

So it goes back

#

Goodnight modders

twilit tundra
#

thats a new one

frigid cargo
#

how can i check if first card in played hand is a specific rank?

twilit tundra
#

ok its getting late im gonna go to bed

vernal path
daring fern
frigid cargo
#

yes thanks

#

how do i make a for loop that puts specific ranks in?

chrome widget
#

makin' more joker arts

dreamy lodge
#

How does context.selling_card work? I turned "selling_self = <>" to false yet its still triggers when it gets sold? Am I misunderstanding it somehow?

daring fern
#

‎

pastel kernel
#

Anti Joker - Rare - Played cards have a 1 in 4 chance to be given a random enhancement
How do I make it so that played cards gain a random enhancement?

thorny ether
#

Hey, so my custom Joker doesn't seem to work with blueprint and I'm at a loss. Can someone point me to the right way? I'm terrible at coding.

icy depot
#

is there a good guide to start with making a mod

sturdy compass
sturdy compass
#

A lot of this also does not follow typical standards for joker coding. Have you taken a look at VanillaRemade? That may help you with your structure and potentially solve your issue as well

thorny ether
vernal path
#

I'm doing something wrong, I'm not sure how check_for_unlock works as I've never used it before:

  check_for_unlock = function(self, args)
    if args.type == 'modify_jokers' and G.jokers then
      for _, joker in ipairs(G.jokers.cards) do
        if joker.ability.set == 'Joker' and joker.key == 'j_cavendish' then
          return true
        end
      end
      return false
    end
  end```
It's supposed to unlock if you obtain a cavendish, but I'm not sure how that works here
sturdy compass
#

I can tell what it's trying to do

thorny ether
#

Currently he works even with multiple copies but I couldn't get Blueprint/Brainstorm to play nice with it

sturdy compass
vernal path
#

right, yeah
i was honestly just copying some code from bootstraps, and obviously i dunno what i was doing

#

:P

sturdy compass
#

Also the elseifs between contexts aren't very standard

#

You could also simplify it to two checks by changing your first value from a number to a boolean and tacking on a if not card.ability.extra.first to your conditional (or whatever syntax you wanna go with)

dreamy lodge
sturdy compass
thorny ether
#

Yeah, I'll totally try that out thanks

#

Also do you think Blueprint doesn't play nice because it doesn't look at my first value? When I remove the value check it works

#

Been looking for a workaround for like an hour now 🙁

dreamy lodge
sturdy compass
#

yes

dreamy lodge
sturdy compass
#

And what is the intended function?

sturdy compass
#

Lowkey I would rewrite it myself right now but it is late asf for me

thorny ether
#

Yeah I'll try that and see how it goes, thanks for the advice

dreamy lodge
sturdy compass
#

I genuinely don't even know what to make of this mess of code 😭

dreamy lodge
#

?

#

is it that bad

sturdy compass
#

I have never seen balatro code look like this

#

take that how you will

slim ferry
#

why returning the cardarea............... 😭

sturdy compass
#

Anyways to solve the problem you're trying to fix is simply replace context.selling_card with context.selling_self

dreamy lodge
#

no I want it NOT to trigger when selling self

sturdy compass
#

So only when selling another joker

dreamy lodge
#

yes

sturdy compass
#

if context.selling_card and not context.selling_self and context.card.ability.set == 'Joker' and G.GAME.blind.in_blind then is your conditional then

umbral zodiac
#

holy context

sturdy compass
#

yeah

dreamy lodge
#

that doesnt work

#

its still triggering on self sell

#

I tried that exact line of code earlier I cant get this to work i dont understand

sturdy compass
#

then try replacing the not context.selling_self with not context.card == card

#

context.card ~= card should also work and is probably better for brevity's sake

dreamy lodge
slim ferry
#

so you have to use context.card ~= card

sturdy compass
#

Yeahh I forgot about that

#

I hate Lua sometimes

#

and it's late

#

:)

high verge
#

Where does one put localization text for a custom seal?

sturdy compass
#

Under Other

dreamy lodge
high verge
#
            hbp_belphegor_seal={
                name="Belphegor",
                text={"Test."}
        }``` Like this?
sturdy compass
#

yep

dreamy lodge
#

@sturdy compass thx also

sturdy compass
#

np

high verge
#
        localize = "hbp_belphegor_seal"}```

I have this in the seal but it doesn't seem to work
sturdy compass
#

You shouldn't need that if you're using a localization file

thorny ether
#

Okay this is so weird, I got it to work by setting
local thisdamncard = context.blueprint_card or card

#

Yep tested a few times and nothing went wrong for now, thanks for giving me ideas Astra!

high verge
#

Okay so the only problem remaining now with the sigil is that the description isn't updating.

#
                name="Belphegor",
                label="Helluva Boss",
                text={
                    'This Seal gains {X:red,C:white}X1{} Mult',
                    'if in hand at end of each round',
                    'and applies it when played hand scores',
                    '{C:inactive}(Currently {X:red,C:white}X#1# {}{C:inactive} Mult){}',
                    '{C:inactive}(Resets if played)'
                }
            }``` I have this in localization
#
    key = 'belphegor',
    pos = { x = 2, y = 1 },
    config = {
        extra = {
            sleepypoints = 1
        }
    },
    badge_colour = HEX('d80007'),
    atlas = 'helluvaseals',
    unlocked = true,
    discovered = true,
    no_collection = false,
    loc_vars = function(self, info_queue, card)
        return {vars = {self.config.extra.sleepypoints}}
    end,
    calculate = function(self, card, context)
        if context.cardarea == G.hand and context.main_scoring then
            return { x_mult = card.ability.seal.extra.sleepypoints }
        end
        if context.main_scoring and context.cardarea == G.play then
            card.ability.seal.extra.sleepypoints = 1
            card_eval_status_text(context.blueprint_card or card, 'extra', nil, nil, nil, {message = "Reset Sleep", colour = G.C.BLUE})
        end
        if context.end_of_round and context.cardarea == G.hand and context.other_card == card and context.individual then
            return { func = function()
                    card.ability.seal.extra.sleepypoints = (card.ability.seal.extra.sleepypoints) + 1
                    return true
                end }
        end
    end
}``` And this is the seal itself
#

I'm trying to get the description to properly show how much of a mult it is giving but it's remaining at the default value

#

And apparently the label isn't working anymore

#

đŸ«“

#

Yeah that's completely the reaction I wanted

sturdy compass
#

Instead of indexing self.config in loc_vars, you should index card.ability.seal like you would in your x_mult return

high verge
sturdy compass
#

It’s as 🩐le as that

high verge
#

Is it as shrimple fixing the error on the label? xD

#

I put in text= and label= but neither seems to be fixing it

#

Coding errors at my level are hilarious since most of the times I'm just using a wrong word or it's a syntax error of a missing damned comma or bracket

#

Ignore the ugly seals I'm still figuring out how they should look

tall wharf
high verge
#

I know I hate it but I can't figure out how to phrase it smaller

sturdy compass
#

In your localization under misc/labels do seal_key = ‘text’

high verge
#

Ah interesting that it's in a different area.

sturdy compass
#

This is outside of descriptions btw

high verge
#

Mhm

#
            seal_hbp_belphegor = 'Helluva Boss'
        },```
#

I appear to be doing it wrong?

#

I have it in the misc outside of descriptions

#

Fixed it putting seal at the end insteada

#

Thank you very much

#

Now I just need to make sure the strengthening is working correctly then this seal is ready to go

#

And hopefully rewording the description smaller

jolly pivot
#

Or does it always apply when held in hand like a steel

high verge
#

So what it currently does is while it's in your hand and not being used it'll add the xmult when your hand is scored. At the end of a round this value gets larger if in hand but if you use the card in a played hand the value resets.

#

Or that's what it's supposed to do, it seems the adding value at end of each round it's held isn't working

robust marsh
#

gem

#

thank you, I needed help w creating one

high verge
#

It's a little smaller?

#

How do I multibox this?

faint yacht
#
text = {
  { 'aeiou' },
  { 'aeiou2' }
}
high verge
#

Hmm that's giving me an error

#
            hbp_belphegor_seal={
                name="Belphegor",
                text={
                    {'{X:red,C:white}X#1#{} Mult',
                    'while this card',
                    'stays in hand',},
                    {
                    'Gains {X:red,C:white}X1{} if in hand',
                    'at end of round',
                    '{C:inactive}(Resets if played)'},
                },
            }
        }```
faint yacht
#

-# ...ah, seal... not sure.

high verge
#

xD

#

Do multiboxes not function in seals?

faint yacht
#

¯_(ツ)_/¯

high verge
#

Okay neat it's not upgrading at the end of the rounds like it's supposed to

#

đŸ«“

#

Muscle memory is gonna kill me with this emote xD

frigid cargo
#

how do i make a for loop that puts specific ranks in a list or smth from played cards?

vernal path
#

What do you mean? Puts ranks where?

stiff locust
faint yacht
#

Multibox descriptions.

high verge
#

Sadly not seal descriptions

#

Currently Belphegor for some reason is giving +2 instead of +1 at the end of each round đŸ«“

#
    key = 'belphegor',
    pos = { x = 2, y = 1 },
    config = {
        extra = {
            sleepypoints = 1
        }
    },
    badge_colour = HEX('d80007'),
    atlas = 'helluvaseals',
    unlocked = true,
    discovered = true,
    no_collection = false,
    loc_vars = function(self, info_queue, card)
        return {vars = {card.ability.seal.extra.sleepypoints}}
    end,
    calculate = function(self, card, context)
        if context.cardarea == G.hand and context.main_scoring then
            return { x_mult = card.ability.seal.extra.sleepypoints }
        end
        if context.main_scoring and context.cardarea == G.play then
            card.ability.seal.extra.sleepypoints = 1
            card_eval_status_text(context.blueprint_card or card, 'extra', nil, nil, nil, {message = "Reset Sleep", colour = G.C.BLUE})
        end
        if context.end_of_round and context.cardarea == G.hand then
        -- and context.other_card == card and context.individual then
            return { func = function()
                    card.ability.seal.extra.sleepypoints = (card.ability.seal.extra.sleepypoints) + 1
                    return true
                end }
        end
    end
}```
#

I'm also getting an error about repitition tables that is likely 100% related

stiff locust
#

can I get the player's steam ID

vernal path
#

I'm not sure that even the C code has that information, let alone love

stiff locust
#

if steam stores it locally in any way then surely I can filesystem it?

#

I think I can actually

vernal path
#

uhhhh I'm not sure there'd be a consistent way to get that information
or at the very least, it would make whatever you were doing instantly break on linux

#

It'd also be super invasive and unsafe

stiff locust
#

it's behind an opt-in feature on my mod's config along with the rest of my filesystem content

#

so I'd like to say that it's okay since you yourself enable these features

#

I'm only really looking into it as a more robust way of checking if a person is a person over profile name or profile folder name

vernal path
#

still not amazing
Anyway the steam id3 is in Steam/userdata

#

i dunno if lua can check the name of a folder

stiff locust
#

it can

#

i'm already well versed in that regard

#

before I do that I want to do one other thing

#

which is to make the filesystem config reset to false when you update the mod

#

as an extra layer of "you opted in so it's your fault"

vernal path
#

you could have it create a file named the mod version, and check if that file is present

#

and then if you enable it, you create that file

#

(or like, log it in a file)

#

(thats probably better)

stiff locust
#

đŸ€”

#

yeah I can probably do that

#

<@&1133519078540185692>

#

I can read the metadata.json file to get the current version

#

thanks mods

#

I'll see if I can figure that out after the next content batch

vernal path
#

So like
they turn on filesystems last update, so it created a folder called ver_log or something
and then it put the version number into it
and then when they update, you check if that file is there (if its not disable the config)
and if that file contains the current version (if it doesnt, disable the config)
and then if they enable it, create the file or append to it the current version

stiff locust
#

indeed

vernal path
#

oh, and you should probably make it accessible to input a specified steam directory
so if they are on linux or are using a non standard file system they can still play along

stiff locust
#

i don't know exactly how to do that ingame, but I put comments in the files that say you can do that and outlined where to do it

vernal path
#

i think thats probably the best thing

#

maybe in the config page tell them about it

stiff locust
#

if I can make a text input in the config I'll do that

#

that would be my preferred method

#

i mostly want to use the steam ID as a way of checking that someone is someone

#

that lets me make person specific effects which sounds good for jokebox

vernal path
#

lmao?

#

checking to see if they are roffle
so you can cause photochad to always spawn

stiff locust
#

I wanna make a joker that gives X1 mult for each character you've beaten me with in a full match of guilty gear strive

stiff locust
#

i've been doing stuff like this lately to try to manipulate the minmaxxers

#

if someone wants to get the most out of jokebox they will challenge me to strive and I get to play more strive and they get more xmult and we both win

frigid cargo
stiff locust
#

yes I know they can just change the file to do it, but that will always be a problem regardless of what I do, the steam ID is the best I can do at verifying it in a way that is difficult for somebody to decode without coding knowledge

vernal path
#

it would probably be better to check the steam console log then

stiff locust
#

I don't know what that is

vernal path
#

oh wait no im stupid asf

#

its in steam/logs

modern kindle
stiff locust
#

i don't know what that is either

frigid cargo
#

Hi dilly

modern kindle
#

hi

stiff locust
#

if there is some way I can stop people from changing the filesystem lua files it would be cool

vernal path
#

ah i found the best place to check i think

stiff locust
#

while I do attribute going into the mod and changing the xmult values to be the same as using debugplus to press "win the blind" not everyone shares that point of view

vernal path
#

C:\Program Files (x86) (or whatever, its been a minute since ive been on windows)\Steam\config\config.vdf

#

its got a key "Accounts" which has their name and steam id

#

i have no idea how to read this in lua, but im sure you can figure out how to parse a massive file

#

(its really probably too large lmao, make your ram usage skyrocket for no raisin)

#

its such a big file kate didnt like me loading itt

stiff locust
#

i think i will just check the userdata folder to avoid a massive amount of ram usage whenever I access the value

vernal path
#

thats fair

stiff locust
#

iirc love.filesystem goes line by line on reading files

vernal path
#

i was looking for steam64 id which is the one you use for profiles, usually

stiff locust
#

that would take ages

vernal path
#

but if you are just comparing it to one value it doesnt matter lmao

stiff locust
#

yeah it should be fine

vernal path
dreamy lodge
#

Is there a way to make a joker show up more often without using a custom rarity?

stiff locust
#

yes

dreamy lodge
#

how so?

stiff locust
#

i don't remember

#

but there is a way

vernal path
#

> refuses to elaborate further

stiff locust
#

genuinely I don't remember how

#

but I know for a fact that there is a way to do it

#

I'm pretty sure uhhh

vernal path
#

maybe wait until N' is awake, lmao

stiff locust
#

saukhonghudecks

#

does it

#

i mightve spelled that wrong

#

but they have a tsaunami deck which makes splash more likely to appear

stiff locust
#

it does other things

#

retriggers every played card 1 time for each splash you have

#

it has crossmod with tsunami (splash sleeve makes it work with splash fusions too)

#

so check there yeah

stiff locust
# vernal path lmao???

obligatory jokebox plug
-# you seem impressionable and subject to shock value humor which jokebox is good for

vernal path
#

i mean i find it mildly funny
i dont necessarily want to play it

stiff locust
#

damn

dreamy lodge
stiff locust
#

it does both

#

go go go

vernal path
#

i mean the two would be separable, so it shouldnt be a problem

dreamy lodge
#

I guess I just have to search through all of the code now to look for it mr_bones

stiff locust
#

you're looking for a take_ownership

#

i would asume

dreamy lodge
vernal path
#

yeah, thats what i figured
its probably a part of the deck code instead

stiff locust
vernal path
#

uhhhhhh

#

maybe its a lovely patch??

stiff locust
#

idk where the code is for it

cursive gazelle
#

hello modders

dreamy lodge
dreamy lodge
cursive gazelle
#

shop weight

#

i don't think it's an argument to jokers tho

#
SMODS.Rarity{
    key = "supercommon",
    default_weight = 0,
    badge_colour = HEX('8c94a3'),
    pools = {
        ["Joker"] = true
    },

}```
stiff locust
#

supercommon

cursive gazelle
#

extracommon some might say

#

@stiff locust how do i rotate sprites again

stiff locust
#

hell if I know

#

I never got it to work the way I wanted it to

#

scrapped the code and the idea

cursive gazelle
stiff locust
#

i wanted to make a beyblade joker that would play the beyblade song and spin for its duration and give benefits until it stopped spinning

#

the duration being in real world seconds

cursive gazelle
#

just stopped ?

stiff locust
#

it never spun

#

that's like, half of the joke

cursive gazelle
#

damn

stiff locust
#

I didn't wanna do it if it wouldn't spin

cursive gazelle
#

did it at least rotare

#

rotate*

stiff locust
#

kind of?

#

ask n' about it, joyousspring has better rotating code for defense position stuff

cursive gazelle
#

i just want a 45deg rotating

stiff locust
#

i rotate for fun and n' rotates for glory

dreamy lodge
# cursive gazelle shop weight

Oh so it wont do anything in a joker then? so then is it impossible to show up more often without using custom rarity?

#

Well rip my joker idea

cursive gazelle
#

this is simpler

dreamy lodge
#

Well for my joker idea a custom rarity wouldnt really work

#

I wanted the joker itself when you have it to increase the chances of you getting another

#

Maybe I thought of a workaround, is it possible to make a joker appear in the shop via a jokers effect

#

cus if so I could just make in a 1 in 10 chance or somethin then boom it shows up more often

cursive gazelle
#

you can spawn it in shop

primal robin
cursive gazelle
#

like tags do

dreamy lodge
#

yeah that should work right?

cursive gazelle
#

yes

dreamy lodge
#

so how does that work exactly? I tried copying some of the stuff from the tags in vanilla remade but it wasnt working

#

Is it formatted different since its a joker not a tag

cursive gazelle
#

you have to check for entering a shop

#

how are you doing this exactly ?

dreamy lodge
#

in the wiki I only see reroll and leaving shop not enter shop

cursive gazelle
#

i think it's a state but there's a context for leaving a shope

#

surely there's a one for entering

cursive gazelle
#

sounds reasonable to me

#

you could also add a chance to spawn for every reroll

dreamy lodge
#

great idea

#

so now how do I make it appear?

#

just the same way they do in tags?

cursive gazelle
#

rip the code from rare tag

#

not all of it

#
local card = SMODS.create_card {
                set = "Joker",
                area = context.area,
                key_append = "v"
            }
            create_shop_card_ui(card, 'Joker', context.area)
            card.states.visible = false
            tag:yep('+', G.C.GREEN, function()
                card:start_materialize()
                card.ability.couponed = true
                return true
            end)
            return card```
#

woops

#

add key="j_modprefix_jkey",

#

and your usual proba in context

dreamy lodge
#

it crashed

cursive gazelle
#

i think you can get rid of it

dreamy lodge
#

It crashed again even after removing that

cursive gazelle
#

what's the crash ?

wispy falcon
#

Is there a reason why it's config = { extra = { something = "something" } } instead of config = { something = "something" } in Jokers?

dreamy lodge
#

it crashed on the reroll

cursive gazelle
cursive gazelle
dreamy lodge
cursive gazelle
#

set means a set of cards

#

like jokers tarots spectrals etc

dreamy lodge
#

I thought you said to swap them with the key?

cursive gazelle
#

no i sad add the key=

#

lol

dreamy lodge
#

oh

#

oops

#

so like this?

wispy falcon
#

What is the table with all planet cards again?

cursive gazelle
#

also fix your syntax it's cooked a little

dreamy lodge
cursive gazelle
cursive gazelle
dreamy lodge
#

are they not aligned already?

wispy falcon
cursive gazelle
#

there's a set

daring fern
cursive gazelle
#

yes

dreamy lodge
wispy falcon
cursive gazelle
#

check vanilla remade wiki to see how you can fetch them

daring fern
daring fern
dreamy lodge
#

I see

dreamy lodge
gaunt phoenix
#

I'm trying to code a joker who enhances all cards on the last hand of the round (triggering as the same time as dusk)

Does someone sees a problem here ? It just.. don't work. It's not crashing, it's just doing absolutely nothing :c (pls ping me)

dreamy lodge
#

its not crashing anymore but its no doing anything

dreamy lodge
daring fern
gaunt phoenix
daring fern
daring fern
#

It would be G.shop_jokers

dreamy lodge
wispy falcon
gaunt phoenix
daring fern
wispy falcon
#

Oh, okay

dreamy lodge
daring fern
dreamy lodge
#

Okay its working now but its just adding a third card to the shop now? shouldnt it be replacing one of the other ones like the rare tag

daring fern
dreamy lodge
#

I ripped all of the stuff from the rare tag so I thought it would

#

well how do I replace one of the slots then

dreamy lodge
daring fern
wispy falcon
#

How would I make them not all spawn instantaneous but rather one after each other? Using delay() in the for loop doesn't work...

      SMODS.add_card(planets)
end```
gaunt phoenix
#

is it possible to make a joker impossible to debuff ?

gaunt phoenix
daring fern
gaunt phoenix
#

and where am I supposed to put this ? In my joker code ? Or another place ?

gaunt phoenix
#

okay, will try that

#

thanks for the help ✹

daring fern
dreamy lodge
#

Oh can you only replace shop slots via tags?

daring fern
wispy falcon
dreamy lodge
#

are custom tags hard to make?

daring fern
cursive gazelle
#

i made 10 yesterday lol

daring fern
dreamy lodge
#

?

#

yeah but I'd have to make a custom tag for that to matter hence why I asked

wispy falcon
daring fern
dreamy lodge
#

no

dreamy lodge
#

that seems confusing

#

so its just a way to do extra stuff?

daring fern
dreamy lodge
daring fern
stiff locust
#

what's the weight of the uncommon rarity

red flower
rotund sable
#

Is there any documentation/example code about creating a custom CardArea and displaying it in UI?

manic rune
rotund sable
#

Well I overcomplicated it in my head then

#

Ty

#

Also is there a function that creates the entire deck or do I have to create one myself

errant arrow
#

i am very confused now, didn't have this issue with Nature's Assistence, but now im having trouble with a new mod.
The new mod "The Brutal City" is in the mod list, but isnt being detected by balatro

red flower
#

Is it in the mod list in-game?

errant arrow
#

no, i have it in the files but it's not being detected

#

this is the meta data for it

red flower
#

author has to be an array iirc

errant arrow
#

well... i know it's being detected now. got a game crash and from the looks of it, it's talisman

red flower
#

that looks like a card description has the wrong format

errant arrow
#

yeah i see the issue now

#

-# good thing i have another mod to look at to figure out what happened-

#

alright, it works now, thank you

wispy falcon
#

Does anyone know, why this results in the sprites x to immediatley jump to 9 before just doing what it should do (0, 1, 2 etc.)?

        if card.ability.extra.animation == true then
            print(card.children.center.sprite_pos.x)
            card.children.center:set_sprite_pos({ x = math.floor(G.TIMERS.REAL * 1) % 10, y = 1 })
        end
    end,
red flower
#

it's based on the time so it will do whatever sprite time % 10 gives you first

#

if you need to start at the beginning then you would need to keep a separate counter probably

wispy falcon
#

How?

#

Because this just sprints through because update gets called every frame

        if card.ability.extra.animation == true then
            if card.ability.extra.frame > 9 then
                card.ability.extra.frame = 0
            end
            print(card.children.center.sprite_pos.x)
            card.children.center:set_sprite_pos({ x = card.ability.extra.frame, y = 1 })
            card.ability.extra.frame = card.ability.extra.frame + 1
        end
    end,```
red flower
#

you need to only increment when some amount of time passes

wispy falcon
#

And how would I keep track of that?

red flower
#

either with G.TIMERS.REAL or dt

wispy falcon
#

What was the difference again?

rotund sable
#

Surely delay() would be the solution đŸ«Ł

wispy falcon
red flower
#

i dont think its a good idea to delay for animations

#

it will delay everything else all the time

rotund sable
#

I gave the worst idea that I could think of

#

I recall seeing that delay is just a blocking event or something

red flower
# wispy falcon What was the difference again?

timers.real is a timer while dt is delta time, so for the first you would have to keep track of the initial value while for the second you need to accumulate it until it reaches the time you want (also dt respects game speed)

wispy falcon
#

Hey, this works :D

            local frame_duration = 0.25

            -- dt is the time since last frame (comes from engine)
            card.ability.extra.timer = (card.ability.extra.timer or 0) + dt

            if card.ability.extra.timer >= frame_duration then
                card.ability.extra.frame = card.ability.extra.frame + 1
                card.ability.extra.timer = card.ability.extra.timer - frame_duration
            end```
#

I have a different problem TwT. Why does this sometimes result in an error?

                        delay(0.15)
                        G.E_MANAGER:add_event(Event({
                            func = function()
                                SMODS.add_card(planets)
                                return true
                            end
                        }))
                    end```
stiff locust
#

how could I remove all stickers from a joker

wispy falcon
red flower
#

you can use G.real_dt

gilded goblet
#

prolly not the best

stiff locust
gilded goblet
#

yeah...

wispy falcon
manic rune
#

how do i make the box's outline or something not stretched
fixed

#

hmmmmmmmmmmmmmmmm

wispy falcon
manic rune
#

:p

primal robin
#

makes sense

#

Still dont know whats the deal with this full ui table

manic rune
#

im p sure main is for names and descriptions, while info refers to the info_queue boxes

primal robin
#

I was not working with card iu this much, so every time I see this table it feels bad

manic rune
#

same, same, but recently ive been working with card ui a lot so im getting used to it 3:
-# most notably the multi line, formatted info queue name shit, that took at least 5 years from my life span

rotund sable
#

well this is a first (i had vscode running with one dump file open)

primal robin
#

Multi lines when you don't have access for smods kinda problematic

#

You have 2 options: use localize with type like 'descriptions', 'unlock', or literally copypaste part where localize function construct lines

manic rune
#

iirc for the pr i added a flag for when info queues are created, then instead of using G.UIT.T in the name node it uses G.UIT.O instead đŸ€”

#

i had to manually tweak the DynaText's scale until it looks pretty much identical to how the old G.UIT.T looked like lol

primal robin
#

A lot of patching yay

manic rune
#

true...

primal robin
#

I have in my plans make a collection of UI components

#

Whih you can copy-paste and they will work

#

With room for customization, and docs

manic rune
#

mmmm very interested in how that would turn out

primal robin
#

Tbf I found this much more interesting than developing content or waste time try to position card area properly

thorn basin
#

I made a boss blind that debuffs a random rank avaiable in the full deck and changes every hand but for some reason it doesn't debuff anything, how can I fix this?

mystic river
glossy sky
#

how do you make a Joker that triggers on individual context not trigger on retriggers?

mystic river
#

though Card:remove_sticker() is a function that exists and probably works better

gaunt phoenix
#

I was wondering : would it be possible to make a deck where only my modded jokers can spawn ? if yes, how could I do that ? (pls ping me)

rotund sable
frosty dock
rotund sable
#

yes i know

#

it would be (v.mod or {}).id == "id"

frosty dock
#

-# also this goes in apply

thorn basin
#

why it doesn't debuff the cards from a random selected rank of the full deck?

distant junco
#

How does updating the loc_text work in the update function

#

Would I be able to update specific lines by themselves?

gilded goblet
#

now i need to figure out how to make the stickers not be applied in stakes its not supposed to... send help

#

i have a silly idea

hardy viper
#

reading the documentation :

rotund sable
#

CardAreas are in fact not easy

gilded goblet
frosty dock
#

somehow the sticker gets blocked? idk why

errant arrow
#

What was the code to load a file?
I remember it being something like

assert(load_file:

from there I get lost

rotund sable
errant arrow
#

Thank you!

gilded goblet
rotund sable
red flower
#

if its not patched then theres no dump

rotund sable
#

how would CardArea.FRAME be nil if it's defined in the Node:init then

red flower
#

dunno

rotund sable
#

ok wth??

#

still crashes

#

im confused

#
EF.CARDAREAS.blackjack_dealer = CardArea(
  0, 0,
  G.CARD_W * 8, G.CARD_H,
  {
      card_limit = 8,
      type = 'title',
      highlight_limit = 0,
  }
)
{n = G.UIT.T, config = { text="Dealers Cards", scale = 0.75, colour = G.C.UI.TEXT_DARK}, nodes = {}},
{n = G.UIT.O, config = { object = EF.CARDAREAS.blackjack_dealer }},
red flower
#

when does it crash

rotund sable
#

when i call the ui function

#
function EF.FUNCS.UIDEF.blackjack_game(bet)
  if not bet then error("where the hell is the bet") end
  if not EF.vars.minigames.main_menu then ease_dollars(-bet, true) end

  return {
    n=G.UIT.ROOT,
    config = {r = 0.1, minw = 15, minh = 8, align = "cm", colour = G.C.BLACK, padding = 0.5},
    nodes = {
      {n=G.UIT.R, nodes={
        {n = G.UIT.T, config = { text="Dealers Cards", scale = 0.75, colour = G.C.UI.TEXT_DARK}, nodes = {}},
        {n = G.UIT.O, config = { object = EF.CARDAREAS.blackjack_dealer }},
      }}
    }
  }
end
#

this one

red flower
#

do you have that in a uibox

rotund sable
#

i in fact dont

#

damn

#

i have no idea what im doing

vocal helm
#

I might be missing something incredibly simple despite staring at the docs for roughly an hour, but my modded joker isn't showing up and I have a feeling it has to do with my localization files
for context, this is my en-us.lua file:

return {
    descriptions = {
        Joker={
            j_j8mod_prophecy = {
                name = "Prophecy",
                text = {
                    "After {C:attention}#1#{} rounds,",
                    "sell this card to",
                    "create a {C:spectral}Spectral{} card",
                    "{C:inactive}(Currently {C:attention}#2#{C:inactive}/#1#)"
                }
            }
        }
    }
}

and this is the one Joker (doesn't do anything yet) I have in my jokers.lua file:

-- Prophecy
SMODS.Joker = {
    key = "prophecy",
    atlas = "j8-jokers",
    unlocked = true,
    blueprint_compat = false,
    discovered = true,
    eternal_compat = false,
    rarity = 2,
    cost = 6,
    pos = { x = 0, y = 0 },
    -- add draw function later
    config = { extra = { prophecy_rounds = 0, total_rounds = 3 } },
    loc_vars = function(self, info_queue, card)
        local main_end
        return { vars = {card.ability.extra.total_rounds, card.ability.extra.prophecy_rounds }, main_end = main_end }
    end
}```
My mod `id` is "J8Mod" and my mod `prefix` is "j8mod"; idk if I'm meant to format the variables in the localization in a specific way
slim ferry
#

jokers still show up even without any localization text

#

youre probably just not loading the file its in

vocal helm
#
-- ## MOD SETUP ##

assert(SMODS.load_file("src/jokers.lua"))()

-- ## JOKER ATLASES ##

SMODS.Atlas { 

    key = "j8-jokers",
    path = "jokers-temp.png",
    px = 71,
    py = 95

}
``` i am
slim ferry
#

hmmm

vocal helm
#

(this is j8mod.lua)

rotund sable
#

is j8mod.lua defined as the main file in the json?

vocal helm
#
{

    "id": "J8Mod",
    "name": "Forager Nonessentials",
    "author": ["J8-Bit"],
    "description": "Mostly shameless reference Jokers.",
    "prefix": "j8mod",
    "main_file": "j8mod.lua",
    "version": "0.0.1"

}
frosty dock
#

but it got blocked

#

so I had to send it has an emoji

errant arrow
#

How does rarity creation work? Trying to make something between Rare and Legendary

#

I've looked at the smods wiki and it's hieroglyphics to me

slim ferry
#

it has like a key

#

thats like half of the rarity

#

and the other half is the weight and colour

gilded goblet
frosty dock
#

lol I guess out of context, what I said doesn't make any sense

gilded goblet
#

i think the server has stickers and gifs blocked

#

well i mean, gifs from tenor and perhaps giphy

frosty dock
#

I knew about gifs

gilded goblet
#

or whatever the hell it is called

frosty dock
#

Just didn't know it also blocks stickers

gilded goblet
#

yeah thats silly (kinda)

#

i can see why but idk

gilded goblet
#

okay, im a bit confused about how i should go about telling my sticker "if card has eternal, then do not apply our sticker"
how can i go about that? and perhaps this is rlly simple but i just cant wrap my head around it atm lol

vocal helm
red flower
vocal helm
#

correct

red flower
#

can you take screenshots of your file structure?

vocal helm
red flower
vocal helm
#

yeah I changed it to forager_nonessentials.lua

red flower
#

weird

#

i think the joker should load but crash

vocal helm
#

trying something simpler to start helped i think

#

tried a different simpler joker idea and I think it works

#

well. some things worked, some things didn't

#

looks like i gotta fix the card offsets too

exotic hedge
vocal helm
#
-- jokers.lua
-- ## JOKERS ##

-- 69 Joke
SMODS.Joker {
    key = "69_joke",
    blueprint_compat = true,
    rarity = 1,
    cost = 4,
    atlas = "j8jokers",
    discovered = true,
    pos = { x = 0, y = 2 },
    config = { extra = { chips = 9, mult = 6 } },
    loc_vars = function(self, info_queue, card)
        return { vars = { card.ability.extra.chips, card.ability.extra.mult } }
    end,
    calculate = function(self, card, context)
        if context.individual and context.cardarea == G.play and
            (context.other_card:get_id() == 6 or context.other_card:get_id() == 9) then
            return {
                chips = card.ability.extra.chips,
                mult = card.ability.extra.mult
            }
        end
    end
}
--en_us.lua
return {
    descriptions = {
        Joker={
            j_j8mod_69_joke = {
                name = "69 Joke",
                text = {
                    "Each played {C:attention}10{} or {C:attention}4",
                    "gives {C:chips}+#1#{} Chips and",
                    "{C:mult}+#2#{} Mult when scored",
                },
            },
        }
    }
}
#

ok i got it working

#

j_j8mod_69_joke was misspelled as "j_jmod_69_joke"

rotund sable
red flower
#

G.box = UIBox {definition = EF.FUNCS.UIDEF.blackjack_game(bet), config = {}}
something like that

rotund sable
#

i swear the last time it didn't work

#

im just coping at this point

#

ty N <3

robust marsh
#

creating a custom card area is proving to be quite torturous

red flower
#

whats the problem

queen meadow
#

is there a check or a context for when a seal is triggered?

robust marsh
# red flower whats the problem

i kinda realized that i have no clue what i'm doing when it comes to UI, feels like I'm walking on eggshells because I break the area whenever I try to tamper with it

queen meadow
robust marsh
#

getting there

rotund sable
# rotund sable ty N <3

found out why the original crash happened to my card area, i tried to render it in main menu

#

wait that's not entirely true

#

it was this line....

#

why the hell did i pass 0 in the place of an element

#

there goes a few hours for stupid crap

robust marsh
#

I mostly got my card area to work but when i try to emplace a card it just shifts the card area and it stays in this position forever no matter which deck i am trying to use

robust marsh
#

yup one moment

robust marsh
# cursive gazelle Code?
local start_run_ref = Game.start_run
function Game:start_run(args)
    if not self.pactive_area then
        self.pactive_area = CardArea(
            0, 0,
            self.CARD_W * 1,
            self.CARD_H * 1.25,
            { card_limit = 1, type = "consumeable", highlight_limit = 1 }
        )
    end
    G.pactive_area = self.pactive_area
    start_run_ref(self, args)

    if not self.pactive_ui then
        self.pactive_ui = UIBox {
            definition = {
                n = G.UIT.ROOT,
                config = { align = 'cm', r = 0.1, colour = G.C.CLEAR, padding = 0.2 },
                nodes = {
                    { n = G.UIT.O, config = { object = self.pactive_area, draw_layer = 1 } }
                }
            },
            config = { align = 'cmi', offset = { x = 9, y = 5 }, major = self.jokers, bond = 'Weak' }
        }
        G.pactive_ui = self.pactive_ui
    end

    if G.consumeables and G.consumeables.config and G.consumeables.config.type then
        self.pactive_area.config.type = G.consumeables.config.type
    end
end
        G.E_MANAGER:add_event(Event({
            trigger = 'after',
            func = function()
                if G.pactive_area then
                    local c = create_card("taintedcards", G.pactive_area, nil, nil, nil, nil, "c_tdec_abyss")
                    c:add_to_deck()
                    G.pactive_area:emplace(c)
                end
                return true
            end
        }))
cursive gazelle
#
G.E_MANAGER:add_event(Event({
    trigger = 'after',
    func = function()
        if G.pactive_area then
            local c = create_card("taintedcards", G.pactive_area, nil, nil, nil, nil, "c_tdec_abyss")
            c:add_to_deck()
            

            table.insert(G.pactive_area.cards, c)
            c.area = G.pactive_area
            c:set_pos(G.pactive_area:get_pos(#G.pactive_area.cards))
            c:align()
        end
        return true
    end
}))```
#

Try this

robust marsh
#

oki

cursive gazelle
#

I’ll definitely nuke your game with this one

robust marsh
#

i removed set_pos, everything works properly

#

thank you ❀

cursive gazelle
#

Ah

#

No worries i did nothing

robust marsh
robust marsh
red flower
#

yes

robust marsh
#

alright

red flower
#

that one doesnt exist i dont think

robust marsh
#

ah

cursive gazelle
robust marsh
#

I thought it does

cursive gazelle
#

Don’t argue with the boss

robust marsh
#

😭

#

hm this is weird.. my consumable is acting odd when in the new card area. Normally it's supposed to gain a "charge" at the end of a round but for some reason that functionality is just absent and I can't see why this would affect that segment

distant junco
#

is there any guide/documentations for how to update text like the description of a joker?

rotund sable
#

"i wonder why it crashes"
my Object Node

cursive gazelle
#

Return res in your loc_vars

distant junco
#

what

frosty rampart
#

what s gave you is a code snippet that generates a random string of 5 alphanumeric characters, which if it was in your loc_vars function and then you returned res as one of the variables, would create a new random string every frame and result in a constantly shifting gibberish description similar to misprint's

robust marsh
#

mmm huh.. I guess cards can't recognize end of round in the new card area

#

holy pain

gilded goblet
#

im so fucking close to making my sticker work, img onna take a break for now since i literally cant think of anything else to try

robust marsh
red flower
#

try not using it

robust marsh
red flower
#

yeah if it works without it you can do not context.individual and not context.repetition

robust marsh
red flower
#

weird

robust marsh
# red flower weird

if you want I can share the consumable's code, it's pretty messy so i'd guess things would break quite easily

red flower
#

yeah i can take a look

robust marsh
#

okih

robust marsh
#

figured it out NepGem

urban wasp
#

how am i able to create an infobox/queue like this?

slim ferry
#

just add it in descriptions.other

#

in your localization

#

and then you can do info_queue{#info_queue+1] = { set = "Other", key = <key> }

urban wasp
#

i see

robust marsh
#

the only remaining issue is the use button being longer than usual but besides that everything works just fine :)

#

if anyone knows the fix for this please do reach out

glad osprey
#

how do I modify SMODS.Back's call function

#

hook it rather

dim maple
#

hey so im trying to fix my balatro and this crash keeps happening, anyone know how to fix this? I've tried reinstalling the version.dll file and it doesn't work, thought it was the mods i have installed and its not it. I dont know

glad osprey
#

no thats a mod

#

lovely doesnt do anything on its own so its definitely some mod

dim maple
#

do you see like any mod that would conflict? because i dont

frosty rampart
#

the crash is just happening before steamodded can put together its mod list

dim maple
#

so i need to reinstall smods?

frosty rampart
#

no

#

the crash is coming from the process of loading one of your mods

glad osprey
#

for your own sake

dim maple
#

it was for a different game leaking server

languid aurora
#

I've been getting that same error any time I launch with steamodded beta 827c

#

if I launch with 810a instead it works fine, aside from aikoyori's shenanigans not working

slim ferry
#

yeah because 810a is old

#

one of your mods just doesnt work with latest smods

#

for some reason

#

i presume

languid aurora
#

oh, apparently it was cryptid

slim ferry
#

cryptid should work with latest smods

#

you probably have a mix of latest releases and latest commits which can cause issues

languid aurora
#

so cryptid 0.5.11 is a bad version then?

slim ferry
#

cryptid 0.5.11 is just old

#

latest is 0.5.12a

#

so you should probably just go and update all your mods first

languid aurora
#

ok that actually fixed it, thanks

distant junco
#

if i have a table within a table do i access it like table[1,3]

slim ferry
#

table.<key>.<key>

#

or table[...].<key>

#

or table[...][...]

distant junco
#

table[1][3]

#

ok thank you

harsh belfry
#

what is the alternative to modulo in shader code because it dont work lmfao

#

other than like a while loop imp but that seems slow

#

i'll probably do that for now i just hope that someone knows a faster way

latent perch
#

couldn't you just

uint a = 24;
uint b = 7
float modu = fract(a / b) * b 
#

but also why is modulo not working?!?! I don't know shader code well :)

gilded goblet
#

why is riff raff creating jokers with stickers bro 😭 i cant wait to be done with this shit

slim ferry
#

bwuh

#

why the fuck is it doing that

gilded goblet
#

i have no idea

harsh belfry
latent perch
harsh belfry
#

i'll do that if it explodes

latent perch
#

or maybe look at other shaders!!

#

this helped me

gilded goblet
# gilded goblet i have no idea

alright i have officially given up, if someone knows how to make stickers that actually work please @ me because id love to learn a thing or two

urban wasp
#

why does the game hate me (this is a voucher)

...
    calculate = function(self, card, context)
        if context and context.buying_card and context.card and context.card.config and context.card.config.center and context.card.config.center.key == "j_crp_bulgoe" then
            G.E_MANAGER:add_event(Event({
                trigger = 'after',
                delay = 0.1,
                func = function()
                    if context.card and context.card.config and context.card.config.center and context.card.config.center.key == "j_crp_bulgoe" then
                        context.card:set_edition("e_crp_really_negative")
                    end
                end
            }))
        end
    end,
...
slim ferry
#

looks like an edition issue and not a voucher issue

urban wasp
#
SMODS.Edition {
    key = "really_negative",
    weight = 0.3,
    shader = false,
    in_shop = true,
    extra_cost = 5,
    get_weight = function(self)
        return G.GAME.edition_rate * self.weight
    end,
    config = { card_limit = 3 },
    loc_vars = function(self, info_queue)
        return { vars = { self.config.card_limit } }
    end,
    crp_credits = {
        idea = { "PurplePickle" },
        code = { "wilfredlam0418" }
    }
}
slim ferry
#

do you have a label for it in misc.labels in your localization

urban wasp
#
...
misc = {
  ...
  labels = {
    ...
    crp_really_negative = "Really Negative",
    ...
  }
}
#

(yes)

slim ferry
#

youre missing the class prefix there

#

should be e_crp_really_negative

urban wasp
#

these all work fine

...
        labels = {
            crp_overloaded = "Overloaded",
            ["crp_four-dimensional"] = "Four-Dimensional",
            crp_zany = "Zany",
            crp_mad = "Mad",
            crp_crazy = "Crazy",
...
#

i'll try it nonetheless

#

still borked

...
            e_crp_really_negative = "Really Negative",
            e_crp_super_negative = "Super Negative",
            e_crp_photon_readings_negative = "Photon Readings Negative",
            e_crp_photon_readings_really_negative = "Photon Readings are REALLY FUCKING NEGATIVE",
            e_crp_photon_readings_gone = "Photon Readings are Gone.",
#

why does the game hate me 😭

#

i need an expert to help me out here i probably missed something super small

chrome widget
urban wasp
#

on another note, this crashes the game for some reason and i don't know why i just want my shader to use the same shader as the regular negative shader

SMODS.Edition {
    key = "really_negative",
    weight = 0.3,
    shader = "negative",
    in_shop = true,
    extra_cost = 5,
    get_weight = function(self)
        return G.GAME.edition_rate * self.weight
    end,
    config = { card_limit = 3 },
    loc_vars = function(self, info_queue)
        return { vars = { self.config.card_limit } }
    end,
    crp_credits = {
        idea = { "PurplePickle" },
        code = { "wilfredlam0418" }
    }
}
#

should it be like e_negative or something

chrome widget
#

What's the log look like?

urban wasp
#

(this is when i tried "e_negative", but "negative" has the same outcome)

chrome widget
#

says the value being sent is 'crp_e_negative'

urban wasp
#

don't know why it's try to start it with crp

#

any way to... not do that?

#

i could obviously make a new file in my mod that is just a copy of the negative shader and use that, but i would really rather not

#

unless it's the only way

chrome widget
#

Have you declared it as a new shader?

urban wasp
#

no, since i'm attempting to use a (presumably) pre-established vanilla shader

#

oh wait i'm stupid

#

it just occured to me what to do lol

#

wait no that wouldn't work nevermind

#

😭

chrome widget
#

Otherwise I'm not really sure? The shader field on vanilla negative is just "negative" as you have

urban wasp
#

yeah i think smods or something is automatically putting my prefix in front and nothing would really be able to change that

chrome widget
#

I have a theory, lemme finish cooking dinner

urban wasp
#

okay

harsh belfry
#

aint prefix config a thing

urban wasp
#

on another another note, would this work? i forget what the function for finding if a joker exists or not is

extra_cost = SMODS.find_card("j_crp_statically_charged") and 0 or 13,
chrome widget
#

Prefix config is usually for the actual item key, I thought

harsh belfry
#

like

prefix_config = {
  shader = false
}
harsh belfry
chrome widget
#

Strangely backhanded and passive aggressive statement. Try not to do that

urban wasp
indigo bloom
#

Hey! So a Joker in a mod I'm helping with has the functionality of when it's sold, it'll skip the current blind, provided it's not a boss blind. However, when one of this joker is sold, and two or more are held, every single blind will be skipped, including boss blinds. This is an issue if players in the run get the Showman Joker, since with it, they'll be able to replicate this and just win the game without really playing.
Any idea why this is happening?
This is the code

high verge
#

Where do localization for config tooltips go?

urban wasp
high verge
#

That

urban wasp
#

oh i'm not sure

high verge
#

I currently have it under dictionary with the config item name

#

But when I try to call it it gives an error

harsh belfry
chrome widget
#

Thank you, apology accepted

high verge
bold sleet
high verge
#
                                tooltip = {set = 'Other', key = 'helluvajokers_tooltip'},
                            },```

```Other={
            -- Config
            hbp_helluvajokers_tooltip = {
                name = "Why.",
                text = {
                    "Adds new jokers."
                }
            },}```
#

Okay got it working I guess I just had the wrong brackets earlier

urban wasp
#

how would i make it so that this creates a joker from the bulgoe pool instead of j_crp_bulgoe

SMODS.Voucher {
    key = "bulgscension",
    name = "Bulgscension",
    atlas = "crp_placeholder",
    pos = { x = 7, y = 2 },
    config = { extra = { } },
    requires = { "v_crp_bulgcrowd" },
    loc_vars = function(self, info_queue, card)
        info_queue[#info_queue + 1] = { set = "Other", key = "bulgoe-themed_joker" }
        return { vars = { } }
    end,
    redeem = function(self, card)
        local card = create_card('Joker', G.shop_jokers, nil, 1, nil, nil, "j_crp_bulgoe", 'bulgoverstock')
        create_shop_card_ui(card, "Joker", G.shop_jokers)
        card:set_cost()
        card:start_materialize()
        G.shop_jokers:emplace(card)
    end,
    calculate = function(self, card, context)
        if context.reroll_shop then
            local card = create_card('Joker', G.shop_jokers, nil, 1, nil, nil, "j_crp_bulgoe", 'bulgoverstock')
            create_shop_card_ui(card, "Joker", G.shop_jokers)
            card:set_cost()
            card:start_materialize()
            G.shop_jokers:emplace(card)
        end
    end,
    crp_credits = {
        idea = { "ScarredOut" },
        code = { "Rainstar" }
    }
}
#

also is there a context for when the shop is entered

red flower
#

for the other thing use SMODS.add_card{set = "bulgoe"}

urban wasp
red flower
#

then SMODS.create_card

urban wasp
#

okay then

#

what would i replace with that btw

high verge
#

How do I add a localization line that has a second line?

helluvacustomsuits_tooltip = "Changes suit names.","Clubs = Moons, Diamonds = Mammons, Spades = Crowns.", Doing this only shows the first line and gives an error for everything else. Putting brackets around it gives a "UI error" on the tooltip.

red flower
urban wasp
#

ok

high verge
#

Config tooltip

red flower
#

how are you localizing it now

high verge
#

That's the current localization code

#

Which only pulls the first line.

red flower
#

i mean what's the code you use that in

high verge
#

config = { tooltip = {text = {localize('helluvacustomsuits_tooltip')}},},

urban wasp
red flower
high verge
#

I'll try that

#

No change

#

config = { tooltip = {text = {localize('helluvacustomsuits_tooltip')},{localize('helluvacustomsuits_tooltip2')}},},``````helluvacustomsuits_tooltip = "Changes suit names.", helluvacustomsuits_tooltip2 = "Clubs = Moons, Diamonds = Mammons, Spades = Crowns.",

high verge
#

Wait

#

Yeah I just noticed the difference

#

Now it works, thanks N!

#

Is it possible to have the tooltip show when hovering over the actual toggle button as well?

urban wasp
#

i'll just like repost again in case there's a wizard that can solve this
some and only some of my editions' labels are fucked and just have a red background with "ERROR" on them
here's one of the editions maybe i did something wrong

SMODS.Edition {
    key = "really_negative",
    weight = 0.3,
    shader = false,
    in_shop = true,
    extra_cost = 5,
    get_weight = function(self)
        return G.GAME.edition_rate * self.weight
    end,
    config = { card_limit = 3 },
    loc_vars = function(self, info_queue)
        return { vars = { self.config.card_limit } }
    end,
    crp_credits = {
        idea = { "PurplePickle" },
        code = { "wilfredlam0418" }
    }
}
...
    misc = {
        ...
        labels = {
            ...
            crp_really_negative = "Really Negative",
            ...
        }
    }
...
high verge
#
    key = 'tarotsHELLUVA',
    set = 'Tarot',
    path = 'helluvatarots.png',
    loc_txt = { name = 'Helluva Tarot Cards',},
    display_pos = 'c_star',
    original_sheet = true,
    localization = true
})``` ```descriptions = {
        alt_texture = {
            alt_tex_hbp_tarotsHELLUVA = {
                c_chariot={
                    name="Stella",
                    text={
                        "This {C:attention}bitch{} enhances",
                        "{C:attention}#1#{} selected card",
                        "into a {C:attention}#2#",
                    },},},},}```

I'm trying to set up alt text for a malverk texture so it only shows when the texture is actually on but for some reason it's not working.
high verge
high verge
#

Seals have to be special

#

Does anything stand out to you as wrong for my malverk alt texture localization?

#

It was the loc_txt disabling it

vocal helm
#

Another quick thing; I'm trying to make all the cards in shop reduce in value and do the little "juice" animation, and while they go down in value correctly, they're not playing the animation correctly. I don't know if the return value of my function is correct since I'm mostly copying this over from another Joker of mine, but what would I do to get that effect?

-- jokers
            for index, shop_card in ipairs(G.shop_jokers.cards) do
                G.E_MANAGER:add_event(Event({
                    trigger = 'after',
                    delay = 0.1,
                    func = function()
                        shop_card.cost = math.max(0, shop_card.cost - card.ability.extra.price_reduction)
                        return {
                            message = "Reduced!",
                            colour = G.C.EDITION,
                            message_card = shop_card
                        }
                    end
                }))
            end
red flower
#

returns like that dont work inside an event

urban wasp
# daring fern No.

idhushdishdh i was about to be like “yay my solution was solved” and then its just nope

red flower
#

try using SMODS.calculate_effect({message = "Reduced!", colour = G.C.EDITION,}, shop_card)

vocal helm
#

Alrighty, thanks!
Should I just return true in that case or do I not need to return anything at all

red flower
#

yes return true or the event will keep repeating

vocal helm
#

alright, thanks!

#

-# also real quick is there a handy place I can find all the vanilla sound names

daring fern
keen atlas
#

sup, is it possible to have the hello text to be anchored to the bottom of the column?
(the code is what i tried)

urban saddle
#

Heyo - I'm sure you all get this all the time and sorry, I tried searching around.

I'm just trying to make a silly little surprise texture pack for my SO - I'm not good at programming (just a graphic designer here 😐 ), so sorry in advance!

Using emihead's template.

It's been working great for me so far, but now that I'm on to "Enhancers" and they refuse to load. I tried to search here and the internet and can't find out why. It's likely because I'm, uh, not the smartest cookie.

This is the line from emiheads lua

local sprite_enhancers = SMODS.Sprite:new("centers", tpt_mod.path, "Enhancers.png", 71, 95, "asset_atli")

Thanks for any help, and sorry again!

urban saddle
faint yacht
#

Did you mean just Sprite(...)?
Alternatively, use the SMODS.Atlas registration with raw_key set to true?

daring fern
urban saddle
urban saddle
# daring fern Yes, `Malverk`

I was looking at that and... well, maybe I'm stupid but that seems complex and I have all the images placed and ready to go this was the last step. Thanks for the help, I'll try to figure it out.

high verge
#

I don't suppose there's an easy way to mass rename all suits in the game?

#

I'm manually changing them in my localization for a mod but it doesn't currently cover ones that are variables in cards.

high verge
#

So, no there isn't.

#

👍

wild escarp
#

How would I check when a joker destroys itself? I'm guessing a hook into Card:remove(), but I don't know what I'd do in there.