#💻・modding-dev

1 messages · Page 434 of 1

violet gulch
#

I'm determined to create a thread and post an initial release tonight. From observation, it seems github is the best method for sharing. Is that the concensus?

hidden sable
#
SMODS.Joker { -- Frubby Joker
    key = "frubby",
    loc_txt = {
        name = "Frubby",
        text = {
            "{X:mult,C:white}X#1#{} Mult",
            "for each other {C:attention}Frubby{} equipped",
            "{C:inactive}(Currently {}{X:mult,C:white}#2#{}{C:inactive} Mult){}"
        }
    },
    config = { extra = { mult = 1 } },
    rarity = 3,
    atlas = "frubby",
    pos = { x = 0, y = 0 },
    cost = 5,
    loc_vars = function(self, info_queue, card)
        local count = 0
        for _, v in ipairs(G.jokers.cards) do
            if v.key == "frubby" then count = count + 1 end
        end
        local total = (count - 1) * card.ability.extra.mult
        return { vars = { card.ability.extra.mult, total } }
    end,
    calculate = function(self, card, context)
        if context.joker_main then
            local count = 0
            for _, v in ipairs(G.jokers.cards) do
                if v.key == "frubby" and v ~= card then count = count + 1 end
            end
            if count > 0 then
                return { Xmult_mod = count * card.ability.extra.mult }
            end
        end
    end
}
#

am i using the wrong namespace?

#

thats what id assume

daring fern
short girder
#

how do i make custom pseudorandom seeds 😭

formal parrot
idle plaza
wind steppe
short girder
idle plaza
short girder
hidden sable
#

the bottom string here isnt updating, nor does it look correct, is my math off?

hidden sable
#
SMODS.Joker { -- Frubby Joker
    key = "frubby",
    loc_txt = {
        name = "Frubby",
        text = {
            "{X:mult,C:white}X#1#{} Mult",
            "for each other {C:attention}Frubby{} equipped",
            "{C:inactive}(Currently {}{X:mult,C:white}#2#{}{C:inactive} Mult){}"
        }
    },
    config = { extra = { mult = 1 } },
    rarity = 3,
    atlas = "frubby",
    pos = { x = 0, y = 0 },
    cost = 5,
    loc_vars = function(self, info_queue, card)
        local count = 0
        for _, v in ipairs(G.jokers and G.jokers.cards or {}) do
            if v.key == "frubby" then count = count + 1 end
        end
        local total = (count - 1) * card.ability.extra.mult
        return { vars = { card.ability.extra.mult, total } }
    end,
    calculate = function(self, card, context)
        if context.joker_main then
            local count = 0
            for _, v in ipairs(G.jokers.cards) do
                if v.key == "frubby" and v ~= card then count = count + 1 end
            end
            if count > 0 then
                return { Xmult_mod = count * card.ability.extra.mult }
            end
        end
    end
}```
daring fern
mossy helm
#

good evening everyone! My first mod is almost finished, there is just one last thing I couldn't quite wrap my head around

#

the localization stuff, I separated a localization lua file and I got the structure of it, but I'm not sure how you use it

normal crest
#

if it's formatted properly you don't "use" it beyond it just working

mossy helm
#

hmm

hidden sable
daring fern
hidden sable
#
    key = "frubby",
    loc_txt = {
        name = "Frubby",
        text = {
            "{X:mult,C:white}X#1#{} Mult",
            "for each other {C:attention}Frubby{} equipped",
            "{C:inactive}(Currently {}{X:mult,C:white}#2#{}{C:inactive} Mult){}"
        }
    },
    config = { extra = { mult = 1 } },
    rarity = 3,
    atlas = "frubby",
    pos = { x = 0, y = 0 },
    cost = 5,
    loc_vars = function(self, info_queue, card)
        local count = 0
        for _, v in ipairs(G.jokers and G.jokers.cards or {}) do
            if v.config.center.key == "j_modprefix_frubby" then count = count + 1 end
        end
        local total = (count - 1) * card.ability.extra.mult
        return { vars = { card.ability.extra.mult, total } }
    end,
    calculate = function(self, card, context)
        if context.joker_main then
            local count = 0
            for _, v in ipairs(G.jokers.cards) do
                if v.config.center.key == "j_modprefix_frubby" and v ~= card then count = count + 1 end
            end
            if count > 0 then
                return { Xmult_mod = count * card.ability.extra.mult }
            end
        end
    end
}```
daring fern
hidden sable
#

oh mb i thought it was autofill

#

works for the text, but doesnt actually do the mult

#
    key = "frubby",
    loc_txt = {
        name = "Frubby",
        text = {
            "{X:mult,C:white}X#1#{} Mult",
            "for each other {C:attention}Frubby{} equipped",
            "{C:inactive}(Currently {}{X:mult,C:white}#2#{}{C:inactive} Mult){}"
        }
    },
    config = { extra = { mult = 1 } },
    rarity = 3,
    atlas = "frubby",
    pos = { x = 0, y = 0 },
    cost = 5,
    loc_vars = function(self, info_queue, card)
        local count = 0
        for _, v in ipairs(G.jokers and G.jokers.cards or {}) do
            if v.config.center.key == "j_pwn_frubby" then count = count + 1 end
        end
        local total = (count - 1) * card.ability.extra.mult
        return { vars = { card.ability.extra.mult, "X"..total+1 } }
    end,
    calculate = function(self, card, context)
        if context.joker_main then
            local count = 0
            for _, v in ipairs(G.jokers.cards) do
                if v.config.center.key == "j_pwn_frubby" and v ~= card then count = count + 1 end
            end
            if count > 0 then
                return { Xmult_mod = count * card.ability.extra.mult }
            end
        end
    end
}```
daring fern
#

Replace Xmult_mod with xmult

short girder
# short girder

attempt to compare boolean with number when i replace it with smth random

hidden sable
daring fern
hidden sable
daring fern
hidden sable
#

oh

short girder
#

it's expecting a numberr

hidden sable
#

so info is offset...

daring fern
mossy helm
#

erm, do starting decks have a prefix? Like how jokers have the j_ prefix

idle plaza
# short girder

Don't use not like that in your if statement, that turns the pseudoseed result into a boolean. Instead just check if the pseudoseed is >= the other value.

short girder
#

oh okay!!

#

hold on

hidden sable
#

still a strange offset on the actual mult instead of the displayed mult

#
    key = "frubby",
    loc_txt = {
        name = "Frubby",
        text = {
            "{X:mult,C:white}X#1#{} Mult",
            "for each other {C:attention}Frubby{} equipped",
            "{C:inactive}(Currently {}{X:mult,C:white}#2#{}{C:inactive} Mult){}"
        }
    },
    config = { extra = { mult = 1 } },
    rarity = 3,
    atlas = "frubby",
    pos = { x = 0, y = 0 },
    cost = 5,
    loc_vars = function(self, info_queue, card)
        local count = 0
        for _, v in ipairs(G.jokers and G.jokers.cards or {}) do
            if v.config.center.key == "j_pwn_frubby" then count = count + 1 end
        end
        local total = count * card.ability.extra.mult
        return { vars = { card.ability.extra.mult, "X"..total } }
    end,
    calculate = function(self, card, context)
        if context.joker_main then
            local count = 0
            for _, v in ipairs(G.jokers and G.jokers.cards or {}) do
                if v.config.center.key == "j_pwn_frubby" and v ~= card then count = count + 1 end
            end
            if count > 0 then
                return { xmult = count * card.ability.extra.mult }
            end
        end
    end
}```
daring fern
hidden sable
#

