#💻・modding-dev

1 messages · Page 184 of 1

stiff locust
#

how do I check if a card has a specific seal

normal crest
#

card.seal == 'Red' I think

#

For example

stiff locust
#

okay

wintry swallow
#

Scholar... Yeah that one isn't loaded. You're right. I chipped it up but it still won't load.

small moon
#

Anyone have any ideas?

wintry swallow
#

Don't make the game angry by forgetting to add the 1x

timid lynx
#

How do I specifically call for the planets btw?

wintry swallow
#

Just change it to Planet. Instead of joker or tarot

#

Your scholar image is too large.

#

I'm struggling to find the correct size. I would start over and use the template but don't move the frame

#

I'm not entirely sure that the game can add one joker but not the other. That part doesn't make sense. But deleting the scholar alters every other joker out of bounds

carmine burrow
#

just realized you weren't asking about this but can't you use G.GAME.max_jokers?

stiff locust
#

does steamodded support xchips now

#

i remember someone saying that

paper zealot
#

I think the description should be assigned to loc_txt.description, not loc_txt.text
It's handled by
SMODS.process_loc_text(G.localization.misc.achievement_descriptions, self.key, self.loc_txt, "description") in SMODS game_object.lua

stiff locust
#

any seal experts

#

my seal is triggering 5 times under if not context.repetition_only and context.cardarea == G.play then

#

how do I make it not do that

carmine burrow
#

when should it trigger

#

what does it do

stiff locust
#

when the card is played

#

it gives chips and it's supposed to give xchips but i'm having trouble with that it just crashed on me

#

it wasn't giving anything before

#

and then i fixed it and now it's crashing instead

#

says attempt to perform arithmetic on hand_chips (a nil value)

#

so i'm guessing it's trying to trigger before the card is actually scored?

#

i followed the seals example mod and everything

warm sphinx
#

How do you add something like maddness? Like each round you get a such and such mult added

stiff locust
#

also what did you guys do with the example mods

#

it's not in the directory it used to be

rough furnace
stiff locust
#

noted

#

context.main_scoring

#

i think that's what i need

vestal ore
#

black doom's favorite!

stiff locust
#

and then the madness comes in and it drops joker destruction like boom boom boom boom

#

but you eternal them

#

and then you go in the boss blind with the face cards and it's all like Debuffed Debuffed Debuffed Debuffed

#

oh my god it's so cool

vestal ore
warm sphinx
#

How do you add a mult for when blind is selected ? and is there a way to have it run a python script when it activities?

rough furnace
#

Does anyone have a mac (perferably without xcode and brew [or other package managers]) who's willing to test smth for me?

lucid owl
#

why is card.ability.extra.money not incrementing?

paper zealot
#

I can't see any issues with unlock_condition, but if the achievement has already been earned, then unlock_condition won't be run. You could try resetting the earned state and trying again.

small moon
paper zealot
#

Hrm. Not sure where achievement states are stored. Try changing the achievement key to a different name just to check?

stiff locust
#

are mod prefixes limited to only 4 characters

plush cove
stiff locust
#

great well then i have no idea what's going on

#

how do I get a seal to show up in info_queue

grim remnant
#

Trying to make a consumable that gives a random spectral card, but having two issues:

  1. For whatever reason, the summoned Tarot card just. Does not operate. It doesn't get added to the inventory, it doesn't respond to anything, it just. Appears.
  2. Less concerning, but no less annoying, the check for if you have space is broken and doesn't account for if the space you need is the tarot card itself.
rough furnace
rough furnace
chrome widget
#

where is a card's key typically stored?

#

card.config.center.key?

rough furnace
#

Yeah

coral grotto
#

for some reason the custom challenge i'm making seems to REALLY hate custom keys, whenever i try to use one in its definition there's an eventual crash with it complaining about "attempt to index local 'center'"

#

i've checked this channel and this seems to happen when the wrong key is used but i don't think i'm doing that

#

when else could that show up

#

(also less problematically the text for my custom rule doesn't show up even though i have it defined in a localization file)

normal crest
#

create_card just, creates it

#

add_card actually puts it into the respective area

coral grotto
#

i'm not modifying create_card in any way if that's what you're asking

#

i was but the way i was attempting it didn't work so i commented it out but that didn't fix anything

rough furnace
#

I'm not

#

You are trying to get it from a card how did you get that card?

coral grotto
#

it's a challenge i'm not sure what you mean by i'm trying to get it from a card

rough furnace
#

Like can I see the code

coral grotto
#

code i have is this

SMODS.Challenge {
    key = 'grg_chal_grunglest',
    loc_txt = {
        name = 'The Grunglest'
    },
    rules = {
        custom = {
            -- {id = 'ch_c_grg_grunglest'},
        }
    },
    jokers = {},
    consumeables = {
        {id = 'c_grg_grungler'},
    },
    vouchers = {},
    restrictions = {
        banned_cards = {
            {id = 'j_grg_ringoker'},
        }
    },
    deck = {
        type = 'Challenge Deck'
    }
}
#

c_grg_grungler and j_grg_ringoker are all defined

rough furnace
#

Okay and how do you define your joker

#

Or uhh consumabke

coral grotto
#
SMODS.Consumable({
    key = 'c_grg_grungler',
    set = 'Tarot',
    atlas = 'grungler_card',
    pos = {x=0, y=0},
    loc_txt = {
        name = 'The Grungler',
        text = {
            '{C:attention}Shuffles{} all cards',
            'currently in hand'
        }
    },
    can_use = function()
        return G.STATE == G.STATES.SELECTING_HAND or G.STATE == G.STATES.TAROT_PACK
    end,
    config = {
        extra = {
            grungler = "Grungler"
        }
    },
    use = (there's a whole function here but it's long and i don't want to clog up the channel)
})
rough furnace
#

You should not being putting the c_ or your prefix in the id

#

Smods does that for you

coral grotto
#

ah that makes a lot more sense

#

i think i still need to define a prefix somewhere though

#

nvm i have one already

rough furnace
#

In your header/json definition

coral grotto
#

yeah

#

i remove it from the consumable definition right

rough furnace
#

Yeah

#

Also if you do want to see what the game set the I'd of something as you can use DebugPlus and run eval do.hovered.config.center.key on it

coral grotto
#

thanks

#

is this related to why my localization code doesn't seem to be working

return {
    descriptions = {
        misc = {
            v_text = {
                ch_c_grg_grunglest = {"All {C:attention}Tarot{} cards are {C:attention}The Grungler{}"}
            }
        }
    }
}
white spade
#

Oops! The game crashed:
main.lua:1347: bad argument #1 to 'load' (function expected, got nil)

Additional Context:
Balatro Version: 1.0.1n-FULL
Modded Version: 1.0.0~ALPHA-1418a-STEAMODDED
LÖVE Version: 11.5.0
Lovely Version: 0.7.1
Platform: Windows

Stack Traceback

(3) global C function 'load'
(4) main chunk of file 'main.lua' at line 1347
(5) global C function 'require'
(6) LÖVE function at file 'boot.lua:323' (best guess)
Local variables:
c = table: 0x33479538 {identity:false, version:11.5, accelerometerjoystick:true, modules:table: 0x33479588 (more...)}
openedconsole = boolean: false
confok = boolean: true
conferr = nil
(7) global C function 'xpcall'
(8) LÖVE function at file 'boot.lua:362' (best guess)
Local variables:
result = boolean: true
(9) global C function 'xpcall'
(10) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
func = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
inerror = boolean: true
deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])

