#💻・modding-dev

1 messages · Page 251 of 1

modern kindle
rain slate
#
return {
  descriptions = {
    --...
    Back = {
      b_tecci_stone = {
        name = "Stone Deck",
        text = {
          "Start run with",
          "{C:attention}52 Stone Cards{}",
          "in deck"
        }
      }
    },
  }
}
``` why isn't this deck localization working? It just says ERROR in game. I've checked and the key of the deck is `key = "stone"`, so I don't see why it's not working? (also why tf are decks called Back)
tall wharf
#

you forgot your mod prefix i believe

rain slate
#

it's there tho?

tall wharf
#

wait what

rain slate
#

j_tecci works for Jokers

#

I may be stupid

#

let me check

tall wharf
#

💀💀💀

sturdy compass
#

I think they're called "backs" because the art is the back of the card

rain slate
#

I'm not stupid

#

I thought I had just forgotten to save the file

primal shoal
#

sent the solultion in dms

rain slate
#

I'm cross-referencing with another mod that I often look at to see how stuff is done (Prism) and they seem to do it the same way? ```lua
return {
descriptions = {
--...
Back = {
b_prism_purple = {
name = "Purple Deck",
text = {"Can use {C:chips}Hands{} and",
"{C:red}Discards{} interchangeably",
"{C:inactive}(Can discard using hands if no",
"{C:inactive}discards left and vice versa)"
},
},
}
}
}

#

only that their's works and mine doesn't for whatever reason?

#

and for the actual back definition the key is also key = "purple"

sturdy compass
#

how are you defining your actual back?

rain slate
#

It's like this ```lua
SMODS.Back {
key = "stone",
atlas = "teccidecks",
pos = { x = 0, y = 0 },
apply = function (self, back)
G.E_MANAGER:add_event(Event {
func = function ()
for i = 1, #G.deck do
G.deck[i]:set_ability(G.P_CENTERS["m_stone"])
end
end
})
end
}

sturdy compass
#

and your prefix is definitely tecci?

rain slate
#

"prefix": "tecci",

#

yes

primal shoal
#
SMODS.Back {
    key = 'berry_holder',
    loc_txt = {
        name = 'placeholder',
        text = {'{C:purple}"placeholder"{}',
            "Start with a Deck",
            "with every {C:attention}Face card{}",
            "replaced with {C:attention}Queens{}",}
    },
    atlas = 'Deck_back',
    pos = {x=1, y=0},
    config = {only_one_rank = 'Queen',
        unlocked = true,
        discovered = true
    }, 
    apply = function(self)
        G.E_MANAGER:add_event(Event({
            func = function()
                for _, card in ipairs(G.playing_cards) do
                    for _, card in ipairs(G.playing_cards) do
                        if card:get_id() == 11 or card:get_id() == 13  then
                            assert(SMODS.change_base(card, nil, self.config.only_one_rank))
                        end
                    end
                end
                return true
            end
            -- function = SMODS.change_base(card, suit, rank)
            --     for _, card in ipairs(G.playing_cards) do
            --         if card:get_id() == 11 then

                    
            --     end
            --     return {card, nil, only_one_rank}
            -- end
        }))
    end
}

how I do mine

tall wharf
#

this might be a stupid question but did you name your localisation file correctly

rain slate
#

I don't see how the jokers would be localized correctly then

#

it's named en-us.lua

sturdy compass
#

very very weird

rain slate
#

ok so

#

I am

#

very very

#

stupid

#

I thought misc was inside descriptions

#

so I just put it above it

#

but

#

it's fucking outside

sturdy compass
#

That'll do it

rain slate
#

yeah there we go

#

if it didn't work after that fix then idk wtf I would've done

sturdy compass
#

lmfao

#

coding moment

rain slate
#

mfw forget return true at end of event func

tall wharf
#

infinite loop

sturdy compass
#

ouchie

rain slate
#

what is G.deck even

#

oh wait is that just visuals

#

or smtn

sturdy compass
#

G.deck is the card area for playing cards in your deck

primal shoal
#

G.deck is the card in the deck 🙂

rain slate
#

yeah but for some reason changing G.playing_cards works and G.deck doesn't even do anything

#

like for the deck and setting the cards you get at the start

sturdy compass
#

I think playing_cards is all of your cards while deck is cards that aren't in play yet

rapid stag
#

a puzzle:

to make certain ui elements blue, i'm patching where it sets stuff to G.C.RED in UI_definitions.lua and in most cases, switching out G.C.RED with G.C.SECONDARY_SET.UIDefault or G.C.RED. G.C.SECONDARY_SET.UIDefault is set by my mod in its main lua file, as part of the Game:main_menu(change_context) hook to G.C.SECNODARY_SET.Spectral before the original function is called.

and it should work because as i show, it works for UIBox_button(args) and specifically only the deck create_option_cycle patch. the other patches are taking, for jokers, vouchers, tarots, spectrals & boosters - but for some reason, all of those are ending up as shown in the first image with the spectral example and post-patch UI_definitions.lua where the cycle remains red. ...but it works for the decks one. cirLost what am i doing wrong?

sturdy compass
#

Have you checked the smods code for anything ui?

#

Could be an override

rapid stag
#

where and what would i be looking for cirDerp

sturdy compass
#

Not entirely sure myself

#

just start poking around I suppose

rain slate
#

maybe even lovely could let you see those overrides

#

if you dump-lua

rapid stag
#

does it not matter that the code i'm showing is the dumped lua?

rain slate
#

ah I didn't see

sturdy compass
#

But yeah just start poking around in the src files in your smods install and see what you can find

harsh marten
#

what are the different pool types?

rapid stag
paper zealot
winter elk
#

decided that i hate winforms so much that i'm switching to godot lol, this is so much easier, also makes it much easier to add the custom abilities and stuff (ignore the empty atlas settings i havent implemented that yet)

paper zealot
rapid stag
paper zealot
#

Whoops, yes

#

And it was always so

rain slate
#

hmm how should I word everything in the shop being more expensive

rapid stag
harsh marten
#

how can I prevent a card from showing up in the shop?

scarlet spire
#

price reduction vouchers don't mention vouchers but still affect them, you'd probably be fine leaving that off

tall wharf
#

All items in the shop are price modifier

rapid stag
rain slate
#

I think I will do All prices in shop are doubled

scarlet spire
#

all prices in shop is a good way to put it

rain slate
#

actually doubled is probably too harsh

rapid stag
#