what part is that in

short girder
#

number expected, got nil

#

maybe i shouldn't have replaced the seed with 'blahblahblah' lmao

idle plaza
#

No, that makes no difference

daring fern
hidden sable
daring fern
hidden sable
#

OH WAIT IT JSUT CLICKED

daring fern
short girder
#

okay i uhm fixed it

#

apparently i DIDNT have the 's

#

oh well

daring fern
#

Also you want to do (count*card.ability.extra.mult) + 1

mossy helm
#

alright, one last issue
I was able to get localization working! 🎉
But for some reason I can't include accents ( ^ ~ ´ ) in my sentences, as the game always crashes when it tries to load the sentence, but the base game does use accents so does it do anything specific do display accents?

hidden sable
#

i never told you my intended behavior mb, it was to have 1 frubby give x1 mult, and 2 frubbies give x2 mult

daring fern
daring fern
#

Elsewise it will say 0 in the collection.

short girder
#

like card.config.extra.[thing]

#

or is it another thing

idle plaza
#

config = { extra = { odds = #, Xmult = # } },

Replace # with whatever actual number you want them to be.

Within the code snipper you sent, card.config.extra.[thing] will work fine as long as the above config table is set right.

short girder
#

hm that's exactly what im doing

#

maybe i messed up smth idk

idle plaza
#

What's currently happening right now, VS what you expect?

short girder
#

crashing because config is a nil value vs doing like. anything at all

#

it was doing nothing before and now it's just crashing lmao

wind steppe
#

in calculate replace config with ability

short girder
#

i did that before but let's see

wind steppe
#

also that indentation is dealing psychic damage to me please fix it

daring fern
short girder
daring fern
short girder
#

dude that has not worked

#

that was literally what i was doing

wind steppe
#

self.ability

short girder
#

config is STILL a nil value

#

ability is STILL a nil value

wind steppe
#

okay your code might just be haunted

short girder
#

hold on

#

WHAT IS A MUL

#

WHAT IS MUL

wind steppe
#

crash message?

formal parrot
#

Mult without t obviously

wind steppe
#

also there’s a lot of other issues with this code

#

we can fix that after it stops crashing

short girder
wind steppe
#

whole thing

hidden sable
#

whast the dimensions for a seal texture

#

is it same as a joker or different

wind steppe
#

same as joker probably

#

that’s the sticker dimensions

daring fern
hidden sable
short girder
wind steppe
#

which line is 54

short girder
#

what line 54

#

from maximus??

#

it's literally just upd(self, dt)

wind steppe
#

from ur mod

sturdy compass
#

there is something in your mod called 'mul' that is trying to be called but doesn't exist

short girder
wind steppe
#

when does this crash?

sturdy compass
#

Question, are you loading from external files? It usually doesn't show an extended file path like that

short girder
#

sorry but what does that mean

short girder
sturdy compass
#

Like are you loading a file outside of your main one

short girder
sturdy compass
#

weird

short girder
#

my file is literally just a single main.lua

wind steppe
#

replace Xmult with xmult

#

everywhere

sturdy compass
#

I wish it was giving us the shortened path cuz that would make things so much easier lol

#

Does it keep happening with only your mod activated?

short girder
#

hold on again

daring fern
wind steppe
hidden sable
#

what part dictates this text at the bottom of a seal

wind steppe
#

idk what else would make it crash

short girder
#

im gen dumbfounded at how hard it is to make a deck give x3 mult or bust

daring fern
short girder
daring fern
#

Where would I have to patch in my quantum seals function if I wanted quantum seals to work on jokers and consumables?

short girder
#

maybe a new smods update released

#

okay there is a new version

short girder
#

same error

#

dude

#

what is going on

hidden sable
#

still using old mod header lol

violet gulch
wind steppe
#

replace context.context == “final_scoring_step” with context.final_scoring_step

daring fern
short girder
#

i assure you it is

wind steppe
#

your decks code isn’t here

hidden sable
#

what even is the x1 and x2 stuff on assets do? i know its for pixel smoothing but like how does it smooth from those?

short girder
#

im crying bro 😭

short girder
#

it starts at like 529 i think

pulsar furnace
#

is there any collection ui template? 🥺

short girder
#

okay finally uploaded the new update

#

many thankses all of yallses :]

red flower
hidden sable
#

spectral pack and arcana pack use the them system right, jsut with different pools?

subtle merlin
#

is there a way to tell if a card is debuffed? (there should be, but idk what it is)

subtle merlin
#

ty!

hidden sable
#

got this from the examples pack, can anyone explain whats happening in this as i dont understand

    key = 'medium',
    set = 'vremade_Spectral',
    pos = { x = 4, y = 5 },
    config = { max_highlighted = 1, extra = { seal = 'Purple' } },
    loc_vars = function(self, info_queue, card)
        info_queue[#info_queue + 1] = G.P_SEALS[card.ability.extra.seal]
        return { vars = { card.ability.max_highlighted } }
    end,
    use = function(self, card, area, copier)
        local conv_card = G.hand.highlighted[1]
        G.E_MANAGER:add_event(Event({
            func = function()
                play_sound('tarot1')
                card:juice_up(0.3, 0.5)
                return true
            end
        }))

        G.E_MANAGER:add_event(Event({
            trigger = 'after',
            delay = 0.1,
            func = function()
                conv_card:set_seal(card.ability.extra.seal, nil, true)
                return true
            end
        }))

        delay(0.5)
        G.E_MANAGER:add_event(Event({
            trigger = 'after',
            delay = 0.2,
            func = function()
                G.hand:unhighlight_all()
                return true
            end
        }))
    end,
    -- The config field already handles the functionality so it doesn't need to be implemented
    -- The following is how the implementation would be
    --[[
    can_use = function(self, card)
        return G.hand and #G.hand.highlighted <= card.config.max_highlighted and #G.hand.highlighted > 0
    end
    --]]
}```
urban wasp
daring fern
urban wasp
#

oh what

#

trying that now

#

eh?

SMODS.ANIMATION_ATLAS {
    key = "blind",
    path = "atlas_blind.png",
    px = 34,
    py = 34
}

SMODS.Blind {
    key = "the",
    pos = { x = 0, y = 0 },
    boss = { min = 2, max = 10 },
    atlas = "blind",
    boss_colour = HEX("757575")
}
daring fern
#

It needs to be SMODS.Atlas still.

urban wasp
#

oh weird

#

cryptid doesn't do that i don't think

#

istg cryptid code is weird asl

urban wasp
# urban wasp cryptid doesn't do that i don't think
local oldox = {
    object_type = "Blind",
    dependencies = {
        items = {
            "set_cry_blind",
        },
    },
    name = "cry-oldox",
    key = "oldox",
    pos = { x = 0, y = 0 },
    boss = {
        min = 2,
        max = 10,
    },
    atlas = "nostalgia",
    order = 4,
    boss_colour = HEX("4f6367"),
    modify_hand = function(self, cards, poker_hands, text, mult, hand_chips)
        if to_big(hand_chips) ~= to_big(0) then
            G.GAME.blind.triggered = true
            return mult, to_big(0), true
        end
        return mult, to_big(0), false
    end,
}
#

no atlas_table anywhere lol

urban wasp
#

oh

#

i see

pure salmon
#

can you define starting decks for card backs like you can for challenges or do you just have to manipulate them manually?

urban wasp
# daring fern

displays as this for some reason

SMODS.Atlas {
    key = "blind",
    atlas_table = "ANIMATION_ATLAS",
    path = "atlas_blind.png",
    px = 34,
    py = 34,
    frames = 21
}

SMODS.Blind {
    key = "the",
    pos = { x = 0, y = 0 },
    boss = { min = 2, max = 10 },
    atlas_table = "crp_blind",
    boss_colour = HEX("757575")
}
daring fern
unborn bay
#

tf is atlas_table

hidden sable
#

crash when selecting my seal

    key = "hammerseal",
    loc_txt = {
        name = "Hammer Seal",
        label = "Hammer Seal",
        text = {
            "{X:chips,C:white}X1.5{} Chips"
        }
    },
    atlas = "hammerseal", pos = { x = 0, y = 0 },
    badge_colour = HEX('e0ba2f'),
    sound = { sound = 'hammerseal', per = 1, vol = 1 },
    calculate = function(self, card, context)
        return { xchips = 1.5 }
    end
}```
hidden sable
#

oh, how would i do that

daring fern
hidden sable
#

basically red seal but it gives chips

#

or more accurately gold seal

daring fern
hidden sable
#

but instead of 3 dolalrs its chips

hidden sable
#

so like this?

daring fern
hidden sable
#

k

#

getting an error when trying to do sounds

sturdy compass
#

Show how you're playing the sound

hidden sable
#
    key = "hammerseal",
    path = "hammerseal.ogg"
})