#

I don't know whats the issue

stiff locust
#

new different problem

#

trying to use the event manager to get this to work but i have no idea how the event manager actually works

#

the joker effect triggers during context.after but I want it to wait until after the scoring animation has played before it does its thing, which I assume would be the purpose of the event manager

#

is there a way to get the event to wait until after the scoring animation is done?

#

wait I figuted it out

#

blockable = true

grim remnant
#

was able to fix the "spectral cards don't actually do anything" issue, and for the most part the "must have room" works, but there's a weird edge case where you can still "buy and use" even if you don't actually have space. what am i missing here?

        if #G.consumeables.cards <= G.consumeables.config.card_limit or self.area == G.consumeables then
            return true
                end
            end,```
chrome widget
#

I have now created a joker that makes flirty comments whenever you buy women jokers

plush cove
rose dragon
chrome widget
#

It's primarily for my mod, which has a bunch of jokers depicting various characters (collaborative mod for the JoJo Fanworks discord server). But for vanilla jokers, I added Lusty (b/c lust?), Hack (who vaguely looks like a butch lesbian), Blueprint and Brainstorm (due to the yuri art), Shoot the Moon (since it's a queen-specific joker), and Driver's License (since she's a trans woman via patch notes). Also egg so I could make a trans egg joke

#

Annoying obv that it inherently isn't compatible with other mods because it requires manually keying in that a joker is a "woman", but it doesn't break or anything, which is the best I can ask for

chrome widget
#

Nods nods

plush cove
#

does it serve any practical purpose besides just being flirty though?

rose dragon
chrome widget
#

The character it represents is a very flirtatious lesbian, so it scales chips based on how many qualifying jokers you also have

plush cove
chrome widget
#

TRUE

plush cove
#

balatrwoke

rose dragon
# plush cove

what about objects (business card, 8 ball, gros michel)? do i just write "it"?

plush cove
#

/j

rose dragon
#

anyway, back from the joker gender discussion what no updates does to a mf, i have been considering making a program similar to curseforge that lets you easily download, publish, enable and disable mods, along with support for dependencies and statistics. should i make this or will nobody here really use it?

normal crest
#

it'd probably be preferable to contribute to that rather than make your own

normal crest
#

the license is GPL-3.0

rose dragon
#

phew

normal crest
#

it's on a very early alpha release and to my knowledge it doesn't support linux

manic rune
#

whats the thing that makes text wavy?

normal crest
#

DynaText I think

manic rune
#

i will take a look at that, thanks!

normal crest
#

just go to functions/UI_definitions.lua and ctrl f DynaText

grim remnant
paper zealot
# manic rune whats the thing that makes text wavy?

For DynaText objects, there's a few different kinds of movement.
Try out bump_rate = <number> and bump_amount = <number>,
float = <boolean>,

        speed = <number>,
        amount = <number>,
        silent = <boolean>
    }
        speed = <number>,
        width = <number>,
        amount = <number>,
        silent = <boolean>
    }
manic rune
frosty dock
#

the "or equal" part of that happens when your slots are full

paper zealot
frosty dock
#

thanks I just noticed that

grim remnant
normal crest
#

unless it was a negative consumable

chrome widget
grim remnant
#

for reference, this is the current code

    key = 'acePentacles',
    set = 'Tarot',
    loc_txt = {
        name = 'Ace of Pentacles',
        text = {
            "Creates a random {c:blue}Spectral{} card",
            "{C:inactive}(must have room)"
        }
    },
    atlas = 'Tarot',
    pos = { x = 0, y = 1},
    cost = 3,
    can_use = function(self,card) --check for if there's space! KNOWN BUG: will not care if there's no space for buy & use.
        if #G.consumeables.cards <= G.consumeables.config.card_limit or self.area == G.consumeables then
            return true
                end
            end,
    use = function(self, card, area, copier)
        G.E_MANAGER:add_event(Event({ --make a spectral card!
            trigger = "after",
            delay = 0.4,
            func = function()
                play_sound("timpani")
                SMODS.add_card{
                    set = "Spectral"
                }
                -- card:juice_up(0.3, 0.5)
                return true
            end,
        }))
        delay(0.6)
    end,
}```
manic rune
#

what is the key of a modded consumable, is it c_(prefix)_name oooor?

normal crest
#

You had the right idea with the area check, but should use card instead of self, and account for your consumable being negative

chrome widget
#

But yeah specifically, when you create consumables, you have to do this:
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1
and then once you're finished creating the card, do
G.GAME.consumeable_buffer = 0

#

The game creates a buffer space when it knows it needs to create a card and then removes it once the card has been added

manic rune
#

epic, thanks once again

grim remnant
chrome widget
#

Put expanding the buffer before you send the event, and then reduce the buffer after the juice_up() function in the event

grim remnant
#

good news: it doesn't have the "buy and use" when inventory is full anymore!
bad news: ...the original bug is back.

normal crest
grim remnant
#
        if #G.jokers.cards < G.jokers.config.card_limit or self.area == G.jokers then
            return true
                end
            end,
    use = function(self, card, area, copier) --code from cryptid's gateway, will almost inevitably need to adjust
        G.E_MANAGER:add_event(Event({ --here
            trigger = "after",
            delay = 0.4,
            func = function()
                play_sound("stla_stellatedGet")
                SMODS.add_card{
                    set = "Joker",
                    rarity = "stla_Stellated"
                }
                card:juice_up(0.3, 0.5)
                return true
            end,
        }))
        delay(0.6)
    end,
}```
scarlet spire
#

how can I recalculate a hand if a joker changes the cards in context.before?

normal crest
grim remnant
#

Ah

#

yes i did ;P

#
        if #G.consumeables.cards < G.consumeables.config.card_limit or self.area == G.consumeables then
            return true
                end
            end,
    use = function(self, card, area, copier)
        G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1
        G.E_MANAGER:add_event(Event({ --make a spectral card!
            trigger = "after",
            delay = 0.4,
            func = function()
                play_sound("timpani")
                SMODS.add_card{
                    set = "Spectral"
                }
                -- card:juice_up(0.3, 0.5)
                G.GAME.consumeable_buffer = 0
                return true
            end,
        }))
        delay(0.6)
    end,```
#

there we go

normal crest
#

Yeah all you need is use card instead of self in can_use

grim remnant
#

so like, just function(card)?

normal crest
#

No

#

The function definition is correct

#

self.area -> card.area

grim remnant
#

alrighty, that worked! :o

normal crest
#

Now make your consumable negative

#

and you'll run into another issue

grim remnant
#

