#šŸ’»ćƒ»modding-dev

1 messages Ā· Page 264 of 1

tall wharf
#

i do not have experience in css

midnight coyote
#

oh well #NotMyProblem

#

the sticker’s effects appear on the description

#

just read that if ur so fuckin inclined

gentle rain
#

:/

mint island
#

Is there a channel for the Balatro plus mod?

gentle rain
#

in the modding forum? you could search yhere for it

small moon
mint island
#

Could I ask about an issue with the Balatro plus mod or is this not the right chat? I’m new to discord haha

midnight coyote
#

you might be better off going to the balatro plus forum post

midnight coyote
#

which was linked already.

mint island
#

Oh ok gotcha. Thanks didn’t see it

midnight coyote
#

no problem! hope whatever issue you have is solved

#

also this is genuinely one of the most helpful modding discord sections i’ve seen lol

#

helps when people are actually active in here

crisp coral
#

omw posting misinformation

hushed field
#

hey welcome back Myst!

#

Putting one challenge on hold because I don't want to do the edits to the buttons UI with lovely injects

#

UI comes to bite me yet again

crisp coral
#

o/

#

well funnily enough

#

I've been here the whole time!

wary skiff
#

Is it possible to ban card ranks from showing up in challenges?

hushed field
#

yeah but you were on hiatus, no?

uncut grail
#

hey guys, is it possible to check if a joker has a certain sticker?

tall apex
uncut grail
crisp coral
crisp coral
uncut grail
#

oh, thanks! that's pretty much all i needed

crisp coral
uncut grail
#

i actually happened to find those in the SC right as you typed this LOL

midnight coyote
#

i may make a ā€˜fire extinguisher joker’ that gives you $5 in exchange for leveling down the first discarded hand

#

is that balanced or no

midnight coyote
narrow iron
#

as a common yea

midnight coyote
#

oh nvm

uncut grail
#

oh wow this is super not worth it

midnight coyote
#

what would be good for rare

#

$15?

tall apex
#

5 balatrillion dollar

uncut grail
#

is it BP/BS copyable?

crisp coral
#

do you need to downgrade to gain $?

tall apex
midnight coyote
#

that’s the point

crisp coral
#

not what I'm asking

midnight coyote
#

in some situations you could

uncut grail
#

thats the most important part...

midnight coyote
#

i don’t see it being viable at all otherwise

crisp coral
#

still doesn't answer my question

uncut grail
#

still dunno, maybe if it's an uncommon

warped marsh
uncut grail
#

kind of useless though

midnight coyote
#

it just simply doesn’t do anything

gentle rain
warped marsh
#

Yeah that’s perfectly fine then imo

uncut grail
crisp coral
#

if it fails then uh

warped marsh
#

Rare is too much

midnight coyote
#

hmm

#

i wanna make this balanced

crisp coral
#

$5 is common

warped marsh
uncut grail
#

but so are half of all jokers in balatro

#

so sure!

warped marsh
midnight coyote
tall apex
#

Mfw joker

warped marsh
#

Well if you fail to use it

tall apex
uncut grail
midnight coyote
#

this is a green joker household

uncut grail
#

tbh no yeah i think all jokers are amazing, im just going silly mode

tall apex
midnight coyote
warped marsh
midnight coyote
#

it’s a fun concept

#

but

uncut grail
midnight coyote
#

it really is extremely conditional

tall apex
#