SMODS.Sound({ -- hammersealapply Atlas
    key = "hammersealapply",
    path = "hammersealapply.ogg"
})```

```SMODS.Seal { -- Hammer Seal
    key = "hammerseal",
    loc_txt = {
        name = "Hammer Seal",
        label = "Hammer Seal",
        text = {
            "{X:chips,C:white}X1.2{} Chips"
        }
    },
    atlas = "hammerseal", pos = { x = 0, y = 0 },
    badge_colour = HEX('e0ba2f'),
    sound = { sound = 'hammersealapply', per = 1, vol = 1 },
    calculate = function(self, card, context)
        if context.main_scoring and context.cardarea == G.play then
            play_sound("hammerseal")
            return { xchips = 1.2 }
        end
    end
}```
daring fern
sturdy compass
#

you need to add your mod prefix to the sound key like
play_sound("prefix_hammerseal")

hidden sable
#

in play_sound

#

ah ok

#

the sound if being played at the beginning of the hand, it should play when "x1.2 Chips" pops up, (when the card is used) do i need to define a different context for this

vivid grotto
#

Hey guess, I am looking at the pareidolia joker implimentation from VanillaRemake and I ain't sure I understand how it functions

-- Pareidolia
SMODS.Joker {
key = "pareidolia",
blueprint_compat = false,
rarity = 2,
cost = 5,
pos = { x = 6, y = 3 },
}

local card_is_face_ref = Card.is_face
function Card:is_face(from_boss)
return card_is_face_ref(self, from_boss) or (self:get_id() and next(SMODS.find_card("j_vremade_pareidolia")))
end

sturdy compass
vivid grotto
daring fern
sturdy compass
#

like this

return {
   xchips = 1.2,
   sound = 'prefix_hamnmerseal'
}```
hidden sable
#

ah ok

#

yeah that was my guess right after i asked what you meant lol

#

tried it, sound doesnt appear to paly

sturdy compass
vivid grotto
#

so I would instead need to override the is_suit and get_id functions as well as the is_face function?

sturdy compass
#

yes

vivid grotto
#

thanks!

hidden sable
#

also hate to ask two questions at once but does anyone have the back of the canio card

sturdy compass
#

It should be isolated in the vanilla sprite sheet

hidden sable
thorn furnace
#

How do I move something up in the UI
Been trying for a while and offset seems to dislike me

daring fern
hidden sable
daring fern
hidden sable
#

where cna i find that, is there a github

hidden sable
sturdy compass
hidden sable
#

unless i put it in wrong

hidden sable
sturdy compass
#

yep lol

hidden sable
#

i thught you could only extract zips

sturdy compass
#

the exe is completely unencrypted

#

so you can unzip it

thorn furnace
hidden sable
thorn furnace
#

one's compressed so you can play it and one's compressed so you can store it but they can both be uncompressed if they let you

tough temple
hidden sable
#

oh god if i make a blind will i have to make my own spritesheet like this???

sturdy compass
#

yep

hidden sable
#

😭

#

its jsut a shimmer why wouldnt it just be a transparent overlay

#

make that a spritesheet and then you only need to supply 1 image for every blind

sturdy compass
#

Because Moveable items don't use AnimatedSprites

hidden sable
#

wouldnt that make more sense??

thorn furnace
hidden sable
thorn furnace
hidden sable
#

how hard is it to make custom ui

#

like using balatro ui as tempalte

sturdy compass
#

It is quite tough

sturdy compass
thorn furnace
thorn furnace
#

i say that and I'm going to regret it

sturdy compass
#

lmao

#

try tm for the text and bm for the buttons and see how that fairs

thorn furnace
#

yea just did to double check

#

didn't change anything

sturdy compass
#

damn

#

worth a shot

thorn furnace
#

You would think orienting something near the top would like
do that

sturdy compass
#

I have no clue

hidden sable
#

is there a font for this text or was it drawn by hand

