#💻・modding-dev

1 messages · Page 115 of 1

hollow mortar
#

I think it's gonna need a whole rewrite...

tepid crow
#

I think so too since I believe that's a 0.9.8 only thing

hollow mortar
#

For context, I was hoping to just fix the one "file not found" error on this mod that Myst made ages ago, but it's clearly escalated past this

#

:(

tepid crow
#

ah

hollow mortar
#

I just want my little guy.

violet void
#

does anyone know why delay only delays the card_eval and not the loop? it keeps removing the debuffs instantly

hollow mortar
#

delay is just telling the code to breathe for that many seconds, right?

#

the delay is outside the loop, as well

violet void
#

its before the loop

hollow mortar
#

Oh I see what you mean

#

the loop isn't being delayed before first running.

orchid thunder
#

bump

violet void
#

yes, there is c.debuff = false which should remove the debuffs from the cards

and I want that to be timed correctly instead it happens instantly after playing the hand

#

(im in context.before)

hollow mortar
#

hmm

frosty dock
violet void
frosty dock
#

so you'd want to put the card_eval_status_text into an event

violet void
#

but the card_eval is already being delayed

#

you meant to say I should put the for in an event?

frosty dock
#

i misread

#

everything but the card_eval_status_text

#

so yeah, the for loop

livid tapir
violet void
livid tapir
#

lollol

violet void
wintry solar
#

well now it's in an event it happens after the score calc

violet void
#

even tho im in context.before?

wintry solar
#

yes

violet void
#

how would I fix that

wintry solar
#

do it not in an event

violet void
wintry solar
#

you might need to do some patch magic to keep the visual effects

violet void
zealous glen
#

I saw a jester character on Twitter so I drew fanart and modded the character into the game

teal estuary
#

what context would i need if i wanted to make a joker do something, when a card is destroyed? is it context.remove_playing_cards or something?

normal crest
#

that's correct, and the cards removed are in context.removed

teal estuary
#

i was looking at it, i just wasnt sure 😭

#

ty though

normal crest
#

oh

#

:p

violet void
#

theres also context.cards_destroyed if you count glass shattering

zealous glen
#

it's also context.remove_playing_cards

#

context.cards_destroyed register information about the destroyed cards

weak depot
#

proud of this joker i made, thoughts? counterpart to Oops, all 8s

frosty dock
#

Woo all ones ahh joker

#

-# ortalab has that but without the mult

violet void
#

1/8 for wheel of fortune lol

zealous glen
#

all 8s

weak depot
#

yet another thing i accidentally made a counterpart for from ortalab

violet void
#

helpful for banana and glass card ig
-# and the mult

wintry solar
#

I think we're removing it from ortalab

#

it's awful

weak depot
#

hope my accidental iteration seems okay 😅

carmine burrow
weak depot
#

i feel like x2.5, maybe? it is a rare after all

zealous glen
wintry solar
#

I just don't think it's a very interesting design space - it leads to descriptions being unnecessarily convoluted and also it scales much quicker than oa6s

zealous glen
#

novel idea for probability affecting joker: 1 in 4 becomes 3 in 4

wintry solar
#

say you want an effect to happen 1 in 10, to encourage usage of oops all 1s you set it as 9 in 10 to not happen.
With oa6s, 1 in 10 becomes 2 in 10
With wa1s, 9 in 10 becomes 9 in 20

violet void
#

definitely convulted

granite plover
#

How do I make a joker do this effect? (You get 2 Mult for every face card played, you lose 2 random cards from your hand after a hand is played)

carmine burrow
#

like cavendish would be 1001 in 2000 to get destroyed?

wintry solar
#

if cavendish was 1999/2000 to not destroy yeah

carmine burrow
#

while it'd be really hard to program i think a more interesting probability-affecting joker would be to make listed-probability events occur at predictable intervals
i.e. wheel of fortune triggers on the 4th, 8th, etc. uses, gros michel is destroyed after exactly 6 rounds, etc etc

wintry solar
#

absolute pain in the arse to program and has zero compatability with modded items

carmine burrow
#

yeah that is the problem

violet void
#

wouldnt you need to add a counter in pseudorandom

#

which every mod calls
-# maybe

carmine burrow
#

you wouldn't be able to make it compatible w/ other mods at all most likely

#

for a counter to work, pseudorandom would need to know exactly what the probability was beforehand

#

rather than just generate a random number between 0 and 1

violet void
#

could make it always return 1 every x times

carmine burrow
#

but that would literally never work

violet void
#

altho pseudorandom is used in a lot of places like deciding the joker rarity in the shop

carmine burrow
#

yeah

violet void
#

so it would guarantee a rare in that case

wintry solar
#

pseudorandom isn't used for just joker effects though

#

it's used everywhere

violet void
#

also it only takes 1 mod to use <0.25 as success for the joker to fail

#

yeah too complicated

carmine burrow
# carmine burrow ...well maybe you could assume that the random seeds always use the same key as ...

i.e. when pseudorandom gets the seed wheel_of_fortune, it

  1. looks for centers w/ keys containing the text wheel_of_fortune, see that Wheel of Fortune's extra is set to 4
  2. it stores the seed wheel_of_fortune in some table and sets a counter associated w/ the seed to 0
  3. each subsequent time the wheel_of_fortune seed is used, the counter is increased by 1 and pseudorandom returns the counter divided by the odds
#

and it would do Not This when the seed doesn't match any centers

#

but yeah, this wouldn't work

#

for many reasons

carmine burrow
frosty dock
#

the seed gets put through pseudoseed, so you'd need some way to reverse that to get the wheel_of_fortune seed at all

carmine burrow
#

oh right!!

#

i mean there is an easy workaround which is just to make pseudoseed return two values and make pseudorandom take another argument

frosty dock
#

wait nvm the pseudorandom call doesn't get pseudoseeded there even though it can

#

i was looking at it selecting the card

#

however these are the same seed

carmine burrow
#

i guess if it uses the same seed for selecting the card then the idea's doomed from the start lmao

livid tapir
#

next imma make a joker that creates a secondary copy of the joker to the left of it (basically way better blueprint despite the fact that blueprint is already op)

#

💀

violet void
#

in which context

livid tapir
#

ok

#

itd prob be blind selected, joker_main could be a bit op

#

what do you think

carmine burrow
#

i think it'd be a bit op no matter what the context was ...

violet void
#

certainly strong, could permanently -1 Joker slot as a side effect maybe

teal estuary
#

something weird i've noticed while working on a joker, for some reason while using those contexts, the addition to chips is unsynced with the number on the joker description?

#

maybe thats due to the nature of the contexts
-# and/or im using it wrong

wintry swallow
#

alright, so, i want to make a custom challenge

#

what's the best way to do it? i already know lua very well

spring lantern
#

which version is better?

frosty dock
wintry swallow
#

i looked at that, that doesn't really explain much

#

or at least how to set up a skeleton for a Steamodded project

livid tapir
wintry swallow
#

helpful resource for actually defining the challenge proper, but this is my first time looking into modding this game, so i'm unfamiliar with how to set up a Steamodded project

mild swan
#

are there docs for if you want to change the name of the suits?

frosty dock
wintry swallow
#

additionally my ideas do involve modifying vanilla game behaviour

livid tapir
wintry swallow
wintry swallow
livid tapir
#

yea theres two different ways, header (i use it but its outdated so explodes) or just some json stuff or whatever

frosty dock
wintry swallow
#

they wouldn't be the only rules in the challenge

#

but yes, thank you

tawny perch
spring lantern
#

i mean they also function differently

#

but i think i prefer the second one too because it's less rng and easier to understand

livid tapir
livid tapir
livid tapir
merry raven
livid tapir
wooden nexus
#

Okay odd question: I only want a specific rank/suit combination to spawn with a custom suit and custom rank.

Example: I want a Bishop of Stars to be able to spawn, but no other bishops and no other stars, any way I can do that?

wintry swallow
#

"Only Boss Blinds appear / At the start of the game, and after completing a Blind, earn 2 random Tags"

valid forge
#

ooh

#

so yeah it basically is just "fuck it we skip"

wintry swallow
#

i also want to make one named "Down in Ten"

#

10 hands, 4 discards / "Hands do not regenerate after completing a Blind"

#

(discards do regen as usual)

hidden timber
granite plover
#

What happened here? How do I fix it?

tepid crow
livid tapir
hidden timber
tepid crow
sturdy compass
#

Does anyone happen to know where in the code the check for number of highlighted cards against a consumeable's limit happens?

tepid crow
#

do you want me to make a new one?

hidden timber
hidden timber
tepid crow
#

alright I'll get a new PR

frosty dock
#

... huh

#

need a hand with handling/reviewing these?

tepid crow
#

it's a bit of a mess ngl haha

wintry solar
#

can more than one category be selected?

edgy reef
#

Is there a min/max size for the .jpg?

#

Best I can get for Flower Pot was the tag in the post, which ig can be upsized

tepid crow
#

I'd like to have both Content and Api

tepid crow
frosty dock
merry raven
#

Does granting money work differently in Enhancements compared to Jokers?

calc_dollar_bonus = function(self, card)
        local bonus = card.ability.extra.p_dollars
        if bonus > 0 then return bonus end
    end

This was from an example Joker so I modified it to p_dollars according to the wiki's config values, but I guess there's something missing

wintry solar
#

enhancements don't have a calc_dollar_bonus

merry raven
#

What should I use instead?

wintry solar
#

whats the effect?

merry raven
#

To put it simply it grants money when shattered

wintry solar
#

use ease_dollars where you're destroying it

supple folio
#

How do I create a specific joker?

#

Like from a consumable or something

livid tapir
supple folio
#

How do I specify the joker to create?

#

wouldn't that just pull a random one from the joker pool?

livid tapir
granite plover
#

Does anyone have a list of al the contexts and functions for joker effects?

livid tapir
livid tapir
supple folio
#

it says this replaces that?

#

Should I just use add_card then?

livid tapir
supple folio
#

Alright

livid tapir
#

imma change mine to that too bc it emplaces and adds to deck itself anyways so

sturdy compass
#

Do lovely patches not work on localization files?

wintry solar
#

no

sturdy compass
#

Huh. That explains a few things

#

Since that's the case, I need to change the descriptions of some vanilla cards. How should I do that? Ideally I don't take over the cards so they don't appear as part of the mod

tepid crow
#

interesting scenario, why are you changing the description but don't want to take ownership?

#

you can create your own en-usand that should overwrite the base game stuff

normal crest
#

where it won't put your mod badge on it

sturdy compass
sturdy compass
tidal steppe
#

is there some way to cheat in a joker i made? trying to follow the example mod for jokers but how do i get them in game, surely not play until rng. and the collection wont even show them as they arent discovered yet

sturdy compass
tidal steppe
#

thanks

sturdy compass
#

np

tidal steppe
#

what are the commands tho?

normal crest
#

hold tab and you'll see

#

it pops a menu on the right

tidal steppe
#

thanks 🙂

livid tapir
#

hey how do i make a number in the text of a joker orange like they do with Juggler

frosty dock
#

{C:attention}

livid tapir
#

ok thx

stiff locust
livid tapir
#

doubled joker and joker lottery work well together
like you can just create a random joker without losing any lol

livid tapir
#

thx tho

livid tapir
stiff locust
livid tapir
#

oh yea

#

so it is card_limit?

stiff locust
#

uhh i'm not sure

#

i will check

livid tapir
#

ok

stiff locust
#

yes it is G.jokers.config.card_limit

livid tapir
#

ok thx!

stiff locust
#

i don't know if directly changing the value is the safest/recommended way?

#

if you run into issues, there's probably a better way to do it

elder vapor
#

wish there were documentation on making a custom collection area

tepid crow
#

you should probably just copy the entire source for that from either ortalab or cardsleeves at that point

#

oop looks like ortalab doesn't have that source code publicly available

livid tapir
#

in this case

calculate = function(self, card, context)
        local left_card
        if context.joker_main then
            for i = #G.jokers.cards, 1, -1 do
                if G.jokers.cards[i] == card then
                    local left_index = i - 1
                    if left_index > 0 and G.jokers.cards[left_index] then
                       left_card = G.jokers.cards[left_index]
                    end
                end
            end
        end

        if left_card ~= nil then
            print(left_card)
            SMODS.add_card({
                set = 'Joker',
                area = G.jokers,
                key = left_card.k
            })
            if G.jokers.config.card_limit > 1 then 
                if card.ability.extra.slot_removed == false then
                    G.jokers.config.card_limit = G.jokers.config.card_limit - 1
                    card.ability.extra.slot_removed = true
                end
            end
        end
    end

how would i get left_card's key

tepid crow
#

wouldn't left_card.key work on modded jokers?

#

though I don't think vanilla jokers have them

wintry solar
#

There’s generic collection stuff built into smods now

livid tapir
#

ill try it

#

forced_key?

tepid crow
zealous glen
#

By the way

#

I learned vanilla has a function to add children to UI nodes

elder vapor
livid tapir
#

can you please help me understand whats going on here?
the code of my joker:

calculate = function(self, card, context)
        local left_card
        if context.joker_main then
            for i = #G.jokers.cards, 1, -1 do
                if G.jokers.cards[i] == card then
                    local left_index = i - 1
                    if left_index > 0 and G.jokers.cards[left_index] then
                       left_card = G.jokers.cards[left_index]
                    end
                end
            end
        end

        if left_card ~= nil then
            print(left_card.label)
            SMODS.add_card({
                set = 'Joker',
                area = G.jokers,
                key = left_card.label
            })
            if G.jokers.config.card_limit > 1 then 
                if card.ability.extra.slot_removed == false then
                    G.jokers.config.card_limit = G.jokers.config.card_limit - 1
                    card.ability.extra.slot_removed = true
                end
            end
        end
    end
supple folio
#

I'm having the same problem, I'm not sure what's going on

#

Whenever I try to create a card it throws that error

livid tapir
#

it doesnt want to make a card of that key

#

or smth

supple folio
#

Yeah, looks like it throws the error when I try to use the key to one of the jokers in my mod

#

huh

stiff locust
livid tapir
#

or smth bc when i do it, it still spits out a random joker instead of the same one

stiff locust
#

maybe just try the vanilla method for creating a card

livid tapir
#

the add_joker?

#

ok

stiff locust
#

or wait

#

I thought it was SMODS.create_card

supple folio
#

both are a thing

stiff locust
#

never heard of it until today

supple folio
#

add_card emplaces the card and also applies add_to_deck

livid tapir
supple folio
stiff locust
#

neat

#

i'm gonna keep using create_card though

livid tapir
#

imma try add_joker and see if i have any luck

tepid crow
elder vapor
#

would i be able to apply stickers to the cards?

#

kinda like in the base stickers ui

tepid crow
#

No clue, I've never used it 😅

elder vapor
#

ui confuses me which is why i haven't touched it 😭

stiff locust
#

another call for the same crash

#

got this on boot after updating steamodded
updated lovely and crash is still here so i'm stuck

#

wait that's just an entire mod's code in there huh

#

I really don't understand anything about crash logs beyond the first 5 lines

livid tapir
#

that mod isnt compat with that version maybe?

stiff locust
#

that would be very convenient

#

because it's an easy fix

edgy reef
#

V is a function standing for version, so the mod likely has one that Steamodded doesn’t like

stiff locust
#

oh my god it fucking works

livid tapir
#

what

stiff locust
#

I gotta read the rest of the crash log more often

#

gonna go report this in that mod's thread like a sane person

livid tapir
#

so wgat was the problem?

stiff locust
#

someone else already reported it

#

the problem is indeed that mod's version being a bitch yeah

livid tapir
#

ah ok

stiff locust
#

removed the mod and that solved it

#

it's not a mod i was particularly fond of anyway so not really a big loss

#

now I can finally test the lovely patch i wrote like 6 hours ago

livid tapir
#

are lovely patches made inside of lovely or are they injected into lovely or smth
how do you include those in mods?

#

idrk how all this stuff works lol

stiff locust
#

you make a file called lovely.toml and it goes in your mod folder

merry raven
#

Apparently using card:shatter() can create ghost cards, any way to fix this? In my code I'm just calling that function straight to destroy my custom Enhancement card

stiff locust
#

iirc

merry raven
#
if context.cardarea == G.play and not context.repetition then
            if math.random() < 0.25 then
                G.E_MANAGER:add_event(Event({
                    trigger = 'after',
                    delay = 0.4,
                    func = function()
                        card_eval_status_text(card, 'extra', nil, nil, nil, {
                            message = "Shattered!",
                            sound = "fm_shatter",
                            colour = G.C.MONEY
                        })
                        ease_dollars(card.ability.extra.money, true)
                        card:shatter()
                        return true
                    end
                }))
            end
        end

Hmmm I see

stiff locust
merry raven
livid tapir
#

and these patches do what? change game functions?

stiff locust
stiff locust
#

for an example

#

splash's effect is hard coded

#

the game checks if you have the splash joker and then executes the effect

#

you can't really replicate that in the calculate function of another joker without crashing (someone will now proceed to correct me on this) but you can lovely patch it

livid tapir
stiff locust
#

adding code to that area that checks for splash or other jokers

stiff locust
#

mods add new self-contained code

#

a lovely patch lets you put code in really specific places that you really need it to be in

#

like in a function the game only runs one time

livid tapir
#

ah ok
so like if you wanted to add something to a game function

stiff locust
#

well no

#

in that case, you'd hook the function

#

basically you make the game run your version of the function, which contains an extra bit of code

#

and then run the actual function inside that so nothing breaks

#

but that only works on functions that are run a lot

livid tapir
stiff locust
#

that's what I said

livid tapir
#

no like

#

i did that and it gave the error again

stiff locust
#

alright new idea

#

do you have debugplus

livid tapir
#

yes

stiff locust
#

okay great

#
print(left_card)
print(tprint(left_card))

put these in the joker

livid tapir
#

ok

stiff locust
#

i don't know if it'll be a table or not, tprint is a built-in balatro function that prints tables

#

lua doesn't like it when you print a table with just print(table)

#

one of them will give a coherent output which is good enough

wooden nexus
#

trying to figure out how to hook up the ranks from a table to an if statement in the suits

#

ok i got it working

#

Now that i made these, time to use one as a test dummy to make the card spawn a tag when scored

livid tapir
#

OOH I FIGURED IT OUT
it must be config.center_key ig

#

or wait no

stiff locust
#

that makes sense

livid tapir
#

its also in key too but that aint work anyways so

#

ill do config

stiff locust
#

maybe just config.key

livid tapir
stiff locust
#

well alright then

#

config.center_key it is

livid tapir
#

lets hope it works

#

🤞

stiff locust
#

🌊

elder vapor
#

is there a helper function that prints the contents of a table?

stiff locust
#

yes

#

tprint

livid tapir
stiff locust
#

print(tprint(tablename))

elder vapor
#

awesome

livid tapir
#

if only i knew how to decipher these

#

i understand it now

#

sorta

#

config (the one with center_key) seems to be a part of some other table

#

i just gotta figure out what it is

stiff locust
#

that table is the table that contains all the joker information

livid tapir
#

theres multiple different configs fsr

#

ok nvm its part of the main table

#

theres multiple different configs inside of the main table

#

maybe the error isnt about that

#

it might be about smth else

gilded narwhal
#

Hey gang I need a favor could you guys name a joker and I'll tell you what it could reroll into as part of the "jokers reroll into similar ones at the end of every ante" gimmick

#

And y'all can tell me if that makes sense

stiff locust
#

splash

gilded narwhal
#

Because I have a list of a bunch of different joker pools and I wanna make sure they work

stiff locust
#

splash

gilded narwhal
stiff locust
#

no

#

in 90% of runs I wouldn't want any of these except Chicot and maybe Bones what

karmic kelp
#

I don't see where Showman, Mr. Bones, or Chicot come in

stiff locust
#

espeically instead of Splash

karmic kelp
#

also under what conditions would this rerolling be happening

stiff locust
#

which

fucking sucks when all of these are build-specific

karmic kelp
#

in that case, where's Luchador? or is he in "on sell"

stiff locust
#

if you have one that already fits your build you wouldn't want any of the other options

gilded narwhal
stiff locust
#

yeah tha'ts horrible

#

I would restart the run to reroll the effect if I got that

karmic kelp
#

I feel like this needs me knowing about what erratic effects are and I have no idea what those are

stiff locust
#

some of them are positive and some of them are negative

#

it selects 3 of 7

#

and some of them are REALLY dumb no offense to survival

#

like this one is just an instant reset

#

no sane person plays through a run where you don't get to keep any joker for more than 1 ante

gilded narwhal
#

Okay COULD joker rerolls technically work if I tweaked with the pools and weights enough

elder vapor
wooden nexus
#

oh?

wooden nexus
elder vapor
#

yeah been working on it for a while

stiff locust
elder vapor
merry raven
elder vapor
#

finally got around to making it not appear in the stickers area

merry raven
#

Do you have the code for it? And how complex is the entire implementation?

wooden nexus
#
    calculate = function(self, card, context)
        if context.individual then
            add_tag(Tag('tag_uncommon'))
            play_sound('generic1', 0.9 + math.random()*0.1, 0.8)
            play_sound('holo1', 1.2 + math.random()*0.1, 0.4)
        end
    end```

What is wrong here?
elder vapor
wooden nexus
elder vapor
merry raven
#

Siiiick

gilded narwhal
# stiff locust yeah tha'ts horrible

I'm curious when you say this does that mean like
"This is a horrible idea why would you think this"
Or like
"This would just be awful to play"

stiff locust
#

as an idea on its own, it's not a bad idea, but I wouldn't put it in a deck like that

merry raven
stiff locust
#

it could go in its own deck and have a corresponding upside to sffset

#

and it'd be a fun little challenge deck

elder vapor
#

other mods can add gem slots easily and it would appear in the collection menu (at least i think)

stiff locust
#

but when getting or not getting the no-fun run effect is randomized it's really annoying and just makes you wanna pick a more consistent deck

elder vapor
merry raven
#

Oh man that's a Talisman dependency, must be quite complex

elder vapor
#

talisman depemdancy is only used for xchips

stiff locust
merry raven
#

ooh I see

elder vapor
#

the actual mod doesn't even support going past the 1.7e308 limit because i'm stupid and don't know howspinningskull

#

wish i didn't have to use talisman as a dependancy because of xchips but it makes my life easier

merry raven
#

Yeah it is what it is ig

stiff locust
#

xchips gotta get put in base steamodded

#

and when they do they better make it work on playing cards

merry raven
#

Looking through your source code, damn quite lengthy Lovely patches, still struggling to understand them but I'm getting there

elder vapor
#

how does xchips work on jokers

#

💀

merry raven
#

People warned me about putting stickers on playing cards since it doesn't really appear on them in vanilla gameplay except for decks and Jokers

elder vapor
merry raven
stiff locust
#

oh god

merry raven
#

Dude your lovely patch for diamond is longer than your misc patch what the hell

elder vapor
#

idk if i should get repetition for stickers added to base steamodded

merry raven
#

Anything's good for steamodded

#

I wish for proper card destruction for Enhancements

gilded narwhal
# gilded narwhal

Would this idea work if the effects were balanced enough, because I really like it

#

I'm gonna work on it a bit

radiant halo
#

I'm trying to learn how to use the lovely injector and I'm confused about a few things, if anyone could clear them up for me i would appreciate it

  1. How much do i have to worry about "priority"? (for both lovely and json files)
  2. I assume I'm able to use the entire SMODS api with it?
  3. what's the purpose of the dump folder? Is that what the code looks like after the patches?
sturdy compass
#

I can confirm 2 and 3 are correct. 1 I am not sure

radiant halo
#

ty

#

i took a look in the cryptid code and they only use priority 0 so i assume its not that important

livid tapir
# stiff locust config.center_key it is

guess what
i am the stupidest person alive (if you dont count babies and toddlers)
basically it is config.center_key
but fsr i was doing add_joker({joker = left_card.config.center_key}) instead of add_joker(left_card.config.center_key)

#

so uh doubled joker works now
and it does indeed remove one joker slot

merry raven
#

Epic

livid tapir
#

i do want to make it so that it will only remove a joker slot as long as it exists in the area instead of just permanently

#

which is prob an easy thing to do

#

ok theres still smth i gotta fix
uh it still adds a copy even if theres no room so

#

easy fix tho

sturdy compass
#

I am very confused right now. I'm injecting this patch into the use code for Familiar/Grim/Incantation but it's still producing the vanilla functionality. I even checked the dump and it looks good there

#

It's not even sending debug messages to console

#

Here's the dump too

red marlin
#

Hey guys, struggling to get a custom sound to play, specifically with getting/storing the path to the file, I've seen it done in SMODS.Sound and outside so unsure on best practice, I've got the mod being stored, and tried
mod.path .. 'gunshot.ogg'
and image attatched, along side some tweaks

crisp coral
#

0.9.8 code....

red marlin
#

Oh no have I done a cringe

crisp coral
#

yea, you can remove the entire line with the findModByID

#

each sound should be declared using a different SMODS.Sound

#

like

SMODS.Sound({
    vol = 1,
    pitch = 1,
    key = "key_1",
    path = "path_1"
})
SMODS.Sound({
    vol = 1,
    pitch = 1,
    key = "key_2",
    path = "path_2"
})
red marlin
#

Sick, I'm now just getting this, where I'm assuming it's looking in the games files rather than the mods?

wooden nexus
#

Yay, fixed my font

#

Balatro Font for coding

sturdy compass
red marlin
crisp coral
#

what's your code?

red marlin
crisp coral
#

okay, and whats your updated sound declaration

red marlin
#

Could it be my .ogg s?

faint yacht
#

Remove the sounds/ bit.

red marlin
#

Still getting it 😅

faint yacht
#

Are those actually .ogg files, codec and all?

red marlin
#

Cheers guys, much appreciated. I'm on v little sleep and the last time I used Lua it was 2008 and I was trying to make a door in roblox

faint yacht
#

Happens.

red marlin
#

As an aside, is there any way to show a negative amount in the dollar bonus? a minus figure shows as though you're gaining money, even though the cash out/results show removing

#

Even if I could just colour the text red or something

gilded narwhal
#

Cool or nah?

gilded narwhal
karmic kelp
#

feels a bit rnjoker-y
not in a bad way, I'm all in favor of random stuff, even my pfp is an rng-based character
I just wonder if you'll be sticking with the fixed values, or if you'll add some scalers too

red marlin
#

Is there a way to show a message on a joker outside of the calculate function? Like in calc_dollar_bonus as I'm destroying it or something?

sturdy compass
#

fear me

livid tapir
#

WAT

sturdy compass
delicate summit
#

What am I doing wrong?

kind hedge
#

How would you go about a joker retriggering the first played card? I made this method (likely poorly written) but it just crashes when its supposed to run cause it failed calling an event called "Juice Up"

faint yacht
#

card = card

kind hedge
sturdy compass
#

Allow me to show off the spread of jokers I've made for this mod so far. Huge props to my artist, he's doing a great job

nova finch
#

how would I make a joker that does something if a flush is a certain suit?

faint yacht
#

Detect if a Flush is made... then iterate through scored cards and count how many are of the desired suit. If they match the length of the scored hand (5... or 4 with Four Fingers), do stuff then.

storm oar
#

a flush though would always be the same suit unless wild cards are used

#

so unless you want to exclude wild cards then you can just check the suit of the first non-wild card instead of the suit of every card

nova finch
sturdy compass
#

But what if it was a wild flush Thonk

storm oar
storm oar
#

so then yeah you can just check if the hand is a flush and check the suit of the first non-wild card, or if its all wilds then just do whatever effect

nova finch
#

k. thank you

sturdy compass
#

I take it you’re making Jokers for each type of flush?

storm oar
#

also, with four fingers is a flush 4 a thing?

sturdy compass
#

I think it just classifies as a flush

nova finch
sturdy compass
#

Tho that’d be a cool way of making four fingers relevant

sturdy compass
nova finch
#

thanks!! this is my first time making a mod lol

radiant halo
#

(disclaimer: not an artist) what do yall think about this border design for jokers which upgrade other jokers?

storm oar
livid tapir
radiant halo
#

aw ty

livid tapir
#

"(disclamer: not an artist)" proceeds to absolutely cook

storm oar
#

i need to get better at card art

radiant halo
#

my final goal is to make the arrows hover (like hologram), so I'm waiting until i get that working before i make my final decision

radiant halo
livid tapir
#

you could make the green arrows be linear along the borders, and then for the animation they kinda glide upwards

storm oar
#

i just thought of something funny, what if i made it so that the base joker for the reincarnation afterlife thing I'm doing is just the base joker with the reincarnated effect border around it?

storm oar
#

maybe with like the soul effect with the face?

livid tapir
#

show me what you can cook

storm oar
#

i cant rn since I'm at work and the sprites I'm using for my mod atm are just simple placeholder sprites

livid tapir
#

mkay

radiant halo
livid tapir
nova finch
livid tapir
#

for a simple in sprite animation at least

#

idk how youd code it in tho

radiant halo
radiant halo
nova finch
#

that's weird

livid tapir
#

yea
coding that would be hard presumably

radiant halo
#

maybe i could just line the sides with arrows and have a shader that scrolls them vertically up?

#

and loops

radiant halo
nova finch
radiant halo
#

mm i dont think thats where the bug is?

#

its complaining about a for loop

nova finch
#

yeah

#

it's something about the actual game code

radiant halo
#

hmm

#

are you sure this is what's causing it?

nova finch
#

yeah

#

this is the first time it's crashed with this mesage

storm oar
#

id say to do

if context.joker_main then
   if string.find(context.scoring_hand, "Flush") then
      return whatever
   end
end
#

that way it counts any variation of flush

#

not just the regular flush

nova finch
#

ok

#

I'll try that

storm oar
#

so flush five, royal flush, etc.

#

not sure if thats right though but id think it is

radiant halo
#

i think you can actually do if next(context.poker_hands["Flush"]) then

#

i believe context.poker_hands contains ALL hands your hand "contains"

sturdy compass
storm oar
#

or no not scoring_hand, scoring_name

#

ive not done much modding so idk entirely how things work and it doesnt help that I'm tired

nova finch
#

that worked

#

thanks!

storm oar
#

so that detects the flush or just didnt crash?

nova finch
#

it detects the flush now

random sleet
#

twisteddragons' solution will detect all flush hands even if they dont have 'Flush' in the name for whatever reason

storm oar
#

yeah I'd go with that honestly, cause doesnt that also have a table of the cards?

radiant halo
#

i mean all flush hands should have flush in the name regardless

random sleet
#

or if it's not scoring as a flush for whatever reason, which is relevant since there's a poker hand api that can have new hands throw things out of whack

random sleet
#

yes????? peak

radiant halo
livid tapir
radiant halo
#

nah its good

livid tapir
#

WHY AM I GETTING GOLD jimbo MEDALS FOR THIS 💀

random sleet
#

theres an odd bit in the loop on the top right

#

and yeah maybe make it a bit slower but i think its great

livid tapir
#

ah i see

#

some of them arent spaced correctly

random sleet
#

also thats jimbo's stamp from my mod
coming never™️

normal crest
livid tapir
#

nice stamp

livid tapir
random sleet
#

i have each of the following as well:
jimbo todd steven chaos andy mr_bones vampire gros_michel sock_and_buskin hiker

radiant halo
#

love the little sock and buskin

random sleet
#

the idea is for it to retrigger the joker it's on but i haven't cracked the code on that yet

random sleet
#

i understand there's some form of api for that in the works and im hoping that might be able to help me so ive just been doin other stuff lul

#

also i havent been balatromodding much lately so im out of all the loops

nova finch
#

man i wish there was a wiki for this stuff

random sleet
#

steamodded's github page has a wiki

livid tapir
#

ooh lemme make it slower though

random sleet
#

that at like roughly 85% speed would be grand
also is there a way to make animated jokers now? i remember i was trying to figure it out but it's not simple

livid tapir
radiant halo
livid tapir
#

cool

livid tapir
spiral stirrup
#

aahhhhhh theee french.... champagne

livid tapir
random sleet
livid tapir
#

oh btw

#

how do i make a function in a joker that is only triggered once the joker leaves G.jokers
like if it is sold or destroyed itll trigger a function

normal crest
#

I've encountered that same situation, my solution was to hook into CardArea:remove_card and check that the area is the jokers one

livid tapir
#

?
how do i hook into CardArea:remove_card

#

bc i dont know much lua so hooking is new to me

#

oh i see

normal crest
#

I wish I could write some example but I'm on phone

#

Hooking is basically adding your own code to a vanilla function

livid tapir
#

so smth like

local removecardOG = CardArea.remove_card

function CardArea:remove_card(card, ...)
  if card.key == 'doubledJoker' --[[ thats the name of my joker ]] then
    if card.ability.extra.slot_removed then
      G.jokers.config.card_limit = G.jokers.config.card_limit + 1
    end
  end
  return removecardOG(self, card, ...)
end
```?
normal crest
#

Yeah that's pretty much it, all you need to change is card.key to card.config.center_key == 'j_prefix_keu' where prefix is your mod prefix and key is your joker key

livid tapir
#

whats a mod prefix, the mod_id?

normal crest
#

If you're using headers the mod prefix is the first 4 characters of your mod id

#

But you can change the prefix

#

I'd recommend to make it the same as your mod id

livid tapir
#

i use headers personally

#

so ig its H1DR

normal crest
#

by default yeah, but you can change it

livid tapir
#

how do i change it btw

#

is it part of the header

normal crest
#

Yeah, in the header, same way you defined mod id but put PREFIX instead

#

I believe

livid tapir
#

so MOD_PREFIX

normal crest
#

I think it's just PREFIX

livid tapir
#

ok

random sleet
livid tapir
#

thx

#

i changed it to HMOD

normal crest
#

just make sure it's unique

tall wharf
#

finally figured this out

#

i am no longer replacing warframe and that's good i think

livid tapir
normal crest
#

Hello miku

random sleet
#

LETS GOOOOO MIKU CARDS

tall wharf
livid tapir
#

oololo

tall wharf
#

i know a bit about coding

#

still working on it

random sleet
#

i love this

livid tapir
tall wharf
#

thanks

radiant halo
#

yeah thats some sick art

random sleet
#

im curious who the other two will beeeeee

tall wharf
#

still deciding lmfao

random sleet
#

im putting forward meiko and ritsu

tall wharf
#

not really limiting to exclusively vocaloid

#

just that some of them i literally have not heard of before

random sleet
#

meiko is hearts in alice of human sacrifice-

tall wharf
#

i have heard of meiko but not ritsu

#

i wonder how difficult the design is gonna be for the card lmao

random sleet
#

oh utauloid released after teto by the same... group? i forget

livid tapir
#
local removecardOG = CardArea.remove_card

function CardArea:remove_card(card, ...)
    if card.config.center_key == 'j_HMOD_doubledJoker' then
        if card.ability.extra.slot_removed then
            G.jokers.config.card_limit = G.jokers.config.card_limit + 1
        end
    end
end

and then i got an error about card being nil with remove_card

tall wharf
#

first generation teto design

livid tapir
#

LOL

tall wharf
#

here is a second one (just draft)

#

it's fine those were just draft here is the real thing

random sleet
#

what if all of them mikuPlush
teto fervor

tall wharf
#

😭

#

i want to give spaces to other vocaloids too

#

uhm

random sleet
#

why limit yourself

tall wharf
#

maybe i move adachi rei to hearts so i have more spaces for yellow hair people

random sleet
#

i'm just sayin stuff tho you aint gotta do what i yap

tall wharf
#

it's fine

#

thank you vocaloid wiki

#

i am pretty sure those two are always popular

#

ill go back to drawing shit now

normal crest
livid tapir
#

OH WIAT

#

geez i forgoer

radiant halo
#

ok sorry for off topic but how the hell does merry andy even work???

#

every other joker that modifies hand size has a section in add_to_deck

#

but not merry andy?????

livid tapir
#

it has merry andy

radiant halo
#

i mean in the vanilla code

livid tapir
#

ah ok

normal crest
#

Is merry andy a vanilla joker, I've never heard of it

radiant halo
#

+3 discards, -1 hand size

normal crest
#

Oh

#

Maybe check in game.lua

#

May just be in its config

radiant halo
#

i did, it just has its definition

livid tapir
normal crest
radiant halo
#

thats small as hell

livid tapir
radiant halo
#

j_merry_andy= {order = 125, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Merry Andy", pos = {x=8,y=0}, set = "Joker", effect = "", cost_mult = 1.0, config = {d_size = 3, h_size = -1}, unlock_condition = {type = 'win', n_rounds = 12}},

normal crest
radiant halo
#

i cant find where that's actually used though is the issue

#

every other joker that modifies hand size is in that function

normal crest
#

Yeah, does it work?

livid tapir
#

lemme see

#

nope, does same thing

normal crest
#

Also you have to pass self to removecardOG

livid tapir
#

oh ok

normal crest
#

As the first parameter

#

And I think remove card has another parameter

livid tapir
#

thats discardedonly

normal crest
#

Yeah you have to put it in as well to pass it to the original function

livid tapir
wintry solar
#

Why are you doing this

normal crest
#

I'm not sure what the triple dot notation is in lua

wintry solar
#

Just use remove_from_deck on your joker

normal crest
#

They want an effect when any joker is sold or removed

livid tapir
#

yea basically
my joker removes one joker slot, but i want it to give it back once it is sold or removed

normal crest
#

Wait it's only for your joker?

wintry solar
#

This is a very simple add_to_deck/remove_from_deck situation

normal crest
#

I misunderstood then, Eremel is right, this is unnecessary

#

My bad

wintry solar
#

98%

livid tapir
#

oh ok

normal crest
#

At least you learned how hooks work!

livid tapir
#

thx

normal crest
storm oar
#

that gives me an interesting idea though, what if wide joker that took up 2 slots

radiant halo
#

its gonna haunt me

storm oar
#

and negative adds 2

normal crest
#

For d_size

livid tapir
#

i gtg to bed lol

radiant halo
#

doing that rn for "merry"

#

ill do d_size after

#

gnight

normal crest
#

Merry probably doesn't appear

#

Since its effect is entirely contained within config

radiant halo
livid tapir
radiant halo
#

i actually don't know where all the "simple" jokers are executed

radiant halo
#

like the pure +mult ones

pine moss
#

Hi sorry, I'm super new to modding but I'd like to learn, specifically right now I'm wondering how I would go about making a custom enhancement. I stole the echo code from Cryptid mod's Misc.lua but most of the code for that isn't there and I can't seem to find it so I just thought it would be more efficient to ask here

livid tapir
wintry solar
radiant halo
normal crest
pine moss
normal crest
#

I don't have the link at hand right now but you can probably find it by searching

#

Also that repository has examples

wintry solar
#

I’d recommend not doing any enhancement work for a few days

radiant halo
wintry solar
#

Their values are in the extra table

radiant halo
#

i mean i see that but...why?

normal crest
#

Turtle bean changes every round, idk about stuntman

livid tapir
wintry solar
random sleet
radiant halo
livid tapir
#

im in my ipad rn just getting in what imma do tomorrow to make this work

normal crest
#

Yeah but values that change don't go in config, go in extra

#

So it has to be handled manually like that I guess

radiant halo
normal crest
#

Trying to understand someone else's code is always pain

wintry solar
#

The best advice I can give is don’t try and understand why thunk did stuff

normal crest
#

Especially because we don't always make the most reasonable and efficient stuff

radiant halo
#

stuntmans h_size is also in extra

normal crest
#

just do it in your own way!

#

If you want it to change put it on extra

radiant halo
#

tbh i dont even get the extra

#

ive just putting all my custom joker vars directly in config and it aint broke yet

wintry solar
#

Put them all in extra

radiant halo
#

what is the significance of extra?

wintry solar
#

Everything in the extra table is copied (and saved) to your joker, only certain things not in extra are

normal crest
#

Basically persistent data for the instance of your joker

pine moss
#

Hi hi me again, how do I give a card an enhancement, and for future reference where can I find tarot card code in base game?

radiant halo
tall wharf
#

i am so cooked

random sleet
#

you are so cooking

normal crest
#

Like how a vampire doesn't work retroactively

radiant halo
pine moss
pine moss
radiant halo
normal crest
# pine moss Thank you!

Also, jokers, consumables and others are considered "centers" so you'll find functions specific to them in the centers page in wiki

radiant halo
#

ok so the data in extra is per joker, and the data not in extra is for every instance of that joker???

pine moss
normal crest
pine moss
#

Thanks, so if it was custom i would do like G.P_CENTERS.cry_echo or something?

radiant halo
#

you can leave the other 2 blank and it should work

normal crest
#

You need the m at the start for enhancements

pine moss
#

Ohh I see, ok lemme check cryptid mod code

normal crest
#

But if cryptids prefix is cry then that should work

normal crest
storm oar
#

is adding stuff directly to .ability for cards an issue?

#

like for example for the cards from the previous run with the reincarnation afterlife voucher in my mod i add card.ability.reincarnated directly to each card that's carried over

#

i haven't noticed any issues so far but if there's any i probably should change it

radiant halo
#

i have no clue

#

i REALLY do not understand the point of extra

normal crest
#

Can you send a ss of the set ability function where it defines self.ability

radiant halo
#

uhh

#

i guess line 316???

#

does that even do anything?

#

i guess it would be {} if theres no ability

normal crest
#

yes, you can see how it specifically copies some values to the ability table

#

If you were to add custom ones in the config table this would not take them into account

#

But extra copies the entire table

radiant halo
#

i've been adding custom ones and its been working so idk

normal crest
#

called new_ability here

storm oar
#

ah so it only applies to config and not manually adding to .ability?

tall wharf
#

so uhm

normal crest
#

that's my understanding of it

storm oar
#

no?

radiant halo
#

when is set_ability actually called?

storm oar
#

set ability keeps the old ability table if it exists and just replaces values it looks like

#

if .ability doesnt exist it makes it as an empty table

wintry solar
#

You can manually add stuff afterwards

normal crest
#

uhhh, then I guess I also don't understand

radiant halo
#

...i think im getting it

wintry solar
#

Just initial creation only copies certain things

storm oar
#

so me doing card.ability.reincarnated = true is fine?

wintry solar
#

I’d have to recheck the save/load code

storm oar
#

it saves and loads properly

#

cause ive been able to exit runs and come back and the cards still have the border

radiant halo
#

doesn't the vanilla game only call set_ability on playing cards though?

normal crest
#

Maybe check wheel of fortune code

radiant halo
#

no thats an edition though

#

thats different i think

#

maybe?

normal crest
#

An edition is still an ability I'm pretty sure

#

Its a center anyway

wintry solar
#

Set ability is called on every card when it’s created

#

Editions are different

normal crest
#

So set ability is never called on jokers?

radiant halo
#

i mean theres a whole different function called set_edition

#

i dont believe so

normal crest
#

Except for initial creation of course

radiant halo
#

if thats true then shouldnt my jokers with custom vars not in extra not work at all?

wintry solar
#

It’s called whenever the joker is created

radiant halo
#

like i got this and i can call on it just fine

wintry solar
#

Show your calculation code

radiant halo
#

aight one sec

normal crest
radiant halo
#

it doesnt use it itself, wee joker uses it

#

hang on lemme test something

wintry solar
normal crest
#

So only once

#

You made it sound like it'd happen multiple times

radiant halo
#

ok yeah if it gains an edition it still functions normally

#

at least via the debugplus mod

wintry solar
#

It happens multiple times in playing cards

normal crest
#

But for jokers only once

wintry solar
#

Unless you call it on them again yeah

radiant halo
wintry solar
#

Changing enhancements

normal crest
#

Hiker buff is perma_bonus I believe

radiant halo
#

yes ofc but whats with the saving of the h_mult and x_mult and all that

#

can playing cards even have those vars?

normal crest
#

They should

teal estuary
#

they can, or should

radiant halo
#

when????

#

maybe steel card but then that would change upon enhancement change so

teal estuary
#

you can just.. give them those values

normal crest
#

If you have debug plus try looping through your hand with eval and log some ability value

teal estuary
#

i have a joker that adds mult to evey card played

wintry solar
#

Huh looks like smods copies the entire config table, has it always done that?

teal estuary
#

its not the same thing, but same principle

radiant halo
#

but in vanilla its not used at all right?

#

for playing cards

wintry solar
#

Enhancements

teal estuary
#

you can give playing cards extra values, and enhancements also give those cards those values

normal crest
radiant halo
#

i mean the vars in ability not the function set_ability

normal crest
#

look at eval card function in state events.lua

#

I think it's there anyway

radiant halo
#

i dont see it

normal crest
#

Maybe misc functions

#

In one of the files in functions folder

#

eval_card

radiant halo
#

its in common_events

normal crest
#

Close

radiant halo
#

we got there

teal estuary
#

good enough for a programmer

radiant halo
#

yeah it looks like it does access all the vars in abilitys but again, only really for cards in G.play or G.hand, aka playing cards

normal crest
#

Yeah eval card is for playing cards

radiant halo
#

not entirely

#

its got this part for jokers and planets/tarots

#

doesn't get any h_mult or anything though

normal crest
#

Yeah I've no idea what h mult is

#

Maybe planet cards

radiant halo
#

flat mult for holding a card

#

h stands for hold prob

normal crest
#

Wouldn't that be just mult

radiant halo
#

no mult is for playing the card

#

hold like steel cards and queens with that one joker

#

the +13 mult per queen held one

normal crest
#

Those are probably handled separately

#

But it could be

radiant halo
#

i mean yes but its the same principle

#

theres nothing that gives a card h_mult so idk when this code would be executed

normal crest
#

Go to Card:get_chip_h_mult

radiant halo
#

yea it just returns it's h_mult var

normal crest
#

Boring

radiant halo
#

im trying to find where it would get changed

normal crest
#

Try to look for a planet card's code

#

Pluto

wintry solar
#

Base game doesn’t use h_mult iirc

radiant halo
random sleet
#

iirc h_mult is just unused

normal crest
#

Boring once again

radiant halo
#

yeah shoot the moon (the queen joker) doesnt modify it

normal crest
#

we love unused code

random sleet
#

h_x_mult is used for steel cards iirc
it's probably just implemented for completion's sake really, though the lack of h_chips is annoying

radiant halo
#

lack of Xchips too

#

even though yeah its clear he didnt wanna add that

normal crest
#

really easy to add anyway

wintry solar
#

It’ll be from an old effect that got changed most likely

normal crest
#

Like copier for use consumable

radiant halo
#

fun fact burnt joker increases your hand size by 0

pine moss
#

can i use has_enhancement like this? It doesn't seem to be working

calculate = function(self, card, context)
        if context.repetition then
            if context.cardarea == G.play then
                if SMODS.has_enhancement(card, G.P_CENTERS.m_cry_echo) then
radiant halo
#

try next(SMODS.has_enhancement(card, G.P_CENTERS.m_cry_echo))maybe

normal crest
#

Key might be "m_cry_echo"

#

Aka the 2nd parameter is a string prob

pine moss
#

Ill try both thank you

pine moss
wintry solar
#

Key is a string yeah

radiant halo
#

yeah it might be a string lol

wintry solar
#

The function returns a Boolean

radiant halo
silver hill
#

idk if this is the place to ask this but, can anyone help me with this crash?

radiant halo
#

oh thats tricky

normal crest
#

So yeah, definitely not gonna work on a Boolean

radiant halo
pine moss
normal crest
#

Patches

normal crest
pine moss
# normal crest What's your code?
SMODS.Joker {
    atlas = 'cards',
    key = 'trainer',
    pos = { x = 1, y = 1 },
    rarity = 2,
    config = { extra = { retriggers = 2 } },
    loc_txt = {
        ['en-us'] = {
            name = 'Trainer trainer',
            text = {"This card retriggers",
                    "every {C:attention}trainer{} card",
                    "{C:attention}2{} times"
                    }
        },
    },
    loc_vars = function(self, info_queue, center)
        return { vars = { center.ability.extra.retriggers } }
    end,
    calculate = function(self, card, context)
        if context.repetition then
            if context.cardarea == G.play then
                if SMODS.has_enhancement(card, 'm_est_trainer') then
                    return {
                        message = localize("k_again_ex"),
                        repetitions = card.ability.extra.retriggers,
                        card = card,
                    }
                end
            end
        end
    end,
}
wintry solar
#

That’s checking if the joker has the enhancement

wintry solar
#

Use context.other_card

pine moss
#

THANK YOU

normal crest
#

yw

pine moss
normal crest
#

It seems to be the source of the crash

pine moss
#

If I want to make the text of my card work with Cryptid's joker value scaling what should I put in {C:attention}2{} part? I notice that the localizations for Cryptid uses #2#, would that work?

normal crest
#

The #s means it's a variable, the number in between means the index of what you return from loc_vars

#

So if you were to replace your 2 with #1# it means it takes the first value of whatever you returned from loc vars

radiant halo
#

alright im gonna eat a grilled cheese and pass out, hope you folks solve all ur bugs

silver hill
pine moss
normal crest
normal crest
pine moss
thorny adder
#

I ate too many {C:attention}beans {}I might have to {X:mult,C:white}Shit {} myself

#

:3

#

That should be the exemple on the documentation

tall wharf
#

chat is this IA or Bocchi the Rock

tall wharf
#

omg mr smods

thorny adder
random sleet
frosty dock
random sleet
#

chat should i make a deck skin mod

livid tapir
tall wharf
#

however you forgot to underline 9

#

anyway uhm

valid forge
tall wharf
#

true

#

how about this

valid forge
#

REAL!!!

#

who are Q and K

tall wharf
#

uhm

random sleet
#

in my experience, 6 and 9 is more common than 6 and 9

tall wharf
#

Adachi Rei and Kasane Teto respectively

valid forge
#

real

tall wharf
valid forge
#

tet,,,

merry raven
#

Man ghost cards are a huge pain in my ass

if context.cardarea == G.play and not context.repetition then
            if math.random() < 0.25 then
                G.E_MANAGER:add_event(Event({
                    trigger = 'after',
                    delay = 0.5,
                    func = function()
                        ease_dollars(card.ability.extra.money, true)
                        card:shatter()
                        return true
                    end
                }))
                card_eval_status_text(card, 'extra', nil, nil, nil,     
                    {
                        message = "Shattered!",
                        sound = "fm_shatter", 
                        colour = G.C.MONEY
                    }
                )
            end
        end

This is for an Enhancement so card destruction logic works differently compared to Jokers and Consumables, what am I missing? What can I do to prevent ghost cards from forming?

tall wharf
#

they do in fact underline both

#

maybe that's just me

wintry solar
random sleet
#

¯_(ツ)_/¯

tall wharf
#

better

#

how ab out the face cards

merry raven
random sleet
tall wharf
#

PLEASE DO NOT JUST DRAW LETTERS

random sleet
#

imagine if i was an artist this is 100% a joke

tall wharf
#

DRAW STICKMANS

random sleet
#

i only even underlined the 9 because i just hadnt closed gimp yet