increased by [percentage]

scarlet spire
#

would anyone know how I can disable the shadow on the floating sprite? it kinda ruins the effect here

#

I've tried before but have never been able to get it working

rain slate
scarlet spire
#

if possible i'd also want it to move around a lot more like the hologram floating sprite

rain slate
#

wait blueprint is floating sprite?

#

I thought it was just one sprite

scarlet spire
#

oops

#

meant hologram

rain slate
#

at least in the joker atlas it definitely is

#

ah

scarlet spire
#

somehow I always mix them up in my head

harsh marten
#

is there a code editor/plugin for balatro mods

rain slate
#

I don't think so

harsh marten
#

because the documentation sucks

paper zealot
#

Reading the code explains the code

harsh marten
tall apex
#

kitty c:

harsh marten
#

how do i access the source code?

rain slate
primal shoal
#

unpack the exe file with 7zip

rain slate
scarlet spire
#

if you've already installed lovely, you can also go to go to the lovely dump folder which has all of the game code but with all patches applied as well, from any mods you have installed

#

much more useful to have around in that form

rain slate
#

wait I found clearance sale code

#
if center_table.name == 'Clearance Sale' or center_table.name == 'Liquidation' then
        G.E_MANAGER:add_event(Event({func = function()
            G.GAME.discount_percent = center_table.extra
            for k, v in pairs(G.I.CARD) do
                if v.set_cost then v:set_cost() end
            end
            return true end }))
    end
``` hmm
paper zealot
rain slate
#

what in the fuck is G.I.CARD

scarlet spire
#

v:set_cost is just updating the items themselves, the real thing is G.GAME.discount_percent, the value for center_table.extra here should be in game.lua

harsh marten
scarlet spire
#

yeah extra = 25 for clearance sale

rain slate
#

do I just do the same but

#

extra = -50

scarlet spire
#

ideally if you don't want to stomp the voucher behavior, you can do G.GAME.discount_percent = G.GAME.discount_percent * 2 to double prices

#

though, that's still difficult because collecting the voucher will reset it

rain slate
#

yeahhh

scarlet spire
#

i've been meaning to make a mod that makes all voucher behavior (where applicable) stackable instead of directly setting

#

for weird cases like this where it just resets the value to whatever is "expected" instead of actually changing the value in the way it says

rain slate
#

could I theoretically like make a new variable in G.GAME for base price percentage and then override Card:set_cost to use that instead

#

I think so but it might make some mods not work if they do a similar thing

dim fiber
#

Does anyone know if there's any sort of way to listen for the card add_to_deck function? I want to listen to it for any joker/planet/arcana card

scarlet spire
errant fulcrum
#

I keep getting an error code about indexing a nil value when I run this

#

I copied this from the blue seal code

scarlet spire
scarlet spire
errant fulcrum
#

It doesn't give me a line

scarlet spire
#

can you show the crash log

errant fulcrum
scarlet spire
#

okay what's on line 2295

errant fulcrum
#

I don't have that many lines

scarlet spire
#

ah wait that's crashing in common_events

errant fulcrum
scarlet spire
#

okay that's the create card function, not entirely sure why that's crashing here?

errant fulcrum
#

oh

rain slate
#

do you think I have to reset the variable every time a run is started or smtn?

#

like will it carry over if I don't do that

#

I think so

scarlet spire
#

G.GAME values are reset

#

the "or 1" is to ensure that if it's nil (i.e. you haven't set it yet) the multiplier will be 1

rain slate
#

ahaaa

#

I see

scarlet spire
#

storing values in G.GAME is extremely useful

errant fulcrum
rain slate
#

(7) Lua method 'calculate' at file 'main.lua:385' (from mod with id SaltPanasco)

#

@errant fulcrum check main.lua:385

errant fulcrum
#

Thats this: SMODS.add_card({set = 'Planet', key = '_planet', area = G.consumeables})

rain slate
#

what is _planet supposed to be ?

errant fulcrum
#

The hand that was just played

#

Or, the key for the planet card for that hand

rain slate
#

uhh so how would it know that that's what you're looking for ...?

rain slate
#

right now it's just trying to create a card whose key is literally _planet

#

omg

#

you have a variable called _planet

rain slate
#

that's not a variable right now, it's a string

errant fulcrum
#

oh my god

#

Why did I do that

rain slate
#

now I just need to figure out where voucher and booster pack prices are set

glad osprey
rain slate
#

nvm it doesn't

dreamy coral
#

i think i got how to detect when wheel is used but how do i change what the wheel will do?

rain slate
#

ok now it works ```toml

Base Price Percentage patch

[[patches]]
[patches.pattern]
target = "card.lua"
pattern = "self.cost = math.max(1, math.floor((self.base_cost + self.extra_cost + 0.5)*(100-G.GAME.discount_percent)/100))"
position = "after"
payload = '''self.cost = math.max(1, math.floor(self.cost * ((G.GAME.base_price_percentage or 100) / 100)))'''
match_indent = true
times = 1

errant fulcrum
#

So apparently my issue was using G.GAME.hands[context.scoring_name] where I should've used G.GAME.last_hand_played

mellow marsh
#

how would i go about adding an optional clause to a joker's description, similar to invisible joker / ankh's "remove negative from copy"? trying to decipher how vanilla balatro does it and i feel like there's surely a cleaner way to implement it

dim fiber
tall wharf
#

what is the SMODS preferred way to increase rank of a card

minor furnace
#

any time I've set a rank I copy/paste and modify the Strength code...

rapid stag
#

i'm trying to do '█' type characters in game for a future implementation of a custom joker i want to make, and i realised that just pasting the █ character into a string to go into a joker's description doesn't work as it doesn't take it, so i thought of trying to do a similar effect using {X:[colour}, but it doesn't seem to be working

what exactly am i doing wrong? cirLost

#

oh, i used the wrong character cirDerp

#

look closely at your )s and }s

slow crater
#

hi. does anyone know how to make my own joker with the ability like the joker mr. bones?

tall wharf
#

ok i think i figured it out

#

this might work or might not but idc

slow crater
#

I'll check, thanks

slow crater
rapid stag
# slow crater I'll check, thanks

i don't think that's for your problem, that was for the question they had about SMODS's preferred way of changing rank.

try working with context.game_over and use return { saved = true } as mentioned

rapid stag
tall wharf
slow crater
#

ok, I'll rewrite the code for now to start with

#

thanks dude

gentle rain
tall apex
#