sturdy compass
#

I wish N was here, mans is a UI wizard

thorn furnace
sturdy compass
#

Exactly, wizard lol

hidden sable
#

kidding but

#

thanks

sturdy compass
#

lmfao

quiet bear
#

in which .lua file is the code for deja vu? cant find it in card.lua.

sturdy compass
#

in card.lua

thorn furnace
sturdy compass
urban wasp
#

how do i make an item use the vanilla atlas?

thorn furnace
sturdy compass
urban wasp
#

i see

sturdy compass
#

For example, an SMODS.Joker with use the vanilla Jokers atlas by default

#

An SMODS.Back or SMODS.Seal will use the vanilla Enhancers atlas

#

etc.

quiet bear
#

where is the can_use_consumable code for deja vu?

sturdy compass
#

it's just can_use for SMODS

daring fern
#

But that code is actually wrong.

hidden sable
daring fern
hidden sable
#

nvm found it

sturdy compass
#

lmao

unborn bay
#

caino

pure salmon
#

oops

#

maybe i was a bit late

sturdy compass
#

perhaps

pure salmon
#

better late than not ever

hidden sable
#

too broke for asperite who feel me

daring fern
hidden sable
#

and whats libresprite

daring fern
hidden sable
daring fern
daring fern
hidden sable
#

libresprite is basiaclly just asperite but free?

daring fern
thorn furnace
daring fern
hidden sable
thorn furnace
#

I paid for it because I'm an idiot but like
you don't have to

unborn bay
#

is the average spriter able to compile it

errant fulcrum
#

There's a delay of a few seconds when I start a run with this deck, is there anything I can do to change that? It turns all cards to stone

config = {vouchers = {v_magic_trick}},
    apply = function(self)
    G.E_MANAGER:add_event(Event({
        func = function()
        local cards = {}
        for i, card in ipairs(G.playing_cards) do
            cards[#cards+1] = card
        end
        for i = 1, #cards do
            G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
                    local card = cards[i]
                    card:set_ability(G.P_CENTERS["m_stone"],nil,true)
                    return true end }))
        end
        return true
    end
    }))
end
daring fern
thorn furnace
hidden sable
#

i even made a template layer based system for making jokers, and other assets like seals

errant fulcrum
hidden sable
thorn furnace
#

I might be misunderstanding

hidden sable
thorn furnace
#

Never tried libresprite personally

#

so can't really say

hidden sable
#

ill go with asperite ig, where can i find this HELPFUL RESOURCE

thorn furnace
thorn furnace
pure salmon
#

aseprite is GOATED

#

will be even better if they actually add rotational symmetry in the next decade

thorn furnace
hidden sable
thorn furnace
hidden sable
#

which one

thorn furnace
pure salmon
#

i've been using ase for so long i've forgotten the first time user experience, but i think it's as intuitive as it gets unless you want to do very specific things

hidden sable
#

I GOTTA COMPILE A THING TO COMPILE ANOTHER THING

thorn furnace
#

u just download the m124 package

hidden sable
#

uhhh 😵‍💫

#

(i barely am grasping what i am doing rn)

thorn furnace
#

ur windows I'm assuming so u click the top one there

#

It's a bit of selection anxiety but just look for "windows x64" and that's probably it

#

if there's still options then pick the one that says "release" or something

hidden sable
#

maybe windows default packager has it???

#

IT GET

#

I DOES

#

this ones green so green means good

errant fulcrum
#

Is it possible to make a deck where certain booster packs dont spawn?

hidden sable
#

shoot whats the difference between x64 and x86

daring fern
#

Most people have 64bit

cloud saffron
#

hey chat so i found all the files for the cards

#

my new question: how do people add new textures to said cards

hidden sable
thorn furnace
#

x86 and x64 refers to the processor architecture

thorn furnace
hidden sable
#

HOW DO I INSTALL THIS THERES NO EXE OR MSI

vivid grotto
#

hey yall, what is the base game funciton used to determine the hand type you have currently selected?

thorn furnace
vivid grotto
#

I want to override it using a joker that makes all cards be considered 'King of spades"

hidden sable
thorn furnace
#

o

hidden sable
#

a dependency it asked me to install

#

but idk hwo to install

daring fern
thorn furnace
#

(sorri i would give more details im just eepy)

vivid grotto
# daring fern If you hooked `Card:get_id()` and `Card:is_suit()` then you don't need to.

think you can look at the way I did so to see why its not working properly?

-- Override is_suit function
function Card:is_suit(suit, bypass_debuff, flush_calc)
local has_man_ha = next(SMODS.find_card("m_mbm_man_ha"))
local has_women_ha = next(SMODS.find_card("m_mbm_women_ha"))
local has_person_ha = next(SMODS.find_card("m_mbm_person_ha"))
local has_pan_ha = next(SMODS.find_card("m_mbm_pan_ha"))

if has_pan_ha then
    return true  -- Pan Ha overrides all other suit checks
elseif has_man_ha and suit == 'Spades' then
    return true
elseif has_women_ha and suit == 'Hearts' then
    return true
elseif has_person_ha then
    return true  -- Jacks can be any suit
end
return card_is_suit_ref(self, suit, bypass_debuff, flush_calc)

end

-- Override get_id to handle Ha jokers
function Card:get_id()
-- Handle Ha jokers
if self.ability.name == 'Pan Ha' then
-- Return a special ID for a new rank that represents the combined value of all ranks
return 13 -- Using 13 as a special ID for Pan Ha
elseif self.ability.name == 'Person Ha' then
return 12 -- King's ID
elseif self.ability.name == 'Women Ha' then
return 11 -- Queen's ID
elseif self.ability.name == 'Man Ha' then
return 10 -- Jack's ID
end

-- Handle Stone Card as part of main logic
if self.ability.name == 'Stone Card' then
    return 1
end

-- Default case: return the base card's ID
return self.base.id

end

hidden sable
#

maybe i shoulda just done libresprite 😭

vivid grotto
#

I have this as well at the top:

local card_is_suit_ref = Card.is_suit
local card_get_id_ref = Card.get_id

cloud saffron
#

like. if i wanted to make one

#

i mean like how can i myself edit the textures n create my own texture pack

hidden sable
#

ok ive got a totally realy copy of asperite

daring fern
sonic cedar
#

Anyone know how G.ASSET.ATLAS works? I'm trying to patch into it with my own atlas. Apparently just using a string doesn't work? Doesn't crash or anything, it just still loads the regular sprites

hidden sable
daring fern
#

Malverk is best.

cloud saffron
daring fern
hidden sable
cloud saffron
hidden sable
fading hemlock
#

I'm struggling to figure out how to get this to work. I've tried dumping the consumable to a file to see all of the locations where its name is referenced, but none of them seem to visually affect how it looks. Does anybody know how to do this?