...we uh, have no idea how to check for "is negative" in this equation (haven't ever needed to check edition before now), and it's almost 4am, you're gonna have to spell this one out, apologies ^^:

normal crest
#

to check if any card is negative you can do if card.edition and card.edition.negative

#

the first check is necessary because edition could be nil

grim remnant
#

will look into this tomorrow, uh, it's a tad late for me to be futzing with if statements beyond what we've already done

manic rune
#

||what if theres a mod that allows jokers to have sexual intercourse with each other for a new joker, just sayin||

chrome widget
#

Sounds like a lot of work to implement

wintry swallow
#

I wonder how easy it would be to create a mod updater that uses git

manic rune
#

no clue why and how i randomly came up with that idea 😭

chrome widget
#

Throw the jokers in the daycare and walk in the grass back and forth for a few thousand steps

manic rune
#

thats crazy, pokermon should add that

#

❤️

chrome widget
#

We've completed like 30 ish jokers for my mod so far which is fun!!!

#

I'm actually kinda enjoying the pixel art

wintry swallow
#

@manic rune what side of the bed did you wake up on? You would have to write that code entirely exclusively from the game since the game is not designed to have that type of functionality at all. Actually lol you would be better off making Balatro 2.0

wintry swallow
#

Well hopefully you found what you were looking for when you did that xD

normal crest
#

I don't think it'd be as hard to implement as you make it sound

manic rune
#

actually, yeah, ive seen mods more complicated than that ngl

#

its a bit similar to fusion jokers if i have to make a comparison

wintry swallow
#

It depends on what you're looking for. Most of the game uses one type of animation style

#

The game uses images and particals There aren't any sprites and vectors that I can think of. This game would probably run on a potato

normal crest
#

You know, I don't think you need an animation for it

#

I think it's fine to leave it up to imagination

wintry swallow
#

I think it's too much work when you can have a random AI create whatever fan art you want

#

Btw... My git updater for Balatro. Took 5 minutes to make

neat plover
#

Doodle Joker

1 in 4 chance to copy the ability of the joker to the right. (Must be blueprint compatible)

normal crest
wintry swallow
#

Inconvenient? I have like 8 mods

neat plover
#

but why would you use git?

wintry swallow
#

It's not really something I plan on doing all the time. I just don't want to go looking for everything when I reset my PC again.

normal crest
nocturne garnet
#

dimserene did that right

neat plover
#

idk but what does it changes?

wintry swallow
#

I uploaded my custom collection because I lost the last one I made. I spent about 12 hours today polishing it this time

scarlet spire
#

honestly I probably should connect my smods install to git considering how often I update it

wintry swallow
#

I consolidated 5 different mods for no other reason than to say I could

normal crest
wintry swallow
#

I did find out the answer to that question I asked hours ago. Playing card is not a defined key in malverks theme engine

normal crest
#

doing it manually is still a bit of a chore, but you can easily write scripts that automate the process

wintry swallow
#

If I try and use the defined key in the game code I get a nil error. Which is fun. Honestly I should just write it myself

#

Nil is a new thing for me. I'm used to IRQ errors in regards to memory.

marble flint
#

If we're sharing git updaters, here's mine (in batch (derogatory)). needs the weird windows version of git but very nice otherwise

plush cove
#

you guys use git updaters?

#

the only script-related thing I knew Balatro modders used was an upscale script for 1x -> 2x

normal crest
#

no, I manually look through the mods' commits and write the code myself in my local copy

iron iron
normal crest
#

oh well, you're missing a comma in your json file

iron iron
#

i changed some of the names but this was it

#

holy shit i am

normal crest
#

make sure you have Viridis.png under Mods/your mod/assets/1x and /2x

plush cove
#

cringe upscaling script

marble flint
#

here's my cringe upscaling script using imagemagick: for /F %%x in ('dir /B/D 1x') do magick 1x\%%x -scale 200%% 2x\%%x

#

although this does change the metadata on unchanged atlases making commits rather annoying

#

does aseprite also do that?

iron iron
plush cove
plush cove
iron iron
#

i dont need feedback lmao

#

by test i literally just mean load it and see if it crashes

normal crest
#

random people dm you on discord asking if you want to test their game

iron iron
#

ohhhhh

marble flint
#

at least this is easily vettable (looks safe to me but check for yourself if you choose to download it)

iron iron
#

yall i dont know shit abt malware just lettin you know

marble flint
#

sounds like something a malware-doer would say /nsrs

iron iron
#

also ive been here for like a year so

plush cove
#

and you havent had Balatro on PC?!

iron iron
marble flint
rose dragon
iron iron
#

ok

#

thank you for letting me know 👍

plush cove
#

like I respect the effort and all, but

you can't really mod a game that you don't have access to the files of

marble flint
#

a Large portion of modding this game is ctrl-shift-f'ing its code

iron iron
#

ehhh ill figure it out

#

i mean i can just look at the code of other mods

plush cove
marble flint
#

that attitude is honestly so refreshing compared to a hundred "how do I do X thing in Y mod" "go look at its code" exchanges

plush cove
iron iron
#

name one thing in balatro that i cant get through mods

marble flint
#

my util.lua is Terrifying

plush cove
#

although I have still made my own code (like this)

normal crest
#

surely those aren't global

plush cove
normal crest
#

i'd not recommend making global functions like that

marble flint
normal crest
#

conflicts with other mods

marble flint
normal crest
#

if any other mod decides they need a utility function and happen to put the same name as yours

#

it will cause issues

marble flint
plush cove
normal crest
#

yeah

neat plover
normal crest
#

I do the same

#

All my globals in one global table

plush cove
#

alright here I go

marble flint
#

you don't have to use my terrible naming conventon though

normal crest
#

but it's pretty much necessary

neat plover
#

does anyone have sample joker code or simply the one for blueprint

plush cove
#

these can probably be left alone since they're meant for another mod in the first place lol

normal crest
neat plover
#

how?

normal crest
#

Mods/lovely/dump/card.lua

#

ctrl + f search for "blueprint"

rose dragon
neat plover
#

okay

#

thanks

desert ore
#

Can I have a joker's base sell value be less than half at default?

marble flint
plush cove
#

wasnt really that much of an endeavor lol

desert ore
marble flint
rose dragon
plush cove
marble flint
neat plover
#

if self.ability.set == "Joker" and not self.debuff then if self.ability.name == "Blueprint" then local other_joker = nil for i = 1, #G.jokers.cards do if G.jokers.cards[i] == self then other_joker = G.jokers.cards[i+1] end end if other_joker and other_joker ~= self then context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1 context.blueprint_card = context.blueprint_card or self if context.blueprint > #G.jokers.cards + 1 then return end local other_joker_ret = other_joker:calculate_joker(context) if other_joker_ret then other_joker_ret.card = context.blueprint_card or self other_joker_ret.colour = G.C.BLUE return other_joker_ret end end end

rose dragon
desert ore
neat plover
rose dragon
rose dragon
plush cove
marble flint
rose dragon
#

screenshot of a spritesheet of every single frame in bad apple, which i plan on using for a joker (5325x8360 pixels, 6MB)

plush cove
rose dragon
plush cove
#

you are fucking deranged

rose dragon
#

2x is 14.6mb

crisp coral
#

images are loaded in powers of two, so your 5325x8360 atlas will be loaded as... 8192x16384 i believe?

rose dragon
crisp coral
#

i'm still here, you did not need to ping me

rose dragon
crisp coral
#

turn this off

rose dragon
crisp coral
#

silent only removes the push notifications, which i already have all disabled

#

the ping icon and stuff are still present

rose dragon
#

anyway, why does this crash and how do i fix it?

SMODS.Atlas({
    key = "badapple",
    px = 71,
    py = 95,
    path = "badapple.png",
    atlas_table = 'ANIMATION_ATLAS',
    frames = 50
})

SMODS.Joker({
    key = "bad_apple",
    loc_txt = {name = "Bad Apple", text = {"Does nothing (yet!)"}},
    atlas = "badapple",
    config = { extra = {}},
    loc_vars = function(self, info_queue, card)
        return {
            vars = {

            }
        }
    end,
    calculate = function(self, card, context)

    end
})
crisp coral
#

jokers dont pull from animation atlases

rose dragon
plush cove
#

have you checked how Jimball works in Cryptid or 4D Joker in Maximus?

rose dragon
#

update: i was able to get it working by stealing borrowing maximus' code
-# which is also stolen from cryptid

crisp coral
#

there's a Game.update hook that changes the position

wintry solar
#

There also that animated sprite mod someone was working on that I can’t find

marble flint
paper comet
#

I'm sure this has probably alr been done before, but how do I get the held cards in hand and the possible playable poker hands?

#

I've been trying to do it for a long time and im a bit stuck

marble flint
#

anyhow, sleep time

olive moth
#

sup mod wizards

#

what's the context word/s for "activate after boss blind defeat"?

#

I'm a bit lost

prisma loom
#

So Ive managed to make my Joker not go negative in money reward but I wonder how to make it work like other food jokers so it could just debuff itself
UPD: nvm I figured it out! :D

#

whats the command

#

or function

iron socket
#
    key = 'rhanged',
    loc_txt = {
        name = 'TBD',
        text = {
            "Adds {C:attention}2{} cards",
            "of random {C:attention}rank and suit{}",
            "to your hand"
        }
    },
    set = 'Tarot',
    atlas = 'ReverseTarots',
    pos = { x = 1, y = 0 },
    cost = 3,
    config = {extra = {generate_limit = 2}},
    loc_vars = function(self, info_queue, card)
        return {vars = {self.config.extra.generate_limit}}
    end,
    can_use = function(self, card, area, copier)
        if G.STATE == G.STATES.SELECTING_HAND or G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK then
            return true
        end
        return false
    end,
    use = function(self, card)
        G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
            play_sound('tarot1')
            used_tarot:juice_up(0.3, 0.5)
            return true end }))
        for i=1, self.config.extra.generate_limit do
            local used_tarot = card or self
            G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
                    local _card = create_playing_card({front = pseudorandom_element(G.P_CARDS, pseudoseed('cert_fr')), center = G.P_CENTERS.c_base}, G.hand, nil, i ~= 1, {G.C.SECONDARY_SET.Spectral})
                    G.GAME.blind:debuff_card(_card)
                    G.hand:sort()
                return true end}))
            playing_card_joker_effects({true})
        end
    end
}```
Made this reverse Hanged Man to randomly generate two normal cards into your hand. Works perfectly fine, but the cards generate from the bottom left of the screen and then fly into the hand. Looks a little odd, any pointers? Thanks
olive moth
wintry solar
#

Add ``and G.GAME.blind.boss` iirc