I like discarding :(

uncut grail
#

green jokers fans are coming for you, run!

midnight coyote
#

green joker + bandit?

uncut grail
midnight coyote
uncut grail
midnight coyote
#

i’m such a fake fan i should refund the game right now

uncut grail
#

how much hours?

midnight coyote
#

20

uncut grail
#

it's a lost cause...

wary skiff
midnight coyote
#

i feel like this game is about to show up on my steam replay

#

as like my top game of the year

wary skiff
#

hardcoded, I see

uncut grail
#

i think. im still a fake fan

#

i need 300+

midnight coyote
uncut grail
#

yet i have 309 in ultrakill, im such a fake fan

midnight coyote
#

it bewilders me how people can get like thousands of hours in a game

uncut grail
#

hanged man me

tall wharf
uncut grail
midnight coyote
#

my most played game has like 169 hours ;-;

uncut grail
#

not doc level though

warped marsh
#

I still haven’t beat the ante 4 help

tall wharf
#

i mean i guess

midnight coyote
uncut grail
crisp coral
#

i have like 200 hours only

wary skiff
#

Very well, I'm not gonna ban the card packs, so I'll just have to deal with having ranks outside of 2-6 in packs then

midnight coyote
#

i’ll never know this since i compile it my own damn self

uncut grail
#

i have like 4000+ hours in gms2

crisp coral
#

nvm 231.8

#

cooked

uncut grail
#

everybody is a fake fan until they get at least a 1000 hours

midnight coyote
#

my most played is Fall Guys on steam

uncut grail
#

we shall all grind

primal shoal
#

-# 87.5....

midnight coyote
#

20 hours but i’ve had this game for a week

uncut grail
wary skiff
#

Long road ahead o7

primal shoal
#

i spent more time modding then playing lol

midnight coyote
#

i’m a real fan because i started modding a week in

brazen tusk
mint island
uncut grail
#

man aseprite is so good

uncut grail
#

btw, thoughts on the art?

midnight coyote
uncut grail
#

i think that infinity probably looks weird

tall wharf
#

it's so good i am willing to pay for aseprite

midnight coyote
primal shoal
uncut grail
#

HAHA

#

WRONG

#

FAILED

#

no krita allowed

midnight coyote
#

krita supremacy

brazen tusk
#

not for pixel art!!

midnight coyote
#

I LOVE OPEN SOURCE SOFTWARE

#

RAGGGHHHHHH

uncut grail
#

i love balatro

#

oh and yeah

primal shoal
#

i used csp then found kirta better for 8 bit

midnight coyote
#

aseprite is best though

#

although

uncut grail
midnight coyote
#

it took me so long to figure out how to export a sprite sheet at double size

#

they got me on the mf aseprite CLI šŸ™

uncut grail
#

the card is only there for the cool ass stencil ankh runs

narrow iron
#

could someone help me with custom tags? how can i add them to the info queue of a card?

stark geode
#

Wait does anyone know how to do the soul thing

midnight coyote
#

also can i just make a symlink to a mods directory in my home dir

maiden river
midnight coyote
#

like ln -s ~/BalatroMods ~/.local/steam/whatever

uncut grail
#

"C:\Users\User\AppData\Roaming\Balatro\Mods"

#

or whatever your username is

midnight coyote
#

i use linux

uncut grail
#

oh welp

midnight coyote
uncut grail
#

bye

midnight coyote
#

honestly rather lobotomize myself than code on windows šŸ™

thin anchor
maiden river
#

I have to use windows at school

uncut grail
maiden river
#

tbh I do most of my dev on windows but mainly becaue I'm also on a valorant team

uncut grail
#

it needs more lobotomy i think

wary skiff
#

Which is about the highest praise I can give

midnight coyote
#

my ritual cards are gonna be like red

midnight coyote
#

it was a product of rage

next timber
#

ayyyyyy

gaunt thistle
#

did the joker start out that way orrr

strong jacinth
thin anchor
#

added some color

stark geode
#

Can someone help me with the soul effect on a joker I'm making

strong jacinth
#

It feels a little bit vanilla too

stark geode
#

I have the atlas set up but the soul overlay won't appear

midnight coyote
#

i also have margaret thatcher joker

midnight coyote
thin anchor
next timber
#

ty

hardy viper
midnight coyote
tall apex
midnight coyote
#

that’s pretty much how aseprite is

#

you have to install visual studio (??????)

tall apex
maiden river
#

oh I just used a github action lmao

thin anchor
maiden river
#

didn't even have to really think about it

midnight coyote
#

aseprite compiling is just like
clone git directory
download deps from package manager

make

stark geode
# thin anchor let me see code
SMODS.Atlas{
    key = 'jokers',
    path = 'Jokers.png',
    px = 71,
    py = 95,
    -- 2x is 144 by 190
}

SMODS.Joker{
    key = 'Perk-O-lator',
    atlas = 'jokers',pos = {x = 0, y = 0},soul_pos = { x = 0, y = 1 },
    loc_txt = {
        name = 'Perk-O-lator',
        text = {
            "Creates a {C:dark_edition}Negative{} copy of",
            "{C:green}Perkeo{}",
            "at the end of the {C:attention}shop",
    }},
    calculate = function (self,card,context)
        if context.ending_shop then
            G.E_MANAGER:add_event(Event({
                func = function()
                    local card = create_card('Perkeo', G.jokers, nil,nil,nil,nil,'j_perkeo')
                    card:set_edition('e_negative', true)
                    card:add_to_deck()
                    G.jokers:emplace(card)
                    return true
                end
            }))
        end
    end
}
maiden river
#

I long for the day where I return to linux

midnight coyote
maiden river
#

I'm going to get a new, lightweight laptop soon, so I'll probably install it on that

thin anchor
hushed field
#

@modern kindle got some challenge code up on my dev branch (it's the one called sci_fi_dev because I thought I'd be better at using different environments for different features ā¤ļø )

hardy viper
midnight coyote
#

is soul pos like that thing that the legendary jokers got going on where the joker is on a different layer than the card

thin anchor
#

yes

midnight coyote
#

i might do that for Crazy 8 since it’s a legendary

primal shoal
#

where in the code is that made a thing cause i want to edit it?

maiden river
chrome widget
#

Interestingly, a lot of my cards visual effects break specifically if the card has any edition but foil. Foil for some reason works for all of them, I assume because it's drawing transparent pixels rather than mixing and drawing an opaque pixel?

midnight coyote
tall apex
stark geode
thin anchor
midnight coyote
#

crazy 8 does x4 mult and +88 chips for every 8 played

tall apex
stark geode
#

looks like i need to redo the art to be less bit crunched

maiden river
uncut grail
rugged pier
#

how do you make a card "glass"

tall apex
#

put a sand card in the furnace joker

rugged pier
#

got a laugh out of me

uncut grail
modern kindle
chrome widget
#

Is there a way to edit the default balatro shaders?

rugged pier
#
calculate = function(self, card, context)
        if context.before then
            local preservation = {}
            for k, v in ipairs(context.scoring_hand) do
                if v:is_preservation() then
                    preservation[#preservation+1] = v
                    v:set_ability(G.P_CENTERS.m_gold, nil, true)
                    G.E_MANAGER:add_event(Event({
                        func = function()
                            v:juice_up()
                            return true
                        end
                    }))
                end
            end
            if #preservation > 0 then
                return {
                    message = localize('k_gold'),
                    colour = G.C.MONEY,
                    card = self
                }
            end
        end
    end
chrome widget
#

I'm not sure the base shaders are stored in SMODS.Shader

rugged pier
#

that part works

#

im not sure why "juice_up()" breaks the game since i copied that from base game code

chrome widget
#

It's breaking the game because the juice_up isn't being called from the function similar to midas mask

#

It's because the return block is passing in self to card instead of card

rugged pier
#

ahhh

#

so i wouldnt be able to use juice up here at all?

chrome widget
#

Not what I mean

rugged pier
chrome widget
#

It should look like this:

   message = localize('k_gold'),
   colour = G.C.MONEY,
   card = card
}```
frosty dock
#

card = card is redundant

frosty dock
#

you don't need it

rugged pier
thin anchor
#

help me

chrome widget
#

you don't necessarily yeah, I just tend to specify the message card regardless

fresh swallow
#

I have been cooking. V1 of Balatro irl is within my grasp

sonic cedar
#
loc_vars = function (self, info_queue, card)
    local random_mult = {}
            for i = card.ability.extra.min, card.ability.extra.max do
                random_mult[#random_mult+1] = tostring(i)
            end
            local local_mult = ' '..(localize('k_mult'))..' '
            main_start = {
                {n=G.UIT.T, config={text = '  +',colour = G.C.MULT, scale = 0.32}},
                {n=G.UIT.O, config={object = DynaText({string = random_mult, colours = {G.C.RED},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.5, scale = 0.32, min_cycle_time = 0})}},
                {n=G.UIT.O, config={object = DynaText({string = {
                    {string = 'rand()', colour = G.C.JOKER_GREY},{string = "#@"..(G.deck and G.deck.cards[1] and G.deck.cards[#G.deck.cards].base.id or 11)..(G.deck and G.deck.cards[1] and G.deck.cards[#G.deck.cards].base.suit:sub(1,1) or 'D'), colour = G.C.RED},
                    local_mult, local_mult, local_mult, local_mult, local_mult, local_mult, local_mult, local_mult, local_mult, local_mult, local_mult, local_mult, local_mult},
                colours = {G.C.UI.TEXT_DARK},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.2011, scale = 0.32, min_cycle_time = 0})}},
            }

trying to get misprint's text thing to work, but for some reason it's just rendering as a blank box. should i be returning main_start? or maybe it's something with G.deck?

chrome widget
#

Ah wait yes, Aure, do you know if it's currently possible to change the file path of the default shaders?

rugged pier
#

now i only need to figure out how to covert it to a glass card instead of gold card

frosty dock
#

I cna barely read this on mobile, but yes you should be returning main_start

sonic cedar
#

i knew i wasnt crazy
thanks john

frosty dock
chrome widget
midnight coyote
#

should i call my ā€˜average logan subplot’ joker the ā€œAverage Jimbo Subplotā€

rugged pier
#

return {
message = localize('k_gold'),
colour = G.C.MONEY,
card = card
}
I assume i have to change it here as well

#

?

#

k_glass

#

G.C.GLASS

chrome widget
#

Afaik there's not a default message for glass cards like that

sonic cedar
chrome widget
#

You'll have to add one

frosty dock
frosty dock
rugged pier
sonic cedar
#

ok cool it should work then

sonic cedar
#

thanks 2 mr. smods

chrome widget
#

I can't take ownership of the default because afaik SMODS doesn't normally package the default shaders into it

frosty dock
#

else ask Eremel I guess

#

that sounds about right

chrome widget
#

Aight let's see

#

Oop, yep, seems to work!

#

And by work, I mean I broke it visually, but that means that I broke it

frosty dock
#

neat

chrome widget
#

Now I have to figure out how to rewrite all the default edition shaders to function like the foil shader does

#

Yay

frosty dock
#

sounds... fun

maiden river
#

hello john smods

frosty dock
#

hello raevyn

sonic cedar
frosty dock
#

no that should be fine

#

can I have the code as a screenshot?

sonic cedar
#

did i return it wrong, then?

frosty dock
#

oh I see

#

it needs to be outside of vars

sonic cedar
#

OH BECAUSE ITS A

frosty dock
#

return { main_start = {...}, vars = {} }

sonic cedar
#

cause its tables right

frosty dock
#

Just returning it as a variable won't cause the game to know what to do with it

thin anchor
#

horrible

frosty dock
#

it'd just stringify and insert it whenever it sees #1#

sonic cedar
#

im learninggggggg im_brain_bigbrain

thin anchor
primal shoal
thin anchor
#

ji,m,b.;/o

gentle rain
sonic cedar
maiden river
#

glad you got it working

thin anchor
#

awesome

primal shoal
gentle rain
sonic cedar
gentle rain
frosty dock
gentle rain
maiden river
#

tbh I expected the ranks to be a table of numbers and not a string 😭

#

but if it works it works

glad osprey
frosty dock
keen tiger
stark geode
thin anchor
#

j..,im.;'b/.o

gleaming zealot
#

hello screen friends

rugged pier
#
--All scored Aces, 2s, 4s, and 8s become Glass'ed
SMODS.Joker {
    key = 'scdrl_lady',
    atlas = 'scadrial',
    pos = { x = 0, y = 0 },
    rarity = 2,
    cost = 6,
    unlocked = true,
    discovered = true,
    loc_txt = {
        name = "Lady Mistborn",
        text = {
            "Each played {C:attention}Ace{}, {C:attention}2{}, {C:attention}4{}, and {C:attention}8{}",
            "become {C:attention}Glass{} cards before scored"
        }
    },
    calculate = function(self, card, context)
        if context.before and not context.blueprint then
            for k, v in ipairs(context.scoring_hand) do
                if v:is_preservation() then
                    v:set_ability(G.P_CENTERS.m_glass, nil, true)
                    G.E_MANAGER:add_event(Event({
                        func = function()
                            v:juice_up()
                            return true
                        end
                    }))
                end
            end
        end
    end
}

Had a quick question about this joker. It works as intended converting all A,2,4,8 to glass before they are scored (if they are scoring)

If an Ace that is already glassed is played, does this joker "re-glass" that ace? hence resetting its probabilities of being destroyed?

open aspen
#

not sure but if u dont want that situation happening

#

just check if the card is glass

rugged pier
primal shoal
#

card:is_edition() == e_glass or something like that I'd have to check

open aspen
#

next(SMODS.get_enhancements(v)) should work (it will be nil if it has no enhancement but i that doesnt matter)

open aspen
maiden river
primal shoal
open aspen
#

samesies

#

dw

vast lily
#

same tbh

open aspen
#

no longer i get them mixed up

#

but thats after

#

conditioning

vast lily
#

i still cant get my joker sell value effect to work

#

can SMODS.find_card be used to find what deck is being used in the run?

next timber
#

trying to see if my mod's booster packs spawn naturally in the shop is hell

#

ayyy

#

it showed up

#

right as i sent

#

nice

vast lily
#
if next(SMODS.find_card("b_devildecks_scourge")) and self.ability.set == 'Joker' then
    self.sell_cost = -10
end

this is the conditional i currently have and it didnt work when i tested it

hushed field
rugged pier
maiden river
rugged pier
maiden river
#

just make sure you do it right or else you get the Curse of Jimbo

next timber
#

oh wait hang on yeah i need to figure out the weights properly

#

dont suppose anyone knows the vanilla weights off by heart

vast lily
#

i can check em rn

next timber
#

(or where the game stores them that would also be fine)

hushed field
#

search all for weight = and you'll get them right quick

tall wharf
#

omg

hushed field
#

they're defined in the giant centers list

vast lily
#

default rates are in game.lua starting at line 1900

next timber
#

i gotta start reading the base code in vscode

vast lily
#

dont know how anyone manages without doing that lol

next timber
#

right now i use vscode for mod code and np++ for dump/vanilla code

hushed field
#

put another challenge on hold because I don't wanna figure out where I should place the patch, oof

maiden river
#

I'm trying to cook up some challenges for my mod rn

#

it's tougher than you'd think

#

(challenge is "sacrifices")

hushed field
#

I can imagine yours currently has a bit less levers to pull. I've got a bunch, it's just based on how much tearing apart code I wanna do to get them to work, haha. I've got ~25 or so concepts, but some of them need a lot of patching to get them to work

#

Or I need to find clever solutions

maiden river
#

true

hushed field
#

How about a challenge in which playing cards don't score, so you're more reliant on your weapon?

thin anchor
#

i love my balala font

maiden river
#

true
I mean if they're all debuffed the weapon doesn't fire so 😭

hushed field
#

That's why they're not debuffed, they just don't score šŸ˜›

maiden river
#

oh true

hushed field
#

I've got a patch that could do that for ya

maiden river
hushed field
#

I have a Jurassic Park joker that multiplies all nominal values by 5 for cards, and that's easily expanded into weirder functionality, haha

#

I've got the romance reroll challenge, the jumpscare challenge and the rent-a-movie challenge that I'm putting on hold, and the next step is figuring out what the best way is to make it so movie jokers can spawn in specific forced orders

next timber
#

the scariest part of modding any game is wrapping your head around the creator's spaghetti code

hushed field
#

Can't blame thunk that he didn't make the button layout easily injectable šŸ˜›

next timber
#

i was modding windowkill and had to give up on the mod because the variable i needed to set was being hard set every single frame

hushed field
#

no sane hobbyist game dev would account for that, I reckon

next timber
#

lol fair

#

at this point if a mod friendlyness update was released it would probably do more harm breaking existing ones than good i reckon

hushed field
#

Some of the things I wanna do are definitely possible, they're just a bit problematic right now with me not fully understanding vanilla's code

primal shoal
gentle rain
#

again be my guest lmao

next timber
#

me when i try to pull a good Power Pack and the game gives me 2 copies of Toxigenesis

hushed field
#

pseudorandom'll mostly just make sure your random functionality keeps the run's seed in mind

#

I thought I had some clever solves for the metadata-related joker spawning, but I think I might just need to write a whole custom create_card function for it

uncut grail
#

by the way, balancing question:
do you guys think this should work if there are no jokers?

next timber
#

id say no

uncut grail
#

or not

uncut grail
#

fair

rugged pier
#
calculate = function(self, card, context)
        if context.before and not context.blueprint then
            for k, v in ipairs(context.scoring_hand) do
                if v:is_preservation() and SMODS.has_enhancement(v, m_glass) == false then
                    v:set_ability(G.P_CENTERS.m_glass, nil, true)
                    G.E_MANAGER:add_event(Event({
                        func = function()
                            v:juice_up()
                            return true
                        end
                    }))
                end
            end
        end
    end

I think this does not check for cards already glassed and recoverts it into glass thereby potentially resetting its probability of being destroyed. Can anyone check?

manic rune
#
and not SMODS.has_enhancement(v, "m_glass")

would probably be better

#

and also

#

m_glass should be a string, i just realized

hushed field
#

what's the goal there?

rugged pier
manic rune
#

...it does?

rugged pier
rugged pier
#

like opposite functionality, it just didnt glass any of it

#

let me retry with your code

maiden river
manic rune
#

its an immolate-level balancing spectral card

uncut grail
#

yeah, implemented that! i think this should be fair

uncut grail
manic rune
#

its actually really good imo, but not so unbalanced that it doesnt feel vanilla-ish

hushed field
manic rune
#

first time heard of that tbh

rugged pier
#

like thunk did for face cards

#

and implemented is_face()

hushed field
#

aaaah okay

rugged pier
#
--Function to check if Aces, 2s, 4,s and 8s appear in played hand/discard
function Card:is_preservation(from_boss)
    if self.debuff and not from_boss then return end
    local id = self:get_id()
    if id == 14 or id == 2 or id == 4 or id == 8 then
        return true
    end
end
hushed field
#

the way glass cards are destroyed shouldn't be a problem there, btw

#

you can override a card's glass status anytime you like, it'll never reset it's destroy calculation

rugged pier
hushed field
#

nope

uncut grail
#

i have two more cool spectral card concepts, will elaborate later perhaps!
trying to balance them and make them vanilla-ish

rugged pier
#

i thought everytime it doesnt get destroyed, the probability "increases"

manic rune
#

smods fixed the blind

#

oh boy

#

:3

#

time for the 3 phases boss blind

hushed field
#

those are calculated right before it gets destroyed. Unless you yourself patch something in there, it won't ever be a worry. Unless SMODS changed something recently I'm not up to date on

manic rune
uncut grail
#

by the way, how do i add an eternal sticker on a joker?

rugged pier
manic rune
#

np! :D

hushed field
next timber
#

can i get some balancing advice?
i have a card enhancement that gives x chips with a y% chance of destroying itself, both values increase after being triggered. what should i increase them by? currently its +10 chips and +5%

hushed field
rugged pier
hushed field
uncut grail
next timber
#

yeah

#

luckily to test the enhancement i have the Condemned Deck to help me out

rugged pier
#

like 1 in 4 chance

uncut grail
#

sure, sounds fine! perhaps you could have a spectral card that decreases the chance of destruction of held cards with this enchancement in hand?

hushed field
#

My personal take is to not balance cards you're not sure about before you've played with them

next timber
#

FREE POLY HANGING CHAD

uncut grail
next timber
#

hey uhhhh is the text for the wheel supposed to just say "1 in 7 cards get"

uncut grail
#

like... empress level of bad

hushed field
# rugged pier i see

I reckon there's better balances than adding a chance, because the chance will both make it 4 times weaker, but also chances aren't super fun, I find, unless they really pay off big

uncut grail
#

it's cool early-game but makes no sense as soon as you're past ante 2

glad osprey
#

how do i allow legendary jokers to show up in shop

hushed field
#

and a lot of glass cards is strong. 1/4 chance of a glass card is a lot less strong, in that sense

rugged pier
hushed field
glad osprey
#

all

hushed field
# glad osprey all

I think in that case, take control of the rarity and give it a chance to spawn, which I think should work? Or perhaps overwrite it with a custom rarity that's identical

hushed field
rugged pier
hushed field
zealous glen
#

@tall wharf do you know if Blinds can have variables now?

tall wharf
#

i just store everything i need in debuff lmaoo

upbeat bronze
#

hey, is there any sorta template mod for friends of jimbo packs?

zealous glen
tall wharf
#

Blind.debuff

zealous glen
hushed field
# glad osprey how do <:pleading:1099343510425043114>

There is a take_ownership function that SMODS adds. The only thing that I'm not sure of if the game hardcodes a check to see if legendary is polled. But if you take ownership of it, you can just add a weight, that may work

upbeat bronze
rugged pier
tall wharf
rugged pier
#

how would i word it in the ability though

glad osprey
zealous glen
upbeat bronze
hushed field
tall wharf
#

hand_per_hand what the fuck is that aikoyori

#

😭

zealous glen
upbeat bronze
zealous glen
upbeat bronze
zealous glen
hushed field
upbeat bronze
#

yes they work fine, i currently got the rainworld and collabs reimagined packs installed

gaunt thistle
rugged pier
zealous glen
upbeat bronze
#

i heard that steamodded is bugged with smods.deckskin

tall wharf
#

maybe the font weight

hushed field
upbeat bronze
#

that might be it since i checked both collabs and rainworld and neither use deckskin if i remember right

zealous glen
gaunt thistle
zealous glen
#

Even though the template was made to avoid the bug

#

Anyways

gaunt thistle
#

I really like your color scheme

zealous glen
#

I have a DeckSkin working right now

zealous glen
#

So I don't think that's the issue

upbeat bronze
tall wharf
upbeat bronze
#

which does work but doesnt display the custom aces

zealous glen
upbeat bronze
#

uhhh lemme check

next timber
#

why are my packs still showing "ERROR" as the text at the bottom above "Choose (x)"?

gaunt thistle
#

yeah mine doesn't look remotely similar

#

but that's just cleartype for you

zealous glen
upbeat bronze
zealous glen
#

I still don't think it'd have been an issue then

#

What texture did you make

upbeat bronze
#

cant show as its a private commission but its aces thru jacks

#

all suits

zealous glen
#

Doesn't matter much but still

upbeat bronze
#

aces & face cards

#

if thats what u mean

zealous glen
chrome widget
#

Initial tests are promising but confusing. Trying to make Polychrome genuinely transparent, but doing so results in more difference in extremes a lot of the time (All three joker in the top row are Polychrome in both images, but the editions were applied at different times and the images were taken at different times

zealous glen
#

The atlas

upbeat bronze
#

atm its laid out similar to collabs reimagineds

zealous glen
upbeat bronze
#

1 sec

zealous glen
#

I think for the template your file would look like a lot of empty space with the textures to the… right

upbeat bronze
zealous glen
#

so four rows, and 9 columns of empty space with JQKA on the right

upbeat bronze
#

theirs are just jack queen king for each suit separately

#

no number cards

zealous glen
#

Yeah because the use the collab not deck format

upbeat bronze
#

mine just adds ace to the right of king

#

ah

zealous glen
#

The template uses deck

#

You can't replace Aces with collab

#

There was a third option but I forget

midnight coyote
#

big things

uncut grail
#

something weird: for some reason when this spectral card is negative and used the game crashes. (there are 6 non-negative jokers near it)

    use = function(self)
        local bank = {}
        for i=1, #G.consumeables.cards do
            local card = G.consumeables.cards[i]
            if (not card.edition or (card.edition and not card.edition.negative)) then
                table.insert(bank, card) 
            end
        end

        local card = pseudorandom_element(bank, pseudoseed('exorcism'))
        card:set_edition({ negative = true }, true)
    end,
zealous glen
#

I think one of those is new

midnight coyote
#

?

upbeat bronze
#

yeah idrk what im doing, im an art guy not a code guy

midnight coyote
#

could that be it

zealous glen
uncut grail
#

well no, haha.

upbeat bronze
#

didnt expect getting it ingame would be as complicated as it is

zealous glen
#

consumeables is right

midnight coyote
#

oh what

uncut grail
#

thats how thunk spelled it

midnight coyote
#

oh

#

lmfao

upbeat bronze
uncut grail
#

šŸ”„

zealous glen
upbeat bronze
zealous glen
#

If you remove the ranks 2 through 10 from the template

#

It will load the default textures

upbeat bronze
#

oh

#

thats cool

zealous glen
#

But the code still needs to know where in the texture to find the correct ranks

#

so the only

#

well

#

the best option is to have the full deck

#

with 9 empty columns

upbeat bronze
#

alright

zealous glen
#

basically they should be positioned like the default deck texture

uncut grail
#

wait, does the card removal from the consumable slot happen before or after use?

zealous glen
#

after

uncut grail
#

oh damn

#

how do i check if the card is not the card used?

#

would card!=self work?

zealous glen
#

I should ask @long urchin too I suppose

upbeat bronze
sonic cedar
#

would this put them on the same line?

next timber
#

for concatenation in lua i believe you want "text".."text"

#

.. instead of +

#

i may be stupid tho

zealous glen
sonic cedar
#

it might be .. actually

sonic cedar
upbeat bronze
next timber
upbeat bronze
#

this part

next timber
#

in the formatting brackets

sonic cedar
#

huh oh no that works fine

zealous glen
zealous glen
#

That text is normal-sized

sonic cedar
#

yeah i have it like that rn

#

im trying to fix the lines

#

cause misprint text style requires a blank set of quotations

#

but im trying to add onto it at the end with my dynamic text

glad osprey
zealous glen
#

If you want the text to be normal-sized you can remove the s control

primal shoal
thin anchor
#

samsung notification sound
text joker

sonic cedar
tall wharf
#

hi toma

sonic cedar
#

hi aiko

tall wharf
#

im coking

zealous glen
#

coking

thin anchor
sonic cedar
sonic cedar
tall wharf
#

COOKING

zealous glen
#

and it's blue

tall wharf
#

i dont watch breakinfgb ad

zealous glen
zealous glen
#

you star it

next timber
thin anchor
#

error pack? blueprint /j

uncut grail
#

how would i do this the correct way? is there some way to get the index of the card that's getting used?

wary skiff
#

Alright, game's crashing when I open the restrictions section of this challenge, which I'm gonna assume means something's wrong with this particular chunk of code:

       restrictions = {
            banned_cards = {  
                {id = 'j_sock_and_buskin'},
                {id = 'j_hanging_chad'},
                {id = 'j_selzer'},
                {id = 'j_dusk}'}
            },
            banned_tags = {
            },
            banned_other = {
            }
        }
next timber
#

damn

primal shoal
#

.. is the right concatention

tall apex
#

how do i define what's in a pool? :3

sonic cedar
tall apex
#

im making a card pack and i wanna put jokers from vanilla in the pack but only certain ones

zealous glen
primal shoal
sonic cedar
#

ah

zealous glen
hushed field
sonic cedar
zealous glen
hushed field
#

Oh NVM missed some context

tall apex
#

huh wha :3

hushed field
#

But yeah, you can add existing items to pools quite easily

zealous glen
#

I've made dynamic descriptions before but not like this

primal shoal
zealous glen
zealous glen
#

but isn't a pool just a table

tall apex
#

how would i do that? :3

hushed field
zealous glen
tall apex
zealous glen
#

Absolute Lua

tall apex
gentle rain
zealous glen
hushed field
# tall apex how would i do that? :3

I'm not at my pc rn, but kinogenres.lua on my git does this. They're technically not vanilla items, but they are items that are created before the pool is and then injected

zealous glen
tall apex
zealous glen
tall apex
zealous glen
tall apex
#

or is it literally

hushed field
#

You define a list and then inject it. I think I did it with a list of keys, then used SMODS.Jokers[key], but you'd be able to use G.P_CENTERS[key]

zealous glen
#

how to inject it

#

so far my only interaction with injection was hacking it to add sprites to the game

hushed field
gentle rain
midnight coyote
#

what do we think of this design

hushed field
primal shoal
gentle rain
hushed field
gentle rain
#

but ty

hushed field
#

Hahaha good to hear

midnight coyote
zealous glen
gentle rain
zealous glen
#

Instead of just creating a Pool

gentle rain
#

didnt know that was needed

narrow iron
#

what does group_key actually do for booster packs?

hushed field
sonic cedar
hushed field
#

Though atm I'm setting up a system to dynamically create pools based on arbitrary qualities, though I'm bumping my head quite a lot

primal shoal
gentle rain
primal shoal
gentle rain
#

i figured as much

tall apex
#

so wait this is how you add stuff to packs?

gentle rain
#

i copied the perkeo one initially too

#

in that case im lost on how u made it work

midnight coyote
#

how do i get a consumable to generate a joker

zealous glen
midnight coyote
#

of a certain rarity and with a sticker

primal shoal
sonic cedar
hushed field
narrow iron
hushed field
#

And then just set the sticker

zealous glen
#

With loc_vars

tall apex
#

. w.

midnight coyote
#

how would i do that

zealous glen
#

You can define a main_end in the return

midnight coyote
#

set the sticker i mean

zealous glen
#

The main_end are extra UI nodes appended to the end of your text description

sonic cedar
zealous glen
#

It just goes in the beginning

narrow iron
zealous glen
sonic cedar
zealous glen
sonic cedar
#

true mb

midnight coyote
#

meaning?

zealous glen
narrow iron
#

just strings of the keys

midnight coyote
narrow iron
#

yes

midnight coyote
#

okay

sonic cedar
tall apex
#

i still cant figure this out idk how to get the cards i want in this pack . 3.

rugged pier
#
--Each played Ace, 2, 4, and 8 become Glass'ed before scoring
SMODS.Joker {
    key = 'scdrl_lady',
    atlas = 'scadrial',
    pos = { x = 0, y = 0 }, --to be changed once atlas is updated
    rarity = 2,
    cost = 6,
    unlocked = true,
    discovered = true,
    config = { extra = { odds = 4 } },
    loc_txt = {
        name = 'Lady Mistborn',
        text = {
            'Before scoring, {C:green}4 in 16{} chance of turning',
            'each {C:attention}Preservation{} card into {C:attention}Glass{} card',
            '{C:inactive}(A, 2, 4, 8 are {C:attention}Preservation{} {C:inactive}cards{C:inactive})'
        }
    },
    calculate = function(self, card, context)
        if context.before and not context.blueprint and (pseudorandom('scdrl_lady') < G.GAME.probabilities.normal/card.ability.extra.odds) then
            for k, v in ipairs(context.scoring_hand) do
                if v:is_preservation() and not SMODS.has_enhancement(v, 'm_glass') then
                    v:set_ability(G.P_CENTERS.m_glass, nil, true)
                    G.E_MANAGER:add_event(Event({
                        func = function()
                            v:juice_up()
                            return true
                        end
                    }))
                end
            end
        end
    end
}

Hey everyone, I am trying to implement a 1 in 4 chance of converting a card into glass. Is this the right way to do it?

#

im not sure how psuedo random even works

#

i kind of copied it from bloodstone implementation

narrow iron
midnight coyote
#

how would i do this

#

this how i do it

#

with the param setting

#

it feels wrong

narrow iron
#

SMODS.create_card('Joker', G.jokers, nil, etc)

midnight coyote
#

oh i use nil for empty params

narrow iron
#

yes

midnight coyote
#

oki

narrow iron
#

whether a joker is eternal is based off its card.ability.eternal variable, i dont think you can set it with the create_card() command

midnight coyote
#

because its kind of part of the whole thing that the generated joker is eternal

narrow iron
#

Card:set_eternal(boolean)

midnight coyote
#

so this, besides the last array, is a perfectly valid and good command?

narrow iron
#

thats the only place i can find where you can set it

hushed field
#

Does the apply function not work for eternal?

midnight coyote
#

the ritual card i mean

chrome widget
#

Okay I've gottena decent solution to changing how the default editions look

#

It's not perfect, but it's close enough to not kill my visual effects

next timber
chrome widget
#

Typically you need to specify name and text, and it needs to completely match the key it's being displayed for if this is for a UI box

gleaming zealot
#

girls

rugged pier
narrow iron
#

you'd need to call it for the joker itself

midnight coyote
chrome widget
midnight coyote
#

could i assign the create card to a variable?

#

for that specific scope and then just call it on the variable

narrow iron
#

yes i believe so, create_card() returns the card so that should work

tall apex
midnight coyote
#

im so smart

chrome widget
#

nope but I've done some stuff with boosters

#

What's the matter?

rugged pier
#
if context.before and not context.blueprint and (pseudorandom('scdrl_lady') < G.GAME.probabilities.normal/card.ability.extra.odds) then
            for k, v in ipairs(context.scoring_hand) do
                if v:is_preservation() and not SMODS.has_enhancement(v, 'm_glass') then

is this the right way to add probability to a joker? assumbing ive added odds = 4 in config

narrow iron
#

i just found out abt this command like 20 mintues ago lol

midnight coyote
#

MY PREVIOUS CODING KNOWLEDGE APPLIES HERE

tall apex
narrow iron
#

just coincidence that you needed it at the same time

chrome widget
#

What cards do you want it to make?

midnight coyote
#

here's the card design btw :3

tall apex
midnight coyote
#

oh that wasnt directed at me

chrome widget
#

Nope

chrome widget
#

I suppose the easiest way to do it is to temporarily set every card you don't want it to create as a banned card, and then you can use the create_card() function or the poll_rarity() function as normal, respecting the rarity weights of the remaining cards in the pool

hushed field
#

Is setting up a pool not working, Kawaii?

tall apex
chrome widget
#

Also yeah you can set up a custom pool of cards to draw from as well

tall apex
#

idek where i'd make and put the pool

#

ik how to call for one but

hushed field
#

It's quite easy, don't worry. If you want I can guide you a bit once I'm done with dinner

tall apex
#

that'd be nice, the wiki isn't really explaining it

hushed field
#

I've set up a bunch for Kino's genre specific packs

tall apex
#

yeah its just confusing the hell out of me sorry .w.

narrow iron
#

i made a booster pack, and im not getting any errors, but its not showing up in the collection?

#

the file is being loaded

uncut grail
#

no clue why this is happening, it's driving me insane!
can somebody help if possible?

SMODS.Consumable{ -- Exorcism
    set = 'Spectral', atlas = 'bpp_tarots',
    key = 'exorcism',

    loc_txt = {
        name = 'Exorcism',
        text = { 
            'Turns a random',
            '{C:attention}Consumable{} {C:dark_edition}Negative{}'
        } 
    },

    can_use = function(self)
        if #G.consumeables.cards < 2 then
            return false
        end

        local bank = {}
        for i=1, #G.consumeables.cards do
            local card = G.consumeables.cards[i]
            if (not card.edition or (card.edition and not card.edition.negative)) then
                table.insert(bank, card) 
            end
        end

        return #bank > 0
    end,

    use = function(self)
        local bank = {}
        for i=1, #G.consumeables.cards do
            local card = G.consumeables.cards[i]
            if (not card.edition or (card.edition and not card.edition.negative)) then
                table.insert(bank, card) 
            end
        end

        local card = pseudorandom_element(bank, pseudoseed('exorcism'))
        card:set_edition({ negative = true })

        print('a') -- THIS SHOWS UP BY THE WAY (even with the error)
    end,

    discovered = true,

    config = {},
    pos = { x = 1, y = 0 },
}
upbeat bronze
#

ok strange, am i doing something wrong with my textures for my deck skin?

#

my textures are much blurrier than others when pixel smoothing is off

#

and some of my pixels have these strange thin outlines around them

uncut grail
#

lol

narrow iron
#

when the edition is nil, card.edition.negative doesnt exist

narrow iron
#

oh

#

that one

midnight coyote
#

how do i check if jokers are full

uncut grail
#

haha

uncut grail
midnight coyote
#

yeah

#

i need to define can_use for my ritual card but that is based on if you have a free slot or not

tall wharf
#

#G.jokers.cards >= G.jokers.config.card_limit

midnight coyote
#

thanks

tall wharf
#

?

midnight coyote
#

thats what i need

#

im p sure

#

also what ide do yall use

#

i use intellij with a lua plugin

narrow iron
#

vs code

midnight coyote
#

intellij ultimate actually

uncut grail
#

i use vsc......... help..

#

tbf though, vsc is cool

narrow iron
#

i code everything else in vsc so this worked out best

midnight coyote
#

i love my jetbrains

uncut grail
#

like with both statements

narrow iron
#

ah fair

#

you just want to know when a card isnt negative right?

uncut grail
#

pretty sure it's just

#

SMODS.Booster{
...
}

uncut grail
midnight coyote
#

'attempt to concatenate local '_type (a nil value)

#

hmm

#

i set a param in create card wrong

#

what is _type? is that related to set?

narrow iron
# uncut grail that is indeed correct!
if card.edition ~= nil then
  if card.edition.negaive == false then
    [YOUR CODE]
else
    [YOUR CODE]

theres definitely a better way than typing the code twice but i cant come up with it

primal shoal
midnight coyote
#

is joker lowercase

primal shoal
#

no

midnight coyote
#

well what the fuck then

uncut grail
narrow iron
primal shoal
narrow iron
uncut grail
#

that is what the 'or' is for

narrow iron
#

some languages stop as soon as one is false but lua doesnt

midnight coyote
uncut grail
#

this might be the issue, i see

narrow iron
midnight coyote
narrow iron
midnight coyote
#

doesnt run for the same reason

narrow iron
midnight coyote
#

that wont work either

narrow iron
#

well its also not right

midnight coyote
brazen tusk
midnight coyote
#

what did i do this time

primal shoal
narrow iron
#

SMODS.create_card('Joker', G.jokers, false, .96, false, false, 'fuck you balatro')

#

that should work

#

you can leave spots blank if they're all just nil

midnight coyote
#

SMODS.create_card or

narrow iron
#

yea

midnight coyote
#

also wouldnt it just assign false to the nil vals?

narrow iron
#

no i think

midnight coyote
#

instead of skipping over them?

#

im confused

narrow iron
#

you never set them

#

they stay defualt

midnight coyote
#

oh okay

narrow iron
#

whatever those defaults are

#

but probably just nil or false

#

both work here

midnight coyote
#

same crash

#

do you want the log

narrow iron
#

sure

midnight coyote
uncut grail
#

killing myself, the ordering didn't help

gentle rain
uncut grail
#

ok whatever will go back to this tommorow i guess

#

good night everybody

narrow iron
uncut grail
#

or have a good rest of your day or something

narrow iron
tall apex
brazen tusk
uncut grail
uncut grail
midnight coyote
narrow iron
#

i'll need to trace the path from create_card() to here

midnight coyote
#

hmm

tall apex
narrow iron
#

no, sorry abt that

tall apex
#

oh, just curious :3

midnight coyote
#

guh

narrow iron
red flower
narrow iron
#

i was just realizing that

tall apex
#

sorry i just heard some awful news

#

idk if im in the mood to code anymore

sonic cedar
#

how would this look in the G.C format?
like G.C.MULT, etc

midnight coyote
sonic cedar
#

so i can call it in a UI function

tall apex
midnight coyote
#

i see

red flower
midnight coyote
#

so how doi write this function

red flower
#

which

midnight coyote
#

create card

tall apex
red flower
midnight coyote
#

this is what i have as of now

red flower
#

SMODS.create_card({set= "Joker", rarity=1, stickers={"eternal"})

sonic cedar
red flower
#

I'm pretty sure

narrow iron
#

stickers is for stake stickers tho im pretty sure

red flower
midnight coyote
#

it does

narrow iron
#

oh

upbeat bronze
#

what is this code used for in the example mod for deck skins? i cant seem to find the icon images anywhere visible ingame but the game crashes without this bit of code so im really confused? Should i make a custom icon for any deckskin mods or?

normal crest
#

Put rarity = "Rare"

midnight coyote
#

hey you forgot a curly bracket >:(

narrow iron
red flower
#

sorry phone bad

#

i trust srockw

midnight coyote
midnight coyote
#

WORKS

#

PERFECTLY

red flower
midnight coyote
narrow iron
#

nice!

sonic cedar
midnight coyote
#

i did it again and got obelisk 😭

#

eternal obelisk is a fate worse than death

normal crest
#

I swear I sent a message that is now gone

midnight coyote
#

how do i make the animation of it burning up

turbid maple
# midnight coyote i did it again and got obelisk 😭

CURSE OF OBELISK š“€€ 𓀁 𓀂 š“€ƒ 𓀄 š“€… 𓀆 𓀇 š“€ˆ 𓀉 š“€Š 𓀋 š“€Œ š“€ š“€Ž š“€ 𓀐 𓀑 š“€’ 𓀓 š“€” 𓀕 š“€– š“€— š“€˜ š“€™ š“€š š“€› š“€œ š“€ š“€ž š“€Ÿ š“€  š“€” š“€¢ š“€£ 𓀤 𓀄 𓀦 š“€§ 𓀨 𓀩 š“€Ŗ 𓀫 𓀬 š“€­ š“€® 𓀯 š“€° š“€± š“€² š“€³ 𓀓 š“€µ š“€¶ š“€· š“€ø š“€¹ š“€ŗ š“€» š“€¼ š“€½ š“€¾ 𓀿 𓁀 𓁁 𓁂 š“ƒ 𓁄 𓁅 𓁆 𓁇 š“ˆ 𓁉 š“Š 𓁋 š“Œ š“ š“Ž š“ 𓁐 𓁑 𓀄 š“€… 𓀆

red flower
red flower
#

to define it

sonic cedar
#

and then in colour i can jjust put Ijigray

normal crest
# narrow iron

You can put "Rare", "Uncommon", "Common" or "Legendary" or any other modded rarities

narrow iron
#

ahh

red flower
normal crest
#

I'm pretty sure that's mentioned in the wiki too, but if not it's definitely in the code

narrow iron
#

when people refer to "the wiki" do they mean the documantation on github or is there a wiki with modding info on it?

sonic cedar
normal crest
#

Lots of undocumented stuff tho

narrow iron
#

thx

narrow iron
red flower
sonic cedar
#

oh real

midnight coyote
#

umm small problem

#

i have absolutely no fucking idea where i just spawned this joker

#

and it damn well is not in the joker slots

red flower
#

you need to use add_card instead of create_card if you don't want to emplace it manually

#

it takes the same arguments

midnight coyote
#

thats it

red flower
#

yeah

narrow iron
#

this booster pack isnt giving any errors, but it wont show up in game, any idea whats wrong? the file is being loaded

midnight coyote
#

o shit i rolled blueprint

#

lol

sonic cedar
narrow iron
#

nope