calculate = function(self, card, context)
        if context.setting_blind then
            for _, consumable in ipairs(G.consumeables.cards) do
                local text = consumable.config.center.name

                local indexes = get_vowel_indexes(text)
                if #indexes > 0 then
                    
                    for i = #indexes, 1, -1 do
                        local idx = indexes[i]
                        text = text:sub(1, idx - 1) .. consumable.ability.name:sub(idx + 1)
                    end

                    consumable.config.center.name = text

                    local money = card.ability.extra * #indexes
                    ease_dollars(money)
                    return {
                        message = localize('$')..money,
                        colour = G.C.MONEY,
                        card = card
                    }
                end

            end
        end
hidden sable
#

WHY IS HE LOOKING AT ME LIKE THAT 😭

cloud saffron
#

like right there

#

where you have the file

cloud saffron
#

like i have the file but how dyou edit it n then put it back

fading hemlock
hybrid shadow
daring fern
hidden sable
#

is there like a layering window i can pop out to view all my layers?

hidden sable
#

YES, i think

pure salmon
daring fern
hidden sable
#

how do i import an image into the layers of a project

#

tryna import my templates

daring fern
hidden sable
#

i dont see one unless im blind

pure salmon
daring fern
pure salmon
#

or drag it in

hidden sable
daring fern
hidden sable
pure salmon
#

dragging it in does that iirc, you can then select it and copy+paste

#

i almost never drag an image in because it opens a new file

daring fern
hidden sable
#

nice joker tempalte imported

subtle merlin
hidden sable
#

now about this sound, it doesnt play at all ingame

daring fern
subtle merlin
#

uuuuugggggggggggggggghhhhhhhhh yep that's it

#

well, not all of it, apparently

#

same crash

daring fern
hidden sable
#

any way i can just resize this entire project down 50 percent

merry raven
#

How do you modify a sticker's config values
Normally if it's something like enhancements, you'd do this:

if card.config.center == G.P_CENTERS.m_[prefix]_[enhancement name] then
                card.ability.extra.[enhancement config variable] = [value]
            end

But for a sticker, it's different, and I can't figure it out, this is my attempt so far:

for _, handCard in ipairs(G.hand.cards) do
                if handCard.ability.[prefix]_[sticker] then
                    handCard.[config variable] = [value]
                end
            end
subtle merlin
hidden sable
daring fern
hidden sable
daring fern
hidden sable
#

ah thanks

#

now heres something advanced, is there a way to turn a spritesheet into a font that can be typed

daring fern
hidden sable
hidden sable
#

any way to turn a project into a spritesheet, so i can select a single sprite and copy and paste it into the other project

daring fern
hidden sable
vivid grotto
#

Hiya, I am trying to override the chip value when scored to be 10 using this joker without actually modifying the card itself anyone know why isn't this implimentation working?

-- Man Ha
SMODS.Joker {
key = "man_ha",
loc_txt = {
name = "Man? Ha!",
text = {
"All cards are considered",
"{C:attention}King of Spades{}"
}
},
rarity = 2,
cost = 6,
blueprint_compat = false,
perishable_compat = true,
eternal_compat = true,
pos = { x = 8, y = 2 },
atlas = "mbm",
calculate = function(self, context)
if context.scoring_hand and context.cardarea == G.play and context.main_eval and context.card then
context.card.base.nominal = 10
end
end
}

hidden sable
#

any way to change the hue/modulate of a layer

daring fern
hidden sable
hidden sable
daring fern
hidden sable
daring fern
vivid grotto
daring fern
vivid grotto
daring fern
merry raven
merry raven
#

Got it, lemme try it out

hybrid shadow
merry raven
#

All instances of the sticker
The sticker will instrincally grant +10 Mult, but I have a custom Joker that will bump that up to +20

hybrid shadow
merry raven
#

Yep

#

The Joker checks for any cards with the sticker, and if there are, then change the mult to 20
And honestly this sounded a lot better in my head

daring fern
merry raven
#

Ah

hybrid shadow
merry raven
#

This is my current Joker

calculate = function(self, card, context)
        if context.setting_blind then
            G.hand.config.card_limit = G.hand.config.card_limit - 1
            for _, handCard in ipairs(G.hand.cards) do
                if handCard.ability.fm_catatonic then
                    SMODS.Stickers.fm_key.config.mult_increment = 20
                end
            end
        end

        if context.end_of_round then
            G.hand.config.card_limit = G.hand.config.card_limit + 1
            if G.hand.config.card_limit < 1 then
                G.hand.config.card_limit = 1
            end
        end
    end

"Catatonic" is the said sticker, if a card has Catatonic, you can not play it nor discard it until the blind ends, but will grant +10 Mult for every hand played, and the Mult bonus will increase by 10 every time
The Joker's supposed to double that incrementing value from 10 to 20, but reduces your hand size by 1

hybrid shadow
#

ah

daring fern
hybrid shadow
#

for one thing its reducing hand size by one for every blind you enter

merry raven
#

Yeah, that's also another problem, so I tried using the end_of_round block to readd that lost hand size but haven't tested it yet

hybrid shadow
merry raven
#

Yeah, it's only supposed to reduce by one, not one every time

hybrid shadow
merry raven
#

Never used those functions before, how do I use them

#

Oh wait saw how someone else does it

#
remove_from_deck = function(self, card, from_debuff)
        G.hand:change_size(-1)
    end

Like this?

hybrid shadow
#

you want add_to_deck for the initial hand reduction and remove_from_deck for the return to normal

merry raven
#

Lemme try something

hidden sable
#

do i have to use message and put sound inside?

sturdy compass
#

no

hidden sable
#

im gonna try swapping the position of xchips and sond

#

nope

hidden sable
#

sound jsut isnt playing

#

maybe return a message

cloud saffron
#

making my texture pack based on just random things i like

#

ive never done sprite work before but i wanted to share a wip

#

yall got any advice?

hidden sable
#

make the highlights consisten

cloud saffron
#

ooh fair

#

anything else

hidden sable
#

maybe add more color diveristy

#

like "gradients"

#

not a good word but

#

more colors

#

shading maybe

cloud saffron
#

fair enough

#

ill play with it a bit

hybrid shadow
#

how would i go about checking if the player is opening a tarot pack specifically

hidden sable
cloud saffron
#

i think this is better

hidden sable
#

yes

#

how do i make a card have an overlay like perkeo and canio

daring fern
hidden sable
#

what

daring fern
hybrid shadow
hidden sable
#

OH

#

took a minute to click

#

it needs to be in a spritesheet then right

daring fern
hidden sable
#

also i cant appdata in this (dont quesiton the name)

daring fern
merry raven
# hybrid shadow you want add_to_deck for the initial hand reduction and remove_from_deck for the...