olive moth
#

ty in advance, omw to test it

#

btw, where can i familiarize myself with all the "G.(something)" bits? what is it exactly and how does it work?

dreamy thunder
#

how to use "G.GAME[key:lower() .. '_rate']" ?

sturdy compass
#

Bump!

prisma loom
#

So i want to make an effect that retriggers all stone cards but the game gives me an error at line 19

#

Im not sure what's wrong

mystic river
#

what's the error

prisma loom
prisma loom
red flower
#

it might be order of operations on the condition, try putting the cardarea checks in parenthesis

dreamy thunder
#

How can i fix it so my custom consumable with a custom consumable type spawning "Joker" in the shop when removed from the pool?

onyx sonnet
#
    key = "aroace",
    config = { extra = { repetitions = 0 } },
    unlocked = true,
    discovered = true, 
    blueprint_compat = true,
    eternal_compat = true,
    perishable_compat = true,
    rarity = 2,
    --Using Neato's Hatsune Joku as a placeholder
    atlas = "NeatoJokers",
    pos = { x = 5, y = 0 },
    cost = 6,
    calculate = function(self, card, context)
        if context.cardarea == G.play and context.repetition and not context.repetition_only then
            if context.other_card:get_id() == 14 and context.other_card ~= context.scoring_hand[table.getn(context.scoring_hand)-1] then
                card.ability.extra.repetitions = card.ability.extra.repetitions + 1
            end
            if context.other_card == context.scoring_hand[table.getn(context.scoring_hand)-1] then
                return {
                    message = localize('k_again_ex'),
                    repetitions = card.ability.extra.repetitions,
                    card = self,
                }
            end
        end
    end

Hello, im trying to make a joker that retriggers the rightmost scored card for each ace previously scored this hand, but i keep getting errors related to values of nil being returned, can anyone help me with this?

neat plover
#

i want to make a left side blueprint with rng, what do i need to change?

neat plover
#

its syntax errors

#

always

#

if its error 141

onyx sonnet
#

if it were syntax id be getting errors for unexpected symbols, this is a logic error because the code gets run just fine until it explodes

neat plover
#

nah im telling you i spent two hours because of a comma

onyx sonnet
#

the game, i jokingly say explode instead of crash

#

syntax errors get flagged immediately when launching the game

#

say if i removed one of the first commas for example

neat plover
#

what does the log say?

onyx sonnet
#

id get something like this which reports an unexpected symbol, which means there is a syntax error prior to it

lavish lake
onyx sonnet
#

but my error only happens when the game attempts to score the last card in the played hand

#

so its definitely not syntax

neat plover
olive moth
#

i might be asking questions here more often than i actually code, ngl

#

anyway

neat plover
#

thats what learning is all about

olive moth
#

anyone has an idea on how to "get" all cards of a certain suit and loop over them to modify them?

#

i can kinda guess the modify part

neat plover
#

played cards?

olive moth
#

but i have no idea how to reference the cards

olive moth
#

played, unplayed, in hand, debuffed

#

etc

neat plover
#

well i cant help you there

olive moth
#

time to wait for the big guys and gals to help 🥲

neat plover
#

exactly what im waiting for

olive moth
#

god knows i've had a few aneurysms reading the smods documentation

marsh basalt
#

Can't you iterate over the card areas?

olive moth
#

?

#

as in?

marsh basalt
#

G.hand, G.discard, G.deck are all global variables

olive moth
#

oooh

marsh basalt
#

G.hand.cards gets a table with the cards in hand

olive moth
marsh basalt
#

I don't think that is listed anywhere in the docs

#

