#💻・modding-dev

1 messages · Page 436 of 1

iron orchid
#

os.execute('start /b /usr/bin/python3 "...(steam games folder here)/steamapps/compatdata/2379780/pfx/drive_c/users/steamuser/AppData/Roaming/Balatro/Mods/SlayTheJokers/stj_uploader.py"')

the problem is this line

#

getting the proton 'powershell' so actually run a python script

tight notch
#

linux distros come with python??

iron orchid
#

I can easily run it in a terminal

#

and yes

tight notch
#

oh

#

forgot about proton lol

iron orchid
#

all linux distros have python by default

#

well, most*

#

ahem arch

snow vale
#

holy moly, could it be? i organized my code! :D

tight notch
#

crash is fixed but still gives mult for every card

snow vale
#

also thanks somethingcom the random joker works now

tight notch
snow vale
#

yeah ik

daring fern
snow vale
tribal kestrel
#
SMODS.ObjectType ({
  key = 'type_areas',
  cards = {
    ["j_ave_area_uncommon"] = true,
    ["j_ave_area_common"] = true,
    ["j_ave_area_rare"] = true,
    ["j_ave_area_legendary"] = true
  }
})

SMODS.Joker {
  key = 'area_common',
  loc_text = {
    name = "Common Area",
    text = {
      "common"
    }
  },
  atlas = 'ave_atlas_areas',
  pos = {x=0,y=0},
  pools = {
    ["Joker"] = false,
    ["type_areas"] = true
  }
}

c1_1 = SMODS.create_card({set = "type_areas"})

This is still just returning a default joker, I'm not sure what I'm missing

scenic steeple
#

alright so right now, this joker evolution is just happening when I pay a hand and completely ignoring the wilds vs not wilds count

tight notch
#

haven't used windows in a while but it should be under view

tight notch
#

like is there a context for playing cards that retrigger

obtuse silo
#

would SMODS.create_card work when creating booster packs from tags?

subtle merlin
mossy helm
#

good evening everyone!

#

how do I release my Balatro mod? Do I just like upload my files on GitHub?

mossy helm
#

oki doki

subtle merlin
#

How can I get the amount of hands played this round?

daring fern
subtle merlin
#

Oh, that's easy, ty!

chrome widget
#

....huh

#

For some reason my Perkeo is triggering twice, once with the modded calculate function i added via take_owership(), but also with the original calculate behavior?

vague crest
#

how would i check if a card being scored is face down? i thought it would be if context.individual and context.cardarea == G.play and context.other_card:stay_flipped == true because thats what rough gem does but that crashes

#

also related im curious what the dollar buffer does because im seeing that in rough gem and not understanding it completely

vague crest
#

hmm that stops the crash but it isnt behaving the way i thought it would

#

i found that in an unrelated joker in femtolabs collection so i do think this is on the right track

#

waitttt this might be a i didnt pay attention to the formatting issue

chrome widget
#

I've tried and it doesn't seem to stop it

#
    if not context.repetition then
    return {}
    end
            
    return
end```
daring fern
vague crest
chrome widget
vague crest
#

oh been saying this

vague crest
vale glen
#

<@&1133519078540185692>

#

Oh, it's gone already

subtle merlin
#

who tf thinks trying to pull that in a big server will even work lmao

vale glen
#

There is no thought, only automation

subtle merlin
#

lol

hidden sable
#

whats the context when a blind starts

daring fern
subtle merlin
#

How can i add +25 chips to the current hand's chips in a consumable? hand_chips doesn't work no matter how i try it

daring fern
subtle merlin
#

no?

hallow forge
#

most of the time if an animation is playing, using cards is off limits

subtle merlin
#

and that's why i can't use the consumable during scoring

faint yacht
#

Do you want to influence the chips before any sort of scoring occurs?

hallow forge
#

technically you can use lovely patches to bypass this

hallow forge
#

but i would not recommend it

subtle merlin
hallow forge
#

i'm the exact opposite

#

i spam lovely patches

umbral zodiac
#

patch everything always

faint yacht
#

You'd likely need to patch in a context much like Unregistered Hypercam 2 in More Fluff uses.

#

Then check for said context in your consumables' calculate.

tribal kestrel
vale glen
#

Patch in a card that runs a new instance of Balatro when playing the card, and only while it's being scored noThoughts

tribal kestrel
#

hmm. yeah idk. you may have to patch how the score adds up internally to make that work

umbral zodiac
#

what if you lovely patch the love2d draw method so that the screen doesnt update anymore

tribal kestrel
#

either that or maybe upgrade the hand's chips and then downgrade it after the hand is played haha

vale glen
#

So sounds and events still happen, but the screen seems frozen during play

#

Hah

umbral zodiac
#

i meant permanently

vale glen
#

Ouh

umbral zodiac
#

just like, disable sight

vale glen
#

Like blind chess, but it's Balatro

hallow forge
#

just patch the players brain to not see anymore smh

vale glen
#

Add smellovision

random sleet
#

neuralink users beware the balatro modding community

or literally any usermade code

vale glen
#

Smell the bananas

tepid eagle
tribal kestrel
#

while I was learning how to make UI I worked out how to just put a giant rectangle across the screen, ezpz

subtle merlin
tribal kestrel
#

I'm just saying as far as I know, balatro doesn't have the function to just add a constant to the score. Everything has to be attached to an object or a hand

#

you may be able to work out another way, like I said upgrade the current hand by 25 chips, and then downgrade the hand by 25 chips after the hand is played. That's probably simplest? Idk how it actually works tho

hallow forge
vale glen
tribal kestrel
#

slay the spire mod? :o

#

aw shit has somebody else already worked out a map system? Am I wasting my time? hahaha

random sleet
hallow forge
#

terminate the tower mod! :0

random sleet
daring fern
#

How does one show the full path of the crash location instead of a cut off first part of it?

subtle merlin
hallow forge
random sleet
subtle merlin
tribal kestrel
#

topple the totem

random sleet
tribal kestrel
#

that looks pretty cool with the shadow

hallow forge
#

brEak tHe builDing add-on; :()

random sleet
#

ok im out of sts stuff now

faint yacht
#

-# hm... held in hand scoring first...

hallow forge
#

no destroying the den then?

random sleet
hidden sable
#
            if card.debuff then
                return {
                    colour = G.C.GREEN,
                    message = "Fixed!",
                    func = function()
                        card.debuff = false
                        card.ability.extra.bugged = false
                    end
                }
            end
        end```