good night modlatro nation

slow crater
tall wharf
#

i don't know what you are saying sorry

slow crater
#

Well, in Balatro there is a card, when you don't get points, you lose a life and you continue playing. I think it's called mr. bones. I asked if there is a code that implements this card, you sent a picture

tall wharf
#

fresh aikoyori jank hot off the press

slow crater
#

its mr. bones?

native zinc
#

issue is probably pool[i].sell_cost

dreamy coral
#

is it card:set_edition or card.set_edition ?

native zinc
#

card:set_edition

#

read lua docs

agile thistle
#

is this a valid way to organise or should i be murdered

native zinc
#

eh

#

organise when you can't find something anymore

tall wharf
#

you should be put on a stake jk do whatever you wanna

native zinc
#

that's my rule of thumb

tall wharf
#

my mod has a lot of files

agile thistle
#

i'm just doing this for ease of mind

#

where do the UI replacements go?

#

that's right!

#

the ui file!

tall wharf
#

i mean yea

agile thistle
#

also because

#

i'm used to the source layout still :p

native zinc
agile thistle
lyric mason
#

could anyone tell me what the difference between the 1x and 2x texture files are?

hardy viper
#

2x is twice as big as 1x

lyric mason
#

its literally just a larger version?

hardy viper
#

yeah

lyric mason
#

is there a reason the game wants a larger and smaller version?

#

is it just to make it easier to display the cards at different sizes using different sprites?

hardy viper
#

can't say for sure

lyric mason
#

alright. thanks for the clarifaction anyways

tall wharf
tacit sand
#

Hey! I'm trying to make a joker that makes Hearts = Spades & Clubs = Diamonds, while keeping it compatable with Smeared joker but I keep running into issues, does anyone have any idea why it's not working?

faint yacht
tacit sand
#

Oh shit for real?

faint yacht
#

Though, I had done just the Hearts and Spades...

agile thistle
#

i love having to break smods so i can properly get aces working as a friends of jimbo pack!

#

🥳

dreamy coral
#

mfw all that crashes was because e_manager wasn't capitalized

solar eagle
#

how does square joker render itself with a different size?

#

in smods would i change display_size?

#

ahhh no pixel_size

dreamy coral
#

i think it's the px and py

faint yacht
#

pixel_size = { w = ?, h = ? }

native zinc
tall wharf
#

I've figured that bosses with lasting effects should prove to be difficult for players

agile thistle
#

Fuck me I guess

tall wharf
agile thistle
#

I hate this accursed being

tacit sand
#

Okay somehow now every single card is debuffed during boss blinds & Smeared & Flower Transfer isn't working to score flushes... If anybody knows what is wrong I would really appricate the help <3

daring fern
#

Is there a way to redirect certain jokers to a different tab in the collection?

primal shoal
#

woo 15 in 2 days im getting faster at this

small moon
#

Is there any way to force retrigger an SMODS.Blind's (collection_)loc_vars?

noble schooner
small moon
#

Trying to have the description of the blind update to show the most played hand, but once the blind is set at the beginning of the ante the description doesn't change

turbid maple
#

why the hell are you making aces a suit you're going to jail for balatro crimes

primal shoal
#

have it trigger on context.end_of_round

small moon
#

How would you get context in SMODS.Blind? /gen
None of the functions give a context object

#

And also I still wouldn't rly know how to have the blind re-read from loc_vars as I don't see a function to do that on the wiki

agile thistle
edgy reef
#

mwahaha

runic pecan
#

Is there any recommendable free software for making Balatro-style background music? (Especially for booster pack bgm)

agile thistle
#

balatro's ost generally plays with advanced synths and eq stuff

#

for booster packs there's a lot of low-pass

#

a nice dose of reverb too

wintry arch
#

from what i understand there isn't any native support for cards that have multiple ranks. what are the obstacles in implementing that kind of behaviour exactly?

#

a somewhat hacky solution could be to make :get_id() return a metatable that has defined behavior for comparison

tall wharf
#

self.base.value

#

that's the rank

runic pecan
wintry arch
#

i'm talking about like. if i wanted to add an enhancement that makes a card count as also being 1 rank higher and 1 rank lower

#

that it'd be difficult to do that sort of thing

scarlet spire
wintry arch
#

the straight algorithm is also an issue, yes

#

we can extrapolate how it should work for arbitrary ranks though based on how aces work

#

3 2 A K Q not being a straight means it should look at values, not whether a chain of sequential cards can be made

glacial bloom
#

I keep getting this error

scarlet spire
dense adder
#