How do you reset a sticker's config value back to its original when the Joker is no longer present

    add_to_deck = function(self, card, from_debuff)
        G.hand:change_size(-1)
    end,
    remove_from_deck = function(self, card, from_debuff)
        G.hand:change_size(1)
        SMODS.Stickers.fm_catatonic.config.mult_increment = 10
    end,
    calculate = function(self, card, context)
        if context.setting_blind then
            SMODS.Stickers.fm_catatonic.config.mult_increment = 20
        end
    end
}

Putting SMODS.Stickers.fm_catatonic.config.mult_increment = 10 in remove_from_deck doesn't work, it still applies the doubled Mult rate even when the Joker is sold

fading hemlock
#

also nice rust install

hidden sable
#

i try to add a folder, and it tells me appdata exists, but i dont see it

fading hemlock
hidden sable
burnt quartz
#

Where I can define the text under the description of the seal?

fading hemlock
#

doesn't the mod name usually go there?

#

I might be mistaken

hidden sable
#

it goes C:\Users<user>\AppData\Roaming\Balatro\Mods<modname>\assets

errant fulcrum
#

Is there a list of keys for all the tarot cards?

burnt quartz
#

Usually Above the description is the name and under is the label

#

i guess

hidden sable
#

it looks like you already changed its color so you dont need to know about the other stuff

burnt quartz
#

That is a remade

daring fern
burnt quartz
#

But if you want go deeper you can see the source code of balatro and read how it was defined, is almost the same way

daring fern
#

Then do CTRL + F and search --Tarots

burnt quartz
daring fern
burnt quartz
#

mmm already is like that and still don't working

#

return {
    descriptions = {
        Joker = {
            j_succu_succubus_Joker = {
                name = 'Modeus',    -- reference to Helltaker?
                text = {
                    "{C:green}#4# in #3#{} chance to drain a face card,",
                    "{C:mult, s:1.3}+#1# Mult{} for each",
                    "{C:attention}Crimson Seal{} in your full deck",
                    "{C:inactive}(Currently {C:mult, s:1.3}+#2# {C:inactive} Mult)"
                } -- chips in exchangefor mult sounds good
            },
        },
        Other = {
            succu_pink_seal = {
                name = 'Crimson Seal',
                text = {
                    "The chips on this",
                    "card are {C:attention}halfed"
                },
            },
        },
        misc = {
            labels = {
                succu_pink_seal = "Crimson Seal"
            },
        }
    }
}
#

this is the description in the localization folder

hybrid shadow
burnt quartz
#

go futher pls

daring fern
hybrid shadow
daring fern
daring fern
burnt quartz
#

You deserve a french kiss

errant fulcrum
#

Am I using this right? SMODS.remove_pool('Booster', p_celestial_normal_1)

burnt quartz
#

mmm the second parameter must be a card key

errant fulcrum
#

Oh wait so this wouldnt be used for removing a whole booster pack from the pool?

burnt quartz
#
delete_card = function(self, center)
            SMODS.ObjectType.delete_card(self, center)
            SMODS.remove_pool(G.P_CENTER_POOLS['Tarot_Planet'], center.key)
        end

for example, there is the "center" that is a card in mostly of cases

errant fulcrum
#

I must be doing something wrong