why doesnt this work? when at the end of a boss blind it doesnt trigger the stuff i need it to
tight notch
#

how do i make my booster pack's group name not return error?

gaunt thistle
#

patches are fun, just use protection and they'll generally work well

hidden sable
hallow forge
#

patch always

#

avoid using a lua file

#

just patch

tight notch
#

like is there something wrong with this?

subtle merlin
obtuse silo
hallow forge
#

n e 1 no how 2 access localization of a joker for a specific language?

daring fern
feral tree
#

Is Context.end_of_round bugged when it comes to creating jokers?

feral tree
#

I have this code here

#

it works perfectly but it creates seventeen copies of the same joker instead of just one like i wanted

#

and i can't figure out why

faint yacht
daring fern
feral tree
#

but what does context.main_eval do exactly?

daring fern
tight notch
livid nimbus
#

For existing contexts, you do not need to patch every location, you can directly borrow it. For those locations where there is no existing context, you need to manually patch.🥺

tribal kestrel
#

still haven't been able to work this out if anyone has any ideas

SMODS.ObjectType ({
  key = 'type_areas',
  cards = {
    ["j_ave_area_uncommon"] = true,
    ["j_ave_area_common"] = true,
    ["j_ave_area_rare"] = true,
    ["j_ave_area_legendary"] = true
  }
})

SMODS.Joker {
  key = 'area_common',
  loc_text = {
    name = "Common Area",
    text = {
      "common"
    }
  },
  atlas = 'ave_atlas_areas',
  pos = {x=0,y=0},
  pools = {
    ["Joker"] = false,
    ["type_areas"] = true
  }
}

c1_1 = SMODS.create_card({set = "type_areas"})

The card is spawning, but it's jusst the default +4 mult joker. Best I can figure, the pool isn't actually populating with the jokers? Idk how to work that out yet

hidden sable
fluid dove
#

is there a standard for how jokers that alter probabilities should be implemented? I'm tempted to just modify probabilites.normal but there's no chance in hell doing that manually will play nice out of the box with other modded jokers, and id need to manually check for oops all 6s.

hidden sable
#

maybe i cant return on that context

#

maybe i gotta do a manual message thing plus run the function

daring fern
hidden sable
#

if so how would i do that

hidden sable
#

let me try scanning with the extra

daring fern
hidden sable
#

extra.bugged has to be true because thats whats causing a redebuff every round

#
    key = "malice",
    blueprint_compat = true,
    loc_txt = {
        name = "Malice",
        text = {
            "{C:mult}+#1#{} Mult",
            "{C:green}#2# in 6{} to become",
            "{C:red,E:2}Bugged{}, which disables",
            "this {C:attention}Joker{} until you",
            "beat the next {C:attention}Boss Blind{}"
        }
    },
    eternal_compat = false,
    rarity = 1,
    cost = 5,
    atlas = "malice",
    pos = { x = 0, y = 0 },
    config = { extra = { odds = 6, mult = 20, bugged = false } },
    loc_vars = function(self, info_queue, card)
        return { vars = { card.ability.extra.mult, (G.GAME and G.GAME.probabilities.normal or 1), card.ability.extra.odds } }
    end,
    calculate = function(self, card, context)
        if context.joker_main then
            if pseudorandom('pwn_malice') < G.GAME.probabilities.normal / card.ability.extra.odds then
                return {
                    colour = G.C.RED,
                    message = "Bugged!",
                    func = function()
                        card.debuff = true
                        card.ability.extra.bugged = true
                    end
                }
            else
                return {
                    mult = card.ability.extra.mult
                }
            end
        end
        if context.end_of_round and G.GAME.blind.boss then
            if card.ability.extra.bugged then
                return {
                    colour = G.C.GREEN,
                    message = "Fixed!",
                    func = function()
                        card.debuff = false
                        card.ability.extra.bugged = false
                    end
                }
            end
        end
        if context.setting_blind then
            if card.ability.extra.bugged then
                card.debuff = true
            end
        end
    end,
}```
#

full code if you need

subtle merlin
#

While it's a stupid way to do it, does it still work to get a 1/4 chance of something happening by making a table with 3 false statements and 1 true statement then grabbing a pseudorandom_element of that table?

hybrid shadow
hybrid shadow
#

anyway whats the context.other_card for when the other card is a lucky card

subtle merlin
wind steppe
#

this doesn’t work with oops though

faint yacht
subtle merlin
coarse plank
#

how do you separate left and right card like in death?

hidden sable
hidden sable
#

gonna remove that blindboss part and see if it works

coarse plank
daring fern
hidden sable
#
            if card.ability.extra.bugged then
                return {
                    colour = G.C.GREEN,
                    message = "Fixed!",
                    func = function()
                        card.debuff = false
                        card.ability.extra.bugged = false
                    end
                }
            end
        end```
even with this, still doesnt work
#

let me try setting it without retrun