This is such a simple issue but for some reason i have Jack Card, the code below, and Ace Joker that do not trigger their effect.

    loc_vars = function(self, info_queue, card)
      return { vars = { card.ability.extra.chips, card.ability.extra.mult} }
    end,
    
    calculate = function (self, card, context)
        if context.cardarea == G.play and card.individual then
          if context.other_card:get_id() == 11 then
            return{
              chips = card.ability.extra.chips,
              mult = card.ability.extra.mult,
              card = context.other_card
            }
          end
        end
      --calc end
    end```
lethal ridge
#

Im kind of stupid what do i do?.
I make the asset directory correctly with 1x and 2x

plush cove
#

bros living in the future

dense adder
#

lmao

tall wharf
plush cove
#

I actually did not know that

tall wharf
#

yep

plush cove
#

I thought it was 2025 for everyone

tall wharf
#

we are 543 years into the future

plush cove
#

Did we win World War III?

tall wharf
#

yeah

plush cove
#

YESSSS

dense adder
#

many places go off of different calendars

rain slate
#

what is a balanced disadvantage for a deck with wild cards

tall wharf
rain slate
#

I feel like wild cards themselves might already be a good enough one because boss blind might disable a suit and then you just basically die but

plush cove
rain slate
plush cove
#

no other boss blinds can be summoned

plush cove
tall wharf
#

mean bosses?

#

now this looks like a job for me

rain slate
#

like it kinda forces you to get a shit ton of standard packs

#

otherwise you're dead on ante 1

tall wharf
#

i mean

rain slate
#

Are you sure you didn't mean context.individual

dense adder
#

thank you so much

#

im tired

#

i should take a break on the mod

#

yeah that fixed it

tall wharf
strong jacinth
tall wharf
#

in other words ใส่ prefix mod ด้วย

tall wharf
strong jacinth
tall wharf
#

wdym lol

strong jacinth
#

Like the opposite of deselect

tall wharf
#

if you are forced to select 5 cards

strong jacinth
#

The boss blind is never deselect cards, but what if you discard

tall wharf
#

you'll not be able to select more

tall wharf
#

discard isn't playing so

strong jacinth
#

The big red button

tall wharf
#

but discards aren't playing

#

so discards cards won't be affected

native zinc
#

uh oh. my joker crashes when i go to the collection on the main menu'

quasi comet
#

im trying to have a voucher adds a card at the start of shop; but fsr it adds two cards and theyre really cramped together?

#

oh it was just a double voucher situation nvm but they still kind of just

#

stick together?

lethal ridge
lethal ridge
native zinc
#

why did this suddenly stop working (??)

#

it crashes actually

#

huuu

storm root
#

(newbie here) how do i use this fucntion here in the consumables documentation?

native zinc
#

uhhh i guess i'll just

runic pecan
native zinc
#

make a var = G.jokers.cards or {}?

storm root
lethal ridge
#

Now

lethal ridge
daring fern
#

How could one increase the temperance and hermit cap?

marble flint
quasi comet
daring fern
marble flint
#

it also works with 100 instead of 1

#

and it works just as well with "c_hermit" instead of "c_temperance"

#

it's worth noting that this won't retroactively update any cards already in a save, only newly generated ones

native zinc
#

pain

#

in the collection there is no G.jokers.cards

#

so it just says No and crashes

#

i'm going to bandaid this with a nil check

#

i'm so nil check pilled (it works

#

ooops safe isn't defined

runic pecan
#

wtf is that quad ends

native zinc
#

the best coding ever

#

aka "i'm too lazy to properly indent "

daring fern
#

How could one make a new entry on the collection that is not in the "other" tab?

#

Also how does one change the set of a joker but still keeping it a joker?

manic rune
#

end again again again

next timber
#

man trying to patch it so that x0 mult works only in specific circumstances sure is fun

lethal ridge
#

Im going insane

primal shoal
#

do you have a x2 asset

lethal ridge
primal shoal
lethal ridge
#

Still doesn't work

#

Same errors in the crash report

next timber
#

ayy ive patched in negative mult mechanically, now i just need it to show up visually

primal shoal
lethal ridge
#

Okay

lethal ridge
#

This error is actually gonna kill me

#

I even looked at other ppls repositories and I did the same thing as it doesn't work 🪦

primal shoal
#

dm the mod file and I'll debug if you want

lethal ridge
#

Okay

primal shoal
#

-# another problem solved

lethal ridge
#

Thanks again

next timber
#

i may be stupid but i cant figure out which code makes the little "+mult" popups appear above cards

#

and chips and xmult and such

red flower
#

card_eval_status_text?

next timber
#

that sounds like it would be it

lethal ridge
#

Btw what are some good softwares to make pixel art in?

next timber
#

i use libresprite

lethal ridge
#

Ill check it out

next timber
#

its aesprite but free and a little worse

#

lol

lethal ridge
#

I use photoshop right now

lethal ridge
#

It has a sale or something

next timber
#

oh damn

lethal ridge
#

Im gonna be coding all day

#

Time to make the most unbalanced mod ever

wintry solar
next timber
#

hm? im trying to patch it, at the moment it doesn't show anything when a card gives negative mult

wintry solar
#

like where is the effect coming from?

next timber
#

when a card is scored

#

and it shows the +whatever

wintry solar
#

you just return mult = X

next timber
#

im trying to make it also show -whatever

#

no

wintry solar
#

yes

next timber
#

you dont understnad im trying to patch the function

wintry solar
#

why

next timber
wintry solar
#

it already does that

next timber
#

for xmult

wintry solar
#

yes

next timber
#

no it doesnt i tried that

wintry solar
#

I'm pretty sure the only messages it won't show are 0 mult/chips or 1 xmult/xchips

next timber
#

well i mean i had to patch the functionality for negative xmult in myself so it makes sense id have to patch the message in too, and lo and behold when a card with negative xmult scores no message is shown

wintry solar
#

you definitely don't need to patch in that functionality

#

it's just supported by default

next timber
#

well i have the game open right now and no -xmult message is shown

#

should probably clarify im doing hand xmult specifically

#

h_x_mult

wintry solar
#

show your code pls

next timber
#

ok gimme a min

#

idk what code you want but this seems the most relevant

#

thast he same image twice

#

hang on

wintry solar
#

you should just use a calculate function instead of patching in a load of stuff

#

using values like that in config isn't recommended

next timber
#

so, return {x_mult = -5} in a calculate instead of config = { h_x_mult = -5}?

wintry solar
#

yeah that should just work

#

though -5 xmult is cursed and an absolutely awful effect

next timber
#

thats only for testing

#

it only gets that bad if you let it get that bad

#

it starts at positive x5

#

and gets worse the more you use it

wintry solar
#

I see

next timber
#

thanks

#

lol

#

ok so like. this doesnt work

#

is there any way of making a discarded card go back to the hand without just kiling it and making a new one

#

because killing it can trigger effects i dont want to trigger

zinc forum
#

I've did something similar recently

#

A card that goes back into your hand after you play it

#

Give me 5s, but it's going to require patching the game

zealous glen
#

Also drawing cards the wrong way

#

So use Events and use the correct draw function

next timber
#

what's the correct function?

zealous glen
#

Either draw_card or CardArea:draw_card_?

#

I never remember if it’s from or to

#

But also Event timing

zealous glen
lethal ridge
#

How do i make layered jokers?

zealous glen
#

how many layers

lethal ridge
#

like the legendary jokers

lethal ridge
#

2 or 3

#

and how do i apply shaders onto the layers too?

zealous glen
#

And you can define a custom shading step for the soul there

zinc forum
# next timber is there any way of making a discarded card go back to the hand without just kil...

I don't have the dump on me so I can't exactly remember where it's going, but here's what I did:

# You - Disables card from being discarded by player
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = '''
    stop_use()
    G.CONTROLLER.interrupt.focus = true
    G.CONTROLLER:save_cardarea_focus('hand')
'''
position = "after"
payload = '''
for k, v in ipairs(G.hand.highlighted) do
    if v.you then
        G.hand:remove_from_highlighted(v, true)
    end
end
'''
match_indent = true```
Basically if the card has a special attribute (`you` in my case) then it just removes from highlighted instead of discarding
lethal ridge
#

position like in the atlas right?

zealous glen
lethal ridge
#

okay thanks