I've been dwelling in Balatro's code to learn how to do things (a la open the .exe with 7zip or whatever you're using)

olive moth
#

gahdamn

marsh basalt
#

Not sure if there's a table that has every card in the player's possession at once but I know about the ones I listed, there's probably one for cards that have been played as well

olive moth
#

i guess i can just loop over all places cards can be?

lavish lake
wintry solar
olive moth
#

inefficient but at least it'll maybe work

marsh basalt
lavish lake
wintry solar
#

G.playing_cards is what you're looking for

neat plover
onyx sonnet
iron socket
olive moth
#

btw, digging through the main game's card.lua in parallel rn, what's the difference between suit/face and suit/face_nominal?

neat plover
#

i shouldve chosen an easier idea

lavish lake
#

guys i need ideas for the joker "K" in my mod. what should it do?

neat plover
#

are you doing the alphabet????

prisma loom
lavish lake
olive moth
prisma loom
#

14

#

aka config.center

olive moth
lavish lake
onyx sonnet
wintry solar
#

yes

olive moth
olive moth
onyx sonnet
#

thats an issue, im trying to make the repetition increase only affect the current hand

olive moth
onyx sonnet
#

but it seems to continuously stack, and adding a statement to put it back to 0 before the return makes it not do anything

#

hmmm

lavish lake
manic rune
olive moth
prisma loom
#

my bad

lavish lake
#

i mean no scope creep am i right guys?

#

anyways what should the "K" joker in my mod do?

#

nobody answered properly yet

neat plover
jovial harness
lavish lake
jovial harness
#

OH

manic rune
#

wat rarity is the joker

marsh basalt
#

Give +N mult per King played?

lavish lake
manic rune
#

each king in hand has a certain chance to either give cash or chips, probably

lavish lake
#

but slightly more complex

olive moth
#

i have a stupid idea

manic rune
#

yeah, im thinkin about making them go well together ❤️

#

ok wait, so uh

lavish lake
#
Kings held in hand have a
1 in 2 chance to give 1.25X mult and
1 in 5 chance to give 3$
olive moth
#

1/11 chance of upgrading played hand per each played King

manic rune
#

hm

manic rune
#

with oops, all 6s, that is more cracked than even baron lol

marsh basalt
#

Baron+

lavish lake
onyx sonnet
#

you overthrew reserved parking and baron in one fell swoop

olive moth
#

:3

lavish lake
#

i debuffed the stats

onyx sonnet
#

would baron's biggest lover stab him in the back like this

olive moth
manic rune
#

i have another idea which is increasing the rank of all played cards if they are less than king, idk

olive moth
#

(1 of 11 because K is the 11th letter, yadda yadda)

lavish lake
manic rune
#

whats hrt 😭

lavish lake
manic rune
olive moth
onyx sonnet
# manic rune whats hrt 😭

Hormone Replacement Therapy, when people take things like Estrogen or Testosterone to transition and look more feminine or masculine

lavish lake
#

I want the joker to mean "oKay..." instead of "King"

neat plover
olive moth
jovial harness
#

If you clear a blind in a single hand with no discards, gives money. "k, next"

olive moth
#

people often use "k" instead of "okay" when they're nonchalantly ignoring something/someone

#

the joker lets cards ignore debuffs

manic rune
# neat plover wait really??
local cardPos = 0
local other_card = nil
for i,v in ipairs(G.jokers.cards)
  if v == card then
    cardPos = i
  end
end
if cardPos <= 1 then 
  return 
else
  other_card = G.jokers.cards[cardPos - 1]
end
context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1
context.blueprint_card = context.blueprint_card or card

if (context.blueprint > #G.jokers.cards + 1) or not other_card then
  return
end

local other_joker_ret, trig = other_joker:calculate_joker(context)
context.blueprint = nil
if other_joker_ret or trig then
  if not other_joker_ret then
    other_joker_ret = {}
  end
  other_joker_ret.card = context.blueprint_card or card
  context.blueprint_card = nil
  other_joker_ret.colour = G.C.GREEN
  other_joker_ret.no_callback = true
  return other_joker_ret
end
context.blueprint_card = nil
#

put this inside your calculation

#

and i think it should be good

neat plover
lavish lake
olive moth
#

yaaaay

manic rune
#

its scrap code from my mod, it might not even work so tell me if it bugs out lol

olive moth
#

bro imma be real, why do you ask for suggestions if you didn't take even one into consideration 😭

manic rune
#

i dont see a starting point here but aight 😭

#

you r running on a whole another track rn

olive moth
#

yea

#

to each their own tbh, you do you

neat plover
neat plover
#

it puts everything on the same column when i copy

manic rune
#
   calculate = function(self, card, context)
      local cardPos = 0
      local other_card = nil
      for i,v in ipairs(G.jokers.cards) do
        if v == card then
          cardPos = i
        end
      end
      if cardPos <= 1 then 
        return 
      else
        other_card = G.jokers.cards[cardPos - 1]
      end
      context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1
      context.blueprint_card = context.blueprint_card or card
      
      if (context.blueprint > #G.jokers.cards + 1) or not other_card then
        return
      end
      
      local other_joker_ret, trig = other_joker:calculate_joker(context)
      context.blueprint = nil
      if other_joker_ret or trig then
        if not other_joker_ret then
          other_joker_ret = {}
        end
        other_joker_ret.card = context.blueprint_card or card
        context.blueprint_card = nil
        other_joker_ret.colour = G.C.GREEN
        other_joker_ret.no_callback = true
        return other_joker_ret
      end
      context.blueprint_card = nil
   end,
lavish lake
manic rune
#

💔

neat plover
#

cant thank you enough

olive moth
jovial harness
#

ughhh what's the function to set an enhancement again? my brain is refusing to let me remember it

neat plover
manic rune
#

uhh

#

v:set_ability(G.P_CENTERS.m_wild,nil,true)

manic rune
#

just change the "v" to the card you want to change

olive moth
manic rune
lavish lake
olive moth
#

House has a similar approach to his work generally (not dissing you just in case)

manic rune
#

oof

olive moth
#

he asks his team for possible diagnoses, discards them all most of the time, and assigns his own (he's right most of the time)

#

anyway, we've gone way off-topic

random sleet
#

BONE CARD

olive moth
manic rune
#

SANS???

olive moth
#

/j

manic rune
random sleet
manic rune
#

i eamea

#

i mean

#

does it reset

olive moth
#

ooooooooooooooooooooooooohhhhh

manic rune
#

after each ante or something

olive moth
#

that's so genius actually

random sleet
#

no its just dead stuff

manic rune
#

cool

random sleet
#

graveyard is out NOW update your autumn mood modding mods

olive moth
#

holy hell there's so much possible stuff in this concept

#

damn

manic rune
#

is there a way to revive cards from graveyard ❤️

random sleet
#

(bone cards arent)

#

it exists in the code

#

i havent made anything that does it yet tho

manic rune
#

epic

random sleet
#

it is a thing that cards know how to do

olive moth
lavish lake
random sleet
olive moth
#

on use, takes all cards in the graveyard and plays them once as one giant hand

manic rune
olive moth
#

needs a GIANT drawback tho

#

maybe wiping the graveyard and/or decreasing hands

manic rune
#

lowkey i want to add smt like a new zone too, but im afraid if i do so then my mod will potentially become incompatible with some mods

#

bruh

olive moth
random sleet
#

well the graveyard is not visible on-screen

#

you have to look in the deck and then in a tab

manic rune
#

mmm

#

i guess not many mods do that, so its a pretty safe choice

random sleet
olive moth
#

arrrgh the urge to make add-on mods after i kinda get to know my way around the code

random sleet
#

you are welcome to make mods that depend on AMM

#

just know i'm a weird freak and keep adding shit to it

manic rune
#

it should be relatively easy once you remember the basic stuffs that balatro uses for their code

random sleet
#

and i dont document shit because im lazy

olive moth
#

like Tainted magic for Thaumcraft in minecraft, if that rings any bells for yall

random sleet
#

(but my code is generally pretty readable LinkPray )

manic rune
#

i legit dont play that many mods in minecraft because my laptop is barely running balatro 💀

iron socket
#

Looking to make a tarot that when used gives a certain tag. Anyone know how that method would be called?

manic rune
#

like, i doubt anyone here ever experienced not having enough ram to even run balatro

#

lol

#

and thats a game less than 100 freaking megabytes 😭

olive moth
manic rune
hushed field
olive moth
manic rune
#

oh wait nvm

#

its tags

#

not seals

#

my bad

olive moth
#

diet cola

random sleet
olive moth
#

gives you a double tag

iron socket
#

Oh!

#

I totally forgot about that

lavish lake
#

Guys i can give ideas for your jokers or consumables or seals or anything, just ask me and provide me with the basic context

hushed field
iron socket
#

I'll check there first and then come back if I still can't figure it out

hushed field
olive moth
#

ok i'm starting to kinda acclimatise here

#

(good)

manic rune
#

nah but hear me out, what if you add a challenge which switches between the graveyard and your deck every round

olive moth
#

i was VERY hesitant to speak initially

manic rune
#

and your deck is split in half, so that graveyard has 26 cards while your deck has 26 cards

olive moth
manic rune
#

whats that 😭

olive moth
#

it's a character from the latest The binding of Isaac DLC

manic rune
#

oh

#

i havent played the binding of issac yet sadly

random sleet
#

but actually tho i love that challenge idea

#

can i put it in my docs

olive moth
#

basically it's exactly that, it has two inventories and changes between them for every cleared room

manic rune
#

ye sure

olive moth
#

(or when using its built-in item)

cursive flicker
#

misclick lol

olive moth
#

2 builds 1 character

manic rune
#

lmao its fine

manic rune
#

or maybe its not, idk

olive moth
#

yeaaaa

olive moth
manic rune
#

oh

random sleet
#

playing two characters with one character's total amount of items

olive moth
#

yesss

#

exactly

random sleet
#

guess which binding of isaac character i'm talking about

manic rune
#

issac

olive moth
#

oh

manic rune
#

❤️

olive moth
#

the twins?

random sleet
#

a joke so funny they did it twice

olive moth
#

i forgor their names ahh

random sleet
#

jacob&esau

olive moth
#

jacob & esau

#

yeyeye

random sleet
iron socket
olive moth
#

the struggle of a programmer

manic rune
#

nah dw, i sat through my code for 3 hours tryna fix smt until the wizard himself told me to add 2 freaking lines to fix it

#

😭

olive moth
#

i stumble in my OWN code, it's a whole other can of worms looking through others' (mostly unannotated!) code

manic rune
#

else my version of blueprint completely ignores some jokers, which is a bit annoying

prisma loom
manic rune
#

oh damn, anything else?

olive moth
#

btw, i'm (once again) diggin through source code here, and i can't find one thing

manic rune
#

wat is it

olive moth
#

does one refer to a card's suit with the suit name or some number?

manic rune
#

oh, name

#

Diamonds, Hearts, Clubs, Spades

olive moth
#

rarity threw me for a loop with this

manic rune
#

its a string

olive moth
#

TYYYY

manic rune
#

:get_suit() will return one of that

prisma loom
#

error at line 14

manic rune
#

else ur changing the edition of ur jker

manic rune
#

i mean

#

u got the crash log?

prisma loom
onyx sonnet
manic rune
#

mmm

#

alright, so

#

line 13 should probably be if context.cardarea == "G.play and context.individual then
line 14 should be if context.other_card and context.other_card.config.center == G.P_CENTERS.m_stone then

manic rune
onyx sonnet
manic rune
#

ohhhhhhh

#

id have said thats pretty broken but i realized Aces got barely any support jokers for them lol

tepid crow
manic rune
#

because its hatsune miku

onyx sonnet
#

hatsune miku

manic rune
#

bruv

prisma loom
nocturne garnet
#

thats a TWO...

manic rune
#

uhh

#

i think thats how its meant to work

#

like, each played A will make the joker retrigger the last card once

nocturne garnet
onyx sonnet
nocturne garnet
#

oh

onyx sonnet
#

i forgot to update the localization files

nocturne garnet
#

darn

manic rune
prisma loom
#

do I need to define other_card somehow?

#

like local other_card

#

(i dont really understand)

manic rune
#

thats odd, it should work

nocturne garnet
manic rune
#

im not tripping right 😭

#

it got past the if statement in line 14 so context.other_card should be a playing card

prisma loom
#

I can send a full crash log

#
[SMODS HandsomeDevils "jokers/stone_mask.lua"]:19: attempt to index global 'other_card' (a nil value)

Additional Context:
Balatro Version: 1.0.1n-FULL
Modded Version: 1.0.0~ALPHA-1404b-STEAMODDED
LÖVE Version: 11.5.0
Lovely Version: 0.7.1
Platform: Windows
Steamodded Mods:
    1: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.3.1, Uses Lovely]
    2: Item Remover by elial1 [ID: ItemRemover, Priority: -1]
    3: HD by Kars [ID: HandsomeDevils, Version: 1.0.0, Uses Lovely]
Lovely Mods:

Stack Traceback
===============
(3) LÖVE metamethod at file 'boot.lua:352'
Local variables:
 errhand = Lua function '(LÖVE Function)' (defined at line 553 of chunk [lovely debugplus.console "console.lua"])
 handler = Lua function '(LÖVE Function)' (defined at line 553 of chunk [lovely debugplus.console "console.lua"])
(4) Lua field 'func' at file 'jokers/stone_mask.lua:19' (from mod with id HandsomeDevils)
Local variables:
 (*temporary) = nil
 (*temporary) = nil
 (*temporary) = table: 0x2bd76880  {REAL:17.922341812657, REAL_SHADER:17.922341812657, TOTAL:21.93537863624 (more...)}
 (*temporary) = number: -2.62423
 (*temporary) = string: "attempt to index global 'other_card' (a nil value)"
(5) Lua method 'handle' at file 'engine/event.lua:99'
Local variables:
 self = table: 0x2bc88388  {start_timer:true, timer:TOTAL, blockable:true, trigger:immediate, func:function: 0x2c55c498 (more...)}
 _results = table: 0x2c657e00  {blocking:true, pause_skip:false, time_done:false, completed:false}
(6) Lua method 'update' at file 'engine/event.lua:182'
Local variables:
 self = table: 0x2bf86788  {queue_last_processed:6.3333333333333, queues:table: 0x2bf867b0, queue_dt:0.016666666666667 (more...)}
 dt = number: 0.00605875
 forced = nil
 (for generator) = C function: next
 (for state) = table: 0x2bf867b0  {unlock:table: 0x2bf867d8, other:table: 0x2bd6e258, tutorial:table: 0x2bf86828 (more...)}
 (for control) = number: nan
 k = string: "base"
 v = table: 0x2bf86800  {1:table: 0x2c466718, 2:table: 0x2bc88388, 3:table: 0x2c37b058, 4:table: 0x2c2cf230 (more...)}
 blocked = boolean: false
 i = number: 2
 results = table: 0x2c657e00  {blocking:true, pause_skip:false, time_done:false, completed:false}
(7) Lua upvalue 'gameUpdateRef' at file 'game.lua:2524'
Local variables:
 self = table: 0x2bd76240  {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x2c79fc68 (more...)}
 dt = number: 0.00605875
 http_resp = nil
(8) Lua method 'update' at Steamodded file 'src/ui.lua:84' 
Local variables:
 self = table: 0x2bd76240  {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x2c79fc68 (more...)}
 dt = number: 0.00605875
(9) Lua field 'update' at file 'main.lua:996'
Local variables:
 dt = number: 0.00605875
(10) Lua function '?' at file 'main.lua:935' (best guess)
(11) global C function 'xpcall'
(12) LÖVE function at file 'boot.lua:377' (best guess)
Local variables:
 func = Lua function '?' (defined at line 906 of chunk main.lua)
 inerror = boolean: true
 deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"])
 earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"])
manic rune
#

.

#

ohhhh

#

you are missing a (

prisma loom
#

bruh

#

kill me

manic rune
#

nah its fine 😭

prisma loom
#

HOW TF DID THIS HAPPEN

manic rune
#

it happens to all of us dw 😭

obtuse silo
#

how do i get the tips to show up for additional elements like with glass joker

prisma loom
prisma loom
manic rune
#

ok what

#

😭

#

hm

prisma loom
#

its just black magic

manic rune
#

how the fuck is other_card returning as nil, what

prisma loom
#

surely I didnt forget to add some random comma somewhere

prisma loom
normal crest
#

context will have changed by the time your event runs

prisma loom
grim remnant
#

hey rq is it a bad sign when we're sketching the code we want to write out in pseudocode, before we even write any actual code,

manic rune
normal crest
prisma loom
manic rune
#

i didnt know that was necessary, damn

manic rune
#

but hey, if it works then it works

prisma loom
#

Wrong placement?

manic rune
#

in the event

#

you should use othercard

#

instead of context.other_card

prisma loom
#

yeah right, I gave it a name

#

I should use

#

For some reason editions are cycling

manic rune
#

i mean

#

huh

prisma loom
#

or rather it triggers twice?

#

ig

manic rune
#

oh wait

#

line 13, you should add context.individual too

#

and hopefully it will fix

prisma loom
#

my bad, sorry

manic rune
#

oh lel

#

its fine

#

shouldnt have taken that long to fix this tbh, im too inexperienced, sorry for having to stick around with me 💀

prisma loom
#

Thanks everyone for help! I'll credit ya in the mod if you dont mind @manic rune @normal crest

manic rune
#

if you want then sure ❤️

normal crest
#

I don't need to be credited

ionic timber
#

how does one save the stats of a joker when continuing a round (after closing the game for instance)

next wasp
#

guys where can I download Jens almanac

olive moth
#

okay so, i'm trying to make a joker that turns every Heart card the player has in the deck into a Gold card, then delete itself

#

i'll figure out the delete itself part later

#

am i doing the turn every heart gold part right?

manic rune
olive moth
#

or did i get hit with godotbrain again

olive moth
manic rune
#

also

#

that for loop is wrong

#

it should be:

for index,x in ipairs(G.playing_cards) do
    (insert code here)
end
olive moth
#

oooooh

manic rune
olive moth
#

aight, ty once again

manic rune
#

mhm, np

next wasp
minor furnace
manic rune
#

they should already do that if we are talking about the ability.extra table

olive moth
#

(i'm making like, obvious syntax errors here, but every lua tutorial i looked at was either explaining nothing or speaking elvish, so i'm kinda trying to figure it out on the fly 🥲 )

manic rune
olive moth
#

ok, let's test it out

chrome widget
olive moth
ionic timber
manic rune
#

huh

#

they dont save?

ionic timber
#

nope, for some reason they don't

manic rune
#

thats odd

ionic timber
#

like for example an infinite stacking x_mult in self.config.extra.x_mult doesn't save

manic rune
#

can you show me your code?

ionic timber
#

yeah I'll show you one example

tall tangle
hushed field
tall tangle
#

Other than potential vampire

olive moth
tall tangle
#

OHHHHHH

olive moth
#

it's like a convoluted consumable

ionic timber
#

if it doesn't I'll send the code

tall tangle
olive moth
hushed field
tall tangle
#

Debuff until next round or ante so that it doesn't feel like a useless one-off, unless that's the entire point of it or you have synergies for it

hushed field
#

nvm, i don't think that was correct, haha

tall tangle
#

Seems to make sense to me

#

Do feel free to hit me with the "no, no I don't think I will"

olive moth
ionic timber
#

so card.config maybe.. ?

tall tangle
#

Given that I know... ONE thing about what you're doing and not even the full scope of that

olive moth
#

it makes every card of a certain suit in your deck on proc

manic rune
#

well for one, you can make the suit change lol

tall tangle
olive moth
#

(it was hearts but i changed it to diamonds since it makes more sense)

hushed field
olive moth
tall tangle
#

Ah. Okay so that makes sense then.

manic rune
#

that seems more like an uncommon joker ability if anything honestly, unless you are providing jokers which support gold cards

olive moth
tall tangle
#

So it's not "turns all diamonds in deck to gold cards and self destructs"
It's "upon beating a boss blind, turns all diamonds in deck to gold cards and self destructs"

olive moth
#

it's a mishmash of jokers based on random characters from various media

tall tangle
#

Because what I was seeing was an effect with no trigger.
You gotta pair an effect with a trigger.

olive moth
#

and this one joker is Sisyphus prime from Ultrakill

#

so the whole boss and gold thing makes sense

manic rune
#

ohhh i see

tall tangle
#

My initial impression was that this thing takes all scored heart cards in one hand, turns them gold, then destroys them

Then you clarified it destroys itself

Then I was like well that's lackluster

Then you clarified it turns ALL heart cards gold.
(Or diamonds, whatever 😂)

olive moth
#

(triggers on boss blind because it's a boss, gold cards and diamond suit because he's connected to Hell's Greed circle)

ionic timber
tall tangle
normal crest
manic rune
#

which makes it even more of an econ option considering that one uncommon diamonds joker gives $1 per scored diamond card

olive moth
#

i have 7 fridays in one week (adhd moment), sorry

#

xD

tall tangle
#

Diamonds are money themed

manic rune
#

mhm

tall tangle
#

Diamonds are money themed, hearts are xmult themed, clubs are +mult themed, and spades are chips themed.

olive moth
#

also i think if i make Minos prime, i can make him do something similar with Hearts (king of the Lust circle)

manic rune
#

sadly clubs and spades are really lackluster because of how scoring in balatro works

#

xmult is always better than both

tall tangle
#

We should get xchips for clubs

manic rune
#

chips is even worse than mult because you get a lot from planet cards already 😭

tall tangle
#

HEY LOCALTHUNK, PLEASE ADD OFFICIAL XCHIPS

#

Okay I'm good now

manic rune
#

it would be a bit too broken, i think

olive moth
manic rune
#

since a hand can have 2000 chips while only having like, idk, 100-200 mult

olive moth
tall tangle
#

Slightly

manic rune
tall tangle
#

Cryptid is too broken to take seriously, which is why it's called "intentionally unbalanced"

olive moth
#

genuinely, balatro is too unforgiving in some aspects and "ends" too soon

tall tangle
manic rune
#

either that or you play someone else's seed

tall tangle
#

Pause

manic rune
#

because honestly, i cant see myself reaching ante 30+

manic rune
#

🗣️

tall tangle
#

😂

manic rune
#

in fact, let the seed touch the egg.

tall tangle
#

Welp, time to go abuse myself and my car for hours on end being an errand boy for people who tip $1 for 10 miles of delivery.

#

Hav gud dei

manic rune
#

oof, good luck and have a good day too

#

yk what, now that i think about it

#

maybe my mod can be worse than cryptid

#

like deadass, is anyone gonna read this

#

💀

olive moth
olive moth
manic rune
#

heres a joker 😭

olive moth
#

(RRAAAARGHH I LOVE LONG COMPLICATED MECHANICS /gen)

#

also, quick question

manic rune
#

ye

olive moth
#

can you color text with colors other than the default "chips/attention/mult/etc"?

#

like, with rgb hex codes for example

manic rune
#

you can

#

i think the game uses HEX

olive moth
#

slaaaaaayyyy

manic rune
#

though you would need to use hooks

#

like this (neato jokers mod)

olive moth
#

ty!

#

istg you're writing this code for me 😭

manic rune
#

np

manic rune
tepid crow
# manic rune

Bros actually recommending people to play honkai in the mod description

ionic timber
manic rune
olive moth
#

😭

tepid crow
#

Lol

tepid crow
pulsar flower
#

@wintry solar tried implementing something with unscored card calculation, unless i'm missing something it just crashes?

#

without the custom joker it also seems to audibly lower the unscored cards

wintry solar
#

What are you trying to do?

olive moth
#

stoopid me

pulsar flower
neat plover
wintry solar
#

Oh it’s probably because your lovely is old

olive moth
#

btw, the card

pulsar flower
olive moth
#

i could've p-ranked P2 twice now if i was doing that instead of programming this, and i kinda suck at ultrakill :,>

olive moth
manic rune
# neat plover here is the file
calculate = function(self, card, context)
      local cardPos = 0
      local other_joker = nil
      for i,v in ipairs(G.jokers.cards) do
        if v == card then
          cardPos = i
        end
      end
      if cardPos <= 1 then 
        return 
      else
        other_joker = G.jokers.cards[cardPos - 1]
      end
      context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1
      context.blueprint_card = context.blueprint_card or card
      
      if (context.blueprint > #G.jokers.cards + 1) or not other_joker then
        return
      end
      
      local other_joker_ret, trig = other_joker:calculate_joker(context)
      context.blueprint = nil
      if other_joker_ret or trig then
        if not other_joker_ret then
          other_joker_ret = {}
        end
        other_joker_ret.card = context.blueprint_card or card
        context.blueprint_card = nil
        other_joker_ret.colour = G.C.GREEN
        other_joker_ret.no_callback = true
        return other_joker_ret
      end
      context.blueprint_card = nil
   end
#

i fucked up the naming a bit

#

😭

#

SHOULD work now

prisma loom
#

in this line with what do I replace m_stone to make it check for face cards instead?

wintry solar
#

Strange, is the crash log still referencing chunks rather than files?

manic rune
#

i think theres something like :is_face_card()?

#

wait let me check

#

:is_face()

#

its :is_face(), which should return true if its a face card

manic rune
olive moth
#

sure 1 sec

minor magnet
#

how do i make this display the correct values (not display everything as nil) without adding ALL tarot vars to specific_vars?

manic rune
#

thats new

olive moth
prisma loom
manic rune
#

not x.set_ability 😭

#

but uh

manic rune
#

with that out of the way, hm

manic rune
olive moth
manic rune
#

im so fucking dumb

#

you are supposed to do this, im sorry 😭

olive moth
#

ohhhhhh

#

dw dw

#

:,>

manic rune
#

i keep mistaking is_suit with get_suit for some reason

#

bruh

#

(get_suit doesnt even exist, i think)

olive moth
#

we're all kinda mindfogged here

minor magnet
manic rune
#

so basically, x:is_suit("Diamonds"), and change the set ability thingy and it should be good

olive moth
wintry solar
manic rune
#

💀

sturdy compass
#

Bump again lol

light gazelle
#

Do you guys have any tips for getting started with modding our beautiful Balala

manic rune
sturdy compass
manic rune
# light gazelle Do you guys have any tips for getting started with modding our beautiful Balala

https://github.com/Steamodded/examples/blob/master/Mods/ExampleJokersMod/ModdedVanilla.lua
https://github.com/Steamodded/smods/wiki/calculate_functions

extract balatro.exe and read the source code, and feel free to research mods to know how to make things work ❤️

GitHub

Steamodded example mods. Contribute to Steamodded/examples development by creating an account on GitHub.

GitHub

A Balatro ModLoader. Contribute to Steamodded/smods development by creating an account on GitHub.

light gazelle
#

Thanks 🫡

olive moth
#

HOLY MOTHER OF PEARL IT WORKS

hushed field
olive moth
#

@manic rune COME HERE I WILL KISS YOU /j /plat

prisma loom
sturdy compass
olive moth
#

ok now to the card suicide...

sturdy compass
#

I would assume no

minor magnet
minor magnet
prisma loom
minor magnet
#

fix your indentations but yes this should work

hushed field
manic rune
#

i think you can store stuff in G.GAME

cursive flicker
#

ive never used lua before, is there a reason its saying bracket at line 13 isnt closed?

manic rune
#

like

sturdy compass
manic rune
#

G.GAME.randomstuffidk = 5

i can actually call this anywhere, and it seems it resets only when you start a new run

cursive flicker
#

im slow

sturdy compass
#

You can see my problem here lmao

manic rune
#

so for instance, if you want to store cards, you can make a table:
G.GAME.StoredCards = {}

then just add stuff in there for use

#

well thats my method, theres probably a bunch of better ways than that

prisma loom
hushed field
sturdy compass
#

No, ideally the effect can still be copied, even if the card is not longer present since it still would have been “the most recently purchased joker”

hushed field
#

Hmm, I suspect that'd create bigger issues with the fact that some jokers check for positions on the joker area

minor magnet
hushed field
#

Also, I don't know how much of an object remains stored when it's sold, and whether for example, you'd be able to still give score for the scaling jokers 🤔

minor magnet
pulsar flower
sturdy compass
hushed field
sturdy compass
#

I see your point

hushed field
#

You could maybe solve that by creating a new card area that's an off-screen graveyard esque buffers that jokers can be stored in, so that they can be copied still, but it'd create some issues for sure.

#

Copying the most recently bought joker that's still owned should be a lot easier, if you just store the key and then find it again with next(findjoker('key')). Or if you wanna showman-proof it, just create a global variable that the most recent purchased joker is stored in

prisma loom
#

How to prevent this effect working on cards that already have edition?

#

should I add a new context?