tight notch
hidden sable
#
            if card.ability.extra.bugged then
                card.debuff = false
                card.ability.extra.bugged = false
                return {
                    colour = G.C.GREEN,
                    message = "Fixed!",
                    func = function()
                        card.debuff = false
                        card.ability.extra.bugged = false
                    end
                }
            end
        end```
even with THIS it doesnt work
#

wrong context im thinking...

#

please someone explain whats happening, this has to be dark magic

#

oh wait maybe it doesnt trigger because its debuffed

#

...

#

thats prolly it

tight notch
#

disregard this

daring fern
tight notch
#

oh nvm

daring fern
tight notch
#

oh ok

#

did not know that

formal parrot
#

Why’s there no smods.poll_edition?

obtuse silo
tight notch
daring fern
hybrid shadow
#

am i able to do SMODS.add_card({ key = 'c_soul' })? or do i do smth else for specific cards

tight notch
#

that should work

daring fern
#

How does one fix this?

formal parrot
daring fern
formal parrot
#

It didn’t work :D

#

Whats the parameter ?

daring fern
daring fern
tribal kestrel
#

good question, last I downloaded it was about 2 weeks ago I think. I'll check

#

1.0.0~BETA-0615a

#

oh, wait

#

1.0.0~BETA-0531a actually

#

I'll update just to make sure

#

same result on latest

#

When I use the function
print(get_current_pool("type_areas")), it returns
1: j_joker type_areas1

daring fern
tribal kestrel
#

if I set the default, it does load the default correctly. however it does not populate the pool, it looks like

hybrid shadow
#

was abt to come in here with a stupid question before realizing that i accidentally had my joker create a permanent delay in its calculate function

#

interesting thing i just learned: changing shop size negatively happens immediately, but doing the same to vouchers and boosters doesnt do anything until the next shop

tribal kestrel
#

probably have to recalculate for that

#

or not, idk

hybrid shadow
#

its an smods thing from what i can tell since changing voucher/booster slots are both things smods adds

feral tree
#

Is there a way to get this to destroy a joker next to it, get +2Xmult and use it in one hand?

feral tree
#

And what is that way?

daring fern
feral tree
#

Dagger destroys the joker to the left every blind

#

however i want this joker to destroy every hand and gain a certain amount of xMult everytime it does

#

if it's possible of course

daring fern
thorn furnace
hidden sable
#

any way to do a fake debuff, like a fake overlay on the card that uses the debuff tyexture

daring fern
hidden sable
#

its a shader??

daring fern
hidden sable
#

how would i apply it

hidden sable
#

?

daring fern
tribal kestrel
errant fulcrum
#

How do I keep a toggle config from reverting when I restart a run?

errant fulcrum
daring fern
median grove
#

this is a function i took from the cryptid consumable multiply and put on my own card. its designed to multiply the games probabilities by 2 after a certain number of rounds (1 rn for testing) but nothing is happening. ive tried removing the if statement to see if it was something to do with the variable, and ive tried it with cryptid on to see if it was a cryptid dependent function with no luck. does anyone have any ideas?

#

halved rounds is put as 0 in the cards config

median grove
#

shouldn't it work if cryptid is enabled then?

daring fern
vague crest
#

if i wanted to debuff a random card in deck when blind is selected, is there a specific process i should use to go about it in a way that wouldnt cause them to be undebuffed by other sources later? im hoping to debuff cards permanently via a joker

#

same goes for generally just affecting cards in deck really since i have another joker idea which removes a random card on rerolling

median grove
daring fern
plush depot
#

anyone know what the code is to get an image on the thingy in the mod loader and what the size of the image is

tribal kestrel
burnt quartz
#

1x-> 32x32
2x-> 64x64

daring fern
solid mesa
plush depot
daring fern
plush depot
#

idk why i think i like the regular box more than how the debugplus ones format is

solid mesa
hybrid shadow
#

in order to add multiple info queue boxes, do i just need to add more to one info_queue, or make a new line with another info_queue?

daring fern
hybrid shadow
#

cool

hybrid shadow
timid star
#

how would i save custom variables in a save file?

daring fern
timid star
daring fern
timid star
#

im guessing i need to hook the game too to set the variable on new runs

hybrid shadow
daring fern
#

You could also do: ```lua
info_queue[#info_queue+1] = G.P_CENTERS.j_joker; info_queue[#info_queue+1] = G.P_CENTERS.j_blueprint

#

Semicolon is treated as a new line I think.

wild pine
#

playtesting my mod and uh
how

#

i dont have showman

#

is this something i have to like specifically set for it to not show up in the shop again?

daring fern
violet gulch
#

Did you spawn them in with debug?

wild pine
#

oh does that do it

daring fern
wild pine
#

thats funny lmao

#

alright then thanks

hybrid shadow
#

how do i loop through the held hand again

sullen hatch
#

anyone have any tips on getting started with modding?

daring fern
burnt quartz
#

the mine definition can give you a example of how to replay the held cards

lament agate
#

can i actually detect keypress input using smods or do i need lovely patch for it?

hybrid shadow
daring fern
daring fern
hybrid shadow
daring fern
lament agate
daring fern
paper zealot
pure salmon
#

they have an empty 1-pixel border around the edges

#

the actual workable space is 32x32

acoustic briar
#

if it's a 1 pixel border wouldn't it then be 33x33?

daring fern
acoustic briar
#

oh, i'mstupid lmao

#

sorry i literally haven't had a single sip of water in 24 hours im not very smart today

high sinew
#

curious if theres a way to update text for jokers localization. Basically want it to take out once something happens ik u can change text

acoustic briar
#

ty for explaining it regardless

acoustic briar
#

but yeah thats interesting dimensions, wonder why they opted for 34x34 instead of just making the workable space 30x30

high sinew
daring fern
hybrid shadow
high sinew
daring fern
#

Seals have always existed?

hybrid shadow
daring fern
hybrid shadow
fierce frost
#

bump (iirc the joker doesnt score and the message never shows up)

daring fern
daring fern
high sinew
# daring fern What do you mean then?

It was to have a way to dynamically change which ranks you havent played for high card easier than a whole for loop but imm prob just gonna do tedious way to make it work how i want

hybrid shadow
merry raven
#

Is it context.destroy_card or context.destroying_card when I want to destroy a card

hybrid shadow
#

unless you mean like

#

on command

daring fern
merry raven
#

I just want to destroy the cards in scoring
I have a Joker where if your hand contains all the same enhancements, it destroys them all and spawns a new card where its rank is the total of the destroyed cards' ranks

#

So it's like "merging" a card

merry raven
#

Played hand

daring fern
pulsar furnace
#

How could I add a sprite to the front? (like in the sleeves mod)

merry raven
# daring fern Then both would work.

The question is where I should put context.destroying_card at
This is my Joker, and said enhancements are these "Resonance" enhancements

  • Checks if your hand contains all Resonance enhancements
  • If yes, combines each of the cards' rank IDs into a variable, total_rank
  • Find the closest rank to that total_rank
  • Spawn new card with a suit and the said rank

I don't know when to handle card destruction

fierce frost
#

hey my joker's not scoring at all

daring fern
merry raven
#

I see

#

If I don't include context.scoring_hand then I can't use for _, scoredCard in ipairs(context.scoring_hand) do

tepid crow
#

you could also draw a sprite on top of the CardArea, that's what sleeves do when you're in a run

#

(yes, the 2 different methods are weird)

hybrid shadow
#

where do messages like "saved by mr. bones" go in localization?

#

does it just go in dictionary

tepid crow
autumn berry
#

what method should I be overloading to properly overwrite localizations dynamically? I've tried just handling it at the start but steammodeed overwrites my changes. I tried porcess_loc_text on the mod, I've tried G.set_localization. I'm trying to do something like: If lang was set to en-us Replace all instances of the word 'Money' with 'Gold'.

hybrid shadow
vague crest
#

if i wanted to make a rank considered a certain enhancement temporarily, how would i go about doing that?

#

i have this but it does not function i fear

#

(referenced from extra credit's alloy)

daring fern
vague crest
#

where would i find the documentation for that?

daring fern
vague crest
#

ok

daring fern
#

Because it's not public yet.

vague crest
#

oh so this joker just is not possible

daring fern
vague crest
#

do you mean the documentation isnt public yet or the quantum enhancements itself isnt

daring fern
#

Firstly, you have to enable them: ```lua
SMODS.current_mod.optional_features = function()
return {
quantum_enhancements = true
}
end

vague crest
#

is that done within the joker itself? or in like a different file

daring fern
#

Secondly, replace you're entire if check with if context.check_enhancement and context.other_card:get_id() == magneticRank then

daring fern
#

In a loaded file.

vague crest
#

if its just up here by the atlas does that work fine?

#

ooh no it does not the game crashes loglessly

plush depot
#

is there a way to do x_dollars or something on an enhancment

hybrid shadow
#

like multiply dollars?

plush depot
#

yes

#

like x1.2 dollars or something

hybrid shadow
#

is multiplying dollars even something that exists

plush depot
#

idk

#

i think so?

#

anyone else know

chrome widget
#

If you want that functionality as like a universal thing you'd need to patch SMODS

chrome widget
#

Otherwise you can do it on a case_by_case basis using some other functions

plush depot
#

oh

chrome widget
#

I.E calculate the resulting mult, use ease_dollars with the difference between the new and old values, and then use card_eval_status_text to do the message

plush depot
#

uh

#

is that on the smods wiki

hybrid shadow
#

lets hope updating smods wont break my mod

vague crest
#

how would i check when a gold card gives money? like for scaling a joker for example

hybrid shadow
daring fern
wide lily
#

how would I get this silly guy to work

hybrid shadow
lament agate
#

pardon

#

but

#

context.other_card:is_wild() is a thing right

gusty iron
#

i think?

#

you can always just check if its somehow all 4 suits though

lament agate
#

thats more like it yeah

#

i just want to make this efficient by it working only for Wild

chrome widget
#

It's SMODS.has_any_suit()

lament agate
#

never expect it to be like that

#

like this?

chrome widget
#

You need to pass on the card you're checking as an argument

lament agate
#

got it

hybrid shadow
#

is there smth abt the way mr bones is coded that prevents blueprint from being able to copy it

final jewel
hybrid shadow
final jewel
hybrid shadow
#

then why does blueprint copy stuff even if you dont set blueprint_compat to true

final jewel
#

that weird

wide lily
#

bump

daring fern
final jewel
lament agate
#

gruh

lament agate
#

i think imma just

#

stick with SMODS.has_any_suit

#

the wild cards thing

#

or is there any better way to do it

daring fern
lament agate
daring fern
lament agate
daring fern
lament agate
#

thanks smth

daring fern
#

It's SMODS.has_enhancement

#

Not SMODS.has_enhancements

lament agate
#

fuck

#

shoudl be good

#

thanks

daring fern
final jewel
#

and I know sell_price doesn't exist I dont know why it pops here

lament agate
#

so the description shows nil value, but i already specified the value inside of config, whats wrong? @daring fern

final jewel
#

Mb if the english is kinda bad if its the reason of the question mark

final jewel
#

oooooooooooh

#

ok

hybrid shadow
lament agate
#

what do i put in thee again

final jewel
lament agate
#

I GOT IT

daring fern
lament agate
#

thanks

wide lily
hybrid shadow
#

is context.destroy_card.ability.(modprefix_stickerkey) a viable way to check if the card in context.destroy_card has a certain sticker?

daring fern
#

context.destroy_card is the card.

hybrid shadow
#

alr

vague crest
final jewel
#

Im probably missing something

plush depot
#

anyone know what the code is to make a consumable type

timid star
#

how do i define a custom shader that i could use with love.graphics.setShader? love.graphics.newShader() is empty rn because idk what to put in it for the shader to load

#

i dont know what im doing

daring fern
hybrid shadow
#

what vanilla jokers have the capacity to destroy cards

#

playing cards to be precise

wind steppe
#

nothing afaik

plush depot
#

for primary and secondary color, do i do the hex code or just "red" or "blue"

plush depot
#

it does this with hex and color name

daring fern
plush depot
#

is something wrong

#

i wanna go to sleep soon but wanna fix this first

hybrid shadow
plush depot
#

im noticing i put color and not colour

plush depot
timid star
#

you need to use HEX()

daring fern
plush depot
#

what it works for me

wind steppe
plush depot
#

my issue is i used color and not colour

#

wait what the frick

#

when i did HEX("FF0000") on other stuff it didnt work

#

yeah

#

let me try ig

#

now what

#

woah it works now

#

thanks guys

winged thunder
#

guys whenever i launch i get this does anybody know how to fix

autumn berry
#

not enough info to debug anything, but whichever mod is adding a bee bug ain't doing it right

#

I'm attempting to do some dynamic localization which involves reading some fields from my translation file if it's there. Problem is at a steamodded mod's process_loc_text function even though my translation lua does have this field, it looks like steamodded hasn't loaded it in yet. Is there a different hook I should be using?

lament agate
#

how do you make a joker that plays a sound when they got bought

autumn berry
strong bear
hybrid shadow
# strong bear trading cards?

yeah i decided im not fucking with it because the only vanilla jokers that destroy cards do so in such a way that you have to very intentionally play into the destruction aspect of them

strong bear
#

instead of fucking you should be tinkering with it

#

jk

#

i just got started

hybrid shadow
#

turns out its easy to improve code if you do so while splitting your code up into pieces

lament agate
#

im new to this

pastel kernel
#

this is the place to talk about making mods?

hallow forge
#

code stuff

pastel kernel
#

ok um

#

xmult scaling joker

hallow forge
#

Campfre

pastel kernel
#

persistent across blinds

hallow forge
#

most jokers do that

pastel kernel
#

i'm not trying to make a balanced joker btw

hallow forge
#

just like

#

ask the question

#

stop with the expostion

pastel kernel
#

x6 mult by default, extra x6 mult when you score 4 aces, how?

thick needle
#

Can someone help? Whats wrong with my code? Both 1x and 2x files are named "Tax Collector.png"

#

--- STEAMODDED HEADER
--- MOD_NAME: CustomCreations
--- MOD_ID: CustomCreations
--- MOD_AUTHOR: [Mr. (Ant)Tenna]
--- MOD_DESCRIPTION: My own Jokers.
--- PREFIX: xmpl

------------MOD CODE -------------------------

SMODS.Atlas{
key = 'Taxer',
path = 'Tax Collector.png',
px = 71,
py = 95
}
SMODS.Joker{
key = 'Tax Collector', --joker key
loc_txt = { -- local text
name = 'Tax Collector',
text = {
'At end of round,',
'earn 1$ for each joker',
'you currently have.',
},

},
atlas = 'Taxer',
rarity = 2,
cost = 7, --cost
unlocked = true,
discovered = true,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = true,
pos = {x = 0, y = 0},
config = { 
  extra = {
    dollars = 1
  }
},
loc_vars = function(self, info_queue, card)
    return { vars = { card.ability.extra.dollars, card.ability.extra.dollars * (G.jokers and #G.jokers.cards or 0) } }
end,
calculate = function(self, card, context)
    if context.joker_main then
        return {
            dollars = card.ability.extra.dollars * #G.jokers.cards
        }
    end
end,

}

#

Oh sorry for inturupting

pastel kernel
#

how do i make a joker that gains x6 mult when you score 4 aces? (by default, it stats with an x6 mult.)

hallow forge
#

do you know lua

pastel kernel
#

well i'm beginning

hallow forge
#

could you condifentely code tic tac toe in lua?

pastel kernel
#

no.

hallow forge
#

you probably should learn more lua

pure salmon
#

give me a second firsttry i’m writing up a code snippet for you

pastel kernel
#

i'm just making one joker as a mod

hallow forge
#

tic tac toe is a pretty simple game

autumn berry
# lament agate huh, elaborate?

learn Lua 101 first would be my honest advise. But the jokers have some api methods. You can hold a local ref to their api and replace it with a delegate to you own method which can call the original and then act however you want.

local add_to_deck = joker.add_to_deck
joker.add_to_deck = my_add_to_deck
function my_add_to_deck(joker, card, from_debuff)
add_to_deck(joker,card,from_debuff)
if not joker.initial then
joker.initial = true
--do whatever you want to do, it's this first time obtaining the joker
end
end

depending on where you're at this may be too much for a beginner https://www.tutorialspoint.com/lua/lua_proxy_tables_delegation.htm, you'll get there

pastel kernel
#

i think tic tac toe can be made with very few snippets but i'm not sure since i'm not mr alan turing or whatever the hell

hallow forge
#

it's tic tac toe, you do not need to be alan turing

pure salmon
#

here’s just the calculate function and related stuff

config = { extra = { xmult = 6, xmult_mod = 6 } },

calculate = function(self, card, context)
    if context.joker_main then
        return {
            xmult = card.ability.extra.xmult
        }
    end
    if context.before then
        local ace_count = 0
        for _, playing_card in ipairs(context.scoring_hand) do
            if playing_card:get_id() == 14 then
               ace_count = ace_count + 1
            end
        end
        if ace_count >= 4 then
            card.ability.extra.xmult = card.ability.extra.xmult + card.ability.extra.xmult_mod
            return {
                message = localise(“k_upgrade_ex”)
                colour = G.C.MULT
            }
        end
    end
end
#

written on mobile and without reference so this may have mistakes

#

but this is mostly right

hallow forge
#

you need to ensure context.scoring_hand exists before looping

#

wait

#

no you need to

#

ans also you are missing an end

pure salmon
#

yeah i can’t see shit on mobile

hallow forge
#

it appears context.before was not tested for at all

hybrid shadow
hallow forge
pure salmon
#

it’s meant to be in a context.before

#

mb

#

there

hallow forge
#

forgot a then

pure salmon
#

i’m typing this directly into discord on mobile man

hybrid shadow
#

how do i prep my mod for uploading to github?

pastel kernel
#

gonna see if i can modify the loc_vars for my joker

hasty mist
#

why does this happen when G.GAME.linear_scaling == false

hallow forge
#

Because the function doesn’t return anything if it’s false

#

Also please don’t just override the get_blind_amount function

#

Hook it instead

snow vale
#

consumeable or consumable

hasty mist
hallow forge
hasty mist
#

i didnt realize it was already a function

snow vale
hallow forge
#

It’s inconsistent

snow vale
#

vruh

pastel kernel
#

ok so the joker works but now it won't show the description

#

tooltip as you say

lament agate
#

is it 1 or "Ace"

pastel kernel
hasty mist
#

converted to a hook, why does it hard crash now?

#

oh shit it works now

#

cool!

sly pagoda
#

Based

hasty mist
#

now for the hard part

sly pagoda
#

tragedy strikes harder than the day that shall not be named

snow vale
#

how can i get every consumeable there is ingame?

pastel kernel
snow vale
#

what do i return here if i want it to only let me if im playing a blind?

urban wasp
#

am i stupid or something? this is crashing the game

local dice = 0

local roll = pseudorandom("roll")
if roll <= 0.16 then
    dice = 1
elseif roll <= 0.33 then
    dice = 2
elseif roll <= 0.5 then
    dice = 3
elseif roll <= 0.66 then
    dice = 4
elseif roll <= 0.84 then
    dice = 5
else
    dice = 6
end

SMODS.Blind {
    key = "dice",
    pos = { x = 0, y = 2 },
    boss = { min = 3, max = 10 },
    atlas = "blind",
    mult = dice,
    boss_colour = HEX("26bc55"),
    crp_credits = {
        idea = { "Poker The Poker" },
        art = { "George The Rat" },
        code = { "Glitchkat10" }
    }
}
hasty mist
#

are there any examples of mods (other than polterworx) that modify the chips mult operator

unborn bay
#

its only available when you're ingame

urban wasp
#

i didn't know that
i thought this code does run while in-game?

#

i'm not that experienced with lua, sorry

unborn bay
#

what no

#

in game means youre in a balala run

urban wasp
#

well yeah

unborn bay
#

this gets run once, when the file gets loaded

urban wasp
#

but don't mods load after the base game or something?

unborn bay
#

aka at startup

urban wasp
#

i don't know, how do i fix this to work correctly without crashing?

#

that's kinda just what i want

unborn bay
#

just replace it with a math.random() call

#

lmao

urban wasp
#

well, no, that doesn't work how i would really want

#

it doesn't work well with balatro; reloading the blind doesn't change the value

#

it stays the same from balatro startup

#

i figured this would solve the issue

#

i want it so that if i'm in the collection and i turn a page and back, it redoes the random value; is that possible at all?

#

if not, math.random is fine

unborn bay
#

thats fucking devious but ok

#

youd have to lovely patch into create_UIBox_your_collection_blinds

#

if you want it to be changed only every time you see it during the collection

urban wasp
#

uhhh nope it works flawlessly actually

#

like so good

#

-# (i'm not doing lovely patches yet, curse them (for now))

unborn bay
#

oooo you wanna lovely patch

#

you wanna do it so bad

#

ooooo

urban wasp
#

i'm too lazy idc 😭

molten musk
#

morning folks

hasty mist
#

i only have 2 lovely patches

#

one for a blind that does something similar to the serpent

molten musk
#

tried making the seal give gold and planet when held in hand, doesnt work
anyone can help?

hasty mist
#

and another that adds type score to cryptid's kidnapping joker

molten musk
#

money part doesnt, it gives money when played intsead

lament agate
molten musk
lament agate
#

sure

molten musk
#

it here somewhere

#

im looking it up, but u can search too

lament agate
#

ill look it up too

plain gazelle
#

I want to destroy scored and played (but not scored) cards after scoring the hand but using context.cardarea == G.play condition only destroys scored cards

molten musk
wide lily
molten musk
lament agate
molten musk
#

or A

lament agate
molten musk
#

yes

molten musk
#

there is a lua and context.main_scoring condition

lament agate
molten musk
#

i think its either reverse it some how or there is a condition for non scoring

molten musk
lament agate
#

well i mean

#

the 9s doesnt work too

#

it doesnt turn into steel nor retrigger it

molten musk
#

then something else is wrong with the code

#

not the rank==

lament agate
unborn bay
lament agate
unborn bay
#
if c:get_id() == 14 or c:get_id() == 9 then
  -- whatever
end
#

you fool.

molten musk
#

someone better than me spawned 🥳

unborn bay
#

get_id returns an id

unborn bay
#

which is an INTEGER

#

A NUMBER

lament agate
#

WAIT 14???

unborn bay
#

11 is jack

#

12 is queen

#

13 is king

lament agate
#

now where does it say that

#

how would i know if it was 14,,,,,,,,,,

unborn bay
#

thunk's code™

lament agate
#

you know what

#

valid

#

thanks tho

molten musk
wide lily
#

yes

#

this is the first joker I've made so yea

#

got no idea what I'm doin

#

well

molten musk
#

me too, but will try to help lol

wide lily
#

I HAVE some knowledge of the language

#

but I know nothing about modding this game

lament agate
#

okay now im lost

molten musk
#

i have been modding for more than a week now so

lament agate
#

wdym edition

#

@unborn bay HELP

molten musk
#

its e_steel in code

unborn bay
#

why are you setting it as an edition.

lament agate
#

but thats enhancement

#

not an edition

unborn bay
#

enhancements are like jokers in a sense

#

theyre just another center

#

card:set_ability("m_steel")

lament agate
#

thats

#

what i

#

did

#

oh

#

wait

#

fuck

#

im STUPID

#

hold on

wide lily
molten musk
molten musk
#

didnt forget u

unborn bay
#

enhancements are different from editions

lament agate
#

is this it?

molten musk
#

true got them mixed up

molten musk
lament agate
#

i see

molten musk
#

why cant i open a thread?

#

is it disabled?

lament agate
#

NOT THE JOKER

molten musk
wide lily
vague crest
#

trying to implement a joker that makes certain cards be drawn face down, and then face down cards give money, but the giving money part isn't doing anything, what part would I need to change to get it working?

molten musk
#

anyone here?

wide lily
#

help line 22 is crashing the game

#

trying to destroy first scored card

manic rune
#

SMODS.destroy_cards, not destroy_cards

molten musk
#

@daring fern can u help with brrr code?

wide lily
molten musk
#

hi

manic rune
#

hi

molten musk
manic rune
#

but also, you might want to use context.destroy_card instead honestly

wide lily
wide lily
#

lnjgkjgrkgdjkkjjkgslksggs I am going insane

wintry solar
wintry solar
#

that is a very loose context check

wide lily
#

yea

#

it adds to the xmult twice

wintry solar
#

you want something like this

if context.before then
  card.ability.extra.xmult = card.ability.extra.xmult + card.ability.extra.xmult_gain
  SMODS.destroy_cards(context.scoring_hand[1])
  return { message = localize({type = 'variable', key = 'a_xmult', vars = {card.ability.extra.xmult}})
end```
hasty mist
#

how do i make a deck start at a different ante

wintry solar
#

you could probably put an ease_ante call in the apply function

hasty mist
#

(itll be ante 0)

wide lily
hasty mist
#

since it doesnt update

#

until you enter the blind

molten musk
#
-- Gold Blue Seal
SMODS.Atlas {
    key = "Seals15_atlas",
    path = "B_Gold.png",
    px = 71,
    py = 95,
}
SMODS.Seal {
    key = 'GoldBlue',
    pos = { x = 0, y = 0 },
    atlas = "Seals15_atlas",
    badge_colour = G.C.BLUE,
    config = { extra = {h_money = 2 } },
    get_p_dollars = function(self, card)
    return card.ability.seal.extra.money
        end,
    calculate = function(self, card, context)
        if context.end_of_round and context.cardarea == G.hand and context.other_card == card and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
            G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1
            G.E_MANAGER:add_event(Event({
                trigger = 'before',
                delay = 0.0,
                func = function()
                    if G.GAME.last_hand_played then
                        local _planet = nil
                        for k, v in pairs(G.P_CENTER_POOLS.Planet) do
                            if v.config.hand_type == G.GAME.last_hand_played then
                                _planet = v.key
                            end
                        end
                        if _planet then
                            SMODS.add_card({ key = _planet })
                        end
                        G.GAME.consumeable_buffer = 0
                    end
                    return true
                end,
            
            }))
        
    end
    if context.end_of_round and context.cardarea == G.hand and context.other_card == card and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
        return { vars = { self.config.extra.h_money } }
        end
        return {  colour = G.C.SECONDARY_SET.Planet }
    end
}```
#

i tried making a seal with gold and blue combo

wintry solar
molten musk
#

want it to give money when in hand

wintry solar
molten musk
#

and planets

#

planet part work, money part not

#

can someone help

hasty mist
#

can i just use G.HUD:recalculate()?

#

or is it something other than HUD

wintry solar
#

I don't think it's G.HUD, but I don't remember off the top of my head what it is

wide lily
molten musk
#

waiting for the chosen one to look at my code lol

wide lily
#

wait it worked

#

you have my thanks

molten musk
light canyon
#

I downloaded steamodded but the "mods" button didn't appear

manic rune
#

did you download lovely too

light canyon
manic rune
#

where did you put it

molten musk
#

why is no one trying to help me 🤔 sad

manic rune
#

and uh

#

my bike is currently fucked while im going home

#

so im chatting on my phone waiting for help rn :3

molten musk
#

oh

#

ok

#

will wait till someone tries to help...

subtle merlin
#

Oh! Check VRemade!

molten musk
#

checked

rain atlas
#

anyone know what dev i should toss this at?

molten musk
subtle merlin
#

oh, as in gold card: the seal

molten musk
#

have tried various stuff last 2 days but nothing worked

molten musk
#

its the exact same thing but with money

wintry solar
#

your planet part works right?

molten musk
#

yes

summer creek
#

can someone help me fix this slight "issue"? some of my jokers have a weird outline, sometimes dark and most often yellow, is that normal?

molten musk
#

its the blue seal code

wintry solar
#

just put return { dollars = X } after that bit

molten musk
manic rune
maiden phoenix
summer creek
molten musk
#

put it every where possible

manic rune
#

is this how i do it

#

🤔

molten musk
manic rune
#

adding custom calculate to ygg's relics

#

like uhh partner

#

:3

molten musk
#

i see

#

and im still trying to figure out what to do about my code YoiCry

wintry solar
manic rune
#

a

wintry solar
#

oh well, it depends what you want the relic to do actually

#

that's adding an entire seperate calculation step for them

manic rune
#

mm well i want to add relics their own calculate, since there r effects which affect other relics' calculate too like "Increase +Mult by (x)" and stuff

wintry solar
#

but do you not want them to be part of the normal calculation stuff?

#

so they have access to all the normal calc contexts?

manic rune
#

🤔 idk lar said that i should add a new calculate for relics

runic jay
#

What am I doing wrong? It shouldn't look like this (obviously)

manic rune
#

your loc_vars is set up wrong

runic jay
#

It looked like this before it gained the X Mult

thorn basin
#

what is the command prompt for changing the color of the shape behind the message?

manic rune
#

return {
...
colour = G.C.RED,
}

wintry solar
thorn basin
#

aight, thx bepis!

manic rune
summer creek
manic rune
wintry solar
#

are you adding custom contexts?

maiden phoenix
manic rune
#

i mean, this approach should allow me to add custom contexts in the future too, so thats nice

wintry solar
#

if you want ridiculously bloated code, sure

manic rune
#

dang

#

what should i do then

#

this is what Partner did, so im referencing from their code 🤔

runic jay
# manic rune your loc_vars is set up wrong

`SMODS.Joker {
key = 'tradeoffer',
loc_txt = {
name = 'Trade Offer',
text = {
"Gains {X:mult,C:white} X#1# {} Mult",
"when joker is sold",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)"
}
},
config = { extra = { xmult_gain = 2, xmult = 0 } },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.xmult_gain, card.ability.extra.xmult } }