next timber
next timber
zinc forum
zealous glen
lethal ridge
#

okay

zealous glen
#

Cryptid does it too but it had an outdated approach when I checked

native zinc
lethal ridge
#

i was about to open cryptids code to see how they did it

#

then i shouldent check it then

zealous glen
zealous glen
daring fern
lethal ridge
zealous glen
#

could help you

zealous glen
#

I also had to do something to hide an extra sprite clone

#

But

#

If you want lots of these

#

The approach Cryptid takes to Exotics might help more

#

For now I just wanted one or two so I didn’t take a scalable approach

#

Cryptid does for some Jokers

#

(using SMODS.DrawStep)

lethal ridge
#

okay thanks so much

tall wharf
#

i rebalanced the letter deck

next timber
next timber
#

i put that event in the discard event, and now the enhancement isn't in hte game anymore

zealous glen
#

Ah you probably made a syntax error

next timber
#

checked the logs, says a ) was expected near = on the draw_card line

#

should i just do nil,nil,nil,card or whatever instead of card=card

zealous glen
#

Yes

next timber
#

ayy it works

lethal ridge
#

im done with this sprite !!!

#

time to implement the double layeer

primal shoal
#

soul_pos

next timber
#

oh shit someone else thought of imaginary numbers also

lethal ridge
next timber
#

im curious what an i joker would do

#

what does this joker do

lethal ridge
#

maybe it just multiplies your mult and chips with i

iron iron
#

gives +i mult

next timber
#

that sounds practically useless

lethal ridge
#

but if you use it another time

#

it will become negative

#

then 2 more times will bring it back to positive

next timber
#

which is worse than useless

#

lol

lethal ridge
#

wait hold on

next timber
#

i do plan on making a mod that fully adds imaginary numbers at some point

lethal ridge
#

i know what to do know

#

it will mult chips and mult by 10i

#

so if u retrigger joker 4 times

next timber
#

how are you going to get the legendary to trigger 4 times

lethal ridge
#

it will give u 10^4 mult

lethal ridge
next timber
#

thats a lot of blueprint

lethal ridge
#

basically useless joker unless you can retrigger 3 more times

next timber
#

useless legendary

#

you love to see it

lethal ridge
#

chicot moment

gentle rain
next timber
#

lol

gentle rain
#

so scary,,,,

lethal ridge
#

?!

#

wow i got the soul pos working

#

its so cool

next timber
#

now have fun implementing imaginary numbers

#

lol

lethal ridge
#

implement?

next timber
#

adding them

lethal ridge
#

isnt it already in math

#

or the balatro calculation stuff doesnt support it?

gentle rain
# lethal ridge

mmm yummy gradients,,,,, it almost looks like the background has the voucher shader ehehe

lethal ridge
#

idk

lethal ridge
#

i need to add that onto the background

#

to make it even more rainbow

gentle rain
lethal ridge
#

ohh

#

well

#

i might make more jokers based on negatives

next timber
#

also id be surprised if it did support it

lethal ridge
#

so u can flip the mult around

lethal ridge
daring fern
lethal ridge
#

idk

next timber
#

how do i get the current values for what the hand has scored so far? id like to check if the mult is currently positive or negative

lethal ridge
#

does anyone know what this does?

manic rune
#

it displays a tooltip when hovered

next timber
#

for telescope

manic rune
#

yes

#

-# is that not clear enough 💔

lethal ridge
#

what hovered tho

#

am i missing something

#

when i put my mouse on it its the same

next timber
#

when you hover on the text saying "this will display a tooltip when hovered"

lethal ridge
#

as the other texts

next timber
#

strange

lethal ridge
next timber
#

best joker description ever

manic rune
#

...actually

#

how do you even hover your mouse on that line

lethal ridge
#

yea

#

hmm what does loc_vars do? is it just like loc_txt

#

oh yea its just that

next timber
#

loc vars allows you to feed variables into loc_txt

lethal ridge
#

ohh

#

just like the name

#

thanks very much

next timber
#

if you put "#1#" in loc_txt, then you can make loc_vars return { vars = {"text"} } and it'll put "text" instead of #1#

#

loc_vars should be a function that returns the table

#

heres my loc_text and loc_vars

manic rune
#

so that people can translate your mod to other languages easier

lethal ridge
next timber
#

id be surprised if anyone wanted to translate this mod, but ill keep that in mind

manic rune
#

...also, why do you have both E:1 and E:2?

next timber
#

for float and spaced out obv

next timber
#

im guessing they cancel out though then, if you're asking that

lethal ridge
#

make a seperate lua file?

manic rune
#

theres a localization section in smods

#

i suggest reading that :3

next timber
#

do E:1 and E:2 cancel out or were you just asking why im being extra lol

manic rune
#

they do cancel out each other, yeah

next timber
#

i could have sworn mr bones does both

lethal ridge
#

ill probably just do it later

manic rune
#

...weird

#

probably works then

lethal ridge
#

the localization things

next timber
#

no mr bones doesn't do both nvm

lethal ridge
#

context.joker_main is when the joker gets activated?

manic rune
#

mhm

lethal ridge
#

alr thx

#

now i need to make a seperate calculation thing for this

next timber
#

i wish you luck with the immense amount of patching you may be about to do

lethal ridge
#

its over for me

modern kindle
#

If number imaginary then work end

#

There you go

lethal ridge
#

?

manic rune
#

if number imaginary then work end

#

its that shrimple

lethal ridge
#

what number

modern kindle
#

That's what I'm sayin

#

You get me bepis

lethal ridge
#

the mult? in the score?

modern kindle
#

Brother it is a joke

#

You posted a picture about how math square root handles real number, opposite of real is fake, which is imaginary

modern kindle
lethal ridge
#

im stupid

manic rune
#

to be or not to be, that is the question

modern kindle
#

To be or be to with an answer of the question

modern kindle
#

My artists have finally been coming through and it's been delightful

modern kindle
manic rune
#

lets all have a couch

next timber
#

where do you guys get art for your mods anyways

#

bepis i know you just rip assests fron hsr probly

manic rune
#

i beg my friend to draw for me :3

modern kindle
#

Bepis, have a bowl

hard flume
next timber
#

fair

hard flume
#

Except for the Estrogen card. That was made by a friend

modern kindle
next timber
#

lol

zealous glen
#

I draw it myself or I request to use someone else’s art or I get given art

manic rune
#

hes singlehandedly carrying my mod's art rn

#

❤️

zealous glen
#