#
        G.E_MANAGER:add_event(Event({
        func = function()
        SMODS.add_card({set = 'Tarot', area = G.consumeables, key = 'c_high_priestess'})
        SMODS.remove_pool{G.P.CENTER_POOLS['Celestial'], center.key}
        return true
    end
}))```
daring fern
errant fulcrum
#

Good lord

hidden sable
#

@daring fern is prolly the smartest one here tbh

#

bro has a streak with helping people with their mods

subtle merlin
#

How would I get the amount of cards played last hand in a consumable?

daring fern
subtle merlin
tough temple
#

im trying to make a consumable but its sprite isnt loading for some reason

#

help me out

sturdy compass
#

Why is your x pos 4 when it’s a single-tile atlas

tough temple
#

not gonna lie

#

i pasted vremade and edited it

#

i just kept it in because i didnt feel like removing it

#

is that it?

subtle merlin
#

possibly

sturdy compass
#

It should be 0

tough temple
#

oh my god what did i do

#

nvm my stupid ahh put the 2x files in 1x and the 1x files in 2x

#

beautiful thanks for the help

#

where would i upload my mod once its finished anyway?

snow vale
#

how can i refer to the amount of scoring i did on a hand?

hidden sable
snow vale
#

mainly

hidden sable
snow vale
#

train

snow vale
tough temple
snow vale
#

related to money

tough temple
#

lemme explain effect cards

#

basically

#

consumabled that give a status effect that lasts one round

#

and you cant use them in boss blinds

snow vale
#

then that it gives 5% of the blind req

#

or 10%

cloud saffron
#

hey chat so i got the first of my texture sets done

cloud saffron
#

however, now im trying to figure out how to replace the old one

snow vale
#

modding

#

in other words, create a mod

cloud saffron
#

thats why im here lol

daring fern
snow vale
#

yeah i guessed

daring fern
snow vale
#

like, when you play a hand, the amount of chips you gained in total, after all the scoring process

#

the chips that's added to your counter in 1 hand

daring fern
snow vale
#

oh

#

ok

tough temple
subtle merlin
#

How can i make a list of every card in the deck, then sort it from highest to lowest rank?

cloud saffron
#

im still quite lost as to how to actually add the skin i made

wintry solar
snow vale
#

how can i check if a card has an specific enhancement?

cloud saffron
#

im considering caving in for tonight, its already kinda late where im at

#

i just have like zero modding experience whatsoever so its all a bit of a blur lol

#

i feel like i have the right idea for the textures but that means not much if i dont know how to use em properly

snow vale
#

why wont this turn C:white?

manic rune
#

{X:chips,C:white}

snow vale
#

yeah im using that

manic rune
#

are you sure you dont have any space in there

#

{X:chips, C:white} wont work, im p sure

snow vale
#

wait works now

#

i think i wrote C.white

#

instead of C:white

manic rune
#

sob

snow vale
#

how can i make this work only for the first scoring card? this crashes

daring fern
manic rune
#

is this an enhancement

snow vale
#

it's a joker that enhances

snow vale
daring fern
snow vale
#

when first card scores ig

daring fern
snow vale
#

ok

feral tree
#

Need some help

#

What do i replace in the nil values here to get this joker to create another specific joker?

snow vale
#

please use SMODS.add_card()

feral tree
daring fern
snow vale
#

yeah that

daring fern
#

And remove the add_to_deck and emplace

snow vale
#

why isn't this working?

#

not crashing, simply it doesnt work

manic rune
#

if context.individual and context.other_card ~= card then

#

though you will need more contexts, that can increase a lot

snow vale
#

wdym?

manic rune
#

do you want snowy cards to scale infinitely

snow vale
#

no

#

just for that score

#

then it resets

manic rune
#

then you dont even need context.individual

snow vale
#

oh

#

then?

manic rune
#

in context.main_scoring, go through context.scoring_hand, check for the enhancement and give xchips accordingly

snow vale
#

oh ok

#

but like return xchips?

#

instead of scaling?

manic rune
#
if context.main_scoring and context.cardarea == G.play then
  local snow_xchips = 1
  for _,v in ipairs(context.scoring_hand) do
    if SMODS.has_enhancement(v, "m_ub_snowy") then snow_xchips = snow_xchips + 0.2 end
  end
  return {
    xchips = snow_xchips
  }
end
snow vale
#

oh ok

#

thanks

#

it's not working :(

manic rune
#

oh yeah

#

you need context.cardarea == G.play too

snow vale
#

oh ok

#

still not working :(

manic rune
#

thats odd

#

can you check if the stuff in the context block actually go through

#

put a print in there

snow vale
feral tree
#

how do i change the price of the created jokers?

manic rune
daring fern
manic rune
#

😭

#

of course it will "not run" lol

snow vale
#

lmao

manic rune
#

0.8 + 0.2 = 1

and you immediately return it, so xchips = 1

#

🥀

snow vale
#

yeah yeah

manic rune
#

also, you want to check if i == card too, actually

snow vale
#

that's why i put 0.8

manic rune
#

:3 bad practice

snow vale
#

cuz itself is 0.2

manic rune
#

but sure, that works too

woeful epoch
#

[waves hand] very very rookie lua user here be nice please

I'm here at slowly 'losing my mind over an issue I don't quite understand'
when i load up my mod, it says that on line 18 [the SMODs.Joker{ line], the bracket isn't closed? i think thats what it meanas anyway?

#

whats the issue

snow vale
#

id take the i ~= card

manic rune
#

yeah

manic rune
#

freaking

#

notepad???

#

😭

#

NOT EVEN NOTEPAD++?????

snow vale
#

lmaoo

woeful epoch
#

yes WE are using notepad

manic rune
#

who tf is the "we" in here

woeful epoch
#

we as in ALL of us twin

snow vale
#

yeah i should move from vscode to notepad 😔

manic rune
#

anyways

#

you are missing "," here

woeful epoch
#

Okay like I said I am a very very rookie lua user I did not know what actually good software to use

#

OH

#

thank you

manic rune
#

use visual studio code please

#

😭

woeful epoch
#

nah id notepad

#

🤑

manic rune
#

i aint helping you after this

#

🥀

woeful epoch
#

fair enough

cerulean bane
#

notepad++ is literally free.

snow vale
#

vscode too 😭

woeful epoch
#

i have trickered you into giving me the software i needed instead of jus using notepad 😈

#

gee gee

#

thank you very much though

snow vale
#

WHY'S TS NOT WORKING 😭

#

what's wrong now

daring fern
snow vale
#

wait what

daring fern
snow vale
#

then why is it Xmult

#

oh

#

ok

daring fern
manic rune
#

forgotten

#

smods MUST be strict on you.

snow vale
#

WORKS!!

#

yippeeee

#

ty all

#

ok now 2nd problem, this crashes when round ends

snow vale
daring fern
# snow vale

context.scoring_hand doesn't exist when you're trying to use it.

snow vale
#

oh

#

so i put it later

feral tree
manic rune
#

local area = context.scoring_hand outside of the event, and use area instead of context.scoring_hand in the event

daring fern
snow vale
#

works perfectly now

#

ty

feral tree
daring fern
# feral tree Elaborate
local oldcardsetcost = Card.set_cost
function Card:set_cost()
    local g = oldcardsetcost(self)
    self.cost = number
    return g
end
feral tree
#

i assume that makes Card:set_cost() actually work

#

not sure how to actually apply it to the created card in code

#

new but trying to get the hang of things

woeful epoch
#

MY SON LIVES!!!

#

i don't know why the colour wasn't working for {c:attention}. do i have the wrong index or smn

#

oh wait nvm

#

im dense

#

and set them to lowercase

merry raven
#
  • Create a sticker called Catatonic that makes a card unplayable and undiscardable, but grants +10 Mult for every hand you play and the bonus increases by 10 after every hand played
  • Create a Joker that bumps that incrementation from 10 to 20
  • In actuality, the increments increase by factors of 10 depending on how many Catatonic cards are in hand (for example, 3 Catatonic cards in hand will increment the Mult bonus by 30 instead of each of them incrementing by 20)

How the fuck do stickers even work

snow vale
#

how can i make so a blind discards leftmost card and rightmost card? when i tried using hook's code and editing it a bit, ingame it simply stops and wont progress from this screen

subtle merlin
snow vale
#

ty

subtle merlin
#

yw, i've dealt with a lot of discarding recently

snow vale
subtle merlin
#

Oh this crash, i've gotten it so many times but idk how i fixed it

snow vale
#

hmm ok

woeful epoch
#

crashing on opening
hwat do you mean dawg 🥀

snow vale
#

end the calculate

subtle merlin
woeful epoch
#

oh .

#

skull spinning embed here

subtle merlin
#

Happens to the best of us, dw

#

Speaking of crashes...

snow vale
#

how can i give a card a seal via a joker?

subtle merlin
snow vale
#

okk

#

also if i wanna use a custom seal, do i have to write s_modkey_key

#

mainly for the s

subtle merlin
#

90% sure

snow vale
#

ok

thorn basin
#

uuh what is the command to make a custom joker compatible with the blueprint joker?

snow vale
subtle merlin
#

idk, ive only done red seal

snow vale
#

huh, i tried to check the seal through collection

thorn basin
woeful epoch
#

my son works

modern kindle
subtle merlin
#

Haii dilly
-# yay, someone that knows what they're talking abt!

thorn basin
modern kindle
woeful epoch
#

LMAO

#

i did it wrong and accidentally created

#

absolute cinema

snow vale
#

wait

woeful epoch
#

too funny to me

snow vale
#

nvm

#

nvm

modern kindle
#

mother of [DefaultLogger]

#

lmao

woeful epoch
#

its peeak

subtle merlin
thorn basin
modern kindle
#
calculate = function(self, card, context)
        if context.first_hand_drawn and not context.blueprint then
woeful epoch
#

it doesnt generate 50000 default loggers and create xchips for every card so

modern kindle
#

as far as ive always known blueprint_compat = true/false only makes the text box say it is or is not

woeful epoch
#

probably js from

#

how simple the effect is

#

then

subtle merlin
thorn basin
#

aight, lemme check quick first

modern kindle
woeful epoch
#

it is js cosmetic only

modern kindle
woeful epoch
#

since blueprint_combat = false still makes it call - im assuming the behavior is

#

because its /just/ a joker.main behaviour

#

and nothing else

subtle merlin
thorn basin
#

somehow it actually works

woeful epoch
#

does your joker only have joker.main

#

if that's the case then i think thats

#

what causes it to work as it does

thorn basin
#

ooh

modern kindle
subtle merlin
#

im jus lazy and didn't want to take another screenshot

unborn bay
#

this is because it doesn't know how to sort the cards

#

so it uses the tried and true method of checking the number

#

which doesnt work

subtle merlin
#

ah

#

i wouldn't know how to make it sort properly

unborn bay
#

you'd have to provide your own sort function

#

like everything in life, cardarea.lua has the sort function you probably need here

#

buuut

#

you probably dont need that anyway

#

iirc draw_card has the option to just sort autonaticall

#

y

subtle merlin
#

oh

#

I didn't get a guide on draw_card so i didn't know lol

feral tree
#

What's the code for a card destroying itself?

modern kindle
#

if its a playing card you can use context.destroy_card

#

destroys during scoring if memory serves

feral tree
#

Fuck i meant Joker

subtle merlin
feral tree
#

Trying to have a joker destroy itself after a boss blind, not detect when it's been destroyed

subtle merlin
#

Oh, wait! Vanilla Remade Mr.Bones!

snow vale
#

why's the sealed card acting like if it was being triggered, even tho its turn has already passed?

subtle merlin
#

That isn't 8 cards, but ur getting there!

native zinc
subtle merlin
#

?

#

0 idea what the second word means here

feral tree
#

is there a way to use SMODS.add_card to create a random card from a pool?

daring fern
feral tree
daring fern
feral tree
daring fern
feral tree
# feral tree

Added this on all the jokers i wanted in the RNG pool, not sure if that's what yyou mean

snow vale
daring fern
feral tree
#

No

#

I do not know what objectType is

snow vale
#

SMODS.ObjectType{}

daring fern
daring fern
snow vale
#

it should only do it once

#

wait a sec

#

ok yeah

#

the joker is the problem

#

so then how do i fix it?

daring fern
snow vale
#

o h

daring fern
#

Also it needs to be in a func in the event.

snow vale
#

ok

minor magnet
#

is there a context i can check for when a card is created in the shop?

snow vale
#

how can i make a card be bigger than what it should be?

woeful epoch
#

I've been bashing my head into a wall /metaphorical for the past 30 minutes I know I'm missing something as small as a single 'end' or something and yet I just cannot see it

woeful epoch
#

Oops

#

Im LOSING it I know there's something wrong but Ive been tinkring where the end(s) go for like 15 minutes

snow vale
#

how can i make a card be bigger than what it should be? (71x95)

woeful epoch
#

custom atlas specifically for that card

snow vale
#

yeah i did

#

but the card is still smaller

maiden phoenix
woeful epoch
#

SMODS.Atlas{
key = 'key',
path = 'image.png',
px = [bigger size number],
py = [bigger size number]
}

snow vale
maiden phoenix
maiden phoenix
# woeful epoch Oops

Sorry back to you, can you select/hihglight your object, right click and press "Format Selection"? This will better indent the code to find the error more easily

maiden phoenix
#

try pixel_size instead?

#

If it still doesn't work you should look into More Fluff's code it has a Huge Joker

maiden phoenix
#

Try the keyboard shortcut if it doesn't show up maybe

woeful epoch
#

question mark?

maiden phoenix
#

Can you go into Help > About and tell me your vscode version?

woeful epoch
#

right right

maiden phoenix
#

Yes, but thats weird we got the same version

woeful epoch
#

ujhjjhh

idle plaza
# woeful epoch

In the meantime, I can at least tell you what's wrong with the code: First return statement has two { but only one }

woeful epoch
#

THANK YOU

snow vale
formal parrot
#

Hello

snow vale
#

how can i know every joker that is currently in the game?

primal fossil
#

Im interested in learning how to create mods, but don't really know where to start. I have looked for tutorials online, but there isnt much and they haven't been helpful. I have limited experience coding in c++ but not at all in lua. I know I should probably start by trying to make simple things in lua to learn the language. Any suggestions on where to start and how to begin developing working on mods?

snow vale
#

make a joker

#

well

#

yk how to make your mod folder?

primal fossil
#

yeah ive messed around with other mods

snow vale
#

yeah but do you have your own

#

mod folder

#

it should look more or less like this (ignore that it doesnt show .lua, im on windows 11 :P)

primal fossil
#

ive tried to follow something to make a mod folder but it wasnt showing up in game

#

but no

snow vale
#

ok so then

#

C:\Users\youruser\AppData\Roaming\Balatro\Mods

#

type this in the folder path

#

with your user

#

clearly

primal fossil
#

yep

snow vale
#

ok then create a folder

#

name it as your mod's name

primal fossil
#

ok

snow vale
#

inside it

#

create a lua file

primal fossil
#

ok

snow vale
#

an assets folder

#

and a .json file

primal fossil
#

ok i have done this

#

it just wasnt showing up in game

snow vale
#

oh you have it all

#

ok then

#

write in the json file

#
    "id": "modid",
    "name": "modname",
    "display_name": "moddisplayname",
    "author": ["you"],
    "description": "desc",
    "prefix": "modprefix",
    "main_file": "main.lua",
    "priority": 0,
    "badge_colour": "colour",
    "badge_text_colour": "colour",
    "version": "1.0.0"
}```
primal fossil
#

ok

snow vale
#

i think if you have that, it should show here

#

also save

#

btw what editor u using

primal fossil
#

this is what I have

#

but nothing in game

snow vale
#

hmm

#

wait ive to go

#

to eat

#

ill be back

primal fossil
#

np

spice wadi
#

Wdym move up
Like there's too much spacing?

thorn furnace
#

Like i want to move the text up and the buttons down

#

So they're not overlapping

spice wadi
#

I'm not quite sure why they're overlapping to begin with

#

I'm p new to UI stuff but I've never had that

#

Can you send the code for the UI here

hard vigil
#

the pibby glitch

#

the pibby glitch

umbral zodiac
#

is there a way i could get the calculate/remove_from_deck/add_to_deck (really, any relevant function) of a joker without having an instance of it?

unborn bay
#

reference its center

#

G.P_CENTERS.j_joker_name.calculate

umbral zodiac
#

oh im silly i didnt think they were there because i forgot that the functions arent listed when you print the table

unborn bay
#

this won't work for vanilla jokers however

umbral zodiac
#

its ok i think the player wont notice the vanilla jokers being missing when a joker takes the effect of every other joker in the game

#

probably going to cause crashes but i dont plan on releasing it as a stable feature anyway