end,
blueprint_compat = true,
perishable_compat = true,
eternal_compat = true,
rarity = 3,
atlas = 'TRBMod',
pos = { x = 5, y = 0 },
cost = 12,
calculate = function(self, card, context)
    if context.selling_card and not context.blueprint then
        card.ability.extra.xmult = card.ability.extra.xmult + card.ability.extra.xmult_gain
        return {
            message = localize('k_upgrade_ex')
        }
    end
    if context.joker_main then
        return {
            xmult = card.ability.extra.xmult
        }
    end
end

}`

This is the entire code for the joker which I'm having trouble with, and I've tried everything I could think of to fix it

wintry solar
#

it would be in the jokers type

unborn bay
#

oh then yeah

manic rune
unborn bay
#

just add them there via lovely patch

wintry solar
#

you can even hook this function

runic jay
thorn basin
#

Not sure why but when I played a pair after I played a double pair, this joker didn't upgrade.
It was supposed to upgrade cuz the hand was a different one.
Is there a way I can fix this?

manic rune
#

🤔 i wonder why card.ability.extra.xmult_gain seems to be set to 0

summer creek
maiden phoenix
#

Each card are usually 71x95

runic jay
#

And then it became this when it did gain it

summer creek
maiden phoenix
#

Ooh if they're the correct size then it's pixel bleeding

summer creek
#

are they too close? i am aware it hase to be 71x95

#

oop-

hallow forge
#

there is supposed to be a gap of 1 pixel surrounding

#

making the actual art 69x93

summer creek
#

AH

#

will try that...

wintry solar
#

you can move them apart and just adjust your atlas size

summer creek
maiden phoenix
#

1 pixel off each direction like this

wintry solar
# summer creek by how much

yeah there would need to be a 2 pixel gap between each, (1 pixel around the entire image) and then set your atlas dimensions as 73x97 in your atlas definition

manic rune
#

this is how i do it, right

#

-# i just realized the skill tree also used this

wintry solar
#

whats the weird loop for?

manic rune
#

idk, it seems to be in victin's code from when i referenced from their mod?

#

im guessing it adds the area specifically after G.jokers in the table

#

🤔 thats probably not necessary right

wintry solar
#

I guess it's making sure it inserts the areas directly after jokers

manic rune
#

yeah

thorn basin
#

how can I put in a local variable the previous poker hand played?
(cuz I wanna check if the current poker hand played is different from the previous one)

wintry solar
#

it's not necessary unless you are particularly bothered about when exactly it calculates your area

manic rune
#

mm i see

wintry solar
#

you can just do table.insert(t, G.ygg_relic_area) etc.

#

or t[#t+1] = G.ygg_relic_area

#

I'm not sure which is more efficient but it''ll hardly matter

#

also when did -# get disabled in discord 😭

manic rune
#

yeah i actually dont know whats the difference between table.insert and t[#t+1] lol

#

-# it didnt? 🤔

wintry solar
#

oh it's just my laptop being weird

#

huh

primal robin
#

Some says that #t + 1 just faster

manic rune
#

oh, and also, i was wondering if theres a way to hook to the calculate of relics to change the return's mult, xmult and such? 🤔

wintry solar
#

of other relics?

manic rune
#

of all relics, yeah

wintry solar
#

that'd be harder to implement but it's definitely possible

manic rune
#

mm any approach you can think of? 🤔

molten musk
#

im back

#

went to do something

manic rune
#

my initial idea was this but clearly that wasnt the solution lol

manic rune
#

is the consumable limit check really necessary

#

🤔

light canyon
manic rune
#

i would do this, probably

if context.end_of_round and context.cardarea == G.hand then
  return{
    dollars = card.ability.extra.h_money
  }
end
wintry solar
light canyon
molten musk
#

for money it is not

manic rune
#

yeah that seems to be the money's code

molten musk
manic rune
thorn basin
#

What do I have to add for this variable to have the previous hand played and not the current one?

molten musk
#

did this

#

but crashes

#

tells me line 530 "extra" not defined

#

oh the pic doesnt have line num facepalm

#

my bad

#

amm

#

now it works but doesnt give me money....

manic rune
#

hm

#

wait, arent stuff stored in card.seal when it comes to seals 🤔

#

can you try card.seal.extra.h_money

wintry solar
#

it'll never hit the bottom block

#

unless you have no room for the planet

molten musk
feral tree
#

I have a Joker that divides the blind chips in half, it works but the blind number doesn't update to the new number

lament agate
feral tree
#

what do?

lament agate
#

what did i do wrong here

molten musk
manic rune
#

i assumed this is where i should patch, but turned out it doesnt print anything even though the calculate of the relic works 🤔

#

so thats not it

faint yacht
#

Yeah, about base seals...

fallow condor
#

might be wrong

manic rune
#

hm

fallow condor
#

but is it because of two returns?

molten musk
manic rune
#

i only remember that someone said the extra stuff of seals is not stored in .ability.extra 🤔

faint yacht
#

Even then.

faint yacht
#

Store the context.full_hand somewhere that is not reset or initialized by calculate.

faint yacht
thorn basin
manic rune
#

🤔 i tried putting print in self.ability.set == "YggItem" and it certainly printed

#

but o and t always seemed to be nil?

faint yacht
#

You'd probably want to store the latter as card.ability.extra.prev_hand = context.scoring_name, then compare.

lament agate
#

im going to fucking tweak

#

whats wrong with it

molten musk
#

i would love to tell u whats wrong, but i dont know

#

and send a pic with line num

lament agate
#

I'll be right back

manic rune
manic rune
#

what version do you have?

rain atlas
manic rune
#

if its xbox gamepass then its currently not supported yet

floral narwhal
#

am i calling wrong soul? cause this code works,but only makes card's h and w multiply not soul

manic rune
#

whats the "Dark" here?

lament agate
lament agate
thorn basin
manic rune
#

im pretty sure you will want to do

info_queue[#info_queue+1] = {key = "Dark", set = "Other", vars = {colour = {G.C.SUITS.Spades, G.C.SUITS.Hearts, G.C.SUITS.Clubs, G.C.SUITS.Diamonds}}}

for the info queue to read from 🤔

#

actually, not sure if thats correct

light canyon
manic rune
#

if you sailed the sea then unfortunately i cant help you much lol

unborn bay
#

hi bepis

manic rune
#

hi haya

manic rune
#

i forgot

faint yacht
#

colours should be in vars.

#

The return one is for the localization text of the actual object, not for the added info_queue one.

light canyon
primal robin
#

Can I somehow remove default first tab created in mod's settings by SMODS?

#

I just have no space for this empty tab at all

manic rune
thorn basin
manic rune
#

is context.cardarea in context.joker_main locked to G.jokers?

faint yacht
#

You set the previous hand in the same block as context.before, but after checking for if it is defined (if not, skip to setting the poker hand name) and doing the comparison there, at which point you call the upgrade part.

molten musk
faint yacht
molten musk
#

but triggers twice

manic rune
#

i wanted to do smt like this to check if a relic is equipped or not, since the equipped and unequipped ones are in their separate areas

#

actually, realized i have a function to check if items are equipped or not, guess i will just have that as a mandatory check in the documentation later

light canyon
manic rune
#

no

#

the fact that you dont see the "Mods" button means lovely never loaded to begin with lol

#

and lovely is basically a mandatory part for all the good mods rn

#

does this make sense from an api perspective 🤔 Yggdrasil.equipped_item returns stuff when the item in question is equipped, and not when its not equipped to separate equipped and unequipped effects

thorn basin
#

oh wait

#

I had to set it == nil

#

cuz it won't update the previous hand

faint yacht
thorn basin
primal robin
faint yacht
# thorn basin it still doesn't work
if context.before and context.main_eval and not context.blueprint then
  card.ability.extra.prev_hand = card.ability.extra.prev_hand or ""

  local isnotsame = false
  if context.scoring_name ~= card.ability.extra.prev_hand then
    isnotsame = true
  end

  card.ability.extra.prev_hand = context.scoring_name
  if isnotsame then
    -- do upgrade
  end
end

?

light canyon
manic rune
#

steamodded works because of lovely

primal terrace
#

Now I'm curious, what are some examples of mods that do not require Lovely?

unborn bay
#

none

primal terrace
#

Awesome!

unborn bay
#

unless you count mods that dont have lovely patches

#

but they still kinda do

#

because of steamodded

primal terrace
#

Because you need Lovely to put the mods in there in the first place

faint yacht
#

This is the same as the ye olden Minecraft modding by replacing stuff in the actual .jar and what not.

manic rune
#

you could make a mod without both lovely and steamodded by directly changing the game's code

primal terrace
#

But why would you?

manic rune
#

🤷‍♀️

faint yacht
#

-# "balatro.exe" creepypastas be like:

molten musk
#

why does it trigger twice?

violet void
#

afaik it triggers per card held in hand

molten musk
#

nah, no matter how many cards i have with the seal they all just trigger twice