Is this what the children call rice

#

Rizz*

modern kindle
#

I preferred ricw

#

Rice

manic rune
#

🍚

next timber
#

mm rice

dire palm
#

So, I'm trying to make a boss blind that self-destructs automatically when you play a hand, winning the blind in the process. Here's the code I have currently. The destruction of cards is not a problem but I can't get the winning blind part to work: it seems like the G.STATE never gets updated. I also tried with the calculate function in context.before instead of using press_play but it doesn't work either. Anyone got any idea on how I could get it to work?

modern kindle
#

What rice u guys like most

next timber
#

sticky rice

#

mm

manic rune
#

fried rice

next timber
#

you're telling me a fried this rice

manic rune
#

the best thing to ever happen in this world is a bowl of perfect fried rice with some soy sauce

next timber
#

youre telling me a perfect fried this rice

zealous glen
#

Brazilian white rice though Basmati is similar; might be the same

#

Well,

manic rune
zealous glen
#

I think it might be closer to sticky rice

next timber
#

you're telling me a

#

STICKY RICE SWEEP

zealous glen
#

Than Basmati

manic rune
#

ive never tried that before

zealous glen
#

It’s interesting because Brazilians don’t like sticky rice

#

I mean

manic rune
#

but i believe all types of rice are good, unless you fuck up the cooking itself

zealous glen
#

They don’t like the stickiness

#

They prefer it fluffy

modern kindle
#

I just kinda be eating it don't think i have a massive preference
Call me the muncher

manic rune
#

i like sticky rice too

#

with some sauce :3

brazen notch
#

you telling me a rice stickied this

zealous glen
#

The only rice I’ve had I didn’t enjoy much was Brazilian yellow rice

#

I mean I had it often

#

But I preferred white

next timber
#

ok back onto the actual real topic of this channel how do i get the current mult? i need to make sure that if the current mult is negative then an asbestos won't make it positive again

zealous glen
#

have you tried soaking it in rice overnight

modern kindle
#

Lmfao

manic rune
#

hand_mult, probably?

#

since hand_chips returns chips from played hand

modern kindle
#

We should also prob help out klg up there

next timber
brazen notch
faint yacht
#

hand_chips and mult are globals.

zealous glen
manic rune
#

:3 damn

#

why is it mult and NOT hand_mult????

gentle rain
manic rune
dire palm
zealous glen
#

No

gentle rain
next timber
zealous glen
#

It’s a helicopter

#

But it’s far away so it looks like a dot

next timber
#

i see, continue

modern kindle
#

with blind calc now can you just throw the event in there minus the event

manic rune
#

is this a snail?

gentle rain
#

thats a cloud ☁️

zealous glen
#

Is that Homestuck

next timber
#

i fucking KNEW it was a homestuck referecne

modern kindle
#

just in your calc do the

G.GAME.chips = G.GAME.blind.chips
G.STATE = G.STATES.HAND_PLAYED
G.STATE_COMPLETE = true
end_round()
gentle rain
#

thats a home 🏠 stuck 🔒

manic rune
#

thats a snail.

next timber
#

would you call me crazy if i said the cloud gave it away

#

thats a homestuck cloud

gentle rain
#

yeah absolutely

#

homestuck clouds r so identifiable

dire palm
next timber
#

hussie is a damn good cloud drawer

manic rune
#

they are a very good snail drawer

modern kindle
#

would you mind tossing over the blind code for me so i can just paste it in rq and test it out @dire palm

manic rune
modern kindle
gentle rain
#

see thats the fun thing ablut cloouds

#

you see things in them

#

BF i hate to alarm you but you may be a prospit dreamer

dire palm
# modern kindle would you mind tossing over the blind code for me so i can just paste it in rq a...
    key = 'nuke',
    loc_txt = {
        name = 'The Nuke',
        text = { 'This boss self-destructs','when a hand is played' }
    },
    boss = {min = 6}, 
    atlas = "bosses",
    pos = { x = 0, y = 6},
    boss_colour= HEX("0ebb00"),
    dollars = 5,
    mult = 2,
    config = {},
    unlocked = true,
    discovered = true,
    
    press_play = function (self)
            for k, v in pairs(G.hand.cards) do
                if v.ability.name == 'Glass Card' then 
                    v:shatter()
                else
                    v:start_dissolve()
                end
            end
            for k, v in pairs(G.consumeables.cards) do
                if v.ability.name == 'Glass Card' then 
                    v:shatter()
                else
                    v:start_dissolve()
                end
            end
            for k, v in pairs(G.jokers.cards) do
                if not v.ability.eternal then
                    if v.ability.name == 'Glass Card' then 
                        v:shatter()
                    else
                        v:start_dissolve()
                    end
                end
            end

            G.E_MANAGER:add_event(Event({
                func = function()
                    G.GAME.chips = G.GAME.blind.chips
                    G.STATE = G.STATES.HAND_PLAYED
                    G.STATE_COMPLETE = true
                    end_round()
                    return true
                end
            })) 
    end,
}```
modern kindle
#

awesome, thanks

dire palm
#

Found the code from DebugPlus.

        if G.STATE ~= G.STATES.SELECTING_HAND then
            return
        end
        G.GAME.chips = G.GAME.blind.chips
        G.STATE = G.STATES.HAND_PLAYED
        G.STATE_COMPLETE = true
        end_round()
    end```
next timber
#

ayy ok ive got it so that asbestos cards will not reverse a negative mult

#

the one issue with asbestos cards is you can just. play them to get rid of them

#

ill figure that out later

runic pecan
#

How do I "upgrade" wild enhancement effect?

#

("That's the neat part, you don't!" is an acceptable but last answer on the table for now.)

next timber
#

make it count for rank??

#

it can only be done once but better than nothing

runic pecan
next timber
#

fair

#

hmm

#

idk

daring fern
strong jacinth
#

Bump

dire palm
#

Anyway, I'm taking a break.

hushed field
#

trying to go through the code, because i know there was an easy check but I can't remember what it was. Does anyone remember the way to check if a card is being displayed in your collection tab vs in game?

next timber
#

hang on i did this

#

lemme remember where

#

lol

#

ok this only works for editions but it should help: card.ability.set == "Edition" seemed to work for me

hushed field
#

I remember doing it before, but apparently I haven't. I'll look around some more, because I know it exists, haha

modern kindle
#

hello ice

next timber
hushed field
#

There's no need for the spawn quests for the legendary jokers to show up in the gameplay after all

#

yo yo dilly

frosty dock
hushed field
#

yesss, that was it

next timber
#

ah thats handy

hushed field
#

collection shows up in the movie metadata a lot so the search function got kinda cluttered 😛

strong jacinth
#

Whats the nbame of the like mod that makes blueprint look like the joker its copying?

#

name*

hardy viper
#

blueprint+ i think

daring fern
#

How could one check if a value of a joker is displayed on the joker?

next timber
#

i thiiiiiinkkkkk asbestos is fully implemented?? it can degrade if you try to destroy or discard it, it gives you the x5 mult that decreases each hand, the negative stuff works properly as far as i can tell
it took 9 discards to remove 5 asbestos cards from my hand

hardy viper
strong jacinth
#

Anyone here masterd shaders?

#

Or good at shaders

next timber
#

no such person exists

lethal ridge
hushed field
#

not passing the value properly through loc_vars

lethal ridge
#

ohh right

#

i need to stop being dumb

#

i need to actualy lock in and code this properly

runic pecan
#

Is there any SMODS method to make soul sprite jiggle like Soul gem?

lethal ridge
#

idk

#

ability then references to config?

opal holly
#

so a bit of trouble
I want the effects to do the following

  • Gain 0.2X Mult per scored face card
  • Give that resulting X Mult in the scored hand
  • Destroy the scored face card

Right now it's upgrading but not giving the Xmult_mod for the played hand and destroying the last scored face card

zealous glen
daring fern
hardy viper
#

lovely variable names you got there

runic pecan
warped marsh
#
                local this_card = context.scoring_hand[i]
                if this_card.config.center_key ~= 'm_stone' then
                    if not SMODS.has_enhancement(this_card, 'm_steel') then
                        SMODS.add_enhancement(this_card, 'm_steel')
                    end
                end
            end```
hardy viper
#

you probably only want to be looking at ability.extra

warped marsh
#

how can i convert to steel here? is it this function or?

zealous glen
#

Make it count for suits that don’t exist balatrojoker

lethal ridge
#

does card.ability reference the config table?

runic pecan
red flower
strong jacinth
#

Any mods that use shaders, that are simple.

lavish lake
warped marsh
lethal ridge
daring fern
warped marsh
#

also no more Pokemon B&W pfp :0

red flower
#

i love namie's art but i wanted a change

frosty dock
zealous glen
strong jacinth
#

And that means?

warped marsh
red flower
# strong jacinth And that means?

A dictionary is a listing of lexemes from the lexicon of one or more specific languages, often arranged alphabetically (or by consonantal root for Semitic languages or radical and stroke for logographic languages), which may include information on definitions, usage, etymologies, pronunciations, translation, etc. It is a lexicographical referenc...

zealous glen
hardy viper
quartz ravine
#

hi guys!

When you make a custom hand, how do you inject that into the info queue?

I tried this PokerHandDummies technique and this looks like not the way

      loc_vars = function(self, info_queue, card)
            
                -- if nil ~= FoxMod.PokerHandDummies then
            info_queue[#info_queue + 1] = FoxMod.PokerHandDummies["phd_fox_cosmocanyon"]
                -- end
            return { vars = { card.ability.extra } }
        end,
red flower
quartz ravine
red flower
#

you need to make the dummy object yourself

quartz ravine
#

BTW, my kids loved the Eldlich synergy from your dev release. Looks awesome!

zealous glen
quartz ravine
#

Clowns all the way down lol

quartz ravine
hardy viper
# daring fern How?
local old = center.loc_vars
function center.loc_vars(...)
 local ret = old(...)
 for ind, val in pairs(ret.extra) do
  ret.extra[ind] = val * card.ability.extra.multiply
 end
 return ret
end

this won't affect the actual mult that gets applied, just what shows on the card

red flower
quartz ravine
#

It's very cool! Ok well in that case I will remove what I was trying to do, I thought it was SMODs related

lethal ridge
#

are there any repositories that i should read and learn from?

quartz ravine
#

Anyone have luck syncing a sound being played when a joker fires off? When I try, all of the sounds play at once overlapped

quartz ravine
lethal ridge
#

okay thanks

lethal ridge
#

thank you

hushed field
#

almost working! My hands ache to make the entire look of that info box a bit more custom, but that's more work than I should spend on it, haha

lethal ridge
#

wow

#

that looks so cool

hushed field
#

wait, does the localize feature not automatically fix up the colours?

#

that's a shame

red flower
#

no, you need to parse them first if they're not in a regular description table

hushed field
#

Oh, that's... annoying

#

I thought it returned with colours and such applied and would just work in any node I'd shove it into

red flower
#

there's loc_parse_string

hushed field
#

guess I'm looking into that. So glad someone actually knows their way around UI enough to help haha

zealous glen
#

I just manually color them

thin anchor
#

morning

hushed field
zealous glen
opal holly
#

ok i managed to fix the scoring problem but it still only destroys the last scored face card instead of all scored face cards

hushed field
red flower
hushed field
#

it's easier to mark the card you wanna destroy with a quality, rather than store it on the joker!

red flower
#

you can just check if it's a face card in destroy_card

opal holly
#

if context.other_card:is_face() then
return {remove = true}
end

should work?

hushed field
#

ya

red flower
opal holly
#

would it also have helped if i removed context.individual

hushed field
#

I thought I'd be clever and pass them from the variable set, but that doesn't return tables 😬

hushed field
hushed field
dire palm
#

Back from my break. @modern kindle Did you find anything on how to make my blind work?

hushed field
#

I'm thinking of making a 'Card Set' feature for Kino, so that even if I add too many jokers, there's still ways to play with reasonable pools of jokers. That way I could create some 'play sets' for jokers and consumables, but I'd probably set it up so that users could create them themselves easily as well.
I'm suspecting a feature like that might actually be a neat add-on for other mods that add a lot of content as well. If I make that a stand-alone mod, would people be interested in setting up compatibility with it?

next timber
#

that would be fun yeah

red flower
#

i was planning to do something similar so yeah i would use it

next timber
#

why isn't this tooltip displaying?

hushed field
#

That's good to hear, that way I can more easily encourage you to do ui for it, 'N 😛

red flower
#

🙂

thin anchor
#

would this be how you implement a sound?

runic pecan
hushed field
#

It's working, and even spawning correctly! Only thing that doesn't work is the decade check, but that'll be an indexing error somewhere, I reckon

red flower
next timber
#

in a deck description

long urchin
#

how would i use code to store the keys of other jokers in a table?

hushed field
opal holly
#

[SMODS Zui_Trial_Jokers "jokers/card.lua"]:286: attempt to index field 'other_card' (a nil value)

next timber
#

perkeo mentioned

#

i love perkeo

opal holly
#

hmm so context.other_card:is_face() is a problem

red flower
long urchin
#

Does anyone know how i could reuse this code to pull the keys from all of the jokers in the game when the run starts rather than pull the ranks from the playing cards each round?

function SMODS.current_mod.reset_game_globals(run_start)
    -- The suit changes every round, so we use reset_game_globals to choose a suit.
    G.GAME.current_round.tester_card = { jselect = "j_joker" }
    local table = {}
    for _, v in ipairs(G.playing_cards) do
        if v.ability.effect ~= 'Stone Card' then
        table[#table + 1] = v
    end
    if table[1] then
        local funny_card = pseudorandom_element(table, pseudoseed('ijiraq'))
        G.GAME.current_round.tester_card.jselect = funny_card.base.key
    end
end```
next timber
long urchin
hushed field
runic pecan
long urchin
#

ahh ok

warped marsh
#
        if context.cardarea == G.jokers and context.joker_main then
            return{
                message = localize{type = 'variable',key = 'Xmult',vars={(G.jokers and G.jokers.cards and #G.jokers.cards or 0)* card.ability.extra.Xmult}},
                Xmult_mod = (G.jokers and G.jokers.cards and #G.jokers.cards or 0)*card.ability.extra.Xmult
            }
        end
    end ```
#

im getting a message error here

#

and i cant see why

#

(im horribly blind)

opal holly
#

yeah its this part

long urchin
long urchin
opal holly
#

ohmygod

long urchin
#

ya missed one

runic pecan
long urchin
#

im using code that resets it every round as a base, this

function SMODS.current_mod.reset_game_globals(run_start)
    -- The suit changes every round, so we use reset_game_globals to choose a suit.
    G.GAME.current_round.welder_card = { value = '5', id = 5 }
    local valid_welder_cards = {}
    for _, v in ipairs(G.playing_cards) do
        if v.ability.effect ~= 'Stone Card' then
            valid_welder_cards[#valid_welder_cards + 1] = v
        end
    end
    if valid_welder_cards[1] then
        local funny_card = pseudorandom_element(valid_welder_cards, pseudoseed('weld' .. G.GAME.round_resets.ante))
        G.GAME.current_round.welder_card.value = funny_card.base.value
        G.GAME.current_round.welder_card.id = funny_card.base.id
    end
end```
thin anchor
#

err... what do i do?

long urchin
#

i removed the .. G.GAME.round_resets.ante text from the pseudoseed in hopes it wont reset each round

#

this should reset only once when the run starts, correct?

long urchin
thin anchor
#

oh my god im stupid

warped marsh
long urchin
#

ur fine, theres a reason this chat exists

#

its 80% rubber ducking

thin anchor
#

yeah i see the crash screen at least 75% of the time

long urchin
opal holly
#

it's still the same problem lol

long urchin
#

whats the error code?

wintry solar
opal holly
#

[SMODS Zui_Trial_Jokers "jokers/card.lua"]:286: attempt to index field 'other_card' (a nil value)

warped marsh
long urchin
#

can you paste the card.lua file here to see?

opal holly
red flower
gentle rain
red flower
#

yeah you need to be in the selecting hand state

long urchin
# opal holly

im looking at the smods wiki and i dont see other_card as a listed context

#

do you know for certain it exists and im the stupid one or

gentle rain
red flower
long urchin
#

yurp

#

so @opal holly, what are you trying to do when you check context.other_card:is_face()?

thin anchor
#

oh well

wintry solar
warped marsh
opal holly
#

so there are 2 things i want to do if the check is positive

  • joker gains 0.2x mult per scored face card (settled)
  • destroy scored face cards
long urchin
long urchin
#

if the folder doesnt already exist, make it

thin anchor
#

so thats why i cant find it

#

it doesnt exist!

#

made it sound like it did

wintry solar
#

changing it to xmult will 100% work

red flower
long urchin
red flower
#

they can just do context.destroying_card:is_face() !!

long urchin
#

no but thats just for the destroyed cards

#

they said they need to scale the card by X0.2 mult first

red flower
#

they already did the other part

long urchin
#

is that not what this is asking about???

#

thats what line 286 is

#

@opal holly do you need help formatting the destruction or the scaling

opal holly
#

yeah i want to do upgrade -> destroy, I've done the upgrade, but the destruction part is where I'm facing problems

long urchin
#

ahhhh

#

yeah then listen to n' i dont know about card destruction yet :B

#

just barely started ts

#

Wait

warped marsh
long urchin
red flower
warped marsh
opal holly
#

ok tried, N's fix and it worked

#

thank you ppl

long urchin
#

Yeah, n' is just smarter than me at this lol

long urchin
#

I started coding jokers like maybe 3 weeks ago on and off lmao

wintry solar
#

where X is your number ofc

long urchin
#

Now off to do my OWN debugging, God help me.

warped marsh
red flower
long urchin
#

Did you have any lua experience beforehand?

red flower
#

i coded jokerdisplay last year yeah but also i program professionally

long urchin
#

Yeahh I'm just a senior in HS with minor experience in Java & HTML/JS/CSS

#

So in basically learning lua from the ground up through trial and error from this lol

dull totem
long urchin
dull totem
#

turns out it is not as easy as it looks

long urchin
#

not even close

#

BUT its actually way easier than other jokers

dull totem
#

i went into this 2 hours ago with the steamodded wiki and a dream

warped marsh
#

i like when the game crashes from the start since you know you messed up somewhere BADLY, meanwhile if its like cards not working as intended then its trail and error

dull totem
#

now i only have the steamodded wiki

long urchin
#

ok SO

hushed field
#

Imagine how good this'll look once I've drained all UI knowledge out of N and become the expert

long urchin
#

how do i like change the image of a joker using the joker key?

#

like im making a joker that mimics other jokers, so by pulling keys, how can i change the joker's sprite to look like the joker's key i pulled?

hushed field
#

Reckon It might look better if I wrap each condition in it's own little box, and maybe I should add the current rarity badge in there. And a separation line's probably good, haha

primal robin
long urchin
#

pause

red flower
#

m

primal robin
#

m

long urchin
hushed field
manic rune